/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2013, 2013 SAP AG.
 * 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:
 *    SAP AG - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.fmc.blockdiagram.editor.wizards;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;

/**
 * This is the page showing up when the new Blockdiagram Wizard has been started.
 * It allows for the selection of diagram width and height, the filename (only
 * blockdiagram is allowed as file extension) and the container project/folder can
 * be selected.
 * 
 * @author Benjamin Schmeling
 * 
 */
public class BlockDiagramFilePage extends WizardPage {

	public static final String DIAGRAM_EXTENSION = "blockdiag";

	/**
	 * The control for specifying the container project/folder.
	 */
	private Text containerText;

	/**
	 * The control for specifying the name of the Blockdiagram file.
	 */
	private Text fileText;

	/**
	 * The selected container, which is required in order to fill the
	 * containerText.
	 */
	private ISelection selection;

	private Spinner gridUnit;

	/**
	 * The supported file extension
	 */
	private String extension;

	/**
	 * Getter for extension
	 * 
	 * @return file extension
	 */
	public String getExtension() {
		return this.extension;
	}

	/**
	 * Constructor for BlockDiagramFilePage.
	 * 
	 * @param selection
	 *            The currently selected project container.
	 */
	public BlockDiagramFilePage(ISelection selection) {
		super("BlockdiagramWizardPage");
		setTitle("New Blockdiagram File");
		this.extension = DIAGRAM_EXTENSION;
		this.subInit();
		this.selection = selection;
	}

	/**
	 * @see IDialogPage#createControl(Composite)
	 */
	@Override
	public void createControl(Composite parent) {
		Composite container = new Composite(parent, SWT.NULL);
		GridLayout layout = new GridLayout();
		container.setLayout(layout);
		layout.numColumns = 3;
		layout.verticalSpacing = 9;
		createContainerControl(container);
		createFilenameControl(container);
		createGridUnitControl(container);
		// createDiagramSizeControl(container);
		initialize();
		dialogChanged();
		setControl(container);
	}

	protected void createGridUnitControl(Composite container) {
		Label label = new Label(container, SWT.NULL);
		label.setText("&GridUnit:");
		gridUnit = new Spinner(container, SWT.BORDER);
		gridUnit.setSelection(10);
	}

	/**
	 * Creates the filename input controls.
	 * 
	 * @param container
	 *            The parent composite container.
	 */
	private void createFilenameControl(Composite container) {
		Label label;
		GridData gd;
		label = new Label(container, SWT.NULL);
		label.setText("&File name:");

		fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
		gd = new GridData(GridData.FILL_HORIZONTAL);
		fileText.setLayoutData(gd);
		fileText.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				dialogChanged();
			}
		});
		new Label(container, SWT.NULL);
	}

	/**
	 * Creates the container selection controls.
	 * 
	 * @param container
	 *            The parent composite container.
	 */
	private void createContainerControl(Composite container) {
		Label label = new Label(container, SWT.NULL);
		label.setText("&Project:");

		containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		containerText.setLayoutData(gd);
		containerText.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				dialogChanged();
			}
		});

		Button button = new Button(container, SWT.PUSH);
		button.setText("Browse...");
		button.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				handleBrowse();
			}
		});
	}

	/**
	 * Tests if the current workbench selection is a suitable container to use.
	 */
	private void initialize() {
		if (selection != null && selection.isEmpty() == false
				&& selection instanceof IStructuredSelection) {
			IStructuredSelection ssel = (IStructuredSelection) selection;
			if (ssel.size() > 1)
				return;
			Object obj = ssel.getFirstElement();
			if (obj instanceof IResource) {
				IContainer container;
				if (obj instanceof IContainer)
					container = (IContainer) obj;
				else
					container = ((IResource) obj).getParent();
				containerText.setText(container.getFullPath().toString());
			}
		} else {
			try {
				IContainer container = FMCWizardUtils
						.createProjectIfNecessary();
				if (container != null)
					containerText.setText(container.getFullPath().toString());
			} catch (CoreException e) {
				e.printStackTrace();
			}

		}
		fileText.setText("new_file." + extension);
	}

	/**
	 * Uses the standard container selection dialog to choose the new value for
	 * the container field.
	 */
	private void handleBrowse() {
		ContainerSelectionDialog dialog = new ContainerSelectionDialog(
				getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
				"Select new file container");
		if (dialog.open() == ContainerSelectionDialog.OK) {
			Object[] result = dialog.getResult();
			if (result.length == 1) {
				containerText.setText(((Path) result[0]).toString());
			}
		}
	}

	/**
	 * Ensures that both text fields are set.
	 */
	private void dialogChanged() {
		IResource container = ResourcesPlugin.getWorkspace().getRoot()
				.findMember(new Path(getContainerName()));
		String fileName = getFileName();
		if (getContainerName().length() == 0) {
			updateStatus("File container must be specified");
			return;
		}
		if (container == null
				|| (container.getType() & (IResource.PROJECT | IResource.FOLDER)) == 0) {
			updateStatus("File container must exist");
			return;
		}
		if (!container.isAccessible()) {
			updateStatus("Project must be writable");
			return;
		}
		if (fileName.length() == 0) {
			updateStatus("File name must be specified");
			return;
		}
		if (fileName.replace('\\', '/').indexOf('/', 1) > 0) {
			updateStatus("File name must be valid");
			return;
		}
		int dotLoc = fileName.lastIndexOf('.');
		if (dotLoc != -1) {
			String ext = fileName.substring(dotLoc + 1);
			if (ext.equalsIgnoreCase(extension) == false) {
				updateStatus("File extension must be \"" + extension + "\"");
				return;
			}
		}
		IContainer cont = (IContainer) container;
		IFile f = cont.getFile(new Path(fileName));
		if (f.exists()) {
			updateStatus("File already exists. Please choose another file name.");
			return;
		}
		updateStatus(null);
	}

	private void updateStatus(String message) {
		setErrorMessage(message);
		setPageComplete(message == null);
	}

	/**
	 * 
	 * @return The name of the selected container project/folder for this new
	 *         Blockdiagram file.
	 */
	public String getContainerName() {
		return containerText.getText();
	}

	/**
	 * 
	 * @return The selected filename for this new Blockdiagram file including the file
	 *         extension.
	 */
	public String getFileName() {
		String file = fileText.getText();
		if (!file.endsWith(extension))
			file += "." + extension;
		return file;
	}

	public int getGridUnit() {
		if (gridUnit == null)
			return 5;
		else
			return gridUnit.getSelection();
	}

	private void subInit() {
		setDescription("This wizard creates a new Blockdiagram Diagram file with *."
				+ extension
				+ " extension that can be opened by the Blockdiagram editor.");
		if (fileText != null) {
			String txt = fileText.getText();
			if (txt != null) {
				int dotPos = txt.lastIndexOf('.');
				if (dotPos != -1) {
					txt = txt.substring(0, dotPos + 1).concat(extension);
					fileText.setText(txt);
				} else {
					fileText.setText(txt + "." + extension);
				}
			} else
				fileText.setText("new_file." + extension);
		}
	}
}