KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > typehierarchy > HierarchyInformationControl


1 /*******************************************************************************
2  * Copyright (c) 2000, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.ui.typehierarchy;
12
13 import java.lang.reflect.InvocationTargetException JavaDoc;
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 /**
59  * Show hierarchy in light-weight control.
60  *
61  * @since 3.0
62  */

63 public class HierarchyInformationControl extends AbstractInformationControl {
64     
65     private TypeHierarchyLifeCycle fLifeCycle;
66     private HierarchyLabelProvider fLabelProvider;
67     private KeyAdapter fKeyAdapter;
68     
69     private Object JavaDoc[] fOtherExpandedElements;
70     private TypeHierarchyContentProvider fOtherContentProvider;
71     
72     private IMethod fFocus; // method to filter for or null if type hierarchy
73
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     /**
108      * {@inheritDoc}
109      */

110     protected boolean hasHeader() {
111         return true;
112     }
113
114     protected Text createFilterText(Composite parent) {
115         // text set later
116
Text text= super.createFilterText(parent);
117         text.addKeyListener(getKeyAdapter());
118         return text;
119     }
120         
121     
122     /* (non-Javadoc)
123      * @see org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl#createTreeViewer(org.eclipse.swt.widgets.Composite, int)
124      */

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 JavaDoc parentElement, Object JavaDoc 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 JavaDoc parentElement, Object JavaDoc 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                 // check visibility
172
IPackageFragment pack= (IPackageFragment) fFocus.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
173                 if (JavaModelUtil.isVisibleInHierarchy(method, pack)) {
174                     return true;
175                 }
176             }
177         } catch (JavaModelException e) {
178             // ignore
179
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     /**
204      * {@inheritDoc}
205      */

206     public void setInput(Object JavaDoc 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()); //$NON-NLS-1$
256
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 JavaDoc e1) {
266             input= null;
267         } catch (InterruptedException JavaDoc 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 JavaDoc[] 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 JavaDoc 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(); // refresh the view
301
} else {
302             selectFirstMatch();
303         }
304     }
305     
306     protected void toggleHierarchy() {
307         TreeViewer treeViewer= getTreeViewer();
308         
309         treeViewer.getTree().setRedraw(false);
310         
311         Object JavaDoc[] 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 JavaDoc getHeaderLabel(IJavaElement input) {
332         if (input instanceof IMethod) {
333             String JavaDoc[] 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 JavaDoc arg= JavaElementLabels.getElementLabel(input, JavaElementLabels.DEFAULT_QUALIFIED);
337             return Messages.format(TypeHierarchyMessages.HierarchyInformationControl_hierarchy_label, arg);
338         } else {
339             return ""; //$NON-NLS-1$
340
}
341     }
342     
343     protected String JavaDoc getStatusFieldText() {
344         KeySequence[] sequences= getInvokingCommandKeySequences();
345         String JavaDoc keyName= ""; //$NON-NLS-1$
346
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     /*
357      * @see org.eclipse.jdt.internal.ui.text.AbstractInformationControl#getId()
358      */

359     protected String JavaDoc getId() {
360         return "org.eclipse.jdt.internal.ui.typehierarchy.QuickHierarchy"; //$NON-NLS-1$
361
}
362
363     /**
364      * {@inheritDoc}
365      */

366     protected Object JavaDoc getSelectedElement() {
367         Object JavaDoc 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