diff --git a/.classpath b/.classpath index 6b05e14..c3014fc 100644 --- a/.classpath +++ b/.classpath @@ -23,16 +23,5 @@ - - - - - - - - - - - diff --git a/src/main/java/nz/ac/massey/cs/flackpad/KeyBinder.java b/src/main/java/nz/ac/massey/cs/flackpad/KeyBinder.java new file mode 100644 index 0000000..04b913d --- /dev/null +++ b/src/main/java/nz/ac/massey/cs/flackpad/KeyBinder.java @@ -0,0 +1,115 @@ +package nz.ac.massey.cs.flackpad; + +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.Toolkit; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.KeyStroke; + +public class KeyBinder { + private Window windowInstance; + KeyBinder(Window windowInstance) { + this.windowInstance = windowInstance; + addKeyBindings(); + } + + private void addKeyBindings() { + + TextArea textArea = windowInstance.getTextArea(); + + // Common key shortcuts + KeyStroke ctrl_s = KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK); + KeyStroke ctrl_c = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK); + KeyStroke ctrl_v = KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK); + KeyStroke ctrl_x = KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_DOWN_MASK); + + /*** Actions ***/ + + // Save action + Action save = new AbstractAction() { + private static final long serialVersionUID = 1L; + public void actionPerformed(ActionEvent e) { + FileIO.save(windowInstance); + } + }; + + // Copy action + Action copy = new AbstractAction() { + private static final long serialVersionUID = 1L; + public void actionPerformed(ActionEvent e) { + try { + StringSelection stringSelection = new StringSelection(textArea.getSelectedText()); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(stringSelection, null); + } + catch (Exception err) { + Dialogs.error("Could not copy selected text to clipboard", windowInstance); + } + } + }; + + // Cut action + Action cut = new AbstractAction() { + private static final long serialVersionUID = 1L; + public void actionPerformed(ActionEvent e) { + try { + StringSelection stringSelection = new StringSelection(textArea.getSelectedText()); + textArea.replaceSelection(""); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(stringSelection, null); + } + catch (Exception err) { + Dialogs.error("Could not cut selected", windowInstance); + } + } + }; + + // Paste action + Action paste = new AbstractAction() { + private static final long serialVersionUID = 1L; + public void actionPerformed(ActionEvent e) { + try { + /* + * Handle 2 cases: + * a. Paste with text selected + * b. Paste with no text selected + */ + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + Transferable data = clipboard.getContents(null); + + String plaintext = (String) data.getTransferData(DataFlavor.stringFlavor); + + if (textArea.getSelectedText() != null) { + // .a + textArea.replaceSelection(plaintext); + } else { + // .b + textArea.insert(plaintext, textArea.getCaretPosition()); + } + } + catch (Exception err) { + Dialogs.error("Could not paste from clipboard", windowInstance); + } + } + }; + + // Adding key bindings + makeBinding(textArea, ctrl_s, "save_msg", save); + makeBinding(textArea, ctrl_c, "copy_msg", copy); + makeBinding(textArea, ctrl_v, "paste_msg", paste); + makeBinding(textArea, ctrl_x, "cut_msg", cut); + + } + + private void makeBinding(TextArea area, KeyStroke key, String msg, Action act) { + area.getInputMap().put(key, msg); + area.getActionMap().put(msg, act); + } +} + diff --git a/src/main/java/nz/ac/massey/cs/flackpad/Window.java b/src/main/java/nz/ac/massey/cs/flackpad/Window.java index 64c5e6a..f4a7e67 100644 --- a/src/main/java/nz/ac/massey/cs/flackpad/Window.java +++ b/src/main/java/nz/ac/massey/cs/flackpad/Window.java @@ -32,6 +32,9 @@ class Window extends JFrame { textArea = new TextArea(this); frame.add(new JScrollPane(textArea)); + // Add key bindings to instance + new KeyBinder(this); + frame.setSize(1000, 500); frame.setVisible(true); frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);