| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsf.common.ui.internal.dialogfield; |
| |
| 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.RowLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| |
| /** |
| * This will display a labal and a group of radio buttons. The group of radio |
| * buttons will be layed out horizontally use a RowLayout, and them as a group |
| * will use one cell in the GridLayout. |
| * |
| * Whenever the radios selection change will fire both dialogFieldChanged() and |
| * dialogFieldApplied() event. |
| * |
| * @author mengbo |
| */ |
| public class RadiosDialogField extends DialogFieldBase { |
| final static private String INDEXKEY = "INDEX"; //$NON-NLS-1$ |
| |
| private Composite _group; |
| |
| private String[] _items; |
| |
| private Button[] _button; |
| |
| private int _selectIndex = -1; |
| |
| private boolean _fireEvent = true; |
| |
| /** |
| * Default constructor |
| */ |
| public RadiosDialogField() { |
| super(); |
| } |
| |
| /** |
| * this method must be called before create control |
| * |
| * @param items |
| */ |
| public void setItems(String[] items) { |
| _items = items; |
| _button = new Button[_items.length]; |
| } |
| |
| // ------- layout helpers |
| |
| /* |
| * @see DialogField#doFillIntoGrid |
| */ |
| public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent, |
| int nColumns) { |
| assertEnoughColumns(nColumns); |
| |
| Control requiredLabel = getRequiredLabelControl(toolkit, parent); |
| requiredLabel.setLayoutData(gridDataForLabel(1)); |
| |
| Control label = getLabelControl(toolkit, parent); |
| label.setLayoutData(gridDataForLabel(1)); |
| |
| _group = getGroup(toolkit, parent); |
| _group.setLayoutData(gridDataForGroup(nColumns - 2)); |
| |
| return new Control[] { requiredLabel, label, _group }; |
| } |
| |
| /* |
| * @see DialogField#getNumberOfControls |
| */ |
| public int getNumberOfControls() { |
| return 3; |
| } |
| |
| /** |
| * @param span |
| * @return the grid data |
| */ |
| protected static GridData gridDataForGroup(int span) { |
| GridData gd = new GridData(); |
| gd.horizontalAlignment = GridData.FILL; |
| gd.grabExcessHorizontalSpace = false; |
| gd.horizontalSpan = span; |
| return gd; |
| } |
| |
| // ------- focus methods |
| |
| /* |
| * @see DialogField#setFocus |
| */ |
| public boolean setFocus() { |
| if (isOkToUse(_group)) { |
| _group.setFocus(); |
| } |
| return true; |
| } |
| |
| // ------- ui creation |
| |
| /** |
| * @param toolkit |
| * @param parent |
| * @return the group composite |
| */ |
| public Composite getGroup(FormToolkit toolkit, Composite parent) { |
| if (_group == null || _group.isDisposed()) { |
| assertCompositeNotNull(parent); |
| if (toolkit != null) { |
| _group = toolkit.createComposite(parent); |
| } else { |
| _group = new Composite(parent, SWT.NONE); |
| } |
| RowLayout layout = new RowLayout(); |
| layout.marginBottom = 0; |
| _group.setLayout(layout); |
| for (int i = 0; i < _items.length; i++) { |
| if (toolkit != null) { |
| _button[i] = toolkit.createButton(_group, _items[i], |
| SWT.RADIO); |
| } else { |
| _button[i] = new Button(_group, SWT.RADIO); |
| _button[i].setText(_items[i]); |
| } |
| _button[i].setData(INDEXKEY, new Integer(i)); |
| _button[i].addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| if (_fireEvent) { |
| _selectIndex = ((Integer) e.widget |
| .getData(INDEXKEY)).intValue(); |
| // FIXME: seemed will fire widgetSelected twice, one |
| // for the deselect one, |
| // one for the newly selected one. Need investigate. |
| if (((Button) e.widget).getSelection()) { |
| dialogFieldChangedAndApplied(); |
| } |
| } |
| } |
| |
| }); |
| } |
| } |
| return _group; |
| } |
| |
| // ------ enable / disable management |
| |
| /* |
| * @see DialogField#updateEnableState |
| */ |
| protected void updateEnableState() { |
| super.updateEnableState(); |
| if (isOkToUse(_group)) { |
| _group.setEnabled(isEnabled()); |
| } |
| } |
| |
| // ------ text access |
| |
| /** |
| * Sets the text. Triggers a dialog-changed event. |
| * @param index |
| */ |
| public void setSelectedIndex(int index) { |
| _selectIndex = index; |
| if (isOkToUse(_group)) { |
| if (_selectIndex >= 0 && _selectIndex < _items.length) { |
| _button[_selectIndex].setSelection(true); |
| } else { |
| for (int i = 0; i < _items.length; i++) { |
| if (_button[i].getSelection()) { |
| _button[i].setSelection(false); |
| } |
| } |
| } |
| } |
| dialogFieldChangedAndApplied(); |
| } |
| |
| /** |
| * Sets the text without triggering a dialog-changed event. |
| * @param index |
| */ |
| public void setSelectedIndexWithoutUpdate(int index) { |
| _selectIndex = index; |
| if (isOkToUse(_group)) { |
| _fireEvent = false; |
| if (_selectIndex >= 0 && _selectIndex < _items.length) { |
| _button[_selectIndex].setSelection(true); |
| } else { |
| for (int i = 0; i < _items.length; i++) { |
| if (_button[i].getSelection()) { |
| _button[i].setSelection(false); |
| } |
| } |
| } |
| _fireEvent = true; |
| } |
| } |
| |
| /** |
| * @return the index selected |
| */ |
| public int getSelectedIndex() { |
| return _selectIndex; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal() |
| */ |
| public void handleGrabHorizontal() { |
| LayoutUtil.setGrabHorizontal(this._group, true); |
| } |
| } |