com.alkacon.opencms.v8.calendar.client.input.CmsSerialDate.java Source code

Java tutorial

Introduction

Here is the source code for com.alkacon.opencms.v8.calendar.client.input.CmsSerialDate.java

Source

/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package com.alkacon.opencms.v8.calendar.client.input;

import com.alkacon.opencms.v8.calendar.client.input.serialdate.CmsPatternPanelDaily;
import com.alkacon.opencms.v8.calendar.client.input.serialdate.CmsPatternPanelMonthly;
import com.alkacon.opencms.v8.calendar.client.input.serialdate.CmsPatternPanelWeekly;
import com.alkacon.opencms.v8.calendar.client.input.serialdate.CmsPatternPanelYearly;
import com.alkacon.opencms.v8.calendar.client.widget.css.I_CmsLayoutBundle;

import org.opencms.gwt.client.I_CmsHasInit;
import org.opencms.gwt.client.Messages;
import org.opencms.gwt.client.ui.I_CmsAutoHider;
import org.opencms.gwt.client.ui.input.CmsErrorWidget;
import org.opencms.gwt.client.ui.input.CmsRadioButton;
import org.opencms.gwt.client.ui.input.CmsRadioButtonGroup;
import org.opencms.gwt.client.ui.input.CmsSelectBox;
import org.opencms.gwt.client.ui.input.I_CmsFormWidget;
import org.opencms.gwt.client.ui.input.datebox.CmsDateBox;
import org.opencms.gwt.client.ui.input.form.CmsWidgetFactoryRegistry;
import org.opencms.gwt.client.ui.input.form.I_CmsFormWidgetFactory;
import org.opencms.gwt.client.util.CmsDebugLog;
import org.opencms.util.CmsStringUtil;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gwt.dom.client.Style.Float;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.dom.client.Style.VerticalAlign;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;

/**
 * Basic serial date widget.<p>
 * 
 * @since 8.5.0
 * 
 */
public class CmsSerialDate extends Composite
        implements I_CmsFormWidget, I_CmsHasInit, HasValueChangeHandlers<String> {

    /** Configuration key name for the serial date day of month. */
    public static final String CONFIG_DAY_OF_MONTH = "dayofmonth";

    /** Configuration key name for the serial date end type. */
    public static final String CONFIG_END_TYPE = "endtype";

    /** Configuration key name for the serial date end date and time (sets duration together with start date). */
    public static final String CONFIG_ENDDATE = "enddate";

    /** Configuration key name for the serial date daily configuration: every working day flag. */
    public static final String CONFIG_EVERY_WORKING_DAY = "everyworkingday";

    /** Configuration key name for the serial date interval. */
    public static final String CONFIG_INTERVAL = "interval";

    /** Configuration key name for the serial date month. */
    public static final String CONFIG_MONTH = "month";

    /** Configuration key name for the serial date number of occurences. */
    public static final String CONFIG_OCCURENCES = "occurences";

    /** Configuration key name for the serial date: series end date. */
    public static final String CONFIG_SERIAL_ENDDATE = "serialenddate";

    /** Configuration key name for the serial date start date and time. */
    public static final String CONFIG_STARTDATE = "startdate";

    /** Configuration key name for the serial date type. */
    public static final String CONFIG_TYPE = "type";

    /** Configuration key name for the serial date week day(s). */
    public static final String CONFIG_WEEKDAYS = "weekdays";

    /** Series end type: ends at specific date. */
    public static final int END_TYPE_DATE = 3;

    /** Series end type: ends never. */
    public static final int END_TYPE_NEVER = 1;

    /** Series end type: ends after n times. */
    public static final int END_TYPE_TIMES = 2;

    /** Serial type: daily series. */
    public static final int TYPE_DAILY = 1;

    /** Serial type: monthly series. */
    public static final int TYPE_MONTHLY = 3;

    /** Serial type: weekly series. */
    public static final int TYPE_WEEKLY = 2;

    /** Serial type: yearly series. */
    public static final int TYPE_YEARLY = 4;

    /** The key for daily. */
    public static final String KEY_DAILY = "1";

    /** The key for monthly. */
    public static final String KEY_MONTHLY = "3";

    /** The key for weekly. */
    public static final String KEY_WEEKLY = "2";

    /** The key for yearly. */
    public static final String KEY_YEARLY = "4";

    /** The widget type identifier for this widget. */
    private static final String WIDGET_TYPE = "SerialDate";

    /** Separator for the week days String. */
    public static final char SEPARATOR_WEEKDAYS = ',';

    /** Number of milliseconds per minute. */
    public static final long MILLIS_00_PER_MINUTE = 1000 * 60;

    /** Number of milliseconds per hour. */
    public static final long MILLIS_01_PER_HOUR = MILLIS_00_PER_MINUTE * 60;

    /** Number of milliseconds per day. */
    public static final long MILLIS_02_PER_DAY = MILLIS_01_PER_HOUR * 24;

    /** Number of milliseconds per week. */
    public static final long MILLIS_03_PER_WEEK = MILLIS_02_PER_DAY * 7;

    /** The daily pattern. */
    CmsPatternPanelDaily m_dailyPattern;

    /** The weekly pattern. */
    CmsPatternPanelWeekly m_weeklyPattern;

    /** The monthly pattern. */
    CmsPatternPanelMonthly m_monthlyPattern;

    /** The yearly pattern. */
    CmsPatternPanelYearly m_yearlyPattern;

    /** The begin datebox. */
    CmsDateBox m_dateboxbegin = new CmsDateBox();

    /** The end datebox. */
    CmsDateBox m_dateboxend = new CmsDateBox();

    /** The end date box. */
    TextBox m_endDate = new TextBox();

    /** The start date box. */
    TextBox m_startDate = new TextBox();

    /** The times text box. */
    TextBox m_times = new TextBox();

    /** The end date. */
    Date m_endDateValue = new Date();

    /** The start date. */
    Date m_startDateValue = new Date();

    /** Array of all radio button. */
    private CmsRadioButton[] m_arrayRadiobox;

    /** The error display for this widget. */
    private CmsErrorWidget m_error = new CmsErrorWidget();

    /** Value of the radio group duration. */
    private CmsRadioButtonGroup m_groupDuration = new CmsRadioButtonGroup();

    /** Value of the radio group pattern. */
    private CmsRadioButtonGroup m_groupPattern = new CmsRadioButtonGroup();

    /** The lower panel for detail duration information. */
    private Panel m_lowPanel = new FlowPanel();

    /** All radiobottons of the low panel. */
    private CmsRadioButton[] m_lowRadioButton = new CmsRadioButton[3];
    /** The mein panel for the table. */
    private Panel m_panel = new FlowPanel();
    /** The actual active pattern panel. */
    private Panel m_patterPanel;
    /** The duratioen selection. */
    CmsSelectBox m_duration;

    /** The serial panel. */
    private Panel m_serialPanel = new FlowPanel();
    /** The root panel containing the other components of this widget. */
    private FlexTable m_table = new FlexTable();
    /** The top Panel for detail time information. */
    private Panel m_topPanel = new FlowPanel();

    /** The used time format. */
    private DateTimeFormat m_timeFormat;

    /** JSON of all labels. */
    private JSONObject m_labels;

    /**
     * Category field widgets for ADE forms.<p>
     * @param labels a JSON of all needed labels
     */
    public CmsSerialDate(JSONObject labels) {

        super();

        m_labels = labels;

        m_dailyPattern = new CmsPatternPanelDaily(m_labels);
        m_weeklyPattern = new CmsPatternPanelWeekly(m_labels);
        m_monthlyPattern = new CmsPatternPanelMonthly(m_labels);
        m_yearlyPattern = new CmsPatternPanelYearly(m_labels);
        m_patterPanel = m_dailyPattern;
        try {
            m_timeFormat = DateTimeFormat.getFormat(Messages.get().key(Messages.GUI_DATEBOX_TIME_PATTERN_0));
        } catch (Exception e) {
            // in case the pattern is not available, fall back to standard en pattern
            m_timeFormat = DateTimeFormat.getFormat("hh:mm aa");
        }
        m_endDate.setValue(m_timeFormat.format(new Date()));
        m_startDate.setValue(m_timeFormat.format(new Date()));
        m_dateboxbegin.setValue(new Date());

        setSelectVaues();
        setTopPanel();
        setLowPanel();

        m_dateboxbegin.getTextField().getTextBoxContainer().addStyleName(
                org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE.widgetCss().calendarStyle());
        m_dateboxend.getTextField().getTextBoxContainer().addStyleName(
                org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE.widgetCss().calendarStyle());

        m_table.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDataTabel());
        m_table.insertRow(0);

        // Table for top panel
        FlexTable topPanel = new FlexTable();
        topPanel.insertRow(0);
        // add the Time view.
        topPanel.setWidget(0, 0, m_topPanel);
        topPanel.getCellFormatter().getElement(0, 0).getStyle().setWidth(200, Unit.PX);
        // add the date view.
        topPanel.setWidget(0, 1, m_lowPanel);
        m_table.setWidget(0, 0, topPanel);
        m_table.getFlexCellFormatter().setColSpan(0, 0, 3);
        m_table.getCellFormatter().addStyleName(0, 0,
                I_CmsLayoutBundle.INSTANCE.widgetCss().serialDataTabelBorderBottom());

        // the selection view
        m_table.insertRow(1);
        m_table.setWidget(1, 0, m_serialPanel);
        m_table.getCellFormatter().getElement(1, 0).getStyle().setWidth(1, Unit.PX);
        m_table.setWidget(1, 1, new SimplePanel());
        m_table.getCellFormatter().addStyleName(1, 1,
                I_CmsLayoutBundle.INSTANCE.widgetCss().serialDataTabelBorderRight());
        m_table.setWidget(1, 2, m_patterPanel);

        for (int i = 0; i < m_arrayRadiobox.length; i++) {
            m_arrayRadiobox[i].addStyleName(org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE
                    .widgetCss().radioButtonlabel());
            m_arrayRadiobox[i].addClickHandler(new ClickHandler() {

                public void onClick(ClickEvent event) {

                    changePattern();
                }
            });

            m_serialPanel.add(m_arrayRadiobox[i]);
        }
        initWidget(m_panel);
        m_panel.add(m_table);
        m_panel.add(m_error);

    }

    /**
     * Initializes this class.<p>
     */
    public static void initClass() {

        // registers a factory for creating new instances of this widget
        CmsWidgetFactoryRegistry.instance().registerFactory(WIDGET_TYPE, new I_CmsFormWidgetFactory() {

            /**
             * @see org.opencms.gwt.client.ui.input.form.I_CmsFormWidgetFactory#createWidget(java.util.Map)
             */
            public I_CmsFormWidget createWidget(Map<String, String> widgetParams) {

                return new CmsSerialDate(null);
            }
        });
    }

    /**
     * Returns the int value of the given String or the default value if parsing the String fails.<p>
     * 
     * @param strValue the String to parse
     * @param defaultValue the default value to use if parsing fails
     * @return the int value of the given String
     */
    protected static int getIntValue(String strValue, int defaultValue) {

        int result = defaultValue;
        if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(strValue)) {
            try {
                result = Integer.parseInt(strValue);
            } catch (NumberFormatException e) {
                // no number, use default value
            }
        }
        return result;
    }

    /**
     * Returns the long value of the given String or the default value if parsing the String fails.<p>
     * 
     * @param strValue the String to parse
     * @param defaultValue the default value to use if parsing fails
     * @return the long value of the given String
     */
    protected static long getLongValue(String strValue, long defaultValue) {

        long result = defaultValue;
        if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(strValue)) {
            try {
                result = Long.parseLong(strValue);
            } catch (NumberFormatException e) {
                // no number, use default value
            }
        }
        return result;
    }

    /**
     * @see com.google.gwt.event.logical.shared.HasValueChangeHandlers#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler)
     */
    public HandlerRegistration addValueChangeHandler(ValueChangeHandler<String> handler) {

        return addHandler(handler, ValueChangeEvent.getType());
    }

    /**
     * Cleared all fields for the inactive view.<p>
     */
    public void clearFealds() {

        m_dateboxbegin.setFormValueAsString("");
        m_dateboxend.setFormValueAsString("");
        m_startDate.setValue("");
        m_endDate.setValue("");
    }

    /**
     * Represents a value change event.<p>
     */
    public void fireValueChange() {

        CmsDebugLog.getInstance().printLine(getFormValueAsString());
        ValueChangeEvent.fire(this, getFormValueAsString());
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#getApparentValue()
     */
    public String getApparentValue() {

        return null;
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#getFieldType()
     */
    public FieldType getFieldType() {

        return null;
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#getFormValue()
     */
    public Object getFormValue() {

        return getFormValueAsString();
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#getFormValueAsString()
     */
    public String getFormValueAsString() {

        return selectValues();
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#isEnabled()
     */
    public boolean isEnabled() {

        return false;
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#reset()
     */
    public void reset() {

        //nothing to do

    }

    /** Selects the right ending element. 
     * @param element the element that should be checked
     * 
     * */
    public void selectEnding(int element) {

        m_groupDuration.selectButton(m_lowRadioButton[element]);
    }

    /**
     * Sets the radio buttons active or inactive.<p>
     * @param active true or false to activate or deactivate
     * */
    public void setActive(boolean active) {

        // Iterate about all radio button.
        for (int i = 0; i < m_arrayRadiobox.length; i++) {
            // set the radio button active / inactive.
            m_arrayRadiobox[i].setEnabled(active);
            // if this widget is set inactive.
            if (!active) {
                // deselect all radio button.
                m_arrayRadiobox[i].setChecked(active);
            }
            if (active) {
                if (i == 0) {
                    m_arrayRadiobox[i].setChecked(active);
                }
            }
        }
        for (int i = 0; i < m_lowRadioButton.length; i++) {
            // set the radio button active / inactive.
            m_lowRadioButton[i].setEnabled(active);
            // if this widget is set inactive.
            if (!active) {
                // deselect all radio button.
                m_lowRadioButton[i].setChecked(active);
            }
            if (active) {
                if (i == 0) {
                    m_lowRadioButton[i].setChecked(active);
                }
            }
        }

        for (int i = 0; i < m_dailyPattern.getSelection().length; i++) {
            // set the radio button active / inactive.
            m_dailyPattern.getSelection()[i].setEnabled(active);
            // if this widget is set inactive.
            if (!active) {
                // deselect all radio button.
                m_dailyPattern.getSelection()[i].setChecked(active);
            }
            if (active) {
                if (i == 0) {
                    m_dailyPattern.getSelection()[i].setChecked(active);
                }
            }
        }

    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#setAutoHideParent(org.opencms.gwt.client.ui.I_CmsAutoHider)
     */
    public void setAutoHideParent(I_CmsAutoHider autoHideParent) {

        // nothing to do
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#setEnabled(boolean)
     */
    public void setEnabled(boolean enabled) {

        // nothing to do
    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#setErrorMessage(java.lang.String)
     */
    public void setErrorMessage(String errorMessage) {

        //m_error.setText(errorMessage);

    }

    /**
     * @see org.opencms.gwt.client.ui.input.I_CmsFormWidget#setFormValueAsString(java.lang.String)
     */
    public void setFormValueAsString(String value) {

        if (!value.isEmpty()) {
            Map<String, String> values = new HashMap<String, String>();
            String[] split = value.split("\\|");
            for (int i = 0; i < split.length; i++) {
                int pars = split[i].indexOf("=");
                String key = split[i].substring(0, pars);
                String val = split[i].substring(pars + 1);
                values.put(key, val);
            }
            setValues(values);
        }

    }

    /**
     * Creates a serial date entry from the given property value.<p>
     * 
     * If no matching serial date could be created, <code>null</code> is returned.<p>
     * 
     * @param values the Map containing the date configuration values
     */
    public void setValues(Map<String, String> values) {

        // first set serial date fields used by all serial types

        // fetch the start date and time

        String startLong = values.get(CONFIG_STARTDATE);
        m_startDateValue = new Date(getLongValue(startLong, 0));
        m_startDate.setValue(m_timeFormat.format(m_startDateValue));

        m_dateboxbegin.setValue(m_startDateValue);
        // the end date and time (this means the duration of a single entry)

        String endLong = values.get(CONFIG_ENDDATE);
        m_endDateValue = new Date(getLongValue(endLong, 0));
        m_endDate.setValue(m_timeFormat.format(m_endDateValue));

        if (getLongValue(endLong, 0) > getLongValue(startLong, 0)) {
            // duration at least one day, calculate it
            long delta = getLongValue(endLong, 0) - getLongValue(startLong, 0);
            int test = new Long(delta / MILLIS_02_PER_DAY).intValue();
            m_duration.selectValue((test + 1) + "");
        }

        // determine the serial end type
        String endTypeStr = values.get(CONFIG_END_TYPE);
        int endType = getIntValue(endTypeStr, END_TYPE_NEVER);
        m_groupDuration.selectButton(m_lowRadioButton[endType - 1]);
        if (endType == END_TYPE_TIMES) {
            // end type: after a number of occurences
            String occurStr = values.get(CONFIG_OCCURENCES);
            m_times.setText(occurStr);
        } else if (endType == END_TYPE_DATE) {
            // end type: ends at a specified date
            String endDateStr = values.get(CONFIG_SERIAL_ENDDATE);
            long endDate = getLongValue(endDateStr, 0);
            m_dateboxend.setValue(new Date(endDate));

        }

        // now determine the serial date options depending on the serial date type

        String type = values.get(CONFIG_TYPE);
        int entryType = getIntValue(type, 1);
        m_groupPattern.selectButton(m_arrayRadiobox[entryType - 1]);
        changePattern();
        switch (entryType) {
        case TYPE_DAILY:
            // daily series entry, get interval and working days flag
            String intervalStr = values.get(CONFIG_INTERVAL);
            String workingDaysStr = values.get(CONFIG_EVERY_WORKING_DAY);
            boolean workingDays = Boolean.valueOf(workingDaysStr).booleanValue();
            m_dailyPattern.setInterval(intervalStr);
            if (workingDays) {
                m_dailyPattern.setSelection(2);
            } else {
                m_dailyPattern.setSelection(1);
            }

            break;
        case TYPE_WEEKLY:
            // weekly series entry
            intervalStr = values.get(CONFIG_INTERVAL);
            String weekDaysStr = values.get(CONFIG_WEEKDAYS);
            List<String> weekDaysStrList = CmsStringUtil.splitAsList(weekDaysStr, SEPARATOR_WEEKDAYS, true);
            m_weeklyPattern.setInterval(intervalStr);
            m_weeklyPattern.setWeekDays(weekDaysStrList);
            break;
        case TYPE_MONTHLY:
            // monthly series entry
            intervalStr = values.get(CONFIG_INTERVAL);
            String dayOfMonthStr = values.get(CONFIG_DAY_OF_MONTH);
            int dayOfMonth = getIntValue(dayOfMonthStr, 1);
            String weekDayStr = values.get(CONFIG_WEEKDAYS);
            int weekDay = getIntValue(weekDayStr, -1);
            m_monthlyPattern.setWeekDay(weekDay);
            m_monthlyPattern.setInterval(intervalStr);
            m_monthlyPattern.setDayOfMonth(dayOfMonth);

            break;
        case TYPE_YEARLY:
            // yearly series entry
            dayOfMonthStr = values.get(CONFIG_DAY_OF_MONTH);
            dayOfMonth = getIntValue(dayOfMonthStr, 1);
            weekDayStr = values.get(CONFIG_WEEKDAYS);
            weekDay = getIntValue(weekDayStr, -1);
            String monthStr = values.get(CONFIG_MONTH);
            int month = getIntValue(monthStr, 0);
            m_yearlyPattern.setWeekDay(weekDay);
            m_yearlyPattern.setDayOfMonth(dayOfMonth);
            m_yearlyPattern.setMonth(month);

            break;
        default:

        }
        selectValues();
    }

    /**
     * Selects the right view for the selected pattern.<p>
     */
    protected void changePattern() {

        if (m_groupPattern.getSelectedButton() != null) {
            String buttonName = m_groupPattern.getSelectedButton().getName();
            // m_patterPanel.removeFromParent();
            if (buttonName.equals(KEY_DAILY)) {
                m_patterPanel = m_dailyPattern;
                m_dailyPattern.addValueChangeHandler(new ValueChangeHandler<String>() {

                    public void onValueChange(ValueChangeEvent<String> event) {

                        fireValueChange();

                    }
                });
            }
            if (buttonName.equals(KEY_WEEKLY)) {
                m_patterPanel = m_weeklyPattern;
                m_weeklyPattern.addValueChangeHandler(new ValueChangeHandler<String>() {

                    public void onValueChange(ValueChangeEvent<String> event) {

                        fireValueChange();

                    }

                });

            }
            if (buttonName.equals(KEY_MONTHLY)) {
                m_patterPanel = m_monthlyPattern;
                m_monthlyPattern.addValueChangeHandler(new ValueChangeHandler<String>() {

                    public void onValueChange(ValueChangeEvent<String> event) {

                        fireValueChange();

                    }

                });
            }
            if (buttonName.equals(KEY_YEARLY)) {
                m_patterPanel = m_yearlyPattern;
                m_yearlyPattern.addValueChangeHandler(new ValueChangeHandler<String>() {

                    public void onValueChange(ValueChangeEvent<String> event) {

                        fireValueChange();

                    }

                });
            }
            m_table.setWidget(1, 2, m_patterPanel);
            fireValueChange();
        }

    }

    /**
     * Selects all needed information an build the result string.<p>
     * 
     * @return the result string
     * */
    @SuppressWarnings("deprecation")
    private String selectValues() {

        String result = "";
        String type = "1";
        if (m_groupPattern.getSelectedButton() != null) {
            type = m_groupPattern.getSelectedButton().getName();
        }
        result += CONFIG_TYPE + "=" + type + "|";
        switch (Integer.parseInt(type)) {
        case (1):
            result += CONFIG_INTERVAL + "=" + m_dailyPattern.getIterval() + "|";
            result += CONFIG_EVERY_WORKING_DAY + "=" + m_dailyPattern.getWorkingDay() + "|";
            break;
        case (2):
            result += CONFIG_INTERVAL + "=" + m_weeklyPattern.getInterval() + "|";
            result += CONFIG_WEEKDAYS + "=" + m_weeklyPattern.getWeekDays() + "|";

            break;
        case (3):
            result += CONFIG_INTERVAL + "=" + m_monthlyPattern.getInterval() + "|";
            result += CONFIG_DAY_OF_MONTH + "=" + m_monthlyPattern.getDayOfMonth() + "|";
            if (!m_monthlyPattern.getWeekDays().equals("-1")) {
                result += CONFIG_WEEKDAYS + "=" + m_monthlyPattern.getWeekDays() + "|";
            }
            break;
        case (4):
            result += CONFIG_DAY_OF_MONTH + "=" + m_yearlyPattern.getDayOfMonth() + "|";
            result += CONFIG_MONTH + "=" + m_yearlyPattern.getMonth() + "|";
            if (!m_yearlyPattern.getWeekDays().equals("-1")) {
                result += CONFIG_WEEKDAYS + "=" + m_yearlyPattern.getWeekDays() + "|";
            }
            break;
        default:
            break;

        }
        Date startDate = new Date();
        Date endDate = new Date();
        m_startDateValue = m_dateboxbegin.getValue();
        if (m_startDateValue == null) {
            m_startDateValue = new Date();
            m_startDate.setText(m_timeFormat.format(m_startDateValue));
            m_endDate.setText(m_timeFormat.format(m_startDateValue));
        }
        startDate = m_timeFormat.parse(m_startDate.getText());
        m_startDateValue.setHours(startDate.getHours());
        m_startDateValue.setMinutes(startDate.getMinutes());

        endDate = m_timeFormat.parse(m_endDate.getText());
        m_endDateValue.setHours(endDate.getHours());
        m_endDateValue.setMinutes(endDate.getMinutes());
        m_endDateValue.setDate((m_endDateValue.getDate() + Integer.parseInt(m_duration.getFormValueAsString())));
        long endtime = m_endDateValue.getTime();
        CmsDebugLog.getInstance().printLine("New Endtime: " + endtime);
        result += CONFIG_STARTDATE + "=" + m_startDateValue.getTime() + "|";
        result += CONFIG_ENDDATE + "=" + endtime + "|";
        String endtype = "1";
        if (m_groupDuration.getSelectedButton() != null) {
            endtype = m_groupDuration.getSelectedButton().getName();
        }
        switch (Integer.parseInt(endtype)) {
        case (1):
            break;
        case (END_TYPE_TIMES):
            if (!m_times.getText().isEmpty()) {
                result += CONFIG_OCCURENCES + "=" + m_times.getText() + "|";
            }
            break;
        case (END_TYPE_DATE):
            if (!m_dateboxend.getValueAsFormatedString().isEmpty()) {
                result += CONFIG_SERIAL_ENDDATE + "=" + m_dateboxend.getFormValueAsString() + "|";
            }
            break;
        default:
            break;

        }

        result += CONFIG_END_TYPE + "=" + endtype;
        return result;
    }

    /**
     * Private function to set all the end selections.<p>
     * */
    private void setLowPanel() {

        FlexTable table = new FlexTable();
        table.insertRow(0);
        FlowPanel cell1 = new FlowPanel();
        Label startDate = new Label(m_labels.get("GUI_SERIALDATE_TIME_STARTDATE_0").isString().stringValue());
        startDate.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDateLable());
        cell1.add(startDate);
        cell1.getElement().getStyle().setWidth(100, Unit.PCT);
        cell1.add(m_dateboxbegin);
        m_dateboxbegin.setDateOnly(true);
        m_dateboxbegin.getElement().getStyle().setWidth(108, Unit.PX);
        m_dateboxbegin.getElement().getStyle().setFloat(Float.RIGHT);
        m_dateboxbegin.addValueChangeHandler(new ValueChangeHandler<Date>() {

            public void onValueChange(ValueChangeEvent<Date> event) {

                fireValueChange();

            }
        });
        table.setWidget(0, 0, cell1);
        table.getCellFormatter().getElement(0, 0).getStyle().setWidth(185, Unit.PX);
        table.getCellFormatter().getElement(0, 0).getStyle().setVerticalAlign(VerticalAlign.TOP);

        FlowPanel cell2 = new FlowPanel();
        CmsRadioButton sel1 = new CmsRadioButton("1",
                m_labels.get("GUI_SERIALDATE_DURATION_ENDTYPE_NEVER_0").isString().stringValue());
        m_lowRadioButton[0] = sel1;
        sel1.setGroup(m_groupDuration);
        sel1.setChecked(true);
        sel1.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDatelowPanelSelection());
        sel1.addStyleName(
                org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE.widgetCss().radioButtonlabel());
        sel1.getElement().getStyle().setMarginLeft(13, Unit.PX);
        sel1.getElement().getStyle().setMarginTop(0, Unit.PX);
        sel1.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {

                fireValueChange();

            }
        });

        CmsRadioButton sel2 = new CmsRadioButton("2",
                m_labels.get("GUI_SERIALDATE_DURATION_ENDTYPE_OCC_0").isString().stringValue());
        m_lowRadioButton[1] = sel2;
        sel2.setGroup(m_groupDuration);
        sel2.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDatelowPanelSelection());
        sel2.addStyleName(
                org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE.widgetCss().radioButtonlabel());
        sel2.getElement().setAttribute("style", "clear:left");
        sel2.getElement().getStyle().setMarginLeft(13, Unit.PX);
        sel2.getElement().getStyle().setMarginTop(6, Unit.PX);
        sel2.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {

                if (m_times.getText().isEmpty()) {
                    m_times.setValue("1");
                }
                fireValueChange();

            }
        });

        CmsRadioButton sel3 = new CmsRadioButton("3",
                m_labels.get("GUI_SERIALDATE_DURATION_ENDTYPE_DATE_0").isString().stringValue());
        m_lowRadioButton[2] = sel3;
        sel3.setGroup(m_groupDuration);
        sel3.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDatelowPanelSelection());
        sel3.addStyleName(
                org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE.widgetCss().radioButtonlabel());
        sel3.getElement().setAttribute("style", "clear:left");
        sel3.getElement().getStyle().setMarginLeft(13, Unit.PX);
        sel3.getElement().getStyle().setMarginTop(6, Unit.PX);
        sel3.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {

                m_dateboxend.setValue(new Date());
                fireValueChange();

            }
        });

        cell2.add(sel1);
        cell2.add(sel2);

        m_times.setStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().textBoxSerialDate());
        m_times.getElement().getStyle().setMarginTop(5, Unit.PX);
        m_times.getElement().getStyle().setWidth(82, Unit.PX);
        cell2.add(m_times);
        m_times.addKeyPressHandler(new KeyPressHandler() {

            public void onKeyPress(KeyPressEvent event) {

                fireValueChange();

            }
        });
        m_times.addValueChangeHandler(new ValueChangeHandler<String>() {

            public void onValueChange(ValueChangeEvent<String> event) {

                fireValueChange();

            }

        });
        m_times.addFocusHandler(new FocusHandler() {

            public void onFocus(FocusEvent event) {

                selectEnding(1);

            }
        });
        Label times = new Label(
                m_labels.get("GUI_SERIALDATE_DURATION_ENDTYPE_OCC_TIMES_0").isString().stringValue());
        times.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDateLable());
        times.getElement().getStyle().setMarginTop(7, Unit.PX);
        times.getElement().getStyle().setMarginLeft(2, Unit.PX);
        cell2.add(times);
        cell2.add(sel3);

        cell2.add(m_dateboxend);
        m_dateboxend.setDateOnly(true);
        m_dateboxend.getElement().getStyle().setWidth(90, Unit.PX);
        m_dateboxend.getElement().getStyle().setMarginTop(5, Unit.PX);
        m_dateboxend.getElement().getStyle().setMarginLeft(22, Unit.PX);
        m_dateboxend.addValueChangeHandler(new ValueChangeHandler<Date>() {

            public void onValueChange(ValueChangeEvent<Date> event) {

                fireValueChange();

            }
        });
        m_dateboxend.addDomHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {

                selectEnding(2);

            }
        }, ClickEvent.getType());
        table.setWidget(0, 1, cell2);
        m_lowPanel.add(table);
        m_lowPanel.setStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDatelowPanel());
    }

    /**
     * Private function to set all possible selections.<p>
     * */
    private void setSelectVaues() {

        m_arrayRadiobox = new CmsRadioButton[4];
        m_arrayRadiobox[0] = new CmsRadioButton(KEY_DAILY,
                m_labels.get("GUI_SERIALDATE_TYPE_DAILY_0").isString().stringValue());
        m_arrayRadiobox[0].setGroup(m_groupPattern);
        m_arrayRadiobox[0].setChecked(true);
        m_arrayRadiobox[1] = new CmsRadioButton(KEY_WEEKLY,
                m_labels.get("GUI_SERIALDATE_TYPE_WEEKLY_0").isString().stringValue());
        m_arrayRadiobox[1].setGroup(m_groupPattern);
        m_arrayRadiobox[2] = new CmsRadioButton(KEY_MONTHLY,
                m_labels.get("GUI_SERIALDATE_TYPE_MONTHLY_0").isString().stringValue());
        m_arrayRadiobox[2].setGroup(m_groupPattern);
        m_arrayRadiobox[3] = new CmsRadioButton(KEY_YEARLY,
                m_labels.get("GUI_SERIALDATE_TYPE_YEARLY_0").isString().stringValue());
        m_arrayRadiobox[3].setGroup(m_groupPattern);
    }

    /**
     * Private function to set all the time selections.<p>
     * */
    private void setTopPanel() {

        Label l_start = new Label(m_labels.get("GUI_SERIALDATE_TIME_STARTTIME_0").isString().stringValue());
        l_start.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDateLable());
        l_start.getElement().getStyle().setFloat(Float.LEFT);
        m_startDate.setStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().textBoxSerialDate());
        m_startDate.getElement().getStyle().setWidth(110, Unit.PX);
        m_startDate.getElement().getStyle().setMarginRight(1, Unit.PX);
        m_startDate.getElement().getStyle().setFloat(Float.RIGHT);
        m_startDate.addKeyPressHandler(new KeyPressHandler() {

            public void onKeyPress(KeyPressEvent event) {

                fireValueChange();

            }
        });

        Label l_end = new Label(m_labels.get("GUI_SERIALDATE_TIME_ENDTIME_0").isString().stringValue());
        l_end.addStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().serialDateLable());
        l_end.getElement().getStyle().clearLeft();
        l_end.getElement().getStyle().setFloat(Float.LEFT);
        l_end.getElement().getStyle().setMarginTop(8, Unit.PX);
        m_endDate.setStyleName(I_CmsLayoutBundle.INSTANCE.widgetCss().textBoxSerialDate());
        m_endDate.getElement().getStyle().setWidth(110, Unit.PX);
        m_endDate.getElement().getStyle().setMarginRight(1, Unit.PX);
        m_endDate.getElement().getStyle().setMarginTop(5, Unit.PX);
        m_endDate.getElement().getStyle().setFloat(Float.RIGHT);
        m_endDate.addKeyPressHandler(new KeyPressHandler() {

            public void onKeyPress(KeyPressEvent event) {

                fireValueChange();

            }
        });

        m_duration = new CmsSelectBox();
        m_duration.getElement().getStyle().setMarginTop(5, Unit.PX);
        m_duration.getElement().getStyle().setFloat(Float.RIGHT);
        m_duration.getElement().getStyle().setMarginRight(1, Unit.PX);
        m_duration.getElement().getStyle().setMarginBottom(3, Unit.PX);
        m_duration.getOpener().setWidth("118px");
        m_duration.getOpener().setStyleName(org.opencms.ade.contenteditor.client.css.I_CmsLayoutBundle.INSTANCE
                .widgetCss().selectBoxSelected());
        m_duration.getSelectorPopup().addStyleName(I_CmsLayoutBundle.INSTANCE.globalWidgetCss().selectBoxPopup());
        m_duration.addValueChangeHandler(new ValueChangeHandler<String>() {

            public void onValueChange(ValueChangeEvent<String> event) {

                fireValueChange();

            }
        });

        m_duration.addOption("0",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_SAMEDAY_0").isString().stringValue());
        m_duration.addOption("1",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_FIRST_0").isString().stringValue());
        m_duration.addOption("2",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_SECOND_0").isString().stringValue());
        m_duration.addOption("3",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_THIRD_0").isString().stringValue());
        m_duration.addOption("4",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_FOURTH_0").isString().stringValue());
        m_duration.addOption("5",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_FIFTH_0").isString().stringValue());
        m_duration.addOption("6",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_SIXTH_0").isString().stringValue());
        m_duration.addOption("7",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_ONEWEEK_0").isString().stringValue());
        m_duration.addOption("8",
                m_labels.get("GUI_SERIALDATE_DURATION_DURATION_TWOWEEK_0").isString().stringValue());

        m_topPanel.add(l_start);
        m_topPanel.add(m_startDate);

        m_topPanel.add(l_end);
        m_topPanel.add(m_endDate);

        m_topPanel.add(m_duration);

    }

}