/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.ui.widgets.dialog; import org.eclipse.jdt.internal.ui.util.SWTUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; /** * Dialog Field containing a single button such as a radio or checkbox button. */ public class SelectionButtonDialogField extends DialogField { private Button fButton; private boolean fIsSelected; private DialogField[] fAttachedDialogFields; private int fButtonStyle; /** * Creates a selection button. Allowed button styles: SWT.RADIO, SWT.CHECK, SWT.TOGGLE, SWT.PUSH */ public SelectionButtonDialogField( int buttonStyle ) { super(); fIsSelected = false; fAttachedDialogFields = null; fButtonStyle = buttonStyle; } /** * Attaches a field to the selection state of the selection button. The attached field will be disabled if the selection * button is not selected. */ public void attachDialogField( DialogField dialogField ) { attachDialogFields( new DialogField[] { dialogField } ); } /** * Attaches fields to the selection state of the selection button. The attached fields will be disabled if the selection * button is not selected. */ public void attachDialogFields( DialogField[] dialogFields ) { fAttachedDialogFields = dialogFields; for( int i = 0; i < dialogFields.length; i++ ) { dialogFields[ i ].setEnabled( fIsSelected ); } } /** * Returns <code>true</code> is teh gived field is attached to the selection button. */ public boolean isAttached( DialogField editor ) { if( fAttachedDialogFields != null ) { for( int i = 0; i < fAttachedDialogFields.length; i++ ) { if( fAttachedDialogFields[ i ] == editor ) { return true; } } } return false; } // ------- layout helpers /* * @see DialogField#doFillIntoGrid */ public Control[] doFillIntoGrid( Composite parent, int nColumns ) { assertEnoughColumns( nColumns ); Button button = getSelectionButton( parent ); GridData gd = new GridData(); gd.horizontalSpan = nColumns; gd.horizontalAlignment = GridData.FILL; if( fButtonStyle == SWT.PUSH ) { gd.widthHint = SWTUtil.getButtonWidthHint( button ); } button.setLayoutData( gd ); return new Control[] { button }; } /* * @see DialogField#getNumberOfControls */ public int getNumberOfControls() { return 1; } // ------- ui creation /** * Returns the selection button widget. When called the first time, the widget will be created. * * @param group * The parent composite when called the first time, or <code>null</code> after. */ public Button getSelectionButton( Composite group ) { if( fButton == null ) { assertCompositeNotNull( group ); fButton = new Button( group, fButtonStyle ); fButton.setFont( group.getFont() ); fButton.setText( fLabelText ); fButton.setEnabled( isEnabled() ); fButton.setSelection( fIsSelected ); fButton.addSelectionListener( new SelectionListener() { public void widgetDefaultSelected( SelectionEvent e ) { doWidgetSelected( e ); } public void widgetSelected( SelectionEvent e ) { doWidgetSelected( e ); } } ); } return fButton; } private void doWidgetSelected( SelectionEvent e ) { if( isOkToUse( fButton ) ) { changeValue( fButton.getSelection() ); } } private void changeValue( boolean newState ) { if( fIsSelected != newState ) { fIsSelected = newState; if( fAttachedDialogFields != null ) { boolean focusSet = false; for( int i = 0; i < fAttachedDialogFields.length; i++ ) { fAttachedDialogFields[ i ].setEnabled( fIsSelected ); if( fIsSelected && !focusSet ) { focusSet = fAttachedDialogFields[ i ].setFocus(); } } } dialogFieldChanged(); } else if( fButtonStyle == SWT.PUSH ) { dialogFieldChanged(); } } /* * (non-Javadoc) * * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField#setLabelText(java.lang.String) */ public void setLabelText( String labeltext ) { fLabelText = labeltext; if( isOkToUse( fButton ) ) { fButton.setText( labeltext ); } } // ------ model access /** * Returns the selection state of the button. */ public boolean isSelected() { return fIsSelected; } /** * Sets the selection state of the button. */ public void setSelection( boolean selected ) { changeValue( selected ); if( isOkToUse( fButton ) ) { fButton.setSelection( selected ); } } // ------ enable / disable management /* * @see DialogField#updateEnableState */ protected void updateEnableState() { super.updateEnableState(); if( isOkToUse( fButton ) ) { fButton.setEnabled( isEnabled() ); } } /* * (non-Javadoc) * * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField#refresh() */ public void refresh() { super.refresh(); if( isOkToUse( fButton ) ) { fButton.setSelection( fIsSelected ); } } }