blob: 6a40a8bd946950b3e04f280a178e3077d818dcf4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 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
* Maarten Meijer - fix for bug 284559
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.editors;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.mylyn.commons.ui.CommonImages;
import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.ui.TasksUiImages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author David Shepherd
* @author Steffen Pingel
*/
public class PriorityEditor {
private Control control;
private boolean ignoreNotification;
private Label label;
private Map<String, String> labelByValue;
private Menu menu;
private boolean readOnly;
private ToolItem selectionButton;
private ToolBar toolBar;
private String value;
private final TaskAttribute attribute;
public PriorityEditor() {
this(null);
}
public PriorityEditor(TaskAttribute attribute) {
this.attribute = attribute;
}
public void createControl(final Composite parent, FormToolkit toolkit) {
if (isReadOnly()) {
label = toolkit.createLabel(parent, ""); //$NON-NLS-1$
setControl(label);
} else {
toolBar = new ToolBar(parent, SWT.FLAT);
selectionButton = new ToolItem(toolBar, SWT.DROP_DOWN);
selectionButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (menu == null) {
createMenu(toolBar);
}
Point location = parent.toDisplay(toolBar.getLocation());
location.y = location.y + selectionButton.getBounds().height;
if (value != null) {
MenuItem[] items = menu.getItems();
for (MenuItem item : items) {
item.setSelection(value.equals(item.getData()));
}
}
menu.setLocation(location);
menu.setVisible(true);
}
});
selectionButton.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (menu != null) {
menu.dispose();
}
}
});
toolkit.adapt(toolBar);
setControl(toolBar);
}
}
private void createMenu(final ToolBar bar) {
menu = new Menu(bar);
for (String key : labelByValue.keySet()) {
final MenuItem item = new MenuItem(menu, SWT.CHECK);
item.setText(labelByValue.get(key));
item.setData(key);
item.setImage(getSmallImage(key));
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!ignoreNotification) {
value = (String) item.getData();
valueChanged(value);
}
}
});
}
}
public Control getControl() {
return control;
}
public Map<String, String> getLabelByValue() {
return Collections.unmodifiableMap(labelByValue);
}
private ImageDescriptor getLargeImageDescriptor(PriorityLevel priorityLevel) {
if (priorityLevel != null) {
switch (priorityLevel) {
case P1:
return CommonImages.PRIORITY_1_LARGE;
case P2:
return CommonImages.PRIORITY_2_LARGE;
case P3:
return CommonImages.PRIORITY_3_LARGE;
case P4:
return CommonImages.PRIORITY_4_LARGE;
case P5:
return CommonImages.PRIORITY_5_LARGE;
}
}
return CommonImages.PRIORITY_3_LARGE;
}
private Image getSmallImage(String value) {
ImageDescriptor descriptor = getSmallImageDescriptor(value);
if (descriptor != null) {
return CommonImages.getImage(descriptor);
}
return null;
}
private ImageDescriptor getSmallImageDescriptor(String value) {
PriorityLevel priorityLevel = getPriorityLevel(value);
if (priorityLevel != null) {
return TasksUiImages.getImageDescriptorForPriority(priorityLevel);
}
return null;
}
private PriorityLevel getPriorityLevel(String value) {
if (attribute != null) {
return attribute.getTaskData().getAttributeMapper().getPriorityLevel(attribute, value);
}
return PriorityLevel.fromString(value);
}
public String getToolTipText() {
if (label != null) {
return label.getToolTipText();
}
if (selectionButton != null) {
return selectionButton.getToolTipText();
}
return null;
}
public boolean isReadOnly() {
return readOnly;
}
public void select(String value, PriorityLevel level) {
try {
ignoreNotification = true;
this.value = value;
if (label != null) {
label.setImage(CommonImages.getImage(getLargeImageDescriptor(level)));
}
if (selectionButton != null && toolBar != null) {
selectionButton.setImage(CommonImages.getImage(getLargeImageDescriptor(level)));
}
} finally {
ignoreNotification = false;
}
}
private void setControl(Control control) {
this.control = control;
}
public void setLabelByValue(Map<String, String> labelByValue) {
this.labelByValue = new LinkedHashMap<String, String>(labelByValue);
// the menu will be re-created with updated options when it is requested again
if (menu != null) {
menu.dispose();
}
menu = null;
}
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
}
public void setToolTipText(String text) {
if (label != null) {
label.setToolTipText(text);
}
if (selectionButton != null) {
selectionButton.setToolTipText(text);
}
}
protected void valueChanged(String key) {
}
public String getValue() {
return value;
}
}