blob: c9032c942453c088677fa2429161e04caf380188 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 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 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.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* @author Steffen Pingel
*/
public class BooleanAttributeEditor extends AbstractAttributeEditor {
private Button button;
private boolean ignoreNotification;
private boolean suppressRefresh;
public BooleanAttributeEditor(TaskDataModel manager, TaskAttribute taskAttribute) {
super(manager, taskAttribute);
}
@Override
public void createControl(Composite parent, FormToolkit toolkit) {
button = toolkit.createButton(parent, super.getLabel(), SWT.CHECK);
button.setEnabled(!isReadOnly());
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!ignoreNotification) {
try {
suppressRefresh = true;
setValue(button.getSelection());
} finally {
suppressRefresh = false;
}
}
}
});
button.setToolTipText(getDescription());
refresh();
setControl(button);
if (!getTaskAttribute().hasValue()) {
// set initial value to false to match what the editor shows
// use asyncExec to ensure this happens after decorating, otherwise this appears as an incoming change
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
public void run() {
if (!getTaskAttribute().hasValue()) {
getAttributeMapper().setBooleanValue(getTaskAttribute(), false);
}
}
});
}
}
@Override
public String getLabel() {
return ""; //$NON-NLS-1$
}
public boolean getValue() {
return getAttributeMapper().getBooleanValue(getTaskAttribute());
}
@Override
protected boolean needsValue() {
return false;
}
public void setValue(boolean value) {
getAttributeMapper().setBooleanValue(getTaskAttribute(), value);
attributeChanged();
}
@Override
public void refresh() {
if (button == null || button.isDisposed()) {
return;
}
try {
ignoreNotification = true;
button.setSelection(getValue());
} finally {
ignoreNotification = false;
}
}
@Override
public boolean shouldAutoRefresh() {
return !suppressRefresh;
}
}