Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorysroh2017-04-20 18:44:37 +0000
committerGerrit Code Review @ Eclipse.org2017-04-26 16:17:18 +0000
commitcba328d9907a0849ec436eb1a3ff82d57c06211a (patch)
treeb717c5b05b3ecc576640abf538b1959579aacb6f
parent22e855d62f655cce8ac5cd330067b98264f03b9a (diff)
downloadorg.eclipse.papyrus-rt-cba328d9907a0849ec436eb1a3ff82d57c06211a.tar.gz
org.eclipse.papyrus-rt-cba328d9907a0849ec436eb1a3ff82d57c06211a.tar.xz
org.eclipse.papyrus-rt-cba328d9907a0849ec436eb1a3ff82d57c06211a.zip
Bug 514635 - [Tooling] Selection in code snippet view causes exceptions
Do not contribute workbench selection from the code snippet view. Fix exceptions. This gerrit should also fix regression when redefining OpaqueBehaviour through code snippet view. Change-Id: I6cffe31efaa33c0395290c363df9db671037a767 Signed-off-by: ysroh <ysroh@zeligsoft.com>
-rw-r--r--plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.properties/src/org/eclipse/papyrusrt/umlrt/tooling/properties/widget/RTNatTableMultiReferencePropertyEditor.java50
-rw-r--r--plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPage.java121
-rw-r--r--plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPropertySheetPage.java98
-rw-r--r--plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetView.java42
-rw-r--r--plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/tabs/AbstractCodeSnippetTab.java26
5 files changed, 274 insertions, 63 deletions
diff --git a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.properties/src/org/eclipse/papyrusrt/umlrt/tooling/properties/widget/RTNatTableMultiReferencePropertyEditor.java b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.properties/src/org/eclipse/papyrusrt/umlrt/tooling/properties/widget/RTNatTableMultiReferencePropertyEditor.java
index 9267584dc..965f15117 100644
--- a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.properties/src/org/eclipse/papyrusrt/umlrt/tooling/properties/widget/RTNatTableMultiReferencePropertyEditor.java
+++ b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.properties/src/org/eclipse/papyrusrt/umlrt/tooling/properties/widget/RTNatTableMultiReferencePropertyEditor.java
@@ -50,8 +50,6 @@ import org.eclipse.papyrusrt.umlrt.tooling.properties.providers.RTNattableSelect
import org.eclipse.papyrusrt.umlrt.tooling.properties.providers.RTTableSelectionProvider;
import org.eclipse.papyrusrt.umlrt.tooling.tables.manager.axis.RTSynchronizedOnFeatureAxisManager;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
@@ -74,11 +72,6 @@ public class RTNatTableMultiReferencePropertyEditor extends RTNatTablePropertyEd
private IRTTableSelectionProvider selectionProvider;
/**
- * Nattable Dispose Listener
- */
- private DisposeListener nattableDisposeListener = null;
-
- /**
* Control Button Editor
*/
private MultiReferenceControlEditor editor;
@@ -154,6 +147,13 @@ public class RTNatTableMultiReferencePropertyEditor extends RTNatTablePropertyEd
// Hook the selection listener to the table for updating of buttons etc.
setSelectionProvider();
+ self.addDisposeListener(e -> {
+ disposeControlEditor();
+ RTNattableSelectionService.getInstance().removeSelectionProvider(selectionProvider);
+ selectionProvider.removeSelectionChangedListener(this);
+ selectedElements.clear();
+ });
+
return result;
}
@@ -215,7 +215,6 @@ public class RTNatTableMultiReferencePropertyEditor extends RTNatTablePropertyEd
protected void setSelectionProvider() {
selectionProvider = new RTTableSelectionProvider(nattableManager, nattableManager.getBodyLayerStack().getSelectionLayer());
selectionProvider.addSelectionChangedListener(this);
-
RTNattableSelectionService.getInstance().addSelectionProvider(selectionProvider);
}
@@ -239,30 +238,6 @@ public class RTNatTableMultiReferencePropertyEditor extends RTNatTablePropertyEd
}
/**
- * {@inheritDoc}
- *
- * @see org.eclipse.papyrus.uml.properties.widgets.NattablePropertyEditor#getDisposeListener()
- *
- */
- @Override
- protected DisposeListener getDisposeListener() {
- if (null == nattableDisposeListener) {
- nattableDisposeListener = new DisposeListener() {
-
- @Override
- public void widgetDisposed(DisposeEvent e) {
- RTNattableSelectionService.getInstance().removeSelectionProvider(selectionProvider);
- nattableManager.dispose();
- natTableWidget.dispose();
- selectedElements.clear();
- disposeControlEditor();
- }
- };
- }
- return nattableDisposeListener;
- }
-
- /**
* When the selection changed set the selected elements to the Button Editor.
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
@@ -270,6 +245,10 @@ public class RTNatTableMultiReferencePropertyEditor extends RTNatTablePropertyEd
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void selectionChanged(SelectionChangedEvent event) {
+ if (self == null || self.isDisposed()) {
+ // table is being disposed.
+ return;
+ }
// List of the selected elements
List elements = new ArrayList<>(1);
@@ -298,9 +277,10 @@ public class RTNatTableMultiReferencePropertyEditor extends RTNatTablePropertyEd
}
// Set the elements list to the button widget
- editor.setSelectedElements(elements);
- editor.updateButtons();
-
+ if (editor != null && !editor.isDisposed()) {
+ editor.setSelectedElements(elements);
+ editor.updateButtons();
+ }
}
diff --git a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPage.java b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPage.java
index 863e2c690..11f41a6e6 100644
--- a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPage.java
+++ b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPage.java
@@ -15,14 +15,18 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
+import org.eclipse.jface.util.SafeRunnable;
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.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrusrt.umlrt.core.utils.MultipleAdapter;
import org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet.tabs.ChoicePointTab;
import org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet.tabs.ICodeSnippetTab;
import org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet.tabs.OperationTab;
@@ -42,7 +46,6 @@ import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.Page;
import org.eclipse.ui.part.PageBook;
-import org.eclipse.uml2.uml.Trigger;
/**
* <p>
@@ -56,14 +59,19 @@ import org.eclipse.uml2.uml.Trigger;
public class CodeSnippetPage extends Page implements ICodeSnippetPage {
/**
- * Main page composite.
+ * Current workbench selection.
*/
- private Composite pageControl;
+ private static IStructuredSelection currentWorkbenchSelection = StructuredSelection.EMPTY;
/**
* Selected EObject.
*/
- private EObject currentSelectedEObject;
+ private static EObject currentSelectedEObject;
+
+ /**
+ * Main page composite.
+ */
+ private Composite pageControl;
/**
* Default empty tab item.
@@ -91,17 +99,48 @@ public class CodeSnippetPage extends Page implements ICodeSnippetPage {
private PageBook pageBook;
/**
+ * Selection adapter.
+ */
+ private SelectionAdapter adapter;
+
+ /**
+ * flag to ignore notification.
+ */
+ private boolean ignoreNotification = false;
+
+ /**
*
* Constructor.
*
*/
public CodeSnippetPage() {
-
+ adapter = new SelectionAdapter();
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+
+ String partId = part.getSite().getId();
+ if (CodeSnippetView.ID.equals(partId)) {
+ // Code snippet view selected
+ fireSelectionChange();
+ return;
+ }
+
if (selection instanceof IStructuredSelection) {
+
+ if (currentSelectedEObject != null) {
+ ignoreNotification = true;
+ currentSelectedEObject.eAdapters().remove(adapter);
+ ignoreNotification = false;
+ }
+
+ if (!"org.eclipse.ui.views.PropertySheet".equals(partId)) {
+ // Save selection to pass on to the property sheet.
+ // Ignore selection from the property sheet.
+ currentWorkbenchSelection = (IStructuredSelection) selection;
+ }
+
if (selection.isEmpty()) {
currentSelectedEObject = null;
} else {
@@ -134,10 +173,31 @@ public class CodeSnippetPage extends Page implements ICodeSnippetPage {
}
pageBook.showPage(tabFolder);
+ currentSelectedEObject.eAdapters().add(adapter);
} else {
// show default page
pageBook.showPage(defaultPage);
+ currentSelectedEObject = null;
}
+
+ fireSelectionChange();
+ }
+ }
+
+ /**
+ * Fire selection change.
+ */
+ private void fireSelectionChange() {
+ final SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
+ for (ISelectionChangedListener l : listeners) {
+ SafeRunnable runnable = new SafeRunnable() {
+
+ @Override
+ public void run() throws Exception {
+ l.selectionChanged(event);
+ }
+ };
+ SafeRunnable.run(runnable);
}
}
@@ -184,7 +244,6 @@ public class CodeSnippetPage extends Page implements ICodeSnippetPage {
createDefaultPage();
- getSite().setSelectionProvider(this);
}
/**
@@ -212,20 +271,22 @@ public class CodeSnippetPage extends Page implements ICodeSnippetPage {
@Override
public void dispose() {
- getSite().setSelectionProvider(null);
+ if (adapter != null) {
+ adapter.dispose();
+ }
tabs.stream().forEach(t -> t.dispose());
super.dispose();
}
@Override
public ISelection getSelection() {
- StructuredSelection selection = new StructuredSelection();
- if (currentSelectedEObject != null) {
- if (currentSelectedEObject instanceof Trigger) {
- // show its transition in the properties view
- selection = new StructuredSelection(currentSelectedEObject.eContainer());
+ ISelection selection = StructuredSelection.EMPTY;
+ if (currentWorkbenchSelection != null && !currentWorkbenchSelection.isEmpty()) {
+ EObject eo = EMFHelper.getEObject(currentWorkbenchSelection.getFirstElement());
+ if (eo == null || eo.eIsProxy() || eo.eResource() == null) {
+ currentWorkbenchSelection = null;
} else {
- selection = new StructuredSelection(currentSelectedEObject);
+ selection = currentWorkbenchSelection;
}
}
return selection;
@@ -245,4 +306,38 @@ public class CodeSnippetPage extends Page implements ICodeSnippetPage {
public void setSelection(ISelection selection) {
// not required for code snippet view.
}
+
+ /**
+ * Selection adapter.
+ *
+ * @author ysroh
+ *
+ */
+ private class SelectionAdapter extends MultipleAdapter {
+
+ /**
+ * Constructor.
+ *
+ */
+ SelectionAdapter() {
+ super(1);
+ }
+
+ /**
+ * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
+ *
+ * @param msg
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ if (!ignoreNotification) {
+ if (notification.getEventType() == Notification.REMOVING_ADAPTER) {
+ // Handle case when model is closed.
+ currentSelectedEObject = null;
+ currentWorkbenchSelection = null;
+ fireSelectionChange();
+ }
+ }
+ }
+ }
}
diff --git a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPropertySheetPage.java b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPropertySheetPage.java
new file mode 100644
index 000000000..2c22f5f0d
--- /dev/null
+++ b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetPropertySheetPage.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Zeligsoft (2009) Limited 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Young-Soo Roh - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.util.SafeRunnable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+/**
+ * Property sheet page for Code Snippet View.
+ *
+ * @author ysroh
+ *
+ */
+public class CodeSnippetPropertySheetPage extends TabbedPropertySheetPage implements ISelectionChangedListener {
+
+ /**
+ * Part.
+ **/
+ private CodeSnippetView part;
+
+ /**
+ * Dispose listeners.
+ */
+ private Set<DisposeListener> disposeListeners = new HashSet<>();
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param contributor
+ * contributor
+ */
+ public CodeSnippetPropertySheetPage(CodeSnippetView contributor) {
+ super(contributor);
+ this.part = contributor;
+ }
+
+ @Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ // we are not relying on the workbench selection.
+ }
+
+ /**
+ * Add dispose listener.
+ *
+ * @param listener
+ * listener.
+ */
+ public void addDisposeListener(DisposeListener listener) {
+ disposeListeners.add(listener);
+ }
+
+ @Override
+ public void dispose() {
+ for (DisposeListener l : disposeListeners) {
+ // notify dispose
+ Event e = new Event();
+ e.widget = getControl();
+ SafeRunnable runnable = new SafeRunnable() {
+
+ @Override
+ public void run() throws Exception {
+ l.widgetDisposed(new DisposeEvent(e));
+ }
+ };
+
+ SafeRunnable.run(runnable);
+ }
+ disposeListeners.clear();
+ part = null;
+ super.dispose();
+ }
+
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (getControl() != null && getWidgetFactory() != null) {
+ super.selectionChanged(part, event.getSelection());
+ }
+ }
+}
diff --git a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetView.java b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetView.java
index 0cdaeded2..bc3beeae5 100644
--- a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetView.java
+++ b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/internal/CodeSnippetView.java
@@ -10,6 +10,9 @@
*******************************************************************************/
package org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet.internal;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPageBookView;
@@ -27,7 +30,6 @@ import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.PageBookView;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* Code snippet view.
@@ -49,7 +51,12 @@ public class CodeSnippetView extends PageBookView implements ISelectionListener,
/**
* Properties page.
*/
- private IPropertySheetPage propertiesPage;
+ private CodeSnippetPropertySheetPage propertiesPage;
+
+ /**
+ * Created code snippet pages.
+ */
+ private List<CodeSnippetPage> pages = new ArrayList<>();
/**
*
@@ -72,8 +79,12 @@ public class CodeSnippetView extends PageBookView implements ISelectionListener,
String id = part.getSite().getId();
if (ModelExplorerPageBookView.VIEW_ID.equals(id) || PapyrusMultiDiagramEditor.EDITOR_ID.equals(id)
|| "org.eclipse.ui.views.PropertySheet".equals(id)) {
- IPageBookViewPage page = new CodeSnippetPage();
+ CodeSnippetPage page = new CodeSnippetPage();
initPage(page);
+ if (propertiesPage != null) {
+ page.addSelectionChangedListener(propertiesPage);
+ }
+ pages.add(page);
page.createControl(getPageBook());
return new PageRec(part, page);
}
@@ -83,6 +94,7 @@ public class CodeSnippetView extends PageBookView implements ISelectionListener,
@Override
protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
ICodeSnippetPage page = (ICodeSnippetPage) pageRecord.page;
+ pages.remove(page);
page.dispose();
pageRecord.dispose();
}
@@ -137,27 +149,27 @@ public class CodeSnippetView extends PageBookView implements ISelectionListener,
@Override
public void init(IViewSite site) throws PartInitException {
+ super.init(site);
site.getPage().addPostSelectionListener(this);
RTNattableSelectionService.getInstance().addSelectionListener(this);
- super.init(site);
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
ICodeSnippetPage page = (ICodeSnippetPage) getCurrentPage();
- if (page != null && part != null && isImportant(part)) {
+ if (part != null && page != null) {
page.selectionChanged(part, selection);
}
}
@Override
public void dispose() {
- super.dispose();
- getSite().getPage().removePostSelectionListener(this);
RTNattableSelectionService.getInstance().removeSelectionListener(this);
+ getSite().getPage().removePostSelectionListener(this);
if (propertiesPage != null) {
propertiesPage.dispose();
}
+ super.dispose();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@@ -165,7 +177,21 @@ public class CodeSnippetView extends PageBookView implements ISelectionListener,
public Object getAdapter(Class adapter) {
if (IPropertySheetPage.class == adapter) {
- propertiesPage = new TabbedPropertySheetPage(this);
+ if (propertiesPage == null) {
+ propertiesPage = new CodeSnippetPropertySheetPage(this);
+ propertiesPage.addDisposeListener(e -> {
+ // property sheet disposed.
+ propertiesPage = null;
+ for (CodeSnippetPage page : pages) {
+ // add listener
+ page.removeSelectionChangedListener(propertiesPage);
+ }
+ });
+ for (CodeSnippetPage page : pages) {
+ // add listener
+ page.addSelectionChangedListener(propertiesPage);
+ }
+ }
return propertiesPage;
}
diff --git a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/tabs/AbstractCodeSnippetTab.java b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/tabs/AbstractCodeSnippetTab.java
index 38d90b34d..dce19247a 100644
--- a/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/tabs/AbstractCodeSnippetTab.java
+++ b/plugins/umlrt/tooling/org.eclipse.papyrusrt.umlrt.tooling.views.codesnippet/src/org/eclipse/papyrusrt/umlrt/tooling/views/codesnippet/tabs/AbstractCodeSnippetTab.java
@@ -154,6 +154,11 @@ public abstract class AbstractCodeSnippetTab implements ICodeSnippetTab, IChange
*/
private ILabelProvider labelProvider;
+ /**
+ * Flag for ignoring change listener event.
+ */
+ private boolean ignoreChanges = false;
+
@Override
public void setInput(EObject input) {
this.input = input;
@@ -292,15 +297,17 @@ public abstract class AbstractCodeSnippetTab implements ICodeSnippetTab, IChange
@Override
public void handleChange(ChangeEvent event) {
- if (tabItem != null && !tabItem.isDisposed()) {
+ if (!ignoreChanges) {
+ if (tabItem != null && !tabItem.isDisposed()) {
- IObservable observable = event.getObservable();
- if (!(observable instanceof Expression) && !(observable instanceof ExpressionList)) {
- // owner of expression has update so update observable
- updateExpressionObservableList();
+ IObservable observable = event.getObservable();
+ if (!(observable instanceof Expression) && !(observable instanceof ExpressionList)) {
+ // owner of expression has update so update observable
+ updateExpressionObservableList();
+ }
+ // refresh contents
+ refresh();
}
- // refresh contents
- refresh();
}
}
@@ -442,7 +449,12 @@ public abstract class AbstractCodeSnippetTab implements ICodeSnippetTab, IChange
}
if (cmd != null && cmd.canExecute()) {
+ // Do not handle changes during the commit to prevent accessing
+ // disposed observables
+ ignoreChanges = true;
domain.getCommandStack().execute(new GMFtoEMFCommandWrapper(cmd));
+ ignoreChanges = false;
+ setInput(input);
}
}

Back to the top