From aabe3e3c903a9e2b186e902d7d9eccbf730fabdf Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Tue, 21 Jun 2011 13:48:27 +0000
Subject: [PATCH] fixed graphical editor base

---
 .../editor/gef/GraphicalViewerEditorBase.java | 111 ++++++++++++++++--
 .../trunk/schema/editPartFactory.exsd         |   2 +-
 ...NamedCommentedModelElementHandlerBase.java |   6 +
 3 files changed, 111 insertions(+), 8 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java
index 16e7b121a..8ab4ff662 100644
--- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java
+++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/editor/gef/GraphicalViewerEditorBase.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.conqat.ide.commons.gef.editpart.EditPartUtils;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.gef.EditDomain;
 import org.eclipse.gef.EditPartFactory;
@@ -40,7 +41,11 @@ import org.eclipse.gef.ui.actions.ZoomInAction;
 import org.eclipse.gef.ui.actions.ZoomOutAction;
 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IActionBars;
@@ -49,8 +54,10 @@ import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.ISelectionListener;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PartInitException;
+import org.fortiss.tooling.base.ui.ToolingBaseUIActivator;
 import org.fortiss.tooling.base.ui.action.ModelElementsActionBase;
 import org.fortiss.tooling.base.ui.dnd.DropTargetListener;
+import org.fortiss.tooling.base.ui.editpart.figure.EVisualStyle;
 import org.fortiss.tooling.kernel.ui.services.IEditPartFactoryService;
 
 /**
@@ -63,10 +70,11 @@ import org.fortiss.tooling.kernel.ui.services.IEditPartFactoryService;
  * @version $Rev$
  * @ConQAT.Rating YELLOW Hash: 63FF468A2D042586A22495828A0798EF
  */
-public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T> {
+public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
+		implements IPostSelectionProvider {
 
 	/** Stores the viewer. */
-	EditPartViewer viewer = new ScrollingGraphicalViewer();
+	protected EditPartViewer viewer = new ScrollingGraphicalViewer();
 
 	/** Actions which need update upon selection changes. */
 	private final List<String> selectionActions = new ArrayList<String>();
@@ -105,11 +113,61 @@ public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
 	/** {@inheritDoc} */
 	@Override
 	public void createPartControl(Composite parent) {
-		// action support
+		viewer.createControl(parent);
+
+		getEditDomain().addViewer(viewer);
+
+		viewer.setEditPartFactory(createEditPartFactory());
+		viewer.setContents(getViewerContentObject());
+		// TODO (FH): add context menu support
+		// MenuManager contextMenu = getContextMenuManager();
+		// if (contextMenu != null) {
+		// viewer.setContextMenu(contextMenu);
+		// }
+
+		getSite().setSelectionProvider(this);
+		ToolingBaseUIActivator.getDefault().getPreferenceStore()
+				.addPropertyChangeListener(propertyChangeListener);
+
 		createActions();
 		updateActions(propertyActions);
 
-		// zoom support
+		createZoomSupport();
+
+		// drag and drop
+		viewer.addDropTargetListener(new DropTargetListener(viewer));
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void dispose() {
+		ToolingBaseUIActivator.getDefault().getPreferenceStore()
+				.removePropertyChangeListener(propertyChangeListener);
+		super.dispose();
+	}
+
+	/**
+	 * Returns the root object used as content root. Sub-classes may override to
+	 * provide a different content root object. The default implementation uses
+	 * {@link EditorBase#getEditedObject()}
+	 */
+	protected Object getViewerContentObject() {
+		return getEditedObject();
+	}
+
+	/** Listener used to refresh on editor preference changes. */
+	private final IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
+
+		@Override
+		public void propertyChange(PropertyChangeEvent event) {
+			if (event.getProperty().equals(EVisualStyle.ID)) {
+				EditPartUtils.fullRefresh(viewer.getRootEditPart());
+			}
+		}
+	};
+
+	/** Installs zoom suport for this graphical viewer. */
+	private void createZoomSupport() {
 		RootEditPart rootPart = viewer.getRootEditPart();
 		if (rootPart instanceof ScalableFreeformRootEditPart) {
 			zoomManager = ((ScalableFreeformRootEditPart) rootPart)
@@ -123,9 +181,6 @@ public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
 			registerZoomAction();
 		}
 		zoomContribution = new ZoomComboContributionItem(getSite().getPage());
-
-		// drag and drop
-		viewer.addDropTargetListener(new DropTargetListener(viewer));
 	}
 
 	/** Registers and returns the id of the given action. */
@@ -223,4 +278,46 @@ public class GraphicalViewerEditorBase<T extends EObject> extends EditorBase<T>
 	public void setFocus() {
 		viewer.getControl().setFocus();
 	}
+
+	// The following methods are necessary in order to avoid Eclipse Helios SR2
+	// bug #339360
+
+	/** {@inheritDoc} */
+	@Override
+	public void addPostSelectionChangedListener(
+			ISelectionChangedListener listener) {
+		viewer.addSelectionChangedListener(listener);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void removePostSelectionChangedListener(
+			ISelectionChangedListener listener) {
+		viewer.removeSelectionChangedListener(listener);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+		viewer.addSelectionChangedListener(listener);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ISelection getSelection() {
+		return viewer.getSelection();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void removeSelectionChangedListener(
+			ISelectionChangedListener listener) {
+		viewer.removeSelectionChangedListener(listener);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void setSelection(ISelection selection) {
+		viewer.setSelection(selection);
+	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/schema/editPartFactory.exsd b/org.fortiss.tooling.kernel.ui/trunk/schema/editPartFactory.exsd
index f430745ce..83e4a91e6 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/schema/editPartFactory.exsd
+++ b/org.fortiss.tooling.kernel.ui/trunk/schema/editPartFactory.exsd
@@ -52,7 +52,7 @@
    <element name="editPartFactory">
       <complexType>
          <sequence>
-            <element ref="modelElementClass"/>
+            <element ref="modelElementClass" minOccurs="1" maxOccurs="unbounded"/>
          </sequence>
          <attribute name="factory" type="string" use="required">
             <annotation>
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/base/NamedCommentedModelElementHandlerBase.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/base/NamedCommentedModelElementHandlerBase.java
index 34cbca88b..5f2e112aa 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/base/NamedCommentedModelElementHandlerBase.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/base/NamedCommentedModelElementHandlerBase.java
@@ -35,12 +35,18 @@ public abstract class NamedCommentedModelElementHandlerBase<T extends INamedComm
 	/** {@inheritDoc} */
 	@Override
 	public String getName(T element) {
+		if (element.getName() == null) {
+			return "";
+		}
 		return element.getName();
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public String getDescription(T element) {
+		if (element.getComment() == null) {
+			return "";
+		}
 		return element.getComment();
 	}
 }
-- 
GitLab