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 16e7b121aa3d94441492fce50a19fe7220f929cb..8ab4ff662decf4cea53c47c50d5bbece3232061f 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 f430745ce3c9ca6182869b6f846cb483bacf1b10..83e4a91e684f68ae47c1a996027a73a1fe86f7ce 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 34cbca88b914f0a951851bdd889ec659c96ed367..5f2e112aa17bcff8686a0aac39a3882dec6f7e5b 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(); } }