blob: 04ea4c2c4077d97ad24e1b42527a9a5482782c2a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ant.internal.ui.editor.text;
import java.util.Iterator;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.AbstractFileSet;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.PatternSet;
import org.eclipse.ant.internal.ui.editor.AntEditor;
import org.eclipse.ant.internal.ui.editor.derived.HTMLPrinter;
import org.eclipse.ant.internal.ui.editor.derived.HTMLTextPresenter;
import org.eclipse.ant.internal.ui.editor.outline.AntModel;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IInformationControl;
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.ITextViewer;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
public class XMLTextHover implements ITextHover, ITextHoverExtension {
private AntEditor fEditor;
public XMLTextHover(AntEditor editor) {
super();
fEditor = editor;
}
/*
* Formats a message as HTML text.
*/
private String formatMessage(String message) {
StringBuffer buffer= new StringBuffer();
HTMLPrinter.addPageProlog(buffer);
HTMLPrinter.addParagraph(buffer, HTMLPrinter.convertToHTMLContent(message));
HTMLPrinter.addPageEpilog(buffer);
return buffer.toString();
}
/*
* Formats a message as HTML text.
*/
private String formatPathMessage(String[] list) {
StringBuffer buffer= new StringBuffer();
HTMLPrinter.addPageProlog(buffer);
HTMLPrinter.addSmallHeader(buffer, AntEditorTextMessages.getString("XMLTextHover.4")); //$NON-NLS-1$
HTMLPrinter.startBulletList(buffer);
for (int i = 0; i < list.length; i++) {
HTMLPrinter.addBullet(buffer, list[i]);
}
HTMLPrinter.endBulletList(buffer);
HTMLPrinter.addPageEpilog(buffer);
return buffer.toString();
}
/* (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) {
if (!(textViewer instanceof ISourceViewer)) {
return null;
}
ISourceViewer sourceViewer= (ISourceViewer) textViewer;
IAnnotationModel model= sourceViewer.getAnnotationModel();
if (model != null) {
Iterator e= new XMLAnnotationIterator(model, true);
while (e.hasNext()) {
Annotation a= (Annotation) e.next();
Position p= model.getPosition(a);
if (p.overlapsWith(hoverRegion.getOffset(), hoverRegion.getLength())) {
String msg= ((IXMLAnnotation) a).getMessage();
if (msg != null && msg.trim().length() > 0)
return formatMessage(msg);
}
}
}
AntModel antModel= fEditor.getAntModel();
try {
IDocument document= textViewer.getDocument();
int offset= hoverRegion.getOffset();
int length= hoverRegion.getLength();
String text= document.get(offset, length);
String value= antModel.getPropertyValue(text);
if (value != null) {
return formatMessage(value);
}
value= antModel.getTargetDescription(text);
if (value != null) {
return formatMessage(value);
}
Object referencedObject= antModel.getReferenceObject(text);
if (referencedObject != null) {
if (referencedObject instanceof Path) {
return formatPathMessage(((Path)referencedObject).list());
} else if (referencedObject instanceof PatternSet) {
return formatPatternSetMessage((PatternSet) referencedObject);
} else if (referencedObject instanceof AbstractFileSet) {
return formatFileSetMessage((AbstractFileSet)referencedObject);
}
}
} catch (BadLocationException e) {
} catch (BuildException be) {
antModel.handleBuildException(be, null);
}
return null;
}
private String formatFileSetMessage(AbstractFileSet set) {
FileScanner fileScanner= new FileScanner();
AntModel antModel= fEditor.getAntModel();
Project project= antModel.getProjectNode().getProject();
set.setupDirectoryScanner(fileScanner, project);
String[] excludedPatterns= fileScanner.getExcludesPatterns();
String[] includesPatterns= fileScanner.getIncludePatterns();
return formatSetMessage(includesPatterns, excludedPatterns);
}
private String formatPatternSetMessage(PatternSet set) {
AntModel antModel= fEditor.getAntModel();
Project project= antModel.getProjectNode().getProject();
String[] includes= set.getIncludePatterns(project);
String[] excludes= set.getExcludePatterns(project);
return formatSetMessage(includes, excludes);
}
private String formatSetMessage(String[] includes, String[] excludes) {
StringBuffer buffer= new StringBuffer();
HTMLPrinter.addPageProlog(buffer);
if (includes != null && includes.length > 0) {
HTMLPrinter.addSmallHeader(buffer, AntEditorTextMessages.getString("XMLTextHover.5")); //$NON-NLS-1$
for (int i = 0; i < includes.length; i++) {
HTMLPrinter.addBullet(buffer, includes[i]);
}
}
HTMLPrinter.addParagraph(buffer, ""); //$NON-NLS-1$
HTMLPrinter.addParagraph(buffer, ""); //$NON-NLS-1$
if (excludes != null && excludes.length > 0) {
HTMLPrinter.addSmallHeader(buffer, AntEditorTextMessages.getString("XMLTextHover.6")); //$NON-NLS-1$
for (int i = 0; i < excludes.length; i++) {
HTMLPrinter.addBullet(buffer, excludes[i]);
}
}
HTMLPrinter.addPageEpilog(buffer);
return buffer.toString();
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int)
*/
public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
IDocument document= textViewer.getDocument();
int start= -1;
int end= -1;
try {
int pos= offset;
char c;
while (pos >= 0) {
c= document.getChar(pos);
if (c != '.' && c != '-' && c != '/' && c != '\\' && !Character.isJavaIdentifierPart(c))
break;
--pos;
}
start= pos;
pos= offset;
int length= document.getLength();
while (pos < length) {
c= document.getChar(pos);
if (c != '.' && c != '-' && !Character.isJavaIdentifierPart(c))
break;
++pos;
}
end= pos;
} catch (BadLocationException x) {
}
if (start > -1 && end > -1) {
if (start == offset && end == offset)
return new Region(offset, 0);
else if (start == offset)
return new Region(start, end - start);
else
return new Region(start + 1, end - start - 1);
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.text.ITextHoverExtension#getInformationControlCreator()
*/
public IInformationControlCreator getInformationControlCreator() {
if (Platform.getPlugin("org.eclipse.jdt.ui").getPluginPreferences().getBoolean("PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE")) { //$NON-NLS-1$ //$NON-NLS-2$
return new IInformationControlCreator() {
public IInformationControl createInformationControl(Shell parent) {
return new DefaultInformationControl(parent, SWT.NONE,
new HTMLTextPresenter(true),
AntEditorTextMessages.getString("XMLTextHover.7")); //$NON-NLS-1$
}
};
}
return null;
}
}