/* * Contributions to FindBugs * Copyright (C) 2007, Andrei Loskutov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package de.tobject.findbugs.view; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.progress.IWorkbenchSiteProgressService; import de.tobject.findbugs.FindbugsPlugin; /** * @author Andrei Loskutov */ public abstract class AbstractFindbugsView extends ViewPart implements IMarkerSelectionHandler { static final String DETAILS_VIEW_IMG = "detailsView.png"; static final String USER_ANNOTATIONS_VIEW_IMG = "annotationsView.png"; static final String TREE_VIEW_IMG = "treeView.png"; static final String PERSPECTIVE_IMG = "buggy-tiny.png"; private Composite root; private Action actionShowDetailsView; private Action actionShowBugTreeView; private Action actionShowAnnotationsView; private Action actionShowPerspective; public AbstractFindbugsView() { super(); } /** * activates view if it is not visible */ final protected void activate() { if (!isVisible()) { getSite().getPage().activate(this); } } final public boolean isVisible() { return getSite().getPage().isPartVisible(this); } @Override public void setFocus() { getRootControl().setFocus(); } /* * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose() { getRootControl().dispose(); super.dispose(); } /* * (non-Javadoc) * * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public final void createPartControl(Composite parent) { root = createRootControl(parent); makeActions(); hookContextMenu(); hookDoubleClickAction(); contributeToActionBars(); } final public Composite getRootControl() { return root; } /** * @param parent * @return */ abstract protected Composite createRootControl(Composite parent); private void hookContextMenu() { MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(getRootControl()); getRootControl().setMenu(menu); // TODO // getSite().registerContextMenu(menuMgr, viewer); } private void contributeToActionBars() { IActionBars bars = getViewSite().getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } protected void makeActions() { actionShowAnnotationsView = new Action() { @Override public void run() { showUserAnnotationView(); } }; configureAction(actionShowAnnotationsView, "Show Bug Annotations View", "Show Annotations View", USER_ANNOTATIONS_VIEW_IMG); actionShowBugTreeView = new Action() { @Override public void run() { showBugTreeView(); } }; configureAction(actionShowBugTreeView, "Show Bug Tree View", "Show BugTree View", TREE_VIEW_IMG); actionShowDetailsView = new Action() { @Override public void run() { showDetailsView(); } }; configureAction(actionShowDetailsView, "Show Bug Details View", "Show Bug Details View", DETAILS_VIEW_IMG); actionShowPerspective = new Action() { @Override public void run() { showPerspective(); } }; configureAction(actionShowPerspective, "Switch to FindBugs Perspective", "Switch to FindBugs Perspective", PERSPECTIVE_IMG); } protected void fillLocalPullDown(IMenuManager manager) { manager.add(actionShowPerspective); manager.add(new Separator()); if(!(this instanceof UserAnnotationsView)) { manager.add(actionShowAnnotationsView); } manager.add(actionShowBugTreeView); } protected void fillContextMenu(IMenuManager manager) { // Other plug-ins can contribute there actions here manager.add(new Separator("additions")); //$NON-NLS-1$ } protected void fillLocalToolBar(IToolBarManager manager) { manager.add(actionShowPerspective); manager.add(new Separator()); if(!(this instanceof UserAnnotationsView)) { manager.add(actionShowAnnotationsView); } manager.add(actionShowBugTreeView); } protected void hookDoubleClickAction() { // TODO should refactor dirty code in views to common } protected final void configureAction(Action action, String textKey, String tooltipKey, String imageKey) { action.setText(FindbugsPlugin.getResourceString(textKey)); action.setToolTipText(FindbugsPlugin.getResourceString(tooltipKey)); action.setImageDescriptor(FindbugsPlugin.getDefault() .getImageDescriptor(imageKey)); } /** * Get the IWorkbenchSiteProgressService for the receiver. * * @return IWorkbenchSiteProgressService or <code>null</code>. */ protected IWorkbenchSiteProgressService getProgressService() { IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) getSite() .getAdapter(IWorkbenchSiteProgressService.class); return service; } /** * @return instance of annotations view or null if view couldn't be opened */ static IViewPart showUserAnnotationView() { IWorkbenchPage page = FindbugsPlugin.getActiveWorkbenchWindow().getActivePage(); try { return page.showView(FindbugsPlugin.USER_ANNOTATIONS_VIEW_ID); } catch (PartInitException e) { FindbugsPlugin.getDefault().logException(e, "Could not show bug annotations view"); } return null; } /** * @return instance of annotations view or null if view couldn't be opened */ static IViewPart showDetailsView() { IWorkbenchPage page = FindbugsPlugin.getActiveWorkbenchWindow().getActivePage(); try { return page.showView(FindbugsPlugin.DETAILS_VIEW_ID); } catch (PartInitException e) { FindbugsPlugin.getDefault().logException(e, "Could not show bug details view"); } return null; } /** * @return instance of annotations view or null if view couldn't be opened */ static IViewPart showBugTreeView() { IWorkbenchPage page = FindbugsPlugin.getActiveWorkbenchWindow().getActivePage(); try { return page.showView(FindbugsPlugin.TREE_VIEW_ID); } catch (PartInitException e) { FindbugsPlugin.getDefault().logException(e, "Could not show bug tree view"); } return null; } /** * */ final void showPerspective() { IWorkbenchPage page = getSite().getPage(); IWorkbenchWindow window = getSite().getWorkbenchWindow(); IAdaptable input; if (page != null) { input = page.getInput(); } else { input= ResourcesPlugin.getWorkspace().getRoot(); } try { PlatformUI.getWorkbench().showPerspective(FindBugsPerspectiveFactory.ID, window, input); } catch (WorkbenchException e) { FindbugsPlugin.getDefault().logException(e, "Failed to open FindBugs Perspective"); } } }