/******************************************************************************* * Copyright (c) 2010, 2011 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.jdt.internal.ui.propertiesfileeditor; import org.eclipse.swt.widgets.Shell; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.AbstractReusableInformationControlCreator; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadPartitioningException; import org.eclipse.jface.text.DefaultInformationControl; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension3; import org.eclipse.jface.text.IInformationControl; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IInformationControlExtension2; 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.ITextViewer; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.ui.editors.text.EditorsUI; import org.eclipse.jdt.internal.ui.JavaPlugin; /** * Provides the default text hover info if it exists, else provides the native string as hover info. * * @since 3.7 */ public class PropertiesFileHover implements ITextHover, ITextHoverExtension, ITextHoverExtension2 { /** * The offset for which the hover request has been issued. */ private int fOffset; /** * The default text hover. */ private final ITextHover fTextHover; /** * The hover control creator. */ private HoverControlCreator fHoverControlCreator; public PropertiesFileHover(ITextHover textHover) { fTextHover= textHover; } /** * Hover control creator. * * @since 3.7 */ private static final class HoverControlCreator extends AbstractReusableInformationControlCreator { /* * @see org.eclipse.jdt.internal.ui.text.java.hover.AbstractReusableInformationControlCreator#doCreateInformationControl(org.eclipse.swt.widgets.Shell) */ @Override public IInformationControl doCreateInformationControl(Shell parent) { return new PropertiesFileHoverControl(parent, EditorsUI.getTooltipAffordanceString()); } } /** * The Properties File hover control. * * @since 3.7 */ static class PropertiesFileHoverControl extends DefaultInformationControl implements IInformationControlExtension2 { /** * Creates an Properties File hover control with the given shell as parent. * * @param parent the parent shell * @param tooltipAffordanceString the text to be used in the status field or * <code>null</code> to hide the status field */ public PropertiesFileHoverControl(Shell parent, String tooltipAffordanceString) { super(parent, tooltipAffordanceString, null); } /* * (non-Javadoc) * @see org.eclipse.jface.text.IInformationControlExtension2#setInput(java.lang.Object) */ public void setInput(Object input) { setInformation((String)input); } } /* * (non-Javadoc) * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) */ public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { return getHoverInfo(textViewer, hoverRegion); } /* * (non-Javadoc) * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator() */ public IInformationControlCreator getHoverControlCreator() { if (fHoverControlCreator == null) fHoverControlCreator= new HoverControlCreator(); return fHoverControlCreator; } /** * {@inheritDoc} * @deprecated see {@link ITextHover#getHoverInfo(ITextViewer, IRegion)} */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { String hoverInfo= fTextHover.getHoverInfo(textViewer, hoverRegion); if (hoverInfo != null && hoverInfo.length() > 0) { return hoverInfo; } String unescapedString= null; try { ITypedRegion partition= null; IDocument document= textViewer.getDocument(); if (document instanceof IDocumentExtension3) partition= ((IDocumentExtension3)document).getPartition(IPropertiesFilePartitions.PROPERTIES_FILE_PARTITIONING, fOffset, false); if (partition == null) return null; String type= partition.getType(); if (!(type.equals(IPropertiesFilePartitions.PROPERTY_VALUE) || type.equals(IDocument.DEFAULT_CONTENT_TYPE))) { return null; } String escapedString= document.get(partition.getOffset(), partition.getLength()); if (type.equals(IPropertiesFilePartitions.PROPERTY_VALUE)) { escapedString= escapedString.substring(1); //see PropertiesFilePartitionScanner() } try { unescapedString= PropertiesFileEscapes.unescape(escapedString); } catch (CoreException e) { return e.getStatus().getMessage(); } if (escapedString.equals(unescapedString)) return null; } catch (BadLocationException e) { JavaPlugin.log(e); } catch (BadPartitioningException e) { JavaPlugin.log(e); } return unescapedString; } /* * (non-Javadoc) * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int) */ public IRegion getHoverRegion(ITextViewer textViewer, int offset) { fOffset= offset; return fTextHover.getHoverRegion(textViewer, offset); } }