/*******************************************************************************
* Copyright (c) 2008 IBM Corporation.
* 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:
* Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation
*******************************************************************************/
package org.eclipse.imp.help;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.help.IContextProvider;
import org.eclipse.imp.editor.LanguageServiceManager;
import org.eclipse.imp.parser.IParseController;
import org.eclipse.imp.parser.ISourcePositionLocator;
import org.eclipse.imp.runtime.RuntimePlugin;
import org.eclipse.imp.services.IHelpService;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.HelpEvent;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
public class IMPHelp {
private final static Object[] NO_ELEMENTS= new Object[0];
public static void setHelp(LanguageServiceManager svcMgr, StructuredViewer viewer, String contextId) {
IMPViewerHelpListener listener= new IMPViewerHelpListener(svcMgr, viewer, contextId);
viewer.getControl().addHelpListener(listener);
}
public static void setHelp(LanguageServiceManager svcMgr, ITextEditor editor, StyledText text, String contextId) {
IMPEditorHelpListener listener= new IMPEditorHelpListener(svcMgr, editor, contextId);
text.addHelpListener(listener);
}
private static abstract class IMPHelpListenerBase implements HelpListener {
protected String fContextId;
public IMPHelpListenerBase(String contextId) {
fContextId= contextId;
}
}
private static class IMPViewerHelpListener extends IMPHelpListenerBase {
private StructuredViewer fViewer;
private final IHelpService fHelpService;
private final IParseController fParseController;
public IMPViewerHelpListener(LanguageServiceManager svcManager, StructuredViewer viewer, String contextId) {
super(contextId);
fHelpService= svcManager.getContextHelp();
fParseController= svcManager.getParseController();
fViewer= viewer;
}
/*
* @see HelpListener#helpRequested(HelpEvent)
*
*/
public void helpRequested(HelpEvent e) {
try {
Object[] selected= null;
if (fViewer != null) {
ISelection selection= fViewer.getSelection();
if (selection instanceof IStructuredSelection) {
selected= ((IStructuredSelection) selection).toArray();
}
}
IMPHelpContext.displayHelp(fHelpService, fParseController, fContextId, selected);
} catch (CoreException x) {
RuntimePlugin.getInstance().logException(x.getMessage(), x);
}
}
}
private static class IMPEditorHelpListener extends IMPHelpListenerBase {
private final ITextEditor fEditor;
private final IHelpService fHelpService;
private final ISourcePositionLocator fLocator;
private final IParseController fParseController;
public IMPEditorHelpListener(LanguageServiceManager svcManager, ITextEditor editor, String contextId) {
super(contextId);
fHelpService= svcManager.getContextHelp();
fParseController= svcManager.getParseController();
fLocator= fParseController.getSourcePositionLocator();
fEditor= editor;
}
/*
* @see HelpListener#helpRequested(HelpEvent)
*
*/
public void helpRequested(HelpEvent e) {
try {
Object[] selected= null;
if (fEditor != null) {
ITextSelection textSel= (ITextSelection) fEditor.getSelectionProvider().getSelection();
Object node= fLocator.findNode(fParseController.getCurrentAst(), textSel.getOffset());
selected= new Object[] { node };
}
IMPHelpContext.displayHelp(fHelpService, fParseController, fContextId, selected);
} catch (CoreException x) {
RuntimePlugin.getInstance().logException(x.getMessage(), x);
}
}
}
/**
* Creates and returns a help context provider for the given part.
*
* @param part the part for which to create the help context provider
* @param contextId the optional context ID used to retrieve static help
* @return the help context provider
*/
public static IContextProvider getHelpContextProvider(IWorkbenchPart part, LanguageServiceManager srvcMgr, String contextId) {
ISelectionProvider provider= part.getSite().getSelectionProvider();
if (provider != null) {
ISelection sel= provider.getSelection();
if (sel instanceof IStructuredSelection) {
IStructuredSelection selection= (IStructuredSelection) sel;
return new IMPHelpContextProvider(srvcMgr, contextId, selection.toArray());
} else if (sel instanceof ITextSelection) {
ITextSelection textSel= (ITextSelection) sel;
// IParseController parseController= srvcMgr.getParseController();
return new IMPHelpContextProvider(srvcMgr, contextId, new Region(textSel.getOffset(), textSel.getLength()));
// ISourcePositionLocator nodeLocator= parseController.getNodeLocator();
// Object node= nodeLocator.findNode(parseController.getCurrentAst(), textSel.getOffset(), textSel.getOffset() + textSel.getLength());
//
// if (node != null) {
// elements= new Object[] { node };
// } else {
// elements= NO_ELEMENTS;
// }
}
}
return null;
}
}