Skip to content
Snippets Groups Projects
Commit 6de747b8 authored by Vincent Aravantinos's avatar Vincent Aravantinos
Browse files

Fixed

refs 1208
parent 9ee8b67d
No related branches found
No related tags found
No related merge requests found
......@@ -17,6 +17,10 @@ $Id$
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.kernel.ui.extension.base;
import static java.util.Arrays.asList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
......@@ -28,7 +32,7 @@ import org.eclipse.jface.resource.ImageDescriptor;
* @author hoelzl
* @author $Author$
* @version $Rev$
* @ConQAT.Rating GREEN Hash: 30211CF3D4E76A224216836A4020533B
* @ConQAT.Rating YELLOW Hash: 0CF3FA23137A22B12A4E2E32C0F7BDB9
*/
public abstract class EObjectActionBase<T extends EObject> extends Action {
......@@ -38,8 +42,8 @@ public abstract class EObjectActionBase<T extends EObject> extends Action {
EObjectActionBase<T> createAction(T target);
}
/** Stores the target element. */
private T target;
/** Stores the target elements. */
private List<T> targets;
/** Constructor. */
public EObjectActionBase(String text, ImageDescriptor image) {
......@@ -63,13 +67,25 @@ public abstract class EObjectActionBase<T extends EObject> extends Action {
}
/** Sets the target object. */
public void setTargets(List<T> targets) {
this.targets = targets;
}
/** Sets the target object. */
@SuppressWarnings("unchecked")
public void setTarget(T target) {
this.target = target;
setTargets(asList(target));
}
/** Returns the current target. */
public T getTarget() {
return target;
// get(0) because of backward compatibility: only the first element is considered
return(targets.isEmpty() ? null : targets.get(0));
}
/** Returns the current targets. */
public List<T> getTargets() {
return targets;
}
/** Refreshes the enabled state for the current action target. */
......@@ -92,6 +108,17 @@ public abstract class EObjectActionBase<T extends EObject> extends Action {
refresh();
}
/**
* Refreshes the action's targets and enabled state.
*
* @see #setTarget(EObject)
* @see #refresh()
*/
public final void refresh(List<T> elements) {
setTargets(elements);
refresh();
}
/**
* Computes the enabled state of the action for the current target, which is
* not <code>null</code> when this method is called. The default
......
......@@ -18,6 +18,7 @@ $Id$
package org.fortiss.tooling.kernel.ui.internal;
import java.util.EventObject;
import java.util.List;
import org.eclipse.emf.common.command.CommandStackListener;
import org.eclipse.emf.ecore.EObject;
......@@ -44,7 +45,7 @@ import org.fortiss.tooling.kernel.ui.util.EObjectSelectionUtils;
* @author hoelzlf
* @author $Author$
* @version $Rev$
* @ConQAT.Rating GREEN Hash: 3C35B6E429C4125AC1BFBE642B13A3AC
* @ConQAT.Rating YELLOW Hash: 75064C1D98E4EBAB76F6285B00169394
*/
public class ActionService implements IActionService, IPersistencyServiceListener,
CommandStackListener {
......@@ -147,13 +148,14 @@ public class ActionService implements IActionService, IPersistencyServiceListene
/** {@inheritDoc} */
@Override
public void refresh() {
EObject target = EObjectSelectionUtils.getCurrentSelectionFirstElement();
globalCopyAction.refresh(target);
globalCutAction.refresh(target);
globalPasteAction.refresh(target);
globalDeleteAction.refresh(target);
globalUndoAction.refresh(target);
globalRedoAction.refresh(target);
// EObject target = EObjectSelectionUtils.getCurrentSelectionFirstElement();
List<EObject> targets = EObjectSelectionUtils.getCurrentSelectionEObjects();
globalCopyAction.refresh(targets);
globalCutAction.refresh(targets);
globalPasteAction.refresh(targets);
globalDeleteAction.refresh(targets);
globalUndoAction.refresh(targets);
globalRedoAction.refresh(targets);
}
/** {@inheritDoc} */
......
......@@ -17,6 +17,8 @@ $Id$
+--------------------------------------------------------------------------*/
package org.fortiss.tooling.kernel.ui.internal.actions;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
......@@ -41,13 +43,10 @@ import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
* @author hoelzl
* @author $Author$
* @version $Rev$
* @ConQAT.Rating GREEN Hash: C61F14FC62544DA81B6F8B41160072CA
* @ConQAT.Rating YELLOW Hash: D24902B0508547BADDF90DD8055D5DFF
*/
public class DeleteAction extends EObjectActionBase<EObject> {
/** Flag for using element or connection composition service. */
private boolean useElementCompositor;
/** Constructor. */
public DeleteAction() {
super("Delete", PlatformUI.getWorkbench().getSharedImages()
......@@ -106,30 +105,40 @@ public class DeleteAction extends EObjectActionBase<EObject> {
/** Computes enabled state of the delete action. */
@Override
protected boolean computeEnabled() {
EObject element = getTarget();
if(!IPersistencyService.INSTANCE.isTopLevelElement(element)) {
// use composition services for deletion
if(IElementCompositorService.INSTANCE.canDecompose(element)) {
useElementCompositor = true;
return true;
} else if(IConnectionCompositorService.INSTANCE.canDisconnect(element)) {
useElementCompositor = false;
List<EObject> targets = getTargets();
if(!IPersistencyService.INSTANCE.shareTopLevelElement(targets)) {
return false;
}
for(EObject target : targets) {
if(canDelete(target)) {
return true;
}
return false;
}
return false;
}
/** Compute if one given target can be deleted. */
private boolean canDelete(EObject target) {
if(!IPersistencyService.INSTANCE.isTopLevelElement(target)) {
// use composition services for deletion
return(IElementCompositorService.INSTANCE.canDecompose(target) || IConnectionCompositorService.INSTANCE
.canDisconnect(target));
}
// use top-level element deletion mechanism
ITopLevelElement topElement = IPersistencyService.INSTANCE.getTopLevelElementFor(element);
ITopLevelElement topElement = IPersistencyService.INSTANCE.getTopLevelElementFor(target);
return topElement.canDelete();
}
/** Executes the delete using the correct service. */
private void doCompositorBasedDelete() {
EObject target = getTarget();
if(useElementCompositor) {
IElementCompositorService.INSTANCE.decompose(target);
} else {
IConnectionCompositorService.INSTANCE.disconnect(target);
List<EObject> targets = getTargets();
for(EObject target : targets) {
if(IElementCompositorService.INSTANCE.canDecompose(target)) {
IElementCompositorService.INSTANCE.decompose(target);
} else if(IConnectionCompositorService.INSTANCE.canDisconnect(target)) {
IConnectionCompositorService.INSTANCE.disconnect(target);
}
}
}
}
......@@ -35,7 +35,7 @@ import org.eclipse.ui.PlatformUI;
* @author hoelzl
* @author $Author$
* @version $Rev$
* @ConQAT.Rating GREEN Hash: C3CDD581F6E6075D51EFA1D425C9F130
* @ConQAT.Rating YELLOW Hash: 464197D9DCC7B1D4B73719DFA9FC0267
*/
public final class EObjectSelectionUtils {
......@@ -68,14 +68,18 @@ public final class EObjectSelectionUtils {
*/
public static EObject getFirstElement(ISelection selection) {
if(selection instanceof IStructuredSelection && !selection.isEmpty()) {
if(((IStructuredSelection)selection).getFirstElement() instanceof EObject) {
return (EObject)((IStructuredSelection)selection).getFirstElement();
}
if(((IStructuredSelection)selection).getFirstElement() instanceof IAdaptable) {
IAdaptable adaptable =
(IAdaptable)((IStructuredSelection)selection).getFirstElement();
return (EObject)adaptable.getAdapter(EObject.class);
}
return EObjectOfObject(((IStructuredSelection)selection).getFirstElement());
}
return null;
}
/** Try to retrieve an EObject from an Object. */
private static EObject EObjectOfObject(Object o) {
if(o instanceof EObject) {
return (EObject)o;
}
if(o instanceof IAdaptable) {
return (EObject)((IAdaptable)o).getAdapter(EObject.class);
}
return null;
}
......@@ -112,8 +116,9 @@ public final class EObjectSelectionUtils {
List<EObject> result = new ArrayList<EObject>();
if(selection instanceof StructuredSelection) {
for(Object o : ((StructuredSelection)selection).toList()) {
if(o instanceof EObject) {
result.add((EObject)o);
EObject eo = EObjectOfObject(o);
if(eo != null) {
result.add(eo);
}
}
}
......
......@@ -54,7 +54,7 @@ import org.osgi.framework.Bundle;
* @author hoelzl
* @author $Author$
* @version $Rev$
* @ConQAT.Rating YELLOW Hash: 086ACCFAE6CEC64777D6DEC7BB23BADB
* @ConQAT.Rating YELLOW Hash: 4FDEFF08FEA3AD91F1D916CEEC34D4C9
*/
public class PersistencyService implements IPersistencyService {
......@@ -225,6 +225,25 @@ public class PersistencyService implements IPersistencyService {
return null;
}
/** {@inheritDoc} */
@Override
public List<ITopLevelElement> getTopLevelElementsFor(List<EObject> modelElements) {
ArrayList<ITopLevelElement> res = new ArrayList<ITopLevelElement>();
for(EObject eo : modelElements) {
ITopLevelElement topElt = getTopLevelElementFor(eo);
if(!res.contains(topElt)) {
res.add(topElt);
}
}
return res;
}
/** {@inheritDoc} */
@Override
public boolean shareTopLevelElement(List<EObject> modelElements) {
return getTopLevelElementsFor(modelElements).size() == 1;
}
/** Initializes the storage provider list from plugin extensions. */
private void setupStorageProviders() {
for(IConfigurationElement ce : getConfigurationElements(EXTENSION_POINT_NAME,
......
......@@ -42,7 +42,7 @@ import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener;
* @author hoelzl
* @author $Author$
* @version $Rev$
* @ConQAT.Rating GREEN Hash: 74906795F7A3AA1D94476D9B0538052C
* @ConQAT.Rating YELLOW Hash: 85BF181200615C877956EBEC24FF1B21
*/
public interface IPersistencyService {
......@@ -69,6 +69,12 @@ public interface IPersistencyService {
/** Returns the top-level element for the given model element. */
ITopLevelElement getTopLevelElementFor(EObject modelElement);
/** Returns the top-level elements for the given model element list. */
List<ITopLevelElement> getTopLevelElementsFor(List<EObject> modelElements);
/** True if all the elements of the given list share the same top level element. */
boolean shareTopLevelElement(List<EObject> modelElements);
/** Returns whether the some storage provider has unsaved changes. */
boolean isDirty();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment