//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library;

import java.io.IOException;
import java.net.URL;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.epf.common.plugin.AbstractPlugin;
import org.eclipse.epf.library.layout.LayoutResources;
import org.osgi.framework.BundleContext;

/**
 * The Library plug-in class.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
public class LibraryPlugin extends AbstractPlugin {

	private static final String LAYOUT_PATH = "layout/"; //$NON-NLS-1$;

	public static final String LAYOUT_XSL_PATH = "layout/xsl/"; //$NON-NLS-1$;
	private static final String LAYOUT_CSS_PATH = "layout/css/"; //$NON-NLS-1$;

	public static final String LAYOUT_SCRIPTS_FOLDER = "scripts"; //$NON-NLS-1$;

	public static final String LAYOUT_SCRIPTS_PATH = "layout/scripts/"; //$NON-NLS-1$;

	// The shared plug-in instance.
	private static LibraryPlugin plugin;

	private String layoutPath, layoutXslPath, layoutCssPath;

	/**
	 * Creates a new instance.
	 */
	public LibraryPlugin() {
		super();
		plugin = this;
	}

	/**
	 * @see org.eclipse.epf.common.plugin.AbstractPlugin#start(BundleContext)
	 */
	public void start(BundleContext context) throws Exception {
		super.start(context);
		try {
			URL url = new URL(super.getInstallURL(), LAYOUT_PATH);
			layoutPath = FileLocator.resolve(url).getPath();

			url = new URL(super.getInstallURL(), LAYOUT_XSL_PATH);
			layoutXslPath = FileLocator.resolve(url).getPath();

			url = new URL(super.getInstallURL(), LAYOUT_CSS_PATH);
			layoutCssPath = FileLocator.resolve(url).getPath();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @see org.eclipse.epf.common.plugin.AbstractPlugin#start(BundleContext)
	 */
	public void stop(BundleContext context) throws Exception {
		super.stop(context);
		plugin = null;

		LayoutResources.clear();
	}

	/**
	 * Returns the shared plug-in instance.
	 */
	public static LibraryPlugin getDefault() {
		return plugin;
	}

	public String getLayoutPath() {
		return layoutPath;
	}

	public String getLayoutXslPath() {
		return layoutXslPath;
	}

	public String getLayoutCssPath() {
		return layoutCssPath;
	}
}