/*******************************************************************************
 * Copyright (c) 2000, 2005 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
 *     Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font
 *     should be activated and used by other components.
 *******************************************************************************/
package org.eclipse.ui.dialogs;

import java.util.ArrayList;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter;

/**
 * The ProjectLocationSelectionDialog is the dialog used to select the name and
 * location of a project for copying.
 */
public class ProjectLocationSelectionDialog extends SelectionStatusDialog {
	// widgets
	private Text projectNameField;

	private IProject project;

	private ProjectContentsLocationArea locationArea;

	private static String PROJECT_NAME_LABEL = IDEWorkbenchMessages.ProjectLocationSelectionDialog_nameLabel;

	private static String PROJECT_LOCATION_SELECTION_TITLE = IDEWorkbenchMessages.ProjectLocationSelectionDialog_selectionTitle;

	// constants
	private static final int SIZING_TEXT_FIELD_WIDTH = 250;

	private boolean firstLocationCheck;

	/**
	 * Create a ProjectLocationSelectionDialog on the supplied project parented
	 * by the parentShell.
	 * 
	 * @param parentShell
	 * @param existingProject
	 */
	public ProjectLocationSelectionDialog(Shell parentShell,
			IProject existingProject) {
		super(parentShell);
		setShellStyle(getShellStyle() | SWT.RESIZE);
		setTitle(PROJECT_LOCATION_SELECTION_TITLE);
		setStatusLineAboveButtons(true);
		this.project = existingProject;
	}

	/**
	 * Check the message. If it is null then continue otherwise inform the user
	 * via the status value and disable the OK.
	 * 
	 * @param errorMsg
	 *            the error message to show if it is not <code>null</code>
	 */
	private void applyValidationResult(String errorMsg) {
		int code;
		boolean allowFinish = false;

		if (errorMsg == null) {
			code = IStatus.OK;
			errorMsg = ""; //$NON-NLS-1$
			allowFinish = true;
		} else if (firstLocationCheck)
			code = IStatus.OK;
		else
			code = IStatus.ERROR;

		updateStatus(new Status(code, IDEWorkbenchPlugin.IDE_WORKBENCH, code,
				errorMsg, null));
		getOkButton().setEnabled(allowFinish);
	}

	/**
	 * Check whether the entries are valid. If so return null. Otherwise return
	 * a string that indicates the problem.
	 */
	private String checkValid() {
		String valid = checkValidName();
		if (valid != null)
			return valid;
		return locationArea.checkValidLocation();
	}

	/**
	 * Check if the entries in the widget are valid. If they are return null
	 * otherwise return a string that indicates the problem.
	 */
	private String checkValidName() {

		String name = this.projectNameField.getText();
		IWorkspace workspace = getProject().getWorkspace();
		IStatus nameStatus = workspace.validateName(name, IResource.PROJECT);
		if (!nameStatus.isOK())
			return nameStatus.getMessage();
		IProject newProject = workspace.getRoot().getProject(name);
		if (newProject.exists()) {
			return NLS.bind(
					IDEWorkbenchMessages.CopyProjectAction_alreadyExists, name);
		}

		return null;
	}

	/**
	 * The <code>ProjectLocationSelectionDialog</code> implementation of this
	 * <code>SelectionStatusDialog</code> method builds a two element list -
	 * the first element is the project name and the second one is the location.
	 */
	protected void computeResult() {

		ArrayList list = new ArrayList();
		list.add(this.projectNameField.getText());
		list.add(locationArea.getProjectLocation());
		setResult(list);
	}

	/*
	 * (non-Javadoc) Method declared in Window.
	 */
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
				IIDEHelpContextIds.PROJECT_LOCATION_SELECTION_DIALOG);
	}

	/*
	 * (non-Javadoc) Method declared on Dialog.
	 */
	protected Control createDialogArea(Composite parent) {
		// page group
		Composite composite = (Composite) super.createDialogArea(parent);

		composite.setLayout(new GridLayout());
		composite.setLayoutData(new GridData(GridData.FILL_BOTH));

		createProjectNameGroup(composite);
		locationArea = new ProjectContentsLocationArea(getErrorReporter(),
				composite, project);
		locationArea.updateProjectName(projectNameField.getText());
		return composite;
	}

	/**
	 * Create the listener that is used to validate the entries for the receiver
	 */
	private void createNameListener() {

		Listener listener = new Listener() {
			public void handleEvent(Event event) {
				setLocationForSelection();
				applyValidationResult(checkValid());
			}
		};

		this.projectNameField.addListener(SWT.Modify, listener);
	}

	/**
	 * Creates the project name specification controls.
	 * 
	 * @param parent
	 *            the parent composite
	 */
	private void createProjectNameGroup(Composite parent) {
		Font font = parent.getFont();
		// project specification group
		Composite projectGroup = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		projectGroup.setLayout(layout);
		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

		// new project label
		Label projectLabel = new Label(projectGroup, SWT.NONE);
		projectLabel.setFont(font);
		projectLabel.setText(PROJECT_NAME_LABEL);

		// new project name entry field
		projectNameField = new Text(projectGroup, SWT.BORDER);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
		projectNameField.setLayoutData(data);
		projectNameField.setFont(font);

		// Set the initial value first before listener
		// to avoid handling an event during the creation.
		projectNameField.setText(getCopyNameFor(getProject().getName()));
		projectNameField.selectAll();

		createNameListener();

	}

	/**
	 * Generates a new name for the project that does not have any collisions.
	 */
	private String getCopyNameFor(String projectName) {

		IWorkspace workspace = getProject().getWorkspace();
		if (!workspace.getRoot().getProject(projectName).exists())
			return projectName;

		int counter = 1;
		while (true) {
			String nameSegment;
			if (counter > 1) {
				nameSegment = NLS.bind(
						IDEWorkbenchMessages.CopyProjectAction_copyNameTwoArgs,
						new Integer(counter), projectName);
			} else {
				nameSegment = NLS.bind(
						IDEWorkbenchMessages.CopyProjectAction_copyNameOneArg,
						projectName);
			}

			if (!workspace.getRoot().getProject(nameSegment).exists())
				return nameSegment;

			counter++;
		}

	}

	/**
	 * Get the project being manipulated.
	 */
	private IProject getProject() {
		return this.project;
	}

	/**
	 * Set the location to the default location if we are set to useDefaults.
	 */
	private void setLocationForSelection() {
		locationArea.updateProjectName(projectNameField.getText());
	}

	/**
	 * Get an error reporter for the receiver.
	 * 
	 * @return IErrorMessageReporter
	 */
	private IErrorMessageReporter getErrorReporter() {
		return new IErrorMessageReporter() {
			/*
			 * (non-Javadoc)
			 * 
			 * @see org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter#reportError(java.lang.String)
			 */
			public void reportError(String errorMessage) {
				setMessage(errorMessage);

			}
		};
	}
}
