/*******************************************************************************
 * 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 (STAR) - bug 245772 - NLS Message refactoring
 *******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui.actions;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.wst.xsl.internal.debug.ui.Messages;
import org.eclipse.wst.xsl.internal.debug.ui.tabs.main.StylesheetViewer;
import org.eclipse.wst.xsl.launching.config.LaunchTransform;
import org.eclipse.wst.xsl.core.XSLCore;


/**
 * An action that opens a dialog to allow the user to select a file from the file system.
 * 
 * @author Doug Satchwell
 */
public class AddExternalFileAction extends OpenDialogAction
{
	/**
	 * Create a new instance of this.
	 * 
	 * @param viewer the stylesheet viewer
	 * @param dialogSettingsPrefix a prefix to use for saving dialog preferences
	 */
	public AddExternalFileAction(StylesheetViewer viewer, String dialogSettingsPrefix)
	{
		super(Messages.AddExternalFileAction_Text, viewer, dialogSettingsPrefix);
	}

	@Override
	public void run()
	{
		String lastUsedPath = getDialogSetting(LAST_PATH_SETTING);
		if (lastUsedPath == null)
		{
			lastUsedPath = ""; //$NON-NLS-1$
		}
		FileDialog dialog = new FileDialog(getShell(), SWT.MULTI);
		dialog.setText(Messages.AddExternalFileAction_Selection_3);
		dialog.setFilterPath(lastUsedPath);
		IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
		IContentType contentType = contentTypeManager.getContentType(XSLCore.XSL_CONTENT_TYPE);
		String[] xslContentTypes = contentType.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
		
		// add *. to front
		for (int i = 0; i < xslContentTypes.length; i++)
		{
			String string = xslContentTypes[i];
			xslContentTypes[i] = "*."+string; //$NON-NLS-1$
		}

		dialog.setFilterExtensions(xslContentTypes);
		String res = dialog.open();
		if (res == null)
		{
			return;
		}

		IPath filterPath = new Path(dialog.getFilterPath());
		LaunchTransform[] lts = new LaunchTransform[1];
		IPath path = new Path(res).makeAbsolute();
		lts[0] = new LaunchTransform(path.toPortableString(), LaunchTransform.EXTERNAL_TYPE);

		setDialogSetting(LAST_PATH_SETTING, filterPath.toOSString());

		addTransforms(lts);
	}
}
