5252import java .awt .event .ActionListener ;
5353import java .awt .event .ComponentAdapter ;
5454import java .awt .event .ComponentEvent ;
55+ import java .awt .event .FocusEvent ;
56+ import java .awt .event .FocusListener ;
5557import java .awt .event .ItemEvent ;
5658import java .awt .event .KeyAdapter ;
5759import java .awt .event .KeyEvent ;
9496import java .util .concurrent .ExecutionException ;
9597import java .util .jar .JarEntry ;
9698import java .util .jar .JarOutputStream ;
99+ import java .util .regex .Pattern ;
100+ import java .util .regex .PatternSyntaxException ;
97101import java .util .zip .ZipException ;
98102
99103import javax .script .ScriptEngine ;
116120import javax .swing .JSplitPane ;
117121import javax .swing .JTabbedPane ;
118122import javax .swing .JTextArea ;
123+ import javax .swing .JTextField ;
119124import javax .swing .KeyStroke ;
120125import javax .swing .SwingUtilities ;
121126import 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