/******************************************************************************* * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.common.ui.calendar; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; import org.eclipse.bpel.common.ui.Messages; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; /** * Creates a control that allows a user to either enter a date in a text * field or use a popup calendar to select a date. The image used in the * show calendar button and the date format style used to format/parse the * date are configurable. */ public class DatePicker extends Composite { /** Default date format style used to format date */ private static final int DEFAULT_DATE_STYLE = DateFormat.SHORT; private int dateStyle; Text dateDisplayField; private Button showCalendarButton; public DatePicker(Composite parent) { super(parent, SWT.NONE); dateStyle = DEFAULT_DATE_STYLE; createControls(); hookControlListeners(); } private void createControls() { GridLayout gl = new GridLayout(2, false); gl.horizontalSpacing = 3; setLayout(gl); dateDisplayField = new Text(this, SWT.BORDER | SWT.SINGLE); dateDisplayField.setText(getDateDisplayString(new Date())); GridData gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = GridData.FILL; dateDisplayField.setLayoutData(gd); showCalendarButton = new Button(this, SWT.PUSH); showCalendarButton.setText(Messages.DatePicker_button_text); gd = new GridData(); gd.grabExcessHorizontalSpace = false; gd.horizontalAlignment = GridData.BEGINNING; showCalendarButton.setLayoutData(gd); } private void hookControlListeners() { showCalendarButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setDate(CalendarPopup.openCalendarPopup(dateDisplayField, getDate())); } }); } private String getDateDisplayString(Date date) { if (date != null) { DateFormat formatter = DateFormat.getDateInstance(dateStyle); return formatter.format(date); } else { return Messages.DatePicker_noDateSelected; } } /** * Returns the date format style that the date picker uses to * display its date. This value is style constant from the * java.text.DateFormat class. The default style is DateFormat.SHORT. * * @return Returns the date format style which is used to format the date. */ public int getDateStyle() { return dateStyle; } /** * Sets the date format style that the picker users to display * its date. This value is style constant from the * java.text.DateFormat class. * * @param style The date format style to be used to format the date */ public void setDateStyle(int style) { dateStyle = style; } /** * Returns the image that is displayed in the show calendar button. * * @return the image that is displayed in the show calendar button. */ public Image getImage() { return showCalendarButton.getImage(); } /** * Sets the image that is display in the show calendar button. If null * is specified, the existing image is removed and the button text is set * to "..." * * @param image The image to display in the show calendar button or null * if no image should be displayed. */ public void setImage(Image image) { showCalendarButton.setImage(image); if (image != null) { showCalendarButton.setText( "" ); } else { showCalendarButton.setText(Messages.DatePicker_button_text); } } /* (non-Javadoc) * @see org.eclipse.swt.widgets.Widget#dispose() */ @Override public void dispose() { super.dispose(); } /** * Returns the current date entered in the picker or null if no date or * an invalid date is entered. * * @return the date of the picker */ public Date getDate() { try { // TODO Should we possibbly attempt to parse the string with // other date format styles? That way, a user would be // able to enter a valid date that does not conform to // the format used by the control DateFormat formatter = DateFormat.getDateInstance(dateStyle); return formatter.parse(dateDisplayField.getText()); } catch (ParseException e) { return null; } } /** * Sets the date of the picker or if null is specified, sets the selected * date to "None" * * @param date The new selected date for the picker */ public void setDate(Date date) { dateDisplayField.setText(getDateDisplayString(date)); } }