blob: ec738361ca4dc1b916e5ac48ccea8e57e7e56a3c [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.editors;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
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.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author Steffen Pingel
*/
public class SingleSelectionAttributeEditor extends AbstractAttributeEditor {
private CCombo combo;
private boolean ignoreNotification;
private Text text;
private String[] values;
public SingleSelectionAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
super(manager, taskAttribute);
}
@Override
public void createControl(final Composite parent, FormToolkit toolkit) {
if (isReadOnly()) {
text = new Text(parent, SWT.FLAT | SWT.READ_ONLY);
text.setFont(EditorUtil.TEXT_FONT);
toolkit.adapt(text, false, false);
text.setData(FormToolkit.KEY_DRAW_BORDER, Boolean.FALSE);
text.setToolTipText(getDescription());
setControl(text);
} else {
combo = new CCombo(parent, SWT.FLAT | SWT.READ_ONLY);
combo.setVisibleItemCount(10);
toolkit.adapt(combo, false, false);
combo.setFont(EditorUtil.TEXT_FONT);
combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
combo.setToolTipText(getDescription());
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
if (!ignoreNotification) {
int index = combo.getSelectionIndex();
if (index > -1) {
Assert.isNotNull(values);
Assert.isLegal(index >= 0 && index <= values.length - 1);
setValue(values[index]);
}
}
}
});
EditorUtil.addScrollListener(combo);
setControl(combo);
}
refresh();
}
public String getValue() {
return getAttributeMapper().getValue(getTaskAttribute());
}
public String getValueLabel() {
return getAttributeMapper().getValueLabel(getTaskAttribute());
}
@Override
public void refresh() {
try {
ignoreNotification = true;
if (text != null && !text.isDisposed()) {
String label = getValueLabel();
if ("".equals(label)) { //$NON-NLS-1$
// if set to the empty string the label will use 64px on GTK
text.setText(" "); //$NON-NLS-1$
} else {
text.setText(label);
}
} else if (combo != null && !combo.isDisposed()) {
combo.removeAll();
Map<String, String> labelByValue = getAttributeMapper().getOptions(getTaskAttribute());
if (labelByValue != null) {
values = labelByValue.keySet().toArray(new String[0]);
for (String value : values) {
combo.add(labelByValue.get(value));
}
}
select(getValue(), getValueLabel());
combo.redraw();
}
} finally {
ignoreNotification = false;
}
}
@Override
public boolean shouldAutoRefresh() {
return true;
}
private void select(String value, String label) {
if (values != null) {
for (int i = 0; i < values.length; i++) {
if (values[i].equals(value)) {
combo.select(i);
break;
}
}
} else {
combo.setText(label);
}
}
void selectDefaultValue() {
if (combo.getSelectionIndex() == -1 && values.length > 0) {
combo.select(0);
setValue(values[0]);
}
}
public void setValue(String value) {
String oldValue = getAttributeMapper().getValue(getTaskAttribute());
if (!oldValue.equals(value)) {
getAttributeMapper().setValue(getTaskAttribute(), value);
attributeChanged();
}
}
}