diff org.eclipse.jface/src/org/eclipse/jface/preference/RadioGroupFieldEditor.d @ 12:bc29606a740c

Added dwt-addons in original directory structure of eclipse.org
author Frank Benoit <benoit@tionex.de>
date Sat, 14 Mar 2009 18:23:29 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.eclipse.jface/src/org/eclipse/jface/preference/RadioGroupFieldEditor.d	Sat Mar 14 18:23:29 2009 +0100
@@ -0,0 +1,357 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module org.eclipse.jface.preference.RadioGroupFieldEditor;
+
+import org.eclipse.jface.preference.FieldEditor;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+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.Group;
+import org.eclipse.core.runtime.Assert;
+
+import java.lang.all;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A field editor for an enumeration type preference.
+ * The choices are presented as a list of radio buttons.
+ */
+public class RadioGroupFieldEditor : FieldEditor {
+
+    /**
+     * List of radio button entries of the form [label,value].
+     */
+    private String[][] labelsAndValues;
+
+    /**
+     * Number of columns into which to arrange the radio buttons.
+     */
+    private int numColumns;
+
+    /**
+     * Indent used for the first column of the radion button matrix.
+     */
+    private int indent = HORIZONTAL_GAP;
+
+    /**
+     * The current value, or <code>null</code> if none.
+     */
+    private String value;
+
+    /**
+     * The box of radio buttons, or <code>null</code> if none
+     * (before creation and after disposal).
+     */
+    private Composite radioBox;
+
+    /**
+     * The radio buttons, or <code>null</code> if none
+     * (before creation and after disposal).
+     */
+    private Button[] radioButtons;
+
+    /**
+     * Whether to use a Group control.
+     */
+    private bool useGroup;
+
+    /**
+     * Creates a new radio group field editor
+     */
+    protected this() {
+    }
+
+    /**
+     * Creates a radio group field editor.
+     * This constructor does not use a <code>Group</code> to contain the radio buttons.
+     * It is equivalent to using the following constructor with <code>false</code>
+     * for the <code>useGroup</code> argument.
+     * <p>
+     * Example usage:
+     * <pre>
+     *      RadioGroupFieldEditor editor= new RadioGroupFieldEditor(
+     *          "GeneralPage.DoubleClick", resName, 1,
+     *          new String[][] {
+     *              {"Open Browser", "open"},
+     *              {"Expand Tree", "expand"}
+     *          },
+     *          parent);
+     * </pre>
+     * </p>
+     *
+     * @param name the name of the preference this field editor works on
+     * @param labelText the label text of the field editor
+     * @param numColumns the number of columns for the radio button presentation
+     * @param labelAndValues list of radio button [label, value] entries;
+     *  the value is returned when the radio button is selected
+     * @param parent the parent of the field editor's control
+     */
+    public this(String name, String labelText, int numColumns,
+            String[][] labelAndValues, Composite parent) {
+        this(name, labelText, numColumns, labelAndValues, parent, false);
+    }
+
+    /**
+     * Creates a radio group field editor.
+     * <p>
+     * Example usage:
+     * <pre>
+     *      RadioGroupFieldEditor editor= new RadioGroupFieldEditor(
+     *          "GeneralPage.DoubleClick", resName, 1,
+     *          new String[][] {
+     *              {"Open Browser", "open"},
+     *              {"Expand Tree", "expand"}
+     *          },
+     *          parent,
+     *          true);
+     * </pre>
+     * </p>
+     *
+     * @param name the name of the preference this field editor works on
+     * @param labelText the label text of the field editor
+     * @param numColumns the number of columns for the radio button presentation
+     * @param labelAndValues list of radio button [label, value] entries;
+     *  the value is returned when the radio button is selected
+     * @param parent the parent of the field editor's control
+     * @param useGroup whether to use a Group control to contain the radio buttons
+     */
+    public this(String name, String labelText, int numColumns,
+            String[][] labelAndValues, Composite parent, bool useGroup) {
+        init(name, labelText);
+        Assert.isTrue(checkArray(labelAndValues));
+        this.labelsAndValues = labelAndValues;
+        this.numColumns = numColumns;
+        this.useGroup = useGroup;
+        createControl(parent);
+    }
+
+    /* (non-Javadoc)
+     * Method declared on FieldEditor.
+     */
+    protected override void adjustForNumColumns(int numColumns) {
+        Control control = getLabelControl();
+        if (control !is null) {
+            (cast(GridData) control.getLayoutData()).horizontalSpan = numColumns;
+        }
+        (cast(GridData) radioBox.getLayoutData()).horizontalSpan = numColumns;
+    }
+
+    /**
+     * Checks whether given <code>String[][]</code> is of "type"
+     * <code>String[][2]</code>.
+     * @param table
+     *
+     * @return <code>true</code> if it is ok, and <code>false</code> otherwise
+     */
+    private bool checkArray(String[][] table) {
+        if (table is null) {
+            return false;
+        }
+        for (int i = 0; i < table.length; i++) {
+            String[] array = table[i];
+            if (array is null || array.length !is 2) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /* (non-Javadoc)
+     * Method declared on FieldEditor.
+     */
+    protected override void doFillIntoGrid(Composite parent, int numColumns) {
+        if (useGroup) {
+            Control control = getRadioBoxControl(parent);
+            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+            control.setLayoutData(gd);
+        } else {
+            Control control = getLabelControl(parent);
+            GridData gd = new GridData();
+            gd.horizontalSpan = numColumns;
+            control.setLayoutData(gd);
+            control = getRadioBoxControl(parent);
+            gd = new GridData();
+            gd.horizontalSpan = numColumns;
+            gd.horizontalIndent = indent;
+            control.setLayoutData(gd);
+        }
+
+    }
+
+    /* (non-Javadoc)
+     * Method declared on FieldEditor.
+     */
+    protected override void doLoad() {
+        updateValue(getPreferenceStore().getString(getPreferenceName()));
+    }
+
+    /* (non-Javadoc)
+     * Method declared on FieldEditor.
+     */
+    protected override void doLoadDefault() {
+        updateValue(getPreferenceStore().getDefaultString(getPreferenceName()));
+    }
+
+    /* (non-Javadoc)
+     * Method declared on FieldEditor.
+     */
+    protected override void doStore() {
+        if (value is null) {
+            getPreferenceStore().setToDefault(getPreferenceName());
+            return;
+        }
+
+        getPreferenceStore().setValue(getPreferenceName(), value);
+    }
+
+    /* (non-Javadoc)
+     * Method declared on FieldEditor.
+     */
+    public override int getNumberOfControls() {
+        return 1;
+    }
+
+    /**
+     * Returns this field editor's radio group control.
+     * @param parent The parent to create the radioBox in
+     * @return the radio group control
+     */
+    public Composite getRadioBoxControl(Composite parent) {
+        if (radioBox is null) {
+
+            Font font = parent.getFont();
+
+            if (useGroup) {
+                Group group = new Group(parent, SWT.NONE);
+                group.setFont(font);
+                String text = getLabelText();
+                if (text !is null) {
+                    group.setText(text);
+                }
+                radioBox = group;
+                GridLayout layout = new GridLayout();
+                layout.horizontalSpacing = HORIZONTAL_GAP;
+                layout.numColumns = numColumns;
+                radioBox.setLayout(layout);
+            } else {
+                radioBox = new Composite(parent, SWT.NONE);
+                GridLayout layout = new GridLayout();
+                layout.marginWidth = 0;
+                layout.marginHeight = 0;
+                layout.horizontalSpacing = HORIZONTAL_GAP;
+                layout.numColumns = numColumns;
+                radioBox.setLayout(layout);
+                radioBox.setFont(font);
+            }
+
+            radioButtons = new Button[labelsAndValues.length];
+            for (int i = 0; i < labelsAndValues.length; i++) {
+                Button radio = new Button(radioBox, SWT.RADIO | SWT.LEFT);
+                radioButtons[i] = radio;
+                String[] labelAndValue = labelsAndValues[i];
+                radio.setText(labelAndValue[0]);
+                radio.setData(stringcast(labelAndValue[1]));
+                radio.setFont(font);
+                radio.addSelectionListener(new class SelectionAdapter {
+                    public void widgetSelected(SelectionEvent event) {
+                        String oldValue = value;
+                        value = stringcast( event.widget.getData() );
+                        setPresentsDefaultValue(false);
+                        fireValueChanged(VALUE, stringcast(oldValue), stringcast(value));
+                    }
+                });
+            }
+            radioBox.addDisposeListener(new class DisposeListener {
+                public void widgetDisposed(DisposeEvent event) {
+                    radioBox = null;
+                    radioButtons = null;
+                }
+            });
+        } else {
+            checkParent(radioBox, parent);
+        }
+        return radioBox;
+    }
+
+    /**
+     * Sets the indent used for the first column of the radion button matrix.
+     *
+     * @param indent the indent (in pixels)
+     */
+    public void setIndent(int indent) {
+        if (indent < 0) {
+            this.indent = 0;
+        } else {
+            this.indent = indent;
+        }
+    }
+
+    /**
+     * Select the radio button that conforms to the given value.
+     *
+     * @param selectedValue the selected value
+     */
+    private void updateValue(String selectedValue) {
+        this.value = selectedValue;
+        if (radioButtons is null) {
+            return;
+        }
+
+        if (this.value !is null) {
+            bool found = false;
+            for (int i = 0; i < radioButtons.length; i++) {
+                Button radio = radioButtons[i];
+                bool selection = false;
+                if (stringcast( radio.getData()).equals(this.value)) {
+                    selection = true;
+                    found = true;
+                }
+                radio.setSelection(selection);
+            }
+            if (found) {
+                return;
+            }
+        }
+
+        // We weren't able to find the value. So we select the first
+        // radio button as a default.
+        if (radioButtons.length > 0) {
+            radioButtons[0].setSelection(true);
+            this.value = stringcast( radioButtons[0].getData());
+        }
+        return;
+    }
+
+    /*
+     * @see FieldEditor.setEnabled(bool,Composite).
+     */
+    public override void setEnabled(bool enabled, Composite parent) {
+        if (!useGroup) {
+            super.setEnabled(enabled, parent);
+        }
+        for (int i = 0; i < radioButtons.length; i++) {
+            radioButtons[i].setEnabled(enabled);
+        }
+
+    }
+}