org.dawb.workbench.ui.editors.preference.EditorPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.dawb.workbench.ui.editors.preference.EditorPreferencePage.java

Source

/*
 * Copyright (c) 2012 Diamond Light Source Ltd.
 *
 * 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
 */

package org.dawb.workbench.ui.editors.preference;

import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import org.dawb.common.ui.widgets.LabelFieldEditor;
import org.dawb.workbench.ui.Activator;
import org.dawb.workbench.ui.data.PlotDataSelection;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

public class EditorPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

    public static final String ID = "org.edna.workbench.editors.preferencePage";

    private StringFieldEditor formatFieldEditor;

    private IPropertyChangeListener dataModeListener;

    /**
     * @wbp.parser.constructor
     */
    public EditorPreferencePage() {
        super(GRID);
        setPreferenceStore(Activator.getDefault().getPreferenceStore());
        setDescription("Preferences for viewing data sets available in nexus and ascii data.");
    }

    @Override
    protected void createFieldEditors() {

        // Choice between diamond and light weight plotting
        final String[][] namesAndValues = getPlottingPreferenceChoices();
        ComboFieldEditor plotChoice = new ComboFieldEditor(EditorConstants.PLOTTING_SYSTEM_CHOICE,
                "Plotting Technology*", namesAndValues, getFieldEditorParent());
        addField(plotChoice);
        new LabelFieldEditor("(* Please close and reopen the part after changing plotting preference.)\n\n",
                getFieldEditorParent());

        IConfigurationElement[] config = Platform.getExtensionRegistry()
                .getConfigurationElementsFor("uk.ac.diamond.scisoft.analysis.data.set.filter");

        if (config != null && config.length > 0) {
            final Label sep = new Label(getFieldEditorParent(), SWT.NONE);
            sep.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 1, 5));
            BooleanFieldEditor showAll = new BooleanFieldEditor(EditorConstants.IGNORE_DATASET_FILTERS,
                    "Show all possible data sets", getFieldEditorParent());
            addField(showAll);

            final StringBuilder buf = new StringBuilder("Current data set filters:\n");

            for (IConfigurationElement e : config) {
                buf.append("\t-    ");
                final String pattern = e.getAttribute("regularExpression");
                buf.append(pattern);
                buf.append("\n");
            }
            buf.append(
                    "\nData set filters reduce the content available to plot and\ncompare for simplicity but can be turned off.\nAll data is shown in the nexus tree, filters are not applied.");
            final Label label = new Label(getFieldEditorParent(), SWT.WRAP);
            label.setText(buf.toString());
            label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        }

        BooleanFieldEditor showXY = new BooleanFieldEditor(EditorConstants.SHOW_XY_COLUMN, "Show XY column.",
                getFieldEditorParent());
        addField(showXY);

        BooleanFieldEditor showSize = new BooleanFieldEditor(EditorConstants.SHOW_DATA_SIZE, "Show size column.",
                getFieldEditorParent());
        addField(showSize);

        BooleanFieldEditor showDims = new BooleanFieldEditor(EditorConstants.SHOW_DIMS, "Show dimensions column.",
                getFieldEditorParent());
        addField(showDims);

        BooleanFieldEditor showShape = new BooleanFieldEditor(EditorConstants.SHOW_SHAPE, "Show shape column.",
                getFieldEditorParent());
        addField(showShape);

        BooleanFieldEditor showVarName = new BooleanFieldEditor(EditorConstants.SHOW_VARNAME,
                "Show expression variable name.", getFieldEditorParent());
        addField(showVarName);

        BooleanFieldEditor showLocalName = new BooleanFieldEditor(EditorConstants.SHOW_LOCALNAME,
                "Use local name attribute.", getFieldEditorParent());
        addField(showLocalName);

        new LabelFieldEditor(
                "\nEditors with a 'Data' tab, show the data of the current plot.\nThis option sets the number format for the table and the csv file, if the data is exported.",
                getFieldEditorParent());

        formatFieldEditor = new StringFieldEditor(EditorConstants.DATA_FORMAT, "Number format:",
                getFieldEditorParent());
        addField(formatFieldEditor);

        new LabelFieldEditor("Examples: #0.0000, 0.###E0, ##0.#####E0, 00.###E0", getFieldEditorParent());

        new LabelFieldEditor("\n", getFieldEditorParent());

        IntegerFieldEditor playSpeed = new IntegerFieldEditor(EditorConstants.PLAY_SPEED,
                "Speed of slice play for n-Dimensional data sets (ms):", getFieldEditorParent()) {
            @Override
            protected boolean checkState() {
                if (!super.checkState())
                    return false;
                if (getIntValue() < 10 || getIntValue() > 10000)
                    return false;
                return true;
            }
        };
        addField(playSpeed);

        new LabelFieldEditor("\n", getFieldEditorParent());
        new LabelFieldEditor("\n", getFieldEditorParent());

        PlotDataSelection[] pds = PlotDataSelection.values();
        int nTypes = pds.length;
        String[][] pdsTypes = new String[nTypes][1];
        for (int i = 0; i < nTypes; i++) {
            String label = pds[i].getLabel();
            String name = pds[i].toString();
            pdsTypes[i] = new String[] { label, name };
        }

        OpenComboFieldEditor saveDataChoice = new OpenComboFieldEditor(EditorConstants.SAVE_SEL_DATA,
                "Automatically open dataset(s)", pdsTypes, getFieldEditorParent());
        addField(saveDataChoice);

        final StringFieldEditor datasetNameEditor = new StringFieldEditor(EditorConstants.DATA_SEL, "Data name(s)",
                getFieldEditorParent());
        addField(datasetNameEditor);
        datasetNameEditor.setEnabled(
                PlotDataSelection.isFixed(getPreferenceStore().getString(EditorConstants.SAVE_SEL_DATA)),
                getFieldEditorParent());

        BooleanFieldEditor saveLogFormat = new BooleanFieldEditor(EditorConstants.SAVE_LOG_FORMAT,
                "Save the last axis log format by file extension.", getFieldEditorParent());
        addField(saveLogFormat);
        BooleanFieldEditor saveTimeFormat = new BooleanFieldEditor(EditorConstants.SAVE_TIME_FORMAT,
                "Save the last axis time format by file extension.", getFieldEditorParent());
        addField(saveTimeFormat);
        BooleanFieldEditor saveFormatString = new BooleanFieldEditor(EditorConstants.SAVE_FORMAT_STRING,
                "Save the last axis format string by file extension.", getFieldEditorParent());
        addField(saveFormatString);

        dataModeListener = new IPropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent event) {

                final String propValue = getPreferenceStore().getString(EditorConstants.SAVE_SEL_DATA);
                updateMode(datasetNameEditor, PlotDataSelection.valueOf(propValue));
            }
        };
        getPreferenceStore().addPropertyChangeListener(dataModeListener);

        final Combo combo = saveDataChoice.getCombo(getFieldEditorParent());
        if (combo != null) {
            combo.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    PlotDataSelection sel = PlotDataSelection.values()[combo.getSelectionIndex()];
                    updateMode(datasetNameEditor, sel);
                }
            });
        }
    }

    protected void updateMode(StringFieldEditor datasetNameEditor, PlotDataSelection pds) {

        datasetNameEditor.setEnabled(pds.isFixed(), getFieldEditorParent());
        if (!pds.isActive()) {
            datasetNameEditor.setStringValue("");
        } else {
            datasetNameEditor.setStringValue(getPreferenceStore().getString(EditorConstants.DATA_SEL));
        }

    }

    public void dispose() {
        getPreferenceStore().removePropertyChangeListener(dataModeListener);
        super.dispose();
    }

    public static String[][] getPlottingPreferenceChoices() {

        final List<String[]> choices = new ArrayList<String[]>(7);
        IConfigurationElement[] systems = Platform.getExtensionRegistry()
                .getConfigurationElementsFor("org.eclipse.dawnsci.plotting.api.plottingClass");
        for (IConfigurationElement ia : systems) {
            choices.add(new String[] { ia.getAttribute("visible_type"), ia.getAttribute("id") });
        }

        final String[][] ret = new String[choices.size()][];
        for (int i = 0; i < choices.size(); i++) {
            ret[i] = choices.get(i);
        }
        return ret;
    }

    @Override
    public void init(IWorkbench workbench) {

    }

    /**
     * Adjust the layout of the field editors so that
     * they are properly aligned.
     */
    @Override
    protected void adjustGridLayout() {
        super.adjustGridLayout();
        ((GridLayout) getFieldEditorParent().getLayout()).numColumns = 1;
    }

    @Override
    protected void checkState() {
        super.checkState();

        try {
            DecimalFormat format = new DecimalFormat(formatFieldEditor.getStringValue());
            format.format(100.001);
        } catch (IllegalArgumentException ne) {
            setErrorMessage("The format '" + formatFieldEditor.getStringValue() + "' is not valid.");
            setValid(false);
            return;
        }

        setErrorMessage(null);
        setValid(true);

    }

    private class OpenComboFieldEditor extends ComboFieldEditor {

        public OpenComboFieldEditor(String name, String labelText, String[][] entryNamesAndValues,
                Composite parent) {
            super(name, labelText, entryNamesAndValues, parent);
        }

        public Combo getCombo(Composite parent) {
            try {
                final Method method = ComboFieldEditor.class.getDeclaredMethod("getComboBoxControl",
                        parent.getClass());
                try {
                    method.setAccessible(true);
                    return (Combo) method.invoke(this, parent);
                } finally {
                    method.setAccessible(false);
                }
            } catch (Exception ne) {
                ne.printStackTrace();
                return null;
            }
        }
    }
}