package org.aperteworkflow.editor.stepeditor;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.event.ShortcutAction;
import com.vaadin.terminal.ParameterHandler;
import com.vaadin.ui.*;
import org.aperteworkflow.editor.stepeditor.auto.AutoStepEditorWindow;
import org.aperteworkflow.editor.stepeditor.user.UserStepEditorWindow;
import org.aperteworkflow.editor.vaadin.GenericEditorApplication;
import pl.net.bluesoft.rnd.processtool.plugins.ProcessToolRegistry;
import pl.net.bluesoft.rnd.processtool.steps.ProcessToolProcessStep;
import pl.net.bluesoft.rnd.processtool.ui.widgets.annotations.AliasName;
import pl.net.bluesoft.rnd.util.i18n.I18NSource;
import pl.net.bluesoft.util.lang.Classes;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class StepEditorApplication extends GenericEditorApplication implements ParameterHandler {
private static final long serialVersionUID = 2136349026207825108L;
private static final String TASKTYPE_USER = "User";
private Window mainWindow;
private JavaScriptHelper jsHelper;
private String url;
private String stepName;
public Window getMainWindow() {
return mainWindow;
}
public JavaScriptHelper getJsHelper() {
return jsHelper;
}
@Override
public void handleParameters(Map<String, String[]> parameters) {
if (parameters == null || parameters.size() == 0) {
// No parameters to handle, we are not interested in such a request
// it may be a request for static resource e.g. <servlet>/APP/323/root.gif
return;
}
String stepType = getStringParameterByName("stepType", parameters);
if (stepType == null) {
// No stepType in request, we have nothing to refresh
return;
}
String jsonConfig = getStringParameterByName("stepConfig", parameters);
stepName = getStringParameterByName("stepName", parameters);
url = getStringParameterByName("callbackUrl", parameters);
refresh(stepName, stepType, jsonConfig);
}
private void refresh(String stepName, String stepType, String jsonConfig) {
AbstractStepEditorWindow stepEditorWindow;
if (TASKTYPE_USER.equals(stepType)) {
stepEditorWindow = new UserStepEditorWindow(this, jsonConfig, url, stepName, stepType);
} else {
stepEditorWindow = new AutoStepEditorWindow(this, jsonConfig, url, stepName, stepType);
}
ComponentContainer window = stepEditorWindow.init();
ComponentContainer header = buildHeader(stepEditorWindow, stepType);
refreshWindow(header, window);
}
public Label getHeaderLabel() {
I18NSource messages = I18NSource.ThreadUtil.getThreadI18nSource();
Label headerLabel = new Label();
if (stepName != null && !stepName.isEmpty()) {
headerLabel.setValue(messages.getMessage("userStep.stepName", new Object[] { stepName }));
} else {
headerLabel.setValue(messages.getMessage("userStep.noStepName"));
}
headerLabel.addStyleName("h1");
return headerLabel;
}
private ComponentContainer buildHeader(final AbstractStepEditorWindow sew, String stepType) {
Component label = getHeaderLabel();
Select stepList = prepareStepList(stepType);
Button saveButton = new Button(I18NSource.ThreadUtil.getThreadI18nSource().getMessage("jse.button.save"), new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
sew.save();
}
});
saveButton.setClickShortcut(ShortcutAction.KeyCode.S,
ShortcutAction.ModifierKey.CTRL
);
saveButton.setDescription("Ctrl-S");
HorizontalLayout headerLayout = new HorizontalLayout();
headerLayout.setSpacing(true);
headerLayout.setWidth("100%");
headerLayout.addComponent(label);
headerLayout.addComponent(saveButton);
headerLayout.addComponent(stepList);
headerLayout.setExpandRatio(label, 1.0f);
headerLayout.setComponentAlignment(saveButton, Alignment.TOP_RIGHT);
headerLayout.setComponentAlignment(stepList, Alignment.TOP_RIGHT);
return headerLayout;
}
private void refreshWindow(ComponentContainer header, ComponentContainer windowContainer) {
mainWindow.removeAllComponents();
VerticalLayout main = new VerticalLayout();
main.setMargin(true);
main.setSpacing(true);
main.addComponent(header);
main.addComponent(windowContainer);
mainWindow.setContent(main);
}
private Select prepareStepList(String stepType) {
final Select stepList = new Select();
stepList.setNullSelectionAllowed(false);
stepList.setImmediate(true);
stepList.setWidth("250px");
// method-level class used for sorting
class Item implements Comparable<Item> {
public String name;
public String caption;
public Item(String name, String caption) {
this.name = name;
this.caption = caption;
}
@Override
public int compareTo(Item o) {
return caption.compareTo(o.caption);
}
}
List<Item> items = new LinkedList<Item>();
// add User tasktype
items.add(new Item("User","User"));
// other tasks
Map<String,ProcessToolProcessStep> availableSteps = getRegistry().getAvailableSteps();
for (ProcessToolProcessStep stepInstance : availableSteps.values()) {
Class stepClass = stepInstance.getClass();
AliasName a = Classes.getClassAnnotation(stepClass, AliasName.class);
items.add(new Item(a.name(),a.name()));
}
Collections.sort(items);
for (Item item:items){
stepList.addItem(item.name);
stepList.setItemCaption(item.name, item.caption);
}
stepList.setValue(stepType);
stepList.addListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
String sn = (String) stepList.getValue();
refresh(stepName, sn, null);
}
});
return stepList;
}
@Override
public void init() {
super.init();
mainWindow = new Window(I18NSource.ThreadUtil.getThreadI18nSource().getMessage("application.title"));
mainWindow.addParameterHandler(this);
jsHelper = new JavaScriptHelper(mainWindow);
jsHelper.preventWindowClosing();
setMainWindow(mainWindow);
}
}