net.cbtltd.client.panel.PartnerPopup.java Source code

Java tutorial

Introduction

Here is the source code for net.cbtltd.client.panel.PartnerPopup.java

Source

/**
 * @author   bookingnet
 * @
 * @version   4.0.0
 */
package net.cbtltd.client.panel;

import java.util.ArrayList;

import net.cbtltd.client.AbstractRoot;
import net.cbtltd.client.GuardedRequest;
import net.cbtltd.client.LocalRequest;
import net.cbtltd.client.field.AbstractField;
import net.cbtltd.client.field.AbstractField.Level;
import net.cbtltd.client.field.CheckField;
import net.cbtltd.client.field.CommandButton;
import net.cbtltd.client.field.DoubleField;
import net.cbtltd.client.field.IntegerField;
import net.cbtltd.client.field.ListField;
import net.cbtltd.client.field.MessagePanel;
import net.cbtltd.client.field.SpinnerField;
import net.cbtltd.client.field.TableField;
import net.cbtltd.client.field.TextField;
import net.cbtltd.client.form.AccessControl;
import net.cbtltd.client.form.Transition;
import net.cbtltd.client.resource.Hosts;
import net.cbtltd.client.resource.partner.PartnerBundle;
import net.cbtltd.client.resource.partner.PartnerConstants;
import net.cbtltd.client.resource.partner.PartnerCssResource;
import net.cbtltd.shared.License;
import net.cbtltd.shared.NameId;
import net.cbtltd.shared.NameIdAction;
import net.cbtltd.shared.Partner;
import net.cbtltd.shared.Party;
import net.cbtltd.shared.Service;
import net.cbtltd.shared.finance.CurrencyNameId;
import net.cbtltd.shared.partner.PartnerCreate;
import net.cbtltd.shared.partner.PartnerDelete;
import net.cbtltd.shared.partner.PartnerRead;
import net.cbtltd.shared.partner.PartnerUpdate;
import net.cbtltd.shared.party.PartyRead;

import com.allen_sauer.gwt.log.client.Log;
import com.bookingnet.config.RazorConfig;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;

/**
 * The Class PartnerPopup is to display and change partner instances.
 * The location ID of the partner is the property ID where the partner is used.
 * The owner of the partner defaults to the owner of the property but can be changed.
 * An partner can be depreciated according to its depreciation type.
 */
public class PartnerPopup extends AbstractPopup<Partner> {

    private static final PartnerConstants CONSTANTS = GWT.create(PartnerConstants.class);
    private static final Hosts HOSTS = GWT.create(Hosts.class);
    private static final PartnerBundle BUNDLE = PartnerBundle.INSTANCE;
    private static final PartnerCssResource CSS = BUNDLE.css();
    private static final String ALL_CRON = "*";

    private static GuardedRequest<Partner> partnerCreate;
    private static GuardedRequest<Partner> partnerRead;
    private static GuardedRequest<Partner> partnerUpdate;
    private static GuardedRequest<Partner> partnerDelete;
    private static GuardedRequest<Party> partyRead;

    private static ListField partyField;
    private static ListField currencyField;
    private static ListField dateformatField;
    private static IntegerField alertwaitField;
    private static SpinnerField alertminuteField;
    private static SpinnerField alerthourField;
    private static SpinnerField alertweekField;
    private static SpinnerField alertmonthField;
    private static IntegerField pricewaitField;
    private static SpinnerField priceminuteField;
    private static SpinnerField pricehourField;
    private static SpinnerField priceweekField;
    private static SpinnerField pricemonthField;
    private static IntegerField productwaitField;
    private static SpinnerField productminuteField;
    private static SpinnerField producthourField;
    private static SpinnerField productweekField;
    private static SpinnerField productmonthField;
    private static IntegerField schedulewaitField;
    private static SpinnerField scheduleminuteField;
    private static SpinnerField schedulehourField;
    private static SpinnerField scheduleweekField;
    private static SpinnerField schedulemonthField;
    private static IntegerField specialwaitField;
    private static SpinnerField specialminuteField;
    private static SpinnerField specialhourField;
    private static SpinnerField specialweekField;
    private static SpinnerField specialmonthField;
    private static TextField apikeyField;
    private static TextField webaddressField;
    private static CheckField bookofflineField;
    private static TextField bookemailaddressField;
    private static TextField bookwebaddressField;
    private static DoubleField commissionField;
    private static DoubleField discountField;
    private static DoubleField subscriptionField;
    private static DoubleField transactionField;
    private static TableField<Partner> parentTable;

    private static String id;

    private static boolean noId() {
        return id == null || id.isEmpty();
    }

    /** Instantiates a new partner pop up panel.
     */
    public PartnerPopup() {
        super(true);
        createActions();
        setWidget(createContent());
        setStylePrimaryName(AbstractField.CSS.cbtAbstractPopup());
    }

    private static PartnerPopup instance;

    /**
     * Gets the single instance of PartnerPopup.
     *
     * @return single instance of PartnerPopup
     */
    public static synchronized PartnerPopup getInstance() {
        if (instance == null) {
            instance = new PartnerPopup();
        }
        id = null;
        partyField.setValue(null);
        return instance;
    }

    /**
     * Shows the panel for a new partner for the specified entity.
     *
     * @param parentTable the parent table.
     */
    public void show(TableField<Partner> parentTable) {
        PartnerPopup.parentTable = parentTable;
        onRefresh();
        onStateChange(Partner.INITIAL);
        partnerCreate.execute(true);
    }

    /**
     * Shows the panel for the specified partner.
     *
     * @param partner the specified partner.
     * @param parentTable the parent table.
     */
    public void show(Partner partner, TableField<Partner> parentTable) {
        PartnerPopup.parentTable = parentTable;
        PartnerPopup.id = partner.getId();
        partnerRead.execute(true);
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.panel.AbstractPopup#onChange(com.google.gwt.event.dom.client.ChangeEvent)
     */
    @Override
    public void onChange(ChangeEvent change) {
        if (partyField.sent(change)) {
            partyRead.execute();
        } else if (bookofflineField.sent(change)) {
            bookemailaddressField.setVisible(bookofflineField.getValue());
            bookwebaddressField.setVisible(bookofflineField.getValue());
        }
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.panel.AbstractPopup#getValue()
     */
    @Override
    public Partner getValue() {
        return getValue(new Partner());
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.panel.AbstractPopup#getValue(java.lang.Object)
     */
    private Partner getValue(Partner partner) {
        partner.setState(state);
        partner.setOrganizationid(AbstractRoot.getOrganizationid());
        partner.setActorid(AbstractRoot.getActorid());
        partner.setId(id);
        partner.setPartyid(partyField.getValue());
        partner.setPartyname(partyField.getName());
        partner.setApikey(apikeyField.getValue());
        partner.setBookoffline(bookofflineField.getValue());
        partner.setBookemailaddress(bookemailaddressField.getValue());
        partner.setBookwebaddress(bookwebaddressField.getValue());
        partner.setCurrency(currencyField.getValue());
        partner.setDateformat(dateformatField.getValue());
        partner.setWebaddress(webaddressField.getValue());
        partner.setCommission(commissionField.getValue());
        partner.setDiscount(discountField.getValue());
        partner.setSubscription(subscriptionField.getValue());
        partner.setTransaction(transactionField.getValue());
        partner.setAlertwait(alertwaitField.getValue());
        partner.setPricewait(pricewaitField.getValue());
        partner.setProductwait(productwaitField.getValue());
        partner.setSchedulewait(schedulewaitField.getValue());
        partner.setSpecialwait(specialwaitField.getValue());
        partner.setAlertcron(getAlertcron());
        partner.setPricecron(getPricecron());
        partner.setProductcron(getProductcron());
        partner.setSchedulecron(getSchedulecron());
        partner.setSpecialcron(getSpecialcron());
        Log.debug("getValue " + partner);
        return partner;
    }

    private String getCronString(Integer value) {
        return value == -1 ? ALL_CRON : String.valueOf(value);
    }

    //   private String getCronMonth(Integer value) {
    //      return value == 0 ? ALL_CRON : String.valueOf(value);
    //   }
    //
    private String getAlertcron() {
        return getCronString(alertminuteField.getValue()) + " " + getCronString(alerthourField.getValue()) + " "
                + getCronString(alertmonthField.getValue()) + " * " + getCronString(alertweekField.getValue());
    }

    private String getPricecron() {
        return getCronString(priceminuteField.getValue()) + " " + getCronString(pricehourField.getValue()) + " "
                + getCronString(pricemonthField.getValue()) + " * " + getCronString(priceweekField.getValue());
    }

    private String getProductcron() {
        return getCronString(productminuteField.getValue()) + " " + getCronString(producthourField.getValue()) + " "
                + getCronString(productmonthField.getValue()) + " * " + getCronString(productweekField.getValue());
    }

    private String getSchedulecron() {
        return getCronString(scheduleminuteField.getValue()) + " " + getCronString(schedulehourField.getValue())
                + " " + getCronString(schedulemonthField.getValue()) + " * "
                + getCronString(scheduleweekField.getValue());
    }

    private String getSpecialcron() {
        return getCronString(specialminuteField.getValue()) + " " + getCronString(specialhourField.getValue()) + " "
                + getCronString(specialmonthField.getValue()) + " * " + getCronString(specialweekField.getValue());
    }

    /* (non-Javadoc)
     * @see net.cbtltd.client.panel.AbstractPopup#setValue(java.lang.Object)
     */
    public void setValue(Partner partner) {
        Log.debug("setValue " + partner);
        if (partner != null) {
            setResetting(true);
            onStateChange(partner.getState());
            id = partner.getId();
            partyField.setValue(partner.getPartyid());
            partyField.setName(partner.getPartyname());
            apikeyField.setValue(partner.getApikey());
            bookofflineField.setValue(partner.getBookoffline());
            bookemailaddressField.setValue(partner.getBookemailaddress());
            bookwebaddressField.setValue(partner.getBookwebaddress());
            currencyField.setValue(partner.getCurrency());
            dateformatField.setValue(partner.getDateformat());
            webaddressField.setValue(partner.getWebaddress());
            commissionField.setValue(partner.getCommission());
            discountField.setValue(partner.getDiscount());
            subscriptionField.setValue(partner.getSubscription());
            transactionField.setValue(partner.getTransaction());
            alertwaitField.setValue(partner.getAlertwait());
            pricewaitField.setValue(partner.getPricewait());
            productwaitField.setValue(partner.getProductwait());
            schedulewaitField.setValue(partner.getSchedulewait());
            specialwaitField.setValue(partner.getSpecialwait());
            setAlertcron(partner.getAlertcron());
            setPricecron(partner.getPricecron());
            setProductcron(partner.getProductcron());
            setSchedulecron(partner.getSchedulecron());
            setSpecialcron(partner.getSpecialcron());

            bookemailaddressField.setVisible(partner.getBookoffline());
            bookwebaddressField.setVisible(partner.getBookoffline());

            center();
            setResetting(false);
        }
    }

    private Integer getCronIndex(String value, int i) {
        String[] args = value.split(" ");
        if (args.length != 5) {
            new MessagePanel(Level.VERBOSE, CONSTANTS.cronError() + " " + value).center();
        }
        return ALL_CRON.equalsIgnoreCase(args[i]) ? -1 : Integer.valueOf(args[i]);
    }

    private void setAlertcron(String value) {
        alertminuteField.setValue(getCronIndex(value, 0));
        alerthourField.setValue(getCronIndex(value, 1));
        alertweekField.setValue(getCronIndex(value, 4));
        alertmonthField.setValue(getCronIndex(value, 2));
    }

    private void setPricecron(String value) {
        priceminuteField.setValue(getCronIndex(value, 0));
        pricehourField.setValue(getCronIndex(value, 1));
        priceweekField.setValue(getCronIndex(value, 4));
        pricemonthField.setValue(getCronIndex(value, 2));
    }

    private void setProductcron(String value) {
        productminuteField.setValue(getCronIndex(value, 0));
        producthourField.setValue(getCronIndex(value, 1));
        productweekField.setValue(getCronIndex(value, 4));
        productmonthField.setValue(getCronIndex(value, 2));
    }

    private void setSchedulecron(String value) {
        scheduleminuteField.setValue(getCronIndex(value, 0));
        schedulehourField.setValue(getCronIndex(value, 1));
        scheduleweekField.setValue(getCronIndex(value, 4));
        schedulemonthField.setValue(getCronIndex(value, 2));
    }

    private void setSpecialcron(String value) {
        specialminuteField.setValue(getCronIndex(value, 0));
        specialhourField.setValue(getCronIndex(value, 1));
        specialweekField.setValue(getCronIndex(value, 4));
        specialmonthField.setValue(getCronIndex(value, 2));
    }

    /*
     * Creates the panel of partner fields.
     * 
     * @return the panel of partner fields.
     */
    private VerticalPanel createContent() {
        CSS.ensureInjected();
        final VerticalPanel form = new VerticalPanel();
        final Label title = new Label(CONSTANTS.partnerLabel());
        title.addStyleName(AbstractField.CSS.cbtAbstractPopupLabel());
        form.add(title);

        final Label closeButton = new Label();
        closeButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                PartnerPopup.this.hide();
            }
        });
        closeButton.addStyleName(AbstractField.CSS.cbtAbstractPopupClose());
        form.add(closeButton);

        //-----------------------------------------------
        // Party list
        //-----------------------------------------------
        partyField = new ListField(this, null, new NameIdAction(Service.PARTY), CONSTANTS.partyLabel(), true,
                tab++);
        partyField.setType(Party.Type.Organization.name());
        partyField.setHelpText(CONSTANTS.partyHelp());
        form.add(partyField);

        //-----------------------------------------------
        // API Key field
        //-----------------------------------------------
        apikeyField = new TextField(this, null, CONSTANTS.apikeyLabel(), tab++);
        apikeyField.setMaxLength(255);
        apikeyField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        apikeyField.setHelpText(CONSTANTS.apikeyHelp());
        form.add(apikeyField);

        //-----------------------------------------------
        // Default Web Address field
        //-----------------------------------------------
        webaddressField = new TextField(this, null, CONSTANTS.webaddressLabel(), tab++);
        webaddressField.setMaxLength(255);
        webaddressField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        webaddressField.setHelpText(CONSTANTS.webaddressHelp());
        form.add(webaddressField);

        //-----------------------------------------------
        // Check if mandatory feature
        //-----------------------------------------------
        bookofflineField = new CheckField(this, null, CONSTANTS.bookofflineLabel(), tab++);
        bookofflineField.setDefaultValue(false);
        bookofflineField.setHelpText(CONSTANTS.bookofflineHelp());
        form.add(bookofflineField);
        form.add(bookofflineField);

        //-----------------------------------------------
        // Booking Email Address field
        //-----------------------------------------------
        bookemailaddressField = new TextField(this, null, CONSTANTS.bookemailaddressLabel(), tab++);
        bookemailaddressField.setMaxLength(255);
        bookemailaddressField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        bookemailaddressField.setVisible(false);
        bookemailaddressField.setHelpText(CONSTANTS.bookemailaddressHelp());
        form.add(bookemailaddressField);

        //-----------------------------------------------
        // Booking Web Address field
        //-----------------------------------------------
        bookwebaddressField = new TextField(this, null, CONSTANTS.bookwebaddressLabel(), tab++);
        bookwebaddressField.setMaxLength(255);
        bookwebaddressField.setDefaultValue(HOSTS.offlineUrl());
        bookwebaddressField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        bookwebaddressField.setVisible(false);
        bookwebaddressField.setHelpText(CONSTANTS.bookwebaddressHelp());
        form.add(bookwebaddressField);

        //-----------------------------------------------
        // Currency field
        //-----------------------------------------------
        currencyField = new ListField(this, null, new CurrencyNameId(), CONSTANTS.currencyLabel(), false, tab++);
        currencyField.setAllOrganizations(true);
        currencyField.setDefaultValue(AbstractRoot.getCurrency());
        currencyField.setFieldHalf();
        currencyField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        currencyField.setHelpText(CONSTANTS.currencyHelp());

        //-----------------------------------------------
        // Date Format field
        //-----------------------------------------------
        dateformatField = new ListField(this, null, NameId.getList(Party.DATE_FORMATS, Party.DATE_FORMATS), //CONSTANTS.dateformats(), CONSTANTS.dateformats()),
                CONSTANTS.dateformatLabel(), false, tab++);
        dateformatField.setDefaultValue(Party.YYYYMMDD); //ISO
        dateformatField.setFieldHalf();
        dateformatField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        dateformatField.setHelpText(CONSTANTS.dateformatHelp());

        HorizontalPanel cf = new HorizontalPanel();
        form.add(cf);
        cf.add(currencyField);
        cf.add(dateformatField);

        //-----------------------------------------------
        // Commission field
        //-----------------------------------------------
        commissionField = new DoubleField(this, null, CONSTANTS.commissionLabel(), AbstractField.AF, tab++);
        commissionField.setDefaultValue(20.0);
        commissionField.setRange(0.0, 100.0);
        commissionField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        commissionField.setHelpText(CONSTANTS.commissionHelp());

        //-----------------------------------------------
        // Discount field
        //-----------------------------------------------
        discountField = new DoubleField(this, null, CONSTANTS.discountLabel(), AbstractField.AF, tab++);
        discountField.setDefaultValue(20.0);
        discountField.setRange(0.0, 100.0);
        discountField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_DEFAULT));
        discountField.setHelpText(CONSTANTS.discountHelp());

        HorizontalPanel cd = new HorizontalPanel();
        form.add(cd);
        cd.add(commissionField);
        cd.add(discountField);

        //-----------------------------------------------
        // Subscription field
        //-----------------------------------------------
        subscriptionField = new DoubleField(this, null, CONSTANTS.subscriptionLabel(), AbstractField.IF, tab++);
        subscriptionField.setHelpText(CONSTANTS.subscriptionHelp());
        subscriptionField.setDefaultValue(5.0);
        subscriptionField.setRange(0.0, 10000.0);
        subscriptionField.setEnabled(AbstractRoot.getSession().hasPermission(AccessControl.SUPERUSER));

        //-----------------------------------------------
        // Transaction field
        //-----------------------------------------------
        transactionField = new DoubleField(this, null, CONSTANTS.transactionLabel(), AbstractField.AF, tab++);
        transactionField.setHelpText(CONSTANTS.transactionHelp());
        transactionField.setDefaultValue(2.0);
        transactionField.setRange(0.0, 100.0);
        transactionField.setEnabled(AbstractRoot.getSession().hasPermission(AccessControl.SUPERUSER));

        HorizontalPanel st = new HorizontalPanel();
        form.add(st);
        st.add(subscriptionField);
        st.add(transactionField);

        //-----------------------------------------------
        // Schedule grid
        //-----------------------------------------------
        final Label settingsLabel = new Label(CONSTANTS.settingsLabel());
        settingsLabel.addStyleName(AbstractField.CSS.cbtAbstractPopupLabel());
        form.add(settingsLabel);

        Grid grid = new Grid(6, 6);
        form.add(grid);

        final Label cronLabel = new Label(CONSTANTS.cronLabel());
        cronLabel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                new MessagePanel(Level.VERBOSE, CONSTANTS.cronHelp()).showRelativeTo(cronLabel);
            }
        });
        grid.setWidget(0, 0, cronLabel);

        final Label waitLabel = new Label(CONSTANTS.waitLabel());
        cronLabel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                new MessagePanel(Level.VERBOSE, CONSTANTS.waitHelp()).showRelativeTo(waitLabel);
            }
        });
        grid.setWidget(0, 1, waitLabel);

        final Label minuteLabel = new Label(CONSTANTS.minuteLabel());
        cronLabel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                new MessagePanel(Level.VERBOSE, CONSTANTS.minuteHelp()).showRelativeTo(minuteLabel);
            }
        });
        grid.setWidget(0, 2, minuteLabel);

        final Label hourLabel = new Label(CONSTANTS.hourLabel());
        cronLabel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                new MessagePanel(Level.VERBOSE, CONSTANTS.hourHelp()).showRelativeTo(hourLabel);
            }
        });
        grid.setWidget(0, 3, hourLabel);

        final Label weekLabel = new Label(CONSTANTS.weekLabel());
        cronLabel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                new MessagePanel(Level.VERBOSE, CONSTANTS.weekHelp()).showRelativeTo(weekLabel);
            }
        });
        grid.setWidget(0, 4, weekLabel);

        final Label monthLabel = new Label(CONSTANTS.monthLabel());
        cronLabel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                new MessagePanel(Level.VERBOSE, CONSTANTS.monthHelp()).showRelativeTo(monthLabel);
            }
        });
        grid.setWidget(0, 5, monthLabel);

        //-----------------------------------------------
        // Alert Wait field
        //-----------------------------------------------
        alertwaitField = new IntegerField(this, null, null, tab++);
        alertwaitField.setDefaultValue(1000);
        alertwaitField.setRange(100, 60000);
        alertwaitField.setFieldStyle(CSS.waitStyle());
        alertwaitField.setEnabled(AbstractRoot.hasPermission(AccessControl.SUPERUSER));
        alertwaitField.setHelpText(CONSTANTS.waitHelp());

        //-----------------------------------------------
        // Alert Minute list
        //-----------------------------------------------
        alertminuteField = new SpinnerField(this, null, -1, 59, null, tab++);
        alertminuteField.setDefaultValue(0);
        alertminuteField.setFieldStyle(CSS.cronStyle());
        alertminuteField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        alertminuteField.setHelpText(CONSTANTS.alertHelp());

        //-----------------------------------------------
        // Alert Hour list
        //-----------------------------------------------
        alerthourField = new SpinnerField(this, null, -1, 23, null, tab++);
        alerthourField.setDefaultValue(0);
        alerthourField.setFieldStyle(CSS.cronStyle());
        alerthourField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        alerthourField.setHelpText(CONSTANTS.alertHelp());

        //-----------------------------------------------
        // Alert Week list
        //-----------------------------------------------
        alertweekField = new SpinnerField(this, null, -1, 6, null, tab++);
        alertweekField.setDefaultValue(0);
        alertweekField.setFieldStyle(CSS.cronStyle());
        alertweekField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        alertweekField.setHelpText(CONSTANTS.alertHelp());

        //-----------------------------------------------
        // Alert Month list
        //-----------------------------------------------
        alertmonthField = new SpinnerField(this, null, -1, 31, null, tab++);
        alertmonthField.setDefaultValue(0);
        alertmonthField.setFieldStyle(CSS.cronStyle());
        alertmonthField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        alertmonthField.setHelpText(CONSTANTS.alertHelp());

        grid.setWidget(1, 0, new Label(CONSTANTS.alertLabel()));
        grid.setWidget(1, 1, alertwaitField);
        grid.setWidget(1, 2, alertminuteField);
        grid.setWidget(1, 3, alerthourField);
        grid.setWidget(1, 4, alertweekField);
        grid.setWidget(1, 5, alertmonthField);

        //-----------------------------------------------
        // Price Wait field
        //-----------------------------------------------
        pricewaitField = new IntegerField(this, null, null, tab++);
        pricewaitField.setDefaultValue(1000);
        pricewaitField.setRange(100, 60000);
        pricewaitField.setFieldStyle(CSS.waitStyle());
        pricewaitField.setEnabled(AbstractRoot.hasPermission(AccessControl.SUPERUSER));
        pricewaitField.setHelpText(CONSTANTS.waitHelp());

        //-----------------------------------------------
        // Price Minute list
        //-----------------------------------------------
        priceminuteField = new SpinnerField(this, null, -1, 59, null, tab++);
        priceminuteField.setDefaultValue(0);
        priceminuteField.setFieldStyle(CSS.cronStyle());
        priceminuteField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        priceminuteField.setHelpText(CONSTANTS.priceHelp());

        //-----------------------------------------------
        // Price Hour list
        //-----------------------------------------------
        pricehourField = new SpinnerField(this, null, -1, 23, null, tab++);
        pricehourField.setDefaultValue(0);
        pricehourField.setFieldStyle(CSS.cronStyle());
        pricehourField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        pricehourField.setHelpText(CONSTANTS.priceHelp());

        //-----------------------------------------------
        // Price Week list
        //-----------------------------------------------
        priceweekField = new SpinnerField(this, null, -1, 6, null, tab++);
        priceweekField.setDefaultValue(0);
        priceweekField.setFieldStyle(CSS.cronStyle());
        priceweekField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        priceweekField.setHelpText(CONSTANTS.priceHelp());

        //-----------------------------------------------
        // Price Month list
        //-----------------------------------------------
        pricemonthField = new SpinnerField(this, null, -1, 31, null, tab++);
        pricemonthField.setDefaultValue(0);
        pricemonthField.setFieldStyle(CSS.cronStyle());
        pricemonthField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        pricemonthField.setHelpText(CONSTANTS.priceHelp());

        grid.setWidget(2, 0, new Label(CONSTANTS.priceLabel()));
        grid.setWidget(2, 1, pricewaitField);
        grid.setWidget(2, 2, priceminuteField);
        grid.setWidget(2, 3, pricehourField);
        grid.setWidget(2, 4, priceweekField);
        grid.setWidget(2, 5, pricemonthField);

        //-----------------------------------------------
        // Product Wait field
        //-----------------------------------------------
        productwaitField = new IntegerField(this, null, null, tab++);
        productwaitField.setDefaultValue(1000);
        productwaitField.setRange(100, 60000);
        productwaitField.setFieldStyle(CSS.waitStyle());
        productwaitField.setEnabled(AbstractRoot.hasPermission(AccessControl.SUPERUSER));
        productwaitField.setHelpText(CONSTANTS.waitHelp());

        //-----------------------------------------------
        // Product Minute list
        //-----------------------------------------------
        productminuteField = new SpinnerField(this, null, -1, 59, null, tab++);
        productminuteField.setDefaultValue(0);
        productminuteField.setFieldStyle(CSS.cronStyle());
        productminuteField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        productminuteField.setHelpText(CONSTANTS.productHelp());

        //-----------------------------------------------
        // Product Hour list
        //-----------------------------------------------
        producthourField = new SpinnerField(this, null, -1, 23, null, tab++);
        producthourField.setDefaultValue(0);
        producthourField.setFieldStyle(CSS.cronStyle());
        producthourField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        producthourField.setHelpText(CONSTANTS.productHelp());

        //-----------------------------------------------
        // Product Week list
        //-----------------------------------------------
        productweekField = new SpinnerField(this, null, -1, 6, null, tab++);
        productweekField.setDefaultValue(0);
        productweekField.setFieldStyle(CSS.cronStyle());
        productweekField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        productweekField.setHelpText(CONSTANTS.productHelp());

        //-----------------------------------------------
        // Product Month list
        //-----------------------------------------------
        productmonthField = new SpinnerField(this, null, -1, 31, null, tab++);
        productmonthField.setDefaultValue(0);
        productmonthField.setFieldStyle(CSS.cronStyle());
        productmonthField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        productmonthField.setHelpText(CONSTANTS.productHelp());

        grid.setWidget(3, 0, new Label(CONSTANTS.productLabel()));
        grid.setWidget(3, 1, productwaitField);
        grid.setWidget(3, 2, productminuteField);
        grid.setWidget(3, 3, producthourField);
        grid.setWidget(3, 4, productweekField);
        grid.setWidget(3, 5, productmonthField);

        //-----------------------------------------------
        // Schedule Wait field
        //-----------------------------------------------
        schedulewaitField = new IntegerField(this, null, null, tab++);
        schedulewaitField.setDefaultValue(1000);
        schedulewaitField.setRange(100, 60000);
        schedulewaitField.setFieldStyle(CSS.waitStyle());
        schedulewaitField.setEnabled(AbstractRoot.hasPermission(AccessControl.SUPERUSER));
        schedulewaitField.setHelpText(CONSTANTS.waitHelp());

        //-----------------------------------------------
        // Schedule Minute list
        //-----------------------------------------------
        scheduleminuteField = new SpinnerField(this, null, -1, 59, null, tab++);
        scheduleminuteField.setDefaultValue(0);
        scheduleminuteField.setFieldStyle(CSS.cronStyle());
        scheduleminuteField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        scheduleminuteField.setHelpText(CONSTANTS.scheduleHelp());

        //-----------------------------------------------
        // Schedule Hour list
        //-----------------------------------------------
        schedulehourField = new SpinnerField(this, null, -1, 23, null, tab++);
        schedulehourField.setDefaultValue(0);
        schedulehourField.setFieldStyle(CSS.cronStyle());
        schedulehourField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        schedulehourField.setHelpText(CONSTANTS.scheduleHelp());

        //-----------------------------------------------
        // Schedule Week list
        //-----------------------------------------------
        scheduleweekField = new SpinnerField(this, null, -1, 6, null, tab++);
        scheduleweekField.setDefaultValue(0);
        scheduleweekField.setFieldStyle(CSS.cronStyle());
        scheduleweekField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        scheduleweekField.setHelpText(CONSTANTS.scheduleHelp());

        //-----------------------------------------------
        // Schedule Month list
        //-----------------------------------------------
        schedulemonthField = new SpinnerField(this, null, -1, 31, null, tab++);
        schedulemonthField.setDefaultValue(0);
        schedulemonthField.setFieldStyle(CSS.cronStyle());
        schedulemonthField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        schedulemonthField.setHelpText(CONSTANTS.scheduleHelp());

        grid.setWidget(4, 0, new Label(CONSTANTS.scheduleLabel()));
        grid.setWidget(4, 1, schedulewaitField);
        grid.setWidget(4, 2, scheduleminuteField);
        grid.setWidget(4, 3, schedulehourField);
        grid.setWidget(4, 4, scheduleweekField);
        grid.setWidget(4, 5, schedulemonthField);

        //-----------------------------------------------
        // Special Wait field
        //-----------------------------------------------
        specialwaitField = new IntegerField(this, null, null, tab++);
        specialwaitField.setDefaultValue(1000);
        specialwaitField.setRange(100, 60000);
        specialwaitField.setFieldStyle(CSS.waitStyle());
        specialwaitField.setEnabled(AbstractRoot.hasPermission(AccessControl.SUPERUSER));
        specialwaitField.setHelpText(CONSTANTS.waitHelp());

        //-----------------------------------------------
        // Special Minute list
        //-----------------------------------------------
        specialminuteField = new SpinnerField(this, null, -1, 59, null, tab++);
        specialminuteField.setDefaultValue(0);
        specialminuteField.setFieldStyle(CSS.cronStyle());
        specialminuteField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        specialminuteField.setHelpText(CONSTANTS.specialHelp());

        //-----------------------------------------------
        // Special Hour list
        //-----------------------------------------------
        specialhourField = new SpinnerField(this, null, -1, 23, null, tab++);
        specialhourField.setDefaultValue(0);
        specialhourField.setFieldStyle(CSS.cronStyle());
        specialhourField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        specialhourField.setHelpText(CONSTANTS.specialHelp());

        //-----------------------------------------------
        // Special Week list
        //-----------------------------------------------
        specialweekField = new SpinnerField(this, null, -1, 6, null, tab++);
        specialweekField.setDefaultValue(0);
        specialweekField.setFieldStyle(CSS.cronStyle());
        specialweekField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        specialweekField.setHelpText(CONSTANTS.specialHelp());

        //-----------------------------------------------
        // Special Month list
        //-----------------------------------------------
        specialmonthField = new SpinnerField(this, null, -1, 31, null, tab++);
        specialmonthField.setDefaultValue(0);
        specialmonthField.setFieldStyle(CSS.cronStyle());
        specialmonthField.setEnabled(AbstractRoot.hasPermission(AccessControl.PARTNER_SCHEDULE));
        specialmonthField.setHelpText(CONSTANTS.specialHelp());

        grid.setWidget(5, 0, new Label(CONSTANTS.specialLabel()));
        grid.setWidget(5, 1, specialwaitField);
        grid.setWidget(5, 2, specialminuteField);
        grid.setWidget(5, 3, specialhourField);
        grid.setWidget(5, 4, specialweekField);
        grid.setWidget(5, 5, specialmonthField);

        form.add(createCommands());
        onRefresh();
        onReset(Partner.CREATED);
        return form;
    }

    /*
     * Creates the command bar.
     * 
     * @return the command bar.
     */
    private HorizontalPanel createCommands() {
        final HorizontalPanel bar = new HorizontalPanel();
        bar.addStyleName(AbstractField.CSS.cbtAbstractCommand());

        final LocalRequest resetRequest = new LocalRequest() {
            protected void perform() {
                hide();
            }
        };

        //-----------------------------------------------
        // Save button
        //-----------------------------------------------
        final CommandButton saveButton = new CommandButton(this, AbstractField.CONSTANTS.allSave(), partnerUpdate,
                tab++);
        saveButton.addStyleName(AbstractField.CSS.cbtGradientBlue());
        saveButton.setTitle(AbstractField.CONSTANTS.helpSave());
        bar.add(saveButton);

        //-----------------------------------------------
        // Restore button
        //-----------------------------------------------
        final CommandButton restoreButton = new CommandButton(this, AbstractField.CONSTANTS.allRestore(),
                partnerUpdate, tab++);
        restoreButton.addStyleName(AbstractField.CSS.cbtGradientBlue());
        restoreButton.setTitle(AbstractField.CONSTANTS.helpRestore());
        bar.add(restoreButton);

        //-----------------------------------------------
        // Suspend button
        //-----------------------------------------------
        final CommandButton suspendButton = new CommandButton(this, AbstractField.CONSTANTS.allSuspend(),
                partnerUpdate, tab++);
        suspendButton.addStyleName(AbstractField.CSS.cbtGradientBlue());
        suspendButton.setTitle(AbstractField.CONSTANTS.helpSuspend());
        bar.add(suspendButton);

        //-----------------------------------------------
        // Delete button
        //-----------------------------------------------
        final CommandButton deleteButton = new CommandButton(this, AbstractField.CONSTANTS.allDelete(),
                partnerDelete, tab++);
        deleteButton.addStyleName(AbstractField.CSS.cbtGradientRed());
        deleteButton.setTitle(AbstractField.CONSTANTS.helpDelete());
        bar.add(deleteButton);

        //-----------------------------------------------
        // Cancel button
        //-----------------------------------------------
        final CommandButton cancelButton = new CommandButton(this, AbstractField.CONSTANTS.allCancel(),
                resetRequest, tab++);
        cancelButton.addStyleName(AbstractField.CSS.cbtGradientRed());
        cancelButton.setTitle(AbstractField.CONSTANTS.helpCancel());
        bar.add(cancelButton);

        //-----------------------------------------------
        // Transition array that defines the finite state machine
        //-----------------------------------------------
        fsm = new ArrayList<Transition>();
        fsm.add(new Transition(Partner.INITIAL, cancelButton, Partner.CREATED));
        fsm.add(new Transition(Partner.INITIAL, saveButton, Partner.CREATED));
        fsm.add(new Transition(Partner.INITIAL, suspendButton, Partner.SUSPENDED));

        fsm.add(new Transition(Partner.CREATED, saveButton, Partner.CREATED));
        fsm.add(new Transition(Partner.CREATED, suspendButton, Partner.SUSPENDED));
        fsm.add(new Transition(Partner.CREATED, deleteButton, Partner.CREATED));

        fsm.add(new Transition(Partner.SUSPENDED, saveButton, Partner.SUSPENDED));
        fsm.add(new Transition(Partner.SUSPENDED, restoreButton, Partner.CREATED));
        fsm.add(new Transition(Partner.SUSPENDED, cancelButton, Partner.SUSPENDED));
        return bar;
    }

    /* Creates the actions that may be executed. */
    private void createActions() {

        //-----------------------------------------------
        // Create Partner
        //-----------------------------------------------
        partnerCreate = new GuardedRequest<Partner>() {
            protected boolean error() {
                return (ifMessage(AbstractRoot.noOrganizationid(), Level.TERSE,
                        AbstractField.CONSTANTS.errOrganizationid(), partyField));
            }

            protected void send() {
                super.send(getValue(new PartnerCreate()));
            }

            protected void receive(Partner partner) {
                setValue(partner);
            }
        };

        //-----------------------------------------------
        // Read Partner
        //-----------------------------------------------
        partnerRead = new GuardedRequest<Partner>() {
            protected boolean error() {
                return noId();
            }

            protected void send() {
                super.send(getValue(new PartnerRead()));
            }

            protected void receive(Partner partner) {
                setValue(partner);
            }
        };

        //-----------------------------------------------
        // Update Partner
        //-----------------------------------------------
        partnerUpdate = new GuardedRequest<Partner>() {
            protected boolean error() {
                return (ifMessage(AbstractRoot.noOrganizationid(), Level.TERSE,
                        AbstractField.CONSTANTS.errOrganizationid(), partyField)
                        || ifMessage(partyField.noValue(), Level.TERSE, CONSTANTS.partyError(), partyField)
                        || ifMessage(currencyField.noValue(), Level.TERSE, CONSTANTS.currencyError(), currencyField)
                        || ifMessage(dateformatField.noValue(), Level.TERSE, CONSTANTS.dateformatError(),
                                dateformatField)
                        || ifMessage(webaddressField.noValue(), Level.TERSE, CONSTANTS.webaddressError(),
                                webaddressField)
                        || ifMessage(
                                bookofflineField.getValue() && (bookemailaddressField.noValue()
                                        || !Party.isEmailAddress(bookemailaddressField.getValue())),
                                Level.TERSE, CONSTANTS.bookemailaddressError(), bookemailaddressField)
                        || ifMessage(bookofflineField.getValue() && bookwebaddressField.noValue(), Level.TERSE,
                                CONSTANTS.bookwebaddressError(), bookwebaddressField)
                        || ifMessage(commissionField.noValue(), Level.TERSE, CONSTANTS.commissionError(),
                                commissionField)
                        || ifMessage(discountField.noValue(), Level.TERSE, CONSTANTS.discountError(),
                                discountField));
            }

            protected void send() {
                super.send(getValue(new PartnerUpdate()));
            }

            protected void receive(Partner partner) {
                parentTable.execute(true);
                hide();
            }
        };

        //-----------------------------------------------
        // Delete Partner
        //-----------------------------------------------
        partnerDelete = new GuardedRequest<Partner>() {
            protected boolean error() {
                return ifMessage(noId(), Level.TERSE, AbstractField.CONSTANTS.errId(), partyField);
            }

            protected void send() {
                super.send(getValue(new PartnerDelete()));
            }

            protected void receive(Partner partner) {
                parentTable.execute(true);
                hide();
            }
        };

        //-----------------------------------------------
        // Read Party
        //-----------------------------------------------
        partyRead = new GuardedRequest<Party>() {
            protected boolean error() {
                return partyField.noValue();
            }

            protected void send() {
                super.send(new PartyRead(partyField.getValue()));
            }

            protected void receive(Party party) {
                bookemailaddressField.setValue(party.getEmailaddress());
                webaddressField.setValue(party.getWebaddress());
            }
        };
    }
}