/*******************************************************************************
 * Copyright (c) 2006 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.common.ui.internal.dialogfield;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;

/**
 * @author mengbo
 */
public class JavaClassWizard extends Wizard {
	private static String STORE_SECTION = "JavaClassWizard"; //$NON-NLS-1$

	private JavaClassWizardPage _mainPage;

	private String _className, _classArgs;

	private IProject _project;

	private String _superClass;

	private List _interfaceList;

	private boolean _autoOpenResource = true;

	public void setAutoOpenResource(boolean autoOpenResource) {
		_autoOpenResource = autoOpenResource;
	}

	public JavaClassWizard(IProject project, String className) {
		this(project, className, null, null);
	}

	public JavaClassWizard(IProject project, String className,
			String superClass, List superInterfaces) {
		this._project = project;
		this._className = className;
		this._superClass = superClass;
		this._interfaceList = superInterfaces;
		IDialogSettings masterSettings = JSFUICommonPlugin.getDefault()
				.getDialogSettings();
		setDialogSettings(getSettingsSection(masterSettings));
		setWindowTitle(JSFUICommonPlugin
				.getResourceString("DialogField.JavaClassWizard.NewClass"));//$NON-NLS-1$
		setNeedsProgressMonitor(true);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.wizard.IWizard#addPages()
	 */
	public void addPages() {
		_mainPage = new JavaClassWizardPage(_project, _className, _superClass,
				_interfaceList);
		addPage(_mainPage);
		_mainPage.init();
	}

	private IDialogSettings getSettingsSection(IDialogSettings master) {
		IDialogSettings setting = master.getSection(STORE_SECTION);
		if (setting == null) {
			setting = master.addNewSection(STORE_SECTION);
		}
		return setting;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
	 */
	public boolean performFinish() {
		if (_mainPage.getPackageText() != null
				&& _mainPage.getPackageText().length() > 0) {
			StringBuffer buffer = new StringBuffer(_mainPage.getPackageText());
			buffer.append(".");//$NON-NLS-1$
			buffer.append(_mainPage.getTypeName());
			_className = buffer.toString();
		} else {
			_className = _mainPage.getTypeName();
		}
		_classArgs = _mainPage.getClassArgs();
		IRunnableWithProgress op = new WorkspaceModifyOperation() {
			protected void execute(IProgressMonitor monitor)
					throws CoreException, InvocationTargetException,
					InterruptedException {
				_mainPage.createType(monitor);
				IResource resource = _mainPage.getModifiedResource();
				if (resource != null && _autoOpenResource) {
					selectAndReveal(resource);
					if (_project.hasNature(JavaCore.NATURE_ID)) {
						IJavaProject jProject = JavaCore.create(_project);
						IJavaElement jElement = jProject.findElement(resource
								.getProjectRelativePath()
								.removeFirstSegments(1));
						if (jElement != null) {
							JavaUI.openInEditor(jElement);
						}
					} else if (resource instanceof IFile) {
						IWorkbenchPage page = PlatformUI.getWorkbench()
								.getActiveWorkbenchWindow().getActivePage();
						IDE.openEditor(page, (IFile) resource, true);
					}
				}
			}

		};
		try {
			getContainer().run(false, true, op);
		} catch (InvocationTargetException e) {
			e.printStackTrace(); // PDEPlugin.logException(e);
		} catch (InterruptedException e) {
			e.printStackTrace();// PDEPlugin.logException(e);
		}
		return true;
	}

	protected void selectAndReveal(IResource newResource) {
		BasicNewResourceWizard.selectAndReveal(newResource,
				getWorkbenchWindow());
	}

	private IWorkbenchWindow getWorkbenchWindow() {
		return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
	}

	protected ISchedulingRule getSchedulingRule() {
		return _mainPage.getModifiedResource();
	}

	public String getClassName() {
		return _className;
	}

	public String getClassNameWithArgs() {
		if (_classArgs != null && _classArgs.length() > 0) {
			StringBuffer buffer = new StringBuffer(_className);
			buffer.append(":");//$NON-NLS-1$
			buffer.append(_classArgs);
			return buffer.toString();
		}
		return getClassName();
	}
}
