44import java .awt .event .ActionEvent ;
55import java .awt .event .ActionListener ;
66import java .lang .reflect .Method ;
7+ import java .util .ArrayList ;
78
89import javax .swing .DefaultListSelectionModel ;
910import javax .swing .JButton ;
1011import javax .swing .JFrame ;
12+ import javax .swing .JOptionPane ;
1113import javax .swing .JPanel ;
1214import javax .swing .JScrollPane ;
1315import javax .swing .JTable ;
1416import javax .swing .JTextField ;
1517import javax .swing .ListSelectionModel ;
18+ import javax .swing .SwingUtilities ;
19+ import javax .swing .event .DocumentEvent ;
20+ import javax .swing .event .DocumentListener ;
1621import javax .swing .table .DefaultTableModel ;
1722
18-
19- public class MethodInputFrame extends JFrame {
23+ /**
24+ * similar implementation as class search frame
25+ */
26+ public class MethodInputFrame extends JFrame implements ActionListener , DocumentListener {
2027
2128 private JTextField searchingTextField ;
2229 private JTable resultsTable ;
30+ private MethodSearch searchUtil ;
31+ private DefaultTableModel defaultTableModel ;
32+ private MethodSearchFrameDelegateInterface delegate ;
33+
34+ private Thread runningThread ;
2335 private JButton btnCancel , btnConfirm ;
2436 private JPanel panel ;
2537 private JScrollPane scrollPane ;
26- private DefaultTableModel defaultTableModel ;
27-
28- private Class mtdClass ;
29- private Method [] methods ;
3038
3139
3240 public MethodInputFrame (Class c ) {
@@ -38,44 +46,42 @@ public boolean isCellEditable(int row, int column) {
3846 }
3947 };
4048
41- this .mtdClass = c ;
42- this .methods = this .mtdClass .getMethods ();
43-
4449 // big JPanel window
4550 panel = new JPanel ();
4651 getContentPane ().add (panel , BorderLayout .CENTER );
4752 panel .setLayout (new BorderLayout (0 , 0 ));
48-
53+
54+ // search text field on top
55+ searchUtil = new MethodSearch (c );
4956 searchingTextField = new JTextField ();
5057 getContentPane ().add (searchingTextField , BorderLayout .NORTH );
5158 searchingTextField .setColumns (10 );
52-
59+
5360 // show result
5461 resultsTable = new JTable ();
5562 resultsTable .setModel (defaultTableModel );
5663 resultsTable .setSelectionModel (new ForcedListSelectionModel ());
57-
64+
5865 // scroll option
5966 scrollPane = new JScrollPane (resultsTable );
6067 panel .add (scrollPane , BorderLayout .CENTER );
6168
6269 // add small JPanel for Cancel and Confirm buttons
6370 JPanel panel_1 = new JPanel ();
6471 getContentPane ().add (panel_1 , BorderLayout .SOUTH );
65-
66- ButtonListener listener = new ButtonListener ();
67-
72+
6873 btnCancel = new JButton ("Cancel" );
6974 panel_1 .add (btnCancel );
70- btnCancel .addActionListener (listener );
75+ btnCancel .addActionListener (this );
7176
7277 btnConfirm = new JButton ("Confirm" );
7378 panel_1 .add (btnConfirm );
74- btnConfirm .addActionListener (listener );
79+ btnConfirm .addActionListener (this );
7580
7681 // set up connections
77- // searchingTextField.addActionListener(this);
78- // searchingTextField.getDocument().addDocumentListener(this);
82+ searchingTextField .addActionListener (this );
83+ searchingTextField .getDocument ().addDocumentListener (this );
84+
7985 }
8086
8187
@@ -99,16 +105,97 @@ public ForcedListSelectionModel() {
99105 */
100106 }
101107
102- private class ButtonListener implements ActionListener {
103-
104- @ Override
105- public void actionPerformed (ActionEvent e ) {
106- if (e .getSource () == btnCancel ) {
107-
108- } else if (e .getSource () == btnConfirm ) {
109-
110- }
108+ private void updateMethodList () {
109+ if (runningThread != null ) {
110+ runningThread .interrupt ();
111111 }
112+ runningThread = new Thread (new Runnable () {
113+
114+ @ Override
115+ public void run () {
116+
117+ String searchText ;
118+ synchronized (searchingTextField ) {
119+ searchText = searchingTextField .getText ();
120+ }
121+ // start Search
122+ ArrayList <String > classesForName = searchUtil .methodsForName (searchText );
123+
124+ boolean equals ;
125+ synchronized (searchingTextField ) {
126+ equals =
127+ // if text has not changed
128+ searchingTextField .getText ().equals (searchText );
129+ }
130+
131+ if (equals ) {
132+ SwingUtilities .invokeLater (new Runnable () {
133+
134+ @ Override
135+ public void run () {
136+ defaultTableModel .setRowCount (0 );
137+ for (String string : classesForName ) {
138+ defaultTableModel .addRow (new String []{string });
139+ }
140+ defaultTableModel .fireTableDataChanged ();
141+ }
142+ });
143+ }
144+
145+ // It is buggy with the synchronized searching
146+ // resultsTable.setRowSelectionInterval(0, 0);
147+ }
148+ });
149+ runningThread .start ();
150+ }
151+
152+ public void setDelegate (MethodSearchFrameDelegateInterface delegate ) {
153+ this .delegate = delegate ;
154+ }
155+
156+ @ Override
157+ public void changedUpdate (DocumentEvent e ) {
158+ // TODO Auto-generated method stub
112159
113160 }
161+
162+ @ Override
163+ public void insertUpdate (DocumentEvent e ) {
164+ // TODO Auto-generated method stub
165+ updateMethodList ();
166+ }
167+
168+ @ Override
169+ public void removeUpdate (DocumentEvent e ) {
170+ // TODO Auto-generated method stub
171+ updateMethodList ();
172+ }
173+
174+ @ Override
175+ public void actionPerformed (ActionEvent e ) {
176+ // User cancel the class search
177+
178+ if (e .getSource () == btnCancel ) {
179+ setVisible (false );
180+ dispose ();
181+ } else if (e .getSource () == btnConfirm ) {
182+
183+ // return the selected (or the first if no selected) class if the
184+ // table is not empty
185+ if (resultsTable .getRowCount () != 0 ) {
186+
187+ int selectedRow = resultsTable .getSelectedRow ();
188+ if (selectedRow == -1 ) {
189+ selectedRow = 0 ;
190+ }
191+ // TODO get selected/highlighted class, not just the first one
192+ delegate .didSelectMethod (
193+ (String ) resultsTable .getValueAt (selectedRow , 0 ));
194+
195+ }
196+
197+ setVisible (false );
198+ dispose ();
199+ }
200+ }
114201}
0 commit comments