// ClipboardMenuController package org.javamoney.examples.ez.common.utility; import static java.awt.Toolkit.getDefaultToolkit; import static java.awt.datatransfer.DataFlavor.stringFlavor; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JMenuItem; import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuListener; import javax.swing.text.JTextComponent; import org.javamoney.examples.ez.common.gui.PopupMenu; /** * This class facilitates providing text components with access to the system's * clipboard via a pop-up menu. */ public final class ClipboardMenuController { /** * Constructs a new controller. * * @param component The text component to provide access to the clipboard for. */ public ClipboardMenuController(JTextComponent component) { PopupMenu menu = new PopupMenu(); setTextComponent(component); createMenuItems(); // Add menu items. menu.add(getMenuItems()[CUT]); menu.add(getMenuItems()[COPY]); menu.add(getMenuItems()[PASTE]); menu.addSeparator(); menu.add(getMenuItems()[SELECT_ALL]); // Add listeners. component.addMouseListener(menu); menu.addPopupMenuListener(new PopupMenuHandler()); } ////////////////////////////////////////////////////////////////////////////// // Start of private methods. ////////////////////////////////////////////////////////////////////////////// private static boolean canPaste() { Clipboard clipboard = getDefaultToolkit().getSystemClipboard(); Transferable contents = clipboard.getContents(null); String data = null; if(contents != null) { if(contents.isDataFlavorSupported(stringFlavor)) { try { data = (String)contents.getTransferData(stringFlavor); } catch(Exception exception) { // Ignored. } } } return data != null; } private void createMenuItems() { ActionController controller = new ActionController(); itsMenuItems = new JMenuItem[4]; for(int len = 0; len < getMenuItems().length; ++len) { getMenuItems()[len] = new JMenuItem(getProperty(KEYS[len])); getMenuItems()[len].addActionListener(controller); } } private JMenuItem[] getMenuItems() { return itsMenuItems; } private static String getProperty(String key) { return I18NHelper.getProperty("ClipboardMenuController." + key); } private JTextComponent getTextComponent() { return itsTextComponent; } private void setTextComponent(JTextComponent component) { itsTextComponent = component; } ////////////////////////////////////////////////////////////////////////////// // Start of inner classes. ////////////////////////////////////////////////////////////////////////////// private class ActionController implements ActionListener { public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if(source == getMenuItems()[COPY]) { getTextComponent().copy(); } else if(source == getMenuItems()[CUT]) { getTextComponent().cut(); } else if(source == getMenuItems()[PASTE]) { getTextComponent().paste(); } else if(source == getMenuItems()[SELECT_ALL]) { getTextComponent().selectAll(); } } } private class PopupMenuHandler implements PopupMenuListener { public void popupMenuCanceled(PopupMenuEvent event) { // Ignored. } public void popupMenuWillBecomeInvisible(PopupMenuEvent event) { // Ignored. } public void popupMenuWillBecomeVisible(PopupMenuEvent event) { boolean hasSelected = getTextComponent().getSelectedText()!= null; boolean hasText = getTextComponent().getText().length() != 0; getMenuItems()[COPY].setEnabled(hasSelected == true); getMenuItems()[CUT].setEnabled(hasSelected == true); getMenuItems()[PASTE].setEnabled(canPaste() == true); getMenuItems()[SELECT_ALL].setEnabled(hasText == true); getTextComponent().getParent().requestFocus(); } } ////////////////////////////////////////////////////////////////////////////// // Start of class members. ////////////////////////////////////////////////////////////////////////////// private JMenuItem[] itsMenuItems; private JTextComponent itsTextComponent; private static final int COPY = 0; private static final int CUT = 1; private static final int PASTE = 2; private static final int SELECT_ALL = 3; private static final String[] KEYS = {"copy", "cut", "paste", "all"}; }