package org.chartsy.stockscanpro.completion;
import javax.swing.text.AbstractDocument;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
import org.chartsy.stockscanpro.lexer.api.ScanTokenId;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.lexer.InputAttributes;
import org.netbeans.api.lexer.Language;
import org.netbeans.api.lexer.LanguagePath;
import org.netbeans.api.lexer.TokenHierarchy;
import org.netbeans.api.lexer.TokenSequence;
import org.netbeans.modules.editor.NbEditorUtilities;
import org.openide.filesystems.FileObject;
/**
*
* @author Viorel
*/
public final class CompletionUtilities
{
private CompletionUtilities()
{}
public static TokenSequence<ScanTokenId> getScanTokenSequence(final TokenHierarchy hierarchy, final int offset)
{
if (hierarchy != null)
{
TokenSequence<?> ts = hierarchy.tokenSequence();
while(ts != null && (offset == 0 || ts.moveNext()))
{
ts.move(offset);
if (ts.language() == ScanTokenId.language())
return (TokenSequence<ScanTokenId>)ts;
if (!ts.moveNext() && !ts.movePrevious())
return null;
ts = ts.embedded();
}
}
return null;
}
public static boolean isScanContext(final JTextComponent component, final int offset)
{
Document doc = component.getDocument();
if (doc instanceof AbstractDocument)
((AbstractDocument)doc).readLock();
try
{
if (doc.getLength() == 0 && "text/x-dialog-binding".equals(doc.getProperty("mimeType")))
{
InputAttributes attributes = (InputAttributes) doc.getProperty(InputAttributes.class);
LanguagePath path = LanguagePath.get(MimeLookup.getLookup("text/x-dialog-binding").lookup(Language.class));
Document d = (Document) attributes.getValue(path, "dialogBinding.document");
if (d != null)
return "text/x-scan".equals(NbEditorUtilities.getMimeType(d));
FileObject fo = (FileObject)attributes.getValue(path, "dialogBinding.fileObject");
return "text/x-scan".equals(fo.getMIMEType());
}
TokenSequence<ScanTokenId> ts = getScanTokenSequence(TokenHierarchy.get(doc), offset);
if (ts == null)
return false;
if (!ts.moveNext() && !ts.movePrevious())
return true;
if (offset == ts.offset())
return true;
switch(ts.token().id())
{
case DOUBLE_LITERAL:
if (ts.token().text().charAt(0) == '.')
break;
case FLOAT_LITERAL:
case FLOAT_LITERAL_INVALID:
case INT_LITERAL:
case LONG_LITERAL:
return false;
}
return true;
}
finally
{
if (doc instanceof AbstractDocument)
((AbstractDocument) doc).readUnlock();
}
}
}