/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.wkf.action;
import java.util.Vector;
import java.util.logging.Logger;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoException;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.action.FlexoAction;
import org.openflexo.foundation.action.FlexoActionType;
import org.openflexo.foundation.wkf.ActivityGroup;
import org.openflexo.foundation.wkf.ActivityPetriGraph;
import org.openflexo.foundation.wkf.FlexoPetriGraph;
import org.openflexo.foundation.wkf.WKFObject;
import org.openflexo.foundation.wkf.node.AbstractNode;
import org.openflexo.foundation.wkf.node.PetriGraphNode;
public class MakeActivityGroup extends FlexoAction<MakeActivityGroup, WKFObject, WKFObject> {
private static final Logger logger = Logger.getLogger(MakeActivityGroup.class.getPackage().getName());
public static FlexoActionType<MakeActivityGroup, WKFObject, WKFObject> actionType = new FlexoActionType<MakeActivityGroup, WKFObject, WKFObject>(
"group_activities", FlexoActionType.editGroup) {
/**
* Factory method
*/
@Override
public MakeActivityGroup makeNewAction(WKFObject focusedObject, Vector<WKFObject> globalSelection, FlexoEditor editor) {
return new MakeActivityGroup(focusedObject, globalSelection, editor);
}
@Override
public boolean isVisibleForSelection(WKFObject object, Vector<WKFObject> globalSelection) {
return false/* ((object != null)
&& object instanceof AbstractNode
&& ((AbstractNode)object).getLevel() == FlexoLevel.ACTIVITY)*/;
}
@Override
public boolean isEnabledForSelection(WKFObject object, Vector<WKFObject> globalSelection) {
return false /*getAllActivityLevelNodes(object, globalSelection).size() > 0*/;
}
};
static {
FlexoModelObject.addActionForClass(MakeActivityGroup.actionType, AbstractNode.class);
}
private String newGroupName;
private ActivityGroup newActivityGroup;
MakeActivityGroup(WKFObject focusedObject, Vector<WKFObject> globalSelection, FlexoEditor editor) {
super(actionType, focusedObject, globalSelection, editor);
}
@Override
protected void doAction(Object context) throws FlexoException {
Vector<PetriGraphNode> nodesToGroup = getAllActivityLevelNodes(getFocusedObject(), getGlobalSelection());
/*System.out.println("Make activity group");
System.out.println("focused = "+getFocusedObject());
System.out.println("global selection = "+getGlobalSelection());
System.out.println("nodesToGroup="+nodesToGroup);*/
if (nodesToGroup.size() == 0) {
logger.warning("Sorry, no nodes to group");
} else {
if (nodesToGroup.firstElement().getParentPetriGraph() instanceof ActivityPetriGraph) {
FlexoPetriGraph pg = nodesToGroup.firstElement().getParentPetriGraph();
newActivityGroup = new ActivityGroup(getFocusedObject().getProcess(), nodesToGroup);
// TODO: following must be put in finalizer of MakeActivityGroup action
newActivityGroup.setX(nodesToGroup.firstElement().getX("bpe"), "collabsed_" + "bpe");
newActivityGroup.setY(nodesToGroup.firstElement().getY("bpe"), "collabsed_" + "bpe");
newActivityGroup.setGroupName(getNewGroupName());
pg.addToGroups(newActivityGroup);
}
}
}
public String getNewGroupName() {
return newGroupName;
}
public void setNewGroupName(String newGroupName) {
this.newGroupName = newGroupName;
}
public ActivityGroup getNewActivityGroup() {
return newActivityGroup;
}
protected static Vector<PetriGraphNode> getAllActivityLevelNodes(WKFObject focusedObject, Vector<WKFObject> globalSelection) {
Vector<PetriGraphNode> returned = new Vector<PetriGraphNode>();
Vector<WKFObject> allObjects = new Vector<WKFObject>(globalSelection != null ? globalSelection : new Vector<WKFObject>());
if (!allObjects.contains(focusedObject)) {
allObjects.add(focusedObject);
}
ActivityPetriGraph pg = null;
for (WKFObject o : allObjects) {
// GPO: Throttle here to enable WKFGroup on the root petri graph only
pg = o.getProcess().getActivityPetriGraph();
if (o instanceof PetriGraphNode && !((PetriGraphNode) o).isGrouped()
&& ((PetriGraphNode) o).getParentPetriGraph() instanceof ActivityPetriGraph
&& (pg == null || ((PetriGraphNode) o).getParentPetriGraph() == pg)) {
returned.add((PetriGraphNode) o);
if (pg == null) {
pg = (ActivityPetriGraph) ((PetriGraphNode) o).getParentPetriGraph();
}
}
}
return returned;
}
}