Package org.eclipse.ui.internal.help

Source Code of org.eclipse.ui.internal.help.WorkbenchHelpSystem$ContextWithTitle

/*******************************************************************************
* Copyright (c) 2004, 2007 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 API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.help;

import java.net.URL;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler;
import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker;
import org.eclipse.help.HelpSystem;
import org.eclipse.help.IContext;
import org.eclipse.help.IContext2;
import org.eclipse.help.IHelp;
import org.eclipse.help.IHelpResource;
import org.eclipse.help.IToc;
import org.eclipse.jface.action.IAction;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommand;
import org.eclipse.ui.help.AbstractHelpUI;
import org.eclipse.ui.help.IContextComputer;
import org.eclipse.ui.help.IWorkbenchHelpSystem;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;

/**
* This class represents a refactoring of the functionality previously contained
* in <code>WorkbenchHelp</code>.
*
* @since 3.1
*/
public final class WorkbenchHelpSystem implements IWorkbenchHelpSystem {

  /**
   * Key used for stashing help-related data on SWT widgets.
   *
   * @see org.eclipse.swt.widgets.Widget#getData(java.lang.String)
   */
  public static final String HELP_KEY = "org.eclipse.ui.help";//$NON-NLS-1$

  /**
   * Id of extension point where the help UI is contributed.
   */
  private static final String HELP_SYSTEM_EXTENSION_ID = PlatformUI.PLUGIN_ID + '.' + IWorkbenchRegistryConstants.PL_HELPSUPPORT;

  /**
   * Attribute id for class attribute of help UI extension point.
   */
  private static final String HELP_SYSTEM_CLASS_ATTRIBUTE = "class";//$NON-NLS-1$

  /**
   * Singleton.
   */
  private static WorkbenchHelpSystem instance;

  /**
   * The help listener.
   */
  private static class WorkbenchHelpListener implements HelpListener {
    public void helpRequested(HelpEvent event) {

      if (getInstance().getHelpUI() == null) {
        return;
      }

      // get the help context from the widget
      Object object = event.widget.getData(HELP_KEY);

      // Since 2.0 we can expect that object is a String, however
      // for backward compatability we handle context computers and
      // arrays.
      IContext context = null;
      if (object instanceof String) {
        // context id - this is the norm
        context = HelpSystem.getContext((String) object);
      } else if (object instanceof IContext) {
        // already resolved context (pre 2.0)
        context = (IContext) object;
      } else if (object instanceof IContextComputer) {
        // a computed context (pre 2.0) - compute it now
        Object[] helpContexts = ((IContextComputer) object)
            .computeContexts(event);
        // extract the first entry
        if (helpContexts != null && helpContexts.length > 0) {
          Object primaryEntry = helpContexts[0];
          if (primaryEntry instanceof String) {
            context = HelpSystem.getContext((String) primaryEntry);
          } else if (primaryEntry instanceof IContext) {
            context = (IContext) primaryEntry;
          }
        }
      } else if (object instanceof Object[]) {
        // mixed array of String or IContext (pre 2.0) - extract the
        // first entry
        Object[] helpContexts = (Object[]) object;
        // extract the first entry
        if (helpContexts.length > 0) {
          Object primaryEntry = helpContexts[0];
          if (primaryEntry instanceof String) {
            context = HelpSystem.getContext((String) primaryEntry);
          } else if (primaryEntry instanceof IContext) {
            context = (IContext) primaryEntry;
          }
        }
      }
     
      /*
       * If can't find it, show the "context is missing" context.
       */
      if (context == null) {
        context = HelpSystem.getContext(IWorkbenchHelpContextIds.MISSING);
      }
     
      if (context != null) {
        // determine a location in the upper right corner of the
        // widget
        Point point = computePopUpLocation(event.widget.getDisplay());
        // display the help
        getInstance().displayContext(context, point.x, point.y);
      }
    }
  }

  /**
   * Whether the help system has been initialized.
   */
  private boolean isInitialized;

  /**
   * Pluggable help UI, or <code>null</code> if none (or unknown).
   */
  private AbstractHelpUI pluggableHelpUI = null;

  /**
   * The id of the help extension that should be used. This is used only for
   * debugging purposes.
   */
  private String desiredHelpSystemId;

  /**
   * Handles dynamic removal of the help system.
   *
   * @since 3.1
   */
    /**
     * Handles dynamic removal of the help system.
     *
     * @since 3.1
     */
    private IExtensionChangeHandler handler = new IExtensionChangeHandler() {
       
        /* (non-Javadoc)
         * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamicHelpers.IExtensionTracker, org.eclipse.core.runtime.IExtension)
         */
        public void addExtension(IExtensionTracker tracker,IExtension extension) {
            //Do nothing
        }
       
        /* (non-Javadoc)
         * @see org.eclipse.core.runtime.dynamicHelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension, java.lang.Object[])
         */
        public void removeExtension(IExtension source, Object[] objects) {
            for (int i = 0; i < objects.length; i++) {
                if (objects[i] == pluggableHelpUI) {
                    isInitialized = false;
                    pluggableHelpUI = null;
                    helpCompatibilityWrapper = null;
                    // remove ourselves - we'll be added again in initalize if
                    // needed
                    PlatformUI.getWorkbench().getExtensionTracker()
              .unregisterHandler(handler);
                }
            }
        }
    };
   
  /**
   * Compatibility implementation of old IHelp interface.
   * WorkbenchHelp.getHelpSupport and IHelp were deprecated in 3.0.
   */
  private class CompatibilityIHelpImplementation implements IHelp {

    /** @deprecated */
    public void displayHelp() {
      // real method - forward to help UI if available
      AbstractHelpUI helpUI = getHelpUI();
      if (helpUI != null) {
        helpUI.displayHelp();
      }
    }

    /** @deprecated */
    public void displayContext(IContext context, int x, int y) {
      // real method - forward to help UI if available
      AbstractHelpUI helpUI = getHelpUI();
      if (helpUI != null) {
        helpUI.displayContext(context, x, y);
      }
    }

    /** @deprecated */
    public void displayContext(String contextId, int x, int y) {
      // convenience method - funnel through the real method
      IContext context = HelpSystem.getContext(contextId);
      if (context != null) {
        displayContext(context, x, y);
      }
    }

    /** @deprecated */
    public void displayHelpResource(String href) {
      // real method - forward to help UI if available
      AbstractHelpUI helpUI = getHelpUI();
      if (helpUI != null) {
        helpUI.displayHelpResource(href);
      }
    }

    /** @deprecated */
    public void displayHelpResource(IHelpResource helpResource) {
      // convenience method - funnel through the real method
      displayHelpResource(helpResource.getHref());
    }

    /** @deprecated */
    public void displayHelp(String toc) {
      // deprecated method - funnel through the real method
      displayHelpResource(toc);
    }

    /** @deprecated */
    public void displayHelp(String toc, String selectedTopic) {
      // deprecated method - funnel through the real method
      displayHelpResource(selectedTopic);
    }

    /** @deprecated */
    public void displayHelp(String contextId, int x, int y) {
      // deprecated method - funnel through the real method
      displayContext(contextId, x, y);
    }

    /** @deprecated */
    public void displayHelp(IContext context, int x, int y) {
      // deprecated method - funnel through the real method
      displayContext(context, x, y);
    }

    /** @deprecated */
    public IContext getContext(String contextId) {
      // non-UI method - forward to HelpSystem
      return HelpSystem.getContext(contextId);
    }

    /** @deprecated */
    public IToc[] getTocs() {
      // non-UI method - forward to HelpSystem
      return HelpSystem.getTocs();
    }

    /** @deprecated */
    public boolean isContextHelpDisplayed() {
      // real method - forward to pluggedhelp UI
      return isContextHelpDisplayed();
    }
  }

  /**
   * A wrapper for action help context that passes the action
   * text to be used as a title.
   * @since 3.1
   */
  private static class ContextWithTitle implements IContext2 {
    private IContext context;
    private String title;

    ContextWithTitle(IContext context, String title) {
      this.context = context;
      this.title = title;
    }

    public String getTitle() {
      if (context instanceof IContext2) {
        String ctitle = ((IContext2)context).getTitle();
        if (ctitle!=null) {
          return ctitle;
        }
      }
      return title;
    }

    public String getStyledText() {
      if (context instanceof IContext2) {
        return ((IContext2)context).getStyledText();
      }
      return context.getText();
    }

    public String getCategory(IHelpResource topic) {
      if (context instanceof IContext2) {
        return ((IContext2)context).getCategory(topic);
      }
      return null;
    }

    public IHelpResource[] getRelatedTopics() {
      return context.getRelatedTopics();
    }

    public String getText() {
      return context.getText();
    }
  }
 
  /**
   * Compatibility wrapper, or <code>null</code> if none. Do not access
   * directly; see getHelpSupport().
   */
  private IHelp helpCompatibilityWrapper = null;

  /**
   * The listener to attach to various widgets.
   */
  private static HelpListener helpListener;

  /**
   * For debug purposes only. 
   *
   * @return the desired help system id
   */
  public String getDesiredHelpSystemId() {
    return desiredHelpSystemId;
  }
 
  /**
   * For debug purposes only.
   *
   * @param desiredHelpSystemId the desired help system id
   */
  public void setDesiredHelpSystemId(String desiredHelpSystemId) {
    dispose(); // prep for a new help system
    this.desiredHelpSystemId = desiredHelpSystemId;
  }
 
  /**
   * Singleton Constructor.
   */
  private WorkbenchHelpSystem() {
  }

  /**
   * Return the singleton instance of this class.
   *
   * @return the singleton instance
   */
  public static WorkbenchHelpSystem getInstance() {
    if (instance == null) {
      instance = new WorkbenchHelpSystem();
    }

    return instance;
  }

  /**
   * Disposed of the singleton of this class if it has been created.
   */
  public static void disposeIfNecessary() {
    if (instance != null) {
      instance.dispose();
      instance = null;
    }
  }

  /**
   * Dispose of any resources allocated by this instance.
   */
  public void dispose() {
    pluggableHelpUI = null;
    helpCompatibilityWrapper = null;
    isInitialized = false;
    PlatformUI.getWorkbench().getExtensionTracker()
        .unregisterHandler(handler);
  }

  /**
   * Returns the help UI for the platform, if available. This method will
   * initialize the help UI if necessary.
   *
   * @return the help UI, or <code>null</code> if none
   */
  private AbstractHelpUI getHelpUI() {
    if (!isInitialized) {
      isInitialized = initializePluggableHelpUI();
    }
    return pluggableHelpUI;
  }

  /**
   * Initializes the pluggable help UI by getting an instance via the
   * extension point.
   */
  private boolean initializePluggableHelpUI() {
    final boolean[] ret = new boolean[] { false };

    BusyIndicator.showWhile(Display.getCurrent(), new Runnable() {

      /*
       * (non-Javadoc)
       *
       * @see java.lang.Runnable#run()
       */
      public void run() {
        // get the help UI extension from the registry
        IExtensionPoint point = Platform.getExtensionRegistry()
            .getExtensionPoint(HELP_SYSTEM_EXTENSION_ID);
        if (point == null) {
          // our extension point is missing (!) - act like there was
          // no help UI
          return;
        }
        IExtension[] extensions = point.getExtensions();
        if (extensions.length == 0) {
          // no help UI present
          return;
        }

        IConfigurationElement elementToUse = null;
        if (desiredHelpSystemId == null) {
          elementToUse = getFirstElement(extensions);
        } else {
          elementToUse = findElement(desiredHelpSystemId, extensions);
        }

        if (elementToUse != null) {
          ret[0] = initializePluggableHelpUI(elementToUse);
        }
      }

      private IConfigurationElement findElement(
          String desiredHelpSystemId, IExtension[] extensions) {
        for (int i = 0; i < extensions.length; i++) {
          IExtension extension = extensions[i];
          if (desiredHelpSystemId.equals(extension.getUniqueIdentifier())) {
            IConfigurationElement[] elements = extensions[0]
                .getConfigurationElements();
            if (elements.length == 0) {
              // help UI present but mangled - act like there was
              // no help
              // UI
              return null;
            }
            return elements[0];
          }

        }
        return null;
      }

      private IConfigurationElement getFirstElement(
          IExtension[] extensions) {
        // There should only be one extension/config element so we just
        // take the first
        IConfigurationElement[] elements = extensions[0]
            .getConfigurationElements();
        if (elements.length == 0) {
          // help UI present but mangled - act like there was no help
          // UI
          return null;
        }
        return elements[0];
      }

      private boolean initializePluggableHelpUI(
          IConfigurationElement element) {
        // Instantiate the help UI
        try {
          pluggableHelpUI = (AbstractHelpUI) WorkbenchPlugin
              .createExtension(element,
                  HELP_SYSTEM_CLASS_ATTRIBUTE);
          // start listening for removals
          PlatformUI.getWorkbench().getExtensionTracker()
              .registerHandler(handler, null);
          // register the new help UI for removal notification
          PlatformUI
              .getWorkbench()
              .getExtensionTracker()
              .registerObject(element.getDeclaringExtension(),
                  pluggableHelpUI, IExtensionTracker.REF_WEAK);
          return true;
        } catch (CoreException e) {
          WorkbenchPlugin.log(
              "Unable to instantiate help UI" + e.getStatus(), e);//$NON-NLS-1$
        }
        return false;
      }

    });
    return ret[0];
  }

  /**
   * Determines the location for the help popup shell given the widget which
   * orginated the request for help.
   *
   * @param display
   *            the display where the help will appear
   */
  private static Point computePopUpLocation(Display display) {
    Point point = display.getCursorLocation();
    return new Point(point.x + 15, point.y);
  }

  /**
   * Returns the help listener which activates the help support system.
   *
   * @return the help listener
   */
  private HelpListener getHelpListener() {
    if (helpListener == null) {
      helpListener = new WorkbenchHelpListener();
    }
    return helpListener;
  }

  /**
   * Returns the help support system for the platform, if available.
   *
   * @return the help support system, or <code>null</code> if none
   * @deprecated Use the static methods on this class and on
   *             {@link org.eclipse.help.HelpSystem HelpSystem}instead of the
   *             IHelp methods on the object returned by this method.
   */
  public IHelp getHelpSupport() {
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null && helpCompatibilityWrapper == null) {
      // create instance only once, and only if needed
      helpCompatibilityWrapper = new CompatibilityIHelpImplementation();
    }
    return helpCompatibilityWrapper;

  }

  /**
   * Sets the given help contexts on the given action.
   * <p>
   * Use this method when the list of help contexts is known in advance. Help
   * contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param action
   *            the action on which to register the computer
   * @param contexts
   *            the contexts to use when F1 help is invoked; a mixed-type
   *            array of context ids (type <code>String</code>) and/or help
   *            contexts (type <code>IContext</code>)
   * @deprecated use setHelp with a single context id parameter
   */
  public void setHelp(IAction action, final Object[] contexts) {
    for (int i = 0; i < contexts.length; i++) {
      Assert.isTrue(contexts[i] instanceof String
          || contexts[i] instanceof IContext);
    }
    action.setHelpListener(new HelpListener() {
      public void helpRequested(HelpEvent event) {
        if (contexts != null && contexts.length > 0
            && getHelpUI() != null) {
          // determine the context
          IContext context = null;
          if (contexts[0] instanceof String) {
            context = HelpSystem.getContext((String) contexts[0]);
          } else if (contexts[0] instanceof IContext) {
            context = (IContext) contexts[0];
          }
          if (context != null) {
            Point point = computePopUpLocation(event.widget
                .getDisplay());
            displayContext(context, point.x, point.y);
          }
        }
      }
    });
  }

  /**
   * Sets the given help context computer on the given action.
   * <p>
   * Use this method when the help contexts cannot be computed in advance.
   * Help contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param action
   *            the action on which to register the computer
   * @param computer
   *            the computer to determine the help contexts for the control
   *            when F1 help is invoked
   * @deprecated context computers are no longer supported, clients should
   *             implement their own help listener
   */
  public void setHelp(IAction action, final IContextComputer computer) {
    action.setHelpListener(new HelpListener() {
      public void helpRequested(HelpEvent event) {
        Object[] helpContexts = computer.computeContexts(event);
        if (helpContexts != null && helpContexts.length > 0
            && getHelpUI() != null) {
          // determine the context
          IContext context = null;
          if (helpContexts[0] instanceof String) {
            context = HelpSystem
                .getContext((String) helpContexts[0]);
          } else if (helpContexts[0] instanceof IContext) {
            context = (IContext) helpContexts[0];
          }
          if (context != null) {
            Point point = computePopUpLocation(event.widget
                .getDisplay());
            displayContext(context, point.x, point.y);
          }
        }
      }
    });
  }

  /**
   * Sets the given help contexts on the given control.
   * <p>
   * Use this method when the list of help contexts is known in advance. Help
   * contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param control
   *            the control on which to register the contexts
   * @param contexts
   *            the contexts to use when F1 help is invoked; a mixed-type
   *            array of context ids (type <code>String</code>) and/or help
   *            contexts (type <code>IContext</code>)
   * @deprecated use setHelp with single context id parameter
   */
  public void setHelp(Control control, Object[] contexts) {
    for (int i = 0; i < contexts.length; i++) {
      Assert.isTrue(contexts[i] instanceof String
          || contexts[i] instanceof IContext);
    }

    control.setData(HELP_KEY, contexts);
    // ensure that the listener is only registered once
    control.removeHelpListener(getHelpListener());
    control.addHelpListener(getHelpListener());
  }

  /**
   * Sets the given help context computer on the given control.
   * <p>
   * Use this method when the help contexts cannot be computed in advance.
   * Help contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param control
   *            the control on which to register the computer
   * @param computer
   *            the computer to determine the help contexts for the control
   *            when F1 help is invoked
   * @deprecated context computers are no longer supported, clients should
   *             implement their own help listener
   */
  public void setHelp(Control control, IContextComputer computer) {
    control.setData(HELP_KEY, computer);
    // ensure that the listener is only registered once
    control.removeHelpListener(getHelpListener());
    control.addHelpListener(getHelpListener());
  }

  /**
   * Sets the given help contexts on the given menu.
   * <p>
   * Use this method when the list of help contexts is known in advance. Help
   * contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param menu
   *            the menu on which to register the context
   * @param contexts
   *            the contexts to use when F1 help is invoked; a mixed-type
   *            array of context ids (type <code>String</code>) and/or help
   *            contexts (type <code>IContext</code>)
   * @deprecated use setHelp with single context id parameter
   */
  public void setHelp(Menu menu, Object[] contexts) {
    for (int i = 0; i < contexts.length; i++) {
      Assert.isTrue(contexts[i] instanceof String
          || contexts[i] instanceof IContext);
    }
    menu.setData(HELP_KEY, contexts);
    // ensure that the listener is only registered once
    menu.removeHelpListener(getHelpListener());
    menu.addHelpListener(getHelpListener());
  }

  /**
   * Sets the given help context computer on the given menu.
   * <p>
   * Use this method when the help contexts cannot be computed in advance.
   * Help contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param menu
   *            the menu on which to register the computer
   * @param computer
   *            the computer to determine the help contexts for the control
   *            when F1 help is invoked
   * @deprecated context computers are no longer supported, clients should
   *             implement their own help listener
   */
  public void setHelp(Menu menu, IContextComputer computer) {
    menu.setData(HELP_KEY, computer);
    // ensure that the listener is only registered once
    menu.removeHelpListener(getHelpListener());
    menu.addHelpListener(getHelpListener());
  }

  /**
   * Sets the given help contexts on the given menu item.
   * <p>
   * Use this method when the list of help contexts is known in advance. Help
   * contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param item
   *            the menu item on which to register the context
   * @param contexts
   *            the contexts to use when F1 help is invoked; a mixed-type
   *            array of context ids (type <code>String</code>) and/or help
   *            contexts (type <code>IContext</code>)
   * @deprecated use setHelp with single context id parameter
   */
  public void setHelp(MenuItem item, Object[] contexts) {
    for (int i = 0; i < contexts.length; i++) {
      Assert.isTrue(contexts[i] instanceof String
          || contexts[i] instanceof IContext);
    }
    item.setData(HELP_KEY, contexts);
    // ensure that the listener is only registered once
    item.removeHelpListener(getHelpListener());
    item.addHelpListener(getHelpListener());
  }

  /**
   * Sets the given help context computer on the given menu item.
   * <p>
   * Use this method when the help contexts cannot be computed in advance.
   * Help contexts can either supplied as a static list, or calculated with a
   * context computer (but not both).
   * </p>
   *
   * @param item
   *            the menu item on which to register the computer
   * @param computer
   *            the computer to determine the help contexts for the control
   *            when F1 help is invoked
   * @deprecated context computers are no longer supported, clients should
   *             implement their own help listener
   */
  public void setHelp(MenuItem item, IContextComputer computer) {
    item.setData(HELP_KEY, computer);
    // ensure that the listener is only registered once
    item.removeHelpListener(getHelpListener());
    item.addHelpListener(getHelpListener());
  }
 
    /**
     * Creates a new help listener for the given command. This retrieves the
     * help context ID from the command, and creates an appropriate listener
     * based on this.
     *
     * @param command
     *            The command for which the listener should be created; must
     *            not be <code>null</code>.
     * @return A help listener; never <code>null</code>.
     */
  public HelpListener createHelpListener(ICommand command) {
    // TODO Need a help ID from the context
    // final String contextId = command.getHelpId();
    final String contextId = ""; //$NON-NLS-1$
    return new HelpListener() {
      public void helpRequested(HelpEvent event) {
        if (getHelpUI() != null) {
          IContext context = HelpSystem.getContext(contextId);
          if (context != null) {
            Point point = computePopUpLocation(event.widget
                .getDisplay());
            displayContext(context, point.x, point.y);
          }
        }
      }
    };
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displayHelp()
   */
  public void displayHelp() {
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.displayHelp();
    }
  }
 
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displaySearch()
   */
  public void displaySearch() {
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.displaySearch();
    }
  }
 
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displaySearch()
   */
  public void displayDynamicHelp() {
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.displayDynamicHelp();
    }
  }
 
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#search(java.lang.String)
   */
  public void search(String expression) {
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.search(expression);
    }
  }
 
  /* (non-Javadoc)
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#resolve(java.lang.String, boolean)
   */
  public URL resolve(String href, boolean documentOnly) {
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      return helpUI.resolve(href, documentOnly);
    }
    return null;
  }
 
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displayContext(org.eclipse.help.IContext,
   *      int, int)
   */
  public void displayContext(IContext context, int x, int y) {
    if (context == null) {
      throw new IllegalArgumentException();
    }
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.displayContext(context, x, y);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displayHelpResource(java.lang.String)
   */
  public void displayHelpResource(String href) {
    if (href == null) {
      throw new IllegalArgumentException();
    }
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.displayHelpResource(href);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displayHelp(java.lang.String)
   */
  public void displayHelp(String contextId) {
    IContext context = HelpSystem.getContext(contextId);
    if (context != null) {
      Point point = computePopUpLocation(Display.getCurrent());
      displayContext(context, point.x, point.y);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#displayHelp(org.eclipse.help.IContext)
   */
  public void displayHelp(IContext context) {
    Point point = computePopUpLocation(Display.getCurrent());
    AbstractHelpUI helpUI = getHelpUI();
    if (helpUI != null) {
      helpUI.displayContext(context, point.x, point.y);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#isContextHelpDisplayed()
   */
  public boolean isContextHelpDisplayed() {
    if (!isInitialized) {
      return false;
    }
    AbstractHelpUI helpUI = getHelpUI();
    return helpUI != null && helpUI.isContextHelpDisplayed();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#setHelp(org.eclipse.jface.action.IAction,
   *      java.lang.String)
   */
  public void setHelp(final IAction action, final String contextId) {
    action.setHelpListener(new HelpListener() {
      public void helpRequested(HelpEvent event) {
        if (getHelpUI() != null) {
          IContext context = HelpSystem.getContext(contextId);
          if (context != null) {
            Point point = computePopUpLocation(event.widget
                .getDisplay());
            displayContext(new ContextWithTitle(context, action.getText()), point.x, point.y);
          }
        }
      }
    });
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#setHelp(org.eclipse.swt.widgets.Control,
   *      java.lang.String)
   */
  public void setHelp(Control control, String contextId) {
    control.setData(HELP_KEY, contextId);
    // ensure that the listener is only registered once
    control.removeHelpListener(getHelpListener());
    control.addHelpListener(getHelpListener());
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#setHelp(org.eclipse.swt.widgets.Menu,
   *      java.lang.String)
   */
  public void setHelp(Menu menu, String contextId) {
    menu.setData(HELP_KEY, contextId);
    // ensure that the listener is only registered once
    menu.removeHelpListener(getHelpListener());
    menu.addHelpListener(getHelpListener());
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#setHelp(org.eclipse.swt.widgets.MenuItem,
   *      java.lang.String)
   */
  public void setHelp(MenuItem item, String contextId) {
    item.setData(HELP_KEY, contextId);
    // ensure that the listener is only registered once
    item.removeHelpListener(getHelpListener());
    item.addHelpListener(getHelpListener());
  }

  /* (non-Javadoc)
   * @see org.eclipse.ui.help.IWorkbenchHelpSystem#hasHelpUI()
   */
  public boolean hasHelpUI() {
    return getHelpUI() != null;
  }
}
TOP

Related Classes of org.eclipse.ui.internal.help.WorkbenchHelpSystem$ContextWithTitle

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.