/******************************************************************************* * Copyright (c) 2004, 2011 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.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(); } } }