home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 144 / DPCS0200.iso / Internet / Supanet / system / swing.jar / javax / swing / ToolTipManager.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-11-05  |  9.7 KB  |  395 lines

  1. package javax.swing;
  2.  
  3. import java.awt.Component;
  4. import java.awt.Container;
  5. import java.awt.Dimension;
  6. import java.awt.Frame;
  7. import java.awt.Point;
  8. import java.awt.Rectangle;
  9. import java.awt.Toolkit;
  10. import java.awt.event.FocusListener;
  11. import java.awt.event.MouseAdapter;
  12. import java.awt.event.MouseEvent;
  13. import java.awt.event.MouseMotionListener;
  14. import java.util.EventObject;
  15.  
  16. public class ToolTipManager extends MouseAdapter implements MouseMotionListener {
  17.    Timer enterTimer = new Timer(750, new insideTimerAction(this));
  18.    Timer exitTimer;
  19.    Timer insideTimer;
  20.    String toolTipText;
  21.    Point preferredLocation;
  22.    JComponent insideComponent;
  23.    MouseEvent mouseEvent;
  24.    boolean showImmediately;
  25.    static final ToolTipManager sharedInstance = new ToolTipManager();
  26.    Popup tipWindow;
  27.    JToolTip tip;
  28.    private Rectangle popupRect = null;
  29.    private Rectangle popupFrameRect = null;
  30.    boolean enabled = true;
  31.    boolean mouseAboveToolTip = false;
  32.    private boolean tipShowing = false;
  33.    private long timerEnter = 0L;
  34.    private KeyStroke postTip;
  35.    private KeyStroke hideTip;
  36.    private AbstractAction postTipAction;
  37.    private AbstractAction hideTipAction;
  38.    private FocusListener focusChangeListener = null;
  39.    protected boolean lightWeightPopupEnabled = true;
  40.    protected boolean heavyWeightPopupEnabled = false;
  41.  
  42.    ToolTipManager() {
  43.       this.enterTimer.setRepeats(false);
  44.       this.exitTimer = new Timer(500, new outsideTimerAction(this));
  45.       this.exitTimer.setRepeats(false);
  46.       this.insideTimer = new Timer(4000, new stillInsideTimerAction(this));
  47.       this.insideTimer.setRepeats(false);
  48.       this.postTip = KeyStroke.getKeyStroke(112, 2);
  49.       this.postTipAction = new 1(this);
  50.       this.hideTip = KeyStroke.getKeyStroke(27, 0);
  51.       this.hideTipAction = new 2(this);
  52.    }
  53.  
  54.    // $FF: synthetic method
  55.    static FocusListener access$0(ToolTipManager var0) {
  56.       return var0.focusChangeListener;
  57.    }
  58.  
  59.    // $FF: synthetic method
  60.    static FocusListener access$1(ToolTipManager var0) {
  61.       return var0.createFocusChangeListener();
  62.    }
  63.  
  64.    // $FF: synthetic method
  65.    static void access$2(ToolTipManager var0, FocusListener var1) {
  66.       var0.focusChangeListener = var1;
  67.    }
  68.  
  69.    private FocusListener createFocusChangeListener() {
  70.       return new 3(this);
  71.    }
  72.  
  73.    static Frame frameForComponent(Component var0) {
  74.       while(!(var0 instanceof Frame)) {
  75.          var0 = ((Component)var0).getParent();
  76.       }
  77.  
  78.       return (Frame)var0;
  79.    }
  80.  
  81.    public int getDismissDelay() {
  82.       return this.insideTimer.getInitialDelay();
  83.    }
  84.  
  85.    private int getHeightAdjust(Rectangle var1, Rectangle var2) {
  86.       return var2.y >= var1.y && var2.y + var2.height <= var1.y + var1.height ? 0 : var2.y + var2.height - (var1.y + var1.height) + 5;
  87.    }
  88.  
  89.    public int getInitialDelay() {
  90.       return this.enterTimer.getInitialDelay();
  91.    }
  92.  
  93.    private int getPopupFitHeight(Rectangle var1, Component var2) {
  94.       if (var2 != null) {
  95.          for(Container var3 = var2.getParent(); var3 != null; var3 = ((Component)var3).getParent()) {
  96.             if (var3 instanceof JFrame || var3 instanceof JDialog || var3 instanceof JWindow) {
  97.                return this.getHeightAdjust(((Component)var3).getBounds(), var1);
  98.             }
  99.  
  100.             if (var3 instanceof JApplet || var3 instanceof JInternalFrame) {
  101.                if (this.popupFrameRect == null) {
  102.                   this.popupFrameRect = new Rectangle();
  103.                }
  104.  
  105.                Point var4 = ((Component)var3).getLocationOnScreen();
  106.                this.popupFrameRect.setBounds(var4.x, var4.y, ((Component)var3).getBounds().width, ((Component)var3).getBounds().height);
  107.                return this.getHeightAdjust(this.popupFrameRect, var1);
  108.             }
  109.          }
  110.       }
  111.  
  112.       return 0;
  113.    }
  114.  
  115.    private int getPopupFitWidth(Rectangle var1, Component var2) {
  116.       if (var2 != null) {
  117.          for(Container var3 = var2.getParent(); var3 != null; var3 = ((Component)var3).getParent()) {
  118.             if (var3 instanceof JFrame || var3 instanceof JDialog || var3 instanceof JWindow) {
  119.                return this.getWidthAdjust(((Component)var3).getBounds(), var1);
  120.             }
  121.  
  122.             if (var3 instanceof JApplet || var3 instanceof JInternalFrame) {
  123.                if (this.popupFrameRect == null) {
  124.                   this.popupFrameRect = new Rectangle();
  125.                }
  126.  
  127.                Point var4 = ((Component)var3).getLocationOnScreen();
  128.                this.popupFrameRect.setBounds(var4.x, var4.y, ((Component)var3).getBounds().width, ((Component)var3).getBounds().height);
  129.                return this.getWidthAdjust(this.popupFrameRect, var1);
  130.             }
  131.          }
  132.       }
  133.  
  134.       return 0;
  135.    }
  136.  
  137.    public int getReshowDelay() {
  138.       return this.exitTimer.getInitialDelay();
  139.    }
  140.  
  141.    private int getWidthAdjust(Rectangle var1, Rectangle var2) {
  142.       return var2.x >= var1.x && var2.x + var2.width <= var1.x + var1.width ? 0 : var2.x + var2.width - (var1.x + var1.width) + 5;
  143.    }
  144.  
  145.    void hideTipWindow() {
  146.       if (this.tipWindow != null) {
  147.          this.tipWindow.removeMouseListener(this);
  148.          this.tipWindow.hide();
  149.          this.tipWindow = null;
  150.          this.tipShowing = false;
  151.          this.timerEnter = 0L;
  152.          this.tip.getUI().uninstallUI(this.tip);
  153.          this.tip = null;
  154.          this.insideTimer.stop();
  155.       }
  156.  
  157.    }
  158.  
  159.    public boolean isEnabled() {
  160.       return this.enabled;
  161.    }
  162.  
  163.    public boolean isLightWeightPopupEnabled() {
  164.       return this.lightWeightPopupEnabled;
  165.    }
  166.  
  167.    public void mouseDragged(MouseEvent var1) {
  168.    }
  169.  
  170.    public void mouseEntered(MouseEvent var1) {
  171.       if (!this.tipShowing || this.lightWeightPopupEnabled || System.currentTimeMillis() - this.timerEnter >= 200L) {
  172.          if (((EventObject)var1).getSource() != this.tipWindow) {
  173.             JComponent var2 = (JComponent)((EventObject)var1).getSource();
  174.             this.toolTipText = var2.getToolTipText(var1);
  175.             this.preferredLocation = var2.getToolTipLocation(var1);
  176.             this.exitTimer.stop();
  177.             Point var3 = var1.getPoint();
  178.             if (var3.x >= 0 && var3.x < var2.getWidth() && var3.y >= 0 && var3.y < var2.getHeight()) {
  179.                if (this.insideComponent != null) {
  180.                   this.enterTimer.stop();
  181.                   this.insideComponent = null;
  182.                }
  183.  
  184.                ((Component)var2).addMouseMotionListener(this);
  185.                this.insideComponent = var2;
  186.                if (this.tipWindow != null) {
  187.                   if (this.heavyWeightPopupEnabled) {
  188.                      return;
  189.                   }
  190.  
  191.                   this.mouseEvent = var1;
  192.                   if (this.showImmediately) {
  193.                      this.showTipWindow();
  194.                   } else {
  195.                      this.enterTimer.start();
  196.                   }
  197.                }
  198.  
  199.             }
  200.          }
  201.       }
  202.    }
  203.  
  204.    public void mouseExited(MouseEvent var1) {
  205.       if (!this.tipShowing || this.lightWeightPopupEnabled || System.currentTimeMillis() - this.timerEnter >= 200L) {
  206.          boolean var2 = true;
  207.          if (((EventObject)var1).getSource() == this.tipWindow) {
  208.             Container var3 = this.insideComponent.getTopLevelAncestor();
  209.             Rectangle var4 = this.tipWindow.getBounds();
  210.             Point var5 = var1.getPoint();
  211.             var5.x += var4.x;
  212.             var5.y += var4.y;
  213.             var4 = ((Component)var3).getBounds();
  214.             var5.x -= var4.x;
  215.             var5.y -= var4.y;
  216.             var5 = SwingUtilities.convertPoint((Component)null, var5, this.insideComponent);
  217.             if (var5.x >= 0 && var5.x < this.insideComponent.getWidth() && var5.y >= 0 && var5.y < this.insideComponent.getHeight()) {
  218.                var2 = false;
  219.             } else {
  220.                var2 = true;
  221.             }
  222.          } else if (((EventObject)var1).getSource() == this.insideComponent && this.tipWindow != null) {
  223.             Point var6 = SwingUtilities.convertPoint(this.insideComponent, var1.getPoint(), (Component)null);
  224.             Rectangle var8 = this.insideComponent.getTopLevelAncestor().getBounds();
  225.             var6.x += var8.x;
  226.             var6.y += var8.y;
  227.             var8 = this.tipWindow.getBounds();
  228.             if (var6.x >= var8.x && var6.x < var8.x + var8.width && var6.y >= var8.y && var6.y < var8.y + var8.height) {
  229.                var2 = false;
  230.             } else {
  231.                var2 = true;
  232.             }
  233.          }
  234.  
  235.          if (var2) {
  236.             this.enterTimer.stop();
  237.             if (this.insideComponent != null) {
  238.                this.insideComponent.removeMouseMotionListener(this);
  239.             }
  240.  
  241.             this.insideComponent = null;
  242.             this.toolTipText = null;
  243.             this.mouseEvent = null;
  244.             this.hideTipWindow();
  245.             this.exitTimer.start();
  246.          }
  247.  
  248.       }
  249.    }
  250.  
  251.    public void mouseMoved(MouseEvent var1) {
  252.       JComponent var2 = (JComponent)((EventObject)var1).getSource();
  253.       String var3 = var2.getToolTipText(var1);
  254.       Point var4 = var2.getToolTipLocation(var1);
  255.       if (var3 == null && var4 == null) {
  256.          this.toolTipText = null;
  257.          this.preferredLocation = null;
  258.          this.mouseEvent = null;
  259.          this.hideTipWindow();
  260.          this.enterTimer.stop();
  261.          this.exitTimer.start();
  262.       } else {
  263.          this.mouseEvent = var1;
  264.          if ((var3 != null && var3.equals(this.toolTipText) || var3 == null) && (var4 != null && var4.equals(this.preferredLocation) || var4 == null)) {
  265.             if (this.tipWindow != null) {
  266.                this.insideTimer.restart();
  267.             } else {
  268.                this.enterTimer.restart();
  269.             }
  270.          } else {
  271.             this.toolTipText = var3;
  272.             this.preferredLocation = var4;
  273.             if (this.showImmediately) {
  274.                this.hideTipWindow();
  275.                this.showTipWindow();
  276.             } else {
  277.                this.enterTimer.restart();
  278.             }
  279.          }
  280.       }
  281.  
  282.    }
  283.  
  284.    public void mousePressed(MouseEvent var1) {
  285.       this.hideTipWindow();
  286.       this.enterTimer.stop();
  287.       this.showImmediately = false;
  288.    }
  289.  
  290.    public void registerComponent(JComponent var1) {
  291.       ((Component)var1).removeMouseListener(this);
  292.       ((Component)var1).addMouseListener(this);
  293.       var1.registerKeyboardAction(this.postTipAction, this.postTip, 0);
  294.       var1.registerKeyboardAction(this.hideTipAction, this.hideTip, 0);
  295.    }
  296.  
  297.    public void setDismissDelay(int var1) {
  298.       this.insideTimer.setInitialDelay(var1);
  299.    }
  300.  
  301.    public void setEnabled(boolean var1) {
  302.       this.enabled = var1;
  303.       if (!var1) {
  304.          this.hideTipWindow();
  305.       }
  306.  
  307.    }
  308.  
  309.    public void setInitialDelay(int var1) {
  310.       this.enterTimer.setInitialDelay(var1);
  311.    }
  312.  
  313.    /** @deprecated */
  314.    public void setLightWeightPopupEnabled(boolean var1) {
  315.       this.lightWeightPopupEnabled = var1;
  316.    }
  317.  
  318.    public void setReshowDelay(int var1) {
  319.       this.exitTimer.setInitialDelay(var1);
  320.    }
  321.  
  322.    public static ToolTipManager sharedInstance() {
  323.       return sharedInstance;
  324.    }
  325.  
  326.    void showTipWindow() {
  327.       if (this.insideComponent != null && this.insideComponent.isShowing()) {
  328.          if (this.enabled) {
  329.             Point var2 = this.insideComponent.getLocationOnScreen();
  330.             Dimension var3 = Toolkit.getDefaultToolkit().getScreenSize();
  331.             Point var4 = new Point();
  332.             this.hideTipWindow();
  333.             this.tip = this.insideComponent.createToolTip();
  334.             this.tip.setTipText(this.toolTipText);
  335.             Dimension var1 = this.tip.getPreferredSize();
  336.             if (this.insideComponent.getRootPane() == null) {
  337.                this.tipWindow = new WindowPopup(this, frameForComponent(this.insideComponent), this.tip, var1);
  338.                this.heavyWeightPopupEnabled = true;
  339.             } else if (this.lightWeightPopupEnabled) {
  340.                this.heavyWeightPopupEnabled = false;
  341.                this.tipWindow = new JPanelPopup(this, this.tip, var1);
  342.             } else {
  343.                this.heavyWeightPopupEnabled = false;
  344.                this.tipWindow = new PanelPopup(this, this.tip, var1);
  345.             }
  346.  
  347.             this.tipWindow.addMouseListener(this);
  348.             if (this.preferredLocation != null) {
  349.                var4.x = var2.x + this.preferredLocation.x;
  350.                var4.y = var2.y + this.preferredLocation.y;
  351.             } else {
  352.                var4.x = var2.x + this.mouseEvent.getX();
  353.                var4.y = var2.y + this.mouseEvent.getY() + 20;
  354.                if (var4.x + var1.width > var3.width) {
  355.                   var4.x -= var1.width;
  356.                }
  357.  
  358.                if (var4.y + var1.height > var3.height) {
  359.                   var4.y -= var1.height + 20;
  360.                }
  361.             }
  362.  
  363.             if (!this.heavyWeightPopupEnabled) {
  364.                if (this.popupRect == null) {
  365.                   this.popupRect = new Rectangle();
  366.                }
  367.  
  368.                this.popupRect.setBounds(var4.x, var4.y, this.tipWindow.getBounds().width, this.tipWindow.getBounds().height);
  369.                int var5 = this.getPopupFitHeight(this.popupRect, this.insideComponent);
  370.                int var6 = this.getPopupFitWidth(this.popupRect, this.insideComponent);
  371.                if (var5 > 0) {
  372.                   var4.y -= var5;
  373.                }
  374.  
  375.                if (var6 > 0) {
  376.                   var4.x -= var6;
  377.                }
  378.             }
  379.  
  380.             this.tipWindow.show(this.insideComponent, var4.x, var4.y);
  381.             this.insideTimer.start();
  382.             this.timerEnter = System.currentTimeMillis();
  383.             this.tipShowing = true;
  384.          }
  385.  
  386.       }
  387.    }
  388.  
  389.    public void unregisterComponent(JComponent var1) {
  390.       ((Component)var1).removeMouseListener(this);
  391.       var1.unregisterKeyboardAction(this.postTip);
  392.       var1.unregisterKeyboardAction(this.hideTip);
  393.    }
  394. }
  395.