/*******************************************************************************
 * 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
 *     David Carver - bug 223557 - Added images contributed by Holger Voormann
 *******************************************************************************/
package org.eclipse.wst.xsl.jaxp.debug.ui.internal.tabs.processor;

import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.wst.xsl.internal.debug.ui.XSLLaunchConfigurationTab;
import org.eclipse.wst.xsl.jaxp.debug.ui.internal.JAXPDebugUIPlugin;
import org.eclipse.wst.xsl.jaxp.launching.IProcessorInvoker;
import org.eclipse.wst.xsl.jaxp.launching.JAXPLaunchConfigurationConstants;
import org.eclipse.wst.xsl.jaxp.launching.JAXPRuntime;

public class XSLProcessorTab2 extends XSLLaunchConfigurationTab
{
	private final ProcessorBlock processorBlock;
	private final AttributesBlock attributesBlock;
	private final OutputPropertiesBlock outputPropertiesBlock;
	private Image image;

	public XSLProcessorTab2()
	{
		attributesBlock = new AttributesBlock();
		outputPropertiesBlock = new OutputPropertiesBlock();
		processorBlock = new ProcessorBlock();
		
		setBlocks(new ILaunchConfigurationTab[]
		{ processorBlock , attributesBlock, outputPropertiesBlock });
	}

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

		processorBlock.createControl(comp);
		
		TabFolder tabFolder = new TabFolder(comp,SWT.NONE);
		tabFolder.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));

		outputPropertiesBlock.createControl(tabFolder);		
		attributesBlock.createControl(tabFolder);		
	}

	@Override
	public void performApply(ILaunchConfigurationWorkingCopy configuration)
	{
		super.performApply(configuration);
		IProcessorInvoker invoker = JAXPRuntime.getProcessorInvokers()[0];
		configuration.setAttribute(JAXPLaunchConfigurationConstants.INVOKER_DESCRIPTOR, invoker.getId());
	}

	public String getName()
	{
		return Messages.getString("XSLProcessorTab.0"); //$NON-NLS-1$
	}
	
	@Override
	public String getId()
	{
		return "org.eclipse.wst.xsl.debug.ui.jaxp.tabs.processor";
	}

	@Override
	public Image getImage()
	{
		if (image == null)
		{
			ImageDescriptor id = JAXPDebugUIPlugin.imageDescriptorFromPlugin(JAXPDebugUIPlugin.PLUGIN_ID, "icons/xslt_processor.gif");
			image = id.createImage();
		}
		return image;
	}

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