/** * Copyright (c) 2016 by Brainwy Software LTDA. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.editor.hover; import java.io.IOException; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IInformationControlExtension3; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextHoverExtension; import org.eclipse.jface.text.ITextHoverExtension2; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.editors.text.EditorsUI; import org.python.pydev.core.IIndentPrefs; import org.python.pydev.core.docutils.PyStringUtils; import org.python.pydev.core.log.Log; import org.python.pydev.editor.PyEdit; import org.python.pydev.editor.PyInformationPresenter; import org.python.pydev.editor.autoedit.DefaultIndentPrefs; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.Str; import org.python.pydev.parser.prettyprinterv2.PrettyPrinterPrefsV2; import org.python.pydev.parser.prettyprinterv2.PrettyPrinterV2; import org.python.pydev.parser.visitors.NodeUtils; public abstract class AbstractPyEditorTextHover implements ITextHover, ITextHoverExtension, ITextHoverExtension2 { /** * The text selected */ protected ITextSelection textSelection; protected PyInformationPresenter informationPresenter; protected PyInformationControl informationControl; protected Integer hoverControlPreferredWidth; protected Integer hoverControlWidth = null; public final class PyInformationControl extends DefaultInformationControl implements IInformationControlExtension3 { private PyInformationControl(Shell parent, String statusFieldText, IInformationPresenter presenter) { super(parent, statusFieldText, presenter); } } public AbstractPyEditorTextHover() { informationPresenter = new PyInformationPresenter(); } /** * Specifies whether a given content type is supported for this Hover * @param contentType the content type * @return whether hover info should be rendered for this content type */ public abstract boolean isContentTypeSupported(String contentType); /* * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator() */ @Override public IInformationControlCreator getHoverControlCreator() { return new IInformationControlCreator() { @Override public IInformationControl createInformationControl(Shell parent) { String tooltipAffordanceString = null; try { tooltipAffordanceString = EditorsUI.getTooltipAffordanceString(); } catch (Throwable e) { //Not available on Eclipse 3.2 } informationControl = new PyInformationControl(parent, tooltipAffordanceString, informationPresenter); return informationControl; } }; } /* * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int) */ @Override public IRegion getHoverRegion(ITextViewer textViewer, int offset) { //we have to set it here (otherwise we don't have thread access to the UI) this.textSelection = (ITextSelection) textViewer.getSelectionProvider().getSelection(); return new Region(offset, 0); } /** * Copied from {@link PyTextHover} when that class was deprecated. */ public static String printAst(PyEdit edit, SimpleNode astToPrint) { String str = null; if (astToPrint != null) { IIndentPrefs indentPrefs; if (edit != null) { indentPrefs = edit.getIndentPrefs(); } else { indentPrefs = DefaultIndentPrefs.get(null); } Str docStr = NodeUtils.getNodeDocStringNode(astToPrint); if (docStr != null) { docStr.s = PyStringUtils.fixWhitespaceColumnsToLeftFromDocstring(docStr.s, indentPrefs.getIndentationString()); } PrettyPrinterPrefsV2 prefsV2 = PrettyPrinterV2.createDefaultPrefs(edit, indentPrefs, PyInformationPresenter.LINE_DELIM); PrettyPrinterV2 prettyPrinterV2 = new PrettyPrinterV2(prefsV2); try { str = prettyPrinterV2.print(astToPrint); } catch (IOException e) { Log.log(e); } } return str; } /* * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) * @since 3.4 */ @Override @SuppressWarnings("deprecation") public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { return getHoverInfo(textViewer, hoverRegion); } /** * Add a listener to resize events on the information presented control. * @param listener the resize listener */ public void addInformationPresenterControlListener(ControlListener listener) { if (informationPresenter != null) { informationPresenter.addResizeCallback(listener); } } /** * Set the preferred width of the Hover control. * @param width the preferred width */ public void setHoverControlPreferredWidth(int width) { this.hoverControlPreferredWidth = width; } /** * Get the preferred width of the Hover control. * @return the preferred width */ public Integer getHoverControlPreferredWidth() { return this.hoverControlPreferredWidth; } }