1 11 package org.eclipse.jdt.internal.ui.typehierarchy; 12 13 import java.lang.reflect.InvocationTargetException ; 14 15 import org.eclipse.swt.SWT; 16 import org.eclipse.swt.events.KeyAdapter; 17 import org.eclipse.swt.events.KeyEvent; 18 import org.eclipse.swt.layout.GridData; 19 import org.eclipse.swt.widgets.Composite; 20 import org.eclipse.swt.widgets.Shell; 21 import org.eclipse.swt.widgets.Text; 22 import org.eclipse.swt.widgets.Tree; 23 24 import org.eclipse.jface.viewers.AbstractTreeViewer; 25 import org.eclipse.jface.viewers.TreeViewer; 26 import org.eclipse.jface.viewers.Viewer; 27 import org.eclipse.jface.viewers.ViewerFilter; 28 29 import org.eclipse.ui.keys.KeySequence; 30 import org.eclipse.ui.keys.SWTKeySupport; 31 32 import org.eclipse.jdt.core.IClassFile; 33 import org.eclipse.jdt.core.ICompilationUnit; 34 import org.eclipse.jdt.core.IImportDeclaration; 35 import org.eclipse.jdt.core.IJavaElement; 36 import org.eclipse.jdt.core.IMember; 37 import org.eclipse.jdt.core.IMethod; 38 import org.eclipse.jdt.core.IPackageFragment; 39 import org.eclipse.jdt.core.IType; 40 import org.eclipse.jdt.core.ITypeHierarchy; 41 import org.eclipse.jdt.core.JavaModelException; 42 import org.eclipse.jdt.core.Signature; 43 44 import org.eclipse.jdt.internal.corext.util.JavaModelUtil; 45 import org.eclipse.jdt.internal.corext.util.Messages; 46 import org.eclipse.jdt.internal.corext.util.MethodOverrideTester; 47 48 import org.eclipse.jdt.ui.JavaElementLabels; 49 import org.eclipse.jdt.ui.ProblemsLabelDecorator; 50 import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds; 51 52 import org.eclipse.jdt.internal.ui.JavaPlugin; 53 import org.eclipse.jdt.internal.ui.text.AbstractInformationControl; 54 import org.eclipse.jdt.internal.ui.typehierarchy.SuperTypeHierarchyViewer.SuperTypeHierarchyContentProvider; 55 import org.eclipse.jdt.internal.ui.typehierarchy.TraditionalHierarchyViewer.TraditionalHierarchyContentProvider; 56 import org.eclipse.jdt.internal.ui.viewsupport.ColoredViewersManager; 57 58 63 public class HierarchyInformationControl extends AbstractInformationControl { 64 65 private TypeHierarchyLifeCycle fLifeCycle; 66 private HierarchyLabelProvider fLabelProvider; 67 private KeyAdapter fKeyAdapter; 68 69 private Object [] fOtherExpandedElements; 70 private TypeHierarchyContentProvider fOtherContentProvider; 71 72 private IMethod fFocus; private boolean fDoFilter; 74 75 private MethodOverrideTester fMethodOverrideTester; 76 77 public HierarchyInformationControl(Shell parent, int shellStyle, int treeStyle) { 78 super(parent, shellStyle, treeStyle, IJavaEditorActionDefinitionIds.OPEN_HIERARCHY, true); 79 fOtherExpandedElements= null; 80 fDoFilter= true; 81 fMethodOverrideTester= null; 82 } 83 84 private KeyAdapter getKeyAdapter() { 85 if (fKeyAdapter == null) { 86 fKeyAdapter= new KeyAdapter() { 87 public void keyPressed(KeyEvent e) { 88 int accelerator = SWTKeySupport.convertEventToUnmodifiedAccelerator(e); 89 KeySequence keySequence = KeySequence.getInstance(SWTKeySupport.convertAcceleratorToKeyStroke(accelerator)); 90 KeySequence[] sequences= getInvokingCommandKeySequences(); 91 if (sequences == null) 92 return; 93 94 for (int i= 0; i < sequences.length; i++) { 95 if (sequences[i].equals(keySequence)) { 96 e.doit= false; 97 toggleHierarchy(); 98 return; 99 } 100 } 101 } 102 }; 103 } 104 return fKeyAdapter; 105 } 106 107 110 protected boolean hasHeader() { 111 return true; 112 } 113 114 protected Text createFilterText(Composite parent) { 115 Text text= super.createFilterText(parent); 117 text.addKeyListener(getKeyAdapter()); 118 return text; 119 } 120 121 122 125 protected TreeViewer createTreeViewer(Composite parent, int style) { 126 Tree tree= new Tree(parent, SWT.SINGLE | (style & ~SWT.MULTI)); 127 GridData gd= new GridData(GridData.FILL_BOTH); 128 gd.heightHint= tree.getItemHeight() * 12; 129 tree.setLayoutData(gd); 130 131 TreeViewer treeViewer= new TreeViewer(tree); 132 ColoredViewersManager.install(treeViewer); 133 treeViewer.addFilter(new ViewerFilter() { 134 public boolean select(Viewer viewer, Object parentElement, Object element) { 135 return element instanceof IType; 136 } 137 }); 138 139 fLifeCycle= new TypeHierarchyLifeCycle(false); 140 141 treeViewer.setComparator(new HierarchyViewerSorter(fLifeCycle)); 142 treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS); 143 144 fLabelProvider= new HierarchyLabelProvider(fLifeCycle); 145 fLabelProvider.setFilter(new ViewerFilter() { 146 public boolean select(Viewer viewer, Object parentElement, Object element) { 147 return hasFocusMethod((IType) element); 148 } 149 }); 150 151 fLabelProvider.setTextFlags(JavaElementLabels.ALL_DEFAULT | JavaElementLabels.T_POST_QUALIFIED); 152 fLabelProvider.addLabelDecorator(new ProblemsLabelDecorator(null)); 153 treeViewer.setLabelProvider(fLabelProvider); 154 155 treeViewer.getTree().addKeyListener(getKeyAdapter()); 156 157 return treeViewer; 158 } 159 160 protected boolean hasFocusMethod(IType type) { 161 if (fFocus == null) { 162 return true; 163 } 164 if (type.equals(fFocus.getDeclaringType())) { 165 return true; 166 } 167 168 try { 169 IMethod method= findMethod(fFocus, type); 170 if (method != null) { 171 IPackageFragment pack= (IPackageFragment) fFocus.getAncestor(IJavaElement.PACKAGE_FRAGMENT); 173 if (JavaModelUtil.isVisibleInHierarchy(method, pack)) { 174 return true; 175 } 176 } 177 } catch (JavaModelException e) { 178 JavaPlugin.log(e); 180 } 181 return false; 182 183 } 184 185 private IMethod findMethod(IMethod filterMethod, IType typeToFindIn) throws JavaModelException { 186 IType filterType= filterMethod.getDeclaringType(); 187 ITypeHierarchy hierarchy= fLifeCycle.getHierarchy(); 188 189 boolean filterOverrides= JavaModelUtil.isSuperType(hierarchy, typeToFindIn, filterType); 190 IType focusType= filterOverrides ? filterType : typeToFindIn; 191 192 if (fMethodOverrideTester == null || !fMethodOverrideTester.getFocusType().equals(focusType)) { 193 fMethodOverrideTester= new MethodOverrideTester(focusType, hierarchy); 194 } 195 196 if (filterOverrides) { 197 return fMethodOverrideTester.findOverriddenMethodInType(typeToFindIn, filterMethod); 198 } else { 199 return fMethodOverrideTester.findOverridingMethodInType(typeToFindIn, filterMethod); 200 } 201 } 202 203 206 public void setInput(Object information) { 207 if (!(information instanceof IJavaElement)) { 208 inputChanged(null, null); 209 return; 210 } 211 IJavaElement input= null; 212 IMethod locked= null; 213 try { 214 IJavaElement elem= (IJavaElement) information; 215 if (elem.getElementType() == IJavaElement.LOCAL_VARIABLE) { 216 elem= elem.getParent(); 217 } 218 219 switch (elem.getElementType()) { 220 case IJavaElement.JAVA_PROJECT : 221 case IJavaElement.PACKAGE_FRAGMENT_ROOT : 222 case IJavaElement.PACKAGE_FRAGMENT : 223 case IJavaElement.TYPE : 224 input= elem; 225 break; 226 case IJavaElement.COMPILATION_UNIT : 227 input= ((ICompilationUnit) elem).findPrimaryType(); 228 break; 229 case IJavaElement.CLASS_FILE : 230 input= ((IClassFile) elem).getType(); 231 break; 232 case IJavaElement.METHOD : 233 IMethod method= (IMethod) elem; 234 if (!method.isConstructor()) { 235 locked= method; 236 } 237 input= method.getDeclaringType(); 238 break; 239 case IJavaElement.FIELD : 240 case IJavaElement.INITIALIZER : 241 input= ((IMember) elem).getDeclaringType(); 242 break; 243 case IJavaElement.PACKAGE_DECLARATION : 244 input= elem.getParent().getParent(); 245 break; 246 case IJavaElement.IMPORT_DECLARATION : 247 IImportDeclaration decl= (IImportDeclaration) elem; 248 if (decl.isOnDemand()) { 249 input= JavaModelUtil.findTypeContainer(decl.getJavaProject(), Signature.getQualifier(decl.getElementName())); 250 } else { 251 input= decl.getJavaProject().findType(decl.getElementName()); 252 } 253 break; 254 default : 255 JavaPlugin.logErrorMessage("Element unsupported by the hierarchy: " + elem.getClass()); input= null; 257 } 258 } catch (JavaModelException e) { 259 JavaPlugin.log(e); 260 } 261 262 super.setTitleText(getHeaderLabel(locked == null ? input : locked)); 263 try { 264 fLifeCycle.ensureRefreshedTypeHierarchy(input, JavaPlugin.getActiveWorkbenchWindow()); 265 } catch (InvocationTargetException e1) { 266 input= null; 267 } catch (InterruptedException e1) { 268 dispose(); 269 return; 270 } 271 IMember[] memberFilter= locked != null ? new IMember[] { locked } : null; 272 273 TraditionalHierarchyContentProvider contentProvider= new TraditionalHierarchyContentProvider(fLifeCycle); 274 contentProvider.setMemberFilter(memberFilter); 275 getTreeViewer().setContentProvider(contentProvider); 276 277 fOtherContentProvider= new SuperTypeHierarchyContentProvider(fLifeCycle); 278 fOtherContentProvider.setMemberFilter(memberFilter); 279 280 fFocus= locked; 281 282 Object [] topLevelObjects= contentProvider.getElements(fLifeCycle); 283 if (topLevelObjects.length > 0 && contentProvider.getChildren(topLevelObjects[0]).length > 40) { 284 fDoFilter= false; 285 } else { 286 getTreeViewer().addFilter(new NamePatternFilter()); 287 } 288 289 Object selection= null; 290 if (input instanceof IMember) { 291 selection= input; 292 } else if (topLevelObjects.length > 0) { 293 selection= topLevelObjects[0]; 294 } 295 inputChanged(fLifeCycle, selection); 296 } 297 298 protected void stringMatcherUpdated() { 299 if (fDoFilter) { 300 super.stringMatcherUpdated(); } else { 302 selectFirstMatch(); 303 } 304 } 305 306 protected void toggleHierarchy() { 307 TreeViewer treeViewer= getTreeViewer(); 308 309 treeViewer.getTree().setRedraw(false); 310 311 Object [] expandedElements= treeViewer.getExpandedElements(); 312 TypeHierarchyContentProvider contentProvider= (TypeHierarchyContentProvider) treeViewer.getContentProvider(); 313 treeViewer.setContentProvider(fOtherContentProvider); 314 315 treeViewer.refresh(); 316 if (fOtherExpandedElements != null) { 317 treeViewer.setExpandedElements(fOtherExpandedElements); 318 } else { 319 treeViewer.expandAll(); 320 } 321 322 treeViewer.getTree().setRedraw(true); 323 324 fOtherContentProvider= contentProvider; 325 fOtherExpandedElements= expandedElements; 326 327 updateStatusFieldText(); 328 } 329 330 331 private String getHeaderLabel(IJavaElement input) { 332 if (input instanceof IMethod) { 333 String [] args= { input.getParent().getElementName(), JavaElementLabels.getElementLabel(input, JavaElementLabels.ALL_DEFAULT) }; 334 return Messages.format(TypeHierarchyMessages.HierarchyInformationControl_methodhierarchy_label, args); 335 } else if (input != null) { 336 String arg= JavaElementLabels.getElementLabel(input, JavaElementLabels.DEFAULT_QUALIFIED); 337 return Messages.format(TypeHierarchyMessages.HierarchyInformationControl_hierarchy_label, arg); 338 } else { 339 return ""; } 341 } 342 343 protected String getStatusFieldText() { 344 KeySequence[] sequences= getInvokingCommandKeySequences(); 345 String keyName= ""; if (sequences != null && sequences.length > 0) 347 keyName= sequences[0].format(); 348 349 if (fOtherContentProvider instanceof TraditionalHierarchyContentProvider) { 350 return Messages.format(TypeHierarchyMessages.HierarchyInformationControl_toggle_traditionalhierarchy_label, keyName); 351 } else { 352 return Messages.format(TypeHierarchyMessages.HierarchyInformationControl_toggle_superhierarchy_label, keyName); 353 } 354 } 355 356 359 protected String getId() { 360 return "org.eclipse.jdt.internal.ui.typehierarchy.QuickHierarchy"; } 362 363 366 protected Object getSelectedElement() { 367 Object selectedElement= super.getSelectedElement(); 368 if (selectedElement instanceof IType && fFocus != null) { 369 IType type= (IType) selectedElement; 370 try { 371 return findMethod(fFocus, type); 372 } catch (JavaModelException e) { 373 JavaPlugin.log(e); 374 } 375 } 376 return selectedElement; 377 } 378 } 379 | Popular Tags |