/**
*
*/
package org.jmeld.ui;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import javax.swing.KeyStroke;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.JTextComponent;
import javax.swing.undo.UndoManager;
/**
* Helper class see http://stackoverflow.com/a/28283704/1497139
*/
@SuppressWarnings("serial")
public class DefaultContextMenu extends JPopupMenu
{
private Clipboard clipboard;
private UndoManager undoManager;
private JMenuItem undo;
private JMenuItem redo;
private JMenuItem cut;
private JMenuItem copy;
private JMenuItem paste;
private JMenuItem delete;
private JMenuItem selectAll;
private JTextComponent jTextComponent;
public DefaultContextMenu()
{
undoManager = new UndoManager();
clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
undo = new JMenuItem("Undo");
undo.setEnabled(false);
undo.setAccelerator(KeyStroke.getKeyStroke("control Z"));
undo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
undoManager.undo();
}
});
add(undo);
redo = new JMenuItem("Redo");
redo.setEnabled(false);
redo.setAccelerator(KeyStroke.getKeyStroke("control Y"));
redo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
undoManager.redo();
}
});
add(redo);
add(new JSeparator());
cut = new JMenuItem("Cut");
cut.setEnabled(false);
cut.setAccelerator(KeyStroke.getKeyStroke("control X"));
cut.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jTextComponent.cut();
}
});
add(cut);
copy = new JMenuItem("Copy");
copy.setEnabled(false);
copy.setAccelerator(KeyStroke.getKeyStroke("control C"));
copy.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jTextComponent.copy();
}
});
add(copy);
paste = new JMenuItem("Paste");
paste.setEnabled(false);
paste.setAccelerator(KeyStroke.getKeyStroke("control V"));
paste.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jTextComponent.paste();
}
});
add(paste);
delete = new JMenuItem("Delete");
delete.setEnabled(false);
delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
delete.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jTextComponent.replaceSelection("");
}
});
add(delete);
add(new JSeparator());
selectAll = new JMenuItem("Select All");
selectAll.setEnabled(false);
selectAll.setAccelerator(KeyStroke.getKeyStroke("control A"));
selectAll.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
jTextComponent.selectAll();
}
});
add(selectAll);
}
public void add(JTextComponent jTextComponent)
{
jTextComponent.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent pressedEvent)
{
if ((pressedEvent.getKeyCode() == KeyEvent.VK_Z)
&& ((pressedEvent.getModifiers() & KeyEvent.CTRL_MASK) != 0))
{
if (undoManager.canUndo())
{
undoManager.undo();
}
}
if ((pressedEvent.getKeyCode() == KeyEvent.VK_Y)
&& ((pressedEvent.getModifiers() & KeyEvent.CTRL_MASK) != 0))
{
if (undoManager.canRedo())
{
undoManager.redo();
}
}
}
});
jTextComponent.addMouseListener(new MouseAdapter()
{
@Override
public void mouseReleased(MouseEvent releasedEvent)
{
if (releasedEvent.getButton() == MouseEvent.BUTTON3)
{
processClick(releasedEvent);
}
}
});
jTextComponent.getDocument().addUndoableEditListener(
new UndoableEditListener()
{
@Override
public void undoableEditHappened(UndoableEditEvent event)
{
undoManager.addEdit(event.getEdit());
}
});
}
private void processClick(MouseEvent event)
{
jTextComponent = (JTextComponent) event.getSource();
boolean enableUndo = undoManager.canUndo();
boolean enableRedo = undoManager.canRedo();
boolean enableCut = false;
boolean enableCopy = false;
boolean enablePaste = false;
boolean enableDelete = false;
boolean enableSelectAll = false;
String selectedText = jTextComponent.getSelectedText();
String text = jTextComponent.getText();
if (text != null)
{
if (text.length() > 0)
{
enableSelectAll = true;
}
}
if (selectedText != null)
{
if (selectedText.length() > 0)
{
enableCut = true;
enableCopy = true;
enableDelete = true;
}
}
try
{
if (clipboard.getData(DataFlavor.stringFlavor) != null)
{
enablePaste = true;
}
} catch (Exception exception)
{
exception.printStackTrace();
}
undo.setEnabled(enableUndo);
redo.setEnabled(enableRedo);
cut.setEnabled(enableCut);
copy.setEnabled(enableCopy);
paste.setEnabled(enablePaste);
delete.setEnabled(enableDelete);
selectAll.setEnabled(enableSelectAll);
show(jTextComponent, event.getX(), event.getY());
}
}