package de.juwimm.cms.gui.event;
import static de.juwimm.cms.common.Constants.rb;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.EventQueue;
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.Action;
import javax.swing.Icon;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;
public class TCPopupEventQueue extends EventQueue {
public JPopupMenu popup;
JTable table;
public BasicAction cut, copy, paste, selectAll;
public TCPopupEventQueue() {
}
public void createPopupMenu(JTextComponent text) {
cut = new CutAction(rb.getString("event.tcpopupevent.cut"), null);
copy = new CopyAction(rb.getString("event.tcpopupevent.copy"), null);
paste = new PasteAction(rb.getString("event.tcpopupevent.paste"), null);
selectAll = new SelectAllAction(rb.getString("event.tcpopupevent.selectAll"), null);
cut.setTextComponent(text);
copy.setTextComponent(text);
paste.setTextComponent(text);
selectAll.setTextComponent(text);
popup = new JPopupMenu();
popup.add(cut);
popup.add(copy);
popup.add(paste);
popup.addSeparator();
popup.add(selectAll);
}
public void showPopup(Component parent, MouseEvent me) {
popup.validate();
popup.show(parent, me.getX(), me.getY());
}
protected void dispatchEvent(AWTEvent event) {
super.dispatchEvent(event);
if (!(event instanceof MouseEvent)) { return; }
MouseEvent me = (MouseEvent) event;
if (!me.isPopupTrigger()) { return; }
if (!(me.getSource() instanceof Component)) { return; }
Component comp = SwingUtilities.getDeepestComponentAt((Component) me.getSource(), me.getX(), me.getY());
if (!(comp instanceof JTextComponent)) { return; }
if (MenuSelectionManager.defaultManager().getSelectedPath().length > 0) { return; }
createPopupMenu((JTextComponent) comp);
showPopup((Component) me.getSource(), me);
}
}
abstract class BasicAction extends AbstractAction {
JTextComponent comp;
public BasicAction(String text, Icon icon) {
super(text, icon);
putValue(Action.SHORT_DESCRIPTION, text);
}
public void setTextComponent(JTextComponent comp) {
this.comp = comp;
}
public abstract void actionPerformed(ActionEvent e);
}
class CutAction extends BasicAction {
public CutAction(String text, Icon icon) {
super(text, icon);
putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl X"));
}
public void actionPerformed(ActionEvent e) {
comp.cut();
}
public boolean isEnabled() {
return comp != null && comp.isEditable() && comp.getSelectedText() != null;
}
}
class CopyAction extends BasicAction {
public CopyAction(String text, Icon icon) {
super(text, icon);
putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl C"));
}
public void actionPerformed(ActionEvent e) {
comp.copy();
}
public boolean isEnabled() {
return comp != null && comp.getSelectedText() != null;
}
}
class PasteAction extends BasicAction {
public PasteAction(String text, Icon icon) {
super(text, icon);
putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl V"));
}
public void actionPerformed(ActionEvent e) {
comp.paste();
}
public boolean isEnabled() {
Transferable content = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
return comp != null && comp.isEnabled() && comp.isEditable() && content.isDataFlavorSupported(DataFlavor.stringFlavor);
}
}
class SelectAllAction extends BasicAction {
public SelectAllAction(String text, Icon icon) {
super(text, icon);
putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl A"));
}
public void actionPerformed(ActionEvent e) {
comp.selectAll();
}
public boolean isEnabled() {
return comp != null && comp.isEnabled() && comp.getText().length() > 0 && (comp.getSelectedText() == null || comp.getSelectedText().length() < comp.getText().length());
}
}