001    /*
002     * $Id: MouseMessagingHandler.java,v 1.3 2005/10/26 14:29:53 kleopatra Exp $
003     *
004     * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005     * Santa Clara, California 95054, U.S.A. All rights reserved.
006     *
007     * This library is free software; you can redistribute it and/or
008     * modify it under the terms of the GNU Lesser General Public
009     * License as published by the Free Software Foundation; either
010     * version 2.1 of the License, or (at your option) any later version.
011     * 
012     * This library is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
015     * Lesser General Public License for more details.
016     * 
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this library; if not, write to the Free Software
019     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
020     */
021    
022    package org.jdesktop.swingx;
023    
024    import java.awt.Component;
025    import java.awt.event.MouseAdapter;
026    import java.awt.event.MouseEvent;
027    import java.util.logging.Level;
028    
029    import javax.swing.AbstractButton;
030    import javax.swing.Action;
031    import javax.swing.MenuElement;
032    
033    import org.jdesktop.swingx.event.MessageEvent;
034    import org.jdesktop.swingx.event.MessageListener;
035    import org.jdesktop.swingx.event.MessageSource;
036    
037    /**
038     * Mouse handler which listens to mouse entered events on action based components 
039     * and send the value of the LONG_DESCRIPTION as a transient message
040     * to the MessageListener and the listeners registered to the MessageSource.
041     * <p>
042     * Components can be registered using the register methods. For example, to 
043     * register all the components of a toolbar and all menu items in a menu bar
044     * to send mouse over messages to a status bar:
045     * <pre>
046     *    handler = new MouseMessagingHandler(this, statusBar);
047     *    if (toolBar != null) {
048     *        handler.registerListeners(toolBar.getComponents());
049     *    }
050     *    if (menuBar != null) {
051     *    handler.registerListeners(menuBar.getSubElements());
052     *    }
053     * </pre>
054     * 
055     * @author Mark Davidson
056     */
057    public class MouseMessagingHandler extends MouseAdapter {
058    
059        private Object source;
060        private MessageSource messageSource;
061        private MessageListener messageListener;
062    
063        /**
064         * @param source the source of the MesageEvents
065         * @param messageSource messages will be sent to these listeners
066         */
067        public MouseMessagingHandler(Object source, MessageSource messageSource) {
068        setSource(source);
069        setMessageSource(messageSource);
070        }
071        
072        /**
073         * @param source the source of the MesageEvents
074         * @param messageListener messages will be sent to this listener
075         */
076        public MouseMessagingHandler(Object source, MessageListener messageListener) {
077        setSource(source);
078        setMessageListener(messageListener);
079        }
080    
081        /**
082         * Set the source object of the MessageEvents.
083         */
084        public void setSource(Object source) {
085        this.source = source;
086        }
087    
088        public void setMessageSource(MessageSource source) {
089        this.messageSource = source;
090        }
091    
092        public void setMessageListener(MessageListener listener) {
093        this.messageListener = listener;
094        }
095    
096        public void mouseExited(MouseEvent evt) {
097        fireMessage("");
098        }
099    
100        /**
101         * Takes the LONG_DESCRIPTION of the Action based components
102         * and sends them to the Status bar
103         */
104        public void mouseEntered(MouseEvent evt) {
105        if (evt.getSource()instanceof AbstractButton) {
106            AbstractButton button = (AbstractButton) evt.getSource();
107            Action action = button.getAction();
108            if (action != null) {
109            fireMessage((String)action.getValue(Action.LONG_DESCRIPTION));
110            }
111        }
112        }
113    
114        /**
115         * Helper method to recursively register all MenuElements with
116         * this messaging handler.
117         */
118        public void registerListeners(MenuElement[] elements) {
119        for (int i = 0; i < elements.length; i++) {
120            if (elements[i] instanceof AbstractButton) {
121            ((AbstractButton)elements[i]).addMouseListener(this);
122            }
123            registerListeners(elements[i].getSubElements());
124        }
125        }
126    
127        public void unregisterListeners(MenuElement[] elements) {
128        for (int i = 0; i < elements.length; i++) {
129            if (elements[i] instanceof AbstractButton) {
130            ((AbstractButton)elements[i]).removeMouseListener(this);
131            }
132            unregisterListeners(elements[i].getSubElements());
133        }
134        }
135    
136        /**
137         * Helper method to register all components with this message handler
138         */
139        public void registerListeners(Component[] components) {
140        for (int i = 0; i < components.length; i++) {
141            if (components[i] instanceof AbstractButton) {
142            components[i].addMouseListener(this);
143            }
144        }
145        }
146    
147        public void unregisterListeners(Component[] components) {
148        for (int i = 0; i < components.length; i++) {
149            if (components[i] instanceof AbstractButton) {
150            components[i].removeMouseListener(this);
151            }
152        }
153        }
154    
155        private void fireMessage(String message) {
156        MessageEvent evt = new MessageEvent(source, message, Level.FINE);
157            
158        if (messageListener != null) {
159            messageListener.message(evt);
160        }
161            
162        if (messageSource != null) {
163            MessageListener[] ls = messageSource.getMessageListeners();
164            for (int i = 0; i < ls.length; i++) {
165            ls[i].message(evt);
166            }
167        }
168        }
169    }
170    
171