/**
* Aptana Studio
* Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license-epl.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.editor.php.internal.ui.hover;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.action.ToolBarManager;
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.jface.text.information.IInformationProviderExtension2;
import org.eclipse.ui.IEditorPart;
import com.aptana.editor.common.hover.AbstractDocumentationHover;
import com.aptana.editor.common.hover.CustomBrowserInformationControl;
import com.aptana.editor.php.PHPEditorPlugin;
/**
* Best match hover information provider.<br>
* This provider will try several hover contributers until a valid information is retrieved.
*
* @author Shalom Gibly <sgibly@aptana.com>
*/
public class PHPBestMatchHover extends AbstractPHPTextHover
{
private static final String DEBUG_HOVER_ID = "com.aptana.php.debug.debugHover"; //$NON-NLS-1$
private List<PHPTextHoverDescriptor> textHoverDescriptors;
private List<AbstractPHPTextHover> instantiatedTextHovers;
private AbstractPHPTextHover bestHover;
/**
* Constructs a new best match text hover.
*/
public PHPBestMatchHover()
{
this.textHoverDescriptors = PHPHoverRegistry.getInstance().getTextHoversDescriptors();
this.instantiatedTextHovers = new ArrayList<AbstractPHPTextHover>(this.textHoverDescriptors.size());
}
/*
* (non-Javadoc)
* @see
* com.aptana.editor.php.internal.ui.hover.AbstractPHPTextHover#getHoverInfo2(org.eclipse.jface.text.ITextViewer,
* org.eclipse.jface.text.IRegion)
*/
public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion)
{
checkHovers();
for (AbstractPHPTextHover hover : instantiatedTextHovers)
{
hover.setEditor(getEditor());
Object info = hover.getHoverInfo2(textViewer, hoverRegion);
if (info != null)
{
bestHover = hover;
return info;
}
}
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer,
* org.eclipse.jface.text.IRegion)
*/
public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion)
{
Object info = getHoverInfo2(textViewer, hoverRegion);
if (info != null)
{
return info.toString();
}
return null;
}
/*
* (non-Javadoc)
* @see com.aptana.editor.php.internal.ui.hover.AbstractPHPTextHover#getHoverControlCreator()
*/
public IInformationControlCreator getHoverControlCreator()
{
if (bestHover instanceof ITextHoverExtension)
{
return ((ITextHoverExtension) bestHover).getHoverControlCreator();
}
return super.getHoverControlCreator();
}
/*
* (non-Javadoc)
* @see com.aptana.editor.php.internal.ui.hover.AbstractPHPTextHover#getInformationPresenterControlCreator()
*/
public IInformationControlCreator getInformationPresenterControlCreator()
{
if (bestHover instanceof IInformationProviderExtension2)
{
return ((IInformationProviderExtension2) bestHover).getInformationPresenterControlCreator();
}
return super.getInformationPresenterControlCreator();
}
/**
* Check that we have instances of the text hovers. In case we don't have an instance for a descriptor that we have,
* we check if we can instantiate it, and then decide whether or not to create it. This is done to avoid any
* unnecessary plug-in loading.
*/
protected void checkHovers()
{
for (PHPTextHoverDescriptor descriptor : new ArrayList<PHPTextHoverDescriptor>(textHoverDescriptors))
{
try
{
AbstractPHPTextHover hover = descriptor.createTextHover();
if (hover != null)
{
// Make sure that the debug-hover is first.
if (DEBUG_HOVER_ID.equals(descriptor.getId()))
{
instantiatedTextHovers.add(0, hover);
}
else
{
instantiatedTextHovers.add(hover);
}
textHoverDescriptors.remove(descriptor);
}
}
catch (Exception e)
{
PHPEditorPlugin.logError(e);
}
}
}
/*
* (non-Javadoc)
* @see com.aptana.editor.common.hover.AbstractDocumentationHover#getHeader(java.lang.Object,
* org.eclipse.ui.IEditorPart, org.eclipse.jface.text.IRegion)
*/
@Override
public String getHeader(Object element, IEditorPart editorPart, IRegion hoverRegion)
{
if (bestHover instanceof AbstractDocumentationHover)
{
return ((AbstractDocumentationHover) bestHover).getHeader(element, editorPart, hoverRegion);
}
return null;
}
/*
* (non-Javadoc)
* @see com.aptana.editor.common.hover.AbstractDocumentationHover#getDocumentation(java.lang.Object,
* org.eclipse.ui.IEditorPart, org.eclipse.jface.text.IRegion)
*/
@Override
public String getDocumentation(Object element, IEditorPart editorPart, IRegion hoverRegion)
{
if (bestHover instanceof AbstractDocumentationHover)
{
return ((AbstractDocumentationHover) bestHover).getDocumentation(element, editorPart, hoverRegion);
}
return null;
}
/*
* (non-Javadoc)
* @see com.aptana.editor.common.hover.AbstractDocumentationHover#populateToolbarActions(org.eclipse.jface.action.
* ToolBarManager, com.aptana.editor.common.hover.CustomBrowserInformationControl)
*/
@Override
public void populateToolbarActions(ToolBarManager tbm, CustomBrowserInformationControl iControl)
{
if (bestHover instanceof AbstractDocumentationHover)
{
((AbstractDocumentationHover) bestHover).populateToolbarActions(tbm, iControl);
}
}
@Override
public String getFileLocation(Object element, IEditorPart editorPart, IRegion hoverRegion)
{
return null;
}
@Override
public Map<String, String> getUserAgent(Object element, IEditorPart editorPart, IRegion hoverRegion)
{
return null;
}
@Override
public String getShowImage(Object element, IEditorPart editorPart, IRegion hoverRegion)
{
return null;
}
@Override
public String getBook(Object element, IEditorPart editorPart, IRegion hoverRegion)
{
return null;
}
}