001    /*
002      Copyright (C) 2002-2003 Renaud Pawlak <renaud@aopsys.com>, 
003                              Laurent Martelli <laurent@aopsys.com>
004      
005      This program is free software; you can redistribute it and/or modify
006      it under the terms of the GNU Lesser General Public License as
007      published by the Free Software Foundation; either version 2 of the
008      License, or (at your option) any later version.
009    
010      This program is distributed in the hope that it will be useful, but
011      WITHOUT ANY WARRANTY; without even the implied warranty of
012      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013      Lesser General Public License for more details.
014    
015      You should have received a copy of the GNU Lesser General Public
016      License along with this program; if not, write to the Free Software
017      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
018      USA */
019    
020    package org.objectweb.jac.aspects.gui.swing;
021    
022    import java.awt.event.ActionEvent;
023    import java.awt.event.ActionListener;
024    import javax.swing.ImageIcon;
025    import javax.swing.JMenuItem;
026    import javax.swing.JPopupMenu;
027    import org.apache.log4j.Logger;
028    import org.objectweb.jac.aspects.gui.DisplayContext;
029    import org.objectweb.jac.aspects.gui.EventHandler;
030    import org.objectweb.jac.aspects.gui.GuiAC;
031    import org.objectweb.jac.aspects.gui.InvokeEvent;
032    import org.objectweb.jac.aspects.gui.ResourceManager;
033    import org.objectweb.jac.core.rtti.MethodItem;
034    import org.objectweb.jac.core.rtti.NamingConventions;
035    
036    public class ObjectPopup extends JPopupMenu {
037        static Logger loggerEvents = Logger.getLogger("gui.events");
038    
039        DisplayContext context;
040    
041        public ObjectPopup(DisplayContext context) {
042            this.context = context;
043        }
044    
045        public void addMethodItem(Object substance, MethodItem method, String icon) {
046            MenuItem item = new MenuItem(substance,method,ResourceManager.getIcon(icon));
047            item.addActionListener(item);
048            String label = item.getText();
049            if (method.isSetter()) 
050                label = method.getSetField().getName();
051            else if (method.isAdder())
052                label = method.getAddedCollection().getName();
053            item.setMnemonic(
054                MenuBar.getMnemonic(
055                    this,
056                    GuiAC.getMnemonics(method)+label));
057            add(item);
058            boolean enabled = GuiAC.isEnabled(method,substance);
059            if (!enabled) {
060                item.setEnabled(enabled);
061            }
062        }
063    
064        public void addViewItem(Object substance, String label, ImageIcon icon) {
065            MenuItem item = new MenuItem(substance,label,icon);
066            item.setActionCommand("view");
067            item.addActionListener(item);
068            add(item);
069        }
070    
071        class MenuItem extends JMenuItem implements ActionListener {
072            MethodItem method;
073            Object substance;
074            boolean toggle;
075            public MenuItem(Object substance, MethodItem method, ImageIcon icon) {
076                super(method.isSetter() && method.getSetField().getType()==boolean.class 
077                      ? "Toggle "+NamingConventions.textForName(method.getSetField().getName())
078                      : NamingConventions.textForName(method.getName()),
079                      icon);
080                this.toggle = method.isSetter() && method.getSetField().getType()==boolean.class;
081                this.method = method;
082                this.substance = substance;
083            }
084            public MenuItem(Object substance, String label, ImageIcon icon) {
085                super(label,icon);
086                this.method = null;
087                this.substance = substance;
088            }
089            public void actionPerformed(ActionEvent event) {
090                loggerEvents.debug("ObjectPopup.actionPerformed from "+
091                                   event.getSource().getClass().getName());
092                if ("view".equals(event.getActionCommand())) {
093                    EventHandler.get().onView(context,null,substance,null,null);
094                } else if (toggle) {
095                    if (method!=null)
096                        EventHandler.get().onInvoke(
097                            context, 
098                            new InvokeEvent(
099                                null,
100                                substance, 
101                                method, 
102                                new Object[] {((Boolean)method.getSetField().getThroughAccessor(substance)).booleanValue() 
103                                              ? Boolean.FALSE : Boolean.TRUE }), 
104                            false,
105                            null, null);
106                } else {
107                    if (method!=null)
108                        EventHandler.get().onInvoke(
109                            context, 
110                            new InvokeEvent(null, substance, method));
111                }
112            }
113        }
114    }