package com.google.code.joto.ui.spy.awtspy; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.Map; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToolBar; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.code.joto.eventrecorder.spy.awtspy.AWTEventInfos; import com.google.code.joto.eventrecorder.spy.awtspy.AWTEventInfos.AWTEventGroupInfo; import com.google.code.joto.eventrecorder.spy.awtspy.AWTEventInfos.AWTEventMaskInfo; import com.google.code.joto.eventrecorder.spy.awtspy.AWTRecordEventWriterSpy; import com.google.code.joto.ui.JotoContext; import com.google.code.joto.ui.capture.RecordEventsCaptureCategoryPanel; import com.google.code.joto.util.ui.GridBagLayoutFormBuilder; import com.google.code.joto.util.ui.JButtonUtils; import com.google.code.joto.util.ui.JCheckBoxUtils; /** * */ public class AWTEventCaptureCategoryPanel extends RecordEventsCaptureCategoryPanel { public static final String AWTSPY_CAPTURE_CATEGORY = "AWTSpy"; private static Logger log = LoggerFactory.getLogger(AWTEventCaptureCategoryPanel.class); private AWTRecordEventWriterSpy awtSpy; private JCheckBox activateAWTToolkitListenerCheckBox; private Map<AWTEventMaskInfo,JCheckBox> eventMaskCheckBoxes = new HashMap<AWTEventMaskInfo,JCheckBox>(); private Map<AWTEventGroupInfo,JCheckBox> eventGroupFlagCheckBoxes = new HashMap<AWTEventGroupInfo,JCheckBox>(); // ------------------------------------------------------------------------ public AWTEventCaptureCategoryPanel(JotoContext context) { super(context, AWTSPY_CAPTURE_CATEGORY); specificPanel.setLayout(new GridBagLayout()); GridBagLayoutFormBuilder b = new GridBagLayoutFormBuilder(specificPanel); awtSpy = new AWTRecordEventWriterSpy(filterCategoryModel.getResultFilteringEventWriter()); activateAWTToolkitListenerCheckBox = JCheckBoxUtils.snew("Activate AWT Toolkit Listener", false, this, "onActivateAWTToolkitListenerCheckBox"); b.addCompRow(activateAWTToolkitListenerCheckBox); { // toolbar JToolBar toolbar = new JToolBar(); toolbar.setFloatable(false); JButton selectAllButton = JButtonUtils.snew("Select All", this, "onButtonSelectAll"); toolbar.add(selectAllButton); JButton selectDefaultButton = JButtonUtils.snew("Select Default", this, "onButtonSelectDefault"); toolbar.add(selectDefaultButton); JButton deselectAllButton = JButtonUtils.snew("Deselect All", this, "onButtonDeselectAll"); toolbar.add(deselectAllButton); b.addCompRow(toolbar); } { // checkbox Masks Panel (several columns) JPanel masksPanel = new JPanel(new GridBagLayout()); JScrollPane masksScrollPanel = new JScrollPane(masksPanel); // masksScrollPanel.setPreferredSize(new Dimension(200, 500)); b.addCompFillRow(masksScrollPanel); GridBagLayoutFormBuilder mb = new GridBagLayoutFormBuilder(masksPanel); for (AWTEventMaskInfo awtEventMaskInfo : AWTEventMaskInfo.values()) { JPanel eventMaskPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); mb.addCompFillRow(eventMaskPanel); { // checkbox for AWTEvent MASK final JCheckBox awkMaskCheckBox = new JCheckBox(awtEventMaskInfo.getFlagName()); eventMaskPanel.add(awkMaskCheckBox); awkMaskCheckBox.setSelected(awtSpy.getAwtEventMaskFlag(awtEventMaskInfo)); final AWTEventMaskInfo fAwtEventMaskInfo = awtEventMaskInfo; awkMaskCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onCheckBoxAWTEventMask(fAwtEventMaskInfo, awkMaskCheckBox.isSelected()); } }); eventMaskCheckBoxes.put(awtEventMaskInfo, awkMaskCheckBox); } { // checkbox panel for AWTEvent sub-groups int subGroupCount = awtEventMaskInfo.getEventGroups().length; if (subGroupCount != 1) { JPanel eventGroupsPanel = new JPanel(new GridLayout(subGroupCount, 1)); eventMaskPanel.add(eventGroupsPanel); for (AWTEventGroupInfo awtEventGroupInfo : awtEventMaskInfo.getEventGroups()) { awtEventGroupInfo.getGroupName(); final JCheckBox awkEventGroupCheckBox = new JCheckBox(awtEventGroupInfo.getGroupName()); eventGroupsPanel.add(awkEventGroupCheckBox); awkEventGroupCheckBox.setSelected(awtSpy.getEventGroupFlag(awtEventGroupInfo)); final AWTEventGroupInfo fAwtEventGroupInfo = awtEventGroupInfo; awkEventGroupCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onCheckBoxAWTEventGroup(fAwtEventGroupInfo, awkEventGroupCheckBox.isSelected()); } }); eventGroupFlagCheckBoxes.put(fAwtEventGroupInfo, awkEventGroupCheckBox); } } } } } } // ------------------------------------------------------------------------ /** called by introspection, GUI callback */ public void onActivateAWTToolkitListenerCheckBox(ActionEvent event) { awtSpy.setEnable(activateAWTToolkitListenerCheckBox.isSelected()); } /** called by introspection, GUI callback */ public void onButtonSelectAll(ActionEvent event) { boolean prevEnable = awtSpy.isEnable(); awtSpy.setEnable(false); //tmp set awtSpy.setAwtEventMask(AWTEventInfos.ALL_AWTEVENTS_MASK); for (JCheckBox cb : eventMaskCheckBoxes.values()) { cb.setSelected(true); // awtSpy.setAwtEventMaskFlag(eventMaskInfo, true);... cf above: set ALL_AWTEVENTS_MASK } for (Map.Entry<AWTEventGroupInfo,JCheckBox> e : eventGroupFlagCheckBoxes.entrySet()) { AWTEventGroupInfo eventGroupInfo = e.getKey(); awtSpy.setEventGroupFlag(eventGroupInfo, true); e.getValue().setSelected(true); } awtSpy.setEnable(prevEnable); } /** called by introspection, GUI callback */ public void onButtonSelectDefault(ActionEvent event) { boolean prevEnable = awtSpy.isEnable(); awtSpy.setEnable(false); //tmp set for(Map.Entry<AWTEventMaskInfo,JCheckBox> e : eventMaskCheckBoxes.entrySet()) { AWTEventMaskInfo eventMaskInfo = e.getKey(); JCheckBox cb = e.getValue(); boolean def = eventMaskInfo.getDefaultSelected(); awtSpy.setAwtEventMaskFlag(eventMaskInfo, def); cb.setSelected(def); } for (Map.Entry<AWTEventGroupInfo,JCheckBox> e : eventGroupFlagCheckBoxes.entrySet()) { AWTEventGroupInfo eventGroupInfo = e.getKey(); boolean def = eventGroupInfo.getDefaultSelected(); awtSpy.setEventGroupFlag(eventGroupInfo, def); e.getValue().setSelected(def); } awtSpy.setEnable(prevEnable); } /** called by introspection, GUI callback */ public void onButtonDeselectAll(ActionEvent event) { awtSpy.setAwtEventMask(0); for (JCheckBox cb : eventMaskCheckBoxes.values()) { cb.setSelected(false); // awtSpy.setAwtEventMaskFlag(eventMaskInfo, true);... cf above: set 0 } for (Map.Entry<AWTEventGroupInfo,JCheckBox> e : eventGroupFlagCheckBoxes.entrySet()) { AWTEventGroupInfo eventGroupInfo = e.getKey(); awtSpy.setEventGroupFlag(eventGroupInfo, false); e.getValue().setSelected(false); } } /** GUI callback */ private void onCheckBoxAWTEventMask(AWTEventMaskInfo awtEventMaskInfo, boolean selected) { long oldMask = awtSpy.getAwtEventMask(); long flag = awtEventMaskInfo.getFlag(); long newMask = AWTRecordEventWriterSpy.clearOrSetFlag(oldMask, flag, selected); log.debug("toggle AWTSpy event mask:" + (selected? "set" : "clear") + " " + awtEventMaskInfo.getFlagName() + " => " + AWTRecordEventWriterSpy.maskToString(newMask) // + " (old:" + AWTRecordEventWriterSpy.maskToString(oldMask) + ")" ); awtSpy.setAwtEventMask(newMask); } /** GUI callback */ private void onCheckBoxAWTEventGroup(AWTEventGroupInfo awtEventGroupInfo, boolean selected) { log.info("set AWTSpy EventGroup " + awtEventGroupInfo.getGroupName() + " " + (selected? "enabled" : "disabled")); awtSpy.setEventGroupFlag(awtEventGroupInfo, selected); } }