/*******************************************************************************
 * Copyright (c) 2004, 2005 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.facesconfig.ui.wizard;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaConventions;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jst.jsf.facesconfig.common.dialogfield.ClassButtonDialogField;
import org.eclipse.jst.jsf.facesconfig.common.dialogfield.DialogField;
import org.eclipse.jst.jsf.facesconfig.common.dialogfield.IDialogFieldChangeListener;
import org.eclipse.jst.jsf.facesconfig.common.dialogfield.LayoutUtil;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
import org.eclipse.osgi.util.NLS;
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.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;

/**
 * This class used to select an existing java class or generate a new one.
 * However, the actural generated new java class is left to other pages.
 * 
 * @author Xiao-guang Zhang
 */
public class ManagedBeanClassSelectionPage extends WizardPage {
	private static final int HORIZONTAL_INDENT_DEFAULT = 25;

	/** the class name */
	private String className;

	/**
	 * Search Section, including radio button, label, text and browser button.
	 */
	private Button searchRadioButton;

	private ClassButtonDialogField classSearchDialogField;

	/** selected type */
	private IType searchedType;

	/** Generate radio button */
	private Button createRadioButton;

	private IProject currentProject;

	/**
	 * Constructor.
	 * 
	 * @param project
	 *            The project.
	 */
	public ManagedBeanClassSelectionPage(IProject project) {
		super("JavaSelectionWizardPage"); //$NON-NLS-1$

		currentProject = project;
		setTitle(WizardMessages.JavaSelectionWizardPage_Title);
		setDescription(WizardMessages.JavaSelectionWizardPage_Description);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
	 */
	public void createControl(Composite parent) {
		Composite container = new Composite(parent, SWT.NULL);
		GridLayout layout = new GridLayout();
		layout.marginWidth = 10;
		layout.marginHeight = 5;
		container.setLayout(layout);
		container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		final Group group = new Group(container, SWT.NONE);

		group.setLayout(new GridLayout());

		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		createSearchSection(group);
		createGenerateSection(group);

		setControl(container);
		Dialog.applyDialogFont(container);
		setPageComplete(classSearchDialogField.getText().length() > 0);
		EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
				container,
				WizardMessages.JavaSelectionWizardPage_HelpContextID);
	}

	/**
	 * enabled or disabled the search section including the labels and texts
	 * 
	 * @param enabled -
	 *            enabled or disabled the search section
	 */
	private void enableSearchSection(boolean enabled) {
		classSearchDialogField.setEnabled(enabled);
	}

	/**
	 * Create the search section including the labels, texts, and browser
	 * buttons
	 * 
	 * @param parent -
	 *            parent composite control
	 */
	private void createSearchSection(Composite parent) {
		searchRadioButton = new Button(parent, SWT.RADIO);
		// JavaSelectionWizardPage.Search = Using an existing Java class
		searchRadioButton
				.setText(WizardMessages.JavaSelectionWizardPage_Search);
		searchRadioButton.setSelection(true);
		searchRadioButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				createRadioButton.setSelection(!searchRadioButton
						.getSelection());
				enableSearchSection(searchRadioButton.getSelection());
				verifyComplete();
			}
		});

		Composite searchSection = new Composite(parent, SWT.NULL);

		classSearchDialogField = new ClassButtonDialogField(currentProject);
		classSearchDialogField.setHyperLink(null);
		int numberOfControls = classSearchDialogField.getNumberOfControls();

		GridLayout layout = new GridLayout();
		layout.numColumns = numberOfControls;
		layout.verticalSpacing = 9;
		searchSection.setLayout(layout);
		searchSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		classSearchDialogField.doFillIntoGrid(null, searchSection,
				numberOfControls);

		GridData gd = (GridData) classSearchDialogField.getLabelControl(null,
				searchSection).getLayoutData();
		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;

		// JavaSelectionWizardPage.Search.ClassName = Qulified class name:
		classSearchDialogField
				.setLabelText(WizardMessages.JavaSelectionWizardPage_Search_ClassName);

		LayoutUtil.setHorizontalGrabbing(classSearchDialogField.getTextControl(
				null, searchSection));

		classSearchDialogField
				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
					public void dialogFieldChanged(DialogField field) {
						className = classSearchDialogField.getText();
						verifyComplete();
					}

				});

		Label searchDesp = new Label(searchSection, SWT.NONE);
		searchDesp
				.setText(WizardMessages.JavaSelectionWizardPage_Search_Description);

		gd = new GridData();
		gd.horizontalSpan = numberOfControls;
		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
		searchDesp.setLayoutData(gd);
	}

	/**
	 * Create the generation section including the labels, texts, and browser
	 * buttons
	 * 
	 * @param parent -
	 *            parent composite control
	 */
	private void createGenerateSection(Composite parent) {
		createRadioButton = new Button(parent, SWT.RADIO);
		createRadioButton
				.setText(WizardMessages.JavaSelectionWizardPage_Create);
		createRadioButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				searchRadioButton.setSelection(!createRadioButton
						.getSelection());
				enableSearchSection(!createRadioButton.getSelection());
				verifyComplete();
			}
		});

		Composite createSection = new Composite(parent, SWT.NULL);
		GridLayout layout = new GridLayout();
		layout.numColumns = 3;
		layout.verticalSpacing = 9;
		createSection.setLayout(layout);
		createSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		Label createDesp = new Label(createSection, SWT.NONE);
		createDesp
				.setText(WizardMessages.JavaSelectionWizardPage_Create_Description);

		GridData gd = new GridData();
		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
		createDesp.setLayoutData(gd);
	}

	/**
	 * create a new java class or not
	 * 
	 * @return
	 */
	public boolean isCreateNewJavaClass() {
		return createRadioButton.getSelection();
	}

	/**
	 * get the selected java type
	 * 
	 * @return - type
	 */
	public IType getSelectedType() {
		searchedType = JavaClassUtils.getType(currentProject,
				classSearchDialogField.getText());

		return searchedType;
	}

	public String getClassName() {
		return className;
	}

	/**
	 * validate the selected or input java type name
	 * 
	 * @return
	 */
	private IStatus validateJavaTypeName() {
		IStatus status = null;
		if (classSearchDialogField.getText().length() == 0) {
			status = new Status(
					IStatus.ERROR,
					EditorPlugin.getPluginId(),
					-1,
					NLS
							.bind(
									WizardMessages.JavaSelectionWizardPage_Error_ClassIsEmpty,
									classSearchDialogField.getText()), null);
		} else {
			// ensure the name follows the java conventsions.
			status = JavaConventions
					.validateJavaTypeName(classSearchDialogField.getText());
			if (status.getSeverity() != IStatus.ERROR) {
				// ensure the input or selected type is defined in the current
				// project
				if (getSelectedType() == null) {
					status = new Status(
							IStatus.ERROR,
							EditorPlugin.getPluginId(),
							-1,
							NLS
									.bind(
											WizardMessages.JavaSelectionWizardPage_Error_ClassIsNotDefined,
											classSearchDialogField.getText()),
							null);
				}
			}
		}
		return status;
	}

	/**
	 * verify and update the complete status
	 */
	private void verifyComplete() {
		IStatus status = null;

		if (isCreateNewJavaClass()) {
			setPageComplete(true);
			setMessage(null);
			setErrorMessage(null);
		} else {
			if (searchRadioButton.getSelection()) {
				status = validateJavaTypeName();
			}
			String errorMessage = null;
			setPageComplete(status.getSeverity() != IStatus.ERROR);

			if (status.getSeverity() == IStatus.ERROR) {
				errorMessage = status.getMessage();
			}

			if (errorMessage != null) {
				setErrorMessage(errorMessage);
			} else {
				setErrorMessage(null);
			}

			if (status.getSeverity() != IStatus.OK) {
				setMessage(status.getMessage());
			} else {
				setMessage(null);
			}
		}
	}

}
