/* * 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); } }