package com.jediterm.terminal.ui; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; /** * @author traff */ public class TerminalAction { private final String myName; private final KeyStroke[] myKeyStrokes; private final Predicate<KeyEvent> myRunnable; private Character myMnemonic = null; private Supplier<Boolean> myEnabledSupplier = null; private Integer myMnemonicKey = null; public TerminalAction(String name, KeyStroke[] keyStrokes, Predicate<KeyEvent> runnable) { myName = name; myKeyStrokes = keyStrokes; myRunnable = runnable; } public boolean matches(KeyEvent e) { for (KeyStroke ks : myKeyStrokes) { if (ks.equals(KeyStroke.getKeyStrokeForEvent(e))) { return true; } } return false; } public boolean perform(KeyEvent e) { return myRunnable.apply(e); } public static boolean processEvent(TerminalActionProvider actionProvider, final KeyEvent e) { for (TerminalAction a : actionProvider.getActions()) { if (a.matches(e)) { return a.perform(e); } } if (actionProvider.getNextProvider() != null) { return processEvent(actionProvider.getNextProvider(), e); } return false; } public static boolean addToMenu(JPopupMenu menu, TerminalActionProvider actionProvider) { boolean added = false; if (actionProvider.getNextProvider() != null) { added = addToMenu(menu, actionProvider.getNextProvider()); } boolean addSeparator = added; for (final TerminalAction a : actionProvider.getActions()) { if (addSeparator) { menu.addSeparator(); addSeparator = false; } menu.add(a.toMenuItem()); added = true; } return added; } public int getKeyCode() { for (KeyStroke ks : myKeyStrokes) { return ks.getKeyCode(); } return 0; } public int getModifiers() { for (KeyStroke ks : myKeyStrokes) { return ks.getModifiers(); } return 0; } public String getName() { return myName; } public TerminalAction withMnemonic(Character ch) { myMnemonic = ch; return this; } public TerminalAction withMnemonicKey(Integer key) { myMnemonicKey = key; return this; } public boolean isEnabled() { if (myEnabledSupplier != null) { return myEnabledSupplier.get(); } return true; } public TerminalAction withEnabledSupplier(Supplier<Boolean> enabledSupplier) { myEnabledSupplier = enabledSupplier; return this; } public JMenuItem toMenuItem() { JMenuItem menuItem = new JMenuItem(myName); if (myMnemonic != null) { menuItem.setMnemonic(myMnemonic); } if (myMnemonicKey != null) { menuItem.setMnemonic(myMnemonicKey); } if (myKeyStrokes.length > 0) { menuItem.setAccelerator(myKeyStrokes[0]); } menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { myRunnable.apply(null); } }); menuItem.setEnabled(isEnabled()); return menuItem; } }