blob: ca991829a7909413b220782022f7d17b2c23494e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2019 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems) - https://bugs.eclipse.org/bugs/show_bug.cgi?id=22712
* Andrew Obuchowicz <aobuchow@redhat.com> - Bug 548168 Add color preview to table
*******************************************************************************/
package org.eclipse.ui.internal.editors.text;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.internal.editors.text.OverlayPreferenceStore.OverlayKey;
import org.eclipse.ui.internal.editors.text.TextEditorDefaultsPreferencePage.EnumeratedDomain.EnumValue;
import org.eclipse.ui.internal.editors.text.codemining.annotation.AnnotationCodeMiningPreferenceConstants;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import org.eclipse.ui.editors.text.ITextEditorHelpContextIds;
/**
* The preference page for setting the editor options.
* <p>
* This class is internal and not intended to be used by clients.</p>
*
* @since 3.1
*/
public class TextEditorDefaultsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private static abstract class Initializer {
protected final Preference fPreference;
protected Initializer(Preference preference) {
fPreference= preference;
}
public abstract void initialize();
}
public static final class InitializerFactory {
private final IPreferenceStore fPreferenceStore;
public InitializerFactory(IPreferenceStore preferenceStore) {
fPreferenceStore= preferenceStore;
}
private class TextInitializer extends Initializer {
private final Text fText;
public TextInitializer(Preference preference, Text control) {
super(preference);
fText= control;
}
@Override
public void initialize() {
String value= fPreferenceStore.getString(fPreference.getKey());
fText.setText(value);
}
}
private class CheckboxInitializer extends Initializer {
private final Button fControl;
public CheckboxInitializer(Preference preference, Button control) {
super(preference);
fControl= control;
}
@Override
public void initialize() {
boolean value= fPreferenceStore.getBoolean(fPreference.getKey());
fControl.setSelection(value);
}
}
private class ComboInitializer extends Initializer {
private final Combo fControl;
private final EnumeratedDomain fDomain;
public ComboInitializer(Preference preference, Combo control, EnumeratedDomain domain) {
super(preference);
fControl= control;
fDomain= domain;
}
@Override
public void initialize() {
int value= fPreferenceStore.getInt(fPreference.getKey());
EnumValue enumValue= fDomain.getValueByInteger(value);
if (enumValue != null) {
int index= fDomain.getIndex(enumValue);
if (index >= 0)
fControl.select(index);
}
}
}
private class SpinnerInitializer extends Initializer {
private final Spinner fControl;
private final EnumeratedDomain fDomain;
public SpinnerInitializer(Preference preference, Spinner control, EnumeratedDomain domain) {
super(preference);
fControl= control;
fDomain= domain;
}
@Override
public void initialize() {
int value= fPreferenceStore.getInt(fPreference.getKey());
EnumValue enumValue= fDomain.getValueByInteger(value);
if (enumValue != null) {
fControl.setSelection(value);
}
}
}
public Initializer create(Preference preference, Text control) {
return new TextInitializer(preference, control);
}
public Initializer create(Preference preference, Button control) {
return new CheckboxInitializer(preference, control);
}
public Initializer create(Preference preference, Combo control, EnumeratedDomain domain) {
return new ComboInitializer(preference, control, domain);
}
public Initializer create(Preference preference, Spinner control, EnumeratedDomain domain) {
return new SpinnerInitializer(preference, control, domain);
}
}
abstract static class Domain {
public abstract IStatus validate(Object value);
protected int parseInteger(Object val) throws NumberFormatException {
if (val instanceof Integer) {
return ((Integer) val).intValue();
}
if (val instanceof String) {
return Integer.parseInt((String) val);
}
throw new NumberFormatException(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidInput, String.valueOf(val)));
}
}
static class IntegerDomain extends Domain {
private final int fMax;
private final int fMin;
public IntegerDomain(int min, int max) {
Assert.isLegal(max >= min);
fMax= max;
fMin= min;
}
@Override
public IStatus validate(Object value) {
StatusInfo status= new StatusInfo();
if (value instanceof String && ((String)value).isEmpty()) {
status.setError(TextEditorMessages.TextEditorPreferencePage_emptyInput);
return status;
}
try {
int integer= parseInteger(value);
if (!rangeCheck(integer))
status.setError(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidInput, String.valueOf(integer)));
} catch (NumberFormatException e) {
status.setError(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidInput, String.valueOf(value)));
}
return status;
}
protected boolean rangeCheck(int i) {
return (i >= fMin && i <= fMax);
}
}
static class EnumeratedDomain extends Domain {
public final static class EnumValue {
private final int fValue;
private final String fName;
public EnumValue(int value) {
this(value, null);
}
public EnumValue(int value, String name) {
fValue= value;
fName= name;
}
public String getLabel() {
return fName == null ? String.valueOf(fValue) : fName;
}
public int getIntValue() {
return fValue;
}
@Override
public final int hashCode() {
return getIntValue();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof EnumValue) {
return ((EnumValue) obj).getIntValue() == fValue;
}
return false;
}
}
private final java.util.List<EnumValue> fItems= new ArrayList<>();
private final Set<EnumValue> fValueSet= new HashSet<>();
public void addValue(EnumValue val) {
if (fValueSet.contains(val))
fItems.remove(val);
fItems.add(val);
fValueSet.add(val);
}
public int getIndex(EnumValue enumValue) {
int i= 0;
for (EnumValue ev : fItems) {
if (ev.equals(enumValue))
return i;
i++;
}
return -1;
}
public EnumValue getValueByIndex (int index) {
if (index >= 0 && fItems.size() > index)
return fItems.get(index);
return null;
}
public EnumValue getValueByInteger(int intValue) {
for (EnumValue e : fItems) {
if (e.getIntValue() == intValue)
return e;
}
return null;
}
public void addValue(int val) {
addValue(new EnumValue(val));
}
public void addRange(int from, int to) {
while (from <= to)
addValue(from++);
}
@Override
public IStatus validate(Object value) {
StatusInfo status= new StatusInfo();
if (value instanceof String && ((String)value).isEmpty()) {
status.setError(TextEditorMessages.TextEditorPreferencePage_emptyInput);
return status;
}
try {
EnumValue e= parseEnumValue(value);
if (!fValueSet.contains(e))
status.setError(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidRange, new String[] {getValueByIndex(0).getLabel(), getValueByIndex(fItems.size() - 1).getLabel()}));
} catch (NumberFormatException e) {
status.setError(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidInput, String.valueOf(value)));
}
return status;
}
private EnumValue parseEnumValue(Object value) {
if (value instanceof EnumValue)
return (EnumValue) value;
int integer= parseInteger(value);
return getValueByInteger(integer);
}
public EnumValue getMinimumValue() {
return getValueByIndex(0);
}
public EnumValue getMaximumValue() {
return getValueByIndex(fItems.size() - 1);
}
}
static class BooleanDomain extends Domain {
@Override
public IStatus validate(Object value) {
StatusInfo status= new StatusInfo();
if (value instanceof String && ((String)value).isEmpty()) {
status.setError(TextEditorMessages.TextEditorPreferencePage_emptyInput);
return status;
}
try {
parseBoolean(value);
} catch (NumberFormatException e) {
status.setError(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidInput, String.valueOf(value)));
}
return status;
}
private boolean parseBoolean(Object value) throws NumberFormatException {
if (value instanceof Boolean)
return ((Boolean) value).booleanValue();
if (value instanceof String) {
if (Boolean.TRUE.toString().equalsIgnoreCase((String) value))
return true;
if (Boolean.FALSE.toString().equalsIgnoreCase((String) value))
return false;
}
throw new NumberFormatException(NLSUtility.format(TextEditorMessages.TextEditorPreferencePage_invalidInput, String.valueOf(value)));
}
}
private static class Preference {
private String fKey;
private String fName;
private String fDescription; // for tooltips
public Preference(String key, String name, String description) {
Assert.isNotNull(key);
Assert.isNotNull(name);
fKey= key;
fName= name;
fDescription= description;
}
public final String getKey() {
return fKey;
}
public final String getName() {
return fName;
}
public final String getDescription() {
return fDescription;
}
}
private static class WhitespaceCharacterPainterOptionsDialog extends Dialog {
private java.util.List<Initializer> fDialogInitializers= new ArrayList<>();
private OverlayPreferenceStore fDialogOverlayStore;
private final IPreferenceStore fParentPreferenceStore;
private InitializerFactory fDialogInitializerFactory;
private Text errorMessageText;
protected WhitespaceCharacterPainterOptionsDialog(Shell parentShell, IPreferenceStore parent) {
super(parentShell);
fParentPreferenceStore= parent;
fDialogOverlayStore= createDialogOverlayStore();
fDialogInitializerFactory= new InitializerFactory(fDialogOverlayStore);
}
private OverlayPreferenceStore createDialogOverlayStore() {
ArrayList<OverlayKey> overlayKeys= new ArrayList<>();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_IDEOGRAPHIC_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_IDEOGRAPHIC_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_IDEOGRAPHIC_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_CARRIAGE_RETURN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LINE_FEED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WHITESPACE_CHARACTER_ALPHA_VALUE));
OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(fParentPreferenceStore, keys);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_showWhitespaceCharactersDialogTitle);
}
@Override
protected Control createContents(Composite parent) {
Control contents= super.createContents(parent);
Dialog.applyDialogFont(contents);
fDialogOverlayStore.load();
fDialogOverlayStore.start();
initializeShowWhitespaceCharactersPreferences();
return contents;
}
private void initializeShowWhitespaceCharactersPreferences() {
for (Initializer initializer : fDialogInitializers) {
initializer.initialize();
}
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite= (Composite)super.createDialogArea(parent);
Label description= new Label(composite, SWT.NONE);
description.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_configureWhitespaceCharacterPainterProperties);
description.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
Composite tabularComposite= new Composite(composite, SWT.NONE);
GridLayout layout= new GridLayout();
layout.numColumns= 4;
layout.marginHeight= 0;
layout.marginWidth= 0;
layout.makeColumnsEqualWidth= true;
tabularComposite.setLayout(layout);
Label label;
Button checkbox;
Preference preference;
label= new Label(tabularComposite, SWT.NONE);
label.setText(""); //$NON-NLS-1$
label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_leading);
label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_enclosed);
label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_trailing);
label.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_space);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_SPACES, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_SPACES, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_SPACES, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_ideographicSpace);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_IDEOGRAPHIC_SPACES, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_IDEOGRAPHIC_SPACES, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_IDEOGRAPHIC_SPACES, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_tab);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_TABS, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_TABS, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_TABS, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_carriageReturn);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
checkbox= new Button(tabularComposite, SWT.CHECK);
checkbox.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
checkbox.setEnabled(false);
checkbox= new Button(tabularComposite, SWT.CHECK);
checkbox.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
checkbox.setEnabled(false);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_CARRIAGE_RETURN, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
label= new Label(tabularComposite, SWT.NONE);
label.setText(TextEditorMessages.TextEditorDefaultsPreferencePage_lineFeed);
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
checkbox= new Button(tabularComposite, SWT.CHECK);
checkbox.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
checkbox.setEnabled(false);
checkbox= new Button(tabularComposite, SWT.CHECK);
checkbox.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
checkbox.setEnabled(false);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LINE_FEED, "", null); //$NON-NLS-1$
addCheckBox(tabularComposite, preference, new BooleanDomain(), 0);
Composite alphaComposite= new Composite(composite, SWT.NONE);
layout= new GridLayout();
layout.numColumns= 2;
layout.marginHeight= 10;
layout.marginWidth= 0;
layout.makeColumnsEqualWidth= false;
alphaComposite.setLayout(layout);
preference= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WHITESPACE_CHARACTER_ALPHA_VALUE, TextEditorMessages.TextEditorDefaultsPreferencePage_transparencyLevel, null);
addTextField(alphaComposite, preference, new IntegerDomain(0, 255), 5, 0);
errorMessageText= new Text(composite, SWT.READ_ONLY | SWT.WRAP);
errorMessageText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
errorMessageText.setBackground(errorMessageText.getDisplay()
.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
setErrorMessage(null);
return composite;
}
/**
* Sets or clears the error message. If not <code>null</code>, the OK button is disabled.
*
* @param errorMessage the error message, or <code>null</code> to clear
* @since 3.0
*/
public void setErrorMessage(String errorMessage) {
if (errorMessageText != null && !errorMessageText.isDisposed()) {
errorMessageText.setText(errorMessage == null ? " " : errorMessage); //$NON-NLS-1$
boolean hasError= errorMessage != null && !(StringConverter.removeWhiteSpaces(errorMessage)).isEmpty();
errorMessageText.setEnabled(hasError);
errorMessageText.setVisible(hasError);
errorMessageText.getParent().update();
Control button= getButton(IDialogConstants.OK_ID);
if (button != null) {
button.setEnabled(errorMessage == null);
}
}
}
private Button addCheckBox(Composite composite, final Preference preference, final Domain domain, int indentation) {
final Button checkBox= new Button(composite, SWT.CHECK);
checkBox.setToolTipText(preference.getDescription());
GridData gd= new GridData(SWT.CENTER, SWT.CENTER, false, false);
gd.horizontalIndent= indentation;
checkBox.setLayoutData(gd);
checkBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean value= checkBox.getSelection();
IStatus status= domain.validate(Boolean.valueOf(value));
if (!status.matches(IStatus.ERROR))
fDialogOverlayStore.setValue(preference.getKey(), value);
}
});
fDialogInitializers.add(fDialogInitializerFactory.create(preference, checkBox));
return checkBox;
}
private Control[] addTextField(Composite composite, final Preference preference, final Domain domain, int textLimit, int indentation) {
Label labelControl= new Label(composite, SWT.NONE);
labelControl.setText(preference.getName());
GridData gd= new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
gd.horizontalIndent= indentation;
labelControl.setLayoutData(gd);
final Text textControl= new Text(composite, SWT.BORDER | SWT.SINGLE);
gd= new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
gd.widthHint= convertWidthInCharsToPixels(textLimit + 1);
textControl.setLayoutData(gd);
textControl.setTextLimit(textLimit);
textControl.setToolTipText(preference.getDescription());
if (domain != null) {
textControl.addModifyListener(e -> {
String value= textControl.getText();
IStatus status= domain.validate(value);
if (!status.matches(IStatus.ERROR)) {
fDialogOverlayStore.setValue(preference.getKey(), value);
setErrorMessage(null);
} else {
setErrorMessage(NLSUtility.format(TextEditorMessages.TextEditorDefaultsPreferencePage_showWhitespaceCharactersDialogInvalidInput, value));
}
});
}
fDialogInitializers.add(fDialogInitializerFactory.create(preference, textControl));
return new Control[] { labelControl, textControl };
}
@Override
protected void okPressed() {
super.okPressed();
fDialogOverlayStore.propagate();
}
}
private class ColorEntry {
public final String colorKey;
public final String label;
public final RGB systemColorRGB;
public final String isSystemDefaultKey;
public ColorEntry(String colorKey, String label, String isSystemDefaultKey, Color systemColor) {
this.colorKey= colorKey;
this.label= label;
this.isSystemDefaultKey= isSystemDefaultKey;
this.systemColorRGB= (systemColor != null) ? systemColor.getRGB() : null;
}
public boolean allowSystemDefault() {
return this.isSystemDefaultKey != null;
}
public boolean isSystemDefault() {
return this.isSystemDefaultKey != null && fOverlayStore.getBoolean(isSystemDefaultKey);
}
public RGB getRGB() {
return PreferenceConverter.getColor(fOverlayStore, this.colorKey);
}
public void setColor(RGB rgb) {
PreferenceConverter.setValue(fOverlayStore, this.colorKey, rgb);
}
public void setSystemDefault(boolean value) {
if (this.isSystemDefaultKey != null) {
fOverlayStore.setValue(this.isSystemDefaultKey, value);
}
}
}
private OverlayPreferenceStore fOverlayStore;
private TableViewer fAppearanceColorTableViewer;
private List<Image> colorPreviewImages;
private ColorSelector fAppearanceColorEditor;
private Button fAppearanceColorDefault;
/**
* Tells whether the fields are initialized.
*/
private boolean fFieldsInitialized= false;
private ArrayList<SelectionListener> fMasterSlaveListeners= new ArrayList<>();
private java.util.List<Initializer> fInitializers= new ArrayList<>();
private InitializerFactory fInitializerFactory;
private Map<Domain, Text> fDomains= new HashMap<>();
public TextEditorDefaultsPreferencePage() {
setPreferenceStore(EditorsPlugin.getDefault().getPreferenceStore());
fOverlayStore= createOverlayStore();
fInitializerFactory= new InitializerFactory(fOverlayStore);
}
private OverlayPreferenceStore createOverlayStore() {
ArrayList<OverlayKey> overlayKeys= new ArrayList<>();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractTextEditor.PREFERENCE_COLOR_FIND_SCOPE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_DELETE_SPACES_AS_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_ALLOW_OVERRIDE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_UNDO_HISTORY_SIZE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_CARET_OFFSET));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_SELECTION_SIZE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_DEFAULT_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_DEFAULT_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINKS_ENABLED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_COLOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_COLOR_SYSTEM_DEFAULT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_KEY_MODIFIER_MASK));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_WHITESPACE_CHARACTERS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.SHOW_RANGE_INDICATOR));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WARN_IF_INPUT_DERIVED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SMART_HOME_END));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TEXT_DRAG_AND_DROP_ENABLED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HOVER_ENRICH_MODE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_MAX));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_IDEOGRAPHIC_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_IDEOGRAPHIC_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_IDEOGRAPHIC_SPACES));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LEADING_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_ENCLOSED_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TRAILING_TABS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_CARRIAGE_RETURN));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_LINE_FEED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WHITESPACE_CHARACTER_ALPHA_VALUE));
OverlayPreferenceStore.OverlayKey[] keys= new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(getPreferenceStore(), keys);
}
@Override
public void init(IWorkbench workbench) {
}
@Override
public void createControl(Composite parent) {
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), ITextEditorHelpContextIds.TEXT_EDITOR_PREFERENCE_PAGE);
}
private void handleAppearanceColorListSelection() {
ColorEntry selectedColor= getSelectedAppearanceColorOption();
fAppearanceColorDefault.setVisible(selectedColor.isSystemDefaultKey != null);
fAppearanceColorDefault.setSelection(selectedColor.isSystemDefault());
RGB rgb;
if (selectedColor.isSystemDefault()) {
rgb= (selectedColor.systemColorRGB != null) ? selectedColor.systemColorRGB : new RGB(0, 0, 0);
} else {
rgb= PreferenceConverter.getColor(fOverlayStore, selectedColor.colorKey);
}
fAppearanceColorEditor.setColorValue(rgb);
}
private Control createAppearancePage(Composite parent) {
Composite appearanceComposite= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.numColumns= 2;
layout.marginHeight= 0;
layout.marginWidth= 0;
appearanceComposite.setLayout(layout);
Link fontLink= new Link(appearanceComposite, SWT.NONE);
fontLink.setText(TextEditorMessages.TextEditorPreferencePage_Font_link);
fontLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PreferencesUtil.createPreferenceDialogOn(getShell(), "org.eclipse.ui.preferencePages.ColorsAndFonts", null, "selectFont:" + JFaceResources.TEXT_FONT); //$NON-NLS-1$ //$NON-NLS-2$
}
});
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= 2;
fontLink.setLayoutData(gd);
addFiller(appearanceComposite, 2);
String label= TextEditorMessages.TextEditorPreferencePage_undoHistorySize;
Preference undoHistorySize= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_UNDO_HISTORY_SIZE, label, null);
IntegerDomain undoHistorySizeDomain= new IntegerDomain(0, 99999);
addTextField(appearanceComposite, undoHistorySize, undoHistorySizeDomain, 15, 0);
label= TextEditorMessages.TextEditorPreferencePage_displayedTabWidth;
Preference tabWidth= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH, label, null);
IntegerDomain tabWidthDomain= new IntegerDomain(1, 16);
addTextField(appearanceComposite, tabWidth, tabWidthDomain, 15, 0);
if(isWordWrapPreferenceAllowed()){
label= TextEditorMessages.TextEditorPreferencePage_enableWordWrap;
Preference enableWordWrap= new Preference(AbstractTextEditor.PREFERENCE_WORD_WRAP_ENABLED, label, null);
addCheckBox(appearanceComposite, enableWordWrap, new BooleanDomain(), 0);
}
label= TextEditorMessages.TextEditorPreferencePage_convertTabsToSpaces;
Preference spacesForTabs= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS, label, null);
final Button spacesForTabsButton= addCheckBox(appearanceComposite, spacesForTabs, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_deleteSpacesAsTabs;
Preference deleteSpacesAsTabs= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_DELETE_SPACES_AS_TABS, label, null);
final Button deleteSpacesAsTabsButton= addCheckBox(appearanceComposite, deleteSpacesAsTabs, new BooleanDomain(), 0);
createDependency(spacesForTabsButton, spacesForTabs, new Control[] { deleteSpacesAsTabsButton });
label= TextEditorMessages.TextEditorPreferencePage_highlightCurrentLine;
Preference highlightCurrentLine= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE, label, null);
addCheckBox(appearanceComposite, highlightCurrentLine, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorPreferencePage_showPrintMargin;
Preference showPrintMargin= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN, label, null);
final Button showPrintMarginButton= addCheckBox(appearanceComposite, showPrintMargin, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorPreferencePage_printMarginColumn;
Preference printMarginColumn= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN, label, null);
final IntegerDomain printMarginDomain= new IntegerDomain(20, 200);
final Control[] printMarginControls= addTextField(appearanceComposite, printMarginColumn, printMarginDomain, 15, 20);
createDependency(showPrintMarginButton, showPrintMargin, printMarginControls);
label= TextEditorMessages.TextEditorPreferencePage_printMarginAllowOverride;
Preference printMarginAllowOverride= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_ALLOW_OVERRIDE, label, null);
final Button showPrintMarginAllowOverride= addCheckBox(appearanceComposite, printMarginAllowOverride, new BooleanDomain(), 0);
createDependency(showPrintMarginButton, showPrintMargin, new Control[] { showPrintMarginAllowOverride });
showPrintMarginButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateStatus(printMarginDomain);
}
});
label= TextEditorMessages.TextEditorPreferencePage_showLineNumbers;
Preference showLineNumbers= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER, label, null);
addCheckBox(appearanceComposite, showLineNumbers, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorPreferencePage_showCaretOffsetInStatus;
Preference showCaretOffset= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_CARET_OFFSET, label, null);
addCheckBox(appearanceComposite, showCaretOffset, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorPreferencePage_showSelectionInStatus;
Preference showSelectionNumbers= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_SELECTION_SIZE, label, null);
addCheckBox(appearanceComposite, showSelectionNumbers, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_range_indicator;
Preference showMagnet= new Preference(AbstractDecoratedTextEditorPreferenceConstants.SHOW_RANGE_INDICATOR, label, null);
addCheckBox(appearanceComposite, showMagnet, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_showWhitespaceCharacters;
String linkText= TextEditorMessages.TextEditorDefaultsPreferencePage_showWhitespaceCharactersLinkText;
Preference showWhitespaceCharacters= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_WHITESPACE_CHARACTERS, label, null);
addCheckBoxWithLink(appearanceComposite, showWhitespaceCharacters, linkText, new BooleanDomain(), 0, new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Dialog dialog= new WhitespaceCharacterPainterOptionsDialog(Display.getDefault().getActiveShell(), fOverlayStore);
dialog.open();
}
});
label= TextEditorMessages.TextEditorPreferencePage_showAffordance;
Preference showAffordance= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE, label, null);
addCheckBox(appearanceComposite, showAffordance, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_enrichHoverMode;
Preference hoverReplace= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HOVER_ENRICH_MODE, label, null);
EnumeratedDomain hoverReplaceDomain= new EnumeratedDomain();
hoverReplaceDomain.addValue(new EnumValue(-1, TextEditorMessages.TextEditorDefaultsPreferencePage_enrichHover_disabled));
hoverReplaceDomain.addValue(new EnumValue(1, TextEditorMessages.TextEditorDefaultsPreferencePage_enrichHover_immediately));
hoverReplaceDomain.addValue(new EnumValue(0, TextEditorMessages.TextEditorDefaultsPreferencePage_enrichHover_afterDelay));
hoverReplaceDomain.addValue(new EnumValue(2, TextEditorMessages.TextEditorDefaultsPreferencePage_enrichHover_onClick));
addCombo(appearanceComposite, hoverReplace, hoverReplaceDomain, 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_textDragAndDrop;
Preference textDragAndDrop= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TEXT_DRAG_AND_DROP_ENABLED, label, null);
addCheckBox(appearanceComposite, textDragAndDrop, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_warn_if_derived;
Preference warnIfDerived= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WARN_IF_INPUT_DERIVED, label, null);
addCheckBox(appearanceComposite, warnIfDerived, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_smartHomeEnd;
Preference smartHomeEnd= new Preference(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SMART_HOME_END, label, null);
addCheckBox(appearanceComposite, smartHomeEnd, new BooleanDomain(), 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_show;
String description= TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_description;
Preference showCodeMinings= new Preference(AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL, label, description);
EnumeratedDomain codeMiningsDomain= new EnumeratedDomain();
codeMiningsDomain.addValue(new EnumValue(AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL__NONE, TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_none));
codeMiningsDomain.addValue(new EnumValue(AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL__ERROR, TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_error));
codeMiningsDomain.addValue(new EnumValue(AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL__ERROR_WARNING,
TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_ErrorWarnings));
codeMiningsDomain.addValue(new EnumValue(AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL__ERROR_WARNING_INFO,
TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_ErrorWarningsInfo));
final Control[] showCodeMiningsControls= addCombo(appearanceComposite, showCodeMinings, codeMiningsDomain, 0);
label= TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_max;
description= TextEditorMessages.TextEditorDefaultsPreferencePage_codeMinings_max_description;
Preference maxCodeMinings= new Preference(AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_MAX, label, description);
IntegerDomain maxCodeMiningsDomain= new IntegerDomain(0, 99999);
Control[] maxCodeMiningsControls= addTextField(appearanceComposite, maxCodeMinings, maxCodeMiningsDomain, 15, 20);
final SelectionListener codeMiningsListener= new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
final int showCodeMiningsSetting= fOverlayStore.getInt(showCodeMinings.getKey());
boolean enabled= showCodeMiningsSetting != AnnotationCodeMiningPreferenceConstants.SHOW_ANNOTATION_CODE_MINING_LEVEL__NONE;
for (Control control : maxCodeMiningsControls) {
control.setEnabled(enabled);
}
}
};
((Combo) showCodeMiningsControls[1]).addSelectionListener(codeMiningsListener);
fMasterSlaveListeners.add(codeMiningsListener);
addFiller(appearanceComposite, 2);
Label l= new Label(appearanceComposite, SWT.LEFT);
l.setText(TextEditorMessages.TextEditorPreferencePage_appearanceOptions);
gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= 2;
l.setLayoutData(gd);
Composite editorComposite= new Composite(appearanceComposite, SWT.NONE);
layout= new GridLayout();
layout.numColumns= 2;
layout.marginHeight= 0;
layout.marginWidth= 0;
editorComposite.setLayout(layout);
gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
gd.horizontalSpan= 2;
editorComposite.setLayoutData(gd);
// Set up Appearance Color Options Table
Composite tableComposite= new Composite(editorComposite, SWT.NONE);
GridData tableGD= new GridData(GridData.FILL_VERTICAL);
tableComposite.setLayoutData(tableGD);
fAppearanceColorTableViewer= new TableViewer(tableComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
initializeAppearColorTable(tableComposite);
Composite stylesComposite= new Composite(editorComposite, SWT.NONE);
layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
layout.numColumns= 2;
stylesComposite.setLayout(layout);
stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
l= new Label(stylesComposite, SWT.LEFT);
l.setText(TextEditorMessages.TextEditorPreferencePage_color);
gd= new GridData();
gd.horizontalAlignment= GridData.BEGINNING;
l.setLayoutData(gd);
fAppearanceColorEditor= new ColorSelector(stylesComposite);
Button foregroundColorButton= fAppearanceColorEditor.getButton();
gd= new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalAlignment= GridData.BEGINNING;
foregroundColorButton.setLayoutData(gd);
SelectionListener colorDefaultSelectionListener= new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ColorEntry colorEntry= getSelectedAppearanceColorOption();
if (colorEntry.allowSystemDefault()) {
colorEntry.setSystemDefault(fAppearanceColorDefault.getSelection());
handleAppearanceColorListSelection(); // refresh color preview and checkbox state
fAppearanceColorTableViewer.update(colorEntry, null);
}
}
};
fAppearanceColorDefault= new Button(stylesComposite, SWT.CHECK);
fAppearanceColorDefault.setText(TextEditorMessages.TextEditorPreferencePage_systemDefault);
gd= new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalAlignment= GridData.BEGINNING;
gd.horizontalSpan= 2;
fAppearanceColorDefault.setLayoutData(gd);
fAppearanceColorDefault.setVisible(false);
fAppearanceColorDefault.addSelectionListener(colorDefaultSelectionListener);
foregroundColorButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ColorEntry selectedColor= getSelectedAppearanceColorOption();
selectedColor.setColor(fAppearanceColorEditor.getColorValue());
selectedColor.setSystemDefault(false);
// Make the newly selected color display in the table
fAppearanceColorTableViewer.update(selectedColor, null);
fAppearanceColorDefault.setSelection(selectedColor.isSystemDefault());
}
});
Link link= new Link(appearanceComposite, SWT.NONE);
link.setText(TextEditorMessages.TextEditorPreferencePage_colorsAndFonts_link);
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
PreferencesUtil.createPreferenceDialogOn(getShell(), "org.eclipse.ui.preferencePages.ColorsAndFonts", null, "selectCategory:org.eclipse.ui.workbenchMisc"); //$NON-NLS-1$ //$NON-NLS-2$
}
});
GridData gridData= new GridData(SWT.FILL, SWT.BEGINNING, true, false);
gridData.widthHint= 150; // only expand further if anyone else requires it
gridData.horizontalSpan= 2;
link.setLayoutData(gridData);
addFiller(appearanceComposite, 2);
appearanceComposite.layout();
return appearanceComposite;
}
private void initializeAppearColorTable(Composite tableComposite) {
fAppearanceColorTableViewer.addSelectionChangedListener((SelectionChangedEvent event) -> handleAppearanceColorListSelection());
colorPreviewImages= new ArrayList<>();
fAppearanceColorTableViewer.setLabelProvider(new LabelProvider() {
@Override
public Image getImage(Object element) {
ColorEntry colorEntry= ((ColorEntry) element);
if (colorEntry.isSystemDefault() && colorEntry.systemColorRGB == null) {
return null;
}
RGB rgb= colorEntry.isSystemDefault() ? colorEntry.systemColorRGB : colorEntry.getRGB();
Color color= new Color(tableComposite.getParent().getDisplay(), rgb.red, rgb.green, rgb.blue);
int dimensions= 10;
Image image= new Image(tableComposite.getParent().getDisplay(), dimensions, dimensions);
GC gc= new GC(image);
// Draw color preview
gc.setBackground(color);
gc.fillRectangle(0, 0, dimensions, dimensions);
// Draw outline around color preview
gc.setBackground(new Color(tableComposite.getParent().getDisplay(), 0, 0, 0));
gc.setLineWidth(2);
gc.drawRectangle(0, 0, dimensions, dimensions);
gc.dispose();
color.dispose();
colorPreviewImages.add(image);
return image;
}
@Override
public String getText(Object element) {
return ((ColorEntry) element).label;
}
});
TableColumn tc= new TableColumn(fAppearanceColorTableViewer.getTable(), SWT.NONE, 0);
TableColumnLayout tableColumnLayout= new TableColumnLayout(true);
PixelConverter pixelConverter= new PixelConverter(tableComposite.getParent().getFont());
tableColumnLayout.setColumnData(tc, new ColumnWeightData(1, pixelConverter.convertWidthInCharsToPixels(30)));
tableComposite.setLayout(tableColumnLayout);
GridData gd= new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_BOTH);
Table fAppearanceColorTable= fAppearanceColorTableViewer.getTable();
gd.heightHint= fAppearanceColorTable.getItemHeight() * 8;
fAppearanceColorTable.setLayoutData(gd);
}
private boolean isWordWrapPreferenceAllowed() {
return Boolean.getBoolean("eclipse.show.wrapByDefaultPreference"); //$NON-NLS-1$
}
@Override
protected Control createContents(Composite parent) {
initializeDefaultColors();
fOverlayStore.load();
fOverlayStore.start();
Control control= createAppearancePage(parent);
initialize();
Dialog.applyDialogFont(control);
return control;
}
private void initialize() {
Display display= getControl().getDisplay();
// Initialize AppearanceColorOptions model with the appropriate preference keys
ColorEntry[] fApperanceColorOptionsModel= new ColorEntry[] {
// Line Number Foreground Color
new ColorEntry(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR, TextEditorMessages.TextEditorPreferencePage_lineNumberForegroundColor, null, null),
// Current Line Highlight Color
new ColorEntry(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR, TextEditorMessages.TextEditorPreferencePage_currentLineHighlighColor, null, null),
// Print Margin Color
new ColorEntry(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR, TextEditorMessages.TextEditorPreferencePage_printMarginColor, null, null),
// Find Scope Color
new ColorEntry(AbstractTextEditor.PREFERENCE_COLOR_FIND_SCOPE, TextEditorMessages.TextEditorPreferencePage_findScopeColor, null, null),
// Selection Foreground Color
new ColorEntry(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR, TextEditorMessages.TextEditorPreferencePage_selectionForegroundColor,
AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_DEFAULT_COLOR, display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)),
// Selection Background Color
new ColorEntry(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR, TextEditorMessages.TextEditorPreferencePage_selectionBackgroundColor,
AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_DEFAULT_COLOR, display.getSystemColor(SWT.COLOR_LIST_SELECTION)),
// Text Editor Background Color
new ColorEntry(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, TextEditorMessages.TextEditorPreferencePage_backgroundColor,
AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT, display.getSystemColor(SWT.COLOR_LIST_BACKGROUND)),
// Text Editor Foreground Color
new ColorEntry(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, TextEditorMessages.TextEditorPreferencePage_foregroundColor,
AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT, display.getSystemColor(SWT.COLOR_LIST_FOREGROUND)),
// Hyperlink Color
new ColorEntry(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_COLOR, TextEditorMessages.HyperlinkColor_label,
AbstractDecoratedTextEditorPreferenceConstants.EDITOR_HYPERLINK_COLOR_SYSTEM_DEFAULT, display.getSystemColor(SWT.COLOR_LINK_FOREGROUND))
};
fAppearanceColorTableViewer.setContentProvider(ArrayContentProvider.getInstance());
fAppearanceColorTableViewer.setInput(fApperanceColorOptionsModel);
initializeFields();
fAppearanceColorTableViewer.setSelection(new StructuredSelection(fAppearanceColorTableViewer.getElementAt(0)), true);
}
private void initializeFields() {
for (Initializer initializer : fInitializers) {
initializer.initialize();
}
fFieldsInitialized= true;
updateStatus(new StatusInfo());
// Update slaves
Iterator<SelectionListener> iter= fMasterSlaveListeners.iterator();
while (iter.hasNext()) {
SelectionListener listener= iter.next();
listener.widgetSelected(null);
}
}
private void initializeDefaultColors() {
if (!getPreferenceStore().contains(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR)) {
RGB rgb= getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION).getRGB();
PreferenceConverter.setDefault(fOverlayStore, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR, rgb);
PreferenceConverter.setDefault(getPreferenceStore(), AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR, rgb);
}
if (!getPreferenceStore().contains(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR)) {
RGB rgb= getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT).getRGB();
PreferenceConverter.setDefault(fOverlayStore, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR, rgb);
PreferenceConverter.setDefault(getPreferenceStore(), AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR, rgb);
}
if (!getPreferenceStore().contains(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND)) {
RGB rgb= getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB();
PreferenceConverter.setDefault(fOverlayStore, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, rgb);
PreferenceConverter.setDefault(getPreferenceStore(), AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, rgb);
}
if (!getPreferenceStore().contains(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)) {
RGB rgb= getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND).getRGB();
PreferenceConverter.setDefault(fOverlayStore, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, rgb);
PreferenceConverter.setDefault(getPreferenceStore(), AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, rgb);
}
}
@Override
public boolean performOk() {
fOverlayStore.propagate();
fAppearanceColorTableViewer.refresh();
return true;
}
@Override
protected void performDefaults() {
fOverlayStore.loadDefaults();
initializeFields();
handleAppearanceColorListSelection();
fAppearanceColorTableViewer.refresh();
super.performDefaults();
}
@Override
public void dispose() {
if (fOverlayStore != null) {
fOverlayStore.stop();
fOverlayStore= null;
}
for (Image image : colorPreviewImages) {
image.dispose();
}
colorPreviewImages= null;
super.dispose();
}
private void addFiller(Composite composite, int horizontalSpan) {
PixelConverter pixelConverter= new PixelConverter(composite);
Label filler= new Label(composite, SWT.LEFT );
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= horizontalSpan;
gd.heightHint= pixelConverter.convertHeightInCharsToPixels(1) / 2;
filler.setLayoutData(gd);
}
private void checkboxControlChanged(final Preference preference, final Domain domain, final Button checkBox) {
boolean value= checkBox.getSelection();
IStatus status= domain.validate(Boolean.valueOf(value));
if (!status.matches(IStatus.ERROR))
fOverlayStore.setValue(preference.getKey(), value);
updateStatus(status);
}
Button addCheckBox(Composite composite, final Preference preference, final Domain domain, int indentation) {
final Button checkBox= new Button(composite, SWT.CHECK);
checkBox.setText(preference.getName());
checkBox.setToolTipText(preference.getDescription());
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent= indentation;
gd.horizontalSpan= 2;
checkBox.setLayoutData(gd);
checkBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
checkboxControlChanged(preference, domain, checkBox);
}
});
fInitializers.add(fInitializerFactory.create(preference, checkBox));
return checkBox;
}
private Button addCheckBoxWithLink(Composite parent, final Preference preference, String linkText, final Domain domain, int indentation, final SelectionListener listener) {
GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false);
gd.horizontalSpan= 3;
gd.horizontalIndent= indentation;
Composite composite= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= 0;
layout.marginWidth= 0;
// The spacing between the controls is different on GTK
layout.horizontalSpacing= Platform.WS_GTK.equals(Platform.getWS()) ? 4 : 0;
layout.numColumns= 2;
composite.setLayout(layout);
composite.setLayoutData(gd);
final Button checkBox= new Button(composite, SWT.CHECK);
checkBox.setFont(JFaceResources.getDialogFont());
checkBox.setText(preference.getName());
gd= new GridData(GridData.FILL, GridData.CENTER, false, false);
checkBox.setLayoutData(gd);
checkBox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
checkboxControlChanged(preference, domain, checkBox);
}
});
gd= new GridData(SWT.FILL, GridData.CENTER, false, false);
Link link= new Link(composite, SWT.NONE);
link.setText(linkText);
link.setLayoutData(gd);
if (listener != null) {
link.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
listener.widgetSelected(e);
}
});
}
fInitializers.add(fInitializerFactory.create(preference, checkBox));
return checkBox;
}
Control[] addCombo(Composite composite, final Preference preference, final EnumeratedDomain domain, int indentation) {
Label labelControl= new Label(composite, SWT.NONE);
labelControl.setText(preference.getName());
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent= indentation;
labelControl.setLayoutData(gd);
final Combo combo= new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
combo.setLayoutData(gd);
combo.setToolTipText(preference.getDescription());
for (EnumValue value : domain.fItems) {
combo.add(value.getLabel());
}
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index= combo.getSelectionIndex();
EnumValue value= domain.getValueByIndex(index);
IStatus status= domain.validate(value);
if (!status.matches(IStatus.ERROR))
fOverlayStore.setValue(preference.getKey(), value.getIntValue());
updateStatus(status);
}
});
fInitializers.add(fInitializerFactory.create(preference, combo, domain));
return new Control[] {labelControl, combo};
}
/**
* Adds a spinner for the given preference and domain. Assumes that the
* <code>EnumeratedDomain</code> contains only numeric values in a
* continuous range, no custom entries (use <code>addCombo</code> in that
* case).
*
* @param composite the parent composite
* @param preference the preference
* @param domain its domain
* @param indentation the indentation
* @return the created controls, a <code>Label</code> and a
* <code>Spinner</code> control
*/
Control[] addSpinner(Composite composite, final Preference preference, final EnumeratedDomain domain, int indentation) {
Label labelControl= new Label(composite, SWT.NONE);
labelControl.setText(preference.getName());
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent= indentation;
labelControl.setLayoutData(gd);
final Spinner spinner= new Spinner(composite, SWT.READ_ONLY | SWT.BORDER);
gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
spinner.setLayoutData(gd);
spinner.setToolTipText(preference.getDescription());
spinner.setMinimum(domain.getMinimumValue().getIntValue());
spinner.setMaximum(domain.getMaximumValue().getIntValue());
spinner.setIncrement(1);
spinner.setPageIncrement(4);
spinner.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int index= spinner.getSelection();
EnumValue value= domain.getValueByInteger(index);
IStatus status= domain.validate(value);
if (!status.matches(IStatus.ERROR))
fOverlayStore.setValue(preference.getKey(), value.getIntValue());
updateStatus(status);
}
});
fInitializers.add(fInitializerFactory.create(preference, spinner, domain));
return new Control[] {labelControl, spinner};
}
private Control[] addTextField(Composite composite, final Preference preference, final Domain domain, int textLimit, int indentation) {
Label labelControl= new Label(composite, SWT.NONE);
labelControl.setText(preference.getName());
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent= indentation;
labelControl.setLayoutData(gd);
final Text textControl= new Text(composite, SWT.BORDER | SWT.SINGLE);
gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint= convertWidthInCharsToPixels(textLimit + 1);
textControl.setLayoutData(gd);
textControl.setTextLimit(textLimit);
textControl.setToolTipText(preference.getDescription());
if (domain != null) {
textControl.addModifyListener(e -> {
String value= textControl.getText();
IStatus status= domain.validate(value);
if (!status.matches(IStatus.ERROR))
fOverlayStore.setValue(preference.getKey(), value);
updateStatus(domain);
});
}
fInitializers.add(fInitializerFactory.create(preference, textControl));
fDomains.put(domain, textControl);
return new Control[] {labelControl, textControl};
}
private void createDependency(final Button master, Preference preference, final Control[] slaves) {
indent(slaves[0]);
boolean masterState= fOverlayStore.getBoolean(preference.getKey());
for (Control slave : slaves) {
slave.setEnabled(masterState);
}
SelectionListener listener= new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean state= master.getSelection();
for (Control slave : slaves) {
slave.setEnabled(state);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {}
};
master.addSelectionListener(listener);
fMasterSlaveListeners.add(listener);
}
/**
* Returns the currently selected item in the Appearance Color Options Table.
*
* @return {@link ColorEntry} the ColorEntry representing the currently selected item in the
* table
*/
private ColorEntry getSelectedAppearanceColorOption() {
return (ColorEntry) fAppearanceColorTableViewer.getStructuredSelection().getFirstElement();
}
private static void indent(Control control) {
GridData gridData= new GridData();
gridData.horizontalIndent= 20;
control.setLayoutData(gridData);
}
void updateStatus(IStatus status) {
if (!fFieldsInitialized)
return;
setValid(!status.matches(IStatus.ERROR));
applyToStatusLine(this, status);
}
void updateStatus(Domain checkedDomain) {
if (!fFieldsInitialized)
return;
if (updateStatusOnError(checkedDomain))
return;
Iterator<Domain> iter= fDomains.keySet().iterator();
while (iter.hasNext()) {
Domain domain= iter.next();
if (domain.equals(checkedDomain))
continue;
if (updateStatusOnError(domain))
return;
}
updateStatus(new StatusInfo());
}
private boolean updateStatusOnError(Domain domain) {
Text textWidget= fDomains.get(domain);
if (textWidget.isEnabled()) {
IStatus status= domain.validate(textWidget.getText());
if (status.matches(IStatus.ERROR)) {
updateStatus(status);
return true;
}
}
return false;
}
/**
* Applies the status to the status line of a dialog page.
*
* @param page the dialog page
* @param status the status
*/
public void applyToStatusLine(DialogPage page, IStatus status) {
String message= status.getMessage();
switch (status.getSeverity()) {
case IStatus.OK:
page.setMessage(message, IMessageProvider.NONE);
page.setErrorMessage(null);
break;
case IStatus.WARNING:
page.setMessage(message, IMessageProvider.WARNING);
page.setErrorMessage(null);
break;
case IStatus.INFO:
page.setMessage(message, IMessageProvider.INFORMATION);
page.setErrorMessage(null);
break;
default:
if (message.isEmpty()) {
message= null;
}
page.setMessage(null);
page.setErrorMessage(message);
break;
}
}
}