se.streamsource.streamflow.client.ui.administration.surface.AccessPointView.java Source code

Java tutorial

Introduction

Here is the source code for se.streamsource.streamflow.client.ui.administration.surface.AccessPointView.java

Source

/**
 *
 * Copyright 2009-2014 Jayway Products AB
 *
 * 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 se.streamsource.streamflow.client.ui.administration.surface;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.Sizes;
import org.jdesktop.application.Action;
import org.jdesktop.application.ApplicationContext;
import org.jdesktop.application.Task;
import org.jdesktop.swingx.util.WindowUtils;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
import org.qi4j.api.object.ObjectBuilderFactory;
import org.qi4j.api.structure.Module;
import se.streamsource.streamflow.api.administration.form.RequiredSignatureValue;
import se.streamsource.streamflow.client.Icons;
import se.streamsource.streamflow.client.MacOsUIWrapper;
import se.streamsource.streamflow.client.ui.administration.AdministrationResources;
import se.streamsource.streamflow.client.ui.administration.AdministrationView;
import se.streamsource.streamflow.client.ui.workspace.WorkspaceResources;
import se.streamsource.streamflow.client.ui.workspace.cases.general.CaseLabelsView;
import se.streamsource.streamflow.client.ui.workspace.cases.general.RemovableLabel;
import se.streamsource.streamflow.client.util.*;
import se.streamsource.streamflow.client.util.dialog.DialogService;
import se.streamsource.streamflow.client.util.dialog.SelectLinkDialog;
import se.streamsource.streamflow.infrastructure.event.domain.TransactionDomainEvents;
import se.streamsource.streamflow.infrastructure.event.domain.source.TransactionListener;
import se.streamsource.streamflow.infrastructure.event.domain.source.helper.Events;
import se.streamsource.streamflow.util.Strings;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;

import static se.streamsource.streamflow.client.util.i18n.*;

public class AccessPointView extends JPanel implements Refreshable, TransactionListener {
    @Service
    DialogService dialogs;

    @Structure
    Module module;

    @Structure
    ObjectBuilderFactory obf;

    private CaseLabelsView labels;
    private JLabel selectedCaseType = new JLabel();
    private StreamflowButton caseTypeButton;
    private StreamflowButton labelButton;
    private StreamflowButton projectButton;
    private JLabel selectedProject = new JLabel();
    private StreamflowButton formButton;
    private StreamflowButton replaceSelectionFieldValueEditButton;
    private JLabel selectedForm = new JLabel();

    private JLabel mailSelectionLabel = new JLabel();
    private JTextField mailSelectionField = new JTextField();

    private StreamflowButton templateButton;
    private RemovableLabel selectedTemplate = new RemovableLabel();

    private JCheckBox signActive1;
    private JTextField signName1;
    private JTextField signDescription1;

    private JCheckBox signActive2;
    private JTextField signName2;
    private JTextField signDescription2;
    private StreamflowButton form2Button;
    private JLabel selectedForm2;
    private JCheckBox mandatory2;
    private JTextField formQuestion2;

    private JList emailTemplateList = new JList();
    private JTextArea emailTemplateText = new JTextArea();
    private JTextField subject;

    private JTextField cookieExpiration = new JTextField();

    private AccessPointModel model;

    private ActionBinder actionBinder;
    private ValueBinder valueBinder;

    public AccessPointView(@Service ApplicationContext appContext, @Uses final AccessPointModel model,
            @Structure Module module) {
        this.model = model;
        this.labels = module.objectBuilderFactory().newObjectBuilder(CaseLabelsView.class)
                .use(model.getLabelsModel()).newInstance();

        setLayout(new BorderLayout());
        setActionMap(appContext.getActionMap(this));

        RefreshComponents refreshComponents = new RefreshComponents();
        model.addObserver(refreshComponents);

        actionBinder = module.objectBuilderFactory().newObjectBuilder(ActionBinder.class).use(getActionMap())
                .newInstance();
        valueBinder = module.objectBuilderFactory().newObject(ValueBinder.class);
        actionBinder.setResourceMap(appContext.getResourceMap(getClass()));
        LinkValueConverter linkValueConverter = new LinkValueConverter();

        FormLayout layout = new FormLayout("90dlu, 5dlu, 150:grow",
                "pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, "
                        + "pref, 12dlu, pref, 2dlu, pref, 12dlu, pref, 2dlu, default:grow");

        JPanel panel = new JPanel(layout);
        DefaultFormBuilder builder = new DefaultFormBuilder(layout, panel);
        builder.setBorder(Borders.createEmptyBorder(Sizes.DLUY8, Sizes.DLUX4, Sizes.DLUY2, Sizes.DLUX8));

        CellConstraints cc = new CellConstraints();

        MacOsUIWrapper.convertAccelerators(appContext.getActionMap(AccessPointView.class, this));

        selectedProject.setFont(selectedProject.getFont().deriveFont(Font.BOLD));

        selectedCaseType.setFont(selectedCaseType.getFont().deriveFont(Font.BOLD));

        selectedForm.setFont(selectedForm.getFont().deriveFont(Font.BOLD));

        selectedTemplate.getLabel().setFont(selectedTemplate.getLabel().getFont().deriveFont(Font.BOLD));

        ActionMap am = getActionMap();

        // Select project
        javax.swing.Action projectAction = am.get("project");
        projectButton = new StreamflowButton(projectAction);
        projectButton.registerKeyboardAction(projectAction,
                (KeyStroke) projectAction.getValue(javax.swing.Action.ACCELERATOR_KEY),
                JComponent.WHEN_IN_FOCUSED_WINDOW);
        projectButton.setHorizontalAlignment(SwingConstants.LEFT);

        builder.add(projectButton, cc.xy(1, 1));

        builder.add(valueBinder.bind("project", selectedProject, linkValueConverter), new CellConstraints(3, 1, 1,
                1, CellConstraints.LEFT, CellConstraints.CENTER, new Insets(5, 0, 0, 0)));

        // Select case type
        javax.swing.Action caseTypeAction = am.get("casetype");
        caseTypeButton = new StreamflowButton(caseTypeAction);
        caseTypeButton.registerKeyboardAction(caseTypeAction,
                (KeyStroke) caseTypeAction.getValue(javax.swing.Action.ACCELERATOR_KEY),
                JComponent.WHEN_IN_FOCUSED_WINDOW);
        caseTypeButton.setHorizontalAlignment(SwingConstants.LEFT);

        builder.add(caseTypeButton, cc.xy(1, 3));

        builder.add(valueBinder.bind("caseType", selectedCaseType, linkValueConverter), new CellConstraints(3, 3, 1,
                1, CellConstraints.LEFT, CellConstraints.CENTER, new Insets(5, 0, 0, 0)));

        // Select labels
        javax.swing.Action labelAction = labels.getActionMap().get("addLabel");
        labelButton = new StreamflowButton(labelAction);

        labelButton.registerKeyboardAction(labelAction,
                (KeyStroke) labelAction.getValue(javax.swing.Action.ACCELERATOR_KEY),
                JComponent.WHEN_IN_FOCUSED_WINDOW);

        labelButton.setHorizontalAlignment(SwingConstants.LEFT);

        builder.add(labelButton, cc.xy(1, 5, CellConstraints.FILL, CellConstraints.TOP));

        labels.setPreferredSize(new Dimension(500, 60));
        labels.setTextBold(true);
        labels.setButtonRelation(labelButton);
        builder.add(labels,
                new CellConstraints(3, 5, 1, 1, CellConstraints.LEFT, CellConstraints.TOP, new Insets(5, 0, 0, 0)));

        // Select form
        javax.swing.Action formAction = am.get("form");
        formButton = new StreamflowButton(formAction);

        formButton.registerKeyboardAction(formAction,
                (KeyStroke) formAction.getValue(javax.swing.Action.ACCELERATOR_KEY),
                JComponent.WHEN_IN_FOCUSED_WINDOW);

        formButton.setHorizontalAlignment(SwingConstants.LEFT);

        builder.add(formButton, cc.xy(1, 7, CellConstraints.FILL, CellConstraints.TOP));

        // Open replace selection field value editor
        javax.swing.Action replaceSelectionFieldValueAction = am.get("openReplaceSelectionFieldValueEditor");
        replaceSelectionFieldValueEditButton = new StreamflowButton(replaceSelectionFieldValueAction);

        /*replaceSelectionFieldValueEditButton.registerKeyboardAction( replaceSelectionFieldValueAction, (KeyStroke) replaceSelectionFieldValueAction
           .getValue( javax.swing.Action.ACCELERATOR_KEY ),
           JComponent.WHEN_IN_FOCUSED_WINDOW ); */

        replaceSelectionFieldValueEditButton.setHorizontalAlignment(SwingConstants.RIGHT);
        PanelBuilder panelBuilder = new PanelBuilder(new FormLayout("150dlu,5dlu,250:grow", "pref"));
        panelBuilder.add(valueBinder.bind("form", selectedForm, linkValueConverter));
        panelBuilder.nextColumn(2);
        panelBuilder.add(replaceSelectionFieldValueEditButton, new CellConstraints(3, 1, 1, 1,
                CellConstraints.RIGHT, CellConstraints.CENTER, new Insets(0, 0, 0, 0)));
        //panelBuilder.setBorder(BorderFactory.createLineBorder(Color.RED));

        builder.add(panelBuilder.getPanel()/*valueBinder.bind( "form", selectedForm, linkValueConverter )*/,
                new CellConstraints(3, 7, 1, 1, CellConstraints.LEFT, CellConstraints.CENTER,
                        new Insets(5, 0, 0, 0)));

        // Select template
        javax.swing.Action templateAction = am.get("template");
        templateButton = new StreamflowButton(templateAction);

        templateButton.registerKeyboardAction(templateAction,
                (KeyStroke) templateAction.getValue(javax.swing.Action.ACCELERATOR_KEY),
                JComponent.WHEN_IN_FOCUSED_WINDOW);

        templateButton.setHorizontalAlignment(SwingConstants.LEFT);

        builder.add(templateButton, cc.xy(1, 9, CellConstraints.FILL, CellConstraints.TOP));

        builder.add(valueBinder.bind("template", actionBinder.bind("removeTemplate", selectedTemplate)),
                new CellConstraints(3, 9, 1, 1, CellConstraints.LEFT, CellConstraints.CENTER,
                        new Insets(3, 0, 0, 0)));

        builder.add(new JLabel(text(AdministrationResources.cookieExpirationHours)),
                cc.xy(1, 13, CellConstraints.LEFT, CellConstraints.BOTTOM));
        builder.add(
                valueBinder.bind("cookieExpirationHours",
                        actionBinder.bind("changeCookieExpirationHours", cookieExpiration = new JTextField())),
                new CellConstraints(3, 13, 1, 1, CellConstraints.FILL, CellConstraints.BOTTOM,
                        new Insets(3, 0, 0, 0)));

        mailSelectionLabel.setText(text(AdministrationResources.changeMailSelectionMessage));
        mailSelectionLabel.setToolTipText(text(AdministrationResources.changeMailSelectionMessageHint));
        builder.add(mailSelectionLabel, cc.xy(1, 15, CellConstraints.LEFT, CellConstraints.BOTTOM));

        builder.add(
                valueBinder.bind("mailSelectionMessage",
                        actionBinder.bind("changeMailSelectionMessage", mailSelectionField)),
                new CellConstraints(3, 15, 1, 1, CellConstraints.FILL, CellConstraints.BOTTOM,
                        new Insets(3, 0, 0, 0)));

        PanelBuilder signPanel = new PanelBuilder(new FormLayout("180dlu, 15dlu, 180dlu", "default:grow"));
        CellConstraints signPanelCc = new CellConstraints();

        PanelBuilder primarySignPanel = new PanelBuilder(new FormLayout("180dlu",
                "pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, default:grow"));
        CellConstraints primaryCc = new CellConstraints();

        primarySignPanel.addSeparator(text(AdministrationResources.signature_1), primaryCc.xy(1, 1));

        primarySignPanel.add(valueBinder.bind("primarysign",
                actionBinder.bind("setSignActive1",
                        signActive1 = new JCheckBox(text(AdministrationResources.active))),
                new ValueBinder.Converter<RequiredSignatureValue, Boolean>() {
                    public Boolean toComponent(RequiredSignatureValue value) {
                        return value != null ? value.active().get() : Boolean.FALSE;
                    }
                }), primaryCc.xy(1, 3));

        primarySignPanel.addLabel(text(AdministrationResources.name_label), primaryCc.xy(1, 5));

        primarySignPanel.add(
                valueBinder.bind("primarysign", actionBinder.bind("setSignName1", signName1 = new JTextField()),
                        new ValueBinder.Converter<RequiredSignatureValue, String>() {
                            public String toComponent(RequiredSignatureValue value) {
                                return value != null ? value.name().get() : "";
                            }
                        }),
                primaryCc.xy(1, 7));
        refreshComponents.enabledOn("updateprimarysign", signName1);

        primarySignPanel.add(new JLabel(text(AdministrationResources.description_label)), primaryCc.xy(1, 9));

        primarySignPanel.add(valueBinder.bind("primarysign",
                actionBinder.bind("setSignDescription1", signDescription1 = new JTextField()),
                new ValueBinder.Converter<RequiredSignatureValue, String>() {
                    public String toComponent(RequiredSignatureValue value) {
                        return value != null ? value.description().get() : "";
                    }
                }), primaryCc.xy(1, 11));
        refreshComponents.enabledOn("updateprimarysign", signDescription1);

        signPanel.add(primarySignPanel.getPanel(), signPanelCc.xy(1, 1, CellConstraints.LEFT, CellConstraints.TOP));

        PanelBuilder secondarySignPanel = new PanelBuilder(new FormLayout("180dlu",
                "pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 2dlu, pref, 12dlu, pref, 2dlu, pref, 2dlu, default:grow"));

        CellConstraints secondaryCc = new CellConstraints();

        secondarySignPanel.addSeparator(text(AdministrationResources.signature_2), secondaryCc.xy(1, 1));

        PanelBuilder secondaryOptionsPanel = new PanelBuilder(new FormLayout("70dlu,5dlu,70dlu,pref:grow", "pref"));
        secondaryOptionsPanel.add(valueBinder.bind("secondarysign",
                actionBinder.bind("setSignActive2",
                        signActive2 = new JCheckBox(text(AdministrationResources.active))),
                new ValueBinder.Converter<RequiredSignatureValue, Boolean>() {
                    public Boolean toComponent(RequiredSignatureValue value) {
                        return value != null ? value.active().get() : Boolean.FALSE;
                    }
                }), secondaryCc.xy(1, 1));
        refreshComponents.enabledOn("updatesecondarysignactive", signActive2);

        secondaryOptionsPanel.add(valueBinder.bind("secondarysign",
                actionBinder.bind("setSecondMandatory",
                        mandatory2 = new JCheckBox(text(AdministrationResources.mandatory))),
                new ValueBinder.Converter<RequiredSignatureValue, Boolean>() {
                    public Boolean toComponent(RequiredSignatureValue value) {
                        return value != null ? value.mandatory().get() : Boolean.FALSE;
                    }
                }), secondaryCc.xy(3, 1));
        refreshComponents.enabledOn("updatesecondarysign", mandatory2);

        secondarySignPanel.add(secondaryOptionsPanel.getPanel(), secondaryCc.xy(1, 3));

        secondarySignPanel.add(new JLabel(text(AdministrationResources.name_label)), secondaryCc.xy(1, 5));

        secondarySignPanel.add(
                valueBinder.bind("secondarysign", actionBinder.bind("setSignName2", signName2 = new JTextField()),
                        new ValueBinder.Converter<RequiredSignatureValue, String>() {
                            public String toComponent(RequiredSignatureValue value) {
                                return value != null ? value.name().get() : "";
                            }
                        }),
                secondaryCc.xy(1, 7));
        refreshComponents.enabledOn("updatesecondarysign", signName2);

        secondarySignPanel.add(new JLabel(text(AdministrationResources.description_label)), secondaryCc.xy(1, 9));

        secondarySignPanel.add(valueBinder.bind("secondarysign",
                actionBinder.bind("setSignDescription2", signDescription2 = new JTextField()),
                new ValueBinder.Converter<RequiredSignatureValue, String>() {
                    public String toComponent(RequiredSignatureValue value) {
                        return value != null ? value.description().get() : "";
                    }
                }), secondaryCc.xy(1, 11));
        refreshComponents.enabledOn("updatesecondarysign", signDescription2);

        // Select form
        javax.swing.Action form2Action = am.get("setSecondForm");
        form2Button = new StreamflowButton(form2Action);

        form2Button.registerKeyboardAction(form2Action,
                (KeyStroke) form2Action.getValue(javax.swing.Action.ACCELERATOR_KEY),
                JComponent.WHEN_IN_FOCUSED_WINDOW);

        form2Button.setHorizontalAlignment(SwingConstants.LEFT);
        refreshComponents.enabledOn("updatesecondarysign", form2Button);

        PanelBuilder form2ButtonPanel = new PanelBuilder(new FormLayout("70dlu, 5dlu, 150dlu:grow", "pref"));
        CellConstraints form2ButtonPanelCc = new CellConstraints();

        form2ButtonPanel.add(form2Button, form2ButtonPanelCc.xy(1, 1, CellConstraints.FILL, CellConstraints.TOP));

        form2ButtonPanel.add(valueBinder.bind("secondarysign", selectedForm2 = new JLabel(),
                new ValueBinder.Converter<RequiredSignatureValue, String>() {
                    public String toComponent(RequiredSignatureValue value) {
                        return value != null ? value.formdescription().get() : "";
                    }
                }), form2ButtonPanelCc.xy(3, 1, CellConstraints.LEFT, CellConstraints.CENTER));

        secondarySignPanel.add(form2ButtonPanel.getPanel(), secondaryCc.xy(1, 13));

        secondarySignPanel.add(new JLabel(text(AdministrationResources.question_label)), secondaryCc.xy(1, 17));

        secondarySignPanel.add(valueBinder.bind("secondarysign",
                actionBinder.bind("setQuestion", formQuestion2 = new JTextField()),
                new ValueBinder.Converter<RequiredSignatureValue, String>() {
                    public String toComponent(RequiredSignatureValue value) {
                        return value != null ? value.question().get() : "";
                    }
                }), secondaryCc.xy(1, 19));
        refreshComponents.enabledOn("updatesecondarysign", formQuestion2);

        signPanel.add(secondarySignPanel.getPanel(),
                signPanelCc.xy(3, 1, CellConstraints.LEFT, CellConstraints.TOP));

        builder.add(signPanel.getPanel(), new CellConstraints(1, 17, 3, 1, CellConstraints.FILL,
                CellConstraints.FILL, new Insets(0, 0, 0, 0)));

        JPanel templatePanel = new JPanel();
        templatePanel.setVisible(false);
        FormLayout templateFormLayout = new FormLayout("75dlu, 5dlu, fill:p:grow", "pref, pref, fill:p:grow, pref");
        DefaultFormBuilder templateFormBuilder = new DefaultFormBuilder(templateFormLayout, templatePanel);
        templateFormBuilder.addSeparator(text(AdministrationResources.emailTemplates));
        templateFormBuilder.nextLine();
        templateFormBuilder.append(text(AdministrationResources.subject),
                valueBinder.bind("subject", actionBinder.bind("changeSubject", subject = new JTextField())));
        templateFormBuilder.nextLine();
        templateFormBuilder.append(new JScrollPane(emailTemplateList));
        templateFormBuilder.append(new JScrollPane(actionBinder.bind("save", emailTemplateText)));
        templateFormBuilder.nextLine();

        emailTemplateList.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    if (emailTemplateList.getSelectedIndex() != -1) {
                        emailTemplateText.setText(model.getAccessPointValue().messages().get()
                                .get(emailTemplateList.getSelectedValue()));
                    }
                }
            }
        });

        refreshComponents.visibleOn("updatesecondarysign", templatePanel);

        builder.add(templatePanel, new CellConstraints(1, 19, 3, 1, CellConstraints.FILL, CellConstraints.FILL,
                new Insets(0, 0, 0, 0)));
        add(new JScrollPane(panel), BorderLayout.CENTER);

        new RefreshWhenShowing(this, this);
    }

    @Action
    public Task project() {
        final SelectLinkDialog dialog = module.objectBuilderFactory().newObjectBuilder(SelectLinkDialog.class)
                .use(model.getPossibleProjects()).newInstance();
        dialogs.showOkCancelHelpDialog(projectButton, dialog, text(WorkspaceResources.choose_project));

        return new CommandTask() {
            @Override
            public void command() throws Exception {
                if (dialog.getSelectedLink() != null) {
                    model.changeProject(dialog.getSelectedLink());
                }
            }
        };
    }

    @Action
    public Task casetype() {
        final SelectLinkDialog dialog = module.objectBuilderFactory().newObjectBuilder(SelectLinkDialog.class)
                .use(text(WorkspaceResources.choose_casetype), model.getPossibleCaseTypes()).newInstance();
        dialogs.showOkCancelHelpDialog(caseTypeButton, dialog);

        return new CommandTask() {
            @Override
            public void command() throws Exception {
                if (dialog.getSelectedLink() != null) {
                    model.changeCaseType(dialog.getSelectedLink());
                }
            }
        };

    }

    @Action
    public Task form() {
        // TODO very odd hack - how to solve state binder update issue during use of accelerator keys.
        Component focusOwner = WindowUtils.findWindow(this).getFocusOwner();
        if (focusOwner != null)
            focusOwner.transferFocus();

        final SelectLinkDialog dialog = module.objectBuilderFactory().newObjectBuilder(SelectLinkDialog.class)
                .use(model.getPossibleForms()).newInstance();
        dialogs.showOkCancelHelpDialog(formButton, dialog, text(WorkspaceResources.choose_form));

        return new CommandTask() {
            @Override
            public void command() throws Exception {
                if (dialog.getSelectedLink() != null) {
                    model.changeForm(dialog.getSelectedLink());
                }
            }
        };

    }

    @Action
    public Task template() {
        final SelectLinkDialog dialog = module.objectBuilderFactory().newObjectBuilder(SelectLinkDialog.class)
                .use(model.getPossibleTemplates()).newInstance();

        dialogs.showOkCancelHelpDialog(templateButton, dialog, text(WorkspaceResources.choose_template));

        return new CommandTask() {
            @Override
            public void command() throws Exception {
                if (dialog.getSelectedLink() != null) {
                    model.setTemplate(dialog.getSelectedLink());
                }
            }
        };

    }

    @Action
    public Task removeTemplate() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setTemplate(null);
            }
        };
    }

    @Action
    public Task changeMailSelectionMessage() {
        return new CommandTask() {
            @Override
            public void command() throws Exception {
                model.changeMailSelectionMessage(mailSelectionField.getText());
            }
        };
    }

    @Action
    public Task setSignActive1() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSignActive1(signActive1.isSelected());
            }
        };
    }

    @Action
    public Task setSignName1() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSignName1(signName1.getText());
            }
        };
    }

    @Action
    public Task setSignDescription1() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSignDescription1(signDescription1.getText());
            }
        };
    }

    @Action
    public Task setSignActive2() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSignActive2(signActive2.isSelected());
            }
        };
    }

    @Action
    public Task setSignName2() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSignName2(signName2.getText());
            }
        };
    }

    @Action
    public Task setSignDescription2() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSignDescription2(signDescription2.getText());
            }
        };
    }

    @Action
    public Task setSecondForm() {
        // TODO very odd hack - how to solve state binder update issue during use of accelerator keys.
        Component focusOwner = WindowUtils.findWindow(this).getFocusOwner();
        if (focusOwner != null)
            focusOwner.transferFocus();

        final SelectLinkDialog dialog = module.objectBuilderFactory().newObjectBuilder(SelectLinkDialog.class)
                .use(model.getPossibleSecondForms()).newInstance();
        dialogs.showOkCancelHelpDialog(form2Button, dialog, text(WorkspaceResources.choose_form));

        return new CommandTask() {
            @Override
            public void command() throws Exception {
                if (dialog.getSelectedLink() != null) {
                    model.changeSecondForm(dialog.getSelectedLink());
                }
            }
        };

    }

    @Action
    public Task setSecondMandatory() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setSecondMandatory(mandatory2.isSelected());
            }
        };
    }

    @Action
    public Task setQuestion() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.setQuestion(formQuestion2.getText());
            }
        };
    }

    @Action
    public void openReplaceSelectionFieldValueEditor() {
        ReplacementSelectionFieldValuesView view = obf.newObjectBuilder(ReplacementSelectionFieldValuesView.class)
                .use(model.getReplacementSelectionFieldValuesModel()).newInstance();
        AdministrationView adminView = (AdministrationView) SwingUtilities
                .getAncestorOfClass(AdministrationView.class, this);
        adminView.show(view);
    }

    @Action
    public Task changeCookieExpirationHours() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                if (Strings.empty(cookieExpiration.getText())) {
                    model.changeCookieExpirationHours(null);
                } else {
                    model.changeCookieExpirationHours(new Integer(cookieExpiration.getText()));
                }
            }
        };
    }

    private void updateEnabled() {
        if (model.getAccessPointValue().project().get() == null) {
            caseTypeButton.setEnabled(false);
            labelButton.setEnabled(false);
            formButton.setEnabled(false);
        } else if (model.getAccessPointValue().caseType().get() == null) {
            caseTypeButton.setEnabled(true);
            labelButton.setEnabled(false);
            formButton.setEnabled(false);
        } else {
            caseTypeButton.setEnabled(true);
            labelButton.setEnabled(true);
            formButton.setEnabled(true);
        }
    }

    public void notifyTransactions(Iterable<TransactionDomainEvents> transactions) {
        if (Events.matches(
                Events.withNames("addedLabel", "removedLabel", "addedCaseType", "addedProject", "addedSelectedForm",
                        "changedProject", "changedCaseType", "formPdfTemplateSet", "changedMailSelectionMessage",
                        "createdRequiredSignature", "updatedRequiredSignature", "changedCookieExpirationHours"),
                transactions)) {
            refresh();
        }
    }

    public void refresh() {
        model.refresh();

        valueBinder.update(model.getAccessPointValue());

        int selectedIndex = emailTemplateList.getSelectedIndex();
        DefaultListModel emailTemplateListModel = new DefaultListModel();
        for (String key : model.getAccessPointValue().messages().get().keySet()) {
            emailTemplateListModel.addElement(key);
        }
        emailTemplateList.setModel(emailTemplateListModel);
        emailTemplateList.setSelectedIndex(selectedIndex);
        replaceSelectionFieldValueEditButton
                .setIcon(model.getAccessPointValue().replacementValues().get() ? icon(Icons.optionsok, ICON_16)
                        : icon(Icons.options, ICON_16));
    }

    @org.jdesktop.application.Action
    public Task changeSubject() {
        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.changeSubject(subject.getText());
            }
        };
    }

    @org.jdesktop.application.Action
    public Task save() {
        final String template = emailTemplateText.getText();
        final String key = (String) emailTemplateList.getSelectedValue();

        return new CommandTask() {
            @Override
            protected void command() throws Exception {
                model.updateTemplate(key, template);
                model.getAccessPointValue().messages().get().put(key, template);
            }
        };
    }
}