1 package prefuse.util.ui; 2 3 import java.awt.BorderLayout ; 4 import java.awt.Component ; 5 import java.awt.Dimension ; 6 import java.awt.Graphics ; 7 import java.awt.Insets ; 8 import java.awt.Point ; 9 import java.awt.Window ; 10 import java.awt.event.MouseAdapter ; 11 import java.awt.event.MouseEvent ; 12 13 import javax.swing.BorderFactory ; 14 import javax.swing.JComponent ; 15 import javax.swing.JToolTip ; 16 import javax.swing.Popup ; 17 import javax.swing.PopupFactory ; 18 import javax.swing.SwingUtilities ; 19 import javax.swing.ToolTipManager ; 20 import javax.swing.event.AncestorEvent ; 21 import javax.swing.event.AncestorListener ; 22 23 49 public class JCustomTooltip extends JToolTip { 50 51 private boolean m_persist = false; 52 private Listener m_lstnr = null; 53 54 59 public JCustomTooltip(JComponent src, JComponent content) { 60 this(src, content, false); 61 } 62 63 69 public JCustomTooltip(JComponent src, JComponent content, boolean inter) 70 { 71 this.setLayout(new BorderLayout ()); 72 this.setBorder(BorderFactory.createEmptyBorder(1,1,1,1)); 73 this.setComponent(src); 74 this.add(content); 75 76 setPersistent(inter); 77 } 78 79 84 public boolean isPersistent() { 85 return m_persist; 86 } 87 88 93 public void setPersistent(boolean inter) { 94 if ( inter == m_persist ) 95 return; 96 97 if ( inter ) { 98 m_lstnr = new Listener (); 99 this.addAncestorListener(m_lstnr); 100 } else { 101 this.removeAncestorListener(m_lstnr); 102 m_lstnr = null; 103 } 104 m_persist = inter; 105 } 106 107 111 public void setContent(JComponent content) { 112 this.removeAll(); 113 this.add(content); 114 } 115 116 119 public Dimension getPreferredSize() { 120 if ( getComponentCount() > 0 ) { 121 Dimension d = getComponent(0).getPreferredSize(); 122 Insets ins = getInsets(); 123 return new Dimension (d.width+ins.left+ins.right, 124 d.height+ins.top+ins.bottom); 125 } else { 126 return super.getPreferredSize(); 127 } 128 } 129 130 133 public void paintComponent(Graphics g) { 134 if ( getComponentCount() > 0 ) { 135 g.setColor(getBackground()); 137 g.drawRect(0,0,getWidth()-1,getHeight()-1); 138 g.setColor(getComponent(0).getBackground()); 139 g.fillRect(1,1,getWidth()-2,getHeight()-2); 140 } 141 } 142 143 147 private class Listener extends MouseAdapter implements AncestorListener { 148 private Point point = new Point (); 149 private boolean showing = false; 150 private Popup popup; 151 152 public void ancestorAdded(AncestorEvent event) { 153 if ( showing ) { return; } 154 155 Window ttip = SwingUtilities.getWindowAncestor(getParent()); 156 if ( ttip == null || !ttip.isVisible() ) { 157 return; 158 } 159 ttip.getLocation(point); 161 ttip.setVisible(false); 162 getParent().remove(JCustomTooltip.this); 163 164 JComponent c = getComponent(); 165 c.setToolTipText(null); 166 c.removeMouseMotionListener(ToolTipManager.sharedInstance()); 167 168 popup = PopupFactory.getSharedInstance().getPopup( 169 c, JCustomTooltip.this, point.x, point.y); 170 Window w = SwingUtilities.getWindowAncestor(JCustomTooltip.this); 171 w.addMouseListener(this); 172 w.setFocusableWindowState(true); 173 popup.show(); 174 175 showing = true; 176 } 177 178 public void mouseEntered(MouseEvent e) { 179 } 201 202 public void mouseExited(MouseEvent e) { 203 if ( !showing ) return; 204 int x = e.getX(), y = e.getY(); 205 Component c = (Component )e.getSource(); 206 if ( x < 0 || y < 0 || x > c.getWidth() || y > c.getHeight() ) 207 { 208 Window w = SwingUtilities.getWindowAncestor(JCustomTooltip.this); 209 w.removeMouseListener(this); 210 w.setFocusableWindowState(false); 211 popup.hide(); 212 popup = null; 213 getComponent().setToolTipText("?"); 214 showing = false; 215 } 216 } 217 218 public void ancestorMoved(AncestorEvent event) { 219 } 220 public void ancestorRemoved(AncestorEvent event) { 221 } 222 } 223 224 } | Popular Tags |