/* 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.
*/
package org.activiti.explorer.ui.form;
import java.util.List;
import java.util.Map;
import org.activiti.engine.FormService;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.form.FormProperty;
import org.activiti.explorer.ExplorerApp;
import org.activiti.explorer.I18nManager;
import org.activiti.explorer.ui.mainlayout.ExplorerLayout;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
/**
* Form that renders form-properties and allows posting the filled in value. Performs
* validation as well. Exposes {@link FormPropertiesEvent}s which allow listening for
* submission and cancellation of the form.
*
* @author Frederik Heremans
*/
public class FormPropertiesForm extends VerticalLayout {
private static final long serialVersionUID = -3197331726904715949L;
// Services
protected FormService formService;
protected I18nManager i18nManager;
// UI
protected Label formTitle;
protected Button submitFormButton;
protected Button cancelFormButton;
protected FormPropertiesComponent formPropertiesComponent;
public FormPropertiesForm() {
super();
formService = ProcessEngines.getDefaultProcessEngine().getFormService();
i18nManager = ExplorerApp.get().getI18nManager();
addStyleName(ExplorerLayout.STYLE_DETAIL_BLOCK);
addStyleName(ExplorerLayout.STYLE_FORM_PROPERTIES);
initTitle();
initFormPropertiesComponent();
initButtons();
initListeners();
}
public void setFormProperties(List<FormProperty> formProperties) {
// Component will refresh it's components based on the passed properties
formPropertiesComponent.setFormProperties(formProperties);
}
public void setSubmitButtonCaption(String caption) {
submitFormButton.setCaption(caption);
}
public void setCancelButtonCaption(String caption) {
cancelFormButton.setCaption(caption);
}
public void setFormHelp(String caption) {
formTitle.setValue(caption);
formTitle.setVisible(caption != null);
}
/**
* Clear all (writable) values in the form.
*/
public void clear() {
formPropertiesComponent.setFormProperties(formPropertiesComponent.getFormProperties());
}
protected void initTitle() {
formTitle = new Label();
formTitle.addStyleName(ExplorerLayout.STYLE_H4);
formTitle.setVisible(false);
addComponent(formTitle);
}
protected void initButtons() {
submitFormButton = new Button();
cancelFormButton = new Button();
HorizontalLayout buttons = new HorizontalLayout();
buttons.setSpacing(true);
buttons.setWidth(100, UNITS_PERCENTAGE);
buttons.addStyleName(ExplorerLayout.STYLE_DETAIL_BLOCK);
buttons.addComponent(submitFormButton);
buttons.setComponentAlignment(submitFormButton, Alignment.BOTTOM_RIGHT);
buttons.addComponent(cancelFormButton);
buttons.setComponentAlignment(cancelFormButton, Alignment.BOTTOM_RIGHT);
Label buttonSpacer = new Label();
buttons.addComponent(buttonSpacer);
buttons.setExpandRatio(buttonSpacer, 1.0f);
addComponent(buttons);
}
protected void initFormPropertiesComponent() {
formPropertiesComponent = new FormPropertiesComponent();
addComponent(formPropertiesComponent);
}
protected void initListeners() {
submitFormButton.addListener(new ClickListener() {
private static final long serialVersionUID = -6091586145870618870L;
public void buttonClick(ClickEvent event) {
// Extract the submitted values from the form. Throws exception when validation fails.
try {
Map<String, String> formProperties = formPropertiesComponent.getFormPropertyValues();
fireEvent(new FormPropertiesEvent(FormPropertiesForm.this, FormPropertiesEvent.TYPE_SUBMIT, formProperties));
submitFormButton.setComponentError(null);
} catch(InvalidValueException ive) {
// Error is presented to user by the form component
}
}
});
cancelFormButton.addListener(new ClickListener() {
private static final long serialVersionUID = -8980500491522472381L;
public void buttonClick(ClickEvent event) {
fireEvent(new FormPropertiesEvent(FormPropertiesForm.this, FormPropertiesEvent.TYPE_CANCEL));
submitFormButton.setComponentError(null);
}
});
}
protected void addEmptySpace(ComponentContainer container) {
Label emptySpace = new Label(" ", Label.CONTENT_XHTML);
emptySpace.setSizeUndefined();
container.addComponent(emptySpace);
}
/**
* Event indicating a form has been submitted or cancelled. When submitted,
* the values of the form-properties are available.
*
* @author Frederik Heremans
*/
public class FormPropertiesEvent extends Event {
private static final long serialVersionUID = -410814526942034125L;
public static final String TYPE_SUBMIT = "SUBMIT";
public static final String TYPE_CANCEL = "CANCEL";
private String type;
private Map<String, String> formProperties;
public FormPropertiesEvent(Component source, String type) {
super(source);
this.type = type;
}
public FormPropertiesEvent(Component source, String type, Map<String, String> formProperties) {
this(source, type);
this.formProperties = formProperties;
}
public String getType() {
return type;
}
public Map<String, String> getFormProperties() {
return formProperties;
}
}
}