]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / browsing / MembersView.java
diff --git a/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java b/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/browsing/MembersView.java
new file mode 100644 (file)
index 0000000..5f6d74f
--- /dev/null
@@ -0,0 +1,358 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.browsing;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.part.IShowInTargetList;
+
+import org.eclipse.jdt.core.IClassFile;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IImportContainer;
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+
+import org.eclipse.jdt.ui.JavaElementLabels;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jdt.ui.actions.MemberFilterActionGroup;
+
+import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
+import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.actions.CategoryFilterActionGroup;
+import org.eclipse.jdt.internal.ui.actions.LexicalSortingAction;
+import org.eclipse.jdt.internal.ui.preferences.MembersOrderPreferenceCache;
+import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
+import org.eclipse.jdt.internal.ui.viewsupport.JavaUILabelProvider;
+import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer;
+
+public class MembersView extends JavaBrowsingPart implements IPropertyChangeListener {
+
+       private MemberFilterActionGroup fMemberFilterActionGroup;
+       /**
+        * Category filter action group.
+        * @since 3.2
+        */
+       private CategoryFilterActionGroup fCategoryFilterActionGroup;
+
+
+       public MembersView() {
+               setHasWorkingSetFilter(false);
+               setHasCustomSetFilter(true);
+               JavaPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#getAdapter(java.lang.Class)
+        */
+       @Override
+       public Object getAdapter(Class key) {
+               if (key == IShowInTargetList.class) {
+                       return new IShowInTargetList() {
+                               public String[] getShowInTargetIds() {
+                                       return new String[] { JavaUI.ID_PACKAGES };
+                               }
+
+                       };
+               }
+               return super.getAdapter(key);
+       }
+
+       /**
+        * Creates and returns the label provider for this part.
+        *
+        * @return the label provider
+        * @see org.eclipse.jface.viewers.ILabelProvider
+        */
+       @Override
+       protected JavaUILabelProvider createLabelProvider() {
+               return new AppearanceAwareLabelProvider(
+                                               AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.F_APP_TYPE_SIGNATURE | JavaElementLabels.ALL_CATEGORY,
+                                               AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS
+                                               );
+       }
+
+       /**
+        * Returns the context ID for the Help system
+        *
+        * @return      the string used as ID for the Help context
+        */
+       @Override
+       protected String getHelpContextId() {
+               return IJavaHelpContextIds.MEMBERS_VIEW;
+       }
+
+       @Override
+       protected String getLinkToEditorKey() {
+               return PreferenceConstants.LINK_BROWSING_MEMBERS_TO_EDITOR;
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#createViewer(org.eclipse.swt.widgets.Composite)
+        */
+       @Override
+       protected StructuredViewer createViewer(Composite parent) {
+               ProblemTreeViewer viewer= new ProblemTreeViewer(parent, SWT.MULTI);
+               fMemberFilterActionGroup= new MemberFilterActionGroup(viewer, JavaUI.ID_MEMBERS_VIEW);
+               return viewer;
+       }
+
+       @Override
+       protected void fillToolBar(IToolBarManager tbm) {
+               tbm.add(new LexicalSortingAction(getViewer(), JavaUI.ID_MEMBERS_VIEW, getDropSupport()));
+               fMemberFilterActionGroup.contributeToToolBar(tbm);
+               super.fillToolBar(tbm);
+       }
+
+       /*
+        * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#fillActionBars(org.eclipse.ui.IActionBars)
+        * @since 3.2
+        */
+       @Override
+       protected void fillActionBars(IActionBars actionBars) {
+               super.fillActionBars(actionBars);
+               fCategoryFilterActionGroup= new CategoryFilterActionGroup(getViewer(), getViewSite().getId(), getCategoryFilterActionGroupInput());
+               fCategoryFilterActionGroup.contributeToViewMenu(actionBars.getMenuManager());
+       }
+
+       /*
+        * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#setInput(java.lang.Object)
+        * @since 3.2
+        */
+       @Override
+       protected void setInput(Object input) {
+               super.setInput(input);
+               if (fCategoryFilterActionGroup != null)
+                       fCategoryFilterActionGroup.setInput(getCategoryFilterActionGroupInput());
+       }
+
+       private IJavaElement[] getCategoryFilterActionGroupInput() {
+               Object input= getInput();
+               if (input instanceof IJavaElement)
+                       return new IJavaElement[] { (IJavaElement)input };
+               return new IJavaElement[0];
+       }
+
+       /**
+        * Answers if the given <code>element</code> is a valid
+        * input for this part.
+        *
+        * @param       element the object to test
+        * @return      <true> if the given element is a valid input
+        */
+       @Override
+       protected boolean isValidInput(Object element) {
+               if (element instanceof IType) {
+                       IType type= (IType)element;
+                       return type.isBinary() || type.getDeclaringType() == null;
+               }
+               return false;
+       }
+
+       /**
+        * Answers if the given <code>element</code> is a valid
+        * element for this part.
+        *
+        * @param       element the object to test
+        * @return      <true> if the given element is a valid element
+        */
+       @Override
+       protected boolean isValidElement(Object element) {
+               if (element instanceof IMember)
+                       return super.isValidElement(((IMember)element).getDeclaringType());
+               else if (element instanceof IImportDeclaration)
+                       return isValidElement(((IJavaElement)element).getParent());
+               else if (element instanceof IImportContainer) {
+                       Object input= getViewer().getInput();
+                       if (input instanceof IJavaElement) {
+                               ICompilationUnit cu= (ICompilationUnit)((IJavaElement)input).getAncestor(IJavaElement.COMPILATION_UNIT);
+                               if (cu != null) {
+                                       ICompilationUnit importContainerCu= (ICompilationUnit)((IJavaElement)element).getAncestor(IJavaElement.COMPILATION_UNIT);
+                                       return cu.equals(importContainerCu);
+                               } else {
+                                       IClassFile cf= (IClassFile)((IJavaElement)input).getAncestor(IJavaElement.CLASS_FILE);
+                                       IClassFile importContainerCf= (IClassFile)((IJavaElement)element).getAncestor(IJavaElement.CLASS_FILE);
+                                       return cf != null && cf.equals(importContainerCf);
+                               }
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Finds the element which has to be selected in this part.
+        *
+        * @param je    the Java element which has the focus
+        * @return the element to select
+        */
+       @Override
+       protected IJavaElement findElementToSelect(IJavaElement je) {
+               if (je == null)
+                       return null;
+
+               switch (je.getElementType()) {
+                       case IJavaElement.TYPE:
+                               if (((IType)je).getDeclaringType() == null)
+                                       return null;
+                               return je;
+                       case IJavaElement.METHOD:
+                       case IJavaElement.INITIALIZER:
+                       case IJavaElement.FIELD:
+                       case IJavaElement.PACKAGE_DECLARATION:
+                       case IJavaElement.IMPORT_CONTAINER:
+                               return je;
+                       case IJavaElement.IMPORT_DECLARATION:
+                               ICompilationUnit cu= (ICompilationUnit)je.getParent().getParent();
+                               try {
+                                       if (cu.getImports()[0].equals(je)) {
+                                               Object selectedElement= getSingleElementFromSelection(getViewer().getSelection());
+                                               if (selectedElement instanceof IImportContainer)
+                                                       return (IImportContainer)selectedElement;
+                                       }
+                               } catch (JavaModelException ex) {
+                                       // return je;
+                               }
+                               return je;
+               }
+               return null;
+       }
+
+       /**
+        * Finds the closest Java element which can be used as input for
+        * this part and has the given Java element as child.
+        *
+        * @param       je      the Java element for which to search the closest input
+        * @return      the closest Java element used as input for this part, or <code>null</code>
+        */
+       @Override
+       protected IJavaElement findInputForJavaElement(IJavaElement je) {
+               if (je == null || !je.exists() || (je.getJavaProject() != null && !je.getJavaProject().isOnClasspath(je)))
+                       return null;
+
+               switch (je.getElementType()) {
+                       case IJavaElement.TYPE:
+                               IType type= ((IType)je).getDeclaringType();
+                               if (type == null)
+                                       return je;
+                               else
+                                       return findInputForJavaElement(type);
+                       case IJavaElement.COMPILATION_UNIT:
+                               return getTypeForCU((ICompilationUnit)je);
+                       case IJavaElement.CLASS_FILE:
+                               return findInputForJavaElement(((IClassFile)je).getType());
+                       case IJavaElement.IMPORT_DECLARATION:
+                               return findInputForJavaElement(je.getParent());
+                       case IJavaElement.PACKAGE_DECLARATION:
+                       case IJavaElement.IMPORT_CONTAINER:
+                               IJavaElement parent= je.getParent();
+                               if (parent instanceof ICompilationUnit) {
+                                       return getTypeForCU((ICompilationUnit)parent);
+                               }
+                               else if (parent instanceof IClassFile)
+                                       return findInputForJavaElement(parent);
+                               return null;
+                       default:
+                               if (je instanceof IMember)
+                                       return findInputForJavaElement(((IMember)je).getDeclaringType());
+               }
+               return null;
+       }
+
+       /*
+        * Implements method from IViewPart.
+        */
+       @Override
+       public void saveState(IMemento memento) {
+               super.saveState(memento);
+               fMemberFilterActionGroup.saveState(memento);
+       }
+
+       @Override
+       protected void restoreState(IMemento memento) {
+               super.restoreState(memento);
+               fMemberFilterActionGroup.restoreState(memento);
+               getViewer().getControl().setRedraw(false);
+               getViewer().refresh();
+               getViewer().getControl().setRedraw(true);
+       }
+
+       @Override
+       protected void hookViewerListeners() {
+               super.hookViewerListeners();
+               getViewer().addDoubleClickListener(new IDoubleClickListener() {
+                       public void doubleClick(DoubleClickEvent event) {
+                               TreeViewer viewer= (TreeViewer)getViewer();
+                               Object element= ((IStructuredSelection)event.getSelection()).getFirstElement();
+                               if (viewer.isExpandable(element))
+                                       viewer.setExpandedState(element, !viewer.getExpandedState(element));
+                       }
+               });
+       }
+
+       boolean isInputAWorkingCopy() {
+               Object input= getViewer().getInput();
+               if (input instanceof IJavaElement) {
+                       ICompilationUnit cu= (ICompilationUnit)((IJavaElement)input).getAncestor(IJavaElement.COMPILATION_UNIT);
+                       if (cu != null)
+                               return cu.isWorkingCopy();
+               }
+               return false;
+       }
+
+       @Override
+       protected void restoreSelection() {
+               IEditorPart editor= getViewSite().getPage().getActiveEditor();
+               if (editor != null)
+                       setSelectionFromEditor(editor);
+       }
+
+       /* (non-Javadoc)
+        * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+        */
+       public void propertyChange(PropertyChangeEvent event) {
+               if (MembersOrderPreferenceCache.isMemberOrderProperty(event.getProperty())) {
+                       getViewer().refresh();
+               }
+       }
+
+       /*
+        * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#dispose()
+        */
+       @Override
+       public void dispose() {
+               if (fMemberFilterActionGroup != null) {
+                       fMemberFilterActionGroup.dispose();
+                       fMemberFilterActionGroup= null;
+               }
+               if (fCategoryFilterActionGroup != null) {
+                       fCategoryFilterActionGroup.dispose();
+                       fCategoryFilterActionGroup= null;
+               }
+               super.dispose();
+               JavaPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
+       }
+}