001    /* ========================================================================
002     * JCommon : a free general purpose class library for the Java(tm) platform
003     * ========================================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     * 
007     * Project Info:  http://www.jfree.org/jcommon/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     * 
027     * -----------------
028     * DetailEditor.java
029     * -----------------
030     * (C) Copyright 2004, by Thomas Morgner and Contributors.
031     *
032     * Original Author:  Thomas Morgner;
033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
034     *
035     * $Id: FloatingButtonEnabler.java,v 1.3 2005/10/18 13:18:34 mungady Exp $
036     *
037     * Changes
038     * -------
039     * 07-Jun-2004 : Added JCommon header (DG);
040     *
041     */
042    
043    package org.jfree.ui;
044    
045    import java.awt.event.MouseAdapter;
046    import java.awt.event.MouseEvent;
047    
048    import javax.swing.AbstractButton;
049    
050    /**
051     * Enables a button to have a simple floating effect. The border of the button is only visible,
052     * when the mouse pointer is floating over the button.
053     *
054     * @author Thomas Morgner
055     */
056    public final class FloatingButtonEnabler extends MouseAdapter {
057      
058        /** A single instance. */
059        private static FloatingButtonEnabler singleton;
060    
061        /**
062         * Default constructor.
063         */
064        private FloatingButtonEnabler() {
065            // nothing required
066        }
067    
068        /**
069         * Returns a default instance of this enabler.
070         *
071         * @return a shared instance of this class.
072         */
073        public static FloatingButtonEnabler getInstance() {
074            if (singleton == null) {
075                singleton = new FloatingButtonEnabler();
076            }
077            return singleton;
078        }
079    
080        /**
081         * Adds a button to this enabler.
082         *
083         * @param button  the button.
084         */
085        public void addButton(final AbstractButton button) {
086            button.addMouseListener(this);
087            button.setBorderPainted(false);
088        }
089    
090        /**
091         * Removes a button from the enabler.
092         *
093         * @param button  the button.
094         */
095        public void removeButton(final AbstractButton button) {
096            button.addMouseListener(this);
097            button.setBorderPainted(true);
098        }
099    
100        /**
101         * Triggers the drawing of the border when the mouse entered the button area.
102         *
103         * @param e  the mouse event.
104         */
105        public void mouseEntered(final MouseEvent e) {
106            if (e.getSource() instanceof AbstractButton) {
107                final AbstractButton button = (AbstractButton) e.getSource();
108                if (button.isEnabled()) {
109                    button.setBorderPainted(true);
110                }
111            }
112        }
113    
114        /**
115         * Disables the drawing of the border when the mouse leaves the button area.
116         *
117         * @param e  the mouse event.
118         */
119        public void mouseExited(final MouseEvent e) {
120            if (e.getSource() instanceof AbstractButton) {
121                final AbstractButton button = (AbstractButton) e.getSource();
122                button.setBorderPainted(false);
123                if (button.getParent() != null)
124                {
125    //                button.getParent().repaint(button.getX(), button.getY(),
126    //                    button.getWidth(), button.getHeight());
127                    button.getParent().repaint();
128                }
129            }
130        }
131    
132    }