/* $Id: EventTransformer.java 18634 2010-08-09 07:56:08Z mvw $
*******************************************************************************
* Copyright (c) 2010 Contributors - see below
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* mvw
*******************************************************************************
*/
package org.argouml.transformer;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.Action;
import org.argouml.i18n.Translator;
import org.argouml.kernel.Project;
import org.argouml.model.Model;
class EventTransformer implements Transformer {
public List<Action> actions(Project p, Object sourceModelElement) {
assert Model.getFacade().isAEvent(sourceModelElement);
List<Action> result = new ArrayList<Action>();
if (!Model.getFacade().isACallEvent(sourceModelElement)) {
result.add(new EventToCallEvent(p, sourceModelElement));
}
if (!Model.getFacade().isASignalEvent(sourceModelElement)) {
result.add(new EventToSignalEvent(p, sourceModelElement));
}
if (!Model.getFacade().isAChangeEvent(sourceModelElement)) {
result.add(new EventToChangeEvent(p, sourceModelElement));
}
if (!Model.getFacade().isATimeEvent(sourceModelElement)) {
result.add(new EventToTimeEvent(p, sourceModelElement));
}
return result;
}
public boolean canTransform(Object sourceModelElement) {
return Model.getFacade().isAEvent(sourceModelElement);
}
abstract class EventTransformerAction extends TransformerAction {
/**
* Constructor.
*/
EventTransformerAction(String nameKey, Project project, Object sourceModelElement) {
super(nameKey, project, sourceModelElement);
}
public void actionPerformed(ActionEvent e) {
super.actionPerformed(e);
String text = getText();
String name = getName();
Object ns = Model.getFacade().getNamespace(getSource());
/* Need to copy the lists since we will be moving the elements
* one by one: */
Collection transitions = new ArrayList(
Model.getFacade().getTransitions(getSource()));
Collection parameters = new ArrayList(
Model.getFacade().getParameters(getSource()));
// Deleting "source" here would probably delete the parameters...
Object trans = null;
if (!transitions.isEmpty()) {
trans = transitions.iterator().next();
}
Object evt = buildEvent(text, name, ns, trans);
for (Object param : parameters) {
Model.getCoreHelper().removeParameter(getSource(), param);
Model.getCoreHelper().addParameter(evt, param);
}
for (Object t : transitions) {
Model.getStateMachinesHelper().setTrigger(t, null);
Model.getStateMachinesHelper().setTrigger(t, evt);
}
Model.getUmlFactory().delete(getSource());
}
protected String getText() {
String text = "";
if (Model.getFacade().isACallEvent(getSource())) {
text = Model.getFacade().getName(getSource());
}
if (Model.getFacade().isAChangeEvent(getSource())) {
Object changeExpr = Model.getFacade().getChangeExpression(getSource());
if (changeExpr != null) {
text = Model.getDataTypesHelper().getBody(changeExpr);
}
}
if (Model.getFacade().isATimeEvent(getSource())) {
Object timeExpr = Model.getFacade().getWhen(getSource());
if (timeExpr != null) {
text = Model.getDataTypesHelper().getBody(timeExpr);
}
}
if (Model.getFacade().isASignalEvent(getSource())) {
text = Model.getFacade().getName(getSource());
}
return text;
}
/*
* Only set the name if it differs from the text.
*/
protected String getName() {
String name = "";
if (Model.getFacade().isAChangeEvent(getSource())) {
name = Model.getFacade().getName(getSource());
}
if (Model.getFacade().isATimeEvent(getSource())) {
name = Model.getFacade().getName(getSource());
}
return name;
}
abstract protected Object buildEvent(String text, String name, Object ns, Object trans);
}
class EventToCallEvent extends EventTransformerAction {
/**
* Constructor.
*/
EventToCallEvent(Project project, Object sourceModelElement) {
super(Translator.localize("transform.button.new-callevent"),
project, sourceModelElement);
}
@Override
protected Object buildEvent(String text, String name, Object ns, Object trans) {
Object evt = Model.getStateMachinesFactory().buildCallEvent(
ns);
Model.getCoreHelper().setName(evt, text);
Object op = Model.getStateMachinesHelper().findOperationByName(
trans, text);
if (op != null) {
Model.getCommonBehaviorHelper().setOperation(evt, op);
}
return evt;
}
}
class EventToSignalEvent extends EventTransformerAction {
/**
* Constructor.
*/
EventToSignalEvent(Project project, Object sourceModelElement) {
super(Translator.localize("transform.button.new-signalevent"),
project, sourceModelElement);
}
@Override
protected Object buildEvent(String text, String name, Object ns, Object trans) {
return Model.getStateMachinesFactory().buildSignalEvent(
text, ns);
}
}
class EventToChangeEvent extends EventTransformerAction {
/**
* Constructor.
*/
EventToChangeEvent(Project project, Object sourceModelElement) {
super(Translator.localize("transform.button.new-changeevent"),
project, sourceModelElement);
}
@Override
protected Object buildEvent(String text, String name, Object ns, Object trans) {
Object evt = Model.getStateMachinesFactory().buildChangeEvent(
text, ns);
Model.getCoreHelper().setName(evt, name);
return evt;
}
}
class EventToTimeEvent extends EventTransformerAction {
/**
* Constructor.
*/
EventToTimeEvent(Project project, Object sourceModelElement) {
super(Translator.localize("transform.button.new-timeevent"),
project, sourceModelElement);
}
@Override
protected Object buildEvent(String text, String name, Object ns, Object trans) {
Object evt = Model.getStateMachinesFactory().buildTimeEvent(
text, ns);
Model.getCoreHelper().setName(evt, name);
return evt;
}
}
}