/*
* 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;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.resources.IMarker;
import org.eclipse.jface.dialogs.IDialogSettings;
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.StructuredSelection;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.navigator.CommonNavigator;
import org.eclipse.ui.navigator.CommonViewer;
import de.tobject.findbugs.FindbugsPlugin;
import de.tobject.findbugs.view.explorer.BugContentProvider;
public class BugExplorerView extends CommonNavigator implements IMarkerSelectionHandler, ISelectionChangedListener {
private MarkerSelectionListener selectionListener;
private static final String TAG_MEMENTO = "memento";
private IMemento viewMemento;
protected boolean selectionInProgress;
public BugExplorerView() {
super();
}
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
// Add selection listener to detect click in problems view or in tree
// view
ISelectionService theService = getSite().getWorkbenchWindow().getSelectionService();
selectionListener = new MarkerSelectionListener(this) {
@Override
public void selectionChanged(IWorkbenchPart thePart, ISelection theSelection) {
selectionInProgress = true;
super.selectionChanged(thePart, theSelection);
selectionInProgress = false;
}
};
theService.addSelectionListener(selectionListener);
getCommonViewer().addSelectionChangedListener(this);
}
public boolean isVisible() {
return getSite().getPage().isPartVisible(this);
}
public void markerSelected(IWorkbenchPart part, IMarker marker) {
if (selectionInProgress) {
return;
}
BugContentProvider provider = BugContentProvider.getProvider(getNavigatorContentService());
CommonViewer commonViewer = getCommonViewer();
if (marker == null) {
commonViewer.setSelection(new StructuredSelection(), false);
} else if (provider.isFiltered(marker)) {
Object parent = provider.getParent(marker);
if (parent != null) {
commonViewer.setSelection(new StructuredSelection(parent), true);
}
} else {
commonViewer.setSelection(new StructuredSelection(marker), true);
}
}
@Override
public void updateTitle() {
super.updateTitle();
}
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
viewMemento = memento;
if (memento == null) {
IDialogSettings dialogSettings = FindbugsPlugin.getDefault().getDialogSettings();
String persistedMemento = dialogSettings.get(TAG_MEMENTO);
if (persistedMemento == null) {
// See bug 2504068. First time user opens a view, no settings
// are defined
// but we still need to enforce initialisation of content
// provider
// which can only happen if memento is not null
memento = XMLMemento.createWriteRoot("bugExplorer");
} else {
try {
memento = XMLMemento.createReadRoot(new StringReader(persistedMemento));
} catch (WorkbenchException e) {
// don't do anything. Simply don't restore the settings
}
}
}
super.init(site, memento);
}
@Override
public Object getAdapter(Class clazz) {
Object adapter = super.getAdapter(clazz);
if (adapter == null && clazz == IMemento.class) {
return viewMemento;
}
return adapter;
}
@Override
public void saveState(IMemento memento) {
super.saveState(memento);
}
@Override
public void dispose() {
// XXX see https://bugs.eclipse.org/bugs/show_bug.cgi?id=223068
XMLMemento memento = XMLMemento.createWriteRoot("bugExplorer"); //$NON-NLS-1$
saveState(memento);
StringWriter writer = new StringWriter();
try {
memento.save(writer);
IDialogSettings dialogSettings = FindbugsPlugin.getDefault().getDialogSettings();
dialogSettings.put(TAG_MEMENTO, writer.getBuffer().toString());
} catch (IOException e) {
// don't do anything. Simply don't store the settings
}
if (selectionListener != null) {
getSite().getWorkbenchWindow().getSelectionService().removeSelectionListener(selectionListener);
selectionListener = null;
}
super.dispose();
}
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (selection.isEmpty() || selection.size() == 1) {
setContentDescription("");
} else {
setContentDescription(getFrameToolTipText(selection));
}
}
@Override
public void selectReveal(ISelection selection) {
if (!(selection instanceof IStructuredSelection)) {
super.selectReveal(selection);
return;
}
selection = adaptSelection((IStructuredSelection) selection);
super.selectReveal(selection);
}
private ISelection adaptSelection(IStructuredSelection selection) {
BugContentProvider provider = BugContentProvider.getProvider(getNavigatorContentService());
Set<Object> accepted = new HashSet<Object>();
Iterator<?> iter = selection.iterator();
while (iter.hasNext()) {
Object object = iter.next();
Set<Object> supported = provider.getShowInTargets(object);
accepted.addAll(supported);
}
return new StructuredSelection(accepted.toArray());
}
}