blob: 6e0095aad524d63161e03a39af2ecbd6c6893d65 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.ant.debugger;
import java.io.IOException;
import javax.swing.JEditorPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.StyledDocument;
import org.netbeans.api.debugger.DebuggerEngine;
import org.openide.cookies.EditorCookie;
import org.openide.loaders.DataObject;
import org.openide.text.Annotation;
import org.openide.text.DataEditorSupport;
import org.openide.text.Line;
import org.openide.text.NbDocument;
import org.openide.text.Line.Part;
import org.openide.util.RequestProcessor;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.spi.debugger.ui.EditorContextDispatcher;
public class ToolTipAnnotation extends Annotation implements Runnable {
private Part lp;
private EditorCookie ec;
@Override
public String getShortDescription () {
DebuggerEngine currentEngine = DebuggerManager.getDebuggerManager ().
getCurrentEngine ();
if (currentEngine == null) return null;
AntDebugger d = currentEngine.lookupFirst(null, AntDebugger.class);
if (d == null) return null;
Part lp = (Part)
getAttachedAnnotatable();
if (lp == null) return null;
Line line = lp.getLine ();
DataObject dob = DataEditorSupport.findDataObject (line);
if (dob == null) return null;
EditorCookie ec = dob.getLookup().lookup(EditorCookie.class);
if (ec == null) return null;
this.lp = lp;
this.ec = ec;
RequestProcessor.getDefault ().post (this);
return null;
}
@Override
public void run () {
//if (expression == null) return;
if (lp == null || ec == null) return ;
StyledDocument doc;
try {
doc = ec.openDocument();
} catch (IOException ex) {
return ;
}
JEditorPane ep = EditorContextDispatcher.getDefault().getCurrentEditor();
if (ep == null) return ;
String expression = getIdentifier (
doc,
ep,
NbDocument.findLineOffset (
doc,
lp.getLine ().getLineNumber ()
) + lp.getColumn ()
);
if (expression == null) return ;
DebuggerEngine currentEngine = DebuggerManager.getDebuggerManager ().
getCurrentEngine ();
if (currentEngine == null) return;
AntDebugger d = currentEngine.lookupFirst(null, AntDebugger.class);
if (d == null) return;
String value = d.evaluate (expression);
if ( value == null ||
value.equals (expression)
) return;
String toolTipText = expression + " = " + value;
firePropertyChange (PROP_SHORT_DESCRIPTION, null, toolTipText);
}
@Override
public String getAnnotationType () {
return null; // Currently return null annotation type
}
private static String getIdentifier (
StyledDocument doc,
JEditorPane ep,
int offset
) {
String t = null;
if ( (ep.getSelectionStart () <= offset) &&
(offset <= ep.getSelectionEnd ())
) t = ep.getSelectedText ();
if (t != null) return t;
int line = NbDocument.findLineNumber (
doc,
offset
);
int col = NbDocument.findLineColumn (
doc,
offset
);
try {
Element lineElem =
NbDocument.findLineRootElement (doc).
getElement (line);
if (lineElem == null) return null;
int lineStartOffset = lineElem.getStartOffset ();
int lineLen = lineElem.getEndOffset() - lineStartOffset;
t = doc.getText (lineStartOffset, lineLen);
lineLen = t.length ();
int identStart = col;
while ( (identStart > 0) &&
(t.charAt (identStart - 1) != '"')
) {
identStart--;
}
int identEnd = Math.max (col, 1);
while ( (identEnd < lineLen) &&
(t.charAt (identEnd - 1) != '"')
) {
identEnd++;
}
if (identStart == identEnd) return null;
return t.substring (identStart, identEnd - 1);
} catch (BadLocationException e) {
return null;
}
}
}