/*******************************************************************************
 * 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 net.sourceforge.phpdt.ui.wizards;

import net.sourceforge.phpdt.core.IJavaElement;
import net.sourceforge.phpdt.internal.ui.wizards.NewWizardMessages;
import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.DialogField;
import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.LayoutUtil;
import net.sourceforge.phpdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFieldGroup;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Wizard page to create a new class.
 * <p>
 * Note: This class is not intended to be subclassed. To implement a different
 * kind of a new class wizard page, extend <code>NewTypeWizardPage</code>.
 * </p>
 * 
 * @since 2.0
 */
public class NewClassWizardPage extends NewTypeWizardPage {

	private final static String PAGE_NAME = "NewClassWizardPage"; //$NON-NLS-1$

	private final static String SETTINGS_CREATEMAIN = "create_main"; //$NON-NLS-1$

	private final static String SETTINGS_CREATECONSTR = "create_constructor"; //$NON-NLS-1$

	private final static String SETTINGS_CREATEUNIMPLEMENTED = "create_unimplemented"; //$NON-NLS-1$

	private SelectionButtonDialogFieldGroup fMethodStubsButtons;

	/**
	 * Creates a new <code>NewClassWizardPage</code>
	 */
	public NewClassWizardPage() {
		super(true, PAGE_NAME);

		setTitle(NewWizardMessages.getString("NewClassWizardPage.title")); //$NON-NLS-1$
		setDescription(NewWizardMessages
				.getString("NewClassWizardPage.description")); //$NON-NLS-1$

		String[] buttonNames3 = new String[] {
				NewWizardMessages.getString("NewClassWizardPage.methods.main"), NewWizardMessages.getString("NewClassWizardPage.methods.constructors"), //$NON-NLS-1$ //$NON-NLS-2$
				NewWizardMessages
						.getString("NewClassWizardPage.methods.inherited") //$NON-NLS-1$
		};
		fMethodStubsButtons = new SelectionButtonDialogFieldGroup(SWT.CHECK,
				buttonNames3, 1);
		fMethodStubsButtons.setLabelText(NewWizardMessages
				.getString("NewClassWizardPage.methods.label")); //$NON-NLS-1$
	}

	// -------- Initialization ---------

	/**
	 * The wizard owning this page is responsible for calling this method with
	 * the current selection. The selection is used to initialize the fields of
	 * the wizard page.
	 * 
	 * @param selection
	 *            used to initialize the fields
	 */
	public void init(IStructuredSelection selection) {
		IJavaElement jelem = getInitialJavaElement(selection);
		initContainerPage(jelem);
		initTypePage(jelem);
		doStatusUpdate();

		boolean createMain = false;
		boolean createConstructors = false;
		boolean createUnimplemented = true;
		IDialogSettings section = getDialogSettings().getSection(PAGE_NAME);
		if (section != null) {
			createMain = section.getBoolean(SETTINGS_CREATEMAIN);
			createConstructors = section.getBoolean(SETTINGS_CREATECONSTR);
			createUnimplemented = section
					.getBoolean(SETTINGS_CREATEUNIMPLEMENTED);
		}

		setMethodStubSelection(createMain, createConstructors,
				createUnimplemented, true);
	}

	// ------ validation --------
	private void doStatusUpdate() {
		// status of all used components
		IStatus[] status = new IStatus[] {
				fContainerStatus,
				isEnclosingTypeSelected() ? fEnclosingTypeStatus
						: fPackageStatus, fTypeNameStatus, fModifierStatus,
		// fSuperClassStatus,
		// fSuperInterfacesStatus
		};

		// the mode severe status will be displayed and the ok button
		// enabled/disabled.
		updateStatus(status);
	}

	/*
	 * @see NewContainerWizardPage#handleFieldChanged
	 */
	protected void handleFieldChanged(String fieldName) {
		super.handleFieldChanged(fieldName);

		doStatusUpdate();
	}

	// ------ ui --------

	/*
	 * @see WizardPage#createControl
	 */
	public void createControl(Composite parent) {
		initializeDialogUnits(parent);

		Composite composite = new Composite(parent, SWT.NONE);

		int nColumns = 4;

		GridLayout layout = new GridLayout();
		layout.numColumns = nColumns;
		composite.setLayout(layout);

		// pick & choose the wanted UI components

		createContainerControls(composite, nColumns);
		createPackageControls(composite, nColumns);
		createEnclosingTypeControls(composite, nColumns);

		createSeparator(composite, nColumns);

		createTypeNameControls(composite, nColumns);
		createModifierControls(composite, nColumns);

		createSuperClassControls(composite, nColumns);
		createSuperInterfacesControls(composite, nColumns);

		createMethodStubSelectionControls(composite, nColumns);

		setControl(composite);

		Dialog.applyDialogFont(composite);
		// WorkbenchHelp.setHelp(composite,
		// IJavaHelpContextIds.NEW_CLASS_WIZARD_PAGE);
	}

	/*
	 * @see WizardPage#becomesVisible
	 */
	public void setVisible(boolean visible) {
		super.setVisible(visible);
		if (visible) {
			setFocus();
		}
	}

	private void createMethodStubSelectionControls(Composite composite,
			int nColumns) {
		Control labelControl = fMethodStubsButtons.getLabelControl(composite);
		LayoutUtil.setHorizontalSpan(labelControl, nColumns);

		DialogField.createEmptySpace(composite);

		Control buttonGroup = fMethodStubsButtons
				.getSelectionButtonsGroup(composite);
		LayoutUtil.setHorizontalSpan(buttonGroup, nColumns - 1);
	}

	/**
	 * Returns the current selection state of the 'Create Main' checkbox.
	 * 
	 * @return the selection state of the 'Create Main' checkbox
	 */
	public boolean isCreateMain() {
		return fMethodStubsButtons.isSelected(0);
	}

	/**
	 * Returns the current selection state of the 'Create Constructors'
	 * checkbox.
	 * 
	 * @return the selection state of the 'Create Constructors' checkbox
	 */
	public boolean isCreateConstructors() {
		return fMethodStubsButtons.isSelected(1);
	}

	/**
	 * Returns the current selection state of the 'Create inherited abstract
	 * methods' checkbox.
	 * 
	 * @return the selection state of the 'Create inherited abstract methods'
	 *         checkbox
	 */
	public boolean isCreateInherited() {
		return fMethodStubsButtons.isSelected(2);
	}

	/**
	 * Sets the selection state of the method stub checkboxes.
	 * 
	 * @param createMain
	 *            initial selection state of the 'Create Main' checkbox.
	 * @param createConstructors
	 *            initial selection state of the 'Create Constructors' checkbox.
	 * @param createInherited
	 *            initial selection state of the 'Create inherited abstract
	 *            methods' checkbox.
	 * @param canBeModified
	 *            if <code>true</code> the method stub checkboxes can be
	 *            changed by the user. If <code>false</code> the buttons are
	 *            "read-only"
	 */
	public void setMethodStubSelection(boolean createMain,
			boolean createConstructors, boolean createInherited,
			boolean canBeModified) {
		fMethodStubsButtons.setSelection(0, createMain);
		fMethodStubsButtons.setSelection(1, createConstructors);
		fMethodStubsButtons.setSelection(2, createInherited);

		fMethodStubsButtons.setEnabled(canBeModified);
	}

	// ---- creation ----------------

	/*
	 * @see NewTypeWizardPage#createTypeMembers
	 */
	// protected void createTypeMembers(IType type, ImportsManager imports,
	// IProgressMonitor monitor) throws CoreException {
	// boolean doMain= isCreateMain();
	// boolean doConstr= isCreateConstructors();
	// boolean doInherited= isCreateInherited();
	// createInheritedMethods(type, doConstr, doInherited, imports, new
	// SubProgressMonitor(monitor, 1));
	//
	// if (doMain) {
	// StringBuffer buf= new StringBuffer();
	// buf.append("public static void main("); //$NON-NLS-1$
	// buf.append(imports.addImport("java.lang.String")); //$NON-NLS-1$
	// buf.append("[] args) {}"); //$NON-NLS-1$
	// type.createMethod(buf.toString(), null, false, null);
	// }
	//		
	// IDialogSettings section= getDialogSettings().getSection(PAGE_NAME);
	// if (section == null) {
	// section= getDialogSettings().addNewSection(PAGE_NAME);
	// }
	// section.put(SETTINGS_CREATEMAIN, doMain);
	// section.put(SETTINGS_CREATECONSTR, doConstr);
	// section.put(SETTINGS_CREATEUNIMPLEMENTED, doInherited);
	//		
	// if (monitor != null) {
	// monitor.done();
	// }
	// }
}