package org.openflexo.wkf.controller.action;
import java.awt.Color;
import java.util.EventObject;
import java.util.List;
import java.util.logging.Logger;
import org.openflexo.components.AskParametersDialog;
import org.openflexo.foundation.action.FlexoActionInitializer;
import org.openflexo.foundation.action.FlexoActionType;
import org.openflexo.foundation.param.ColorParameter;
import org.openflexo.foundation.param.DynamicDropDownParameter;
import org.openflexo.foundation.param.ParameterDefinition;
import org.openflexo.foundation.param.RadioButtonListParameter;
import org.openflexo.foundation.param.TextAreaParameter;
import org.openflexo.foundation.param.TextFieldParameter;
import org.openflexo.foundation.wkf.FlexoWorkflow;
import org.openflexo.foundation.wkf.Role;
import org.openflexo.foundation.wkf.action.AddRole;
import org.openflexo.foundation.wkf.action.AddToXRole;
import org.openflexo.foundation.wkf.node.AbstractActivityNode;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.view.controller.ActionInitializer;
import org.openflexo.view.controller.ControllerActionInitializer;
public abstract class AddToXRoleInitializer<A extends AddToXRole<A>> extends
ActionInitializer<A, AbstractActivityNode, AbstractActivityNode> {
private static final Logger logger = Logger.getLogger(ControllerActionInitializer.class.getPackage().getName());
AddToXRoleInitializer(FlexoActionType<A, AbstractActivityNode, AbstractActivityNode> actionType,
WKFControllerActionInitializer actionInitializer) {
super(actionType, actionInitializer);
}
@Override
protected WKFControllerActionInitializer getControllerActionInitializer() {
return (WKFControllerActionInitializer) super.getControllerActionInitializer();
}
@Override
protected FlexoActionInitializer<A> getDefaultInitializer() {
return new FlexoActionInitializer<A>() {
@Override
public boolean run(EventObject e, A action) {
String EXISTING = FlexoLocalization.localizedForKey("existing_role");
String NEW = FlexoLocalization.localizedForKey("new_role");
FlexoWorkflow workflow = action.getFocusedObject().getWorkflow();
List<Role> availableRoles = getAvailableRoles(action.getFocusedObject());
boolean hasRoles = availableRoles.size() > 0;
Role selectedValue = hasRoles ? availableRoles.get(0) : null;
ParameterDefinition[] parameters = new ParameterDefinition[5];
parameters[0] = new RadioButtonListParameter<String>("select", "select_existing_new_role", hasRoles ? EXISTING : NEW,
EXISTING, NEW);
DynamicDropDownParameter<Role> availableRolesParameter = new DynamicDropDownParameter<Role>("role", "role", availableRoles,
selectedValue);
availableRolesParameter.setShowReset(false);
availableRolesParameter.setStringFormatter("nameForInspector");
parameters[1] = availableRolesParameter;
parameters[1].setDepends("select");
parameters[1].setConditional("select=\"" + EXISTING + "\"");
if (!hasRoles) {
parameters[0].setConditional("true=false");
parameters[1].setConditional("true=false");
}
parameters[2] = new TextFieldParameter("newRoleName", "name", workflow.getRoleList().getNextNewUserRoleName());
parameters[2].setDepends("select");
parameters[2].setConditional("select=\"" + NEW + "\"");
parameters[3] = new ColorParameter("color", "color", workflow.getRoleList().getNewRoleColor());
parameters[3].setDepends("select");
parameters[3].setConditional("select=\"" + NEW + "\"");
parameters[4] = new TextAreaParameter("description", "description", "");
parameters[4].addParameter("columns", "20");
parameters[4].setDepends("select");
parameters[4].setConditional("select=\"" + NEW + "\"");
AskParametersDialog dialog = AskParametersDialog.createAskParametersDialog(getProject(), null,
FlexoLocalization.localizedForKey("select_role"), FlexoLocalization.localizedForKey("select_role"), parameters);
if (dialog.getStatus() == AskParametersDialog.VALIDATE) {
Role role = null;
String choice = (String) dialog.parameterValueWithName("select");
if (EXISTING.equals(choice)) {
role = (Role) dialog.parameterValueWithName("role");
} else if (NEW.equals(choice)) {
AddRole addRole = AddRole.actionType.makeNewAction(workflow, null, getEditor());
String newRoleName = (String) dialog.parameterValueWithName("newRoleName");
if (newRoleName == null) {
return false;
}
addRole.setNewRoleName(newRoleName);
addRole.setNewColor((Color) dialog.parameterValueWithName("color"));
addRole.setNewDescription((String) dialog.parameterValueWithName("description"));
addRole.setRoleAutomaticallyCreated(true);
addRole.doAction();
role = addRole.getNewRole();
} else {
return false;
}
action.setRole(role);
return role != null;
} else {
return false;
}
}
};
}
public abstract List<Role> getAvailableRoles(AbstractActivityNode activity);
}