1 package org.columba.core.gui.search; 2 3 import java.awt.BorderLayout ; 4 import java.awt.Color ; 5 import java.awt.event.ActionEvent ; 6 import java.awt.event.ActionListener ; 7 import java.util.Enumeration ; 8 import java.util.Hashtable ; 9 import java.util.Iterator ; 10 import java.util.List ; 11 import java.util.Map ; 12 import java.util.Vector ; 13 import java.util.logging.Logger ; 14 15 import javax.swing.BorderFactory ; 16 import javax.swing.JButton ; 17 import javax.swing.JComponent ; 18 import javax.swing.JPanel ; 19 import javax.swing.JScrollPane ; 20 import javax.swing.UIManager ; 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 implements ISearchPanel { 47 48 private static final int RESULT_COUNT = 20; 49 50 private static final Logger LOG = Logger 51 .getLogger("org.columba.core.search.gui.SearchPanel"); 52 53 private IFrameMediator frameMediator; 54 55 57 private JPanel defaultBox; 59 private JPanel searchBox; 60 61 private Hashtable <String , SearchResultBox> searchMap = new Hashtable <String , SearchResultBox>(); 62 63 private ISearchManager searchManager; 64 65 private Map <String , ContextResultBox> contextMap = new Hashtable <String , ContextResultBox>(); 66 67 private IContextSearchManager contextSearchManager; 68 69 private JPanel 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 defaultBox = new JPanel (); 86 defaultBox.setLayout(new VerticalLayout()); 87 defaultBox.setBackground(UIManager.getColor("TextField.background")); 88 89 searchBox = new JPanel (); 90 searchBox.setLayout(new VerticalLayout()); 91 searchBox.setBackground(UIManager.getColor("TextField.background")); 92 93 97 setLayout(new BorderLayout ()); 98 add(defaultBox, BorderLayout.CENTER); 99 100 topPanel = new JPanel (); 101 topPanel.setLayout(new BorderLayout ()); 103 topPanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 104 105 JButton closeButton = new JButton ("Close"); 106 closeButton.setMnemonic('c'); 107 closeButton.addActionListener(new ActionListener () { 108 public void actionPerformed(ActionEvent event) { 109 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 (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 [] 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 <ISearchProvider> list = new Vector <ISearchProvider>(); 160 try { 161 162 IExtensionHandler handler = PluginManager.getInstance() 163 .getExtensionHandler( 164 IExtensionHandlerKeys.ORG_COLUMBA_CORE_SEARCH); 165 166 String [] 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 public void searchInCriteria(String searchTerm, String providerName, 191 String criteriaName, boolean searchInside) { 192 193 showSearchDockingView(); 194 195 ISearchManager manager = searchManager; 196 197 manager.clearSearch(searchTerm); 199 manager.reset(); 200 201 createSearchStackedBox(searchTerm, providerName, criteriaName); 202 203 manager.executeSearch(searchTerm, providerName, criteriaName, 206 searchInside, 0, SearchPanel.RESULT_COUNT); 207 } 208 209 public void searchInProvider(String searchTerm, String providerName, 211 boolean searchInside) { 212 213 showSearchDockingView(); 214 215 ISearchManager manager = searchManager; 216 217 manager.clearSearch(searchTerm); 219 manager.reset(); 220 221 createSearchStackedBox(searchTerm, providerName, null); 222 223 manager.executeSearch(searchTerm, providerName, searchInside, 0, 226 SearchPanel.RESULT_COUNT); 227 } 228 229 public void searchAll(String searchTerm, boolean searchInside) { 231 232 showSearchDockingView(); 233 234 ISearchManager manager = searchManager; 235 236 manager.clearSearch(searchTerm); 238 manager.reset(); 239 240 createSearchStackedBox(searchTerm, null, null); 241 242 manager.executeSearch(searchTerm, searchInside, 0, 245 SearchPanel.RESULT_COUNT); 246 } 247 248 public void searchComplex(List <ISearchRequest> list, boolean matchAll, 250 boolean searchInside) { 251 showSearchDockingView(); 252 253 searchManager.reset(); 255 256 257 removeAll(); 258 add(topPanel, BorderLayout.NORTH); 260 add(searchBox, BorderLayout.CENTER); 261 262 searchBox.removeAll(); 263 264 Map <String , Vector <ISearchRequest>> map = new Hashtable <String , Vector <ISearchRequest>>(); 266 Iterator <ISearchRequest> it = list.iterator(); 267 while (it.hasNext()) { 268 ISearchRequest r = it.next(); 269 String providerName = r.getProvider(); 270 271 if (map.containsKey(providerName)) { 272 Vector <ISearchRequest> v = map.get(providerName); 273 v.add(r); 274 } else { 275 Vector <ISearchRequest> v = new Vector <ISearchRequest>(); 276 v.add(r); 277 map.put(providerName, v); 278 } 279 } 280 281 Iterator <String > it2 = map.keySet().iterator(); 283 while (it2.hasNext()) { 284 final String providerName = it2.next(); 285 ISearchProvider p = searchManager.getProvider(providerName); 286 createComplexResultPanel(p); 287 } 288 validate(); 289 repaint(); 290 291 searchManager.executeSearch(list, matchAll, searchInside, 0, 294 SearchPanel.RESULT_COUNT); 295 } 296 297 private void createDefaultStackedBox() { 298 299 removeAll(); 300 302 add(defaultBox, BorderLayout.CENTER); 303 304 306 try { 307 308 IExtensionHandler handler = PluginManager 309 .getInstance() 310 .getExtensionHandler( 311 IExtensionHandlerKeys.ORG_COLUMBA_CORE_COMPONENT_BOX); 312 313 Enumeration <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 <IContextProvider> it = contextSearchManager.getAllProviders() 339 .iterator(); 340 while (it.hasNext()) { 341 IContextProvider p = it.next(); 342 343 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 private void createSearchStackedBox(String searchTerm, String providerName, 358 String criteriaName) { 359 if (searchTerm == null) 360 throw new IllegalArgumentException ("searchTerm == null"); 361 362 removeAll(); 364 add(topPanel, BorderLayout.NORTH); 365 add(searchBox, BorderLayout.CENTER); 366 367 searchBox.removeAll(); 368 369 boolean providerAll = (providerName == null) ? true : false; 371 boolean providerSearch = (providerName != null) ? true : false; 373 boolean criteriaSearch = (criteriaName != null && providerName != null) ? true 375 : false; 376 377 ISearchManager manager = searchManager; 378 379 if (criteriaSearch) { 380 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 392 ISearchProvider p = manager.getProvider(providerName); 393 394 Iterator <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 404 Iterator <ISearchProvider> it = manager.getAllProviders(); 405 while (it.hasNext()) { 406 ISearchProvider p = it.next(); 407 if (p == null) 408 continue; 409 410 Iterator <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 validate(); 421 repaint(); 422 } 423 424 private void createComplexResultPanel(ISearchProvider p) { 425 426 IResultPanel resultPanel = p.getComplexResultPanel(); 427 428 searchManager.addResultListener(resultPanel); 430 431 SearchResultBox resultBox = new SearchResultBox(frameMediator, p, null, 433 resultPanel); 434 resultBox.installListener(searchManager); 435 436 searchBox.add(resultBox); 438 } 439 440 private void createResultPanel(ISearchProvider p, ISearchCriteria c) { 441 442 IResultPanel resultPanel = p.getResultPanel(c.getTechnicalName()); 443 444 searchManager.addResultListener(resultPanel); 446 447 SearchResultBox resultBox = new SearchResultBox(frameMediator, p, c, 449 resultPanel); 450 resultBox.installListener(searchManager); 451 452 searchBox.add(resultBox); 454 } 455 456 private void showSearchDockingView() { 458 if (frameMediator instanceof IDock) { 459 ((IDock) frameMediator).showDockable(IDock.DOCKING_VIEW_SEARCH); 461 } 462 463 } 464 465 468 public JComponent 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 484 contextSearchManager.search(); 486 } 487 488 516 } 517 | Popular Tags |