org.eclipse.buckminster.ui.prefs.EnumFieldEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buckminster.ui.prefs.EnumFieldEditor.java

Source

/*****************************************************************************
 * Copyright (c) 2006-2013, Cloudsmith Inc.
 * The code, documentation and other materials contained herein have been
 * licensed under the Eclipse Public License - v 1.0 by the copyright holder
 * listed above, as the Initial Contributor under such license. The text of
 * such license is available at www.eclipse.org.
 *****************************************************************************/

package org.eclipse.buckminster.ui.prefs;

import org.eclipse.jface.preference.FieldEditor;
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.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Editor used for <code>enum</code> type values. The stored preference is the
 * ordinal of the enum. A {@link Combo} is used for displaying and changing the
 * value. The displayed values are obtained by calling the
 * {@link Enum#toString()} in the respective <code>enum</code> values.
 * 
 * @author Thomas Hallgren
 */
public class EnumFieldEditor extends FieldEditor {
    private Combo combo;

    private Enum<?> value;

    private final Enum<?>[] enumValues;

    public EnumFieldEditor(String name, String labelText, Enum<?>[] enumValues, Composite parent) {
        this.enumValues = enumValues;
        init(name, labelText);
        createControl(parent);
    }

    public Combo getControl(Composite parent) {
        if (combo == null) {
            combo = new Combo(parent, SWT.READ_ONLY);
            int top = enumValues.length;
            for (int idx = 0; idx < top; ++idx)
                combo.add(enumValues[idx].toString(), idx);
            combo.setFont(parent.getFont());
            combo.addSelectionListener(new SelectionAdapter() {
                @Override
                public void widgetSelected(SelectionEvent evt) {
                    Enum<?> oldValue = value;
                    value = getValueForName(combo.getText());
                    setPresentsDefaultValue(false);
                    fireValueChanged(VALUE, oldValue, value);
                }
            });
        }
        return combo;
    }

    @Override
    public int getNumberOfControls() {
        return 2;
    }

    @Override
    protected void adjustForNumColumns(int numColumns) {
        Control control = getLabelControl();
        if (control != null) {
            ((GridData) control.getLayoutData()).horizontalSpan = numColumns - 1;
            numColumns = 1;
        }
        ((GridData) combo.getLayoutData()).horizontalSpan = numColumns;
    }

    @Override
    protected void doFillIntoGrid(Composite parent, int numColumns) {
        Control control = getLabelControl(parent);
        GridData gd = new GridData();
        gd.horizontalSpan = numColumns;
        control.setLayoutData(gd);
        control = getControl(parent);
        gd = new GridData();
        gd.horizontalSpan = numColumns;
        control.setLayoutData(gd);
    }

    @Override
    protected void doLoad() {
        updateComboForValue(getPreferenceStore().getInt(getPreferenceName()));
    }

    @Override
    protected void doLoadDefault() {
        updateComboForValue(getPreferenceStore().getDefaultInt(getPreferenceName()));
    }

    @Override
    protected void doStore() {
        if (value == null) {
            getPreferenceStore().setToDefault(getPreferenceName());
            return;
        }

        getPreferenceStore().setValue(getPreferenceName(), value.ordinal());
    }

    protected Enum<?> getValueForName(String name) {
        int idx = enumValues.length;
        while (--idx >= 0) {
            Enum<?> enumValue = enumValues[idx];
            if (enumValue.toString().equals(name))
                return enumValue;
        }
        return null;
    }

    /*
     * Set the name in the combo widget to match the specified value.
     */
    protected void updateComboForValue(int ordinal) {
        int max = enumValues.length;
        if (ordinal < 0 || ordinal >= max) {
            // Out of range. Use first value
            //
            if (enumValues.length == 0)
                return;
            value = enumValues[0];
        } else
            value = enumValues[ordinal];
        combo.setText(value.toString());
    }
}