/*******************************************************************************
* Copyright (c) 2000, 2008 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 com.redhat.ceylon.eclipse.code.hover;
import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.hoverJ2C;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.IInformationControlCreator;
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 com.redhat.ceylon.eclipse.code.editor.CeylonEditor;
import com.redhat.ceylon.eclipse.core.debug.hover.CeylonDebugHover;
import com.redhat.ceylon.ide.common.doc.DocGenerator;
/**
* Caution: this implementation is a layer breaker and
* contains some "shortcuts"
*/
public class BestMatchHover
implements ITextHover, ITextHoverExtension,
ITextHoverExtension2 {
private CeylonEditor editor;
private List<ITextHover> hovers;
private ITextHover bestHover;
public BestMatchHover(CeylonEditor editor) {
this.editor = editor;
installTextHovers();
}
private void installTextHovers() {
hovers = new ArrayList<ITextHover>(2);
hovers.add(new CeylonDebugHover(editor));
hovers.add(new AnnotationHover(editor, false));
//fInstantiatedTextHovers.add(new DocumentationHover(editor));
hovers.add(hoverJ2C()
.newEclipseDocGeneratorAsSourceInfoHover(editor));
}
@Override
@Deprecated
public String getHoverInfo(ITextViewer textViewer,
IRegion hoverRegion) {
bestHover = null;
if (hovers == null) {
return null;
}
for (ITextHover hover: hovers) {
if (hover instanceof CeylonDebugHover) {
CeylonDebugHover debugHover =
(CeylonDebugHover) hover;
if (debugHover.isEnabled()) {
continue;
}
}
String string =
hover.getHoverInfo(textViewer,
hoverRegion);
if (string!=null && !string.trim().isEmpty()) {
bestHover = hover;
return string;
}
}
return null;
}
@Override
public Object getHoverInfo2(ITextViewer textViewer,
IRegion hoverRegion) {
return getHoverInfo2(textViewer, hoverRegion, false);
}
public Object getHoverInfo2(ITextViewer textViewer,
IRegion hoverRegion, boolean forInformationProvider) {
bestHover = null;
if (hovers == null) {
return null;
}
for (ITextHover hover: hovers) {
if (hover instanceof CeylonDebugHover) {
CeylonDebugHover debugHover =
(CeylonDebugHover) hover;
if (!debugHover.isEnabled()) {
continue;
}
}
if (hover instanceof ITextHoverExtension2) {
ITextHoverExtension2 hoverExt2 =
(ITextHoverExtension2) hover;
Object info =
hoverExt2.getHoverInfo2(textViewer,
hoverRegion);
if (info!=null) {
if (!forInformationProvider ||
getInformationPresenterControlCreator(hover)!=null) {
bestHover = hover;
return info;
}
}
}
else {
@SuppressWarnings("deprecation")
String text =
hover.getHoverInfo(textViewer,
hoverRegion);
if (text!=null && text.trim().length()>0) {
bestHover = hover;
return text;
}
}
}
return null;
}
@Override
public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
return SourceInfoHover.findWord(textViewer, offset);
}
@Override
public IInformationControlCreator getHoverControlCreator() {
if (bestHover instanceof ITextHoverExtension) {
ITextHoverExtension hoverExt =
(ITextHoverExtension) bestHover;
return hoverExt.getHoverControlCreator();
}
else {
return null;
}
}
public IInformationControlCreator getInformationPresenterControlCreator() {
return getInformationPresenterControlCreator(bestHover);
}
private static IInformationControlCreator
getInformationPresenterControlCreator(ITextHover hover) {
// if (hover instanceof DocumentationHover) {
// DocumentationHover documentationHover =
// (DocumentationHover) hover;
// return documentationHover.getInformationPresenterControlCreator();
// }
if (hover instanceof DocGenerator) {
DocGenerator docGenerator =
(DocGenerator) hover;
return hoverJ2C()
.getInformationPresenterControlCreator(
docGenerator);
}
else {
return null;
}
}
}