PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

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

#
Java | 349 lines | 261 code | 40 blank | 48 comment | 28 complexity | 0e43dc6b1231319a3a0069826d2fb5ab 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.text.*;
  28. import javax.swing.tree.*;
  29. import java.awt.*;
  30. import java.awt.event.*;
  31. import org.gjt.sp.jedit.gui.*;
  32. import org.gjt.sp.jedit.io.VFSManager;
  33. import org.gjt.sp.jedit.msg.*;
  34. import org.gjt.sp.jedit.textarea.*;
  35. import org.gjt.sp.jedit.jEdit;
  36. import org.gjt.sp.jedit.Buffer;
  37. import org.gjt.sp.jedit.EBComponent;
  38. import org.gjt.sp.jedit.EBMessage;
  39. import org.gjt.sp.jedit.EditBus;
  40. import org.gjt.sp.jedit.View;
  41. import org.gjt.sp.util.Log;
  42. //}}}
  43. /**
  44. * HyperSearch results window.
  45. * @author Slava Pestov
  46. * @version $Id: HyperSearchResults.java 4006 2002-02-03 06:37:56Z spestov $
  47. */
  48. public class HyperSearchResults extends JPanel implements EBComponent
  49. {
  50. public static final String NAME = "hypersearch-results";
  51. //{{{ HyperSearchResults constructor
  52. public HyperSearchResults(View view)
  53. {
  54. super(new BorderLayout());
  55. this.view = view;
  56. caption = new JLabel();
  57. updateCaption(0,0);
  58. add(BorderLayout.NORTH, caption);
  59. resultTreeRoot = new DefaultMutableTreeNode();
  60. resultTreeModel = new DefaultTreeModel(resultTreeRoot);
  61. resultTree = new JTree(resultTreeModel);
  62. resultTree.setCellRenderer(new ResultCellRenderer());
  63. resultTree.setVisibleRowCount(16);
  64. resultTree.setRootVisible(false);
  65. resultTree.setShowsRootHandles(true);
  66. resultTree.putClientProperty("JTree.lineStyle", "Angled");
  67. resultTree.setEditable(false);
  68. resultTree.addTreeSelectionListener(new TreeSelectionHandler());
  69. resultTree.addKeyListener(new KeyHandler());
  70. resultTree.addMouseListener(new MouseHandler());
  71. JScrollPane scrollPane = new JScrollPane(resultTree);
  72. Dimension dim = scrollPane.getPreferredSize();
  73. dim.width = 400;
  74. scrollPane.setPreferredSize(dim);
  75. add(BorderLayout.CENTER, scrollPane);
  76. } //}}}
  77. //{{{ requestDefaultFocus() method
  78. public boolean requestDefaultFocus()
  79. {
  80. resultTree.grabFocus();
  81. return true;
  82. } //}}}
  83. //{{{ addNotify() method
  84. public void addNotify()
  85. {
  86. super.addNotify();
  87. EditBus.addToBus(this);
  88. } //}}}
  89. //{{{ removeNotify() method
  90. public void removeNotify()
  91. {
  92. super.removeNotify();
  93. EditBus.removeFromBus(this);
  94. } //}}}
  95. //{{{ handleMessage() method
  96. public void handleMessage(EBMessage msg)
  97. {
  98. if(msg instanceof BufferUpdate)
  99. {
  100. BufferUpdate bmsg = (BufferUpdate)msg;
  101. Buffer buffer = bmsg.getBuffer();
  102. if(bmsg.getWhat() == BufferUpdate.LOADED)
  103. {
  104. for(int i = resultTreeRoot.getChildCount() - 1; i >= 0; i--)
  105. {
  106. DefaultMutableTreeNode bufferNode = (DefaultMutableTreeNode)
  107. resultTreeRoot.getChildAt(i);
  108. for(int j = bufferNode.getChildCount() - 1;
  109. j >= 0; j--)
  110. {
  111. HyperSearchResult result = (HyperSearchResult)
  112. ((DefaultMutableTreeNode)bufferNode
  113. .getChildAt(j)).getUserObject();
  114. if(buffer.getPath().equals(result.path))
  115. result.bufferOpened(buffer);
  116. }
  117. }
  118. }
  119. else if(bmsg.getWhat() == BufferUpdate.CLOSED)
  120. {
  121. for(int i = resultTreeRoot.getChildCount() - 1; i >= 0; i--)
  122. {
  123. DefaultMutableTreeNode bufferNode = (DefaultMutableTreeNode)
  124. resultTreeRoot.getChildAt(i);
  125. for(int j = bufferNode.getChildCount() - 1;
  126. j >= 0; j--)
  127. {
  128. HyperSearchResult result = (HyperSearchResult)
  129. ((DefaultMutableTreeNode)bufferNode
  130. .getChildAt(j)).getUserObject();
  131. if(buffer.getPath().equals(result.path))
  132. result.bufferClosed();
  133. }
  134. }
  135. }
  136. }
  137. } //}}}
  138. //{{{ getTreeModel() method
  139. public DefaultTreeModel getTreeModel()
  140. {
  141. return resultTreeModel;
  142. } //}}}
  143. //{{{ searchStarted() method
  144. public void searchStarted()
  145. {
  146. caption.setText(jEdit.getProperty("hypersearch-results.searching"));
  147. resultTreeRoot.removeAllChildren();
  148. resultTreeModel.reload(resultTreeRoot);
  149. } //}}}
  150. //{{{ searchDone() method
  151. public void searchDone(int resultCount, int bufferCount)
  152. {
  153. updateCaption(resultCount,bufferCount);
  154. SwingUtilities.invokeLater(new Runnable()
  155. {
  156. public void run()
  157. {
  158. for(int i = 0; i < resultTreeRoot.getChildCount(); i++)
  159. {
  160. resultTree.expandPath(new TreePath(
  161. ((DefaultMutableTreeNode)
  162. resultTreeRoot.getChildAt(i))
  163. .getPath()));
  164. }
  165. }
  166. });
  167. } //}}}
  168. //{{{ Private members
  169. private View view;
  170. private JLabel caption;
  171. private JTree resultTree;
  172. private DefaultMutableTreeNode resultTreeRoot;
  173. private DefaultTreeModel resultTreeModel;
  174. //{{{ goToSelectedNode() method
  175. private void goToSelectedNode()
  176. {
  177. TreePath path = resultTree.getSelectionPath();
  178. if(path == null)
  179. return;
  180. Object value = ((DefaultMutableTreeNode)path
  181. .getLastPathComponent()).getUserObject();
  182. if(value instanceof String)
  183. {
  184. Buffer buffer = jEdit.openFile(view,(String)value);
  185. if(buffer == null)
  186. return;
  187. view.setBuffer(buffer);
  188. // fuck me dead
  189. SwingUtilities.invokeLater(new Runnable()
  190. {
  191. public void run()
  192. {
  193. resultTree.requestFocus();
  194. }
  195. });
  196. }
  197. else
  198. {
  199. final HyperSearchResult result = (HyperSearchResult)value;
  200. final Buffer buffer = result.getBuffer();
  201. if(buffer == null)
  202. return;
  203. VFSManager.runInAWTThread(new Runnable()
  204. {
  205. public void run()
  206. {
  207. int start = result.startPos.getOffset();
  208. int end = result.endPos.getOffset();
  209. Selection s = new Selection.Range(start,end);
  210. view.setBuffer(buffer);
  211. JEditTextArea textArea = view.getTextArea();
  212. if(textArea.isMultipleSelectionEnabled())
  213. textArea.addToSelection(s);
  214. else
  215. textArea.setSelection(s);
  216. textArea.moveCaretPosition(end);
  217. }
  218. });
  219. }
  220. } //}}}
  221. //{{{ updateCaption() method
  222. private void updateCaption(int resultCount, int bufferCount)
  223. {
  224. Object[] pp = { new Integer(resultCount), new Integer(bufferCount) };
  225. caption.setText(jEdit.getProperty("hypersearch-results.caption",pp));
  226. } //}}}
  227. //}}}
  228. //{{{ KeyHandler class
  229. class KeyHandler extends KeyAdapter
  230. {
  231. public void keyPressed(KeyEvent evt)
  232. {
  233. if(evt.getKeyCode() == KeyEvent.VK_ENTER)
  234. goToSelectedNode();
  235. }
  236. } //}}}
  237. //{{{ MouseHandler class
  238. class MouseHandler extends MouseAdapter
  239. {
  240. public void mouseClicked(MouseEvent evt)
  241. {
  242. TreePath path1 = resultTree.getPathForLocation(
  243. evt.getX(),evt.getY());
  244. if(path1 == null)
  245. return;
  246. resultTree.setSelectionPath(path1);
  247. goToSelectedNode();
  248. view.toFront();
  249. view.requestFocus();
  250. view.getTextArea().requestFocus();
  251. }
  252. } //}}}
  253. //{{{ TreeSelectionHandler class
  254. class TreeSelectionHandler implements TreeSelectionListener
  255. {
  256. public void valueChanged(TreeSelectionEvent evt)
  257. {
  258. goToSelectedNode();
  259. }
  260. } //}}}
  261. //{{{ ResultCellRenderer class
  262. class ResultCellRenderer extends DefaultTreeCellRenderer
  263. {
  264. Font plainFont, boldFont;
  265. //{{{ ResultCellRenderer constructor
  266. ResultCellRenderer()
  267. {
  268. plainFont = UIManager.getFont("Tree.font");
  269. boldFont = new Font(plainFont.getName(),Font.BOLD,
  270. plainFont.getSize());
  271. } //}}}
  272. //{{{ getTreeCellRendererComponent() method
  273. public Component getTreeCellRendererComponent(JTree tree,
  274. Object value, boolean sel, boolean expanded,
  275. boolean leaf, int row, boolean hasFocus)
  276. {
  277. Component comp = super.getTreeCellRendererComponent(tree,value,sel,
  278. expanded,leaf,row,hasFocus);
  279. setIcon(null);
  280. DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
  281. if(node.getUserObject() instanceof String)
  282. {
  283. // file name
  284. ResultCellRenderer.this.setFont(boldFont);
  285. int count = node.getChildCount();
  286. if(count == 1)
  287. {
  288. setText(jEdit.getProperty("hypersearch-results"
  289. + ".file-caption1",new Object[] {
  290. node.getUserObject()
  291. }));
  292. }
  293. else
  294. {
  295. setText(jEdit.getProperty("hypersearch-results"
  296. + ".file-caption",new Object[] {
  297. node.getUserObject(),
  298. new Integer(count)
  299. }));
  300. }
  301. }
  302. else
  303. {
  304. ResultCellRenderer.this.setFont(plainFont);
  305. }
  306. return this;
  307. } //}}}
  308. } //}}}
  309. }