KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > core > gui > search > SearchBar


1 package org.columba.core.gui.search;
2
3 import java.awt.AlphaComposite JavaDoc;
4 import java.awt.BorderLayout JavaDoc;
5 import java.awt.Component JavaDoc;
6 import java.awt.Container JavaDoc;
7 import java.awt.Graphics JavaDoc;
8 import java.awt.Graphics2D JavaDoc;
9 import java.awt.Insets JavaDoc;
10 import java.awt.event.ActionEvent JavaDoc;
11 import java.awt.event.ActionListener JavaDoc;
12 import java.awt.event.KeyAdapter JavaDoc;
13 import java.awt.event.KeyEvent JavaDoc;
14 import java.awt.geom.RoundRectangle2D JavaDoc;
15 import java.util.Iterator JavaDoc;
16 import java.util.List JavaDoc;
17 import java.util.Vector JavaDoc;
18
19 import javax.swing.BorderFactory JavaDoc;
20 import javax.swing.Box JavaDoc;
21 import javax.swing.DefaultListCellRenderer JavaDoc;
22 import javax.swing.Icon JavaDoc;
23 import javax.swing.ImageIcon JavaDoc;
24 import javax.swing.JButton JavaDoc;
25 import javax.swing.JCheckBox JavaDoc;
26 import javax.swing.JComboBox JavaDoc;
27 import javax.swing.JLabel JavaDoc;
28 import javax.swing.JList JavaDoc;
29 import javax.swing.JMenuBar JavaDoc;
30 import javax.swing.JMenuItem JavaDoc;
31 import javax.swing.JPanel JavaDoc;
32 import javax.swing.JPopupMenu JavaDoc;
33 import javax.swing.JToolBar JavaDoc;
34 import javax.swing.UIManager JavaDoc;
35 import javax.swing.event.DocumentEvent JavaDoc;
36 import javax.swing.event.DocumentListener JavaDoc;
37 import javax.swing.event.PopupMenuEvent JavaDoc;
38 import javax.swing.event.PopupMenuListener JavaDoc;
39
40 import org.columba.api.gui.frame.IFrameMediator;
41 import org.columba.core.context.ContextResultListenerAdapter;
42 import org.columba.core.context.api.IContextResultEvent;
43 import org.columba.core.gui.action.AbstractColumbaAction;
44 import org.columba.core.gui.base.AscendingIcon;
45 import org.columba.core.gui.search.api.ICriteriaRenderer;
46 import org.columba.core.gui.search.api.ISearchPanel;
47 import org.columba.core.gui.toolbar.ToolBarButtonFactory;
48 import org.columba.core.resourceloader.IconKeys;
49 import org.columba.core.resourceloader.ImageLoader;
50 import org.columba.core.search.ResultListenerAdapter;
51 import org.columba.core.search.SearchRequest;
52 import org.columba.core.search.api.IResultEvent;
53 import org.columba.core.search.api.ISearchCriteria;
54 import org.columba.core.search.api.ISearchManager;
55 import org.columba.core.search.api.ISearchProvider;
56 import org.columba.core.search.api.ISearchRequest;
57
58 import com.jgoodies.forms.builder.DefaultFormBuilder;
59 import com.jgoodies.forms.layout.FormLayout;
60
61 public class SearchBar extends JPanel JavaDoc implements PopupMenuListener JavaDoc {
62
63     private IconTextField textField;
64
65     private ImageIcon JavaDoc icon = ImageLoader.getSmallIcon(IconKeys.EDIT_FIND);
66
67     private JButton JavaDoc searchButton;
68
69     private JCheckBox JavaDoc searchInsideCheckBox;
70
71     private ISearchPanel searchPanel;
72
73     private JComboBox JavaDoc providerComboBox;
74
75     private JButton JavaDoc contextButton;
76
77     private ContextSearchAction action;
78
79     private SearchDialog searchDialog;
80
81     private JButton JavaDoc moreButton;
82
83     private IFrameMediator frameMediator;
84
85     public SearchBar(final ISearchPanel searchPanel,
86             final IFrameMediator frameMediator) {
87         super();
88
89         this.searchPanel = searchPanel;
90         this.frameMediator = frameMediator;
91
92         initComponents();
93
94         layoutComponents(false);
95
96         initListeners();
97     }
98
99     public void search(Iterator JavaDoc<ICriteriaRenderer> it, boolean matchAll) {
100
101         // create list of search requests
102
List JavaDoc<ISearchRequest> list = new Vector JavaDoc<ISearchRequest>();
103         while (it.hasNext()) {
104             ICriteriaRenderer r = it.next();
105             ISearchCriteria c = r.getCriteria();
106             String JavaDoc providerName = r.getProvider().getTechnicalName();
107             Object JavaDoc value = r.getValue();
108             // skip if user didn't specify search term for this criteria
109
if (value == null)
110                 continue;
111
112             String JavaDoc searchTerm = value.toString();
113
114             list.add(new SearchRequest(c.getTechnicalName(), providerName,
115                     searchTerm));
116         }
117
118         // execute search
119
searchPanel.searchComplex(list, matchAll, searchInsideCheckBox
120                 .isSelected());
121     }
122
123     public boolean isSelectedSearchInside() {
124         return searchInsideCheckBox.isSelected();
125     }
126
127     private void toggleButtonStates(boolean enabled) {
128         action.setEnabled(enabled);
129         contextButton.setEnabled(enabled);
130         searchButton.setEnabled(enabled);
131         textField.setEnabled(enabled);
132         searchInsideCheckBox.setEnabled(enabled);
133         try {
134             moreButton.setEnabled(enabled);
135         } catch (RuntimeException JavaDoc e) {
136             e.printStackTrace();
137         }
138     }
139
140     private void toggleSearchDialogVisibility() {
141         if (searchDialog == null)
142             searchDialog = new SearchDialog(frameMediator.getContainer()
143                     .getFrame(), searchPanel.getSearchManager()
144                     .getAllProviders());
145
146         if (!searchDialog.isVisible()) {
147             int x = getLocationOnScreen().x;
148             // toolbar container
149
Container JavaDoc c2 = getParent().getParent();
150             int y = c2.getLocationOnScreen().y + c2.getHeight();
151             int maxX = x + getWidth();
152
153             int xx = maxX - searchDialog.getWidth();
154             searchDialog.setLocation(xx, y);
155             searchDialog.setVisible(true);
156
157             if (searchDialog.isSuccess()) {
158                 // user pressed "Search" button
159
search(searchDialog.getAllCriteriaRenderer(), searchDialog
160                         .isMatchAll());
161             }
162         } else {
163             searchDialog.setVisible(false);
164         }
165     }
166
167     private void initListeners() {
168         // show search dialog
169
moreButton.addActionListener(new ActionListener JavaDoc() {
170             public void actionPerformed(ActionEvent JavaDoc e) {
171                 toggleSearchDialogVisibility();
172             }
173         });
174
175         // on "RETURN" start seach
176
textField.addKeyListener(new MyKeyListener());
177
178         textField.getDocument().addDocumentListener(new MyDocumentListener());
179
180         // update popup menu with search term before its made visible
181
// textField.addPopupMenuListener(this);
182

183         // enable/disable search bar during search
184
searchPanel.getSearchManager()
185                 .addResultListener(new MyResultListener());
186
187         // start search
188
searchButton.addActionListener(new ActionListener JavaDoc() {
189             public void actionPerformed(ActionEvent JavaDoc e) {
190                 toggleButtonStates(false);
191                 SearchBar.this.searchPanel.searchAll(textField.getText(),
192                         searchInsideCheckBox.isSelected());
193             }
194         });
195
196         // to enable button again after search is finished
197
searchPanel.getContextSearchManager().addResultListener(
198                 new MyContextResultListener());
199     }
200
201     class MyDocumentListener implements DocumentListener JavaDoc {
202
203         public void changedUpdate(DocumentEvent JavaDoc e) {
204             handleEvent(e);
205         }
206
207         public void insertUpdate(DocumentEvent JavaDoc e) {
208             handleEvent(e);
209         }
210
211         public void removeUpdate(DocumentEvent JavaDoc e) {
212             handleEvent(e);
213         }
214
215         private void handleEvent(DocumentEvent JavaDoc e) {
216             updatePopupMenu(textField.getPopupMenu(), textField.getText());
217             //textField.showPopup();
218
//textField.requestFocus();
219
}
220
221     }
222
223     class MyComboBoxRenderer extends DefaultListCellRenderer JavaDoc {
224
225         @Override JavaDoc
226         public Component JavaDoc getListCellRendererComponent(JList JavaDoc list, Object JavaDoc value,
227                 int index, boolean isSelected, boolean cellHasFocus) {
228             super.getListCellRendererComponent(list, value, index, isSelected,
229                     cellHasFocus);
230
231             // skip "Search All"
232
if (value instanceof ISearchProvider) {
233                 ISearchProvider p = (ISearchProvider) value;
234                 setText(p.getName());
235                 setIcon(p.getIcon());
236             }
237
238             if (getIcon() == null) {
239                 setBorder(BorderFactory.createEmptyBorder(0,
240                         16 + getIconTextGap(), 0, 0));
241             } else {
242                 setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
243             }
244
245             return this;
246         }
247
248     }
249
250     class CoolButton extends JButton JavaDoc {
251
252         public CoolButton(String JavaDoc text, Icon JavaDoc icon) {
253             super(text, icon);
254         }
255
256         public void paintComponent(Graphics JavaDoc g) {
257             Graphics2D JavaDoc g2d = (Graphics2D JavaDoc) g;
258
259             int w = getWidth();
260             int h = getHeight();
261
262             g2d.setBackground(UIManager.getColor("control.background"));
263             g2d.setColor(UIManager.getColor("control.text"));
264
265             // create a rounded clip LARGER than the comp
266
RoundRectangle2D.Float JavaDoc r2d = new RoundRectangle2D.Float JavaDoc(0, 0,
267                     w + 30, h - 1, 20, 20);
268
269             // intersect this with the existing clip
270
g2d.clip(r2d);
271
272             // fill the clipped area
273
// g2d.setPaint(LIGHT_GRADIENT);
274
g2d.fillRect(0, 0, w, h);
275             // restore original clip
276

277             // paint outer border
278
// g2d.setPaint(OUTER);
279
g2d.drawRoundRect(0, 0, w + 30, h - 1, 20, 20);
280
281             // paint inner border
282
// g2d.setPaint(INNER);
283
g2d.drawRoundRect(1, 1, w + 30, h - 3, 18, 18);
284
285             // paint right outside border
286
// g2d.setPaint(p1);
287
g2d.drawLine(w - 1, 1, w - 1, h);
288
289             // paint right inside border
290
// g2d.setPaint(p2);
291
g2d.drawLine(w - 2, 2, w - 2, h - 1);
292             // make it translucent
293
g2d.setComposite(AlphaComposite.getInstance(
294                     AlphaComposite.SRC_OVER, 0.1f));
295
296             // paint the text and icon
297
super.paintComponent(g);
298
299         }
300     }
301
302     private void layoutComponents(boolean hasResults) {
303
304         this.removeAll();
305
306         FormLayout layout = new FormLayout(
307                 "fill:default:grow, 2dlu, pref,1dlu, pref, 2dlu",
308                 // 2 columns
309
"fill:default:grow");
310
311         // create a form builder
312
DefaultFormBuilder builder = new DefaultFormBuilder(layout, this);
313
314         // builder.append(contextButton);
315
// builder.append(providerComboBox);
316

317         // builder.append(moreButton);
318
JLabel JavaDoc label = new JLabel JavaDoc("Search:");
319         label.setLabelFor(textField);
320         label.setDisplayedMnemonic('s');
321         builder.append(label);
322
323         builder.append(textField);
324
325         builder.append(moreButton);
326
327         // if ( hasResults)
328
// builder.append(searchInsideCheckBox);
329

330         // builder.append(moreButton);
331

332         // builder.append(searchButton);
333

334     }
335
336     private void initComponents() {
337         textField = new IconTextField(icon, 20);
338
339         searchButton = new JButton JavaDoc("Search");
340         searchButton.setMnemonic('s');
341
342         searchInsideCheckBox = new JCheckBox JavaDoc("Search Inside");
343         searchInsideCheckBox
344                 .setToolTipText("Search Inside Previous Search Results");
345         searchInsideCheckBox.setMnemonic('i');
346         searchInsideCheckBox.setSelected(false);
347         // searchInsideCheckBox.setEnabled(false);
348

349         action = new ContextSearchAction(frameMediator);
350
351         contextButton = ToolBarButtonFactory.createButton(action);
352         contextButton.setEnabled(true);
353
354         moreButton = ToolBarButtonFactory.createButton("", new AscendingIcon(),
355                 false);
356         moreButton.setIcon(new AscendingIcon());
357         moreButton.setDisabledIcon(new AscendingIcon());
358         moreButton.setMargin(new Insets JavaDoc(1, 1, 1, 1));
359         moreButton.setToolTipText("Advanced Search Options...");
360
361         providerComboBox = new JComboBox JavaDoc();
362         providerComboBox.setRenderer(new MyComboBoxRenderer());
363
364         providerComboBox.addItem("Search All");
365         ISearchManager manager = searchPanel.getSearchManager();
366         Iterator JavaDoc<ISearchProvider> it = manager.getAllProviders();
367         while (it.hasNext()) {
368             final ISearchProvider p = it.next();
369             providerComboBox.addItem(p);
370         }
371     }
372
373     class MyContextResultListener extends ContextResultListenerAdapter {
374
375         @Override JavaDoc
376         public void finished(IContextResultEvent event) {
377             toggleButtonStates(true);
378         }
379
380     }
381
382     class ContextSearchAction extends AbstractColumbaAction {
383         ContextSearchAction(IFrameMediator mediator) {
384             super(mediator, "What's related");
385             putValue(SMALL_ICON, ImageLoader.getSmallIcon("system-search.png"));
386
387             // large icon for toolbar
388
putValue(LARGE_ICON, ImageLoader.getIcon("system-search.png"));
389
390             putValue(AbstractColumbaAction.SHORT_DESCRIPTION, "What's related");
391             putValue(AbstractColumbaAction.LONG_DESCRIPTION, "What's related");
392
393             putValue(TOOLBAR_NAME, "What's related");
394
395             setShowToolBarText(true);
396
397         }
398
399         public void actionPerformed(ActionEvent JavaDoc e) {
400             toggleButtonStates(false);
401             searchPanel.searchInContext();
402         }
403
404     }
405
406     class MyKeyListener extends KeyAdapter JavaDoc {
407
408         @Override JavaDoc
409         public void keyReleased(KeyEvent JavaDoc e) {
410             char ch = e.getKeyChar();
411
412             if (ch == KeyEvent.VK_ENTER) {
413                 if (textField.getText().length() == 0)
414                     return;
415
416                 toggleButtonStates(false);
417
418                 // get first provider
419
// ISearchProvider provider = searchPanel.getSearchManager()
420
// .getAllProviders().next();
421
// ISearchCriteria defaultCriteria = null;
422
//
423
// SearchBar.this.searchPanel.searchInCriteria(
424
// textField.getText(), provider.getTechnicalName(),
425
// provider.getDefaultCriteria(textField.getText())
426
// .getTechnicalName(), searchInsideCheckBox
427
// .isSelected());
428

429                  searchPanel.searchAll(textField.getText(), searchInsideCheckBox
430                         .isSelected());
431             } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
432                 if (textField.getText().length() == 0)
433                     return;
434                 textField.showPopup();
435                 textField.getPopupMenu().requestFocus();
436                 textField.getPopupMenu().getSelectionModel()
437                         .setSelectedIndex(0);
438             }
439
440         }
441
442     }
443
444     public void popupMenuWillBecomeVisible(PopupMenuEvent JavaDoc e) {
445         System.out.println("menu will become visible");
446
447         // update popup menu based on searchterm
448
updatePopupMenu(textField.getPopupMenu(), textField.getText());
449     }
450
451     public void popupMenuWillBecomeInvisible(PopupMenuEvent JavaDoc e) {
452     }
453
454     public void popupMenuCanceled(PopupMenuEvent JavaDoc e) {
455     }
456
457     private void updatePopupMenu(JPopupMenu JavaDoc menu, String JavaDoc searchTerm) {
458         System.out.println("update menu=" + searchTerm);
459
460         menu.removeAll();
461
462         // add menuitem to search across all components
463
// JMenuItem m2 = new JMenuItem("Search All");
464
// m2.setToolTipText("Search across all components");
465
// m2.addActionListener(new ActionListener() {
466
// public void actionPerformed(ActionEvent e) {
467
// searchPanel.searchAll(textField.getText(), searchInsideCheckBox
468
// .isSelected());
469
// }
470
// });
471
// menu.add(m2);
472
// menu.addSeparator();
473

474         ISearchManager manager = searchPanel.getSearchManager();
475         Iterator JavaDoc<ISearchProvider> it = manager.getAllProviders();
476         while (it.hasNext()) {
477             final ISearchProvider p = it.next();
478
479             // create a single menu item for all the search criteria
480
// of this provider
481
// JMenuItem m = new JMenuItem(p.getName());
482
// m.setToolTipText(p.getDescription());
483
// m.setIcon(p.getIcon());
484
// m.addActionListener(new ActionListener() {
485
// public void actionPerformed(ActionEvent e) {
486
// searchPanel.searchInProvider(textField.getText(), p
487
// .getTechnicalName(), searchInsideCheckBox.isSelected());
488
// }
489
// });
490
// menu.add(m);
491

492             JMenuItem JavaDoc m;
493             // create all individual search criteria for this provider
494
List JavaDoc<ISearchCriteria> v = p.getAllCriteria(searchTerm);
495             Iterator JavaDoc<ISearchCriteria> it2 = v.iterator();
496             while (it2.hasNext()) {
497                 final ISearchCriteria c = it2.next();
498                 if (c == null)
499                     continue;
500
501                 m = new JMenuItem JavaDoc(c.getTitle());
502                 m.setToolTipText(c.getDescription());
503                 m.setIcon(p.getIcon());
504                 m.addActionListener(new ActionListener JavaDoc() {
505                     public void actionPerformed(ActionEvent JavaDoc e) {
506                         searchPanel.searchInCriteria(textField.getText(), p
507                                 .getTechnicalName(), c.getTechnicalName(),
508                                 searchInsideCheckBox.isSelected());
509                     }
510                 });
511                 menu.add(m);
512             }
513
514             if (it.hasNext())
515                 menu.addSeparator();
516         }
517
518         menu.addSeparator();
519
520         JMenuItem JavaDoc m = new JMenuItem JavaDoc("Advanced Search...");
521         m.setToolTipText("Advanced Search...");
522         m.addActionListener(new ActionListener JavaDoc() {
523             public void actionPerformed(ActionEvent JavaDoc e) {
524                 toggleSearchDialogVisibility();
525             }
526         });
527         menu.add(m);
528
529         // create search history
530

531         // Map<String, ISearchProvider> historyMap = SearchHistoryList
532
// .getInstance().getHistoryMap();
533

534         // if (historyMap.size() > 0) {
535
// Iterator<String> it3 = historyMap.keySet().iterator();
536
// while (it3.hasNext()) {
537
// String term = it3.next();
538
// ISearchProvider p = historyMap.get(term);
539
// ISearchCriteria c = p.getAllCriteria(term);
540
// if (c == null)
541
// continue;
542
//
543
// JMenuItem m = new JMenuItem(c.getTitle());
544
// m.setToolTipText(c.getDescription());
545
// m.setIcon(c.getIcon());
546
// m.setActionCommand(p.getName());
547
// m.addActionListener(listener);
548
// menu.add(m);
549
// }
550
//
551
// menu.insert(new JSeparator(), menu.getComponentCount() -
552
// historyMap.size());
553
// }
554

555         menu.revalidate();
556         menu.pack();
557     }
558
559     public void install(JMenuBar JavaDoc menubar) {
560         if (menubar == null)
561             throw new IllegalArgumentException JavaDoc("menubar == null");
562
563         Component JavaDoc box = Box.createHorizontalGlue();
564         menubar.add(box);
565
566         menubar.add(this);
567     }
568
569     public void install(JToolBar JavaDoc toolbar) {
570         if (toolbar == null)
571             throw new IllegalArgumentException JavaDoc("toolbar");
572
573         toolbar.add(contextButton);
574
575         JPanel JavaDoc p = new JPanel JavaDoc();
576         p.setBorder(BorderFactory.createEmptyBorder(3, 0, 2, 0));
577         p.setLayout(new BorderLayout JavaDoc());
578         p.add(this, BorderLayout.EAST);
579
580         toolbar.add(p);
581     }
582
583     class MyResultListener extends ResultListenerAdapter {
584
585         MyResultListener() {
586         }
587
588         @Override JavaDoc
589         public void finished(IResultEvent event) {
590             // search is finished
591
// -> enable search button again
592
toggleButtonStates(true);
593
594             // do layout again
595
layoutComponents(true);
596         }
597
598     }
599
600 }
601
Popular Tags