content: /*******************************************************************************
   * Copyright (c) 2000, 2007 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.wst.jsdt.internal.ui.wizards.dialogfields;
  
  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;
  import org.eclipse.wst.jsdt.internal.ui.util.SWTUtil;
  
  /**
   * 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.wst.jsdt.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.wst.jsdt.internal.ui.wizards.dialogfields.DialogField#refresh()
  	 */
  	public void refresh() {
  		super.refresh();
  		if (isOkToUse(fButton)) {
  			fButton.setSelection(fIsSelected);
  		}
  	}
  	
  		
  }
  