|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.editor;
import javax.swing.text.JTextComponent;
import javax.swing.text.StyledDocument;
import javax.swing.text.BadLocationException;
import org.openide.filesystems.FileChangeAdapter;
import org.openide.filesystems.FileObject;
import org.openide.text.Annotation;
import org.openide.text.Line;
import java.io.IOException;
import java.util.HashMap;
import org.netbeans.editor.ext.ToolTipSupport;
import org.openide.loaders.DataObjectNotFoundException;
import org.netbeans.editor.BaseDocument;
import org.netbeans.editor.Utilities;
import org.netbeans.editor.Annotations;
import org.netbeans.editor.AnnotationDesc;
import org.netbeans.editor.ext.ExtEditorUI;
import org.netbeans.editor.ext.ExtUtilities;
import java.beans.PropertyChangeListener;
import org.openide.cookies.EditorCookie;
import org.openide.loaders.DataObject;
import org.openide.cookies.InstanceCookie;
import java.util.Enumeration;
import java.util.ArrayList;
import java.beans.PropertyChangeEvent;
import javax.swing.plaf.TextUI;
import org.netbeans.editor.BaseTextUI;
import org.openide.filesystems.Repository;
/**
* ToolTip annotations reading and refreshing
*
* @author Miloslav Metelka
* @version 1.00
*/
public class NbToolTip extends FileChangeAdapter {
private static final boolean debug = Boolean.getBoolean("netbeans.debug.editor.tooltip");
private static final HashMap mime2tip = new HashMap();
private String mimeType;
private Annotation[] tipAnnotations;
static synchronized void buildToolTip(JTextComponent target) {
String mimeType = NbEditorUtilities.getMimeType(target.getDocument());
NbToolTip tip = getTip(mimeType);
tip.buildTip(target);
}
private NbToolTip(String mimeType) {
this.mimeType = mimeType;
}
private static NbToolTip getTip(String mimeType) {
NbToolTip tip = (NbToolTip)mime2tip.get(mimeType);
if (tip == null) {
tip = new NbToolTip(mimeType);
mime2tip.put(mimeType, tip);
}
return tip;
}
private Annotation[] getTipAnnotations() {
Annotation[] annos;
synchronized (NbToolTip.class) {
annos = tipAnnotations;
}
if (annos == null) {
if (debug) {
System.err.println("Searching for tooltip annotations for mimeType=" + mimeType);
}
FileObject annoFolder = Repository.getDefault().getDefaultFileSystem().
findResource("Editors/" + mimeType + "/ToolTips"); //NOI18N
if (debug) {
System.err.println("tooltip annotation folder=" + annoFolder);
}
if (annoFolder != null) {
ArrayList al = new ArrayList();
Enumeration en = annoFolder.getChildren(false);
while (en.hasMoreElements()) {
FileObject fo = (FileObject)en.nextElement();
if (debug) {
System.err.println("tooltip annotation fileobject=" + fo);
}
try {
DataObject dob = DataObject.find(fo);
InstanceCookie ic = (InstanceCookie)dob.getCookie(InstanceCookie.class);
if (debug) {
System.err.println("tooltip annotation instanceCookie=" + ic);
}
if (ic != null) {
Object a = ic.instanceCreate();
if (debug) {
System.err.println("tooltip annotation instance=" + a);
}
if (a instanceof Annotation) {
if (debug) {
System.err.println("Found tooltip annotation=" + a
+ ", class " + a.getClass() // NOI18N
+ " for mimeType=" + mimeType // NOI18N
);
}
al.add(a);
}
}
} catch (DataObjectNotFoundException e) {
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
}
annos = (Annotation[])al.toArray(new Annotation[al.size()]);
synchronized (NbToolTip.class) {
tipAnnotations = annos;
}
annoFolder.addFileChangeListener(this);
}
}
return annos;
}
private void buildTip(JTextComponent target) {
TextUI textUI = target.getUI();
if (textUI!=null && textUI instanceof BaseTextUI){
BaseTextUI btui = (BaseTextUI)textUI;
ExtEditorUI editorUI = (ExtEditorUI)btui.getEditorUI();
ToolTipSupport tts = editorUI.getToolTipSupport();
String toolTipText = btui.getToolTipText(target, tts.getLastMouseEvent().getPoint());
if (toolTipText!=null){
return;
}
}
Annotation[] annos = getTipAnnotations();
if (annos != null) {
ExtEditorUI ui = ExtUtilities.getExtEditorUI(target);
if (ui != null) {
ToolTipSupport tts = ui.getToolTipSupport();
if (tts != null) {
BaseDocument doc = Utilities.getDocument(target);
if (doc != null) {
DataObject dob = NbEditorUtilities.getDataObject(doc);
if (dob != null) {
EditorCookie ec = (EditorCookie)dob.getCookie(EditorCookie.class);
if (ec != null) {
StyledDocument openedDoc;
try {
openedDoc = ec.openDocument();
} catch (IOException e) {
openedDoc = null; // should return in next if stmt
}
if (openedDoc != doc) { // doc has changed in meantime
return;
}
// partial fix of #33165 - read-locking of the document added
doc.readLock();
try {
int offset = target.viewToModel(tts.getLastMouseEvent().getPoint());
if (offset >= 0) {
try {
int line = Utilities.getLineOffset(doc, offset);
int col = offset - Utilities.getRowStart(target, offset);
Line.Set ls = ec.getLineSet();
if (ls != null) {
Line l = ls.getCurrent(line);
if (l != null) {
Line.Part lp = l.createPart(col, 0);
if (lp != null) {
AnnotationDesc annoDesc = doc.getAnnotations().getActiveAnnotation(line);
if (annoDesc != null && ((offset < annoDesc.getOffset() || offset >= annoDesc.getOffset() + annoDesc.getLength()))) {
annoDesc = null;
}
new Request(annoDesc, annos, lp, tts).run();
}
}
}
} catch (BadLocationException e) {
}
}
} finally {
doc.readUnlock();
}
}
}
}
}
}
}
}
private static class Request implements Runnable, PropertyChangeListener {
private ToolTipSupport tts;
private Annotation[] annos;
private AnnotationDesc annoDesc;
Request(AnnotationDesc annoDesc, Annotation[] annos, Line.Part lp, ToolTipSupport tts) {
this.annoDesc = annoDesc;
this.annos = annos;
this.tts = tts;
tts.addPropertyChangeListener(this);
for (int i = 0; i < annos.length; i++) {
annos[i].attach(lp);
}
}
public void run() {
if (annoDesc != null) {
tts.setToolTipText(annoDesc.getShortDescription());
annoDesc.addPropertyChangeListener(this);
} else {
for (int i = 0; i < annos.length; i++) {
String desc = annos[i].getShortDescription();
if (desc != null) {
tts.setToolTipText(desc);
}
annos[i].addPropertyChangeListener(this);
}
}
}
private void dismiss() {
tts.removePropertyChangeListener(this);
tts = null; // signal that support no longer valid
if (annoDesc != null) {
annoDesc.removePropertyChangeListener(this);
} else {
for (int i = 0; i < annos.length; i++) {
annos[i].removePropertyChangeListener(this);
annos[i].detach();
}
}
}
public void propertyChange(PropertyChangeEvent evt) {
String propName = evt.getPropertyName();
if (Annotation.PROP_SHORT_DESCRIPTION.equals(propName) || AnnotationDesc.PROP_SHORT_DESCRIPTION.equals(propName)) {
if (evt.getNewValue() != null) {
final String tipText = (String)evt.getNewValue();
Utilities.runInEventDispatchThread( // ensure to run in AWT thread
new Runnable() {
public void run() {
if (tts != null) {
tts.setToolTipText(tipText);
}
}
}
);
}
} else if (ToolTipSupport.PROP_STATUS.equals(propName)) {
if (((Integer)evt.getNewValue()).intValue() == ToolTipSupport.STATUS_HIDDEN) {
dismiss();
}
}
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.