PageRenderTime 40ms CodeModel.GetById 0ms RepoModel.GetById 1ms app.codeStats 0ms

/jEdit/tags/jedit-4-1-pre5/org/gjt/sp/jedit/search/HyperSearchResults.java

#
Java | 347 lines | 256 code | 42 blank | 49 comment | 29 complexity | 67805dd3abab93e1f6da0ab1cbd2c330 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * HyperSearchResults.java - HyperSearch results
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 1998, 1999, 2000, 2001 Slava Pestov
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. package org.gjt.sp.jedit.search;
  23. //{{{ Imports
  24. import javax.swing.*;
  25. import javax.swing.border.*;
  26. import javax.swing.event.*;
  27. import javax.swing.tree.*;
  28. import java.awt.*;
  29. import java.awt.event.*;
  30. import org.gjt.sp.jedit.gui.*;
  31. import org.gjt.sp.jedit.io.VFSManager;
  32. import org.gjt.sp.jedit.msg.*;
  33. import org.gjt.sp.jedit.textarea.*;
  34. import org.gjt.sp.jedit.*;
  35. import org.gjt.sp.util.Log;
  36. //}}}
  37. /**
  38. * HyperSearch results window.
  39. * @author Slava Pestov
  40. * @version $Id: HyperSearchResults.java 4338 2002-09-11 16:41:47Z spestov $
  41. */
  42. public class HyperSearchResults extends JPanel implements EBComponent
  43. {
  44. public static final String NAME = "hypersearch-results";
  45. //{{{ HyperSearchResults constructor
  46. public HyperSearchResults(View view)
  47. {
  48. super(new BorderLayout());
  49. this.view = view;
  50. caption = new JLabel();
  51. updateCaption(0,0);
  52. add(BorderLayout.NORTH, caption);
  53. resultTreeRoot = new DefaultMutableTreeNode();
  54. resultTreeModel = new DefaultTreeModel(resultTreeRoot);
  55. resultTree = new JTree(resultTreeModel);
  56. resultTree.setCellRenderer(new ResultCellRenderer());
  57. resultTree.setVisibleRowCount(16);
  58. resultTree.setRootVisible(false);
  59. resultTree.setShowsRootHandles(true);
  60. // looks bad with the OS X L&F, apparently...
  61. if(!OperatingSystem.isMacOSLF())
  62. resultTree.putClientProperty("JTree.lineStyle", "Angled");
  63. resultTree.setEditable(false);
  64. resultTree.addTreeSelectionListener(new TreeSelectionHandler());
  65. resultTree.addKeyListener(new KeyHandler());
  66. resultTree.addMouseListener(new MouseHandler());
  67. JScrollPane scrollPane = new JScrollPane(resultTree);
  68. Dimension dim = scrollPane.getPreferredSize();
  69. dim.width = 400;
  70. scrollPane.setPreferredSize(dim);
  71. add(BorderLayout.CENTER, scrollPane);
  72. } //}}}
  73. //{{{ requestDefaultFocus() method
  74. public boolean requestDefaultFocus()
  75. {
  76. resultTree.grabFocus();
  77. return true;
  78. } //}}}
  79. //{{{ addNotify() method
  80. public void addNotify()
  81. {
  82. super.addNotify();
  83. EditBus.addToBus(this);
  84. } //}}}
  85. //{{{ removeNotify() method
  86. public void removeNotify()
  87. {
  88. super.removeNotify();
  89. EditBus.removeFromBus(this);
  90. } //}}}
  91. //{{{ handleMessage() method
  92. public void handleMessage(EBMessage msg)
  93. {
  94. if(msg instanceof BufferUpdate)
  95. {
  96. BufferUpdate bmsg = (BufferUpdate)msg;
  97. Buffer buffer = bmsg.getBuffer();
  98. if(bmsg.getWhat() == BufferUpdate.LOADED)
  99. {
  100. for(int i = resultTreeRoot.getChildCount() - 1; i >= 0; i--)
  101. {
  102. DefaultMutableTreeNode bufferNode = (DefaultMutableTreeNode)
  103. resultTreeRoot.getChildAt(i);
  104. for(int j = bufferNode.getChildCount() - 1;
  105. j >= 0; j--)
  106. {
  107. HyperSearchResult result = (HyperSearchResult)
  108. ((DefaultMutableTreeNode)bufferNode
  109. .getChildAt(j)).getUserObject();
  110. if(buffer.getPath().equals(result.path))
  111. result.bufferOpened(buffer);
  112. }
  113. }
  114. }
  115. else if(bmsg.getWhat() == BufferUpdate.CLOSED)
  116. {
  117. for(int i = resultTreeRoot.getChildCount() - 1; i >= 0; i--)
  118. {
  119. DefaultMutableTreeNode bufferNode = (DefaultMutableTreeNode)
  120. resultTreeRoot.getChildAt(i);
  121. for(int j = bufferNode.getChildCount() - 1;
  122. j >= 0; j--)
  123. {
  124. HyperSearchResult result = (HyperSearchResult)
  125. ((DefaultMutableTreeNode)bufferNode
  126. .getChildAt(j)).getUserObject();
  127. if(buffer.getPath().equals(result.path))
  128. result.bufferClosed();
  129. }
  130. }
  131. }
  132. }
  133. } //}}}
  134. //{{{ getTreeModel() method
  135. public DefaultTreeModel getTreeModel()
  136. {
  137. return resultTreeModel;
  138. } //}}}
  139. //{{{ searchStarted() method
  140. public void searchStarted()
  141. {
  142. caption.setText(jEdit.getProperty("hypersearch-status"));
  143. resultTreeRoot.removeAllChildren();
  144. resultTreeModel.reload(resultTreeRoot);
  145. } //}}}
  146. //{{{ searchDone() method
  147. public void searchDone(int resultCount, int bufferCount)
  148. {
  149. updateCaption(resultCount,bufferCount);
  150. SwingUtilities.invokeLater(new Runnable()
  151. {
  152. public void run()
  153. {
  154. for(int i = 0; i < resultTreeRoot.getChildCount(); i++)
  155. {
  156. resultTree.expandPath(new TreePath(
  157. ((DefaultMutableTreeNode)
  158. resultTreeRoot.getChildAt(i))
  159. .getPath()));
  160. }
  161. }
  162. });
  163. } //}}}
  164. //{{{ Private members
  165. private View view;
  166. private JLabel caption;
  167. private JTree resultTree;
  168. private DefaultMutableTreeNode resultTreeRoot;
  169. private DefaultTreeModel resultTreeModel;
  170. //{{{ goToSelectedNode() method
  171. private void goToSelectedNode()
  172. {
  173. TreePath path = resultTree.getSelectionPath();
  174. if(path == null)
  175. return;
  176. Object value = ((DefaultMutableTreeNode)path
  177. .getLastPathComponent()).getUserObject();
  178. if(value instanceof String)
  179. {
  180. Buffer buffer = jEdit.openFile(view,(String)value);
  181. if(buffer == null)
  182. return;
  183. view.setBuffer(buffer);
  184. // fuck me dead
  185. SwingUtilities.invokeLater(new Runnable()
  186. {
  187. public void run()
  188. {
  189. resultTree.requestFocus();
  190. }
  191. });
  192. }
  193. else
  194. {
  195. final HyperSearchResult result = (HyperSearchResult)value;
  196. final Buffer buffer = result.getBuffer();
  197. if(buffer == null)
  198. return;
  199. VFSManager.runInAWTThread(new Runnable()
  200. {
  201. public void run()
  202. {
  203. int start = result.startPos.getOffset();
  204. int end = result.endPos.getOffset();
  205. Selection s = new Selection.Range(start,end);
  206. view.setBuffer(buffer);
  207. JEditTextArea textArea = view.getTextArea();
  208. if(textArea.isMultipleSelectionEnabled())
  209. textArea.addToSelection(s);
  210. else
  211. textArea.setSelection(s);
  212. textArea.moveCaretPosition(end);
  213. }
  214. });
  215. }
  216. } //}}}
  217. //{{{ updateCaption() method
  218. private void updateCaption(int resultCount, int bufferCount)
  219. {
  220. Object[] pp = { new Integer(resultCount), new Integer(bufferCount) };
  221. caption.setText(jEdit.getProperty("hypersearch-results.caption",pp));
  222. } //}}}
  223. //}}}
  224. //{{{ KeyHandler class
  225. class KeyHandler extends KeyAdapter
  226. {
  227. public void keyPressed(KeyEvent evt)
  228. {
  229. if(evt.getKeyCode() == KeyEvent.VK_ENTER)
  230. goToSelectedNode();
  231. }
  232. } //}}}
  233. //{{{ MouseHandler class
  234. class MouseHandler extends MouseAdapter
  235. {
  236. public void mouseClicked(MouseEvent evt)
  237. {
  238. TreePath path1 = resultTree.getPathForLocation(
  239. evt.getX(),evt.getY());
  240. if(path1 == null)
  241. return;
  242. resultTree.setSelectionPath(path1);
  243. goToSelectedNode();
  244. view.toFront();
  245. view.requestFocus();
  246. view.getTextArea().requestFocus();
  247. }
  248. } //}}}
  249. //{{{ TreeSelectionHandler class
  250. class TreeSelectionHandler implements TreeSelectionListener
  251. {
  252. public void valueChanged(TreeSelectionEvent evt)
  253. {
  254. goToSelectedNode();
  255. }
  256. } //}}}
  257. //{{{ ResultCellRenderer class
  258. class ResultCellRenderer extends DefaultTreeCellRenderer
  259. {
  260. Font plainFont, boldFont;
  261. //{{{ ResultCellRenderer constructor
  262. ResultCellRenderer()
  263. {
  264. plainFont = UIManager.getFont("Tree.font");
  265. boldFont = new Font(plainFont.getName(),Font.BOLD,
  266. plainFont.getSize());
  267. } //}}}
  268. //{{{ getTreeCellRendererComponent() method
  269. public Component getTreeCellRendererComponent(JTree tree,
  270. Object value, boolean sel, boolean expanded,
  271. boolean leaf, int row, boolean hasFocus)
  272. {
  273. Component comp = super.getTreeCellRendererComponent(tree,value,sel,
  274. expanded,leaf,row,hasFocus);
  275. setIcon(null);
  276. DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
  277. if(node.getUserObject() instanceof String)
  278. {
  279. // file name
  280. ResultCellRenderer.this.setFont(boldFont);
  281. int count = node.getChildCount();
  282. if(count == 1)
  283. {
  284. setText(jEdit.getProperty("hypersearch-results"
  285. + ".file-caption1",new Object[] {
  286. node.getUserObject()
  287. }));
  288. }
  289. else
  290. {
  291. setText(jEdit.getProperty("hypersearch-results"
  292. + ".file-caption",new Object[] {
  293. node.getUserObject(),
  294. new Integer(count)
  295. }));
  296. }
  297. }
  298. else
  299. {
  300. ResultCellRenderer.this.setFont(plainFont);
  301. }
  302. return this;
  303. } //}}}
  304. } //}}}
  305. }