Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

StructureViewManager.java 7.4KB

21 роки тому
21 роки тому
17 роки тому
21 роки тому
17 роки тому
17 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
21 роки тому
15 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
15 роки тому
21 роки тому
15 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
21 роки тому
15 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
21 роки тому
15 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
15 роки тому
21 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /* *******************************************************************
  2. * Copyright (c) 1999-2001 Xerox Corporation,
  3. * 2002 Palo Alto Research Center, Incorporated (PARC).
  4. * All rights reserved.
  5. * This program and the accompanying materials are made available
  6. * under the terms of the Eclipse Public License v 2.0
  7. * which accompanies this distribution and is available at
  8. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  9. *
  10. * Contributors:
  11. * Xerox/PARC initial implementation
  12. * Helen Hawkins Converted to new interface (bug 148190)
  13. * ******************************************************************/
  14. package org.aspectj.ajde.ui;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import org.aspectj.ajde.Ajde;
  18. import org.aspectj.ajde.ui.internal.NavigationHistoryModel;
  19. import org.aspectj.ajde.ui.internal.TreeStructureViewBuilder;
  20. import org.aspectj.asm.IHierarchy;
  21. import org.aspectj.asm.IHierarchyListener;
  22. import org.aspectj.asm.IProgramElement;
  23. import org.aspectj.asm.IRelationship;
  24. import org.aspectj.asm.internal.AspectJElementHierarchy;
  25. /**
  26. * @author Mik Kersten
  27. */
  28. public class StructureViewManager {
  29. private final TreeStructureViewBuilder treeViewBuilder;
  30. // private String buildConfigFilePath = null;
  31. private final NavigationHistoryModel historyModel = new NavigationHistoryModel();
  32. private final List structureViews = new ArrayList();
  33. private FileStructureView defaultFileView = null;
  34. private static final StructureViewProperties DEFAULT_VIEW_PROPERTIES;
  35. private static final List AVAILABLE_RELATIONS;
  36. public final IHierarchyListener VIEW_LISTENER = new IHierarchyListener() {
  37. public void elementsUpdated(IHierarchy model) {
  38. // updating structure views:
  39. for (Object structureView : structureViews) {
  40. treeViewBuilder.buildView((StructureView) structureView, (AspectJElementHierarchy) model);
  41. }
  42. }
  43. };
  44. /**
  45. * @param nodeFactory concrete factory for creating view nodes
  46. */
  47. public StructureViewManager(StructureViewNodeFactory nodeFactory) {
  48. treeViewBuilder = new TreeStructureViewBuilder(nodeFactory);
  49. Ajde.getDefault().getModel().addListener(VIEW_LISTENER);
  50. }
  51. public void fireNavigateBackAction(StructureView view) {
  52. IProgramElement backNode = historyModel.navigateBack();
  53. if (backNode == null) {
  54. Ajde.getDefault().getIdeUIAdapter().displayStatusInformation("No node to navigate back to in history");
  55. } else {
  56. navigationAction(backNode, false);
  57. }
  58. }
  59. public void fireNavigateForwardAction(StructureView view) {
  60. IProgramElement forwardNode = historyModel.navigateForward();
  61. if (forwardNode == null) {
  62. Ajde.getDefault().getIdeUIAdapter().displayStatusInformation("No node to navigate forward to in history");
  63. } else {
  64. navigationAction(forwardNode, false);
  65. }
  66. }
  67. /**
  68. * Only navigations of the default view are registered with the history.
  69. *
  70. * @param newFilePath the canonicalized path to the new file
  71. */
  72. public void fireNavigationAction(String newFilePath, int lineNumber) {
  73. IProgramElement currNode = Ajde.getDefault().getModel().getHierarchy().findElementForSourceLine(newFilePath, lineNumber);
  74. if (currNode != null) {
  75. navigationAction(currNode, true);
  76. }
  77. }
  78. public void fireNavigationAction(IProgramElement pe, boolean isLink) {
  79. navigationAction(pe, isLink);
  80. }
  81. /**
  82. * Highlights the given node in all structure views. If the node represents code and as such is below the granularity visible in
  83. * the view the parent is highlighted, along with the corresponding sourceline.
  84. */
  85. private void navigationAction(IProgramElement node, boolean recordHistory) {
  86. if (node == null)
  87. return;
  88. // navigating to node: " + node + ", recordHistory: " + recordHistory
  89. if (recordHistory)
  90. historyModel.navigateToNode(node);
  91. if (defaultFileView != null && node.getSourceLocation() != null) {
  92. String newFilePath = node.getSourceLocation().getSourceFile().getAbsolutePath();
  93. if (defaultFileView.getSourceFile() != null && !defaultFileView.getSourceFile().equals(newFilePath)) {
  94. defaultFileView.setSourceFile(newFilePath);
  95. treeViewBuilder.buildView(defaultFileView, Ajde.getDefault().getModel().getHierarchy());
  96. }
  97. }
  98. for (Object structureView : structureViews) {
  99. StructureView view = (StructureView) structureView;
  100. if (!(view instanceof GlobalStructureView) || !recordHistory || defaultFileView == null) {
  101. if (node.getKind().equals(IProgramElement.Kind.CODE)) {
  102. IProgramElement parentNode = node.getParent();
  103. if (parentNode != null) {
  104. IStructureViewNode currNode = view.findCorrespondingViewNode(parentNode);
  105. int lineOffset = node.getSourceLocation().getLine() - parentNode.getSourceLocation().getLine();
  106. if (currNode != null)
  107. view.setActiveNode(currNode, lineOffset);
  108. }
  109. } else {
  110. IStructureViewNode currNode = view.findCorrespondingViewNode(node);
  111. if (currNode != null)
  112. view.setActiveNode(currNode);
  113. }
  114. }
  115. }
  116. }
  117. public void refreshView(StructureView view) {
  118. IStructureViewNode activeNode = view.getActiveNode();
  119. treeViewBuilder.buildView(view, Ajde.getDefault().getModel().getHierarchy());
  120. view.setActiveNode(activeNode);
  121. }
  122. public StructureViewProperties getDefaultViewProperties() {
  123. return DEFAULT_VIEW_PROPERTIES;
  124. }
  125. /**
  126. * Returns the list of all available relations.
  127. */
  128. public List getAvailableRelations() {
  129. return AVAILABLE_RELATIONS;
  130. }
  131. /**
  132. * @param properties can not be null
  133. */
  134. public GlobalStructureView createGlobalView(GlobalViewProperties properties) {
  135. GlobalStructureView view = new GlobalStructureView(properties);
  136. structureViews.add(view);
  137. return view;
  138. }
  139. /**
  140. * @param sourceFilePath full path to corresponding source file
  141. * @param properties if null default properties will be used
  142. * @return always returns a view intance
  143. */
  144. public FileStructureView createViewForSourceFile(String sourceFilePath, StructureViewProperties properties) {
  145. // creating view for file:
  146. if (properties == null)
  147. properties = DEFAULT_VIEW_PROPERTIES;
  148. FileStructureView view = new FileStructureView(properties);
  149. view.setSourceFile(sourceFilePath);
  150. treeViewBuilder.buildView(view, Ajde.getDefault().getModel().getHierarchy());
  151. structureViews.add(view);
  152. return view;
  153. }
  154. /**
  155. * @return true if the view was found and removed, false otherwise
  156. */
  157. public boolean deleteView(StructureView view) {
  158. return structureViews.remove(view);
  159. }
  160. public void setDefaultFileView(FileStructureView defaultFileView) {
  161. this.defaultFileView = defaultFileView;
  162. }
  163. public FileStructureView getDefaultFileView() {
  164. return defaultFileView;
  165. }
  166. static {
  167. AVAILABLE_RELATIONS = new ArrayList();
  168. AVAILABLE_RELATIONS.add(IRelationship.Kind.ADVICE);
  169. AVAILABLE_RELATIONS.add(IRelationship.Kind.DECLARE);
  170. DEFAULT_VIEW_PROPERTIES = new StructureViewProperties();
  171. DEFAULT_VIEW_PROPERTIES.setRelations(AVAILABLE_RELATIONS);
  172. }
  173. }
  174. // this.multiFileViewMode = multiFileViewMode;
  175. // if (!multiFileViewMode) {
  176. // structureViews.add(DEFAULT_FILE_VIEW);
  177. // structureViews.add(DECLARATION_VIEW);
  178. // structureViews.add(CROSSCUTTING_VIEW);
  179. // structureViews.add(INHERITANCE_VIEW);
  180. // }
  181. // public GlobalStructureView getGlobalStructureView(StructureViewProperties.Hierarchy hierarchy) {
  182. // if (hierarchy == StructureViewProperties.Hierarchy.CROSSCUTTING) {
  183. // return CROSSCUTTING_VIEW;
  184. // } else if (hierarchy == StructureViewProperties.Hierarchy.INHERITANCE) {
  185. // return INHERITANCE_VIEW;
  186. // } else {
  187. // return DECLARATION_VIEW;
  188. // }
  189. // }
  190. // public FileStructureView getDefaultFileStructureView() {
  191. // return DEFAULT_FILE_VIEW;
  192. // }