Skip to content

Commit 9a79738

Browse files
committed
TextEditor: enable filtering listed files in the FileSystemTree
either by a regular expression (leading with a '/') or by matching text.
1 parent 6867500 commit 9a79738

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

src/main/java/org/scijava/ui/swing/script/TextEditor.java

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
import java.awt.event.ActionListener;
5353
import java.awt.event.ComponentAdapter;
5454
import java.awt.event.ComponentEvent;
55+
import java.awt.event.FocusEvent;
56+
import java.awt.event.FocusListener;
5557
import java.awt.event.ItemEvent;
5658
import java.awt.event.KeyAdapter;
5759
import java.awt.event.KeyEvent;
@@ -94,6 +96,8 @@
9496
import java.util.concurrent.ExecutionException;
9597
import java.util.jar.JarEntry;
9698
import java.util.jar.JarOutputStream;
99+
import java.util.regex.Pattern;
100+
import java.util.regex.PatternSyntaxException;
97101
import java.util.zip.ZipException;
98102

99103
import javax.script.ScriptEngine;
@@ -116,6 +120,7 @@
116120
import javax.swing.JSplitPane;
117121
import javax.swing.JTabbedPane;
118122
import javax.swing.JTextArea;
123+
import javax.swing.JTextField;
119124
import javax.swing.KeyStroke;
120125
import javax.swing.SwingUtilities;
121126
import javax.swing.event.ChangeEvent;
@@ -618,6 +623,11 @@ public TextEditor(final Context context) {
618623
add_directory.setToolTipText("Add a directory");
619624
final JButton remove_directory = new JButton("[-]");
620625
remove_directory.setToolTipText("Remove a top-level directory");
626+
627+
final JTextField filter = new JTextField("filter...", 20);
628+
filter.setForeground(Color.gray);
629+
filter.setToolTipText("Use leading '/' for regular expressions");
630+
621631
tree = new FileSystemTree(log);
622632
tree.ignoreExtension("class");
623633
dragSource = new DragSource();
@@ -683,6 +693,47 @@ public TextEditor(final Context context) {
683693
"Can only remove top-level folders.");
684694
}
685695
});
696+
filter.addFocusListener(new FocusListener() {
697+
@Override
698+
public void focusLost(FocusEvent e) {}
699+
700+
@Override
701+
public void focusGained(FocusEvent e) {
702+
if (filter.getForeground() == Color.gray) {
703+
filter.setText("");
704+
filter.setForeground(Color.black);
705+
}
706+
}
707+
});
708+
filter.addKeyListener(new KeyAdapter() {
709+
@Override
710+
public void keyPressed(final KeyEvent ke) {
711+
if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
712+
final String text = filter.getText();
713+
if (0 == text.length()) {
714+
tree.setFileFilter(((f) -> true)); // any
715+
return;
716+
}
717+
if ('/' == text.charAt(0)) {
718+
// Interpret as a regular expression
719+
try {
720+
final Pattern pattern = Pattern.compile(text.substring(1));
721+
tree.setFileFilter((f) -> pattern.matcher(f.getName()).matches());
722+
} catch (final PatternSyntaxException pse) {
723+
filter.setForeground(Color.red);
724+
}
725+
} else {
726+
// Interpret as a literal match
727+
tree.setFileFilter((f) -> -1 != f.getName().indexOf(text));
728+
}
729+
} else {
730+
// Upon re-typing something
731+
if (filter.getForeground() == Color.red) {
732+
filter.setForeground(Color.black);
733+
}
734+
}
735+
}
736+
});
686737

687738
// Restore top-level directories
688739
tree.addTopLevelFoldersFrom(getEditorPane().loadFolders());
@@ -699,8 +750,11 @@ public TextEditor(final Context context) {
699750
tree_panel.add(add_directory, bc);
700751
bc.gridx = 1;
701752
tree_panel.add(remove_directory, bc);
753+
bc.gridx = 2;
754+
bc.fill = GridBagConstraints.HORIZONTAL;
755+
tree_panel.add(filter);
702756
bc.gridx = 0;
703-
bc.gridwidth = 2;
757+
bc.gridwidth = 3;
704758
bc.gridy = 1;
705759
bc.weightx = 1.0;
706760
bc.weighty = 1.0;

0 commit comments

Comments
 (0)