/*
* Copyright (c) 2011, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.internal.util;
import com.google.dart.tools.core.model.DartModelException;
import com.google.dart.tools.ui.DartToolsPlugin;
import com.google.dart.tools.ui.internal.actions.SelectionConverter;
import com.google.dart.tools.ui.internal.text.editor.DartEditor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.help.HelpSystem;
import org.eclipse.help.IContext;
import org.eclipse.help.IContextProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
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;
public class DartUIHelp {
private static class JavaUIHelpContextProvider implements IContextProvider {
private String fId;
private Object[] fSelected;
public JavaUIHelpContextProvider(String id, Object[] selected) {
fId = id;
fSelected = selected;
}
@Override
public IContext getContext(Object target) {
IContext context = HelpSystem.getContext(fId);
if (fSelected != null && fSelected.length > 0) {
try {
context = new DartDocHelpContext(context, fSelected);
} catch (DartModelException e) {
// since we are updating the UI with async exec it
// can happen that the element doesn't exist anymore
// but we are still showing it in the user interface
if (!e.isDoesNotExist()) {
DartToolsPlugin.log(e);
}
}
}
return context;
}
@Override
public int getContextChangeMask() {
return SELECTION;
}
@Override
public String getSearchExpression(Object target) {
return null;
}
}
private static class JavaUIHelpListener implements HelpListener {
private StructuredViewer fViewer;
private String fContextId;
private DartEditor fEditor;
public JavaUIHelpListener(DartEditor editor, String contextId) {
fContextId = contextId;
fEditor = editor;
}
public JavaUIHelpListener(StructuredViewer viewer, String contextId) {
fViewer = viewer;
fContextId = contextId;
}
/*
* @see HelpListener#helpRequested(HelpEvent)
*/
@Override
public void helpRequested(HelpEvent e) {
try {
Object[] selected = null;
if (fViewer != null) {
ISelection selection = fViewer.getSelection();
if (selection instanceof IStructuredSelection) {
selected = ((IStructuredSelection) selection).toArray();
}
}
DartDocHelpContext.displayHelp(fContextId, selected);
} catch (CoreException x) {
DartToolsPlugin.log(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, String contextId) {
IStructuredSelection selection;
try {
selection = SelectionConverter.getStructuredSelection(part);
} catch (DartModelException ex) {
DartToolsPlugin.log(ex);
selection = StructuredSelection.EMPTY;
}
Object[] elements = selection.toArray();
return new JavaUIHelpContextProvider(contextId, elements);
}
public static void setHelp(DartEditor editor, StyledText text, String contextId) {
JavaUIHelpListener listener = new JavaUIHelpListener(editor, contextId);
text.addHelpListener(listener);
}
public static void setHelp(StructuredViewer viewer, String contextId) {
JavaUIHelpListener listener = new JavaUIHelpListener(viewer, contextId);
viewer.getControl().addHelpListener(listener);
}
}