blob: ad498a4a10cba0effca6a958f44c314a796e1e9c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2011 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;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.commons.workbench.forms.DatePicker;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.DateRange;
import org.eclipse.mylyn.tasks.core.IRepositoryElement;
import org.eclipse.swt.SWT;
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.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
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.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
/**
* @author Rob Elves
*/
public class ScheduleDatePicker extends Composite {
private Text scheduledDateText;
private Button pickButton;
private final List<SelectionListener> pickerListeners = new LinkedList<SelectionListener>();
private final String initialText = DatePicker.LABEL_CHOOSE;
private final List<IRepositoryElement> tasks;
private final ScheduleTaskMenuContributor contributor;
private DateRange scheduledDate;
private final boolean isFloating = false;
private ImageHyperlink clearControl;
public ScheduleDatePicker(Composite parent, AbstractTask task, int style) {
super(parent, style);
if (task != null) {
if (task.getScheduledForDate() != null) {
this.scheduledDate = task.getScheduledForDate();
}
}
initialize((style & SWT.FLAT) > 0 ? SWT.FLAT : 0);
contributor = new ScheduleTaskMenuContributor() {
@Override
protected DateRange getScheduledForDate(AbstractTask singleTaskSelection) {
return ScheduleDatePicker.this.scheduledDate;
}
@Override
protected void setScheduledDate(DateRange dateRange) {
if (dateRange != null) {
scheduledDate = dateRange;
} else {
scheduledDate = null;
}
updateDateText();
notifyPickerListeners();
}
};
tasks = new ArrayList<IRepositoryElement>();
tasks.add(task);
}
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);
scheduledDateText = new Text(this, style);
scheduledDateText.setEditable(false);
GridData dateTextGridData = new GridData(SWT.FILL, SWT.FILL, false, false);
dateTextGridData.heightHint = 5;
dateTextGridData.grabExcessHorizontalSpace = true;
dateTextGridData.verticalAlignment = SWT.FILL;
scheduledDateText.setLayoutData(dateTextGridData);
scheduledDateText.setText(initialText);
clearControl = new ImageHyperlink(this, SWT.NONE);
clearControl.setImage(CommonImages.getImage(CommonImages.FIND_CLEAR_DISABLED));
clearControl.setHoverImage(CommonImages.getImage(CommonImages.FIND_CLEAR));
clearControl.setToolTipText(Messages.ScheduleDatePicker_Clear);
clearControl.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
setScheduledDate(null);
for (IRepositoryElement task : tasks) {
if (task instanceof AbstractTask) {
// XXX why is this set here?
((AbstractTask) task).setReminded(false);
}
}
notifyPickerListeners();
}
});
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) {
MenuManager menuManager = contributor.getSubMenuManager(tasks);
Menu menu = menuManager.createContextMenu(pickButton);
pickButton.setMenu(menu);
menu.setVisible(true);
Point location = pickButton.toDisplay(pickButton.getLocation());
Rectangle bounds = pickButton.getBounds();
menu.setLocation(location.x - pickButton.getBounds().x, location.y + bounds.height + 2);
}
});
updateDateText();
pack();
}
private void updateClearControlVisibility() {
if (clearControl != null && clearControl.getLayoutData() instanceof GridData) {
GridData gd = (GridData) clearControl.getLayoutData();
gd.exclude = scheduledDate == null;
clearControl.getParent().layout();
}
}
public void addPickerSelectionListener(SelectionListener listener) {
pickerListeners.add(listener);
}
@Override
public void setForeground(Color color) {
pickButton.setForeground(color);
scheduledDateText.setForeground(color);
super.setForeground(color);
}
@Override
public void setBackground(Color backgroundColor) {
pickButton.setBackground(backgroundColor);
scheduledDateText.setBackground(backgroundColor);
super.setBackground(backgroundColor);
}
private void notifyPickerListeners() {
for (SelectionListener listener : pickerListeners) {
listener.widgetSelected(null);
}
}
private void updateDateText() {
if (scheduledDate != null) {
scheduledDateText.setText(scheduledDate.toString());
} else {
scheduledDateText.setEnabled(false);
scheduledDateText.setText(DatePicker.LABEL_CHOOSE);
scheduledDateText.setEnabled(true);
}
updateClearControlVisibility();
}
@Override
public void setEnabled(boolean enabled) {
scheduledDateText.setEnabled(enabled);
pickButton.setEnabled(enabled);
clearControl.setEnabled(enabled);
super.setEnabled(enabled);
}
public DateRange getScheduledDate() {
return scheduledDate;
}
public void setScheduledDate(DateRange date) {
scheduledDate = date;
updateDateText();
}
public boolean isFloatingDate() {
return isFloating;
}
}