/*
* Copyright 2005-7 Pi4 Technologies Ltd
*
* 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.
*
*
* Change History:
* Feb 20, 2007 : Initial version created by gary
*/
package org.savara.tools.scenario.designer.commands;
import org.savara.scenario.model.*;
import org.savara.tools.scenario.designer.model.*;
import org.eclipse.gef.commands.Command;
/**
* This class implements the activity deletion command.
*/
public class DeleteComponentCommand
extends org.eclipse.gef.commands.Command {
public DeleteComponentCommand() {
}
public boolean canExecute() {
boolean ret=false;
if (m_parent != null && m_child != null) {
ret = true;
}
return(ret);
}
/* (non-Javadoc)
* @see org.eclipse.gef.commands.Command#execute()
*/
public void execute() {
if (m_child instanceof MessageEvent) {
java.util.List<Link> list=ModelSupport.getSourceConnections(m_scenario, m_child);
for (int i=list.size()-1; i >= 0; i--) {
Link link=(Link)list.get(i);
link.setSource(null);
link.setTarget(null);
m_scenario.getLink().remove(link);
}
list=ModelSupport.getTargetConnections(m_scenario, m_child);
for (int i=list.size()-1; i >= 0; i--) {
Link link=(Link)list.get(i);
link.setSource(null);
link.setTarget(null);
m_scenario.getLink().remove(link);
}
} else if (m_child instanceof Role) {
// Construct deletion commands for each nessage event
// related to the participant
java.util.List<Event> results=new java.util.Vector<Event>();
ModelSupport.getEventsForRole((Role)m_child, m_scenario.getEvent(), results);
for (int i=results.size()-1; i >= 0; i--) {
Event event=results.get(i);
DeleteComponentCommand command=
new DeleteComponentCommand();
command.setScenario(m_scenario);
command.setChild(event);
Object parent=ModelSupport.getParent(m_scenario, event);
command.setParent(parent);
command.setIndex(ModelSupport.getChildIndex(
parent, event));
m_propagatedCommands.add(command);
}
}
for (int i=0; i < m_propagatedCommands.size(); i++) {
Command command=(Command)m_propagatedCommands.get(i);
command.execute();
}
ModelSupport.removeChild(m_parent, m_child);
if (m_child instanceof Group) {
// Scan list of message links to see if any no longer have
// a message event that is attached to the scenario - and
// then save these in case of an undo
for (int i=m_scenario.getLink().size()-1;
i >= 0; i--) {
Link link=(Link)m_scenario.getLink().get(i);
if ((link.getSource() != null &&
ModelSupport.getParent(m_scenario, link.getSource()) == null) ||
(link.getTarget() != null &&
ModelSupport.getParent(m_scenario, link.getTarget()) == null)) {
// Remove link
m_scenario.getLink().remove(link);
m_removedMessageLinks.add(0, link);
}
}
}
}
public Object getParent() {
return(m_parent);
}
public void redo() {
execute();
}
public void setScenario(Scenario scenario) {
m_scenario = scenario;
}
public void setChild(Object newNode) {
m_child = newNode;
// Determine connected children
if (newNode instanceof MessageEvent) {
java.util.List<Link> list=ModelSupport.getSourceConnections(m_scenario, newNode);
for (int i=0; i < list.size(); i++) {
Link link=(Link)list.get(i);
m_targetConnectedEvents.add((MessageEvent)link.getTarget());
}
list=ModelSupport.getTargetConnections(m_scenario, newNode);
for (int i=0; i < list.size(); i++) {
Link link=(Link)list.get(i);
m_sourceConnectedEvents.add((MessageEvent)link.getSource());
}
}
}
public void setIndex(int index) {
m_index = index;
}
public void setParent(Object newParent) {
m_parent = newParent;
}
public void undo() {
ModelSupport.addChild(m_parent, m_child, m_index);
for (int i=m_propagatedCommands.size()-1; i >= 0; i--) {
Command command=(Command)m_propagatedCommands.get(i);
command.undo();
}
m_propagatedCommands.clear();
if (m_child instanceof MessageEvent) {
/* TODO: GPB: need scenario */
for (int i=0; i < m_sourceConnectedEvents.size(); i++) {
Link link=new Link();
link.setSource((MessageEvent)m_sourceConnectedEvents.get(i));
link.setTarget((MessageEvent)m_child);
m_scenario.getLink().add(link);
}
for (int i=0; i < m_targetConnectedEvents.size(); i++) {
Link link=new Link();
link.setSource((MessageEvent)m_child);
link.setTarget((MessageEvent)m_targetConnectedEvents.get(i));
m_scenario.getLink().add(link);
}
/**/
} else if (m_child instanceof Group) {
for (int i=0; i < m_removedMessageLinks.size(); i++) {
m_scenario.getLink().add(
m_removedMessageLinks.get(i));
}
m_removedMessageLinks.clear();
}
}
private Scenario m_scenario=null;
private Object m_child=null;
private Object m_parent=null;
private int m_index = -1;
private java.util.Vector<MessageEvent> m_sourceConnectedEvents=new java.util.Vector<MessageEvent>();
private java.util.Vector<MessageEvent> m_targetConnectedEvents=new java.util.Vector<MessageEvent>();
private java.util.Vector<Link> m_removedMessageLinks=new java.util.Vector<Link>();
private java.util.Vector<Command> m_propagatedCommands=new java.util.Vector<Command>();
}