org.ganoro.phing.ui.internal.preferences.AntPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.ganoro.phing.ui.internal.preferences.AntPreferencePage.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.ganoro.phing.ui.internal.preferences;

import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
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.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.ganoro.phing.launching.PhingLaunching;
import org.ganoro.phing.ui.IAntUIPreferenceConstants;
import org.ganoro.phing.ui.PhingUi;

import com.ibm.icu.text.MessageFormat;

public class AntPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

    /**
     * Allows us to override the default behavior of the default {@link IntegerFieldEditor} to work
     * on a core preference context
     * 
     * @since 3.6
     */
    class AntIntegerFieldEditor extends IntegerFieldEditor {
        String node = null, key = null;
        int defaultvalue = -1;

        /**
         * Constructor
         * @param node the identifier of the node we want to set the preference in, i.e. org.eclipse.ant.launching
         * @param key the preference key to map the value to
         * @param title the title of the field editor
         * @param parent the parent to add the field editor to
         * @param defaultvalue the default value to return when looking up stored values
         */
        public AntIntegerFieldEditor(String node, String key, String title, Composite parent, int defaultvalue) {
            super(key, title, parent);
            this.node = node;
            this.key = key;
            this.defaultvalue = defaultvalue;
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.IntegerFieldEditor#doStore()
         */
        protected void doStore() {
            InstanceScope.INSTANCE.getNode(node).putInt(key, Integer.parseInt(getStringValue()));
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.FieldEditor#load()
         */
        public void load() {
            setStringValue(
                    Integer.toString(Platform.getPreferencesService().getInt(node, key, defaultvalue, null)));
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.FieldEditor#loadDefault()
         */
        public void loadDefault() {
            setStringValue(Integer.toString(
                    DefaultScope.INSTANCE.getNode(PhingLaunching.getUniqueIdentifier()).getInt(key, defaultvalue)));
        }
    }

    private List fConsoleColorList;
    private ColorEditor fConsoleColorEditor;
    private IntegerFieldEditor timeout;
    private BooleanFieldEditor workspacejre = null;

    private BooleanFieldEditor fToolsWarningEditor = null;

    // Array containing the message to display, the preference key, and the 
    // default value (initialized in storeInitialValues()) for each color preference
    private final String[][] fAppearanceColorListModel = new String[][] {
            { AntPreferencesMessages.AntPreferencePage__Error__2, IAntUIPreferenceConstants.CONSOLE_ERROR_COLOR,
                    null },
            { AntPreferencesMessages.AntPreferencePage__Warning__3, IAntUIPreferenceConstants.CONSOLE_WARNING_COLOR,
                    null },
            { AntPreferencesMessages.AntPreferencePage_I_nformation__4,
                    IAntUIPreferenceConstants.CONSOLE_INFO_COLOR, null },
            { AntPreferencesMessages.AntPreferencePage_Ve_rbose__5, IAntUIPreferenceConstants.CONSOLE_VERBOSE_COLOR,
                    null },
            { AntPreferencesMessages.AntPreferencePage_Deb_ug__6, IAntUIPreferenceConstants.CONSOLE_DEBUG_COLOR,
                    null }, };

    /**
      * Create the Ant page.
      */
    public AntPreferencePage() {
        super(GRID);
        setDescription(AntPreferencesMessages.AntPreferencePage_General);
        setPreferenceStore(PhingUi.getDefault().getPreferenceStore());
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
     */
    protected void createFieldEditors() {
        storeAppliedValues();

        Font font = getFieldEditorParent().getFont();
        Label label = new Label(getFieldEditorParent(), SWT.WRAP);
        label.setText(AntPreferencesMessages.AntPreferencePage_Enter);
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 3;
        gd.widthHint = convertWidthInCharsToPixels(60);
        label.setLayoutData(gd);
        label.setLayoutData(gd);
        label.setFont(font);

        StringFieldEditor editor = new StringFieldEditor(IAntUIPreferenceConstants.ANT_FIND_BUILD_FILE_NAMES,
                AntPreferencesMessages.AntPreferencePage__Names__3, getFieldEditorParent());
        addField(editor);

        timeout = new AntIntegerFieldEditor(PhingLaunching.getUniqueIdentifier(), "ANT_COMMUNICATION_TIMEOUT",
                AntPreferencesMessages.AntPreferencePage_13, getFieldEditorParent(), 2000);
        int minValue = 20000;
        int maxValue = 1200000;
        timeout.setValidRange(minValue, maxValue);
        timeout.setValidateStrategy(StringFieldEditor.VALIDATE_ON_KEY_STROKE);
        timeout.setErrorMessage(MessageFormat.format(AntPreferencesMessages.AntPreferencePage_14,
                new Object[] { new Integer(minValue), new Integer(maxValue) }));
        addField(timeout);

        editor = new URLFieldEditor(IAntUIPreferenceConstants.DOCUMENTATION_URL,
                AntPreferencesMessages.AntPreferencePage_2, getFieldEditorParent());
        addField(editor);

        workspacejre = new BooleanFieldEditor(IAntUIPreferenceConstants.USE_WORKSPACE_JRE,
                AntPreferencesMessages.always_run_in_workspace_jre, getFieldEditorParent());
        workspacejre.fillIntoGrid(getFieldEditorParent(), 3);
        addField(workspacejre);

        createSpace();

        if (!PhingUi.isMacOS()) {
            //the mac does not have a tools.jar Bug 40778
            label = new Label(getFieldEditorParent(), SWT.WRAP);
            label.setText(AntPreferencesMessages.AntPreferencePage_0);
            gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
            gd.horizontalSpan = 3;
            gd.widthHint = convertWidthInCharsToPixels(60);
            label.setLayoutData(gd);
            label.setFont(font);
            fToolsWarningEditor = new BooleanFieldEditor(IAntUIPreferenceConstants.ANT_TOOLS_JAR_WARNING,
                    AntPreferencesMessages.AntPreferencePage_1, getFieldEditorParent());
            addField(fToolsWarningEditor);
            createSpace();
        }

        addField(new BooleanFieldEditor(IAntUIPreferenceConstants.ANT_ERROR_DIALOG,
                AntPreferencesMessages.AntPreferencePage_12, getFieldEditorParent()));
        createSpace();

        addField(new BooleanFieldEditor(IAntUIPreferenceConstants.ANT_CREATE_MARKERS,
                AntPreferencesMessages.AntPreferencePage_15, getFieldEditorParent()));
        label = new Label(getFieldEditorParent(), SWT.WRAP);
        label.setText(AntPreferencesMessages.AntPreferencePage_16);
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 3;
        gd.widthHint = convertWidthInCharsToPixels(60);
        label.setLayoutData(gd);
        label.setFont(font);

        createSpace();
        createColorComposite();
        getPreferenceStore().addPropertyChangeListener(this);
    }

    private void createSpace() {
        Label label = new Label(getFieldEditorParent(), SWT.NONE);
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 3;
        label.setLayoutData(gd);
    }

    /**
     * Stores the initial values of the color preferences. The preference values are updated 
     * on the fly as the user edits them (instead of only when they press "Apply"). We need
     * to store the old values so that we can reset them when the user chooses "Cancel".
     */
    private void storeAppliedValues() {
        IPreferenceStore store = getPreferenceStore();
        for (int i = 0; i < fAppearanceColorListModel.length; i++) {
            String preference = fAppearanceColorListModel[i][1];
            fAppearanceColorListModel[i][2] = store.getString(preference);
        }
    }

    private void createColorComposite() {
        Font font = getFieldEditorParent().getFont();
        Label label = new Label(getFieldEditorParent(), SWT.LEFT);
        label.setText(AntPreferencesMessages.AntPreferencePage_Ant_Color_Options__6);
        label.setFont(font);
        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
        gd.horizontalSpan = 2;
        label.setLayoutData(gd);

        Composite editorComposite = new Composite(getFieldEditorParent(), SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        editorComposite.setLayout(layout);
        editorComposite.setFont(font);
        gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
        gd.horizontalSpan = 2;
        editorComposite.setLayoutData(gd);

        fConsoleColorList = new List(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
        gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
        gd.heightHint = convertHeightInCharsToPixels(8);
        fConsoleColorList.setLayoutData(gd);
        fConsoleColorList.setFont(font);

        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));
        stylesComposite.setFont(font);

        label = new Label(stylesComposite, SWT.LEFT);
        label.setText(AntPreferencesMessages.AntPreferencePage_Color__7);
        label.setFont(font);
        gd = new GridData();
        gd.horizontalAlignment = GridData.BEGINNING;
        label.setLayoutData(gd);

        fConsoleColorEditor = new ColorEditor(stylesComposite);
        Button foregroundColorButton = fConsoleColorEditor.getButton();
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalAlignment = GridData.BEGINNING;
        foregroundColorButton.setLayoutData(gd);
        foregroundColorButton.setFont(font);

        fConsoleColorList.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                handleAppearanceColorListSelection();
            }
        });
        foregroundColorButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                int i = fConsoleColorList.getSelectionIndex();
                if (i == -1) { //bug 85590
                    return;
                }
                String key = fAppearanceColorListModel[i][1];
                PreferenceConverter.setValue(getPreferenceStore(), key, fConsoleColorEditor.getColorValue());
            }
        });
    }

    /**
     * Restore all color preferences to their values when the page was opened.
     */
    public boolean performCancel() {
        for (int i = 0; i < fAppearanceColorListModel.length; i++) {
            String preference = fAppearanceColorListModel[i][1];
            PreferenceConverter.setValue(getPreferenceStore(), preference,
                    StringConverter.asRGB(fAppearanceColorListModel[i][2]));
        }
        return super.performCancel();
    }

    /**
     * When the user applies the preferences, update the set of stored
     * preferences so that we will fall back to the applied values on Cancel.
     */
    public boolean performOk() {
        storeAppliedValues();
        return super.performOk();
    }

    private void handleAppearanceColorListSelection() {
        int i = fConsoleColorList.getSelectionIndex();
        if (i == -1) { //bug 85590
            return;
        }
        String key = fAppearanceColorListModel[i][1];
        RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), key);
        fConsoleColorEditor.setColorValue(rgb);
    }

    /**
     * @see IWorkbenchPreferencePage#init(IWorkbench)
     */
    public void init(IWorkbench workbench) {
    }

    /**
     * @see org.eclipse.jface.preference.FieldEditorPreferencePage#initialize()
     */
    protected void initialize() {
        super.initialize();
        for (int i = 0; i < fAppearanceColorListModel.length; i++) {
            fConsoleColorList.add(fAppearanceColorListModel[i][0]);
        }
        fConsoleColorList.getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (fConsoleColorList != null && !fConsoleColorList.isDisposed()) {
                    fConsoleColorList.select(0);
                    handleAppearanceColorListSelection();
                }
            }
        });
    }

    /**
     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
     */
    protected void performDefaults() {
        for (int i = 0; i < fAppearanceColorListModel.length; i++) {
            String key = fAppearanceColorListModel[i][1];
            PreferenceConverter.setValue(getPreferenceStore(), key,
                    PreferenceConverter.getDefaultColor(getPreferenceStore(), key));
        }
        handleAppearanceColorListSelection();
        super.performDefaults();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
     */
    public void dispose() {
        getPreferenceStore().removePropertyChangeListener(this);
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
     */
    public void propertyChange(PropertyChangeEvent event) {
        if (event.getProperty().equals(IAntUIPreferenceConstants.ANT_TOOLS_JAR_WARNING)) {
            if (fToolsWarningEditor != null) {
                fToolsWarningEditor.load();
            }
        } else {
            super.propertyChange(event);
        }
    }
}