/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on May 29, 2006 */ package org.python.pydev.plugin.preferences; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.StatusInfo; public abstract class AbstractPydevPrefs extends PreferencePage implements IWorkbenchPreferencePage { // Preferences //To add a new preference it needs to be included in //createAppearancePage //createOverlayStore //initializeDefaultPreferences //declaration of fAppearanceColorListModel if it is a color //constants (here) public static final int TOOLTIP_WIDTH = 80; /* * If you just want to add some option, you will need to: * - create fields for it, as seen here * - add to overlay store in createOverlayStore() * - add what appears in the Preferences page at createAppearancePage() * - add the function to the org.python.pydev.editor.autoedit.IIndentPrefs interface * - probably add that function to org.python.pydev.editor.autoedit.DefaultIndentPrefs * */ /** * Edition of translation paths. */ public static final String SOURCE_LOCATION_PATHS = "SOURCE_LOCATION_PATHS"; //text public static final String TAB_WIDTH = "TAB_WIDTH"; public static final int DEFAULT_TAB_WIDTH = 4; //checkboxes public static final String SUBSTITUTE_TABS = "SUBSTITUTE_TABS"; public static final boolean DEFAULT_SUBSTITUTE_TABS = true; public static final String GUESS_TAB_SUBSTITUTION = "GUESS_TAB_SUBSTITUTION"; public static final boolean DEFAULT_GUESS_TAB_SUBSTITUTION = true; public static final String TAB_STOP_IN_COMMENT = "TAB_STOP_IN_COMMENT"; public static final boolean DEFAULT_TAB_STOP_IN_COMMENT = true; public static final String USE_VERTICAL_INDENT_GUIDE = "USE_VERTICAL_INDENT_GUIDE"; public static final boolean DEFAULT_USE_VERTICAL_INDENT_GUIDE = true; public static final String USE_VERTICAL_INDENT_COLOR_EDITOR_FOREGROUND = "USE_VERTICAL_INDENT_COLOR_EDITOR_FOREGROUND"; public static final boolean DEFAULT_USE_VERTICAL_INDENT_COLOR_EDITOR_FOREGROUND = true; public static final String VERTICAL_INDENT_COLOR = "VERTICAL_INDENT_COLOR"; public static final RGB DEFAULT_VERTICAL_INDENT_COLOR = new RGB(125, 125, 125); public static final String VERTICAL_INDENT_TRANSPARENCY = "VERTICAL_INDENT_TRANSPARENCY"; public static final int DEFAULT_VERTICAL_INDENT_TRANSPARENCY = 100; public static final boolean DEFAULT_EDITOR_USE_CUSTOM_CARETS = false; public static final boolean DEFAULT_EDITOR_WIDE_CARET = false; //matching public static final String USE_MATCHING_BRACKETS = "USE_MATCHING_BRACKETS"; public static final boolean DEFAULT_USE_MATCHING_BRACKETS = true; public static final String MATCHING_BRACKETS_COLOR = "EDITOR_MATCHING_BRACKETS_COLOR"; public static final RGB DEFAULT_MATCHING_BRACKETS_COLOR = new RGB(64, 128, 128); public static final String MATCHING_BRACKETS_STYLE = "EDITOR_MATCHING_BRACKETS_STYLE"; public static final int DEFAULT_MATCHING_BRACKETS_STYLE = SWT.NORMAL; //colors public static final String DECORATOR_COLOR = "DECORATOR_COLOR"; public static final RGB DEFAULT_DECORATOR_COLOR = new RGB(125, 125, 125); public static final String NUMBER_COLOR = "NUMBER_COLOR"; public static final RGB DEFAULT_NUMBER_COLOR = new RGB(128, 0, 0); public static final String CODE_COLOR = "CODE_COLOR"; public static final RGB DEFAULT_CODE_COLOR = new RGB(0, 0, 0); public static final String KEYWORD_COLOR = "KEYWORD_COLOR"; public static final RGB DEFAULT_KEYWORD_COLOR = new RGB(0, 0, 255); public static final String SELF_COLOR = "SELF_COLOR"; public static final RGB DEFAULT_SELF_COLOR = new RGB(0, 0, 0); public static final String STRING_COLOR = "STRING_COLOR"; public static final RGB DEFAULT_STRING_COLOR = new RGB(201, 128, 43); public static final String UNICODE_COLOR = "UNICODE_COLOR"; public static final RGB DEFAULT_UNICODE_COLOR = new RGB(0, 170, 0); public static final String COMMENT_COLOR = "COMMENT_COLOR"; public static final RGB DEFAULT_COMMENT_COLOR = new RGB(192, 192, 192); public static final String BACKQUOTES_COLOR = "BACKQUOTES_COLOR"; public static final RGB DEFAULT_BACKQUOTES_COLOR = new RGB(0, 0, 0); public static final String CLASS_NAME_COLOR = "CLASS_NAME_COLOR"; public static final RGB DEFAULT_CLASS_NAME_COLOR = new RGB(0, 0, 0); public static final String FUNC_NAME_COLOR = "FUNC_NAME_COLOR"; public static final RGB DEFAULT_FUNC_NAME_COLOR = new RGB(0, 0, 0); public static final String PARENS_COLOR = "PARENS_COLOR"; public static final RGB DEFAULT_PARENS_COLOR = new RGB(0, 0, 0); public static final String OPERATORS_COLOR = "OPERATORS_COLOR"; public static final RGB DEFAULT_OPERATORS_COLOR = new RGB(0, 0, 0); public static final String DOCSTRING_MARKUP_COLOR = "DOCSTRING_MARKUP_COLOR"; public static final RGB DEFAULT_DOCSTRING_MARKUP_COLOR = new RGB(0, 170, 0); //see initializeDefaultColors for selection defaults public static final String CONNECT_TIMEOUT = "CONNECT_TIMEOUT"; public static final int DEFAULT_CONNECT_TIMEOUT = 20000; public static final String RELOAD_MODULE_ON_CHANGE = "RELOAD_MODULE_ON_CHANGE"; public static final boolean DEFAULT_RELOAD_MODULE_ON_CHANGE = true; public static final String DONT_TRACE_ENABLED = "DONT_TRACE_ENABLED"; public static final boolean DEFAULT_DONT_TRACE_ENABLED = true; public static final String SHOW_RETURN_VALUES = "SHOW_RETURN_VALUES"; public static final boolean DEFAULT_SHOW_RETURN_VALUES = true; public static final String TRACE_DJANGO_TEMPLATE_RENDER_EXCEPTIONS = "TRACE_DJANGO_TEMPLATE_RENDER_EXCEPTIONS"; public static final boolean DEFAULT_TRACE_DJANGO_TEMPLATE_RENDER_EXCEPTIONS = false; public static final String DEBUG_MULTIPROCESSING_ENABLED = "DEBUG_MULTIPROCESSING_ENABLED"; public static final boolean DEFAULT_DEBUG_MULTIPROCESSING_ENABLED = true; public static final String KILL_SUBPROCESSES_WHEN_TERMINATING_PROCESS = "KILL_SUBPROCESSES_WHEN_TERMINATING_PROCESS"; public static final boolean DEFAULT_KILL_SUBPROCESSES_WHEN_TERMINATING_PROCESS = true; public static final String QT_THREADS_DEBUG_MODE = "QT_THREADS_DEBUG_MODE"; public static final String DEFAULT_QT_THREADS_DEBUG_MODE = "none"; public static final String[][] ENTRIES_VALUES_QT_THREADS_DEBUG_MODE = new String[][] { { "No QThread debugging", "none" }, { "Auto-discover Qt version (may fail if multiple Qt versions are installed)", "auto" }, { "PyQt5", "pyqt5" }, { "PyQt4", "pyqt4" }, { "PySide", "pyside" }, }; public static final String MAKE_LAUNCHES_WITH_M_FLAG = "MAKE_LAUNCHES_WITH_M_FLAG"; public static final boolean DEFAULT_MAKE_LAUNCHES_WITH_M_FLAG = false; public static final String GEVENT_DEBUGGING = "GEVENT_DEBUGGING"; public static final boolean DEFAULT_GEVENT_DEBUGGING = false; //font public static final String DECORATOR_STYLE = "DECORATOR_STYLE"; public static final int DEFAULT_DECORATOR_STYLE = SWT.ITALIC; public static final String NUMBER_STYLE = "NUMBER_STYLE"; public static final int DEFAULT_NUMBER_STYLE = SWT.NORMAL; public static final String CODE_STYLE = "CODE_STYLE"; public static final int DEFAULT_CODE_STYLE = SWT.NORMAL; public static final String KEYWORD_STYLE = "KEYWORD_STYLE"; public static final int DEFAULT_KEYWORD_STYLE = SWT.NORMAL; public static final String SELF_STYLE = "SELF_STYLE"; public static final int DEFAULT_SELF_STYLE = SWT.ITALIC; public static final String STRING_STYLE = "STRING_STYLE"; public static final int DEFAULT_STRING_STYLE = SWT.ITALIC; public static final String UNICODE_STYLE = "UNICODE_STYLE"; public static final int DEFAULT_UNICODE_STYLE = SWT.ITALIC; public static final String COMMENT_STYLE = "COMMENT_STYLE"; public static final int DEFAULT_COMMENT_STYLE = SWT.NORMAL; public static final String BACKQUOTES_STYLE = "BACKQUOTES_STYLE"; public static final int DEFAULT_BACKQUOTES_STYLE = SWT.BOLD; public static final String CLASS_NAME_STYLE = "CLASS_NAME_STYLE"; public static final int DEFAULT_CLASS_NAME_STYLE = SWT.BOLD; public static final String FUNC_NAME_STYLE = "FUNC_NAME_STYLE"; public static final int DEFAULT_FUNC_NAME_STYLE = SWT.BOLD; public static final String PARENS_STYLE = "PARENS_STYLE"; public static final int DEFAULT_PARENS_STYLE = SWT.NORMAL; public static final String OPERATORS_STYLE = "OPERATORS_STYLE"; public static final int DEFAULT_OPERATORS_STYLE = SWT.NORMAL; public static final String DOCSTRING_MARKUP_STYLE = "DOCSTRING_MARKUP_STYLE"; public static final int DEFAULT_DOCSTRING_MARKUP_STYLE = SWT.BOLD; /** * Defaults */ protected final String[][] fAppearanceColorListModel = new String[][] { { "Code", CODE_COLOR, null }, { "Decorators", DECORATOR_COLOR, null }, { "Numbers", NUMBER_COLOR, null }, { "Matching brackets", MATCHING_BRACKETS_COLOR, null }, { "Keywords", KEYWORD_COLOR, null }, { "self", SELF_COLOR, null }, { "Bytes", STRING_COLOR, null }, { "Unicode", UNICODE_COLOR, null }, { "Docstring markup", DOCSTRING_MARKUP_COLOR, null }, { "Comments", COMMENT_COLOR, null }, { "Backquotes", BACKQUOTES_COLOR, null }, { "Class Name", CLASS_NAME_COLOR, null }, { "Function Name", FUNC_NAME_COLOR, null }, { "(), [], {}", PARENS_COLOR, null }, { "Operators (+,-,*,...)", OPERATORS_COLOR, null }, }; protected final String[][] fAppearanceFontListModel = new String[][] { { "Code", CODE_STYLE, null }, { "Decorators", DECORATOR_STYLE, null }, { "Numbers", NUMBER_STYLE, null }, { "Matching brackets", MATCHING_BRACKETS_STYLE, null }, { "Keywords", KEYWORD_STYLE, null }, { "self", SELF_STYLE, null }, { "Bytes", STRING_STYLE, null }, { "Unicode", UNICODE_STYLE, null }, { "Docstring markup", DOCSTRING_MARKUP_STYLE, null }, { "Comments", COMMENT_STYLE, null }, { "Backquotes", BACKQUOTES_STYLE, null }, { "Class Name", CLASS_NAME_STYLE, null }, { "Function Name", FUNC_NAME_STYLE, null }, { "(), [], {}", PARENS_STYLE, null }, { "Operators (+,-,*,...)", OPERATORS_STYLE, null }, }; protected OverlayPreferenceStore fOverlayStore; protected Map<Button, String> fCheckBoxes = new HashMap<Button, String>(); protected SelectionListener fCheckBoxListener = new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { } @Override public void widgetSelected(SelectionEvent e) { Button button = (Button) e.widget; fOverlayStore.setValue(fCheckBoxes.get(button), button.getSelection()); } }; protected Map<Text, String> fTextFields = new HashMap<Text, String>(); protected ModifyListener fTextFieldListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { Text text = (Text) e.widget; fOverlayStore.setValue(fTextFields.get(text), text.getText()); } }; protected java.util.List<Text> fNumberFields = new ArrayList<Text>(); protected ModifyListener fNumberFieldListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { numberFieldChanged((Text) e.widget); } }; protected List fAppearanceColorList; protected ColorEditor fAppearanceColorEditor; protected Button fAppearanceColorDefault; protected Button fFontBoldCheckBox; protected Button fFontItalicCheckBox; protected SelectionListener fStyleCheckBoxListener = new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { // do nothing } @Override public void widgetSelected(SelectionEvent e) { int i = fAppearanceColorList.getSelectionIndex(); int style = SWT.NORMAL; String styleKey = fAppearanceFontListModel[i][1]; if (fFontBoldCheckBox.getSelection()) { style = style | SWT.BOLD; } if (fFontItalicCheckBox.getSelection()) { style = style | SWT.ITALIC; } fOverlayStore.setValue(styleKey, style); onAppearanceRelatedPreferenceChanged(); } }; /** * Tells whether the fields are initialized. * @since 3.0 */ protected boolean fFieldsInitialized = false; /** * List of master/slave listeners when there's a dependency. * * @see #createDependency(Button, String, Control) * @since 3.0 */ protected java.util.List<SelectionListener> fMasterSlaveListeners = new ArrayList<SelectionListener>(); protected OverlayPreferenceStore createOverlayStore() { java.util.List<OverlayPreferenceStore.OverlayKey> overlayKeys = new ArrayList<OverlayPreferenceStore.OverlayKey>(); //matching overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_MATCHING_BRACKETS)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, MATCHING_BRACKETS_COLOR)); //colors overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CODE_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, NUMBER_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, DECORATOR_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, KEYWORD_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, SELF_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, STRING_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, UNICODE_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, COMMENT_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, BACKQUOTES_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, CLASS_NAME_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, FUNC_NAME_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PARENS_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, OPERATORS_COLOR)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, DOCSTRING_MARKUP_COLOR)); //font style overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CODE_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, NUMBER_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, DECORATOR_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, KEYWORD_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, SELF_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, STRING_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, UNICODE_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, COMMENT_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, BACKQUOTES_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CLASS_NAME_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, FUNC_NAME_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, PARENS_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, OPERATORS_STYLE)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, DOCSTRING_MARKUP_STYLE)); OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()]; overlayKeys.toArray(keys); return new OverlayPreferenceStore(getPreferenceStore(), keys); } /** * This method should be called when the preferences change for some appearance option * (color, bold, italic). */ protected void onAppearanceRelatedPreferenceChanged() { } /* * @see IWorkbenchPreferencePage#init() */ @Override public void init(IWorkbench workbench) { } protected Button addStyleCheckBox(Composite parent, String text) { Button result = new Button(parent, SWT.CHECK); result.setText(text); GridData gd = new GridData(); gd.horizontalSpan = 2; result.setLayoutData(gd); result.addSelectionListener(fStyleCheckBoxListener); return result; } /* * @see PreferencePage#createContents(Composite) */ @Override protected Control createContents(Composite parent) { initializeDefaultColors(); fOverlayStore.load(); fOverlayStore.start(); Control control = createAppearancePage(parent); initialize(); Dialog.applyDialogFont(control); return control; } protected abstract Control createAppearancePage(Composite parent); protected void initialize() { initializeFields(); if (fAppearanceColorList != null) { for (int i = 0; i < fAppearanceColorListModel.length; i++) { fAppearanceColorList.add(fAppearanceColorListModel[i][0]); } fAppearanceColorList.getDisplay().asyncExec(new Runnable() { @Override public void run() { if (fAppearanceColorList != null && !fAppearanceColorList.isDisposed()) { fAppearanceColorList.select(0); handleAppearanceColorListSelection(); } } }); } } protected void initializeFields() { Iterator e = fCheckBoxes.keySet().iterator(); while (e.hasNext()) { Button b = (Button) e.next(); String key = fCheckBoxes.get(b); b.setSelection(fOverlayStore.getBoolean(key)); } e = fTextFields.keySet().iterator(); while (e.hasNext()) { Text t = (Text) e.next(); String key = fTextFields.get(t); t.setText(fOverlayStore.getString(key)); } fFieldsInitialized = true; updateStatus(validatePositiveNumber("0")); // Update slaves Iterator<SelectionListener> iter = fMasterSlaveListeners.iterator(); while (iter.hasNext()) { SelectionListener listener = iter.next(); listener.widgetSelected(null); } } protected 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); } } /* * @see PreferencePage#performOk() */ @Override public boolean performOk() { fOverlayStore.propagate(); PydevPlugin.getDefault().savePluginPreferences(); return true; } /* * @see PreferencePage#performDefaults() */ @Override protected void performDefaults() { fOverlayStore.loadDefaults(); initializeFields(); handleAppearanceColorListSelection(); super.performDefaults(); onAppearanceRelatedPreferenceChanged(); } /* * @see DialogPage#dispose() */ @Override public void dispose() { if (fOverlayStore != null) { fOverlayStore.stop(); fOverlayStore = null; } super.dispose(); } protected Button addCheckBox(Composite parent, String label, String key, int indentation) { Button checkBox = new Button(parent, SWT.CHECK); checkBox.setText(label); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = indentation; gd.horizontalSpan = 2; checkBox.setLayoutData(gd); checkBox.addSelectionListener(fCheckBoxListener); fCheckBoxes.put(checkBox, key); return checkBox; } protected Label addLabel(Composite parent, String label, int indentation) { Label labelWidget = new Label(parent, SWT.None); labelWidget.setText(label); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = indentation; gd.horizontalSpan = 2; labelWidget.setLayoutData(gd); return labelWidget; } protected Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) { Label labelControl = new Label(composite, SWT.NONE); labelControl.setText(label); GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); gd.horizontalIndent = indentation; labelControl.setLayoutData(gd); 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); fTextFields.put(textControl, key); if (isNumber) { fNumberFields.add(textControl); textControl.addModifyListener(fNumberFieldListener); } else { textControl.addModifyListener(fTextFieldListener); } return textControl; } protected void createInverseDependency(final Button master, String masterKey, final Control slave) { doCreateDependency(master, masterKey, slave, false); } protected void createDependency(final Button master, String masterKey, final Control slave) { doCreateDependency(master, masterKey, slave, true); } private void doCreateDependency(final Button master, String masterKey, final Control slave, final boolean enableIf) { indent(slave); boolean masterState = fOverlayStore.getBoolean(masterKey); slave.setEnabled(masterState == enableIf); SelectionListener listener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { slave.setEnabled(master.getSelection() == enableIf); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; master.addSelectionListener(listener); fMasterSlaveListeners.add(listener); } protected static void indent(Control control) { GridData gridData = new GridData(); gridData.horizontalIndent = 20; control.setLayoutData(gridData); } protected void numberFieldChanged(Text textControl) { String number = textControl.getText(); IStatus status = validatePositiveNumber(number); if (!status.matches(IStatus.ERROR)) { fOverlayStore.setValue(fTextFields.get(textControl), number); } updateStatus(status); } protected IStatus validatePositiveNumber(String number) { StatusInfo status = new StatusInfo(); if (number.length() == 0) { status.setError("empty_input??"); } else { try { int value = Integer.parseInt(number); if (value < 0) { status.setError("invalid_input??"); } } catch (NumberFormatException e) { status.setError("invalid_input??"); } } return status; } void updateStatus(IStatus status) { if (!fFieldsInitialized) { return; } if (!status.matches(IStatus.ERROR)) { for (int i = 0; i < fNumberFields.size(); i++) { Text text = fNumberFields.get(i); IStatus s = validatePositiveNumber(text.getText()); status = s.getSeverity() > status.getSeverity() ? s : status; } } setValid(!status.matches(IStatus.ERROR)); applyToStatusLine(this, status); } /** * 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.length() == 0) { message = null; } page.setMessage(null); page.setErrorMessage(message); break; } } protected void handleAppearanceColorListSelection() { int i = fAppearanceColorList.getSelectionIndex(); String key = fAppearanceColorListModel[i][1]; RGB rgb = PreferenceConverter.getColor(fOverlayStore, key); fAppearanceColorEditor.setColorValue(rgb); String styleKey = fAppearanceFontListModel[i][1]; int styleValue = fOverlayStore.getInt(styleKey); if ((styleValue & SWT.BOLD) == 0) { fFontBoldCheckBox.setSelection(false); } else { fFontBoldCheckBox.setSelection(true); } if ((styleValue & SWT.ITALIC) == 0) { fFontItalicCheckBox.setSelection(false); } else { fFontItalicCheckBox.setSelection(true); } updateAppearanceColorWidgets(fAppearanceColorListModel[i][2]); } protected void updateAppearanceColorWidgets(String systemDefaultKey) { if (systemDefaultKey == null) { fAppearanceColorDefault.setSelection(false); fAppearanceColorDefault.setVisible(false); fAppearanceColorEditor.getButton().setEnabled(true); } else { boolean systemDefault = fOverlayStore.getBoolean(systemDefaultKey); fAppearanceColorDefault.setSelection(systemDefault); fAppearanceColorDefault.setVisible(true); fAppearanceColorEditor.getButton().setEnabled(!systemDefault); } } }