Backported fix for bug 404873: [History View] Sporadic
StackOverflowError
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/GenericHistoryView.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/GenericHistoryView.java
index 9ed4449..f7e2f7d 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/GenericHistoryView.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/GenericHistoryView.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2011 IBM Corporation and others.
+ * Copyright (c) 2006, 2015 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
@@ -340,33 +340,45 @@
private ISelectionListener selectionListener = new ISelectionListener() {
+ private boolean isUpdatingSelection= false;
+
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (isUpdatingSelection)
+ return;
- if (selection instanceof IStructuredSelection) {
- IStructuredSelection structSelection = (IStructuredSelection) selection;
- //Always take the first element - this is not intended to work with multiple selection
- //Also, hang on to this selection for future use in case the history view is not visible
- lastSelectedElement = structSelection.getFirstElement();
-
- if (!isLinkingEnabled() || !checkIfPageIsVisible()) {
+ try {
+ isUpdatingSelection = true;
+ if (GenericHistoryView.this == part)
return;
- }
- if (lastSelectedElement != null){
- Object resource;
- if (lastSelectedElement instanceof SyncInfoModelElement) {
- SyncInfoModelElement syncInfoModelElement = (SyncInfoModelElement) lastSelectedElement;
- resource = syncInfoModelElement.getSyncInfo().getLocal();
- } else {
- resource = Utils.getAdapter(lastSelectedElement, IResource.class);
+ if (selection instanceof IStructuredSelection) {
+ IStructuredSelection structSelection= (IStructuredSelection)selection;
+ //Always take the first element - this is not intended to work with multiple selection
+ //Also, hang on to this selection for future use in case the history view is not visible
+ lastSelectedElement= structSelection.getFirstElement();
+
+ if (!isLinkingEnabled() || !checkIfPageIsVisible()) {
+ return;
}
- if (resource != null)
- showHistory(resource);
- else
- showHistory(lastSelectedElement);
- //reset lastSelectedElement
- lastSelectedElement = null;
+
+ if (lastSelectedElement != null) {
+ Object resource;
+ if (lastSelectedElement instanceof SyncInfoModelElement) {
+ SyncInfoModelElement syncInfoModelElement= (SyncInfoModelElement)lastSelectedElement;
+ resource= syncInfoModelElement.getSyncInfo().getLocal();
+ } else {
+ resource= Utils.getAdapter(lastSelectedElement, IResource.class);
+ }
+ if (resource != null)
+ showHistory(resource);
+ else
+ showHistory(lastSelectedElement);
+ //reset lastSelectedElement
+ lastSelectedElement= null;
+ }
}
+ } finally {
+ isUpdatingSelection= false;
}
}