/******************************************************************************
 * Copyright (c) 2005, 2008 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 
 *    
 ****************************************************************************/

package org.eclipse.gmf.examples.runtime.diagram.logic.internal.wizards;

import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gmf.examples.runtime.diagram.logic.internal.l10n.ExampleDiagramLogicMessages;
import org.eclipse.gmf.examples.runtime.diagram.logic.internal.ui.parts.LogicNotationEditor;
import org.eclipse.gmf.examples.runtime.diagram.logic.internal.util.LogicDiagramFileCreator;
import org.eclipse.gmf.examples.runtime.diagram.logic.internal.util.LogicEditorUtil;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.EditorWizardPage;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.util.DiagramFileCreator;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.ResourceSelectionDialog;

/**
 * @author qili
 * @canBeSeenBy org.eclipse.gmf.examples.runtime.diagram.logic.*
 * 
 *              Create Logic Diagram Wizard Page
 */
public class LogicWizardPage extends EditorWizardPage {

	private Button emptyModel = null;
	private Button adderModel = null;
	private Button separateSemantics;
	private Text semanticResource;

	/**
	 * LogicDiagramWizardPage constructor
	 * 
	 * @param aWorkbench
	 *            workbench
	 * @param selection
	 *            selection
	 */
	public LogicWizardPage(IWorkbench aWorkbench, IStructuredSelection selection) {
		super("LogicDiagramPage", aWorkbench, selection); //$NON-NLS-1$
		this.setTitle(ExampleDiagramLogicMessages.LogicWizardPage_Title);
		this
				.setDescription(ExampleDiagramLogicMessages.LogicWizardPage_Description);
	}

	public IFile createAndOpenDiagram(IPath containerPath, String fileName,
			InputStream initialContents, String kind, IWorkbenchWindow dWindow,
			IProgressMonitor progressMonitor, boolean saveDiagram) {

		String semanticResourcePath = null;

		if (separateSemantics.getSelection()
				&& semanticResource.getText().length() > 0) {

			semanticResourcePath = semanticResource.getText();
		}

		IFile diagramFile = LogicEditorUtil.createAndOpenDiagram(
				getDiagramFileCreator(), containerPath, fileName,
				initialContents, kind, dWindow, progressMonitor,
				isOpenNewlyCreatedDiagramEditor(), saveDiagram,
				semanticResourcePath);

		if (adderModel.getSelection()) {
			LogicNotationEditor editor = (LogicNotationEditor) dWindow
					.getPartService().getActivePart();
			IGraphicalEditPart diagramEditPart = (IGraphicalEditPart) editor
					.getDiagramEditPart();
			LogicDiagramFactory.CreateFourBitAdder(diagramEditPart,
					progressMonitor);
			editor.doSave(progressMonitor);
		}

		return diagramFile;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.
	 * EditorWizardPage#getDefaultFileName()
	 */
	protected String getDefaultFileName() {
		return ExampleDiagramLogicMessages.LogicVisualizer_DefaultLogicDiagramFileName;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.
	 * EditorWizardPage#getDiagramFileCreator()
	 */
	public DiagramFileCreator getDiagramFileCreator() {
		return LogicDiagramFileCreator.getInstance();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.wizards.
	 * EditorWizardPage#getDiagramKind()
	 */
	protected String getDiagramKind() {
		return "logic"; //$NON-NLS-1$
	}

	@Override
	public void createControl(Composite parent) {
		super.createControl(parent);

		Composite composite = (Composite) getControl();

		// sample section generation group
		Group group = new Group(composite, SWT.NONE);
		group.setLayout(new GridLayout());
		group
				.setText(ExampleDiagramLogicMessages.LogicWizardPage_ModelOptions_GroupName);
		group.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
				| GridData.HORIZONTAL_ALIGN_FILL));

		// sample section generation checkboxes
		emptyModel = new Button(group, SWT.RADIO);
		emptyModel
				.setText(ExampleDiagramLogicMessages.LogicWizardPage_ModelOptions_EmptyModelName);
		emptyModel.setSelection(true);

		adderModel = new Button(group, SWT.RADIO);
		adderModel
				.setText(ExampleDiagramLogicMessages.LogicWizardPage_ModelOptions_FourBitAdderModelName);
	}

	protected void createAdvancedControls(Composite parent) {
		super.createAdvancedControls(parent);

		separateSemantics = new Button(parent, SWT.CHECK);
		separateSemantics
				.setText(ExampleDiagramLogicMessages.LogicWizardPage_StoreSemanticsSeparately);
		separateSemantics.setSelection(false);

		Composite separateSemanticsGroup = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 4;
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		separateSemanticsGroup.setLayout(layout);
		GridData data = new GridData(GridData.FILL_HORIZONTAL);
		separateSemanticsGroup.setLayoutData(data);

		semanticResource = new Text(separateSemanticsGroup, SWT.BORDER);
		data = new GridData(GridData.FILL_HORIZONTAL);
		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
		data.horizontalSpan = 2;
		semanticResource.setLayoutData(data);
		semanticResource.setEnabled(false);

		// browse button
		final Button browseButton = new Button(separateSemanticsGroup, SWT.PUSH);
		browseButton
				.setText(ExampleDiagramLogicMessages.LogicWizardPage_BrowseSemanticResource);
		browseButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				handleBrowseButtonPressed();
			}
		});
		browseButton.setEnabled(false);
		setButtonLayoutData(browseButton);

		separateSemantics.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				semanticResource.setEnabled(!semanticResource.getEnabled());
				browseButton.setEnabled(!browseButton.getEnabled());
				semanticResource.setText(getContainerFullPath().append(
						getFileName()).removeFileExtension().addFileExtension(
						"logic2semantic").toString()); //$NON-NLS-1$
			}

			public void widgetDefaultSelected(SelectionEvent e) {
				// Do nothing
			}
		});
	}

	protected void handleBrowseButtonPressed() {
		ResourceSelectionDialog dialog = new ResourceSelectionDialog(
				getShell(),
				ResourcesPlugin.getWorkspace().getRoot(),
				ExampleDiagramLogicMessages.LogicWizardPage_BrowseSemanticDialogTitle);

		if (dialog.open() == ResourceSelectionDialog.OK) {
			if (dialog.getResult().length == 0)
				return;

			IResource r = (IResource) dialog.getResult()[0];
			semanticResource.setText(r.getFullPath().toString());
		}
	}
}
