package org.eclipse.ui.internal.views.markers;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.help.IContext;
import org.eclipse.help.IContextProvider;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.SameShellProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TreeAdapter;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Scrollable;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.OpenAndLinkWithEditorHelper;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.ui.internal.ide.IDEInternalPreferences;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.StatusUtil;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.part.MarkerTransfer;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
import org.eclipse.ui.progress.WorkbenchJob;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.ui.views.markers.MarkerField;
import org.eclipse.ui.views.markers.MarkerItem;
import org.eclipse.ui.views.markers.internal.MarkerGroup;
import org.eclipse.ui.views.markers.internal.MarkerMessages;
import org.eclipse.ui.views.markers.internal.MarkerSupportRegistry;
import org.eclipse.ui.views.tasklist.ITaskListResourceAdapter;
import org.osgi.framework.Bundle;
import com.ibm.icu.text.MessageFormat;
public class ExtendedMarkersView extends ViewPart {
final class MarkerSelectionEntry {
Object[] cachedValues;
MarkerSelectionEntry(MarkerItem item) {
MarkerField[] fields = builder.getVisibleFields();
cachedValues = new Object[fields.length];
for (int i = 0; i < fields.length; i++) {
cachedValues[i] = fields[i].getValue(item);
}
}
boolean isEquivalentTo(MarkerItem item) {
MarkerField[] fields = builder.getVisibleFields();
if (cachedValues.length != fields.length)
return false;
for (int i = 0; i < fields.length; i++) {
if (cachedValues[i] == fields[i].getValue(item))
continue;
return false;
}
return true;
}
}
private static int instanceCount = 1;
private static final String TAG_GENERATOR = "markerContentGenerator"; private static final String TAG_HORIZONTAL_POSITION = "horizontalPosition"; private static final String TAG_VERTICAL_POSITION = "verticalPosition"; private static final String MARKER_FIELD = "MARKER_FIELD";
private static final String TAG_EXPANDED = "expanded";
private static final String TAG_CATEGORY = "category";
private static final String TAG_PART_NAME = "partName";
private static final String TAG_COLUMN_WIDTHS = "columnWidths"; static {
Platform.getAdapterManager().registerAdapters(new IAdapterFactory() {
public Object getAdapter(Object adaptableObject, Class adapterType) {
if (adapterType == IMarker.class
&& adaptableObject instanceof MarkerEntry)
return ((MarkerEntry) adaptableObject).getMarker();
return null;
}
public Class[] getAdapterList() {
return new Class[] { IMarker.class };
}
}, MarkerEntry.class);
}
static String newSecondaryID(IViewPart part) {
while (part.getSite().getPage().findViewReference(
part.getSite().getId(), String.valueOf(instanceCount)) != null) {
instanceCount++;
}
return String.valueOf(instanceCount);
}
public static void openMarkerInEditor(IMarker marker, IWorkbenchPage page) {
IEditorPart editor = page.getActiveEditor();
if (editor != null) {
IEditorInput input = editor.getEditorInput();
IFile file = ResourceUtil.getFile(input);
if (file != null) {
if (marker.getResource().equals(file) && OpenStrategy.activateOnOpen()) {
page.activate(editor);
}
}
}
if (marker != null && marker.getResource() instanceof IFile) {
try {
IDE.openEditor(page, marker, OpenStrategy.activateOnOpen());
} catch (PartInitException e) {
IStatus status = e.getStatus();
if (status != null
&& status.getException() instanceof CoreException) {
status = ((CoreException) status.getException())
.getStatus();
}
if (status == null)
StatusManager.getManager().handle(
StatusUtil.newStatus(IStatus.ERROR, e.getMessage(),
e), StatusManager.SHOW);
else
StatusManager.getManager().handle(status,
StatusManager.SHOW);
}
}
}
private CachedMarkerBuilder builder;
Collection categoriesToExpand;
private Clipboard clipboard;
Collection preservedSelection = new ArrayList();
private Job updateJob;
private MarkersTreeViewer viewer;
private IPropertyChangeListener preferenceListener;
private ISelectionListener pageSelectionListener;
private IPartListener2 partListener;
private IMemento memento;
private String[] defaultGeneratorIds = new String[0];
private IPropertyChangeListener workingSetListener;
public ExtendedMarkersView(String contentGeneratorId) {
super();
defaultGeneratorIds = new String[] { contentGeneratorId };
preferenceListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
String propertyName = event.getProperty();
if (propertyName
.equals(IDEInternalPreferences.USE_MARKER_LIMITS)
|| propertyName
.equals(IDEInternalPreferences.MARKER_LIMITS_VALUE)) {
viewer.refresh();
updateTitle();
}
}
};
IDEWorkbenchPlugin.getDefault().getPreferenceStore()
.addPropertyChangeListener(preferenceListener);
}
private void addAllConcreteItems(MarkerSupportItem markerItem,
Collection allMarkers) {
if (markerItem.isConcrete()) {
allMarkers.add(markerItem);
return;
}
MarkerSupportItem[] children = markerItem.getChildren();
for (int i = 0; i < children.length; i++) {
addAllConcreteItems(children[i], allMarkers);
}
}
void addExpandedCategory(MarkerCategory category) {
getCategoriesToExpand().add(category.getName());
}
private void addMarkers(MarkerSupportItem markerItem, Collection allMarkers) {
if (markerItem.getMarker() != null)
allMarkers.add(markerItem.getMarker());
MarkerSupportItem[] children = markerItem.getChildren();
for (int i = 0; i < children.length; i++) {
addMarkers(children[i], allMarkers);
}
}
private void createColumns(TreeColumn[] currentColumns) {
Tree tree = viewer.getTree();
TableLayout layout = new TableLayout();
MarkerField[] fields = builder.getVisibleFields();
IMemento columnWidths = null;
if (memento != null)
columnWidths = memento.getChild(TAG_COLUMN_WIDTHS);
for (int i = 0; i < fields.length; i++) {
MarkerField markerField = fields[i];
TreeViewerColumn column;
if (i < currentColumns.length)
column = new TreeViewerColumn(viewer, currentColumns[i]);
else {
column = new TreeViewerColumn(viewer, SWT.NONE);
column.getColumn().setResizable(true);
column.getColumn().setMoveable(true);
column.getColumn().addSelectionListener(getHeaderListener());
}
column.getColumn().setData(MARKER_FIELD, markerField);
column.setLabelProvider(new MarkerColumnLabelProvider(markerField));
column.getColumn().setText(markerField.getColumnHeaderText());
column.getColumn().setToolTipText(
markerField.getColumnTooltipText());
column.getColumn().setImage(markerField.getColumnHeaderImage());
EditingSupport support = markerField.getEditingSupport(viewer);
if (support != null)
column.setEditingSupport(support);
if (builder.getPrimarySortField().equals(markerField))
updateDirectionIndicator(column.getColumn(), markerField);
int columnWidth = -1;
if (i == 0) {
GC gc = new GC(tree);
gc.setFont(tree.getFont());
FontMetrics fontMetrics = gc.getFontMetrics();
gc.dispose();
columnWidth = Math.max(markerField.getDefaultColumnWidth(tree),
fontMetrics.getAverageCharWidth() * 5);
}
if (columnWidths != null) {
Integer value = columnWidths.getInteger(getFieldId(column
.getColumn()));
if (value != null && value.intValue() > 0)
columnWidth = value.intValue();
}
if (columnWidth < 0)
layout.addColumnData(new ColumnPixelData(markerField
.getDefaultColumnWidth(tree), true, true));
else
layout.addColumnData(new ColumnPixelData(columnWidth, true));
}
if (currentColumns.length > fields.length) {
for (int i = fields.length; i < currentColumns.length; i++) {
currentColumns[i].dispose();
}
}
viewer.getTree().setLayout(layout);
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
tree.layout(true);
}
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
viewer = new MarkersTreeViewer(new Tree(parent, SWT.H_SCROLL
| SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION));
viewer.getTree().setLinesVisible(true);
viewer.setUseHashlookup(true);
viewer.addTreeListener(new ITreeViewerListener(){
public void treeCollapsed(TreeExpansionEvent event) {
}
public void treeExpanded(TreeExpansionEvent event) {
MarkerSupportItem item=(MarkerSupportItem) event.getElement();
item.clearCache();
}});
createColumns(new TreeColumn[0]);
viewer.setContentProvider(getContentProvider());
getSite().setSelectionProvider(viewer);
viewer.setInput(builder);
if (memento != null) {
Scrollable scrollable = (Scrollable) viewer.getControl();
ScrollBar bar = scrollable.getVerticalBar();
if (bar != null) {
Integer position = memento.getInteger(TAG_VERTICAL_POSITION);
if (position != null)
bar.setSelection(position.intValue());
}
bar = scrollable.getHorizontalBar();
if (bar != null) {
Integer position = memento.getInteger(TAG_HORIZONTAL_POSITION);
if (position != null)
bar.setSelection(position.intValue());
}
}
pageSelectionListener = getPageSelectionListener();
getSite().getPage().addPostSelectionListener(pageSelectionListener);
partListener = getPartListener();
getSite().getPage().addPartListener(partListener);
pageSelectionListener.selectionChanged(getSite().getPage()
.getActivePart(), getSite().getPage().getSelection());
new OpenAndLinkWithEditorHelper(viewer) {
protected void activate(ISelection selection) {
final int currentMode = OpenStrategy.getOpenMethod();
try {
OpenStrategy.setOpenMethod(OpenStrategy.DOUBLE_CLICK);
openSelectedMarkers();
} finally {
OpenStrategy.setOpenMethod(currentMode);
}
}
protected void linkToEditor(ISelection selection) {
}
protected void open(ISelection selection, boolean activate) {
openSelectedMarkers();
}
};
viewer.getTree().addTreeListener(new TreeAdapter() {
public void treeCollapsed(TreeEvent e) {
removeExpandedCategory((MarkerCategory) e.item.getData());
}
public void treeExpanded(TreeEvent e) {
addExpandedCategory((MarkerCategory) e.item.getData());
}
});
viewer.getControl().addHelpListener(new HelpListener() {
public void helpRequested(HelpEvent e) {
Object provider = getAdapter(IContextProvider.class);
if (provider == null)
return;
IContext context = ((IContextProvider) provider)
.getContext(viewer.getControl());
PlatformUI.getWorkbench().getHelpSystem().displayHelp(context);
}
});
viewer.getTree().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ISelection selection = viewer.getSelection();
if (selection instanceof IStructuredSelection)
updateStatusLine((IStructuredSelection) viewer
.getSelection());
}
});
PlatformUI.getWorkbench().getWorkingSetManager()
.addPropertyChangeListener(getWorkingSetListener());
registerContextMenu();
initDragAndDrop();
}
void disableAllFilters() {
builder.disableAllFilters();
}
public void dispose() {
super.dispose();
builder.dispose();
updateJob.cancel();
instanceCount--;
if (clipboard != null)
clipboard.dispose();
IDEWorkbenchPlugin.getDefault().getPreferenceStore()
.removePropertyChangeListener(preferenceListener);
getSite().getPage().removePostSelectionListener(pageSelectionListener);
getSite().getPage().removePartListener(partListener);
PlatformUI.getWorkbench().getWorkingSetManager()
.removePropertyChangeListener(workingSetListener);
}
MarkerSupportItem[] getAllConcreteItems() {
MarkerSupportItem[] elements = builder.getElements();
Collection allMarkers = new ArrayList();
for (int i = 0; i < elements.length; i++) {
addAllConcreteItems(elements[i], allMarkers);
}
MarkerSupportItem[] markers = new MarkerSupportItem[allMarkers.size()];
allMarkers.toArray(markers);
return markers;
}
Collection getAllFilters() {
return builder.getAllFilters();
}
IMarker[] getAllMarkers() {
MarkerSupportItem[] elements = builder.getElements();
Collection allMarkers = new ArrayList();
for (int i = 0; i < elements.length; i++) {
addMarkers(elements[i], allMarkers);
}
IMarker[] markers = new IMarker[allMarkers.size()];
allMarkers.toArray(markers);
return markers;
}
CachedMarkerBuilder getBuilder() {
return builder;
}
private Collection getCategoriesToExpand() {
if (categoriesToExpand == null) {
categoriesToExpand = new HashSet();
if (this.memento != null) {
IMemento expanded = this.memento.getChild(TAG_EXPANDED);
if (expanded != null) {
IMemento[] mementoCategories = expanded
.getChildren(TAG_CATEGORY);
MarkerCategory[] markerCategories = builder.getCategories();
if (markerCategories != null) {
for (int i = 0; i < markerCategories.length; i++) {
for (int j = 0; j < mementoCategories.length; j++) {
if (markerCategories[i].getName().equals(
mementoCategories[j].getID()))
categoriesToExpand.add(markerCategories[i]
.getName());
}
}
}
}
}
}
return categoriesToExpand;
}
MarkerGroup getCategoryGroup() {
return builder.getCategoryGroup();
}
Clipboard getClipboard() {
if (clipboard == null)
clipboard = new Clipboard(viewer.getControl().getDisplay());
return clipboard;
}
private ITreeContentProvider getContentProvider() {
return new ITreeContentProvider() {
public void dispose() {
}
public Object[] getChildren(Object parentElement) {
MarkerSupportItem[] children = ((MarkerSupportItem) parentElement)
.getChildren();
return getLimitedChildren(children);
}
public Object[] getElements(Object inputElement) {
return getLimitedChildren(((CachedMarkerBuilder) inputElement)
.getElements());
}
private Object[] getLimitedChildren(Object[] children) {
int newLength = MarkerSupportInternalUtilities.getMarkerLimit();
if (newLength > 0 && newLength < children.length) {
Object[] newChildren = new Object[newLength];
System.arraycopy(children, 0, newChildren, 0, newLength);
return newChildren;
}
return children;
}
public Object getParent(Object element) {
Object parent = ((MarkerSupportItem) element).getParent();
if (parent == null)
return builder;
return parent;
}
public boolean hasChildren(Object element) {
return ((MarkerSupportItem) element).getChildren().length > 0;
}
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
};
}
private String getFieldId(TreeColumn treeColumn) {
return ((MarkerField) treeColumn.getData(MARKER_FIELD))
.getConfigurationElement().getAttribute(
MarkerSupportInternalUtilities.ATTRIBUTE_ID);
}
String[] getGeneratorIds() {
return defaultGeneratorIds;
}
private SelectionListener getHeaderListener() {
return new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
final TreeColumn column = (TreeColumn) e.widget;
final MarkerField field = (MarkerField) column
.getData(MARKER_FIELD);
setPrimarySortField(field, column);
}
};
}
private ISelectionListener getPageSelectionListener() {
return new ISelectionListener() {
private ITaskListResourceAdapter getDefaultTaskListAdapter() {
return new ITaskListResourceAdapter() {
public IResource getAffectedResource(IAdaptable adaptable) {
Object resource = adaptable.getAdapter(IResource.class);
if (resource == null)
resource = adaptable.getAdapter(IFile.class);
if (resource == null)
return null;
return (IResource) resource;
}
};
}
public void selectionChanged(IWorkbenchPart part,
ISelection selection) {
if (part == ExtendedMarkersView.this
|| !(getSite().getPage().isPartVisible(part)))
return;
List selectedElements = new ArrayList();
if (part instanceof IEditorPart) {
IEditorPart editor = (IEditorPart) part;
IFile file = ResourceUtil.getFile(editor.getEditorInput());
if (file == null) {
IEditorInput editorInput = editor.getEditorInput();
if (editorInput != null) {
Object mapping = editorInput
.getAdapter(ResourceMapping.class);
if (mapping != null) {
selectedElements.add(mapping);
}
}
} else {
selectedElements.add(file);
}
} else {
if (selection instanceof IStructuredSelection) {
for (Iterator iterator = ((IStructuredSelection) selection)
.iterator(); iterator.hasNext();) {
Object object = iterator.next();
if (object instanceof IAdaptable) {
ITaskListResourceAdapter taskListResourceAdapter;
Object adapter = ((IAdaptable) object)
.getAdapter(ITaskListResourceAdapter.class);
if (adapter != null
&& adapter instanceof ITaskListResourceAdapter) {
taskListResourceAdapter = (ITaskListResourceAdapter) adapter;
} else {
taskListResourceAdapter = getDefaultTaskListAdapter();
}
IResource resource = taskListResourceAdapter
.getAffectedResource((IAdaptable) object);
if (resource == null) {
Object mapping = ((IAdaptable) object)
.getAdapter(ResourceMapping.class);
if (mapping != null) {
selectedElements.add(mapping);
}
} else {
selectedElements.add(resource);
}
}
}
}
}
builder.updateForNewSelection(selectedElements.toArray());
}
};
}
private IPartListener2 getPartListener() {
return new IPartListener2() {
public void partActivated(IWorkbenchPartReference partRef) {
}
public void partBroughtToTop(IWorkbenchPartReference partRef) {
}
public void partClosed(IWorkbenchPartReference partRef) {
}
public void partDeactivated(IWorkbenchPartReference partRef) {
}
public void partHidden(IWorkbenchPartReference partRef) {
}
public void partInputChanged(IWorkbenchPartReference partRef) {
}
public void partOpened(IWorkbenchPartReference partRef) {
}
public void partVisible(IWorkbenchPartReference partRef) {
if (partRef.getId().equals(
ExtendedMarkersView.this.getSite().getId())) {
pageSelectionListener.selectionChanged(getSite().getPage()
.getActivePart(), getSite().getPage()
.getSelection());
}
}
};
}
String getStaticContextId() {
return PlatformUI.PLUGIN_ID + ".markers_view_context"; }
public IMarker[] getSelectedMarkers() {
ISelection selection = viewer.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structured = (IStructuredSelection) selection;
Iterator elements = structured.iterator();
Collection result = new ArrayList();
while (elements.hasNext()) {
MarkerSupportItem next = (MarkerSupportItem) elements.next();
if (next.isConcrete())
result.add(((MarkerEntry) next).getMarker());
}
if (result.isEmpty())
return MarkerSupportInternalUtilities.EMPTY_MARKER_ARRAY;
IMarker[] markers = new IMarker[result.size()];
result.toArray(markers);
return markers;
}
return MarkerSupportInternalUtilities.EMPTY_MARKER_ARRAY;
}
public boolean getSortAscending() {
return viewer.getTree().getSortDirection() == SWT.TOP;
}
private String getStatusMessage() {
String status = MarkerSupportInternalUtilities.EMPTY_STRING;
int totalCount = builder.getTotalMarkerCount();
int filteredCount = 0;
MarkerSupportItem[] categories = builder.getCategories();
if (categories != null && builder.isShowingHierarchy()) {
int markerLimit = MarkerSupportInternalUtilities.getMarkerLimit();
for (int i = 0; i < categories.length; i++) {
filteredCount += markerLimit < 0 ? categories[i]
.getChildrenCount() : Math.min(categories[i]
.getChildrenCount(), markerLimit);
}
} else {
filteredCount = MarkerSupportInternalUtilities.getMarkerLimit();
}
Integer[] counts = builder.getMarkerCounts();
if (counts[0].intValue() == 0 && counts[1].intValue() == 0) {
if (filteredCount < 0 || filteredCount >= totalCount) {
status = NLS.bind(MarkerMessages.filter_itemsMessage,
new Integer(totalCount));
} else {
status = NLS.bind(MarkerMessages.filter_matchedMessage,
new Integer(filteredCount), new Integer(totalCount));
}
return status;
}
counts = new Integer[] { counts[0], counts[1],
new Integer(counts[2].intValue() + counts[3].intValue()) };
if (filteredCount < 0 || filteredCount >= totalCount)
return MessageFormat.format(
MarkerMessages.errorsAndWarningsSummaryBreakdown, counts);
return NLS
.bind(
MarkerMessages.problem_filter_matchedMessage,
new Object[] {
MessageFormat
.format(
MarkerMessages.errorsAndWarningsSummaryBreakdown,
counts),
new Integer(filteredCount),
new Integer(totalCount) });
}
private Job getUpdateJob(final CachedMarkerBuilder builder) {
updateJob = new WorkbenchJob(MarkerMessages.MarkerView_queueing_updates) {
public boolean belongsTo(Object family) {
return family == MarkerContentGenerator.CACHE_UPDATE_FAMILY;
}
private TreeViewer getViewer() {
return viewer;
}
public IStatus runInUIThread(IProgressMonitor monitor) {
if (viewer.getControl().isDisposed()) {
return Status.CANCEL_STATUS;
}
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
if (builder.isShowingHierarchy()
&& getCategoriesToExpand().isEmpty()) {
MarkerCategory[] categories = builder.getCategories();
if (categories != null && categories.length == 1)
getCategoriesToExpand().add(
categories[0].getDescription());
}
Tree tree = getViewer().getTree();
try {
tree.setRedraw(false);
getViewer().refresh(true);
updateTitle();
if (preservedSelection.size() > 0) {
Collection newSelection = new ArrayList();
MarkerItem[] markerEntries = builder.getMarkerEntries();
for (int i = 0; i < markerEntries.length; i++) {
Iterator preserved = preservedSelection.iterator();
while (preserved.hasNext()) {
MarkerSelectionEntry next = (MarkerSelectionEntry) preserved
.next();
if (next.isEquivalentTo(markerEntries[i])) {
newSelection.add(markerEntries[i]);
continue;
}
}
}
getViewer()
.setSelection(
new StructuredSelection(newSelection
.toArray()), true);
preservedSelection.clear();
}
if (getViewer().getTree().getItemCount() > 0)
getViewer().getTree().setTopItem(
getViewer().getTree().getItem(0));
reexpandCategories(builder);
} finally {
tree.setRedraw(true);
}
MarkerEntry[] entries=builder.getMarkerEntries();
for (int i = 0; i < entries.length; i++) {
entries[i].clearCache();
}
return Status.OK_STATUS;
}
public boolean shouldRun() {
return !builder.isBuilding()
&& IDEWorkbenchPlugin.getDefault().getBundle()
.getState() == Bundle.ACTIVE;
}
};
updateJob.setSystem(true);
return updateJob;
}
Object getViewerInput() {
return viewer.getInput();
}
MarkerField[] getVisibleFields() {
return builder.getVisibleFields();
}
private IPropertyChangeListener getWorkingSetListener() {
workingSetListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
builder.scheduleMarkerUpdate();
}
};
return workingSetListener;
}
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
MarkerContentGenerator generator = null;
if (memento != null) {
generator = MarkerSupportRegistry.getInstance().getGenerator(
memento.getString(TAG_GENERATOR));
}
if (generator == null && defaultGeneratorIds.length > 0) {
generator = MarkerSupportRegistry.getInstance().getGenerator(
defaultGeneratorIds[0]);
if (generator == null)
logInvalidGenerator(defaultGeneratorIds[0]);
}
if (generator == null)
generator = MarkerSupportRegistry.getInstance()
.getDefaultGenerator();
IMenuService menuService = (IMenuService) site
.getService(IMenuService.class);
menuService.populateContributionManager((ContributionManager) site
.getActionBars().getMenuManager(), "menu:" + MarkerSupportRegistry.MARKERS_ID);
menuService.populateContributionManager((ContributionManager) site
.getActionBars().getToolBarManager(),
"toolbar:" + MarkerSupportRegistry.MARKERS_ID);
String viewId = site.getId();
if (site.getSecondaryId() != null) {
viewId = viewId + site.getSecondaryId();
}
builder = new CachedMarkerBuilder(generator, viewId, memento);
builder.setUpdateJob(getUpdateJob(builder));
Object service = site.getAdapter(IWorkbenchSiteProgressService.class);
if (service != null)
builder.setProgressService((IWorkbenchSiteProgressService) service);
this.memento = memento;
if (memento == null || memento.getString(TAG_PART_NAME) == null)
return;
setPartName(memento.getString(TAG_PART_NAME));
}
void initializeTitle(String name) {
setPartName(name);
}
boolean isEnabled(MarkerFieldFilterGroup group) {
return builder.getEnabledFilters().contains(group);
}
boolean isPrimarySortField(MarkerField field) {
return builder.getPrimarySortField().equals(field);
}
boolean isShowing(MarkerContentGenerator generator) {
return this.builder.getGenerator().equals(generator);
}
void logInvalidGenerator(String id) {
StatusManager.getManager().handle(
new Status(IStatus.WARNING, IDEWorkbenchPlugin.IDE_WORKBENCH,
NLS.bind("Invalid markerContentGenerator {0} ", id)));
}
void openFiltersDialog() {
FiltersConfigurationDialog dialog = new FiltersConfigurationDialog(
new SameShellProvider(getSite().getWorkbenchWindow().getShell()),
builder);
if (dialog.open() == Window.OK) {
builder.updateFrom(dialog);
}
}
void openSelectedMarkers() {
IMarker[] markers = getSelectedMarkers();
for (int i = 0; i < markers.length; i++) {
IMarker marker = markers[i];
IWorkbenchPage page = getSite().getPage();
openMarkerInEditor(marker, page);
}
}
void reexpandCategories(final CachedMarkerBuilder builder) {
if (!getCategoriesToExpand().isEmpty() && builder.isShowingHierarchy()) {
MarkerItem[] items = builder.getElements();
for (int i = 0; i < items.length; i++) {
String name = ((MarkerCategory) items[i]).getName();
if (getCategoriesToExpand().contains(name))
viewer.expandToLevel(items[i], 2);
}
}
}
private void registerContextMenu() {
MenuManager contextMenu = new MenuManager();
contextMenu.setRemoveAllWhenShown(true);
getSite().registerContextMenu(contextMenu, viewer);
if (!getSite().getId().equals(MarkerSupportRegistry.MARKERS_ID))
getSite().registerContextMenu(MarkerSupportRegistry.MARKERS_ID,
contextMenu, viewer);
Control control = viewer.getControl();
Menu menu = contextMenu.createContextMenu(control);
control.setMenu(menu);
}
void removeExpandedCategory(MarkerCategory category) {
getCategoriesToExpand().remove(category.getName());
}
void saveSelection(ISelection selection) {
preservedSelection.clear();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structured = (IStructuredSelection) selection;
Iterator iterator = structured.iterator();
while (iterator.hasNext()) {
MarkerSupportItem next = (MarkerSupportItem) iterator.next();
if (next.isConcrete()) {
preservedSelection.add(new MarkerSelectionEntry(next));
getCategoriesToExpand().add(next.getParent());
} else
getCategoriesToExpand().add(next);
}
}
}
public void saveState(IMemento memento) {
super.saveState(memento);
memento.putString(TAG_GENERATOR, builder.getGenerator().getId());
memento.putString(TAG_PART_NAME, getPartName());
if (!getCategoriesToExpand().isEmpty()) {
IMemento expanded = memento.createChild(TAG_EXPANDED);
Iterator categories = getCategoriesToExpand().iterator();
while (categories.hasNext()) {
expanded.createChild(TAG_CATEGORY, (String) categories.next());
}
}
IMemento columnEntry = memento.createChild(TAG_COLUMN_WIDTHS);
MarkerField[] fields = new MarkerField[viewer.getTree()
.getColumnCount()];
int[] positions = viewer.getTree().getColumnOrder();
for (int i = 0; i < fields.length; i++) {
TreeColumn column = viewer.getTree().getColumn(i);
columnEntry.putInteger(getFieldId(column), column.getWidth());
fields[positions[i]] = (MarkerField) column.getData(MARKER_FIELD);
}
builder.saveState(memento, fields);
}
void selectAll() {
viewer.getTree().selectAll();
}
void setCategoryGroup(MarkerGroup group) {
getCategoriesToExpand().clear();
builder.setCategoryGroup(group);
}
void setContentGenerator(MarkerContentGenerator generator) {
viewer.setSelection(new StructuredSelection());
viewer.removeAndClearAll();
builder.setGenerator(generator);
createColumns(viewer.getTree().getColumns());
}
public void setFocus() {
viewer.getControl().setFocus();
}
void setPrimarySortField(MarkerField field) {
TreeColumn[] columns = viewer.getTree().getColumns();
for (int i = 0; i < columns.length; i++) {
TreeColumn treeColumn = columns[i];
if (columns[i].getData(MARKER_FIELD).equals(field)) {
setPrimarySortField(field, treeColumn);
return;
}
}
StatusManager.getManager().handle(
StatusUtil.newStatus(IStatus.WARNING,
"Sorting by non visible field " + field.getColumnHeaderText(), null));
}
private void setPrimarySortField(MarkerField field, TreeColumn column) {
builder.setPrimarySortField(field);
IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService) getViewSite()
.getAdapter(IWorkbenchSiteProgressService.class);
builder.refreshContents(service);
updateDirectionIndicator(column, field);
viewer.refresh();
reexpandCategories(builder);
MarkerEntry[] entries=builder.getMarkerEntries();
for (int i = 0; i < entries.length; i++) {
entries[i].clearCache();
}
}
void setSelection(StructuredSelection structuredSelection, boolean reveal) {
List newSelection = new ArrayList(structuredSelection.size());
for (Iterator i = structuredSelection.iterator(); i.hasNext();) {
Object next = i.next();
if (next instanceof IMarker) {
MarkerItem marker = builder.getMarkerItem((IMarker) next);
if (marker != null) {
newSelection.add(marker);
}
}
}
IStructuredSelection structured = new StructuredSelection(newSelection);
viewer.setSelection(structured, reveal);
updateStatusLine(structured);
}
void toggleFilter(MarkerFieldFilterGroup group) {
builder.toggleFilter(group);
}
void toggleSortDirection() {
setPrimarySortField(builder.getPrimarySortField());
}
void updateDirectionIndicator(TreeColumn column, MarkerField field) {
viewer.getTree().setSortColumn(column);
if (builder.getSortDirection(field) == MarkerComparator.ASCENDING)
viewer.getTree().setSortDirection(SWT.UP);
else
viewer.getTree().setSortDirection(SWT.DOWN);
}
private void updateStatusLine(IStructuredSelection newSelection) {
String message;
if (newSelection == null || newSelection.size() == 0) {
message = MarkerSupportInternalUtilities.EMPTY_STRING;
} else if (newSelection.size() == 1) {
message = ((MarkerSupportItem) newSelection.getFirstElement())
.getDescription();
} else {
Iterator elements = newSelection.iterator();
Collection result = new ArrayList();
while (elements.hasNext()) {
MarkerSupportItem next = (MarkerSupportItem) elements.next();
if (next.isConcrete())
result.add(next);
}
MarkerEntry[] entries = new MarkerEntry[result.size()];
result.toArray(entries);
MarkerMap markers=new MarkerMap(entries);
message =getStatusSummary(markers) ;
}
getViewSite().getActionBars().getStatusLineManager()
.setMessage(message);
}
private String getStatusSummary(MarkerMap markers) {
Integer[] counts = markers.getMarkerCounts();
counts = new Integer[] { counts[0], counts[1],
new Integer(counts[2].intValue() + counts[3].intValue()) };
if (counts[0].intValue() == 0 && counts[1].intValue() == 0) {
return MessageFormat.format(
MarkerMessages.marker_statusSelectedCount,
new Object[] { new Integer(markers.getSize()) });
}
return MessageFormat.format(
MarkerMessages.marker_statusSummarySelected,
new Object[] {
new Integer(markers.getSize()),
MessageFormat.format(
MarkerMessages.errorsAndWarningsSummaryBreakdown,
counts) });
}
void updateTitle() {
setContentDescription(getStatusMessage());
}
private void initDragAndDrop() {
int operations = DND.DROP_COPY;
Transfer[] transferTypes = new Transfer[] {
MarkerTransfer.getInstance(), TextTransfer.getInstance() };
DragSourceListener listener = new DragSourceAdapter() {
public void dragSetData(DragSourceEvent event) {
performDragSetData(event);
}
public void dragFinished(DragSourceEvent event) {
}
};
viewer.addDragSupport(operations, transferTypes, listener);
}
private void performDragSetData(DragSourceEvent event) {
if (MarkerTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = getSelectedMarkers();
return;
}
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
IMarker[] markers = getSelectedMarkers();
if (markers != null)
event.data = MarkerCopyHandler
.createMarkerReport(this, markers);
}
}
Object[] getHiddenFields() {
return builder.getHiddenFields();
}
void setVisibleFields(Collection visible) {
builder.setVisibleFields(visible);
viewer.setSelection(new StructuredSelection());
viewer.removeAndClearAll();
createColumns(viewer.getTree().getColumns());
viewer.refresh();
}
TreeViewer getViewer() {
return viewer;
}
}