All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.jface.preference.RadioGroupFieldEditor Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2015 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.eclipse.jface.preference;

import org.eclipse.core.runtime.Assert;
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.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;

/**
 * A field editor for an enumeration type preference.
 * The choices are presented as a list of radio buttons.
 */
public class RadioGroupFieldEditor extends 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 null if none.
     */
    private String value;

    /**
     * The box of radio buttons, or null if none
     * (before creation and after disposal).
     */
    private Composite radioBox;

    /**
     * The radio buttons, or null if none
     * (before creation and after disposal).
     */
    private Button[] radioButtons;

    /**
     * Whether to use a Group control.
     */
    private boolean useGroup;

    /**
     * Creates a new radio group field editor
     */
    protected RadioGroupFieldEditor() {
    }

    /**
     * Creates a radio group field editor.
     * This constructor does not use a Group to contain the radio buttons.
     * It is equivalent to using the following constructor with false
     * for the useGroup argument.
     * 

* Example usage: *

     *		RadioGroupFieldEditor editor= new RadioGroupFieldEditor(
     *			"GeneralPage.DoubleClick", resName, 1,
     *			new String[][] {
     *				{"Open Browser", "open"},
     *				{"Expand Tree", "expand"}
     *			},
     *          parent);
     * 
*

* * @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 RadioGroupFieldEditor(String name, String labelText, int numColumns, String[][] labelAndValues, Composite parent) { this(name, labelText, numColumns, labelAndValues, parent, false); } /** * Creates a radio group field editor. *

* Example usage: *

     *		RadioGroupFieldEditor editor= new RadioGroupFieldEditor(
     *			"GeneralPage.DoubleClick", resName, 1,
     *			new String[][] {
     *				{"Open Browser", "open"},
     *				{"Expand Tree", "expand"}
     *			},
     *          parent,
     *          true);
     * 
*

* * @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 RadioGroupFieldEditor(String name, String labelText, int numColumns, String[][] labelAndValues, Composite parent, boolean useGroup) { init(name, labelText); Assert.isTrue(checkArray(labelAndValues)); this.labelsAndValues = labelAndValues; this.numColumns = numColumns; this.useGroup = useGroup; createControl(parent); } @Override protected void adjustForNumColumns(int numColumns) { Control control = getLabelControl(); if (control != null) { ((GridData) control.getLayoutData()).horizontalSpan = numColumns; } ((GridData) radioBox.getLayoutData()).horizontalSpan = numColumns; } /** * Checks whether given String[][] is of "type" * String[][2]. * @param table * * @return true if it is ok, and false otherwise */ private boolean checkArray(String[][] table) { if (table == null) { return false; } for (int i = 0; i < table.length; i++) { String[] array = table[i]; if (array == null || array.length != 2) { return false; } } return true; } @Override protected 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); } } @Override protected void doLoad() { updateValue(getPreferenceStore().getString(getPreferenceName())); } @Override protected void doLoadDefault() { updateValue(getPreferenceStore().getDefaultString(getPreferenceName())); } @Override protected void doStore() { if (value == null) { getPreferenceStore().setToDefault(getPreferenceName()); return; } getPreferenceStore().setValue(getPreferenceName(), value); } @Override public 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 == null) { Font font = parent.getFont(); if (useGroup) { Group group = new Group(parent, SWT.NONE); group.setFont(font); String text = getLabelText(); if (text != 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(labelAndValue[1]); radio.setFont(font); radio.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { String oldValue = value; value = (String) event.widget.getData(); setPresentsDefaultValue(false); fireValueChanged(VALUE, oldValue, value); } }); } radioBox.addDisposeListener(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 == null) { return; } if (this.value != null) { boolean found = false; for (int i = 0; i < radioButtons.length; i++) { Button radio = radioButtons[i]; boolean selection = false; if (((String) 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 = (String) radioButtons[0].getData(); } return; } /* * @see FieldEditor.setEnabled(boolean,Composite). */ @Override public void setEnabled(boolean enabled, Composite parent) { if (!useGroup) { super.setEnabled(enabled, parent); } for (int i = 0; i < radioButtons.length; i++) { radioButtons[i].setEnabled(enabled); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy