blob: 0ccaebb0510ed1a2e1e01ad97b3e764c8a37cf62 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.text.hover;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.ICodeAssist;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.ui.editor.EditorUtility;
import org.eclipse.dltk.internal.ui.text.HTMLTextPresenter;
import org.eclipse.dltk.internal.ui.text.ScriptWordFinder;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.IWorkingCopyManager;
import org.eclipse.dltk.ui.PreferenceConstants;
import org.eclipse.dltk.ui.text.completion.HTMLPrinter;
import org.eclipse.dltk.ui.text.hover.IScriptEditorTextHover;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.editors.text.EditorsUI;
import org.osgi.framework.Bundle;
/**
* Abstract class for providing hover information for Script elements.
*/
public abstract class AbstractScriptEditorTextHover implements
IScriptEditorTextHover, ITextHoverExtension {
/**
* The style sheet (css).
*/
private static String fgCSSStyles;
private IEditorPart fEditor;
private IPreferenceStore fStore;
public void setPreferenceStore(IPreferenceStore store) {
fStore = store;
}
/**
* @return the fStore
*/
protected IPreferenceStore getPreferenceStore() {
return fStore;
}
public void setEditor(IEditorPart editor) {
fEditor = editor;
}
protected IEditorPart getEditor() {
return fEditor;
}
protected ICodeAssist getCodeAssist() {
if (fEditor != null) {
IEditorInput input = fEditor.getEditorInput();
IWorkingCopyManager manager = DLTKUIPlugin.getDefault()
.getWorkingCopyManager();
return manager.getWorkingCopy(input, false);
}
return null;
}
public IRegion getHoverRegion(final ITextViewer textViewer, int offset) {
// final IRegion[] result = new IRegion[] { ScriptWordFinder.findWord(
// textViewer.getDocument(), offset) };
//
// textViewer.getTextWidget().getDisplay().syncExec(new Runnable() {
// public void run() {
// Point selection = textViewer.getSelectedRange();
// int off = selection.x;
// int len = selection.y;
//
// if (len > 0) {
// result[0] = new Region(off, len);
// }
// }
// });
//
// return result[0];
return ScriptWordFinder.findWord(textViewer.getDocument(), offset);
}
public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
String nature = null;
try {
IModelElement inputModelElement = EditorUtility
.getEditorInputModelElement(this.fEditor, false);
if (inputModelElement == null)
return null;
IDLTKLanguageToolkit toolkit = DLTKLanguageManager
.getLanguageToolkit(inputModelElement);
if (toolkit == null) {
return null;
}
nature = toolkit.getNatureId();
} catch (CoreException e) {
return null;
}
if (nature == null) {
return null;
}
ICodeAssist resolve = getCodeAssist();
if (resolve != null) {
try {
String content = null;
try {
content = textViewer.getDocument().get(
hoverRegion.getOffset(), hoverRegion.getLength());
} catch (BadLocationException e) {
}
IModelElement[] result = resolve.codeSelect(hoverRegion
.getOffset(), hoverRegion.getLength());
if (result == null) {
return null;
}
int nResults = result.length;
if (nResults == 0) {
if (content != null) {
return getHoverInfo(nature, content);
}
return null;
}
return getHoverInfo(nature, result);
} catch (ModelException x) {
return null;
}
}
return null;
}
/**
* Provides hover information for the given Script elements.
*
* @param modelElements
* the Script elements for which to provide hover information
* @return the hover information string
*
*/
protected String getHoverInfo(String nature, IModelElement[] modelElements) {
return null;
}
/**
* Provides hover information for the keyword.
*
* @param content
* text of the keyword
* @return the hover information string
*
*/
protected String getHoverInfo(String nature, String content) {
return null;
}
public IInformationControlCreator getHoverControlCreator() {
return new IInformationControlCreator() {
public IInformationControl createInformationControl(Shell parent) {
return new DefaultInformationControl(parent, SWT.NONE,
new HTMLTextPresenter(true),
EditorsUI.getTooltipAffordanceString());
}
};
}
/**
* Returns the tool tip affordance string.
*
* @return the affordance string or <code>null</code> if disabled or no
* key binding is defined
*
*/
// protected String getTooltipAffordanceString() {
// if (this.getPreferenceStore() == null) {
// return "{0}";
// }
// if (fBindingService == null
// || !getPreferenceStore().getBoolean(
// PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE))
// return null;
//
// String keySequence = fBindingService
// .getBestActiveBindingFormattedFor(IScriptEditorActionDefinitionIds.SHOW_DOCUMENTATION);
// if (keySequence == null)
// return null;
//
// return Messages.format(
// ScriptHoverMessages.ScriptTextHover_makeStickyHint,
// keySequence == null ? "" : keySequence); //$NON-NLS-1$
// }
/**
* Returns the style sheet.
*
*
*/
protected static String getStyleSheet() {
if (fgCSSStyles == null) {
Bundle bundle = Platform.getBundle(DLTKUIPlugin.getPluginId());
URL url = bundle.getEntry("/DocumentationHoverStyleSheet.css"); //$NON-NLS-1$
if (url != null) {
try {
url = FileLocator.toFileURL(url);
BufferedReader reader = new BufferedReader(
new InputStreamReader(url.openStream()));
StringBuffer buffer = new StringBuffer(200);
String line = reader.readLine();
while (line != null) {
buffer.append(line);
buffer.append('\n');
line = reader.readLine();
}
fgCSSStyles = buffer.toString();
} catch (IOException ex) {
DLTKUIPlugin.log(ex);
}
}
}
String css = fgCSSStyles;
if (css != null) {
FontData fontData = JFaceResources.getFontRegistry().getFontData(
PreferenceConstants.APPEARANCE_DOCUMENTATION_FONT)[0];
css = HTMLPrinter.convertTopLevelFont(css, fontData);
}
return css;
}
}