1 2 25 26 package org.aspectj.ajde.ui; 27 28 import java.util.*; 29 import org.aspectj.ajde.*; 30 import org.aspectj.ajde.ui.internal.*; 31 import org.aspectj.asm.*; 32 import org.aspectj.asm.associations.*; 33 34 37 public class StructureViewManager { 38 39 private TreeStructureViewBuilder treeViewBuilder; 40 private String buildConfigFilePath = null; 41 42 private NavigationHistoryModel historyModel = new NavigationHistoryModel(); 43 private ArrayList structureViews = new ArrayList(); 44 private FileStructureView defaultFileView = null; 45 46 private static final StructureViewProperties DEFAULT_VIEW_PROPERTIES; 47 private static final List AVAILABLE_RELATIONS; 48 49 public final StructureModelListener VIEW_LISTENER = new StructureModelListener() { 50 public void modelUpdated(StructureModel model) { 51 Ajde.getDefault().logEvent("updating structure views: " + structureViews); 52 53 if (defaultFileView != null) { 54 defaultFileView.setSourceFile(Ajde.getDefault().getEditorManager().getCurrFile()); 55 } 56 57 for (Iterator it = structureViews.iterator(); it.hasNext(); ) { 58 treeViewBuilder.buildView((StructureView)it.next(), (StructureModel)model); 59 } 60 } 61 }; 62 63 66 public StructureViewManager(StructureViewNodeFactory nodeFactory) { 67 treeViewBuilder = new TreeStructureViewBuilder(nodeFactory); 68 69 StructureModelManager.INSTANCE.addListener(VIEW_LISTENER); 70 } 71 72 public void fireNavigateBackAction(StructureView view) { 73 ProgramElementNode backNode = historyModel.navigateBack(); 74 75 if (backNode == null) { 76 Ajde.getDefault().getIdeUIAdapter().displayStatusInformation("No node to navigate back to in history"); 77 } else { 78 navigationAction(backNode, false); 79 } 80 } 81 82 public void fireNavigateForwardAction(StructureView view) { 83 ProgramElementNode forwardNode = historyModel.navigateForward(); 84 85 if (forwardNode == null) { 86 Ajde.getDefault().getIdeUIAdapter().displayStatusInformation("No node to navigate forward to in history"); 87 } else { 88 navigationAction(forwardNode, false); 89 } 90 } 91 92 96 public void fireNavigationAction(String newFilePath, int lineNumber) { 97 StructureNode currNode = Ajde.getDefault().getStructureModelManager().getStructureModel().findNodeForSourceLine( 98 newFilePath, 99 lineNumber); 100 101 if (currNode instanceof ProgramElementNode) { 102 navigationAction((ProgramElementNode)currNode, true); 103 } 104 } 105 106 109 public void fireNavigationAction(StructureNode structureNode) { 110 ProgramElementNode node = null; 111 boolean recordHistory = false; 112 if (structureNode instanceof LinkNode) { 113 node = ((LinkNode)structureNode).getProgramElementNode(); 114 recordHistory = true; 115 } else if (structureNode instanceof ProgramElementNode) { 116 node = (ProgramElementNode)structureNode; 117 } 118 if (node != null) navigationAction(node, recordHistory); 119 } 120 121 126 private void navigationAction(ProgramElementNode node, boolean recordHistory) { 127 if (node == null 128 || node == Ajde.getDefault().getStructureModelManager().getStructureModel().NO_STRUCTURE 129 || node.getSourceLocation().getSourceFilePath() == null) { 130 Ajde.getDefault().getIdeUIAdapter().displayStatusInformation("Source not available for node: " + node.getName()); 131 return; 132 } 133 Ajde.getDefault().logEvent("navigating to node: " + node + ", recordHistory: " + recordHistory); 134 if (recordHistory) historyModel.navigateToNode(node); 135 if (defaultFileView != null && node.getSourceLocation() != null) { 136 String newFilePath = node.getSourceLocation().getSourceFilePath(); 137 if (defaultFileView.getSourceFile() != null 138 && !defaultFileView.getSourceFile().equals(newFilePath)) { 139 defaultFileView.setSourceFile(newFilePath); 140 treeViewBuilder.buildView(defaultFileView, StructureModelManager.INSTANCE.getStructureModel()); 141 } 142 } 143 144 for (Iterator it = structureViews.iterator(); it.hasNext(); ) { 145 StructureView view = (StructureView)it.next(); 146 if (!(view instanceof GlobalStructureView) || !recordHistory || defaultFileView == null) { 147 if (node.getProgramElementKind().equals(ProgramElementNode.Kind.CODE)) { 148 ProgramElementNode parentNode = (ProgramElementNode)node.getParent(); 149 if (parentNode != null) { 150 StructureViewNode currNode = view.findCorrespondingViewNode(parentNode); 151 int lineOffset = node.getSourceLocation().getLineNumber() - parentNode.getSourceLocation().getLineNumber(); 152 if (currNode != null) view.setActiveNode(currNode, lineOffset); 153 } 154 } else { 155 StructureViewNode currNode = view.findCorrespondingViewNode(node); 156 if (currNode != null) view.setActiveNode(currNode); 157 } 158 } 159 } 160 } 161 162 private ProgramElementNode getProgramElementNode(StructureViewNode node) { 163 if (node.getStructureNode() instanceof ProgramElementNode) { 164 return (ProgramElementNode)node.getStructureNode(); 165 } else if (node.getStructureNode() instanceof LinkNode) { 166 return ((LinkNode)node.getStructureNode()).getProgramElementNode(); 167 } else { 168 return null; 169 } 170 } 171 172 public void refreshView(StructureView view) { 173 StructureViewNode activeNode = view.getActiveNode(); 174 treeViewBuilder.buildView(view, Ajde.getDefault().getStructureModelManager().getStructureModel()); 175 view.setActiveNode(activeNode); 176 } 177 178 public StructureViewProperties getDefaultViewProperties() { 179 return DEFAULT_VIEW_PROPERTIES; 180 } 181 182 185 public List getAvailableRelations() { 186 return AVAILABLE_RELATIONS; 187 } 188 189 192 public GlobalStructureView createGlobalView(GlobalViewProperties properties) { 193 GlobalStructureView view = new GlobalStructureView(properties); 194 structureViews.add(view); 195 return view; 196 } 197 198 203 public FileStructureView createViewForSourceFile(String sourceFilePath, StructureViewProperties properties) { 204 Ajde.getDefault().logEvent("creating view for file: " + sourceFilePath); 205 if (properties == null) properties = DEFAULT_VIEW_PROPERTIES; 206 FileStructureView view = new FileStructureView(properties); 207 view.setSourceFile(sourceFilePath); 208 treeViewBuilder.buildView(view, StructureModelManager.INSTANCE.getStructureModel()); 209 structureViews.add(view); 210 return view; 211 } 212 213 216 public boolean deleteView(StructureView view) { 217 return structureViews.remove(view); 218 } 219 220 public void setDefaultFileView(FileStructureView defaultFileView) { 221 this.defaultFileView = defaultFileView; 222 } 223 224 static { 225 AVAILABLE_RELATIONS = new ArrayList(); 226 AVAILABLE_RELATIONS.add(Advice.METHOD_CALL_SITE_RELATION); 227 AVAILABLE_RELATIONS.add(Advice.METHOD_RELATION); 228 AVAILABLE_RELATIONS.add(Advice.CONSTRUCTOR_CALL_SITE_RELATION); 229 AVAILABLE_RELATIONS.add(Advice.CONSTRUCTOR_RELATION); 230 AVAILABLE_RELATIONS.add(Advice.FIELD_ACCESS_RELATION); 231 AVAILABLE_RELATIONS.add(Advice.INITIALIZER_RELATION); 232 AVAILABLE_RELATIONS.add(Advice.HANDLER_RELATION); 233 AVAILABLE_RELATIONS.add(Advice.INTRODUCTION_RELATION); 234 AVAILABLE_RELATIONS.add(Introduction.INTRODUCES_RELATION); 235 AVAILABLE_RELATIONS.add(Inheritance.IMPLEMENTS_RELATION); 236 AVAILABLE_RELATIONS.add(Inheritance.INHERITS_RELATION); 237 AVAILABLE_RELATIONS.add(Inheritance.INHERITS_MEMBERS_RELATION); 238 AVAILABLE_RELATIONS.add(Reference.USES_POINTCUT_RELATION); 239 AVAILABLE_RELATIONS.add(Reference.IMPORTS_RELATION); 240 241 DEFAULT_VIEW_PROPERTIES = new StructureViewProperties(); 242 DEFAULT_VIEW_PROPERTIES.setRelations(AVAILABLE_RELATIONS); 243 } 244 } 245 246 254 264 268 269 | Popular Tags |