/plugins/CtagsSideKick/tags/release-1_1/ctags/sidekick/ParsedData.java

# · Java · 181 lines · 154 code · 9 blank · 18 comment · 20 complexity · cd5968c6b6b6ec455c9b62c631556c2e MD5 · raw file

  1. /*
  2. Copyright (C) 2006 Shlomy Reinstein
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  14. */
  15. package ctags.sidekick;
  16. import java.util.Collections;
  17. import java.util.Comparator;
  18. import java.util.Enumeration;
  19. import java.util.Vector;
  20. import javax.swing.tree.DefaultMutableTreeNode;
  21. import org.gjt.sp.jedit.jEdit;
  22. import sidekick.SideKickParsedData;
  23. public class ParsedData extends SideKickParsedData
  24. {
  25. ITreeMapper mapper = null;
  26. Comparator<CtagsSideKickTreeNode> sorter = null;
  27. CtagsSideKickTreeNode tree = new CtagsSideKickTreeNode();
  28. public ParsedData(String fileName, String lang)
  29. {
  30. super(fileName);
  31. String mapperName = jEdit.getProperty(OptionPane.MAPPER);
  32. if (mapperName.equals(jEdit.getProperty(OptionPane.NAMESPACE_MAPPER_NAME)))
  33. mapper = new NamespaceTreeMapper();
  34. else if (mapperName.equals(jEdit.getProperty(OptionPane.FLAT_NAMESPACE_MAPPER_NAME)))
  35. mapper = new FlatNamespaceTreeMapper();
  36. else
  37. mapper = new KindTreeMapper();
  38. mapper.setLang(lang);
  39. if (jEdit.getBooleanProperty(OptionPane.SORT, false))
  40. {
  41. if (jEdit.getBooleanProperty(OptionPane.FOLDS_BEFORE_LEAFS, true))
  42. sorter = new FoldNameComparator();
  43. else
  44. sorter = new NameComparator();
  45. }
  46. else
  47. sorter = null;
  48. }
  49. void add(Tag tag)
  50. {
  51. if (mapper == null)
  52. {
  53. tree.add(tag);
  54. return;
  55. }
  56. Vector<Object> path = mapper.getPath(tag);
  57. CtagsSideKickTreeNode node = tree;
  58. for (int i = 0; i < path.size(); i++)
  59. {
  60. Object obj = path.get(i);
  61. CtagsSideKickTreeNode child =
  62. (CtagsSideKickTreeNode) node.findChild(obj);
  63. if (child == null)
  64. {
  65. child = node.add(obj);
  66. }
  67. else
  68. {
  69. // Let real tags take over String placeholders
  70. if ((child.getUserObject() instanceof String) &&
  71. (!(obj instanceof String)))
  72. {
  73. child.setUserObject(obj);
  74. }
  75. }
  76. node = child;
  77. }
  78. }
  79. public void done()
  80. {
  81. if (sorter != null)
  82. tree.sort(sorter);
  83. tree.addToTree(root);
  84. }
  85. private class CtagsSideKickTreeNode
  86. {
  87. private Vector<CtagsSideKickTreeNode> children =
  88. new Vector<CtagsSideKickTreeNode>();
  89. private Object object = null;
  90. void setUserObject(Object obj)
  91. {
  92. object = obj;
  93. }
  94. Object getUserObject()
  95. {
  96. return object;
  97. }
  98. CtagsSideKickTreeNode add(Object obj)
  99. {
  100. CtagsSideKickTreeNode node = new CtagsSideKickTreeNode();
  101. node.setUserObject(obj);
  102. children.add(node);
  103. return node;
  104. }
  105. boolean hasChildren()
  106. {
  107. return (children.size() > 0);
  108. }
  109. Object findChild(Object obj)
  110. {
  111. Enumeration children = this.children.elements();
  112. while (children.hasMoreElements())
  113. {
  114. CtagsSideKickTreeNode child =
  115. (CtagsSideKickTreeNode) children.nextElement();
  116. if (child.getUserObject().equals(obj))
  117. return child;
  118. }
  119. return null;
  120. }
  121. void addToTree(DefaultMutableTreeNode root)
  122. {
  123. root.setUserObject(getUserObject());
  124. addChildrenToTree(root);
  125. }
  126. void addChildrenToTree(DefaultMutableTreeNode node)
  127. {
  128. Enumeration children = this.children.elements();
  129. while (children.hasMoreElements())
  130. {
  131. CtagsSideKickTreeNode child =
  132. (CtagsSideKickTreeNode) children.nextElement();
  133. DefaultMutableTreeNode newNode =
  134. new DefaultMutableTreeNode(child.getUserObject());
  135. node.add(newNode);
  136. child.addChildrenToTree(newNode);
  137. }
  138. }
  139. void sort(Comparator<CtagsSideKickTreeNode> sorter)
  140. {
  141. Collections.sort(children, sorter);
  142. Enumeration children = this.children.elements();
  143. while (children.hasMoreElements())
  144. {
  145. CtagsSideKickTreeNode child =
  146. (CtagsSideKickTreeNode) children.nextElement();
  147. child.sort(sorter);
  148. }
  149. }
  150. }
  151. class NameComparator implements Comparator<CtagsSideKickTreeNode>
  152. {
  153. public int compare(CtagsSideKickTreeNode a, CtagsSideKickTreeNode b)
  154. {
  155. return a.getUserObject().toString().compareTo(b.getUserObject().toString());
  156. }
  157. }
  158. class FoldNameComparator implements Comparator<CtagsSideKickTreeNode>
  159. {
  160. public int compare(CtagsSideKickTreeNode a, CtagsSideKickTreeNode b)
  161. {
  162. if (a.hasChildren() == b.hasChildren())
  163. return a.getUserObject().toString().compareTo(b.getUserObject().toString());
  164. if (a.hasChildren())
  165. return (-1);
  166. return 1;
  167. }
  168. }
  169. }