Created
January 12, 2022 17:13
-
-
Save walteralleyz/315fcb1434abb225825de674f668d142 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
abstract class Command { | |
public Editor editor; | |
private String backup; | |
Command(Editor editor) { | |
this.editor = editor; | |
} | |
void backup() { | |
backup = editor.textField.getText(); | |
} | |
public void undo() { | |
editor.textField.setText(backup); | |
} | |
public abstract boolean execute(); | |
} | |
class CopyCommand extends Command { | |
public CopyCommand(Editor editor) { | |
super(editor); | |
} | |
@Override | |
public boolean execute() { | |
editor.clipboard = editor.textField.getSelectedText(); | |
return false; | |
} | |
} | |
class PasteCommand extends Command { | |
public PasteCommand(Editor editor) { | |
super(editor); | |
} | |
@Override | |
public boolean execute() { | |
if (editor.clipboard == null || editor.clipboard.isEmpty()) return false; | |
backup(); | |
editor.textField.insert(editor.clipboard, editor.textField.getCaretPosition()); | |
return true; | |
} | |
} | |
class CommandHistory { | |
private Stack<Command> history = new Stack<>(); | |
public void push(Command c) { | |
history.push(c); | |
} | |
public Command pop() { | |
return history.pop(); | |
} | |
public boolean isEmpty() { return history.isEmpty(); } | |
} | |
class Editor { | |
public JTextArea textField; | |
public String clipboard; | |
private CommandHistory history = new CommandHistory(); | |
public void init() { | |
JFrame frame = new JFrame("Text editor (type & use buttons, Luke!)"); | |
JPanel content = new JPanel(); | |
frame.setContentPane(content); | |
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); | |
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); | |
textField = new JTextArea(); | |
textField.setLineWrap(true); | |
content.add(textField); | |
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.CENTER)); | |
JButton ctrlC = new JButton("Ctrl+C"); | |
JButton ctrlX = new JButton("Ctrl+X"); | |
Editor editor = this; | |
ctrlC.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent e) { | |
executeCommand(new CopyCommand(editor)); | |
} | |
}); | |
ctrlX.addActionListener(new ActionListener() { | |
@Override | |
public void actionPerformed(ActionEvent e) { | |
executeCommand(new CutCommand(editor)); | |
} | |
}); | |
buttons.add(ctrlC); | |
buttons.add(ctrlX); | |
content.add(buttons); | |
frame.setSize(450, 200); | |
frame.setLocationRelativeTo(null); | |
frame.setVisible(true); | |
} | |
private void executeCommand(Command command) { | |
if (command.execute()) { | |
history.push(command); | |
} | |
} | |
private void undo() { | |
if (history.isEmpty()) return; | |
Command command = history.pop(); | |
if (command != null) { | |
command.undo(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment