From 30f18a33b64957cd5a8a9f7f1cf291ef9f5cc96d Mon Sep 17 00:00:00 2001 From: Florian Hoelzl <hoelzl@fortiss.org> Date: Tue, 10 May 2011 09:43:57 +0000 Subject: [PATCH] removed trial patches completed working undo/redo mechanism fixed global actions update in navigator --- .../trunk/META-INF/MANIFEST.MF | 1 + org.fortiss.tooling.kernel/trunk/plugin.xml | 8 +- .../tooling/kernel/base/EObjectAction.java | 51 ++++++ .../kernel/internal/ActionService.java | 101 +++++++----- .../kernel/internal/CommandStackService.java | 145 ++++++++++++++++-- .../kernel/internal/EditorService.java | 1 + .../kernel/internal/NavigatorService.java | 8 + ...Compositor.java => ProjectCompositor.java} | 10 +- ...r.java => ProjectModelElementHandler.java} | 21 +-- .../NavigatorTreeContentProvider.java | 12 +- .../internal/navigator/NavigatorViewPart.java | 20 ++- .../kernel/internal/navigator/NewMenu.java | 6 +- .../properties/PropertiesAdapterFactory.java | 4 +- .../kernel/services/ICommandStackService.java | 15 +- .../kernel/services/INavigatorService.java | 4 + 15 files changed, 319 insertions(+), 88 deletions(-) create mode 100644 org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java rename org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/{ProjectSpaceCompositor.java => ProjectCompositor.java} (85%) rename org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/{ProjectSpaceModelElementHandler.java => ProjectModelElementHandler.java} (78%) diff --git a/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF index 907d43c5d..3b108be87 100644 --- a/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF +++ b/org.fortiss.tooling.kernel/trunk/META-INF/MANIFEST.MF @@ -16,6 +16,7 @@ Require-Bundle: org.eclipse.core.runtime;visibility:=reexport, org.conqat.ide.commons.ui;bundle-version="2.7.0";visibility:=reexport, org.conqat.ide.commons.gef;bundle-version="2.7.0", org.eclipse.jdt.ui;bundle-version="3.6.2", + org.eclipse.emf.transaction;bundle-version="1.4.0", org.eclipse.emf.emfstore.server;bundle-version="0.7.3", org.eclipse.emf.emfstore.client;bundle-version="0.7.3", org.eclipse.emf.emfstore.client.ui;bundle-version="0.7.3" diff --git a/org.fortiss.tooling.kernel/trunk/plugin.xml b/org.fortiss.tooling.kernel/trunk/plugin.xml index 9c66cdec6..004894271 100644 --- a/org.fortiss.tooling.kernel/trunk/plugin.xml +++ b/org.fortiss.tooling.kernel/trunk/plugin.xml @@ -185,15 +185,15 @@ <extension point="org.fortiss.tooling.kernel.modelElementHandler"> <modelElementHandler - handler="org.fortiss.tooling.kernel.internal.handler.ProjectSpaceModelElementHandler" - modelElementClass="org.eclipse.emf.emfstore.client.model.ProjectSpace"> + handler="org.fortiss.tooling.kernel.internal.handler.ProjectModelElementHandler" + modelElementClass="org.eclipse.emf.emfstore.common.model.Project"> </modelElementHandler> </extension> <extension point="org.fortiss.tooling.kernel.modelElementCompositor"> <modelElementCompositor - compositor="org.fortiss.tooling.kernel.internal.compose.ProjectSpaceCompositor" - modelElementClass="org.eclipse.emf.emfstore.client.model.ProjectSpace"> + compositor="org.fortiss.tooling.kernel.internal.compose.ProjectCompositor" + modelElementClass="org.eclipse.emf.emfstore.common.model.Project"> </modelElementCompositor> </extension> diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java new file mode 100644 index 000000000..f107dbf32 --- /dev/null +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/base/EObjectAction.java @@ -0,0 +1,51 @@ +/*--------------------------------------------------------------------------+ +$Id$ +| | +| Copyright 2011 ForTISS GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.tooling.kernel.base; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.resource.ImageDescriptor; + +/** + * JFace {@link Action}, which uses an EObject as target. + * + * @author hoelzlf + * @author $Author$ + * @version $Rev$ + * @levd.rating RED Rev: + */ +public abstract class EObjectAction extends Action { + + /** Stores the target {@link EObject}. */ + private EObject target; + + /** Constructor. */ + public EObjectAction(String text, ImageDescriptor image) { + super(text, image); + } + + /** Sets the target object. */ + public void setTarget(EObject target) { + this.target = target; + } + + /** Returns the current target. */ + public EObject getTarget() { + return target; + } +} diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java index 21f0f8296..e41893138 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ActionService.java @@ -20,8 +20,7 @@ package org.fortiss.tooling.kernel.internal; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.emfstore.client.model.ProjectSpace; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; +import org.eclipse.emf.emfstore.common.model.Project; import org.eclipse.jface.action.IMenuManager; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorSite; @@ -29,6 +28,7 @@ import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionFactory; +import org.fortiss.tooling.kernel.base.EObjectAction; import org.fortiss.tooling.kernel.model.IRemovable; import org.fortiss.tooling.kernel.services.IActionService; import org.fortiss.tooling.kernel.services.ICommandStackService; @@ -48,65 +48,53 @@ public class ActionService implements IActionService { public static final String GROUP_GLOBAL_DEFAULTS = "globalDefaults"; /** The global undo action. */ - public final IAction globalUndoAction = new Action("Undo", PlatformUI - .getWorkbench().getSharedImages() - .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)) { + public final EObjectAction globalUndoAction = new EObjectAction("Undo", + PlatformUI.getWorkbench().getSharedImages() + .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)) { @Override public void run() { - EObject selectedObject = EObjectSelectionUtils - .getCurrentSelectionFirstElement(); - if (selectedObject != null) { - ICommandStackService.INSTANCE.undo(selectedObject); + if (getTarget() != null) { + ICommandStackService.INSTANCE.undo(getTarget()); } } + }; + + /** The global redo action. */ + public final EObjectAction globalRedoAction = new EObjectAction("Redo", + PlatformUI.getWorkbench().getSharedImages() + .getImageDescriptor(ISharedImages.IMG_TOOL_UNDO)) { @Override - public boolean isEnabled() { - EObject selectedObject = EObjectSelectionUtils - .getCurrentSelectionFirstElement(); - return selectedObject != null - && ICommandStackService.INSTANCE.canUndo(selectedObject); + public void run() { + if (getTarget() != null) { + ICommandStackService.INSTANCE.redo(getTarget()); + } } }; /** The global delete action. */ - public final IAction globalDeleteAction = new Action("Delete", PlatformUI - .getWorkbench().getSharedImages() - .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)) { + public final EObjectAction globalDeleteAction = new EObjectAction("Delete", + PlatformUI.getWorkbench().getSharedImages() + .getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)) { @Override public void run() { - final EObject selectedObject = EObjectSelectionUtils - .getCurrentSelectionFirstElement(); + final EObject selectedObject = getTarget(); + if (selectedObject == null) { + return; + } ICommandStackService.INSTANCE.runAsCommand(selectedObject, new Runnable() { @Override public void run() { - if (selectedObject != null) { - if (selectedObject instanceof IRemovable) { - ((IRemovable) selectedObject).remove(); - } else { - EcoreUtil.delete(selectedObject, true); - } + if (selectedObject instanceof IRemovable) { + ((IRemovable) selectedObject).remove(); + } else { + EcoreUtil.delete(selectedObject, true); } } }); } - - @Override - public boolean isEnabled() { - EObject selectedObject = EObjectSelectionUtils - .getCurrentSelectionFirstElement(); - if (selectedObject != null) { - if (selectedObject instanceof IRemovable) { - return ((IRemovable) selectedObject).canRemove(); - } - // ProjectSpace must be deleted with repository command - return !(selectedObject instanceof ProjectSpace) - && selectedObject.eContainer() != null; - } - return false; - } }; /** {@inheritDoc} */ @@ -114,6 +102,7 @@ public class ActionService implements IActionService { public void addGlobalDefaultActionSectionToMenu(IMenuManager menuManager) { menuManager.appendToGroup(GROUP_GLOBAL_DEFAULTS, globalDeleteAction); menuManager.appendToGroup(GROUP_GLOBAL_DEFAULTS, globalUndoAction); + menuManager.appendToGroup(GROUP_GLOBAL_DEFAULTS, globalRedoAction); } /** {@inheritDoc} */ @@ -136,12 +125,42 @@ public class ActionService implements IActionService { actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(), globalUndoAction); + globalRedoAction.setId(ActionFactory.REDO.getId()); + globalRedoAction.setActionDefinitionId(ActionFactory.REDO + .getCommandId()); + actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(), + globalRedoAction); + actionBars.updateActionBars(); } /** {@inheritDoc} */ @Override public void update() { - globalUndoAction.setEnabled(globalUndoAction.isEnabled()); + EObject target = EObjectSelectionUtils + .getCurrentSelectionFirstElement(); + + if (target == null) { + globalUndoAction.setEnabled(false); + globalRedoAction.setEnabled(false); + globalDeleteAction.setEnabled(false); + return; + } + + globalUndoAction.setTarget(target); + globalUndoAction.setEnabled(ICommandStackService.INSTANCE + .canUndo(target)); + + globalRedoAction.setTarget(target); + globalRedoAction.setEnabled(ICommandStackService.INSTANCE + .canRedo(target)); + + boolean canDelete = (target instanceof IRemovable) + && ((IRemovable) target).canRemove(); + canDelete = canDelete || !(target instanceof Project) + && !(target instanceof ProjectSpace) + && target.eContainer() != null; + globalDeleteAction.setTarget(target); + globalDeleteAction.setEnabled(canDelete); } } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java index 48a431e0a..aff44d5db 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/CommandStackService.java @@ -17,11 +17,24 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.internal; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Stack; + import org.eclipse.emf.common.command.BasicCommandStack; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.emfstore.client.model.Configuration; +import org.eclipse.emf.emfstore.client.model.ModelPackage; +import org.eclipse.emf.emfstore.client.model.ProjectSpace; +import org.eclipse.emf.emfstore.client.model.Workspace; import org.eclipse.emf.emfstore.client.model.WorkspaceManager; +import org.eclipse.emf.emfstore.client.model.impl.ProjectSpaceImpl; +import org.eclipse.emf.emfstore.client.model.observers.OperationListener; import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand; +import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation; import org.fortiss.tooling.kernel.services.ICommandStackService; /** @@ -35,14 +48,27 @@ import org.fortiss.tooling.kernel.services.ICommandStackService; public class CommandStackService implements ICommandStackService { /** Stores the EMFStore command stack. */ - private BasicCommandStack globalCommandStack; + private BasicCommandStack emfStoreCommandStack; + + /** Stores the project state observers. */ + private Map<ProjectSpace, ProjectSpaceObserver> projectSpaceObserverMap = new HashMap<ProjectSpace, CommandStackService.ProjectSpaceObserver>(); + + /** Stores the workspace listener. */ + private AdapterImpl workspaceListener; /** Constructor. */ public CommandStackService() { - // make sure workspace is initialized - // before fetching command stack - WorkspaceManager.getInstance().getCurrentWorkspace(); - globalCommandStack = (BasicCommandStack) Configuration + + Workspace ws = WorkspaceManager.getInstance().getCurrentWorkspace(); + createWorkspaceListener(); + ws.eAdapters().add(workspaceListener); + + for (ProjectSpace ps : ws.getProjectSpaces()) { + ProjectSpaceObserver state = new ProjectSpaceObserver(ps); + projectSpaceObserverMap.put(ps, state); + } + + emfStoreCommandStack = (BasicCommandStack) Configuration .getEditingDomain().getCommandStack(); } @@ -56,30 +82,129 @@ public class CommandStackService implements ICommandStackService { runner.run(); } }; - globalCommandStack.execute(command); + emfStoreCommandStack.execute(command); } /** {@inheritDoc} */ @Override public boolean canUndo(EObject target) { - return globalCommandStack.canUndo(); + ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(target); + return !projectSpace.getOperations().isEmpty(); } /** {@inheritDoc} */ @Override public boolean canRedo(EObject target) { - return globalCommandStack.canRedo(); + ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(target); + return projectSpaceObserverMap.get(projectSpace).canRedo(); } /** {@inheritDoc} */ @Override public void undo(EObject target) { - globalCommandStack.undo(); + final ProjectSpace projectSpace = WorkspaceManager + .getProjectSpace(target); + // also pushes the operation on the project state observer's redo stack + emfStoreCommandStack.execute(new EMFStoreCommand() { + + @Override + protected void doRun() { + projectSpace.undoLastOperation(); + } + }); } /** {@inheritDoc} */ @Override public void redo(EObject target) { - globalCommandStack.redo(); + ProjectSpace projectSpace = WorkspaceManager.getProjectSpace(target); + projectSpaceObserverMap.get(projectSpace).redo(); + } + + /** Creates the workspace listener. */ + private void createWorkspaceListener() { + workspaceListener = new AdapterImpl() { + @Override + public void notifyChanged(Notification msg) { + if ((msg.getFeatureID(Workspace.class)) == ModelPackage.WORKSPACE__PROJECT_SPACES) { + if (msg.getEventType() == Notification.ADD + && ModelPackage.eINSTANCE.getProjectSpace() + .isInstance(msg.getNewValue())) { + ProjectSpace projectSpace = (ProjectSpace) msg + .getNewValue(); + ProjectSpaceObserver obs = new ProjectSpaceObserver( + projectSpace); + projectSpaceObserverMap.put(projectSpace, obs); + } else if (msg.getEventType() == Notification.REMOVE + && ModelPackage.eINSTANCE.getProjectSpace() + .isInstance(msg.getOldValue())) { + ProjectSpace projectSpace = (ProjectSpace) msg + .getOldValue(); + ProjectSpaceObserver obs = projectSpaceObserverMap + .remove(projectSpace); + obs.dispose(); + } + } + } + }; + } + + /** Observes the state of a {@link ProjectSpace}. */ + private class ProjectSpaceObserver implements OperationListener { + + /** Stores the project space reference. */ + private final ProjectSpace projectSpace; + + /** Stores the redo stack. */ + private final Stack<AbstractOperation> redoStack = new Stack<AbstractOperation>(); + + /** Flag indicating the current operation is a redo. */ + private boolean redoInProgress = false; + + /** Constructor. */ + public ProjectSpaceObserver(ProjectSpace projectSpace) { + this.projectSpace = projectSpace; + projectSpace.addOperationListener(this); + } + + /** {@inheritDoc} */ + @Override + public void operationExecuted(AbstractOperation operation) { + if (!redoInProgress) { + // clear stack if not observing a redo + redoStack.clear(); + } + } + + /** {@inheritDoc} */ + @Override + public void operationUnDone(AbstractOperation operation) { + redoStack.add(operation); + } + + /** Returns whether redo is possible. */ + public boolean canRedo() { + return !redoStack.isEmpty(); + } + + /** Redo the last operation. */ + public void redo() { + final LinkedList<AbstractOperation> ops = new LinkedList<AbstractOperation>(); + ops.add(redoStack.pop()); + emfStoreCommandStack.execute(new EMFStoreCommand() { + + @Override + protected void doRun() { + redoInProgress = true; + ((ProjectSpaceImpl) projectSpace).applyOperations(ops); + redoInProgress = false; + } + }); + } + + /** Disposes the project state observer. */ + public void dispose() { + projectSpace.removeOperationListener(this); + } } } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java index 39c4f23da..d2b6654e4 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/EditorService.java @@ -67,6 +67,7 @@ public class EditorService extends EObjectAwareServiceBase<IEditorBinding<EObjec @Override public void openInEditor(EObject element) { try { + // FIXME (FH): only open editor, if at least one bound appear PlatformUI .getWorkbench() .getActiveWorkbenchWindow() diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java index 8735111d1..44e58a433 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/NavigatorService.java @@ -17,6 +17,7 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.internal; +import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.part.ViewPart; import org.fortiss.tooling.kernel.internal.navigator.NavigatorViewPart; import org.fortiss.tooling.kernel.services.INavigatorService; @@ -44,4 +45,11 @@ public class NavigatorService implements INavigatorService { public ViewPart getNavigatorView() { return navigatorViewPart; } + + /** {@inheritDoc} */ + @Override + public ISelection getCurrentSelection() { + return navigatorViewPart.getSite().getSelectionProvider() + .getSelection(); + } } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectCompositor.java similarity index 85% rename from org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java rename to org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectCompositor.java index 12293e48c..dc8d0923f 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectSpaceCompositor.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/compose/ProjectCompositor.java @@ -18,7 +18,7 @@ $Id$ package org.fortiss.tooling.kernel.internal.compose; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.emfstore.client.model.ProjectSpace; +import org.eclipse.emf.emfstore.common.model.Project; import org.fortiss.tooling.kernel.interfaces.ICompositionContext; import org.fortiss.tooling.kernel.interfaces.ICompositor; import org.fortiss.tooling.kernel.model.IProjectRootElement; @@ -31,20 +31,20 @@ import org.fortiss.tooling.kernel.model.IProjectRootElement; * @version $Rev$ * @levd.rating RED Rev: */ -public final class ProjectSpaceCompositor implements ICompositor<ProjectSpace> { +public final class ProjectCompositor implements ICompositor<Project> { /** {@inheritDoc} */ @Override - public boolean canCompose(ProjectSpace container, EObject contained, + public boolean canCompose(Project container, EObject contained, ICompositionContext context) { return contained instanceof IProjectRootElement; } /** {@inheritDoc} */ @Override - public boolean compose(ProjectSpace container, EObject contained, + public boolean compose(Project container, EObject contained, ICompositionContext context) { - container.getProject().addModelElement(contained); + container.addModelElement(contained); return true; } } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectModelElementHandler.java similarity index 78% rename from org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java rename to org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectModelElementHandler.java index 606b2e6c4..d657e121d 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectSpaceModelElementHandler.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/handler/ProjectModelElementHandler.java @@ -21,7 +21,8 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.emfstore.client.model.ProjectSpace; +import org.eclipse.emf.emfstore.client.model.WorkspaceManager; +import org.eclipse.emf.emfstore.common.model.Project; import org.eclipse.jface.resource.ImageDescriptor; import org.fortiss.tooling.kernel.ToolingKernelActivator; import org.fortiss.tooling.kernel.base.HandlerBase; @@ -29,26 +30,26 @@ import org.fortiss.tooling.kernel.interfaces.IHandler; import org.fortiss.tooling.kernel.model.IProjectRootElement; /** - * {@link IHandler} for {@link ProjectSpace}s. + * {@link IHandler} for {@link Project}s. * * @author hoelzlf * @author $Author$ * @version $Rev$ * @levd.rating RED Rev: */ -public final class ProjectSpaceModelElementHandler extends - HandlerBase<ProjectSpace> { +public final class ProjectModelElementHandler extends HandlerBase<Project> { /** {@inheritDoc} */ @Override - public String getName(ProjectSpace element) { - return element.getProjectName(); + public String getName(Project element) { + return WorkspaceManager.getProjectSpace(element).getProjectName(); } /** {@inheritDoc} */ @Override - public String getDescription(ProjectSpace element) { - return element.getProjectDescription(); + public String getDescription(Project element) { + return WorkspaceManager.getProjectSpace(element) + .getProjectDescription(); } /** {@inheritDoc} */ @@ -59,9 +60,9 @@ public final class ProjectSpaceModelElementHandler extends /** {@inheritDoc} */ @Override - public List<EObject> getSubnodes(ProjectSpace element) { + public List<EObject> getSubnodes(Project element) { List<EObject> list = new ArrayList<EObject>(); - for (EObject node : element.getProject().getModelElements()) { + for (EObject node : element.getModelElements()) { if (node instanceof IProjectRootElement) { list.add(node); } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java index b7ab04a74..35f60cb74 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorTreeContentProvider.java @@ -17,8 +17,13 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.internal.navigator; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.emfstore.client.model.ProjectSpace; import org.eclipse.emf.emfstore.client.model.Workspace; +import org.eclipse.emf.emfstore.common.model.Project; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.fortiss.tooling.kernel.interfaces.IHandler; @@ -38,7 +43,12 @@ public class NavigatorTreeContentProvider implements ITreeContentProvider { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Workspace) { - return ((Workspace) inputElement).getProjectSpaces().toArray(); + List<Project> result = new ArrayList<Project>(); + for (ProjectSpace space : ((Workspace) inputElement) + .getProjectSpaces()) { + result.add(space.getProject()); + } + return result.toArray(); } return null; } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java index d51f4f11a..699317bd4 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NavigatorViewPart.java @@ -38,7 +38,9 @@ import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; 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.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; @@ -70,7 +72,7 @@ import org.fortiss.tooling.kernel.util.EObjectSelectionUtils; * @levd.rating RED Rev: */ public final class NavigatorViewPart extends ViewPart implements - ISelectionListener, IDoubleClickListener, + ISelectionListener, ISelectionChangedListener, IDoubleClickListener, ITabbedPropertySheetPageContributor, ICustomMenuContributor { /** Stores the TreeViewer. */ @@ -185,8 +187,9 @@ public final class NavigatorViewPart extends ViewPart implements .getLabelDecorator())); viewer.setContentProvider(new NavigatorTreeContentProvider()); - createContextMenu(); getSite().setSelectionProvider(viewer); + createContextMenu(); + viewer.addSelectionChangedListener(this); viewer.setInput(workspace); @@ -227,14 +230,16 @@ public final class NavigatorViewPart extends ViewPart implements /** {@inheritDoc} */ @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { - EObject selectedElement = EObjectSelectionUtils - .getCurrentSelectionFirstElement(); - if (selectedElement != null) { - IActionService.INSTANCE.update(); - } + IActionService.INSTANCE.update(); // TODO (FH): implement link with editor feature here } + /** {@inheritDoc} */ + @Override + public void selectionChanged(SelectionChangedEvent event) { + IActionService.INSTANCE.update(); + } + /** {@inheritDoc} */ @Override public void dispose() { @@ -288,5 +293,4 @@ public final class NavigatorViewPart extends ViewPart implements result.add(new NewMenu()); return result; } - } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java index 583819daf..f574b1820 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/navigator/NewMenu.java @@ -27,6 +27,7 @@ import org.fortiss.tooling.kernel.services.ICommandStackService; import org.fortiss.tooling.kernel.services.ICompositorService; import org.fortiss.tooling.kernel.services.IEditorService; import org.fortiss.tooling.kernel.services.IModelElementService; +import org.fortiss.tooling.kernel.services.INavigatorService; import org.fortiss.tooling.kernel.services.IPrototypeService; import org.fortiss.tooling.kernel.services.IPrototypeService.Prototype; import org.fortiss.tooling.kernel.util.EObjectSelectionUtils; @@ -60,8 +61,11 @@ public class NewMenu extends CompoundContributionItem { /** {@inheritDoc} */ @Override protected IContributionItem[] getContributionItems() { + // FIXME (FH): this assumes the navigator is providing the + // selection, which might not be what we want! EObject selectedObject = EObjectSelectionUtils - .getCurrentSelectionFirstElement(); + .getFirstElement(INavigatorService.INSTANCE + .getCurrentSelection()); List<IContributionItem> contributionItems = new ArrayList<IContributionItem>(); if (selectedObject != null) { diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java index 3b9df3381..836ce2931 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/properties/PropertiesAdapterFactory.java @@ -19,9 +19,9 @@ package org.fortiss.tooling.kernel.internal.properties; import org.eclipse.core.runtime.IAdapterFactory; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.emfstore.common.model.util.ModelUtil; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; import org.fortiss.tooling.kernel.services.IPropertiesService; -import org.fortiss.tooling.kernel.util.ProjectRootElementUtils; /** * Adapter factory for tabbed property sheets. @@ -40,7 +40,7 @@ public final class PropertiesAdapterFactory implements IAdapterFactory { if (adapterType == ITabbedPropertySheetPageContributor.class && adaptableObject instanceof EObject) { EObject modelElement = (EObject) adaptableObject; - if (ProjectRootElementUtils.getProjectSpace(modelElement) != null) { + if (ModelUtil.getProject(modelElement) != null) { return new ITabbedPropertySheetPageContributor() { @Override diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java index e4b941dcb..4d2925ff9 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/ICommandStackService.java @@ -22,7 +22,8 @@ import org.fortiss.tooling.kernel.internal.CommandStackService; /** * The command stack service manages the access to the command stack and editing - * domain. + * domain. It provides a Undo/Redo mechanism and allows {@link Runnable}s to be + * executed, which need to modify the model. * * @author hoelzl * @author $Author$ @@ -34,18 +35,20 @@ public interface ICommandStackService { /** Returns the singleton instance of the service. */ public static final ICommandStackService INSTANCE = new CommandStackService(); - /** Runs the given Runnable within a emfStore transaction. */ + /** Runs the given {@link Runnable} within a emfStore transaction. */ void runAsCommand(EObject target, Runnable runner); - /** Checks if an undo action is possible. */ + /** Checks if an undo command is possible on the given target's project. */ boolean canUndo(EObject target); - /** Executes the undo action. */ + /** Executes the undo command on the target's project. */ void undo(EObject target); - /** Checks if a redo action is possible. */ + /** + * Checks if a redo command is possible on the given target's project. + */ boolean canRedo(EObject target); - /** Executes the redo action. */ + /** Executes the redo command on the target's project. */ void redo(EObject target); } diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java index eda351ed1..9a63ab9b3 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/INavigatorService.java @@ -17,6 +17,7 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.services; +import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.part.ViewPart; import org.fortiss.tooling.kernel.internal.NavigatorService; @@ -41,4 +42,7 @@ public interface INavigatorService { * navigator has not yet been created or has already been disposed. */ ViewPart getNavigatorView(); + + /** Returns the current naviaator selection. */ + ISelection getCurrentSelection(); } -- GitLab