blob: 454b52f9243334501c48a17757ffb1e69e2a9a1d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2013 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.util.Calendar;
import java.util.Date;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.mylyn.commons.core.DateUtil;
import org.eclipse.mylyn.commons.workbench.forms.DatePicker;
import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskDataModel;
import org.eclipse.mylyn.tasks.ui.editors.AbstractAttributeEditor;
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint;
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.ColumnSpan;
import org.eclipse.mylyn.tasks.ui.editors.LayoutHint.RowSpan;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author Steffen Pingel
* @author Robert Elves
*/
public class DateAttributeEditor extends AbstractAttributeEditor {
private DatePicker datePicker;
private boolean showTime;
private boolean showDateRelative;
private Text text;
public DateAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
super(manager, taskAttribute);
setLayoutHint(new LayoutHint(RowSpan.SINGLE, ColumnSpan.SINGLE));
setShowDateRelative(false);
}
@Override
public void createControl(Composite composite, FormToolkit toolkit) {
if (isReadOnly()) {
text = new Text(composite, SWT.FLAT | SWT.READ_ONLY);
text.setFont(EditorUtil.TEXT_FONT);
toolkit.adapt(text, false, false);
text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
text.setText(getTextValue());
text.setToolTipText(getDescription());
setControl(text);
} else {
datePicker = new DatePicker(composite, SWT.FLAT, getTextValue(), showTime, 0);
datePicker.setFont(EditorUtil.TEXT_FONT);
datePicker.setToolTipText(getDescription());
if (!showTime) {
datePicker.setDateFormat(EditorUtil.getDateFormat());
} else {
datePicker.setDateFormat(EditorUtil.getDateTimeFormat());
}
updateDatePicker();
datePicker.addPickerSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Calendar cal = datePicker.getDate();
if (cal != null) {
if (!showTime) {
TaskActivityUtil.snapStartOfDay(cal);
}
Date value = cal.getTime();
if (!value.equals(getValue())) {
setValue(value);
}
} else {
if (getValue() != null) {
setValue(null);
}
datePicker.setDate(null);
}
}
});
GridDataFactory.fillDefaults().hint(120, SWT.DEFAULT).grab(false, false).applyTo(datePicker);
datePicker.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
toolkit.adapt(datePicker, false, false);
setControl(datePicker);
}
}
private void updateDatePicker() {
if (getValue() != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(getValue());
datePicker.setDate(cal);
}
}
@Override
protected void decorateIncoming(Color color) {
if (datePicker != null) {
datePicker.setBackground(color);
}
}
public boolean getShowTime() {
return showTime;
}
private String getTextValue() {
Date date = getValue();
if (date != null) {
if (getShowTime()) {
return EditorUtil.formatDateTime(date);
} else if (getShowDateRelative()) {
return DateUtil.getRelative(date.getTime());
} else {
return EditorUtil.formatDate(date);
}
} else {
return ""; //$NON-NLS-1$
}
}
public Date getValue() {
return getAttributeMapper().getDateValue(getTaskAttribute());
}
public void setShowTime(boolean showTime) {
this.showTime = showTime;
}
public void setValue(Date date) {
getAttributeMapper().setDateValue(getTaskAttribute(), date);
attributeChanged();
}
@Override
public void refresh() {
if (text != null && !text.isDisposed()) {
text.setText(getTextValue());
}
if (datePicker != null && !datePicker.isDisposed()) {
updateDatePicker();
}
}
@Override
public boolean shouldAutoRefresh() {
return true;
}
public boolean getShowDateRelative() {
return showDateRelative;
}
public void setShowDateRelative(boolean showDateRelative) {
this.showDateRelative = showDateRelative;
}
}