/*******************************************************************************
* Copyright (c) 2000, 2007 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
*
*******************************************************************************/
package org.eclipse.dltk.ui.text.completion;
import java.io.IOException;
import java.io.Reader;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.documentation.ScriptDocumentationAccess;
public class ProposalInfo implements ICompletionProposalInfo {
private boolean fScriptdocResolved = false;
private String fScriptdoc = null;
protected IModelElement fElement;
protected String fKeyword;
public ProposalInfo(IModelElement member) {
fElement = member;
}
public ProposalInfo(IScriptProject scriptProject, String keyword) {
fElement = scriptProject;
fKeyword = keyword;
}
protected ProposalInfo() {
}
public IModelElement getModelElement() throws ModelException {
return fElement;
}
public Object getForeignElement() {
return null;
}
public String getKeyword() {
return fKeyword;
}
/**
* Gets the text for this proposal info formatted as HTML, or
* <code>null</code> if no text is available.
*
* @param monitor
* a progress monitor
* @return the additional info text
*/
public String getInfo(IProgressMonitor monitor) {
// if (hackMessage != null){
// return hackMessage;
// }
if (!fScriptdocResolved) {
fScriptdocResolved = true;
fScriptdoc = computeInfo(monitor);
}
return fScriptdoc;
}
/**
* Gets the text for this proposal info formatted as HTML, or
* <code>null</code> if no text is available.
*
* @param monitor
* a progress monitor
* @return the additional info text
*/
private String computeInfo(IProgressMonitor monitor) {
try {
final String keyword = getKeyword();
if (keyword != null) {
return extractScriptdoc(keyword);
}
final IModelElement modelElement = getModelElement();
if (modelElement instanceof IMember) {
IMember member = (IMember) modelElement;
return extractScriptdoc(member, monitor);
}
final Object foreignElement = getForeignElement();
if (foreignElement != null) {
return extractScriptdoc(foreignElement, monitor);
}
} catch (ModelException e) {
DLTKUIPlugin.log(e);
} catch (IOException e) {
DLTKUIPlugin.log(e);
}
return null;
}
private String extractScriptdoc(String content) throws ModelException,
IOException {
if (content == null || fElement == null) {
return null;
}
final IDLTKLanguageToolkit toolkit = DLTKLanguageManager
.getLanguageToolkit(fElement);
if (toolkit == null) {
return null;
}
final Reader reader = ScriptDocumentationAccess
.getKeywordDocumentation(toolkit.getNatureId(), fElement,
content);
if (reader == null) {
return null;
}
final StringBuffer buffer = new StringBuffer();
HTMLPrinter.addParagraph(buffer, reader);
if (buffer.length() == 0) {
if (!HTMLPrinter.hasEpilog(buffer)) {
HTMLPrinter.addPageEpilog(buffer);
}
return buffer.toString();
}
return null;
}
/**
* Extracts the javadoc for the given <code>IMember</code> and returns it as
* HTML.
*
* @param member
* the member to get the documentation for
* @param monitor
* a progress monitor
* @return the javadoc for <code>member</code> or <code>null</code> if it is
* not available
* @throws ModelException
* if accessing the javadoc fails
* @throws IOException
* if reading the javadoc fails
*/
private String extractScriptdoc(IMember member, IProgressMonitor monitor)
throws ModelException, IOException {
if (member != null) {
Reader reader = getHTMLContentReader(member, monitor);
if (reader != null)
return getString(reader);
}
return null;
}
private String extractScriptdoc(Object member, IProgressMonitor monitor)
throws ModelException, IOException {
if (member != null) {
Reader reader = getHTMLContentReader(member, monitor);
if (reader != null)
return getString(reader);
}
return null;
}
private Reader getHTMLContentReader(IMember member, IProgressMonitor monitor)
throws ModelException {
String nature = null;
IDLTKLanguageToolkit languageToolkit = DLTKLanguageManager
.getLanguageToolkit(member);
if (languageToolkit == null) {
return null;
}
nature = languageToolkit.getNatureId();
if (nature == null)
return null;
return ScriptDocumentationAccess.getHTMLContentReader(nature, member,
true, false);
}
private Reader getHTMLContentReader(Object member, IProgressMonitor monitor)
throws ModelException {
IDLTKLanguageToolkit[] languageToolkits = DLTKLanguageManager
.getLanguageToolkits();
for (IDLTKLanguageToolkit idltkLanguageToolkit : languageToolkits) {
Reader reader = ScriptDocumentationAccess.getHTMLContentReader(
idltkLanguageToolkit.getNatureId(), member, true, false);
if (reader != null) {
return reader;
}
}
return null;
}
/**
* Gets the reader content as a String
*/
private static String getString(Reader reader) {
StringBuffer buf = new StringBuffer();
char[] buffer = new char[1024];
int count;
try {
while ((count = reader.read(buffer)) != -1)
buf.append(buffer, 0, count);
} catch (IOException e) {
return null;
}
return buf.toString();
}
}