350 lines
8.0 KiB
Java
350 lines
8.0 KiB
Java
/*
|
|
|
|
Copyright 2006 Rene Grothmann, modified by Eric Hakenholz
|
|
|
|
This file is part of C.a.R. software.
|
|
|
|
C.a.R. is a free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, version 3 of the License.
|
|
|
|
C.a.R. is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
package rene.dialogs;
|
|
|
|
import java.awt.BorderLayout;
|
|
import java.awt.Button;
|
|
import java.awt.Checkbox;
|
|
import java.awt.FlowLayout;
|
|
import java.awt.Frame;
|
|
import java.awt.GridLayout;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.FocusEvent;
|
|
import java.io.File;
|
|
import java.util.Enumeration;
|
|
|
|
import eric.JEricPanel;
|
|
|
|
import rene.gui.ButtonAction;
|
|
import rene.gui.CheckboxAction;
|
|
import rene.gui.CloseDialog;
|
|
import rene.gui.Global;
|
|
import rene.gui.HistoryTextField;
|
|
import rene.gui.MyLabel;
|
|
import rene.gui.MyList;
|
|
import rene.gui.MyPanel;
|
|
import rene.gui.Panel3D;
|
|
import rene.util.FileList;
|
|
|
|
class FileListFinder extends FileList {
|
|
String Res;
|
|
|
|
public FileListFinder(final String dir, final String pattern,
|
|
final boolean recurse) {
|
|
super(dir, pattern, recurse);
|
|
}
|
|
|
|
@Override
|
|
public boolean file(final File file) {
|
|
try {
|
|
Res = file.getCanonicalPath();
|
|
} catch (final Exception e) {
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public String getResult() {
|
|
return Res;
|
|
}
|
|
}
|
|
|
|
class SearchFileThread extends Thread {
|
|
SearchFileDialog D;
|
|
MyList L;
|
|
String Dir, Pattern;
|
|
boolean Recurse;
|
|
|
|
public SearchFileThread(final SearchFileDialog dialog, final MyList l,
|
|
final String d, final String p, final boolean r) {
|
|
D = dialog;
|
|
L = l;
|
|
Dir = d;
|
|
Pattern = p;
|
|
Recurse = r;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
D.enableButtons(false);
|
|
L.removeAll();
|
|
L.setEnabled(false);
|
|
final FileList f = new FileList(Dir, Pattern, Recurse);
|
|
D.F = f;
|
|
f.search();
|
|
f.sort();
|
|
final Enumeration e = f.files();
|
|
while (e.hasMoreElements()) {
|
|
try {
|
|
L.add(((File) e.nextElement()).getCanonicalPath());
|
|
} catch (final Exception ex) {
|
|
}
|
|
}
|
|
L.setEnabled(true);
|
|
D.enableButtons(true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This is a dialog to search a subtree for a specific file. The user can enter
|
|
* a directory and a file pattern containing * and ?. He can choose between
|
|
* immediate search and open, or search/select/open. Abort will result in an
|
|
* empty string. The calling routine checks the result file name with
|
|
* getResult().
|
|
* <p>
|
|
* You need to specify the following properties
|
|
*
|
|
* <pre>
|
|
* searchfile.title=Search File
|
|
* searchfile.directory=Directory
|
|
* searchfile.pattern=Pattern
|
|
* searchfile.search=Search
|
|
* searchfile.searchrek=Search Subdirectories
|
|
* </pre>
|
|
*/
|
|
|
|
public class SearchFileDialog extends CloseDialog implements Runnable,
|
|
Enumeration {
|
|
/**
|
|
*
|
|
*/
|
|
private static final long serialVersionUID = 1L;
|
|
HistoryTextField Dir, Pattern;
|
|
MyList L;
|
|
static public int ListNumber = Global.getParameter("searchfile.number", 10);
|
|
String Result = null;
|
|
Button ActionButton, CloseButton, SearchButton, SearchrekButton;
|
|
public FileList F = null;
|
|
public boolean Abort = true;
|
|
Checkbox Mod;
|
|
|
|
public SearchFileDialog(final Frame f, final String action,
|
|
final String modify, final boolean modifystate) {
|
|
super(f, Global.name("searchfile.title"), true);
|
|
setLayout(new BorderLayout());
|
|
final JEricPanel north = new MyPanel();
|
|
north.setLayout(new BorderLayout());
|
|
final JEricPanel northa = new MyPanel();
|
|
northa.setLayout(new BorderLayout());
|
|
final JEricPanel north1 = new MyPanel();
|
|
north1.setLayout(new GridLayout(0, 2));
|
|
north1.add(new MyLabel(Global.name("searchfile.directory")));
|
|
north1.add(Dir = new HistoryTextField(this, "Dir", 20));
|
|
Dir.setText(".");
|
|
north1.add(new MyLabel(Global.name("searchfile.pattern")));
|
|
north1.add(Pattern = new HistoryTextField(this, "TextAction", 20));
|
|
northa.add("Center", north1);
|
|
final JEricPanel north2 = new MyPanel();
|
|
// north2.add(SearchButton = new ButtonAction(this, Global
|
|
// .name("searchfile.search"), "Search"));
|
|
// north2.add(SearchrekButton = new ButtonAction(this, Global
|
|
// .name("searchfile.searchrek"), "SearchRek"));
|
|
northa.add("South", north2);
|
|
north.add("North", northa);
|
|
add("North", new Panel3D(north));
|
|
add("Center", new Panel3D(L = new MyList(ListNumber)));
|
|
L.addActionListener(this);
|
|
L.setMultipleMode(true);
|
|
final JEricPanel south = new MyPanel();
|
|
south.setLayout(new FlowLayout(FlowLayout.RIGHT));
|
|
if (!modify.equals("")) {
|
|
south.add(Mod = new CheckboxAction(this, modify, ""));
|
|
Mod.setState(modifystate);
|
|
}
|
|
// south.add(ActionButton = new ButtonAction(this, action, "Action"));
|
|
// south.add(CloseButton = new ButtonAction(this, Global.name("abort"),
|
|
// "Close"));
|
|
add("South", new Panel3D(south));
|
|
pack();
|
|
Dir.loadHistory("searchfile.dir");
|
|
Pattern.loadHistory("searchfile.pattern");
|
|
|
|
// size
|
|
setSize("searchfiledialog");
|
|
addKeyListener(this);
|
|
Dir.addKeyListener(this);
|
|
Pattern.addKeyListener(this);
|
|
}
|
|
|
|
public SearchFileDialog(final Frame f, final String action) {
|
|
this(f, action, "", false);
|
|
}
|
|
|
|
@Override
|
|
public void actionPerformed(final ActionEvent e) {
|
|
if (e.getSource() == L) {
|
|
action();
|
|
} else
|
|
super.actionPerformed(e);
|
|
}
|
|
|
|
@Override
|
|
public void doAction(final String o) {
|
|
Result = null;
|
|
if (o.equals("SearchRek"))
|
|
search(true);
|
|
else if (o.equals("Search"))
|
|
search(false);
|
|
else if (o.equals("TextAction")) {
|
|
L.removeAll();
|
|
action();
|
|
} else if (o.equals("Action"))
|
|
action();
|
|
else if (o.equals("Help"))
|
|
help();
|
|
else if (o.equals("Close")) {
|
|
Abort = true;
|
|
doclose();
|
|
}
|
|
}
|
|
|
|
public void help() {
|
|
}
|
|
|
|
Thread Run;
|
|
|
|
public void search(final boolean recurse) {
|
|
saveHistory();
|
|
if (Run != null && Run.isAlive())
|
|
return;
|
|
Run = new SearchFileThread(this, L, Dir.getText(), Pattern.getText(),
|
|
recurse);
|
|
Run.start();
|
|
}
|
|
|
|
public void action() {
|
|
saveHistory();
|
|
if (Run != null && Run.isAlive())
|
|
return;
|
|
Run = new Thread(this);
|
|
Run.start();
|
|
}
|
|
|
|
public void enableButtons(final boolean f) {
|
|
Pattern.setEnabled(f);
|
|
SearchButton.setEnabled(f);
|
|
SearchrekButton.setEnabled(f);
|
|
ActionButton.setEnabled(f);
|
|
}
|
|
|
|
public void run() {
|
|
Result = null;
|
|
enableButtons(false);
|
|
if (L.getItemCount() > 0) {
|
|
final int i = L.getSelectedIndex();
|
|
if (i > 0)
|
|
Result = L.getItem(i);
|
|
else
|
|
Result = L.getItem(0);
|
|
} else {
|
|
final FileListFinder f = new FileListFinder(Dir.getText(), Pattern
|
|
.getText(), true);
|
|
F = f;
|
|
f.search();
|
|
Result = f.getResult();
|
|
}
|
|
enableButtons(true);
|
|
Abort = false;
|
|
doclose();
|
|
}
|
|
|
|
public String getResult() {
|
|
return Result;
|
|
}
|
|
|
|
@Override
|
|
public void focusGained(final FocusEvent e) {
|
|
Pattern.requestFocus();
|
|
}
|
|
|
|
@Override
|
|
public void setVisible(final boolean flag) {
|
|
if (flag)
|
|
enableButtons(true);
|
|
super.setVisible(flag);
|
|
}
|
|
|
|
@Override
|
|
public boolean close() {
|
|
Abort = true;
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void doclose() {
|
|
if (F != null)
|
|
F.stopIt();
|
|
Dir.saveHistory("searchfile.dir");
|
|
Pattern.saveHistory("searchfile.pattern");
|
|
noteSize("searchfiledialog");
|
|
super.doclose();
|
|
}
|
|
|
|
public void saveHistory() {
|
|
Dir.remember();
|
|
Pattern.remember();
|
|
}
|
|
|
|
public void setPattern(final String s) {
|
|
Pattern.setText(s);
|
|
}
|
|
|
|
String S[];
|
|
int Sn;
|
|
|
|
/**
|
|
* Get an enumeration of selected files. Should check for an aborted dialog
|
|
* before.
|
|
*/
|
|
public Enumeration getFiles() {
|
|
S = L.getSelectedItems();
|
|
Sn = 0;
|
|
return this;
|
|
}
|
|
|
|
public boolean hasMoreElements() {
|
|
return Sn < S.length;
|
|
}
|
|
|
|
public Object nextElement() {
|
|
if (Sn >= S.length)
|
|
return null;
|
|
final String s = S[Sn];
|
|
Sn++;
|
|
return s;
|
|
}
|
|
|
|
@Override
|
|
public boolean isAborted() {
|
|
return Abort;
|
|
}
|
|
|
|
public void deselectAll() {
|
|
for (int i = L.getItemCount() - 1; i >= 0; i--) {
|
|
L.deselect(i);
|
|
}
|
|
}
|
|
|
|
public boolean isModified() {
|
|
return Mod.getState();
|
|
}
|
|
}
|