package au.com.vaadinutils.editors; import java.util.Iterator; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.event.ShortcutAction.KeyCode; import com.vaadin.shared.ui.MarginInfo; import com.vaadin.ui.AbstractLayout; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Component; import com.vaadin.ui.Field; import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import au.com.vaadinutils.errorHandling.ErrorWindow; @SuppressWarnings("serial") public class InputFormDialog extends Window { Logger logger = LogManager.getLogger(); private HorizontalLayout buttons; private Button cancelButton; private Button ok; public InputFormDialog(final UI parent, String title, Component primaryFocusField, final AbstractLayout form, final InputFormDialogRecipient recipient) { setCaption(title); setModal(true); this.setClosable(false); this.setResizable(false); VerticalLayout layout = new VerticalLayout(); layout.setMargin(new MarginInfo(false, true, true, true)); layout.setSpacing(true); layout.addComponent(form); buttons = new HorizontalLayout(); buttons.setSpacing(true); buttons.setHeight("30"); cancelButton = createCancelButton(recipient); buttons.addComponent(cancelButton); ok = createOkButton(form, recipient); ok.setId("Ok"); ok.setClickShortcut(KeyCode.ENTER); ok.addStyleName("default"); buttons.addComponent(ok); layout.addComponent(buttons); layout.setComponentAlignment(buttons, Alignment.MIDDLE_RIGHT); layout.setExpandRatio(form, 1); this.setContent(layout); parent.addWindow(this); if (primaryFocusField instanceof Field<?>) { ((Field<?>) primaryFocusField).focus(); } if (form instanceof FormLayout) { setWidth("500"); } } private Button createOkButton(final AbstractLayout form, final InputFormDialogRecipient recipient) { return new Button("OK", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { try { Iterator<Component> itr = form.iterator(); while (itr.hasNext()) { Component comp = itr.next(); if (comp instanceof Field<?>) { Field<?> field = (Field<?>) comp; field.validate(); } } if (recipient.onOK()) { close(); } } catch (InvalidValueException e) { Notification.show(e.getMessage(), Type.ERROR_MESSAGE); } catch (Exception e) { ErrorWindow.showErrorWindow(e); } } }); } private Button createCancelButton(final InputFormDialogRecipient recipient) { return new Button("Cancel", new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { if (recipient.onCancel()) { close(); } } }); } public void okOnly() { buttons.removeComponent(cancelButton); } public void setButtonsSpacing(boolean spacing) { buttons.setSpacing(spacing); } public void setOkButtonLabel(String label) { ok.setCaption(label); } public void setCancelButtonLabel(String label) { cancelButton.setCaption(label); } public void showOkButton(boolean show) { ok.setVisible(show); } }