KickJava   Java API By Example, From Geeks To Geeks.

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


1 package org.columba.core.gui.search;
2
3 import java.awt.BorderLayout JavaDoc;
4 import java.awt.Color JavaDoc;
5 import java.awt.event.ActionEvent JavaDoc;
6 import java.awt.event.ActionListener JavaDoc;
7 import java.util.Enumeration JavaDoc;
8 import java.util.Hashtable JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.Map JavaDoc;
12 import java.util.Vector JavaDoc;
13 import java.util.logging.Logger JavaDoc;
14
15 import javax.swing.BorderFactory JavaDoc;
16 import javax.swing.JButton JavaDoc;
17 import javax.swing.JComponent JavaDoc;
18 import javax.swing.JPanel JavaDoc;
19 import javax.swing.JScrollPane JavaDoc;
20 import javax.swing.UIManager JavaDoc;
21
22 import org.columba.api.gui.frame.IDock;
23 import org.columba.api.gui.frame.IFrameMediator;
24 import org.columba.api.plugin.IExtension;
25 import org.columba.api.plugin.IExtensionHandler;
26 import org.columba.api.plugin.IExtensionHandlerKeys;
27 import org.columba.api.plugin.PluginException;
28 import org.columba.api.plugin.PluginHandlerNotFoundException;
29 import org.columba.core.context.ContextSearchManager;
30 import org.columba.core.context.api.IContextProvider;
31 import org.columba.core.context.api.IContextSearchManager;
32 import org.columba.core.gui.context.ContextDebugProvider;
33 import org.columba.core.gui.context.ContextResultBox;
34 import org.columba.core.gui.frame.api.IComponentBox;
35 import org.columba.core.gui.search.api.IResultPanel;
36 import org.columba.core.gui.search.api.ISearchPanel;
37 import org.columba.core.logging.Logging;
38 import org.columba.core.plugin.PluginManager;
39 import org.columba.core.search.SearchManager;
40 import org.columba.core.search.api.ISearchCriteria;
41 import org.columba.core.search.api.ISearchManager;
42 import org.columba.core.search.api.ISearchProvider;
43 import org.columba.core.search.api.ISearchRequest;
44 import org.jdesktop.swingx.VerticalLayout;
45
46 public class SearchPanel extends JPanel JavaDoc implements ISearchPanel {
47
48     private static final int RESULT_COUNT = 20;
49
50     private static final Logger JavaDoc LOG = Logger
51             .getLogger("org.columba.core.search.gui.SearchPanel");
52
53     private IFrameMediator frameMediator;
54
55     // private SearchResultView searchResultView;
56

57     //private StackedBox box;
58
private JPanel JavaDoc defaultBox;
59     private JPanel JavaDoc searchBox;
60     
61     private Hashtable JavaDoc<String JavaDoc, SearchResultBox> searchMap = new Hashtable JavaDoc<String JavaDoc, SearchResultBox>();
62
63     private ISearchManager searchManager;
64
65     private Map JavaDoc<String JavaDoc, ContextResultBox> contextMap = new Hashtable JavaDoc<String JavaDoc, ContextResultBox>();
66
67     private IContextSearchManager contextSearchManager;
68
69     private JPanel JavaDoc topPanel;
70
71     public SearchPanel(IFrameMediator frameMediator) {
72         super();
73
74         this.frameMediator = frameMediator;
75
76         this.searchManager = new SearchManager();
77         initSearchProvider();
78
79         contextSearchManager = new ContextSearchManager(frameMediator);
80         initContextProvider();
81
82         setBackground(UIManager.getColor("TextField.background"));
83
84         //box = new StackedBox();
85
defaultBox = new JPanel JavaDoc();
86         defaultBox.setLayout(new VerticalLayout());
87         defaultBox.setBackground(UIManager.getColor("TextField.background"));
88
89         searchBox = new JPanel JavaDoc();
90         searchBox.setLayout(new VerticalLayout());
91         searchBox.setBackground(UIManager.getColor("TextField.background"));
92
93         //box.setBackground(new Color(248, 248, 248));
94
// JScrollPane pane = new JScrollPane(box);
95
// pane.setBorder(null);
96

97         setLayout(new BorderLayout JavaDoc());
98         add(defaultBox, BorderLayout.CENTER);
99
100         topPanel = new JPanel JavaDoc();
101         //topPanel.setBackground(UIManager.getColor("TextField.background"));
102
topPanel.setLayout(new BorderLayout JavaDoc());
103         topPanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
104         
105         JButton JavaDoc closeButton = new JButton JavaDoc("Close");
106         closeButton.setMnemonic('c');
107         closeButton.addActionListener(new ActionListener JavaDoc() {
108             public void actionPerformed(ActionEvent JavaDoc event) {
109                 //createDefaultStackedBox();
110
SearchPanel.this.removeAll();
111                 SearchPanel.this.add(defaultBox, BorderLayout.CENTER);
112                 validate();
113                 repaint();
114             }
115         });
116         topPanel.add(closeButton, BorderLayout.EAST);
117
118         add(topPanel, BorderLayout.NORTH);
119         
120         createDefaultStackedBox();
121     }
122
123     private void initContextProvider() {
124
125         // if in debug mode, register context debugger view
126
if (Logging.DEBUG)
127             contextSearchManager.register(new ContextDebugProvider());
128
129         try {
130
131             IExtensionHandler handler = PluginManager
132                     .getInstance()
133                     .getExtensionHandler(
134                             IExtensionHandlerKeys.ORG_COLUMBA_CORE_CONTEXT_PROVIDER);
135
136             String JavaDoc[] ids = handler.getPluginIdList();
137             for (int i = 0; i < ids.length; i++) {
138                 try {
139                     IExtension extension = handler.getExtension(ids[i]);
140
141                     IContextProvider provider = (IContextProvider) extension
142                             .instanciateExtension(null);
143                     contextSearchManager.register(provider);
144                 } catch (PluginException e) {
145                     LOG.severe("Error while loading plugin: " + e.getMessage());
146                     if (Logging.DEBUG)
147                         e.printStackTrace();
148                 }
149             }
150
151         } catch (PluginHandlerNotFoundException e) {
152             LOG.severe("Error while loading plugin: " + e.getMessage());
153             if (Logging.DEBUG)
154                 e.printStackTrace();
155         }
156     }
157
158     private void initSearchProvider() {
159         List JavaDoc<ISearchProvider> list = new Vector JavaDoc<ISearchProvider>();
160         try {
161
162             IExtensionHandler handler = PluginManager.getInstance()
163                     .getExtensionHandler(
164                             IExtensionHandlerKeys.ORG_COLUMBA_CORE_SEARCH);
165
166             String JavaDoc[] ids = handler.getPluginIdList();
167             for (int i = 0; i < ids.length; i++) {
168                 try {
169                     IExtension extension = handler.getExtension(ids[i]);
170
171                     ISearchProvider provider = (ISearchProvider) extension
172                             .instanciateExtension(null);
173                     searchManager.registerProvider(provider);
174                 } catch (PluginException e) {
175                     LOG.severe("Error while loading plugin: " + e.getMessage());
176                     if (Logging.DEBUG)
177                         e.printStackTrace();
178                 }
179             }
180
181         } catch (PluginHandlerNotFoundException e) {
182             LOG.severe("Error while loading plugin: " + e.getMessage());
183             if (Logging.DEBUG)
184                 e.printStackTrace();
185         }
186
187     }
188
189     // search individual provider and individual criteria
190
public void searchInCriteria(String JavaDoc searchTerm, String JavaDoc providerName,
191             String JavaDoc criteriaName, boolean searchInside) {
192
193         showSearchDockingView();
194
195         ISearchManager manager = searchManager;
196
197         // start a new search -> clear all previous search results
198
manager.clearSearch(searchTerm);
199         manager.reset();
200
201         createSearchStackedBox(searchTerm, providerName, criteriaName);
202
203         // TODO @author fdietz: no paging used currently
204
// show only first 5 results
205
manager.executeSearch(searchTerm, providerName, criteriaName,
206                 searchInside, 0, SearchPanel.RESULT_COUNT);
207     }
208
209     // search individual provider
210
public void searchInProvider(String JavaDoc searchTerm, String JavaDoc providerName,
211             boolean searchInside) {
212
213         showSearchDockingView();
214
215         ISearchManager manager = searchManager;
216
217         // start a new search -> clear all previous search results
218
manager.clearSearch(searchTerm);
219         manager.reset();
220
221         createSearchStackedBox(searchTerm, providerName, null);
222
223         // TODO @author fdietz: no paging used currently
224
// show only first 5 results
225
manager.executeSearch(searchTerm, providerName, searchInside, 0,
226                 SearchPanel.RESULT_COUNT);
227     }
228
229     // search across all providers
230
public void searchAll(String JavaDoc searchTerm, boolean searchInside) {
231
232         showSearchDockingView();
233
234         ISearchManager manager = searchManager;
235
236         // start a new search -> clear all previous search results
237
manager.clearSearch(searchTerm);
238         manager.reset();
239
240         createSearchStackedBox(searchTerm, null, null);
241
242         // TODO @author fdietz: no paging used currently
243
// show only first 5 results
244
manager.executeSearch(searchTerm, searchInside, 0,
245                 SearchPanel.RESULT_COUNT);
246     }
247
248     // search across a few specific search criteria at once
249
public void searchComplex(List JavaDoc<ISearchRequest> list, boolean matchAll,
250             boolean searchInside) {
251         showSearchDockingView();
252
253         // start a new search -> clear all previous search results
254
searchManager.reset();
255
256         
257         removeAll();
258         //remove(topPanel);
259
add(topPanel, BorderLayout.NORTH);
260         add(searchBox, BorderLayout.CENTER);
261         
262         searchBox.removeAll();
263
264         // first, create bucket for each provider
265
Map JavaDoc<String JavaDoc, Vector JavaDoc<ISearchRequest>> map = new Hashtable JavaDoc<String JavaDoc, Vector JavaDoc<ISearchRequest>>();
266         Iterator JavaDoc<ISearchRequest> it = list.iterator();
267         while (it.hasNext()) {
268             ISearchRequest r = it.next();
269             String JavaDoc providerName = r.getProvider();
270
271             if (map.containsKey(providerName)) {
272                 Vector JavaDoc<ISearchRequest> v = map.get(providerName);
273                 v.add(r);
274             } else {
275                 Vector JavaDoc<ISearchRequest> v = new Vector JavaDoc<ISearchRequest>();
276                 v.add(r);
277                 map.put(providerName, v);
278             }
279         }
280
281         // now search through all buckets
282
Iterator JavaDoc<String JavaDoc> it2 = map.keySet().iterator();
283         while (it2.hasNext()) {
284             final String JavaDoc providerName = it2.next();
285             ISearchProvider p = searchManager.getProvider(providerName);
286             createComplexResultPanel(p);
287         }
288         validate();
289         repaint();
290
291         // TODO @author fdietz: no paging used currently
292
// show only first 5 results
293
searchManager.executeSearch(list, matchAll, searchInside, 0,
294                 SearchPanel.RESULT_COUNT);
295     }
296
297     private void createDefaultStackedBox() {
298
299         removeAll();
300         //remove(topPanel);
301

302         add(defaultBox, BorderLayout.CENTER);
303         
304         //defaultBox.removeAll();
305

306         try {
307
308             IExtensionHandler handler = PluginManager
309                     .getInstance()
310                     .getExtensionHandler(
311                             IExtensionHandlerKeys.ORG_COLUMBA_CORE_COMPONENT_BOX);
312
313             Enumeration JavaDoc<IExtension> e = handler.getExtensionEnumeration();
314
315             while (e.hasMoreElements()) {
316                 try {
317                     IExtension extension = e.nextElement();
318
319                     IComponentBox compBox = (IComponentBox) extension
320                             .instanciateExtension(null);
321
322                     defaultBox.add(new ComponentBoxContainer(compBox));
323                 } catch (PluginException ex) {
324                     LOG
325                             .severe("Error while loading plugin: "
326                                     + ex.getMessage());
327                     if (Logging.DEBUG)
328                         ex.printStackTrace();
329                 }
330             }
331
332         } catch (PluginHandlerNotFoundException e) {
333             LOG.severe("Error while loading plugin: " + e.getMessage());
334             if (Logging.DEBUG)
335                 e.printStackTrace();
336         }
337
338         Iterator JavaDoc<IContextProvider> it = contextSearchManager.getAllProviders()
339                 .iterator();
340         while (it.hasNext()) {
341             IContextProvider p = it.next();
342
343             // clear previous search results
344
p.clear();
345             ContextResultBox resultBox = new ContextResultBox(frameMediator, p,
346                     contextSearchManager);
347             defaultBox.add(resultBox);
348
349             contextMap.put(p.getName(), resultBox);
350         }
351
352         validate();
353         repaint();
354     }
355
356     // create new stacked box
357
private void createSearchStackedBox(String JavaDoc searchTerm, String JavaDoc providerName,
358             String JavaDoc criteriaName) {
359         if (searchTerm == null)
360             throw new IllegalArgumentException JavaDoc("searchTerm == null");
361
362         //remove(topPanel);
363
removeAll();
364         add(topPanel, BorderLayout.NORTH);
365         add(searchBox, BorderLayout.CENTER);
366
367         searchBox.removeAll();
368
369         // search across all providers
370
boolean providerAll = (providerName == null) ? true : false;
371         // search all criteria in specific provider only
372
boolean providerSearch = (providerName != null) ? true : false;
373         // search in specific criteria
374
boolean criteriaSearch = (criteriaName != null && providerName != null) ? true
375                 : false;
376
377         ISearchManager manager = searchManager;
378
379         if (criteriaSearch) {
380             // query with only a single criteria
381

382             ISearchProvider p = manager.getProvider(providerName);
383
384             ISearchCriteria c = p.getCriteria(criteriaName, searchTerm);
385
386             createResultPanel(p, c);
387
388         } else if (providerSearch) {
389
390             // query only a single provider
391

392             ISearchProvider p = manager.getProvider(providerName);
393
394             Iterator JavaDoc<ISearchCriteria> it2 = p.getAllCriteria(searchTerm)
395                     .iterator();
396             while (it2.hasNext()) {
397                 ISearchCriteria c = it2.next();
398                 createResultPanel(p, c);
399             }
400
401         } else if (providerAll) {
402             // query all criteria of all providers
403

404             Iterator JavaDoc<ISearchProvider> it = manager.getAllProviders();
405             while (it.hasNext()) {
406                 ISearchProvider p = it.next();
407                 if (p == null)
408                     continue;
409
410                 Iterator JavaDoc<ISearchCriteria> it2 = p.getAllCriteria(searchTerm)
411                         .iterator();
412                 while (it2.hasNext()) {
413                     ISearchCriteria c = it2.next();
414                     createResultPanel(p, c);
415                 }
416             }
417         }
418
419         // repaint box
420
validate();
421         repaint();
422     }
423
424     private void createComplexResultPanel(ISearchProvider p) {
425
426         IResultPanel resultPanel = p.getComplexResultPanel();
427
428         // add result panel as listener for new search results
429
searchManager.addResultListener(resultPanel);
430
431         // create visual container for result panel
432
SearchResultBox resultBox = new SearchResultBox(frameMediator, p, null,
433                 resultPanel);
434         resultBox.installListener(searchManager);
435
436         // add to search panel
437
searchBox.add(resultBox);
438     }
439
440     private void createResultPanel(ISearchProvider p, ISearchCriteria c) {
441
442         IResultPanel resultPanel = p.getResultPanel(c.getTechnicalName());
443
444         // add result panel as listener for new search results
445
searchManager.addResultListener(resultPanel);
446
447         // create visual container for result panel
448
SearchResultBox resultBox = new SearchResultBox(frameMediator, p, c,
449                 resultPanel);
450         resultBox.installListener(searchManager);
451
452         // add to search panel
453
searchBox.add(resultBox);
454     }
455
456     // show search docking view
457
private void showSearchDockingView() {
458         if (frameMediator instanceof IDock) {
459             // show docking view
460
((IDock) frameMediator).showDockable(IDock.DOCKING_VIEW_SEARCH);
461         }
462
463     }
464
465     /**
466      * @see org.columba.core.gui.search.api.ISearchPanel#getView()
467      */

468     public JComponent JavaDoc getView() {
469         return this;
470     }
471
472     public ISearchManager getSearchManager() {
473         return searchManager;
474     }
475
476     public IContextSearchManager getContextSearchManager() {
477         return contextSearchManager;
478     }
479
480     public void searchInContext() {
481         // init result view
482
//createContextStackedBox();
483

484         // execute background search
485
contextSearchManager.search();
486     }
487
488 // private void createContextStackedBox() {
489
//
490
// searchMap.clear();
491
//
492
// remove(topPanel);
493
// add(topPanel, BorderLayout.NORTH);
494
//
495
// box.removeAll();
496
//
497
// Iterator<IContextProvider> it = contextSearchManager.getAllProviders()
498
// .iterator();
499
// while (it.hasNext()) {
500
// IContextProvider p = it.next();
501
//
502
// // clear previous search results
503
// p.clear();
504
// ContextResultBox resultBox = new ContextResultBox(frameMediator, p,
505
// contextSearchManager);
506
// box.addBox(resultBox);
507
//
508
// contextMap.put(p.getName(), resultBox);
509
// }
510
//
511
// // repaint box
512
// validate();
513
// repaint();
514
// }
515

516 }
517
Popular Tags