org.erlide.ui.prefs.plugin.EditorPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.erlide.ui.prefs.plugin.EditorPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2004 Vlad Dumitrescu and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Vlad Dumitrescu
 *******************************************************************************/
package org.erlide.ui.prefs.plugin;

import java.text.MessageFormat;
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.core.runtime.preferences.IEclipsePreferences;
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.SelectionListener;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
import org.erlide.ui.internal.ErlideUIPlugin;
import org.erlide.ui.util.OverlayPreferenceStore;
import org.erlide.ui.util.StatusInfo;
import org.osgi.service.prefs.BackingStoreException;

/**
 * The editor preferences
 * 
 * 
 * @author Vlad Dumitrescu
 */
public class EditorPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    /**
     * Initialize the system preferences
     * 
     */
    public EditorPreferencePage() {
        setDescription(ErlEditorMessages.ErlEditorPreferencePage_description);
        setPreferenceStore(ErlideUIPlugin.getDefault().getPreferenceStore());

        fOverlayStore = createOverlayStore();
    }

    /**
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    @Override
    public void init(final IWorkbench workbench) {
        setPreferenceStore(ErlideUIPlugin.getDefault().getPreferenceStore());
    }

    final String[][] fAppearanceColorListModel = new String[][] {
            { ErlEditorMessages.ErlEditorPreferencePage_lineNumberForegroundColor,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR, null },
            { ErlEditorMessages.ErlEditorPreferencePage_currentLineHighlighColor,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR, null },
            { ErlEditorMessages.ErlEditorPreferencePage_printMarginColor,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR, null },
            { ErlEditorMessages.ErlEditorPreferencePage_selectionForegroundColor,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_DEFAULT_COLOR },
            { ErlEditorMessages.ErlEditorPreferencePage_selectionBackgroundColor,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR,
                    AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_DEFAULT_COLOR }, };

    OverlayPreferenceStore fOverlayStore;

    Map<Control, String> fCheckBoxes = new HashMap<Control, String>();

    // private final SelectionListener fCheckBoxListener = new
    // SelectionListener() {
    //
    // public void widgetDefaultSelected(final SelectionEvent e) {
    // }
    //
    // public void widgetSelected(final SelectionEvent e) {
    // final Button button = (Button) e.widget;
    // fOverlayStore.setValue(fCheckBoxes.get(button), button
    // .getSelection());
    // }
    // };

    Map<Control, String> fTextFields = new HashMap<Control, String>();

    private final ModifyListener fTextFieldListener = new ModifyListener() {

        @Override
        public void modifyText(final ModifyEvent e) {
            final Text text = (Text) e.widget;
            fOverlayStore.setValue(fTextFields.get(text), text.getText());
        }
    };

    private final ArrayList<Control> fNumberFields = new ArrayList<Control>();

    private final ModifyListener fNumberFieldListener = new ModifyListener() {

        @Override
        public void modifyText(final ModifyEvent e) {
            numberFieldChanged((Text) e.widget);
        }
    };

    // List fAppearanceColorList;
    //
    // ColorEditor fAppearanceColorEditor;
    //
    // Button fAppearanceColorDefault;

    /**
     * Tells whether the fields are initialized.
     */
    private boolean fFieldsInitialized = false;

    /**
     * List of master/slave listeners when there's a dependency.
     * 
     * @see #createDependency(Button, String, Control)
     */
    private final ArrayList<SelectionListener> fMasterSlaveListeners = new ArrayList<SelectionListener>();

    private OverlayPreferenceStore createOverlayStore() {

        final ArrayList<OverlayPreferenceStore.OverlayKey> overlayKeys = new ArrayList<OverlayPreferenceStore.OverlayKey>();

        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.STRING,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE));

        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.INT,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH));

        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.STRING,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLOR));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.INT,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN));

        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER));

        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.STRING,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER_COLOR));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_USE_CUSTOM_CARETS));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WIDE_CARET));

        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.STRING,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_COLOR));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_FOREGROUND_DEFAULT_COLOR));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.STRING,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR));
        overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.TypeDescriptor.BOOLEAN,
                AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_DEFAULT_COLOR));

        return new OverlayPreferenceStore(getPreferenceStore(),
                overlayKeys.toArray(new OverlayPreferenceStore.OverlayKey[overlayKeys.size()]));
    }

    /*
     * @see PreferencePage#createControl(Composite)
     */
    @Override
    public void createControl(final Composite parent) {
        super.createControl(parent);
        // WorkbenchHelp.setHelp(getControl(),
        // ITextEditorHelpContextIds.TEXT_EDITOR_PREFERENCE_PAGE);
    }

    // void handleAppearanceColorListSelection() {
    // final int i = fAppearanceColorList.getSelectionIndex();
    // final String key = fAppearanceColorListModel[i][1];
    // final RGB rgb = PreferenceConverter.getColor(fOverlayStore, key);
    // fAppearanceColorEditor.setColorValue(rgb);
    // updateAppearanceColorWidgets(fAppearanceColorListModel[i][2]);
    // }
    //
    // private void updateAppearanceColorWidgets(final String systemDefaultKey)
    // {
    // if (systemDefaultKey == null) {
    // fAppearanceColorDefault.setSelection(false);
    // fAppearanceColorDefault.setVisible(false);
    // fAppearanceColorEditor.getButton().setEnabled(true);
    // } else {
    // final boolean systemDefault = fOverlayStore
    // .getBoolean(systemDefaultKey);
    // fAppearanceColorDefault.setSelection(systemDefault);
    // fAppearanceColorDefault.setVisible(true);
    // fAppearanceColorEditor.getButton().setEnabled(!systemDefault);
    // }
    // }

    private Control createAppearancePage(final Composite parent) {

        final Composite appearanceComposite = new Composite(parent, SWT.NONE);
        final GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        appearanceComposite.setLayout(layout);

        final String label = ErlEditorMessages.ErlEditorPreferencePage_displayedTabWidth;
        addTextField(appearanceComposite, label, AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH, 3,
                0, true);

        // label = ErlEditorMessages.ErlEditorPreferencePage_printMarginColumn;
        // addTextField(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN_COLUMN,
        // 3, 0, true);

        // label = ErlEditorMessages.ErlEditorPreferencePage_showOverviewRuler;
        // addCheckBox(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER,
        // 0);

        // label = ErlEditorMessages.ErlEditorPreferencePage_showLineNumbers;
        // addCheckBox(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_LINE_NUMBER_RULER,
        // 0);
        //
        // label =
        // ErlEditorMessages.ErlEditorPreferencePage_highlightCurrentLine;
        // addCheckBox(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE,
        // 0);
        //
        // label = ErlEditorMessages.ErlEditorPreferencePage_showPrintMargin;
        // addCheckBox(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_PRINT_MARGIN,
        // 0);

        // label =
        // ErlEditorMessages.ErlEditorPreferencePage_accessibility_disableCustomCarets;
        // final Button master = addCheckBox(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_USE_CUSTOM_CARETS,
        // 0);
        //
        // label =
        // ErlEditorMessages.ErlEditorPreferencePage_accessibility_wideCaret;
        // final Button slave = addCheckBox(
        // appearanceComposite,
        // label,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_WIDE_CARET,
        // 0);
        // createDependency(
        // master,
        // AbstractDecoratedTextEditorPreferenceConstants.EDITOR_USE_CUSTOM_CARETS,
        // slave);
        //
        // Label l = new Label(appearanceComposite, SWT.LEFT);
        // GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        // gd.horizontalSpan = 2;
        // gd.heightHint = convertHeightInCharsToPixels(1) / 2;
        // l.setLayoutData(gd);
        //
        // l = new Label(appearanceComposite, SWT.LEFT);
        // l.setText(ErlEditorMessages.ErlEditorPreferencePage_appearanceOptions);
        // gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        // gd.horizontalSpan = 2;
        // l.setLayoutData(gd);
        //
        // final 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);
        //
        // fAppearanceColorList = new List(editorComposite, SWT.SINGLE
        // | SWT.V_SCROLL | SWT.BORDER);
        // gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING
        // | GridData.FILL_HORIZONTAL);
        // gd.heightHint = convertHeightInCharsToPixels(5);
        // fAppearanceColorList.setLayoutData(gd);
        //
        // final 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(ErlEditorMessages.ErlEditorPreferencePage_color);
        // gd = new GridData();
        // gd.horizontalAlignment = GridData.BEGINNING;
        // l.setLayoutData(gd);
        //
        // fAppearanceColorEditor = new ColorEditor(stylesComposite);
        // final Button foregroundColorButton =
        // fAppearanceColorEditor.getButton();
        // gd = new GridData(GridData.FILL_HORIZONTAL);
        // gd.horizontalAlignment = GridData.BEGINNING;
        // foregroundColorButton.setLayoutData(gd);
        //
        // final SelectionListener colorDefaultSelectionListener = new
        // SelectionListener() {
        //
        // public void widgetSelected(final SelectionEvent e) {
        // final boolean systemDefault = fAppearanceColorDefault
        // .getSelection();
        // fAppearanceColorEditor.getButton().setEnabled(!systemDefault);
        //
        // final int i = fAppearanceColorList.getSelectionIndex();
        // final String key = fAppearanceColorListModel[i][2];
        // if (key != null) {
        // fOverlayStore.setValue(key, systemDefault);
        // }
        // }
        //
        // public void widgetDefaultSelected(final SelectionEvent e) {
        // }
        // };
        //
        // fAppearanceColorDefault = new Button(stylesComposite, SWT.CHECK);
        // fAppearanceColorDefault
        // .setText(ErlEditorMessages.ErlEditorPreferencePage_systemDefault);
        // gd = new GridData(GridData.FILL_HORIZONTAL);
        // gd.horizontalAlignment = GridData.BEGINNING;
        // gd.horizontalSpan = 2;
        // fAppearanceColorDefault.setLayoutData(gd);
        // fAppearanceColorDefault.setVisible(false);
        // fAppearanceColorDefault
        // .addSelectionListener(colorDefaultSelectionListener);
        //
        // fAppearanceColorList.addSelectionListener(new SelectionListener() {
        //
        // public void widgetDefaultSelected(final SelectionEvent e) {
        // // do nothing
        // }
        //
        // public void widgetSelected(final SelectionEvent e) {
        // handleAppearanceColorListSelection();
        // }
        // });
        // foregroundColorButton.addSelectionListener(new SelectionListener() {
        //
        // public void widgetDefaultSelected(final SelectionEvent e) {
        // // do nothing
        // }
        //
        // public void widgetSelected(final SelectionEvent e) {
        // final int i = fAppearanceColorList.getSelectionIndex();
        // final String key = fAppearanceColorListModel[i][1];
        //
        // PreferenceConverter.setValue(fOverlayStore, key,
        // fAppearanceColorEditor.getColorValue());
        // }
        // });

        return appearanceComposite;
    }

    /*
     * @see PreferencePage#createContents(Composite)
     */
    @Override
    protected Control createContents(final Composite parent) {

        initializeDefaultColors();

        fOverlayStore.load();
        fOverlayStore.start();

        final Control control = createAppearancePage(parent);
        initialize();
        Dialog.applyDialogFont(control);
        return control;
    }

    private void initialize() {

        initializeFields();

        // for (final String[] element : fAppearanceColorListModel) {
        // fAppearanceColorList.add(element[0]);
        // }
        // fAppearanceColorList.getDisplay().asyncExec(new Runnable() {
        //
        // public void run() {
        // if (fAppearanceColorList != null
        // && !fAppearanceColorList.isDisposed()) {
        // fAppearanceColorList.select(0);
        // handleAppearanceColorListSelection();
        // }
        // }
        // });
    }

    private void initializeFields() {

        Iterator<Control> e = fCheckBoxes.keySet().iterator();
        while (e.hasNext()) {
            final Button b = (Button) e.next();
            final String key = fCheckBoxes.get(b);
            b.setSelection(fOverlayStore.getBoolean(key));
        }

        e = fTextFields.keySet().iterator();
        while (e.hasNext()) {
            final Text t = (Text) e.next();
            final String key = fTextFields.get(t);
            t.setText(fOverlayStore.getString(key));
        }

        fFieldsInitialized = true;
        updateStatus(validatePositiveNumber("0")); //$NON-NLS-1$

        // Update slaves
        final Iterator<SelectionListener> iter = fMasterSlaveListeners.iterator();
        while (iter.hasNext()) {
            final SelectionListener listener = iter.next();
            listener.widgetSelected(null);
        }
    }

    private void initializeDefaultColors() {
        if (!getPreferenceStore()
                .contains(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SELECTION_BACKGROUND_COLOR)) {
            final 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)) {
            final 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();
        final IEclipsePreferences prefsNode = ErlideUIPlugin.getPrefsNode();
        try {
            prefsNode.flush();
        } catch (final BackingStoreException e) {
            e.printStackTrace();
        }
        return true;
    }

    /*
     * @see PreferencePage#performDefaults()
     */
    @Override
    protected void performDefaults() {

        // fOverlayStore.loadDefaults();
        fOverlayStore.load();

        initializeFields();

        // handleAppearanceColorListSelection();

        super.performDefaults();
    }

    /*
     * @see DialogPage#dispose()
     */
    @Override
    public void dispose() {

        if (fOverlayStore != null) {
            fOverlayStore.stop();
            fOverlayStore = null;
        }

        super.dispose();
    }

    // private Button addCheckBox(final Composite parent, final String label,
    // final String key, final int indentation) {
    // final Button checkBox = new Button(parent, SWT.CHECK);
    // checkBox.setText(label);
    //
    // final 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;
    // }

    private Control addTextField(final Composite composite, final String label, final String key,
            final int textLimit, final int indentation, final boolean isNumber) {

        final Label labelControl = new Label(composite, SWT.NONE);
        labelControl.setText(label);
        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);
        fTextFields.put(textControl, key);
        if (isNumber) {
            fNumberFields.add(textControl);
            textControl.addModifyListener(fNumberFieldListener);
        } else {
            textControl.addModifyListener(fTextFieldListener);
        }

        return textControl;
    }

    // private void createDependency(final Button master, final String
    // masterKey,
    // final Control slave) {
    // indent(slave);
    //
    // final boolean masterState = fOverlayStore.getBoolean(masterKey);
    // slave.setEnabled(masterState);
    //
    // final SelectionListener listener = new SelectionListener() {
    //
    // public void widgetSelected(final SelectionEvent e) {
    // slave.setEnabled(master.getSelection());
    // }
    //
    // public void widgetDefaultSelected(final SelectionEvent e) {
    // }
    // };
    // master.addSelectionListener(listener);
    // fMasterSlaveListeners.add(listener);
    // }

    // private static void indent(final Control control) {
    // final GridData gridData = new GridData();
    // gridData.horizontalIndent = 20;
    // control.setLayoutData(gridData);
    // }

    void numberFieldChanged(final Text textControl) {
        final String number = textControl.getText();
        final IStatus status = validatePositiveNumber(number);
        if (!status.matches(IStatus.ERROR)) {
            fOverlayStore.setValue(fTextFields.get(textControl), number);
        }
        updateStatus(status);
    }

    public static IStatus validatePositiveNumber(final String number) {
        final StatusInfo status = new StatusInfo();
        if (number.length() == 0) {
            status.setError(ErlEditorMessages.ErlEditorPreferencePage_empty_input);
        } else {
            try {
                final int value = Integer.parseInt(number);
                if (value < 0) {
                    status.setError(MessageFormat.format(ErlEditorMessages.ErlEditorPreferencePage_invalid_input,
                            (Object[]) new String[] { number }));
                }
            } catch (final NumberFormatException e) {
                status.setError(MessageFormat.format(ErlEditorMessages.ErlEditorPreferencePage_invalid_input,
                        (Object[]) new String[] { number }));
            }
        }
        return status;
    }

    void updateStatus(IStatus status) {
        if (!fFieldsInitialized) {
            return;
        }

        if (!status.matches(IStatus.ERROR)) {
            for (int i = 0; i < fNumberFields.size(); i++) {
                final Text text = (Text) fNumberFields.get(i);
                final 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 static void applyToStatusLine(final DialogPage page, final 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;
        }
    }
}