blob: a7eacc766839aef10be248e5e95eb9875d396ba4 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}