| /******************************************************************************* |
| * Copyright (c) 2000, 2017 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 |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.ui.typehierarchy; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.dltk.core.IMethod; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.internal.ui.util.SelectionUtil; |
| import org.eclipse.dltk.ui.DLTKUIPlugin; |
| import org.eclipse.dltk.ui.ScriptElementLabels; |
| import org.eclipse.dltk.ui.actions.MemberFilterActionGroup; |
| import org.eclipse.dltk.ui.actions.OpenAction; |
| import org.eclipse.dltk.ui.viewsupport.ProblemTableViewer; |
| import org.eclipse.dltk.ui.viewsupport.StyledDecoratingModelLabelProvider; |
| import org.eclipse.jface.action.IMenuListener; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.action.Separator; |
| import org.eclipse.jface.action.ToolBarManager; |
| import org.eclipse.jface.preference.IPreferenceStore; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.ScrollBar; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkbenchPartSite; |
| |
| /** |
| * Method viewer shows a list of methods of a input type. Offers filter actions. |
| * No dependency to the type hierarchy view |
| */ |
| public class MethodsViewer extends ProblemTableViewer { |
| |
| private static final String TAG_SHOWINHERITED = "showinherited"; //$NON-NLS-1$ |
| private static final String TAG_SORTBYDEFININGTYPE = "sortbydefiningtype"; //$NON-NLS-1$ |
| private static final String TAG_VERTICAL_SCROLL = "mv_vertical_scroll"; //$NON-NLS-1$ |
| |
| private MethodsLabelProvider fLabelProvider; |
| |
| private MemberFilterActionGroup fMemberFilterActionGroup; |
| |
| private OpenAction fOpen; |
| private ShowInheritedMembersAction fShowInheritedMembersAction; |
| private SortByDefiningTypeAction fSortByDefiningTypeAction; |
| |
| public MethodsViewer(Composite parent, |
| final TypeHierarchyLifeCycle lifeCycle, IWorkbenchPart part, |
| IPreferenceStore store) { |
| super(new Table(parent, SWT.MULTI)); |
| |
| fLabelProvider = new MethodsLabelProvider(lifeCycle, this, store); |
| |
| setLabelProvider( |
| new StyledDecoratingModelLabelProvider(fLabelProvider, true)); |
| setContentProvider(new MethodsContentProvider(lifeCycle)); |
| |
| HierarchyViewerSorter sorter = new HierarchyViewerSorter(lifeCycle); |
| sorter.setSortByDefiningType(false); |
| setComparator(sorter); |
| |
| fOpen = new OpenAction(part.getSite()); |
| addOpenListener(event -> fOpen.run()); |
| |
| fMemberFilterActionGroup = new MemberFilterActionGroup(this, store); |
| |
| // fMemberFilterActionGroup.setActions(new MemberFilterAction[0]); |
| |
| /* |
| * fMemberFilterActionGroup= new MemberFilterActionGroup(this, |
| * "HierarchyMethodView", false, emberFilterActionGroup.ALL_FILTERS & |
| * ~MemberFilterActionGroup.FILTER_LOCALTYPES); //$NON-NLS-1$ |
| */ |
| |
| fShowInheritedMembersAction = new ShowInheritedMembersAction(this, |
| false); |
| fSortByDefiningTypeAction = new SortByDefiningTypeAction(this, false); |
| |
| showInheritedMethodsNoRedraw(false); |
| sortByDefiningTypeNoRedraw(false); |
| |
| // JavaUIHelp.setHelp(this, IJavaHelpContextIds.TYPE_HIERARCHY_VIEW); |
| } |
| |
| private void showInheritedMethodsNoRedraw(boolean on) { |
| MethodsContentProvider cprovider = (MethodsContentProvider) getContentProvider(); |
| cprovider.showInheritedMethods(on); |
| fShowInheritedMembersAction.setChecked(on); |
| if (on) { |
| fLabelProvider.setTextFlags(fLabelProvider.getTextFlags() |
| | ScriptElementLabels.ALL_POST_QUALIFIED); |
| } else { |
| fLabelProvider.setTextFlags(fLabelProvider.getTextFlags() |
| & ~ScriptElementLabels.ALL_POST_QUALIFIED); |
| } |
| if (on) { |
| sortByDefiningTypeNoRedraw(false); |
| } |
| fSortByDefiningTypeAction.setEnabled(!on); |
| |
| } |
| |
| /** |
| * Show inherited methods |
| */ |
| public void showInheritedMethods(boolean on) { |
| if (on == isShowInheritedMethods()) { |
| return; |
| } |
| try { |
| getTable().setRedraw(false); |
| showInheritedMethodsNoRedraw(on); |
| refresh(); |
| } finally { |
| getTable().setRedraw(true); |
| } |
| } |
| |
| private void sortByDefiningTypeNoRedraw(boolean on) { |
| fSortByDefiningTypeAction.setChecked(on); |
| fLabelProvider.setShowDefiningType(on); |
| ((HierarchyViewerSorter) getComparator()).setSortByDefiningType(on); |
| } |
| |
| /** |
| * Show the name of the defining type |
| */ |
| public void sortByDefiningType(boolean on) { |
| if (on == isShowDefiningTypes()) { |
| return; |
| } |
| try { |
| getTable().setRedraw(false); |
| sortByDefiningTypeNoRedraw(on); |
| refresh(); |
| } finally { |
| getTable().setRedraw(true); |
| } |
| } |
| |
| @Override |
| protected void inputChanged(Object input, Object oldInput) { |
| super.inputChanged(input, oldInput); |
| } |
| |
| /** |
| * Returns <code>true</code> if inherited methods are shown. |
| */ |
| public boolean isShowInheritedMethods() { |
| return ((MethodsContentProvider) getContentProvider()) |
| .isShowInheritedMethods(); |
| } |
| |
| /** |
| * Returns <code>true</code> if defining types are shown. |
| */ |
| public boolean isShowDefiningTypes() { |
| return fLabelProvider.isShowDefiningType(); |
| } |
| |
| /** |
| * Saves the state of the filter actions |
| */ |
| public void saveState(IMemento memento) { |
| fMemberFilterActionGroup.saveState(memento); |
| |
| memento.putString(TAG_SHOWINHERITED, |
| String.valueOf(isShowInheritedMethods())); |
| memento.putString(TAG_SORTBYDEFININGTYPE, |
| String.valueOf(isShowDefiningTypes())); |
| |
| ScrollBar bar = getTable().getVerticalBar(); |
| int position = bar != null ? bar.getSelection() : 0; |
| memento.putString(TAG_VERTICAL_SCROLL, String.valueOf(position)); |
| } |
| |
| /** |
| * Restores the state of the filter actions |
| */ |
| public void restoreState(IMemento memento) { |
| fMemberFilterActionGroup.restoreState(memento); |
| getControl().setRedraw(false); |
| refresh(); |
| getControl().setRedraw(true); |
| |
| boolean showInherited = Boolean |
| .valueOf(memento.getString(TAG_SHOWINHERITED)).booleanValue(); |
| showInheritedMethods(showInherited); |
| |
| boolean showDefiningTypes = Boolean |
| .valueOf(memento.getString(TAG_SORTBYDEFININGTYPE)) |
| .booleanValue(); |
| sortByDefiningType(showDefiningTypes); |
| |
| ScrollBar bar = getTable().getVerticalBar(); |
| if (bar != null) { |
| Integer vScroll = memento.getInteger(TAG_VERTICAL_SCROLL); |
| if (vScroll != null) { |
| bar.setSelection(vScroll.intValue()); |
| } |
| } |
| } |
| |
| /** |
| * Attaches a contextmenu listener to the table |
| */ |
| public void initContextMenu(IMenuListener menuListener, String popupId, |
| IWorkbenchPartSite viewSite) { |
| MenuManager menuMgr = new MenuManager(); |
| menuMgr.setRemoveAllWhenShown(true); |
| menuMgr.addMenuListener(menuListener); |
| Menu menu = menuMgr.createContextMenu(getTable()); |
| getTable().setMenu(menu); |
| viewSite.registerContextMenu(popupId, menuMgr, this); |
| } |
| |
| /** |
| * Fills up the context menu with items for the method viewer Should be |
| * called by the creator of the context menu |
| */ |
| public void contributeToContextMenu(IMenuManager menu) { |
| } |
| |
| /** |
| * Fills up the tool bar with items for the method viewer Should be called |
| * by the creator of the tool bar |
| */ |
| public void contributeToToolBar(ToolBarManager tbm) { |
| tbm.add(fShowInheritedMembersAction); |
| tbm.add(fSortByDefiningTypeAction); |
| tbm.add(new Separator()); |
| fMemberFilterActionGroup.contributeToToolBar(tbm); |
| } |
| |
| public void dispose() { |
| if (fMemberFilterActionGroup != null) { |
| fMemberFilterActionGroup.dispose(); |
| fMemberFilterActionGroup = null; |
| } |
| } |
| |
| @Override |
| protected void handleInvalidSelection(ISelection invalidSelection, |
| ISelection newSelection) { |
| // on change of input, try to keep selected methods stable by selecting |
| // a method with the same |
| // signature: See #5466 |
| List oldSelections = SelectionUtil.toList(invalidSelection); |
| List newSelections = SelectionUtil.toList(newSelection); |
| if (!oldSelections.isEmpty()) { |
| ArrayList newSelectionElements = new ArrayList(newSelections); |
| try { |
| Object[] currElements = getFilteredChildren(getInput()); |
| for (int i = 0; i < oldSelections.size(); i++) { |
| Object curr = oldSelections.get(i); |
| if (curr instanceof IMethod |
| && !newSelections.contains(curr)) { |
| IMethod method = (IMethod) curr; |
| if (method.exists()) { |
| IMethod similar = findSimilarMethod(method, |
| currElements); |
| if (similar != null) { |
| newSelectionElements.add(similar); |
| } |
| } |
| } |
| } |
| if (!newSelectionElements.isEmpty()) { |
| newSelection = new StructuredSelection( |
| newSelectionElements); |
| } else if (currElements.length > 0) { |
| newSelection = new StructuredSelection(currElements[0]); |
| } |
| } catch (ModelException e) { |
| DLTKUIPlugin.log(e); |
| } |
| } |
| setSelection(newSelection); |
| updateSelection(newSelection); |
| } |
| |
| private IMethod findSimilarMethod(IMethod meth, Object[] elements) |
| throws ModelException { |
| // String name= meth.getElementName(); |
| // String[] paramTypes= meth.getParameterTypes(); |
| // boolean isConstructor= meth.isConstructor(); |
| // |
| // for (int i= 0; i < elements.length; i++) { |
| // Object curr= elements[i]; |
| // if (curr instanceof IMethod && |
| // JavaModelUtil.isSameMethodSignature(name, paramTypes, isConstructor, |
| // (IMethod) curr)) { |
| // return (IMethod) curr; |
| // } |
| // } |
| return null; |
| } |
| |
| } |