blob: b347ecf0546f07df678593de595ab167ce1a1f5f [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*
*/
package org.eclipse.osbp.vaadin.emf.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.command.CreateChildCommand;
import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.osbp.runtime.web.vaadin.common.resource.IResourceProvider;
import org.eclipse.osbp.vaadin.emf.api.IModelingContext;
import org.eclipse.osbp.vaadin.emf.data.EmfModelTreeContainer;
import com.vaadin.event.Action;
import com.vaadin.server.Resource;
import com.vaadin.ui.AbstractSelect;
/**
* A Vaadin ActionHandler that is aware about all containment references that
* can be created for a single EObject.
*/
@SuppressWarnings("serial")
public class EObjectActionHandler implements Action.Handler {
private EditCallback callback;
private IModelingContext modelingContext;
private IResourceProvider resourceProvider;
public EObjectActionHandler(IModelingContext modelingContext,
IResourceProvider resourceProvider, EditCallback callback) {
this.modelingContext = modelingContext;
this.resourceProvider = resourceProvider;
this.callback = callback;
}
/**
* Gets the list of actions applicable to this handler.
*
* @param target
* the target handler to list actions for. For item containers
* this is the item id.
* @param sender
* the party that would be sending the actions. Most of this is
* the action container.
* @return the list of Action
*/
@SuppressWarnings("unchecked")
public Action[] getActions(Object target, Object sender) {
List<CustomAction> result = new ArrayList<>();
if (target != null) {
CustomAction editAction = new CustomAction(Commands.EDIT_DIALOG,
"Edit", null, null);
editAction.modelElement = (EObject) target;
result.add(editAction);
result.add(new CustomAction(Commands.REFRESH_NODE, "Refresh", null,
null));
if (canDelete(target)) {
result.add(new CustomAction(Commands.DELETE, "Delete", null,
null));
}
if (modelingContext.getCommandStack().canUndo()) {
result.add(new CustomAction(Commands.UNDO, "Undo", null, null));
}
if (modelingContext.getCommandStack().canRedo()) {
result.add(new CustomAction(Commands.REDO, "Redo", null, null));
}
}
return result.toArray(new Action[result.size()]);
}
private boolean canDelete(Object target) {
Command command = RemoveCommand.create(
modelingContext.getEditingDomain(), target);
return command.canExecute();
}
/**
* Handles an action for the given target. The handler method may just
* discard the action if it's not suitable.
*
* @param action
* the action to be handled.
* @param sender
* the sender of the action. This is most often the action
* container.
* @param target
* the target of the action. For item containers this is the item
* id.
*/
public void handleAction(Action action, Object sender, Object target) {
CustomAction customAction = (CustomAction) action;
EditingDomain domain = modelingContext.getEditingDomain();
if (customAction.getCommand() == Commands.CREATE_CHILD) {
CommandParameter executeParam = new CommandParameter(target,
customAction.getParam().getFeature(),
customAction.getParam());
Command command = domain.createCommand(CreateChildCommand.class,
executeParam);
domain.getCommandStack().execute(command);
} else if (customAction.getCommand() == Commands.DELETE) {
domain.getCommandStack().execute(
RemoveCommand.create(domain, target));
} else if (customAction.getCommand() == Commands.UNDO) {
domain.getCommandStack().undo();
} else if (customAction.getCommand() == Commands.REDO) {
domain.getCommandStack().redo();
} else if (customAction.getCommand() == Commands.REFRESH_NODE) {
AbstractSelect select = (AbstractSelect) sender;
EmfModelTreeContainer container = (EmfModelTreeContainer) select
.getContainerDataSource();
container.refreshNode(target);
} else if (customAction.getCommand() == Commands.EDIT_DIALOG) {
callback.edit(customAction.modelElement);
}
}
/**
* Custom action wraps CommandParameter.
*/
private static class CustomAction extends Action {
private final Commands command;
private final CommandParameter param;
private final EStructuralFeature feature;
private EObject modelElement;
public CustomAction(Commands command, String caption, Resource icon,
CommandParameter param) {
super(caption, icon);
this.command = command;
this.param = param;
this.feature = null;
}
public CustomAction(Commands command, String caption, Resource icon,
CommandParameter param, EStructuralFeature feature) {
super(caption, icon);
this.command = command;
this.param = param;
this.feature = feature;
}
public CustomAction(Commands command, String caption, Resource icon) {
super(caption, icon);
this.command = command;
this.param = null;
this.feature = null;
}
public CommandParameter getParam() {
return param;
}
public Commands getCommand() {
return command;
}
public EStructuralFeature getFeature() {
return feature;
}
}
enum Commands {
EDIT_DIALOG, CREATE_CHILD, DELETE, UNDO, REDO, COPY, PASTE, REFRESH_NODE
}
public interface EditCallback {
void edit(EObject model);
}
}