/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.dialogs;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ColorFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.FontFieldEditor;
import org.eclipse.jface.preference.PathEditor;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;

import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

public class EnableTestPreferencePage
	extends FieldEditorPreferencePage
	implements IWorkbenchPreferencePage {

	private BooleanFieldEditor be;
	private ColorFieldEditor ce;
	private FontFieldEditor fe;
	private PathEditor pe;
	private RadioGroupFieldEditor rg;
	private StringFieldEditor se;
	
	private Composite beParent;
	private Composite ceParent;
	private Composite feParent;
	private Composite peParent;
	private Composite rgParent;
	private Composite seParent;

	private boolean enabledState = true;

	public EnableTestPreferencePage() {
		super(GRID);
	}

	public void flipState() {
		if (enabledState)
			enabledState = false;
		else
			enabledState = true;

		be.setEnabled(enabledState, beParent);
		ce.setEnabled(enabledState, ceParent);
		fe.setEnabled(enabledState, feParent);
		pe.setEnabled(enabledState, peParent);
		rg.setEnabled(enabledState, rgParent);
		se.setEnabled(enabledState, seParent);

	}

	/**
	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
	 */
	protected void createFieldEditors() {

		String[][] labelsAndValues =
			new String[][] { { "Label 1", "Value 1" }, {
				"Label 2", "Value 2" }
		};

		beParent = getFieldEditorParent();
		be =
			new BooleanFieldEditor(
				"BooleanValue",
				"BooleanTest",
				beParent);
		addField(be);
		
		ceParent = getFieldEditorParent();
		ce =
			new ColorFieldEditor(
				"ColorValue",
				"Color Test",
				ceParent);
		addField(ce);
		
		feParent = getFieldEditorParent();
		fe =
			new FontFieldEditor(
				"FontValue",
				"Font Test",
				feParent);
		addField(fe);
		
		peParent = getFieldEditorParent();
		pe =
			new PathEditor(
				"PathValue",
				"Path Test",
				"C:\temp",
				peParent);
		addField(pe);
		
		rgParent = getFieldEditorParent();
		rg =
			new RadioGroupFieldEditor(
				"Radio Value",
				"Radio Test",
				2,
				labelsAndValues,
				rgParent);
		addField(rg);
		
		seParent = getFieldEditorParent();
		se =
			new StringFieldEditor(
				"String Value",
				"String Editor",
				seParent);
		addField(se);

	}

	/* (non-Javadoc)
	* Method declared on PreferencePage.
	*/
	protected Control createContents(Composite parent) {
		Composite composite = (Composite) super.createContents(parent);
		Button enabledButton = new Button(parent, SWT.PUSH);
		enabledButton.setText("Switch Enabled State");
	
		enabledButton.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				flipState();
			}

			public void widgetDefaultSelected(SelectionEvent e) {
				flipState();
			}
		});
		return composite;
	}

	/**
	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(IWorkbench)
	 */
	public void init(IWorkbench workbench) {
	}

}