Bug 370471 - Double-clicking on marker category crashes Eclipse
diff --git a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
index bb2334f..45955ca 100644
--- a/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
+++ b/bundles/org.eclipse.ui.browser/src/org/eclipse/ui/internal/browser/BrowserViewer.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2011 IBM Corporation and others.
+ * Copyright (c) 2004, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -21,7 +21,6 @@
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
-import org.eclipse.swt.SWTException;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.CloseWindowListener;
import org.eclipse.swt.browser.LocationEvent;
diff --git a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java
index 2bafef8..53adb0b 100644
--- a/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java
+++ b/bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2011 IBM Corporation and others.
+ * Copyright (c) 2007, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -30,12 +30,15 @@
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.jface.viewers.ColumnPixelData;
+import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILazyTreeContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
@@ -408,6 +411,8 @@
createViewer(parent);
+ addDoubleClickListener();
+
addPageAndPartSelectionListener();
addLinkWithEditorSupport();
@@ -452,6 +457,27 @@
}
/**
+ * Attaches an {@link IDoubleClickListener} to expand items that are not openable
+ * @since 3.8
+ */
+ private void addDoubleClickListener() {
+ viewer.addDoubleClickListener(new IDoubleClickListener() {
+ public void doubleClick(DoubleClickEvent event) {
+ ISelection selection = event.getSelection();
+ if(selection instanceof ITreeSelection) {
+ ITreeSelection ss = (ITreeSelection) selection;
+ if(ss.size() == 1) {
+ Object obj = ss.getFirstElement();
+ if(viewer.isExpandable(obj)) {
+ viewer.setExpandedState(obj, !viewer.getExpandedState(obj));
+ }
+ }
+ }
+ }
+ });
+ }
+
+ /**
*
*/
private void addPageAndPartSelectionListener() {
@@ -580,7 +606,35 @@
}
};
}
-
+
+ /**
+ * Returns the complete list of selected {@link IMarker}s from the view.
+ *
+ * @return the complete list of selected {@link IMarker}s or an empty array, never <code>null</code>
+ * @since 3.8
+ */
+ IMarker[] getOpenableMarkers() {
+ ISelection selection = viewer.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structured = (IStructuredSelection) selection;
+ Iterator elements = structured.iterator();
+ HashSet result = new HashSet();
+ 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;
+ }
+
/**
* Turn off all filters in the builder.
*/
@@ -624,7 +678,6 @@
* @return MarkerSupportItem[]
*/
MarkerSupportItem[] getAllConcreteItems() {
-
MarkerSupportItem[] elements =getActiveViewerInputClone().getElements();
Collection allMarkers = new ArrayList();
for (int i = 0; i < elements.length; i++) {
@@ -1183,17 +1236,15 @@
}
}
-
+
/**
* Open the selected markers
*/
void openSelectedMarkers() {
- IMarker[] markers = getSelectedMarkers();
+ IMarker[] markers = getOpenableMarkers();
for (int i = 0; i < markers.length; i++) {
- IMarker marker = markers[i];
IWorkbenchPage page = getSite().getPage();
-
- openMarkerInEditor(marker, page);
+ openMarkerInEditor(markers[i], page);
}
}