/jEdit/tags/jedit-4-3-pre17/org/gjt/sp/jedit/search/HyperSearchOperationNode.java

# · Java · 236 lines · 170 code · 27 blank · 39 comment · 25 complexity · cd1c1561594703b3c66145b1a51ab034 MD5 · raw file

  1. /*
  2. * HyperSearchOperationNode.java - Top result node of a HyperSearch request
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 1998, 1999, 2000, 2001, 2002 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 java.io.File;
  25. import java.util.ArrayList;
  26. import java.util.Enumeration;
  27. import java.util.HashMap;
  28. import java.util.List;
  29. import java.util.Map;
  30. import javax.swing.JTree;
  31. import javax.swing.tree.DefaultMutableTreeNode;
  32. import javax.swing.tree.DefaultTreeModel;
  33. import javax.swing.tree.MutableTreeNode;
  34. import javax.swing.tree.TreePath;
  35. //}}}
  36. /**
  37. * @author Slava Pestov
  38. * @version $Id: HyperSearchOperationNode.java 14798 2009-03-19 11:50:45Z shlomy $
  39. */
  40. public class HyperSearchOperationNode
  41. {
  42. private boolean treeViewDisplayed;
  43. private final String searchString;
  44. private List<DefaultMutableTreeNode> resultNodes;
  45. private SearchMatcher searchMatcher;
  46. //{{{ HyperSearchOperationNode constructor
  47. public HyperSearchOperationNode(String searchString, SearchMatcher searchMatcher)
  48. {
  49. this.searchString = searchString;
  50. this.searchMatcher = searchMatcher;
  51. }//}}}
  52. //{{{ toString() method
  53. public String toString()
  54. {
  55. return searchString;
  56. }//}}}
  57. //{{{ isTreeViewDisplayed() method
  58. public boolean isTreeViewDisplayed()
  59. {
  60. return treeViewDisplayed;
  61. }//}}}
  62. //{{{ setTreeViewDisplayed() method
  63. public void setTreeViewDisplayed(boolean treeViewDisplayed)
  64. {
  65. this.treeViewDisplayed = treeViewDisplayed;
  66. }//}}}
  67. //{{{ restoreFlatNodes() method
  68. public void restoreFlatNodes(JTree resultTree, DefaultMutableTreeNode operNode)
  69. {
  70. for (int i = 0; i < resultNodes.size(); i++)
  71. {
  72. DefaultMutableTreeNode element = resultNodes.get(i);
  73. if (element.getUserObject() instanceof HyperSearchFileNode)
  74. ((HyperSearchFileNode)element.getUserObject()).showFullPath = true;
  75. operNode.insert(element, operNode.getChildCount());
  76. }
  77. ((DefaultTreeModel)resultTree.getModel()).nodeStructureChanged(operNode);
  78. for (Enumeration e = operNode.children(); e.hasMoreElements();)
  79. {
  80. DefaultMutableTreeNode node = (DefaultMutableTreeNode)e.nextElement();
  81. resultTree.expandPath(new TreePath(node.getPath()));
  82. }
  83. resultTree.scrollPathToVisible(
  84. new TreePath(operNode.getPath()));
  85. }//}}}
  86. //{{{ cacheFlatNodes() method
  87. public void cacheResultNodes(DefaultMutableTreeNode operNode)
  88. {
  89. resultNodes = new ArrayList<DefaultMutableTreeNode>(operNode.getChildCount());
  90. for (Enumeration e = operNode.children(); e.hasMoreElements();)
  91. resultNodes.add((DefaultMutableTreeNode) e.nextElement());
  92. }//}}}
  93. //{{{ removeNodeFromCache() method
  94. public static void removeNodeFromCache(MutableTreeNode mnode)
  95. {
  96. DefaultMutableTreeNode node = (DefaultMutableTreeNode)mnode;
  97. if (node.getUserObject() instanceof HyperSearchOperationNode)
  98. return;
  99. DefaultMutableTreeNode tmpNode = node;
  100. while ((tmpNode = (DefaultMutableTreeNode) tmpNode.getParent()) != null)
  101. {
  102. if (!(tmpNode.getUserObject() instanceof HyperSearchOperationNode))
  103. continue;
  104. HyperSearchOperationNode operNode = (HyperSearchOperationNode) tmpNode.getUserObject();
  105. if (operNode.resultNodes != null)
  106. {
  107. // the nodes aren't cached so no need to remove the node from cache
  108. operNode.resultNodes.remove(node);
  109. }
  110. break;
  111. }
  112. }//}}}
  113. //{{{ insertTreeNodes() method
  114. public void insertTreeNodes(JTree resultTree, DefaultMutableTreeNode operNode)
  115. {
  116. String fileSep = System.getProperty("file.separator");
  117. String fileSepRegex = System.getProperty("file.separator");
  118. if (fileSep.equals("\\"))
  119. fileSepRegex = "\\\\";
  120. //find the highest level common path
  121. String[] topPathTmp = null;
  122. int topPathNdx = -1;
  123. for (int i = 0;i < resultNodes.size();i++)
  124. {
  125. DefaultMutableTreeNode fileTreeNode = resultNodes.get(i);
  126. Object obj = fileTreeNode.getUserObject();
  127. if (!(obj instanceof HyperSearchFileNode))
  128. continue;
  129. HyperSearchFileNode fileNode = (HyperSearchFileNode)obj;
  130. int pos = fileNode.path.lastIndexOf(fileSep);
  131. String pathName = fileNode.path.substring(0, pos);
  132. String[] paths = pathName.split(fileSepRegex);
  133. if (topPathNdx == -1)
  134. {
  135. topPathNdx = paths.length;
  136. topPathTmp = paths;
  137. }
  138. else if (paths.length < topPathNdx)
  139. {
  140. topPathNdx = paths.length;
  141. topPathTmp = paths;
  142. }
  143. else
  144. {
  145. for (int ndx =0 ; ndx < topPathNdx; ndx++)
  146. {
  147. if (!paths[ndx].equals(topPathTmp[ndx]))
  148. {
  149. topPathNdx = ndx;
  150. break;
  151. }
  152. }
  153. }
  154. }
  155. String[] topPath = new String[topPathNdx];
  156. String topPathPath = "";
  157. for (int ndx = 0 ; ndx < topPathNdx; ndx++)
  158. {
  159. topPath[ndx] = topPathTmp[ndx];
  160. topPathPath = topPathPath.concat(topPath[ndx] + fileSep);
  161. }
  162. Map<String, DefaultMutableTreeNode> treeNodes = new HashMap<String, DefaultMutableTreeNode>();
  163. HyperSearchFolderNode folderNode =
  164. new HyperSearchFolderNode(new File(topPathPath), true);
  165. DefaultMutableTreeNode folderTreeNode = new DefaultMutableTreeNode(folderNode);
  166. operNode.insert(folderTreeNode, operNode.getChildCount());
  167. treeNodes.put(topPathPath, folderTreeNode);
  168. for (int i = 0;i < resultNodes.size();i++)
  169. {
  170. DefaultMutableTreeNode fileTreeNode = resultNodes.get(i);
  171. Object obj = fileTreeNode.getUserObject();
  172. if (!(obj instanceof HyperSearchFileNode))
  173. continue;
  174. HyperSearchFileNode fileNode = (HyperSearchFileNode)obj;
  175. fileNode.showFullPath = false;
  176. int pos = fileNode.path.lastIndexOf(fileSep);
  177. String pathName = fileNode.path.substring(0, pos);
  178. String[] paths = pathName.split(fileSepRegex);
  179. DefaultMutableTreeNode insNode = folderTreeNode;
  180. String partialPath = topPathPath;
  181. for (int ndx = topPathNdx; ndx < paths.length; ndx++)
  182. {
  183. partialPath = partialPath.concat(paths[ndx] + fileSep);
  184. DefaultMutableTreeNode tmpNode = treeNodes.get(partialPath);
  185. if (tmpNode == null)
  186. {
  187. HyperSearchFolderNode tmpFolderNode =
  188. new HyperSearchFolderNode(new File(partialPath), false);
  189. tmpNode = new DefaultMutableTreeNode(tmpFolderNode);
  190. insNode.insert(tmpNode, insNode.getChildCount());
  191. treeNodes.put(partialPath, tmpNode);
  192. }
  193. insNode = tmpNode;
  194. }
  195. insNode.insert(fileTreeNode, insNode.getChildCount());
  196. treeNodes.put(fileNode.path, insNode);
  197. }
  198. }//}}}
  199. //{{{ getSearchMatcher() method
  200. public SearchMatcher getSearchMatcher()
  201. {
  202. return searchMatcher;
  203. }//}}}
  204. //{{{ getSearchString() method
  205. public String getSearchString()
  206. {
  207. return searchString;
  208. }//}}}
  209. }