Package de.tobject.findbugs.view.explorer

Source Code of de.tobject.findbugs.view.explorer.BugActionProvider

/*
* Contributions to FindBugs
* Copyright (C) 2008, 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.explorer;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionConstants;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonMenuConstants;
import org.eclipse.ui.texteditor.ITextEditor;

import de.tobject.findbugs.FindbugsPlugin;
import de.tobject.findbugs.reporter.MarkerUtil;
import de.tobject.findbugs.util.EditorUtil;

public class BugActionProvider extends CommonActionProvider {

    private WorkingSetFilterActionGroup workingSetActionGroup;

    private IPropertyChangeListener filterChangeListener;

    boolean hasContributedToViewMenu;

    private MyAction doubleClickAction;

    private ICommonActionExtensionSite site;

    private boolean initDone;

    public BugActionProvider() {
        super();
    }

    static class MyAction extends Action implements ISelectionChangedListener {
        private IMarker marker;

        private IFile file;

        private IJavaElement javaElement;

        @Override
        public void run() {
            if (marker == null && file == null && javaElement == null) {
                return;
            }
            try {
                if (javaElement != null) {
                    IEditorPart editor = JavaUI.openInEditor(javaElement, true, true);

                    // if we have both java element AND line info, go to the
                    // line
                    if (editor instanceof ITextEditor && marker != null) {
                        EditorUtil.goToLine(editor, marker.getAttribute(IMarker.LINE_NUMBER, EditorUtil.DEFAULT_LINE_IN_EDITOR));
                    }
                } else if (marker != null) {
                    IDE.openEditor(FindbugsPlugin.getActiveWorkbenchWindow().getActivePage(), marker, true);
                } else {
                    IDE.openEditor(FindbugsPlugin.getActiveWorkbenchWindow().getActivePage(), file, true);
                }
            } catch (PartInitException e) {
                FindbugsPlugin.getDefault().logException(e, "Cannot open editor for marker: " + marker);
            } catch (JavaModelException e) {
                FindbugsPlugin.getDefault().logException(e, "Cannot open editor for java element: " + javaElement);
            }
        }

        void setSelection(IMarker sel) {
            marker = sel;
            javaElement = MarkerUtil.findJavaElementForMarker(marker);
        }

        public void selectionChanged(SelectionChangedEvent event) {
            resetSelection();
            ISelection selection = event.getSelection();
            if (selection instanceof IStructuredSelection) {
                IStructuredSelection ss = (IStructuredSelection) selection;
                if (ss.size() == 1) {
                    Object firstElement = ss.getFirstElement();
                    if (firstElement instanceof IMarker) {
                        // forward doubleClick to doubleClickAction
                        setSelection((IMarker) firstElement);
                    } else if (firstElement instanceof BugGroup) {
                        BugGroup group = (BugGroup) firstElement;
                        Object data = group.getData();
                        if (data instanceof IJavaElement) {
                            javaElement = (IJavaElement) data;
                        }
                        if (data instanceof IAdaptable) {
                            IAdaptable adaptable = (IAdaptable) data;
                            Object adapter = adaptable.getAdapter(IResource.class);
                            if (adapter instanceof IFile) {
                                file = (IFile) adapter;
                            }
                        }
                    }
                }
            }
        }

        private void resetSelection() {
            marker = null;
            file = null;
            javaElement = null;
        }

    }

    @Override
    public void init(ICommonActionExtensionSite aSite) {
        site = aSite;
        super.init(aSite);
        final StructuredViewer viewer = aSite.getStructuredViewer();
        final BugContentProvider provider = BugContentProvider.getProvider(site.getContentService());

        filterChangeListener = new IPropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent event) {
                if (!initDone) {
                    return;
                }
                IWorkingSet oldWorkingSet = provider.getCurrentWorkingSet();
                IWorkingSet oldWorkingSet1 = (IWorkingSet) event.getOldValue();
                IWorkingSet newWorkingSet = (IWorkingSet) event.getNewValue();
                if (newWorkingSet != null && (oldWorkingSet == newWorkingSet || oldWorkingSet1 == newWorkingSet)) {
                    return;
                }
                if (viewer != null) {
                    provider.setCurrentWorkingSet(newWorkingSet);
                    if (newWorkingSet == null) {
                        viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
                    } else if (oldWorkingSet != newWorkingSet) {
                        viewer.setInput(newWorkingSet);
                    }
                }
            }
        };


        workingSetActionGroup = new WorkingSetFilterActionGroup(aSite.getViewSite().getShell(), filterChangeListener);
        if (provider == null)
            throw new NullPointerException("no provider");
        workingSetActionGroup.setWorkingSet(provider.getCurrentWorkingSet());
        doubleClickAction = new MyAction();
        // only if doubleClickAction must know tree selection:
        viewer.addSelectionChangedListener(doubleClickAction);
        initDone = true;
    }

    @Override
    public void dispose() {
        site.getStructuredViewer().removeSelectionChangedListener(doubleClickAction);
        super.dispose();
    }

    @Override
    public void fillActionBars(IActionBars actionBars) {
        super.fillActionBars(actionBars);

        if (!hasContributedToViewMenu) {
            IMenuManager menuManager = actionBars.getMenuManager();

            // XXX dirty hack to rename silly "Customize View..." menu
            IContributionItem[] items = menuManager.getItems();
            for (IContributionItem item : items) {
                if (item instanceof ActionContributionItem) {
                    ActionContributionItem item2 = (ActionContributionItem) item;
                    String text = item2.getAction().getText();
                    if ("Customize View...".equals(text) || "&Customize View...".equals(text)) {
                        item2.getAction().setText("Toggle Filters...");
                        break;
                    }
                }
            }
            IContributionItem item = menuManager.find("findBugsEclipsePlugin.toggleGrouping.groupDialog");
            if (item != null) {
                menuManager.remove(item);
                menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS, item);
            }
            IMenuManager mm = menuManager.findMenuUsingPath("bugExplorer.menu.group");
            if (mm != null) {
                menuManager.remove(mm);
                menuManager.insertBefore(IWorkbenchActionConstants.MB_ADDITIONS, mm);
            }
            workingSetActionGroup.fillActionBars(actionBars);
            hasContributedToViewMenu = true;
        }
        actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, doubleClickAction);

    }

    @Override
    public void fillContextMenu(IMenuManager menu) {
        super.fillContextMenu(menu);

        menu.insertBefore(ICommonMenuConstants.GROUP_PORT, new Separator("fb"));
        menu.insertBefore(ICommonMenuConstants.GROUP_PORT, new Separator("fb.project"));
        menu.insertBefore(ICommonMenuConstants.GROUP_PORT, new Separator("fb.filter"));
    }

    // @Override
    // public void updateActionBars() {
    // IStructuredSelection selection = (IStructuredSelection) getContext()
    // .getSelection();
    //
    // }

}
TOP

Related Classes of de.tobject.findbugs.view.explorer.BugActionProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.