/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.help.standalone;

import java.io.*;
import java.util.ArrayList;

import org.eclipse.help.internal.standalone.*;

/**
 * This is a standalone help system. It takes care of launching the Eclipse with
 * its help system implementation, and controling it. This class can be
 * instantiated and used in a Java program, or can be launched from command line
 * to execute single help action.
 *
 * Usage as a Java component:
 * <ul>
 * <li>create an instantance of this class and then hold onto this instance for
 * the duration of your application</li>
 * <li>call start()</li>
 * <li>call displayHelp(...) or displayContext(..) any number of times</li>
 * <li>at the end, call shutdown().</li>
 * </ul>
 */
public class Help {
	private StandaloneHelp help;

	/**
	 * Constructs help system
	 *
	 * @param options
	 *            array of String options and their values
	 *            <p>
	 *            Option <code>-eclipseHome dir</code> specifies Eclipse
	 *            installation directory. This directory is a parent to
	 *            "plugins" directory and eclipse executable. The option must be
	 *            provided, when current directory from which infocenter is
	 *            launched, is not the same as Eclipse installation directory.
	 *            <p>
	 *            Option <code>-host helpServerHost</code> specifies host name
	 *            of the interface that help server will use. It overrides host
	 *            name specified in the application server plugin preferences.
	 *            <p>
	 *            Option <code>-port helpServerPort</code> specifies port
	 *            number that help server will use. It overrides port number
	 *            specified in the application server plugin preferences.
	 *            <p>
	 *            Option <code>-dir rtl</code> sets right-to-left rendering
	 *            direction of help UI in the browser.
	 *            <p>
	 *            Additionally, most options accepted by Eclipse execuable are
	 *            supported.
	 */
	public Help(String[] options) {
		help = new StandaloneHelp(options);
	}
	/**
	 * This contstructs the stand alone help.
	 *
	 * @param pluginsDir
	 *            directory containing Eclipse plugins
	 * @deprecated use Help#Help(String[])
	 */
	@Deprecated
	public Help(String pluginsDir) {
		File plugins = new File(pluginsDir);
		String install = plugins.getParent();
		ArrayList<String> options = new ArrayList<>(2);
		if (install != null) {
			options = new ArrayList<>(2);
			options.add("-eclipseHome"); //$NON-NLS-1$
			options.add(install);
		}
		String[] args = new String[options.size()];
		options.toArray(args);
		help = new StandaloneHelp(args);
	}
	/**
	 * Starts the stand alone help system.
	 */
	public void start() throws Exception {
		help.start();
	}
	/**
	 * Shuts-down the stand alone help system.
	 */
	public void shutdown() throws Exception {
		help.shutdown();
	}
	/**
	 * Displays help.
	 */
	public void displayHelp() throws Exception {
		help.displayHelp();
	}

	/**
	 * Displays specified help resource.
	 *
	 * @param href
	 *            the href of the table of contents
	 */
	public void displayHelp(String href) throws Exception {
		help.displayHelp(href);
	}

	/**
	 * Displays context sensitive help.
	 *
	 * @param contextId
	 *            context id
	 * @param x
	 *            x coordinate
	 * @param y
	 *            y coordinate
	 */
	public void displayContext(String contextId, int x, int y) throws Exception {
		help.displayContext(contextId, x, y);
	}

	/**
	 * Displays context sensitive help in infopop.
	 *
	 * @param contextId
	 *            context id
	 * @param x
	 *            x coordinate
	 * @param y
	 *            y coordinate
	 */
	public void displayContextInfopop(String contextId, int x, int y)
			throws Exception {
		help.displayContextInfopop(contextId, x, y);
	}

	/**
	 * Controls standalone help system from command line.
	 *
	 * @param args
	 *            array of String containing options Options are:
	 *            <code>-command start | shutdown | (displayHelp [href]) [-eclipsehome eclipseInstallPath] [-host helpServerHost] [-port helpServerPort] [-dir rtl] [platform options] [-vmargs JavaVMarguments]</code>
	 *            where
	 *            <ul>
	 *            <li><code>href</code> is the URL of the help resource to
	 *            display,</li>
	 *            <li><code>eclipseInstallPath</code> specifies Eclipse
	 *            installation directory; it must be provided, when current
	 *            directory is not the same as Eclipse installation directory,
	 *            </li>
	 *            <li><code>helpServerHost</code> specifies host name of the
	 *            interface that help server will use, it overrides host name
	 *            specified the application server plugin preferences</li>
	 *            <li><code>helpServerPort</code> specifies port number that
	 *            help server will use, it overrides port number specified the
	 *            application server plugin preferences.</li>
	 *            <li><code>-dir rtl</code> sets right-to-left rendering
	 *            direction of help UI in the browser.
	 *            <li><code>platform options</code> are other options that
	 *            are supported by Eclipse Executable.</li>
	 *            <ul>
	 */
	public static void main(String[] args) {
		StandaloneHelp.main(args);
	}
}
