package pl.net.bluesoft.rnd.processtool.ui.buttons.dialog; import com.vaadin.data.Item; import com.vaadin.data.util.BeanItem; import com.vaadin.terminal.Sizeable; import com.vaadin.ui.*; import org.aperteworkflow.util.vaadin.VaadinUtility; import pl.net.bluesoft.rnd.processtool.model.processdata.ProcessComment; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * User: POlszewski * Date: 2012-02-20 * Time: 09:25 */ public class AddCommentDialog extends DialogWindow { protected ProcessComment processComment; protected Form form; protected Button addButton; protected Button cancelButton; public interface AddCommentListener { void onCommentAdded(); } private Set<AddCommentListener> addCommentListeners = new HashSet<AddCommentListener>(); public AddCommentDialog(ProcessComment processComment) { this.processComment = processComment; } public void addListener(AddCommentListener listener) { addCommentListeners.add(listener); } @Override protected String getTitle() { return getMessage("processdata.comments.comment.add.title"); } @Override protected AbstractOrderedLayout createContent() { VerticalLayout vl = new VerticalLayout(); vl.setMargin(true); vl.setWidth(600, Sizeable.UNITS_PIXELS); vl.addComponent(new Label(getHelpContents(), Label.CONTENT_XHTML)); vl.addComponent(form = getCommentDetailsForm()); return vl; } @Override protected Button[] createActionButtons() { return new Button[] { addButton = createConfirmButton(), cancelButton = createActionButton(getCancelButtonCaption()) }; } protected Form getCommentDetailsForm() { BeanItem<ProcessComment> bi = new BeanItem<ProcessComment>(processComment = new ProcessComment()); Form f = new Form(); f.setWriteThrough(false); f.setInvalidCommitted(false); f.setFormFieldFactory(new DefaultFieldFactory() { @Override public Field createField(Item item, Object propertyId, Component uiContext) { if ("body".equals(propertyId)) { RichTextArea rta = new RichTextArea(); rta.setRequired(true); rta.setNullRepresentation(""); rta.setWidth(400, Sizeable.UNITS_PIXELS); setupCommentField(propertyId, rta); return rta; } return null; } }); f.setItemDataSource(bi); f.setVisibleItemProperties(Arrays.asList("body")); f.setWidth(600, Sizeable.UNITS_PIXELS); return f; } protected Button createConfirmButton() { return VaadinUtility.button(getConfirmButtonCaption(), null, "default", new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { if (form.isValid()) { form.commit(); closeWindow(); handleAddComment(); } else { StringBuilder sb = new StringBuilder("<ul>"); for (Object propertyId : form.getItemPropertyIds()) { Field field = form.getField(propertyId); if (!field.isValid() && field.isRequired()) { sb.append("<li>").append(field.getRequiredError()).append("</li>"); } } sb.append("</ul>"); VaadinUtility.validationNotification(getApplication(), i18NSource, sb.toString()); } } }); } protected void handleAddComment() { for (AddCommentListener listener : addCommentListeners) { listener.onCommentAdded(); } } protected void setupCommentField(Object propertyId, RichTextArea rta) { rta.setRequiredError(getMessage("processdata.comments.comment.body.required")); rta.setCaption(getMessage("processdata.comments.comment.form." + propertyId)); rta.focus(); } protected String getHelpContents() { return getMessage("process.comments.edit.help"); } protected String getConfirmButtonCaption() { return getMessage("button.ok"); } protected String getCancelButtonCaption() { return getMessage("button.cancel"); } public ProcessComment getProcessComment() { return processComment; } public Button getAddButton() { return addButton; } public Button getCancelButton() { return cancelButton; } }