/*******************************************************************************
 * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * 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:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui.tabs.main;

import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Font;
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;
import org.eclipse.swt.widgets.Table;
import org.eclipse.wst.xsl.internal.debug.ui.AbstractTableBlock;
import org.eclipse.wst.xsl.internal.debug.ui.XSLDebugUIConstants;
import org.eclipse.wst.xsl.internal.debug.ui.XSLDebugUIPlugin;
import org.eclipse.wst.xsl.internal.debug.ui.actions.AbstractStylesheetAction;
import org.eclipse.wst.xsl.internal.debug.ui.actions.AddExternalFileAction;
import org.eclipse.wst.xsl.internal.debug.ui.actions.AddWorkspaceFileAction;
import org.eclipse.wst.xsl.internal.debug.ui.actions.MoveDownAction;
import org.eclipse.wst.xsl.internal.debug.ui.actions.MoveUpAction;
import org.eclipse.wst.xsl.internal.debug.ui.actions.RemoveAction;
import org.eclipse.wst.xsl.launching.config.LaunchPipeline;
import org.eclipse.wst.xsl.debug.ui.Messages;

public class TransformsBlock extends AbstractTableBlock implements IStylesheetEntriesChangedListener
{
	protected static final String DIALOG_SETTINGS_PREFIX = "TransformsBlock"; 
	private StylesheetViewer stylesheetViewer;
	private LaunchPipeline pipeline;

	public TransformsBlock()
	{
		super();
	}

	public void createControl(Composite parent)
	{
		Font font = parent.getFont();

		Group group = new Group(parent, SWT.NONE);
		group.setText(getName());
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		group.setLayoutData(gd);
		GridLayout layout = new GridLayout();
		layout.numColumns = 3;
		group.setLayout(layout);
		group.setFont(font);

		setControl(group);

		stylesheetViewer = new StylesheetViewer(group);
		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
		stylesheetViewer.getTable().setLayoutData(gd);
		stylesheetViewer.addEntriesChangedListener(this);
		stylesheetViewer.getControl().setFont(font);
		stylesheetViewer.setLabelProvider(new StylesheetLabelProvider());
		stylesheetViewer.setContentProvider(new StylesheetContentProvider());
		stylesheetViewer.getTable().addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent event) {
				if (event.character == SWT.DEL && event.stateMask == 0) {
					RemoveAction ra = new RemoveAction(stylesheetViewer);
					ra.run();
					updateLaunchConfigurationDialog();
				}
			}
		});

		Composite upDownButtonComp = new Composite(group, SWT.NONE);
		GridLayout upDownButtonLayout = new GridLayout();
		upDownButtonLayout.marginHeight = 0;
		upDownButtonLayout.marginWidth = 0;
		upDownButtonComp.setLayout(upDownButtonLayout);
		gd = new GridData(SWT.FILL, SWT.FILL, false, true);
		upDownButtonComp.setLayoutData(gd);
		upDownButtonComp.setFont(font);

		createArrowButton(upDownButtonComp, new MoveUpAction(stylesheetViewer), SWT.UP);
		Label spacer = new Label(upDownButtonComp, SWT.NONE);
		gd = new GridData(SWT.NONE, SWT.FILL, false, true);
		spacer.setLayoutData(gd);
		createArrowButton(upDownButtonComp, new MoveDownAction(stylesheetViewer), SWT.DOWN);

		Composite pathButtonComp = new Composite(group, SWT.NONE);
		GridLayout pathButtonLayout = new GridLayout();
		pathButtonLayout.marginHeight = 0;
		pathButtonLayout.marginWidth = 0;
		pathButtonComp.setLayout(pathButtonLayout);
		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL);
		pathButtonComp.setLayoutData(gd);
		pathButtonComp.setFont(font);

		createButton(pathButtonComp, new AddWorkspaceFileAction(stylesheetViewer));
		createButton(pathButtonComp, new AddExternalFileAction(stylesheetViewer, DIALOG_SETTINGS_PREFIX));
		createButton(pathButtonComp, new RemoveAction(stylesheetViewer));
	}

	public Viewer getStylesheetViewer()
	{
		return stylesheetViewer;
	}

	protected Button createArrowButton(Composite pathButtonComp, AbstractStylesheetAction action, int updown)
	{
		Button b = new Button(pathButtonComp, SWT.ARROW | updown);
		GridData gd = new GridData();
		b.setLayoutData(gd);
		action.setButton(b);
		return b;
	}

	protected Button createButton(Composite pathButtonComp, AbstractStylesheetAction action)
	{
		Button button = createPushButton(pathButtonComp, action.getText(), null);
		action.setButton(button);
		return button;
	}

	public String getName()
	{
		return Messages.getString("TransformsBlock_Name");
	}

	public void setPipeline(LaunchPipeline pipeline)
	{
		this.pipeline = pipeline;
	}

	public void initializeFrom(ILaunchConfiguration configuration)
	{
		stylesheetViewer.setInput(pipeline);
		if (pipeline.getTransformDefs().size() > 0)
		{
			stylesheetViewer.setSelection(new StructuredSelection(pipeline.getTransformDefs().get(0)));
		}
	}

	public void performApply(ILaunchConfigurationWorkingCopy configuration)
	{
	}

	public void setDefaults(ILaunchConfigurationWorkingCopy configuration)
	{
	}

	public void entriesChanged(StylesheetViewer viewer)
	{
		setDirty(true);
		updateLaunchConfigurationDialog();
	}

	@Override
	protected void setSortColumn(int column)
	{
		switch (column)
		{
		// case 1:
		// sortByName();
		// break;
		// case 2:
		// sortByType();
		// break;
		}
		super.setSortColumn(column);
	}

	@Override
	protected Table getTable()
	{
		return stylesheetViewer == null ? null : stylesheetViewer.getTable();
	}

	@Override
	protected IDialogSettings getDialogSettings()
	{
		return XSLDebugUIPlugin.getDefault().getDialogSettings();
	}

	@Override
	protected String getQualifier()
	{
		return XSLDebugUIConstants.MAIN_TRANSFORMS_BLOCK;
	}

	@Override
	public void dispose()
	{
		if (stylesheetViewer != null)
			stylesheetViewer.removeEntriesChangedListener(this);
		super.dispose();
	}
}
