Class ShadowPopup


  • public final class ShadowPopup
    extends javax.swing.Popup
    Does all the magic for getting popups with drop shadows. It adds the drop shadow border to the Popup, in #show it snapshots the screen background as needed, and in #hide it cleans up all changes made before.
    Version:
    $Revision: 1.12 $
    See Also:
    ShadowPopupBorder, ShadowPopupFactory
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static java.util.List<ShadowPopup> cache
      The cache to use for ShadowPopups.
      private static boolean canSnapshot
      Indicates whether we can make snapshots from screen or not.
      private java.awt.Component contents
      The contents of the popup.
      private java.awt.Container heavyWeightContainer
      The heavy weight container of the popup contents, may be null.
      private static int MAX_CACHE_SIZE
      Max number of items to store in the cache.
      private javax.swing.border.Border oldBorder
      The border of the contents' parent replaced by SHADOW_BORDER.
      private boolean oldOpaque
      The old value of the opaque property of the contents' parent.
      private java.awt.Component owner
      The component mouse coordinates are relative to, may be null.
      private static java.awt.Point POINT
      The 'scratch pad' objects used to calculate dirty regions of the screen snapshots.
      private javax.swing.Popup popup
      The real popup.
      private static java.awt.Rectangle RECT  
      private static javax.swing.border.Border SHADOW_BORDER
      The singleton instance used to draw all borders.
      private static int SHADOW_SIZE
      The size of the drop shadow.
      private int x
      The desired x and y location of the popup.
      private int y
      The desired x and y location of the popup.
    • Constructor Summary

      Constructors 
      Constructor Description
      ShadowPopup()  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      static boolean canSnapshot()  
      (package private) static javax.swing.Popup getInstance​(java.awt.Component owner, java.awt.Component contents, int x, int y, javax.swing.Popup delegate)
      Returns a previously used ShadowPopup, or a new one if none of the popups have been recycled.
      private java.awt.Container getLayeredPane()  
      void hide()
      Hides and disposes of the Popup.
      private static void recycle​(ShadowPopup popup)
      Recycles the ShadowPopup.
      private void reset​(java.awt.Component owner, java.awt.Component contents, int x, int y, javax.swing.Popup popup)
      Reinitializes this ShadowPopup using the given parameters.
      void show()
      Makes the Popup visible.
      private void snapshot()
      Snapshots the background.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • MAX_CACHE_SIZE

        private static final int MAX_CACHE_SIZE
        Max number of items to store in the cache.
        See Also:
        Constant Field Values
      • cache

        private static java.util.List<ShadowPopup> cache
        The cache to use for ShadowPopups.
      • SHADOW_BORDER

        private static final javax.swing.border.Border SHADOW_BORDER
        The singleton instance used to draw all borders.
      • SHADOW_SIZE

        private static final int SHADOW_SIZE
        The size of the drop shadow.
        See Also:
        Constant Field Values
      • canSnapshot

        private static boolean canSnapshot
        Indicates whether we can make snapshots from screen or not.
      • owner

        private java.awt.Component owner
        The component mouse coordinates are relative to, may be null.
      • contents

        private java.awt.Component contents
        The contents of the popup.
      • x

        private int x
        The desired x and y location of the popup.
      • y

        private int y
        The desired x and y location of the popup.
      • popup

        private javax.swing.Popup popup
        The real popup. The #show() and #hide() methods will delegate all calls to these popup.
      • oldBorder

        private javax.swing.border.Border oldBorder
        The border of the contents' parent replaced by SHADOW_BORDER.
      • oldOpaque

        private boolean oldOpaque
        The old value of the opaque property of the contents' parent.
      • heavyWeightContainer

        private java.awt.Container heavyWeightContainer
        The heavy weight container of the popup contents, may be null.
      • POINT

        private static final java.awt.Point POINT
        The 'scratch pad' objects used to calculate dirty regions of the screen snapshots.
        See Also:
        snapshot()
      • RECT

        private static final java.awt.Rectangle RECT
    • Constructor Detail

      • ShadowPopup

        public ShadowPopup()
    • Method Detail

      • getInstance

        static javax.swing.Popup getInstance​(java.awt.Component owner,
                                             java.awt.Component contents,
                                             int x,
                                             int y,
                                             javax.swing.Popup delegate)
        Returns a previously used ShadowPopup, or a new one if none of the popups have been recycled.
      • recycle

        private static void recycle​(ShadowPopup popup)
        Recycles the ShadowPopup.
      • canSnapshot

        public static boolean canSnapshot()
      • hide

        public void hide()
        Hides and disposes of the Popup. Once a Popup has been disposed you should no longer invoke methods on it. A disposed Popup may be reclaimed and later used based on the PopupFactory. As such, if you invoke methods on a disposed Popup, indeterminate behavior will result.

        In addition to the superclass behavior, we reset the stored horizontal and vertical drop shadows - if any.

        Overrides:
        hide in class javax.swing.Popup
      • show

        public void show()
        Makes the Popup visible. If the popup has a heavy-weight container, we try to snapshot the background. If the Popup is currently visible, it remains visible.
        Overrides:
        show in class javax.swing.Popup
      • reset

        private void reset​(java.awt.Component owner,
                           java.awt.Component contents,
                           int x,
                           int y,
                           javax.swing.Popup popup)
        Reinitializes this ShadowPopup using the given parameters.
        Parameters:
        owner - component mouse coordinates are relative to, may be null
        contents - the contents of the popup
        x - the desired x location of the popup
        y - the desired y location of the popup
        popup - the popup to wrap
      • snapshot

        private void snapshot()
        Snapshots the background. The snapshots are stored as client properties of the contents' parent. The next time the border is drawn, this background will be used.

        Uses a robot on the default screen device to capture the screen region under the drop shadow. Does not use the window's device, because that may be an outdated device (due to popup reuse) and the robot's origin seems to be adjusted with the default screen device.

        See Also:
        show(), ShadowPopupBorder, Robot.createScreenCapture(Rectangle)
      • getLayeredPane

        private java.awt.Container getLayeredPane()
        Returns:
        the top level layered pane which contains the owner.