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 }