blob: edf20405bae0930d89cc566a11d030013761b941 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.provisional.commons.ui;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.internal.commons.ui.Messages;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.IInPlaceDialogListener;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.InPlaceDateSelectionDialog;
import org.eclipse.mylyn.internal.provisional.commons.ui.dialogs.InPlaceDialogEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
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.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
/**
* Temporary date picker from patch posted to: https://bugs.eclipse.org/bugs/show_bug.cgi?taskId=19945 see bug# 19945
* TODO: remove this class when an SWT date picker is added
*
* @author Bahadir Yagan
* @author Mik Kersten
* @since 1.0
*/
public class DatePicker extends Composite {
public final static String TITLE_DIALOG = Messages.DatePicker_Choose_Date;
public static final String LABEL_CHOOSE = Messages.DatePicker_Choose_Date;
private Text dateText;
private Button pickButton;
private Calendar date;
private final List<SelectionListener> pickerListeners = new LinkedList<SelectionListener>();
private DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
private String initialText = LABEL_CHOOSE;
private final boolean includeTimeOfday;
private final int hourOfDay = 0;
private int selectedHourOfDay = 0;
private ImageHyperlink clearControl;
public DatePicker(Composite parent, int style, String initialText, boolean includeHours, int selectedHourOfDay) {
super(parent, style);
this.initialText = initialText;
this.includeTimeOfday = includeHours;
this.selectedHourOfDay = selectedHourOfDay;
initialize((style & SWT.FLAT) != 0 ? SWT.FLAT : 0);
}
public DateFormat getDateFormat() {
return dateFormat;
}
public void setDatePattern(String pattern) {
this.dateFormat = new SimpleDateFormat(pattern);
}
public void setDateFormat(DateFormat dateFormat) {
this.dateFormat = dateFormat;
}
private void initialize(int style) {
GridLayout gridLayout = new GridLayout(3, false);
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
this.setLayout(gridLayout);
dateText = new Text(this, style);
GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false);
dateTextGridData.heightHint = 5;
dateTextGridData.grabExcessHorizontalSpace = true;
dateTextGridData.verticalAlignment = SWT.FILL;
dateText.setLayoutData(dateTextGridData);
dateText.setText(initialText);
dateText.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// key listener used because setting of date picker text causes
// modify listener to fire which results in perpetual dirty
// editor
notifyPickerListeners();
}
});
dateText.addFocusListener(new FocusAdapter() {
Calendar calendar = Calendar.getInstance();
@Override
public void focusLost(FocusEvent e) {
Date reminderDate;
try {
reminderDate = dateFormat.parse(dateText.getText());
calendar.setTime(reminderDate);
date = calendar;
updateDateText();
} catch (ParseException e1) {
updateDateText();
}
}
});
clearControl = new ImageHyperlink(this, SWT.NONE);
clearControl.setImage(CommonImages.getImage(CommonImages.FIND_CLEAR_DISABLED));
clearControl.setHoverImage(CommonImages.getImage(CommonImages.FIND_CLEAR));
clearControl.setToolTipText(Messages.DatePicker_Clear);
clearControl.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
dateSelected(false, null);
}
});
clearControl.setBackground(clearControl.getDisplay().getSystemColor(SWT.COLOR_WHITE));
GridData clearButtonGridData = new GridData();
clearButtonGridData.horizontalIndent = 3;
clearControl.setLayoutData(clearButtonGridData);
pickButton = new Button(this, style | SWT.ARROW | SWT.DOWN);
GridData pickButtonGridData = new GridData(SWT.RIGHT, SWT.FILL, false, true);
pickButtonGridData.verticalIndent = 0;
pickButtonGridData.horizontalIndent = 3;
pickButton.setLayoutData(pickButtonGridData);
pickButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
final Calendar newCalendar = Calendar.getInstance();
newCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
newCalendar.set(Calendar.MINUTE, 0);
newCalendar.set(Calendar.SECOND, 0);
newCalendar.set(Calendar.MILLISECOND, 0);
if (date != null) {
newCalendar.setTime(date.getTime());
}
Shell shell = pickButton.getShell();
if (shell == null) {
//fall back
if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
} else {
shell = new Shell(PlatformUI.getWorkbench().getDisplay());
}
}
final InPlaceDateSelectionDialog dialog = new InPlaceDateSelectionDialog(shell, pickButton,
newCalendar, DatePicker.TITLE_DIALOG, includeTimeOfday, selectedHourOfDay);
dialog.addEventListener(new IInPlaceDialogListener() {
public void buttonPressed(InPlaceDialogEvent event) {
Calendar selectedCalendar = null;
if (event.getReturnCode() == Window.OK && dialog.getDate() != null) {
selectedCalendar = newCalendar;
selectedCalendar.setTime(dialog.getDate());
}
dateSelected(event.getReturnCode() == Window.CANCEL, selectedCalendar);
}
});
dialog.open();
}
});
updateClearControlVisibility();
pack();
setBackground(getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
}
public void addPickerSelectionListener(SelectionListener listener) {
pickerListeners.add(listener);
}
/**
* must check for null return value
*
* @return Calendar
*/
public Calendar getDate() {
return date;
}
@Override
public void setBackground(Color backgroundColor) {
super.setBackground(backgroundColor);
dateText.setBackground(backgroundColor);
if ((getStyle() & SWT.FLAT) != 0) {
pickButton.setBackground(backgroundColor);
} else {
pickButton.setBackground(null);
}
}
public void setDate(Calendar date) {
this.date = date;
updateDateText();
}
// private void showDatePicker(int x, int y) {
// pickerShell = new Shell(SWT.APPLICATION_MODAL);//| SWT.ON_TOP
// pickerShell.setText("Shell");
// pickerShell.setLayout(new FillLayout());
// if (date == null) {
// date = new GregorianCalendar();
// }
// // datePickerPanel.setDate(date);
// datePickerPanel = new DatePickerPanel(pickerShell, SWT.NONE, date);
// datePickerPanel.addSelectionChangedListener(new
// ISelectionChangedListener() {
//
// public void selectionChanged(SelectionChangedEvent event) {
// if(!event.getSelection().isEmpty()) {
// dateSelected(event.getSelection().isEmpty(),
// ((DateSelection)event.getSelection()).getDate());
// } else {
// dateSelected(false, null);
// }
// }});
//
// pickerShell.setSize(new Point(240, 180));
// pickerShell.setLocation(new Point(x, y));
//
// datePickerPanel.addKeyListener(new KeyListener() {
// public void keyPressed(KeyEvent e) {
// if (e.keyCode == SWT.ESC) {
// dateSelected(true, null);
// }
// }
//
// public void keyReleased(KeyEvent e) {
// }
// });
//
// pickerShell.addFocusListener(new FocusListener() {
//
// public void focusGained(FocusEvent e) {
//
// }
//
// public void focusLost(FocusEvent e) {
//
// }});
//
// pickerShell.pack();
// pickerShell.open();
// }
/** Called when the user has selected a date */
protected void dateSelected(boolean canceled, Calendar selectedDate) {
if (!canceled) {
this.date = selectedDate != null ? selectedDate : null;
updateDateText();
notifyPickerListeners();
}
}
private void notifyPickerListeners() {
for (SelectionListener listener : pickerListeners) {
listener.widgetSelected(null);
}
}
private void updateDateText() {
if (date != null) {
Date currentDate = new Date(date.getTimeInMillis());
dateText.setText(dateFormat.format(currentDate));
} else {
dateText.setEnabled(false);
dateText.setText(LABEL_CHOOSE);
dateText.setEnabled(true);
}
updateClearControlVisibility();
}
private void updateClearControlVisibility() {
if (clearControl != null && clearControl.getLayoutData() instanceof GridData) {
GridData gd = (GridData) clearControl.getLayoutData();
gd.exclude = date == null;
clearControl.getParent().layout();
}
}
@Override
public void setEnabled(boolean enabled) {
dateText.setEnabled(enabled);
pickButton.setEnabled(enabled);
clearControl.setEnabled(enabled);
super.setEnabled(enabled);
}
}