//------------------------------------------------------------------------------
// Copyright (c) 2004, 2007 IBM Corporation.  All Rights Reserved.
//------------------------------------------------------------------------------
package org.eclipse.epf.export.msp.ui.preferences;

import java.util.List;

import org.eclipse.epf.common.ui.util.PreferenceUtil;
import org.eclipse.epf.common.utils.FileUtil;
import org.eclipse.epf.export.msp.ui.ExportMSPUIPlugin;
import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
import org.eclipse.jface.preference.IPreferenceStore;

/**
 * The Export Microsoft Project UI preferences.
 * 
 * @author Kelvin Low
 * @since 1.2
 */
public class ExportMSPUIPreferences {

	// The publish web site preference key.
	private static final String PUBLISH_WEBSITE = "publishWebSite"; //$NON-NLS-1$

	// The publish configuration preference key.
	private static final String PUBLISH_CONFIGURATION = "publishConfiguration"; //$NON-NLS-1$

	// The export only planned WBS elements preference key.
	private static final String EXPORT_ONLY_PLANNED_WBS_ELEMENTS = "exportOnlyPlannedWBSElements"; //$NON-NLS-1$

	// The process name preference key.
	private static final String PROCESS_NAME = "processName"; //$NON-NLS-1$

	// The method configuration namr preference key.
	private static final String CONFIGURATION_NAME = "configurationName"; //$NON-NLS-1$

	// The Microsoft Project names preference key.
	private static final String MS_PROJECT_NAMES = "msprojectNames"; //$NON-NLS-1$

	// The export directories preference key.
	private static final String EXPORT_DIRECTORIES = "exportDirs"; //$NON-NLS-1$

	// The default export MSP directory name.
	private static final String DEFAULT_EXPORT_DIR_NAME = "Export" + FileUtil.FILE_SEP + "MSP"; //$NON-NLS-1$ //$NON-NLS-2$	 
	
	// The plug-in specific preference store.
	private static IPreferenceStore prefStore = ExportMSPUIPlugin.getDefault()
			.getPreferenceStore();

	// The default export MSP directory.
	private static String defaultExportDir = null;
	
	static {
		prefStore.setDefault(PUBLISH_WEBSITE, true);
		prefStore.setDefault(PUBLISH_CONFIGURATION, true);
		prefStore.setDefault(EXPORT_ONLY_PLANNED_WBS_ELEMENTS, false);
		prefStore.setDefault(CONFIGURATION_NAME, ""); //$NON-NLS-1$
		prefStore.setDefault(PROCESS_NAME, ""); //$NON-NLS-1$
		prefStore.setDefault(MS_PROJECT_NAMES, ""); //$NON-NLS-1$
		prefStore.setDefault(EXPORT_DIRECTORIES, getDefaultExportDir());
	}

	/**
	 * Gets the publish web site preference value.
	 * 
	 * @return <code>true</code> is the preference is set.
	 */
	public static boolean getPublishWebSite() {
		return prefStore.getBoolean(PUBLISH_WEBSITE);
	}

	/**
	 * Sets the publish web site preference value.
	 * 
	 * @param value
	 *            the preference value
	 */
	public static void setPublishWebSite(boolean value) {
		prefStore.setValue(PUBLISH_WEBSITE, value);
	}

	/**
	 * Gets the publish configuration preference value.
	 * 
	 * @return <code>true</code> is the preference is set
	 */
	public static boolean getPublishConfiguration() {
		return prefStore.getBoolean(PUBLISH_CONFIGURATION);
	}

	/**
	 * Sets the publish configuration preference value.
	 * 
	 * @param value
	 *            the preference value
	 */
	public static void setPublishConfiguration(boolean value) {
		prefStore.setValue(PUBLISH_CONFIGURATION, value);
	}

	/**
	 * Gets the export only planned WBS elements preference value.
	 * 
	 * @return <code>true</code> is the preference is set
	 */
	public static boolean getExportOnlyPlannedWBSElements() {
		return prefStore.getBoolean(EXPORT_ONLY_PLANNED_WBS_ELEMENTS);
	}

	/**
	 * Sets the export only planned WBS elements preference value.
	 * 
	 * @param value
	 *            the preference value
	 */
	public static void setExportOnlyPlannedWBSElements(boolean value) {
		prefStore.setValue(EXPORT_ONLY_PLANNED_WBS_ELEMENTS, value);
	}

	/**
	 * Gets the process name preference value.
	 * 
	 * @return the preference value
	 */
	public static String getProcessName() {
		return prefStore.getString(PROCESS_NAME);
	}

	/**
	 * Sets the process name preference value.
	 * 
	 * @param value
	 *            the preference value
	 */
	public static void setProcessName(String value) {
		prefStore.setValue(PROCESS_NAME, value);
	}

	/**
	 * Gets the method configuration name preference value.
	 * 
	 * @return the preference value
	 */
	public static String getConfigurationName() {
		return prefStore.getString(CONFIGURATION_NAME);
	}

	/**
	 * Sets the method configuration name preference value.
	 * 
	 * @param value
	 *            the preference value
	 */
	public static void setConfigurationName(String value) {
		prefStore.setValue(CONFIGURATION_NAME, value);
	}

	/**
	 * Gets the Microsoft Project names preference value.
	 * 
	 * @return the preference value
	 */
	public static String[] getMSProjectNames() {
		return PreferenceUtil.getStringValues(prefStore, MS_PROJECT_NAMES);
	}

	/**
	 * Gets the Microsoft Project names preference value.
	 * 
	 * @return a collection of Microsoft Project names
	 */
	public static List<String> getMSProjectNamesList() {
		return PreferenceUtil.getList(prefStore, MS_PROJECT_NAMES);
	}

	/**
	 * Adds a Microsoft Project name to the Microsoft Project names preference.
	 * 
	 * @param name
	 *            a template name
	 */
	public static void addMSProjectName(String name) {
		PreferenceUtil.addToList(prefStore, MS_PROJECT_NAMES, name);
	}

	/**
	 * Gets the default export MSP directory.
	 * 
	 * @return the default export MSP directory
	 */
	public static String getDefaultExportDir() {
		if (defaultExportDir == null) {
			defaultExportDir = System.getProperty("user.home"); //$NON-NLS-1$
			String appName = LibraryUIPreferences.getApplicationShortName();
			if (appName != null && appName.length() > 0) {
				defaultExportDir = defaultExportDir + FileUtil.FILE_SEP
						+ appName + FileUtil.FILE_SEP + DEFAULT_EXPORT_DIR_NAME;
			} else {
				defaultExportDir = defaultExportDir + FileUtil.FILE_SEP
						+ DEFAULT_EXPORT_DIR_NAME;
			}
		}
		return defaultExportDir;
	}

	/**
	 * Gets the export directories preference value.
	 * 
	 * @return the preference value
	 */
	public static String[] getExportDirectories() {
		return PreferenceUtil.getStringValues(prefStore, EXPORT_DIRECTORIES);
	}

	/**
	 * Gets the export directories preference value.
	 * 
	 * @return a collection of export directories
	 */
	public static List<String> getExportDirectoriesList() {
		return PreferenceUtil.getList(prefStore, EXPORT_DIRECTORIES);
	}

	/**
	 * Adds a export directory to the export directories preference.
	 * 
	 * @param dir
	 *            an export directory
	 */
	public static void addExportDir(String dir) {
		PreferenceUtil.addToList(prefStore, EXPORT_DIRECTORIES, dir);
	}

}
