blob: 23a7b553145edf88ed260f36740d18152e61ea9e [file] [log] [blame]
/*
* Copyright (c) 2014 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.cdt.internal.ui.preferences;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* A field editor that combines an integer value preference with a boolean enablement
* preference.
*
* @since 5.8
*/
public class ScalabilityIntegerFieldEditor extends IntegerFieldEditor {
private ControlDecoration fDecoration;
private final String fEnableKey;
private Button fCheckbox;
private boolean fWasSelected;
public ScalabilityIntegerFieldEditor(String enableKey, String nameKey, String labelText, Composite parent) {
super(nameKey, labelText, parent);
fEnableKey = enableKey;
}
@Override
public Text getTextControl(Composite parent) {
Text control = super.getTextControl(parent);
if (fDecoration == null) {
fDecoration = new ControlDecoration(control, SWT.LEFT | SWT.TOP);
FieldDecoration errorDecoration = FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR);
fDecoration.setImage(errorDecoration.getImage());
fDecoration.setDescriptionText(getErrorMessage());
// validate on focus gain
control.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
refreshValidState();
}
});
}
return control;
}
@Override
protected void showErrorMessage(String msg) {
super.showErrorMessage(msg);
if (fDecoration != null) {
fDecoration.setDescriptionText(msg);
fDecoration.show();
}
}
@Override
protected void clearErrorMessage() {
super.clearErrorMessage();
if (fDecoration != null) {
fDecoration.hide();
}
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
getCheckboxControl(parent);
super.doFillIntoGrid(parent, numColumns);
}
private Button getCheckboxControl(Composite parent) {
if (fCheckbox == null) {
Composite inner = new Composite(parent, SWT.NULL);
final GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 0;
inner.setLayout(layout);
fCheckbox = new Button(inner, SWT.CHECK);
fCheckbox.setFont(parent.getFont());
fCheckbox.setText(getLabelText());
// create and hide label from base class
Label label = getLabelControl(inner);
label.setText(""); //$NON-NLS-1$
label.setVisible(false);
fCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean isSelected = fCheckbox.getSelection();
valueChanged(fWasSelected, isSelected);
fWasSelected = isSelected;
}
});
} else {
checkParent(fCheckbox.getParent(), parent);
}
return fCheckbox;
}
@Override
public Label getLabelControl(Composite parent) {
final Label label = getLabelControl();
if (label == null) {
return super.getLabelControl(parent);
} else {
checkParent(label.getParent(), parent);
}
return label;
}
protected void valueChanged(boolean oldValue, boolean newValue) {
if (oldValue != newValue) {
valueChanged();
fireStateChanged(VALUE, oldValue, newValue);
getTextControl().setEnabled(newValue);
getLabelControl().setEnabled(newValue);
}
}
@Override
protected boolean checkState() {
if (fCheckbox != null && !fCheckbox.getSelection()) {
clearErrorMessage();
return true;
}
return super.checkState();
}
@Override
protected void doLoad() {
super.doLoad();
if (fCheckbox != null) {
boolean value = getPreferenceStore().getBoolean(fEnableKey);
fCheckbox.setSelection(value);
fWasSelected = value;
getTextControl().setEnabled(value);
getLabelControl().setEnabled(value);
}
}
@Override
protected void doLoadDefault() {
super.doLoadDefault();
if (fCheckbox != null) {
boolean value = getPreferenceStore().getDefaultBoolean(fEnableKey);
fCheckbox.setSelection(value);
fWasSelected = value;
getTextControl().setEnabled(value);
getLabelControl().setEnabled(value);
}
}
@Override
protected void doStore() {
super.doStore();
getPreferenceStore().setValue(fEnableKey, fCheckbox.getSelection());
}
/**
* Returns this field editor's current boolean value.
*
* @return the value
*/
public boolean getBooleanValue() {
return fCheckbox.getSelection();
}
/**
* Set the checkbox selection and enablement of the other controls as specified.
*/
public void setBooleanValue(boolean value) {
// The checkbox selection will normally be propagated to the label and text controls in the
// checkbox selection listener. However, the callback is only invoked when the selection changes,
// which means that an initial value of false will not be properly propagated. The state is
// directly updated here.
if (fCheckbox != null) {
fWasSelected = value;
getLabelControl().setEnabled(value);
getTextControl().setEnabled(value);
fCheckbox.setSelection(value);
}
}
}