/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.dialogfield;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;

/**
 * This class provides a common resource choice DialogFiled. You must set a
 * no-null IProject instance to enable it working. You should give it a suffix
 * list if you want to choose files ended with specific file extensions. The
 * selection result will be a relative path based on the _referredFile's value
 * if it is set, or else based on the _project path.
 * 
 * The usage: Shell shell = new Shell(); IProject project = getProject();
 * ResourceButtonDialogField localeField = new
 * ResourceButtonDialogField(project);
 * localeField.setResourceDescription("image"); localeField.setSuffixs(new
 * String[]{"bmp","jpg","gif"});
 * localeField.setReferredFile(StructuredModelUtil.getFileFor(_element.getModel()));
 * 
 * @author mengbo
 */
public class ResourceButtonDialogField extends StringButtonDialogField {
	private IProject _project;

	private String[] _suffixs;

	private String _resourceDescription;

	private IFile _referredFile;

	private boolean _isWebPath = false;

	private IFolder _folder;

	private String _separator = ""; //$NON-NLS-1$

	/**
	 * @param project
	 */
	public ResourceButtonDialogField(IProject project) {
		this(null, project);
		setStringButtonAdapter(new IStringButtonAdapter() {
			public void changeControlPressed(DialogField field) {
				String oldValue = getText();
				String newValue = browseButtonPressed();
				if (newValue != null && !newValue.equals(oldValue)) {
					setText(newValue);
				}
			}
		});
	}

	/**
	 * @param adapter
	 * @param project
	 */
	public ResourceButtonDialogField(IStringButtonAdapter adapter,
			IProject project) {
		super(adapter);
		this._project = project;
	}

	/**
	 * @return the string
	 */
	protected String browseButtonPressed() {
		Shell shell = getShell();
		CommonResourceDialog dialog = null;
		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL //$NON-NLS-1$
				| SWT.V_SCROLL;
		if (_folder != null) {
			dialog = new CommonResourceDialog(shell, _folder.getProject(), style);
		} else {
			dialog = new CommonResourceDialog(shell, _project, style);
		}
		dialog.setTitle(JSFUICommonPlugin
				.getResourceString("DialogField.ResourceButton.SelectFile"));//$NON-NLS-1$
		dialog.setSuffixs(_suffixs);
		dialog.setResourceDescription(_resourceDescription);

		if (dialog.open() == Window.OK) {
			Object[] result = dialog.getResult();
			StringBuffer buffer = new StringBuffer();
			for (int i = 0; i < result.length; i++) {
				String newValue = null;
				IPath path = ((IFile) result[i]).getLocation();

				IPath referredPath = null;
				if (_referredFile != null) {
					referredPath = _referredFile.getLocation();
				} else {
					referredPath = _project.getLocation();
				}
				if (this._isWebPath) {
					IFile selectedFile = ((IFile) result[i]);
					newValue = WebrootUtil.getWebPath(selectedFile
							.getFullPath());
				} else {
					newValue = PathUtil.convertToRelativePath(path.toString(),
							referredPath.toString());
				}
				buffer.append(newValue);
				buffer.append(_separator);
			}
			if (buffer.length() > 0) {
				return buffer.substring(0, buffer.length()
						- _separator.length());
			}

		}
		return null;
	}

	/**
	 * @return Returns the project.
	 */
	public IProject getProject() {
		return _project;
	}

	/**
	 * @param project
	 *            The project to set.
	 */
	public void setProject(IProject project) {
		this._project = project;
	}

	/**
	 * @return Returns the relative folder.
	 */
	public IFolder getFolder() {
		return _folder;
	}

	/**
	 * @param folder
	 *            The relative folder to set.
	 */
	public void setFolder(IFolder folder) {
		this._folder = folder;
	}

	/**
	 * @return Returns the referredFile.
	 */
	public IFile getReferredFile() {
		return _referredFile;
	}

	/**
	 * @param referredFile
	 *            The referredFile to set.
	 */
	public void setReferredFile(IFile referredFile) {
		this._referredFile = referredFile;
	}

	/**
	 * @return Returns the resourceDescription.
	 */
	public String getResourceDescription() {
		return _resourceDescription;
	}

	/**
	 * @param resourceDescription
	 *            The resourceDescription to set.
	 */
	public void setResourceDescription(String resourceDescription) {
		this._resourceDescription = resourceDescription;
	}

	/**
	 * @return Returns the suffixs.
	 */
	public String[] getSuffixs() {
		return _suffixs;
	}

	/**
	 * @param suffixs
	 *            The suffixs to set.
	 */
	public void setSuffixs(String[] suffixs) {
		this._suffixs = suffixs;
	}

	/**
	 * set some special path to web path instead of relative path
	 * 
	 * @param isWebPath
	 */
	public void setWebPath(boolean isWebPath) {
		this._isWebPath = isWebPath;
	}

	/**
	 * @return the separator string
	 */
	public String getSeparator() {
		return _separator;
	}

	/**
	 * @param separator
	 */
	public void setSeparator(String separator) {
		this._separator = separator;
	}
}
