/* * TextComponentContextMenu.java * * Taken from code provided by Santhosh Kumar * See http://www.jroller.com/santhosh/entry/context_menu_for_textcomponents */ package org.owasp.webscarab.util.swing; import java.awt.AWTEvent; import java.awt.Component; import java.awt.EventQueue; import java.awt.Point; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.JPopupMenu; import javax.swing.MenuSelectionManager; import javax.swing.SwingUtilities; import javax.swing.text.JTextComponent; /** * * @author rdawes */ public class TextComponentContextMenu extends EventQueue{ protected void dispatchEvent(AWTEvent event){ super.dispatchEvent(event); // interested only in mouseevents if(!(event instanceof MouseEvent)) return; MouseEvent me = (MouseEvent)event; // interested only in popuptriggers if(!me.isPopupTrigger()) return; // me.getComponent(...) retunrs the heavy weight component on which event occured Component comp = SwingUtilities.getDeepestComponentAt(me.getComponent(), me.getX(), me.getY()); // interested only in textcomponents if(!(comp instanceof JTextComponent)) return; // no popup shown by user code if(MenuSelectionManager.defaultManager().getSelectedPath().length>0) return; // create popup menu and show JTextComponent tc = (JTextComponent)comp; JPopupMenu menu = new JPopupMenu(); menu.add(new CutAction(tc)); menu.add(new CopyAction(tc)); menu.add(new PasteAction(tc)); menu.add(new DeleteAction(tc)); menu.addSeparator(); menu.add(new SelectAllAction(tc)); Point pt = SwingUtilities.convertPoint(me.getComponent(), me.getPoint(), tc); menu.show(tc, pt.x, pt.y); } private static class CutAction extends AbstractAction { /** * */ private static final long serialVersionUID = 5259448700110788753L; JTextComponent comp; public CutAction(JTextComponent comp){ super("Cut"); this.comp = comp; } public void actionPerformed(ActionEvent e){ comp.cut(); } public boolean isEnabled(){ return comp.isEditable() && comp.isEnabled() && comp.getSelectedText()!=null; } } private static class PasteAction extends AbstractAction{ /** * */ private static final long serialVersionUID = 2284758389817935638L; JTextComponent comp; public PasteAction(JTextComponent comp){ super("Paste"); this.comp = comp; } public void actionPerformed(ActionEvent e){ comp.paste(); } public boolean isEnabled(){ if (comp.isEditable() && comp.isEnabled()){ Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this); return contents.isDataFlavorSupported(DataFlavor.stringFlavor); }else return false; } } private static class DeleteAction extends AbstractAction{ /** * */ private static final long serialVersionUID = -2623797972969659203L; JTextComponent comp; public DeleteAction(JTextComponent comp){ super("Delete"); this.comp = comp; } public void actionPerformed(ActionEvent e){ comp.replaceSelection(null); } public boolean isEnabled(){ return comp.isEditable() && comp.isEnabled() && comp.getSelectedText()!=null; } } private static class CopyAction extends AbstractAction{ /** * */ private static final long serialVersionUID = -7049993248136391935L; JTextComponent comp; public CopyAction(JTextComponent comp){ super("Copy"); this.comp = comp; } public void actionPerformed(ActionEvent e){ comp.copy(); } public boolean isEnabled(){ return comp.isEnabled() && comp.getSelectedText()!=null; } } private static class SelectAllAction extends AbstractAction{ /** * */ private static final long serialVersionUID = 792587916551631284L; JTextComponent comp; public SelectAllAction(JTextComponent comp){ super("Select All"); this.comp = comp; } public void actionPerformed(ActionEvent e){ comp.selectAll(); } public boolean isEnabled(){ return comp.isEnabled() && comp.getText().length()>0; } } }