/*
* 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();
//
// }
}