4 package net
.kezvh
.toady
;
6 import java
.awt
.event
.ActionEvent
;
7 import java
.awt
.event
.InputEvent
;
8 import java
.awt
.event
.KeyEvent
;
9 import java
.awt
.event
.KeyListener
;
10 import java
.beans
.PropertyChangeListener
;
12 import java
.io
.FileWriter
;
13 import java
.io
.IOException
;
14 import java
.util
.ArrayList
;
15 import java
.util
.List
;
17 import javax
.swing
.Action
;
18 import javax
.swing
.JCheckBoxMenuItem
;
19 import javax
.swing
.JFileChooser
;
20 import javax
.swing
.JFrame
;
21 import javax
.swing
.JMenu
;
22 import javax
.swing
.JMenuBar
;
23 import javax
.swing
.JMenuItem
;
24 import javax
.swing
.JRadioButtonMenuItem
;
25 import javax
.swing
.JScrollPane
;
26 import javax
.swing
.JTextArea
;
27 import javax
.swing
.KeyStroke
;
28 import javax
.swing
.event
.CaretEvent
;
29 import javax
.swing
.event
.CaretListener
;
37 private static int dot
;
38 private static int mark
;
40 private interface ToadyAction
{
44 private static final class AreaDeletedToadyAction
implements ToadyAction
{
49 public AreaDeletedToadyAction(final int dot
, final int mark
) {
55 private final int _dot
;
56 private final int _mark
;
59 * @see java.lang.Object#toString()
63 public String
toString() {
64 return "<ToadyAction>" + "<dot>" + this._dot
+ "</dot>" + "<mark>" + this._mark
+ "</mark>" + "</ToadyAction>";
68 private static final class KeyPressedToadyAction
implements ToadyAction
{
70 private final int index
;
72 public KeyPressedToadyAction(final char c
, final int index
) {
78 * @see java.lang.Object#toString()
82 public String
toString() {
83 return "<ToadyAction>" + "<key>" + Character
.toString(this.c
) + "</key>" + "<index>" + this.index
+ "</index>" + "</ToadyAction>";
87 private static final List
<ToadyAction
> sequenceOfEdits
= new ArrayList
<ToadyAction
>();
92 public static void main(final String
[] args
) {
93 final JFrame frame
= new JFrame("Toady");
95 final JMenuBar menuBar
;
96 final JMenu fileMenu
, editMenu
;
98 final JMenuItem saveMenuItem
, openMenuItem
, undoMenuItem
;
99 final JRadioButtonMenuItem rbMenuItem
;
100 final JCheckBoxMenuItem cbMenuItem
;
102 //Create the menu bar.
103 menuBar
= new JMenuBar();
105 fileMenu
= new JMenu("File");
106 fileMenu
.setMnemonic(KeyEvent
.VK_A
);
107 fileMenu
.getAccessibleContext().setAccessibleDescription("The only menu in this program that has menu items");
108 menuBar
.add(fileMenu
);
110 saveMenuItem
= new JMenuItem("Save", KeyEvent
.VK_S
);
111 saveMenuItem
.setAccelerator(KeyStroke
.getKeyStroke(KeyEvent
.VK_1
, ActionEvent
.ALT_MASK
));
112 saveMenuItem
.getAccessibleContext().setAccessibleDescription("Save");
113 saveMenuItem
.setAction(new Action() {
115 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
119 public void actionPerformed(final ActionEvent e
) {
120 final JFileChooser chooser
= new JFileChooser();
122 // if you ahve a suggested file name to start with, use that
124 final int response
= chooser
.showSaveDialog(frame
);
125 if (response
== JFileChooser
.APPROVE_OPTION
) {// user clicked Save
126 final File file
= chooser
.getSelectedFile();
128 final FileWriter fileWriter
= new FileWriter(file
);
129 for (final ToadyAction toadyAction
: Toady
.sequenceOfEdits
)
130 fileWriter
.write(toadyAction
.toString() + "\n");
133 } catch (final IOException e1
) {
134 // TODO Auto-generated catch block
135 e1
.printStackTrace();
143 private boolean enabled
= true;
146 public void addPropertyChangeListener(final PropertyChangeListener listener
) {
147 // TODO Auto-generated method stub
152 public Object
getValue(final String key
) {
153 // TODO Auto-generated method stub
158 public boolean isEnabled() {
159 // TODO Auto-generated method stub
164 public void putValue(final String key
, final Object value
) {
165 // TODO Auto-generated method stub
170 public void removePropertyChangeListener(final PropertyChangeListener listener
) {
171 // TODO Auto-generated method stub
176 public void setEnabled(final boolean b
) {
177 // TODO Auto-generated method stub
181 fileMenu
.add(saveMenuItem
);
183 openMenuItem
= new JMenuItem("Open", KeyEvent
.VK_O
);
184 openMenuItem
.setAccelerator(KeyStroke
.getKeyStroke(KeyEvent
.VK_2
, ActionEvent
.ALT_MASK
));
185 openMenuItem
.getAccessibleContext().setAccessibleDescription("Open");
186 fileMenu
.add(openMenuItem
);
188 editMenu
= new JMenu("Edit");
189 editMenu
.setMnemonic(KeyEvent
.VK_E
);
190 editMenu
.getAccessibleContext().setAccessibleDescription("The only menu in this program that has menu items");
191 menuBar
.add(editMenu
);
193 undoMenuItem
= new JMenuItem("Undo", KeyEvent
.VK_Z
);
194 undoMenuItem
.setAccelerator(KeyStroke
.getKeyStroke(KeyEvent
.VK_3
, ActionEvent
.ALT_MASK
));
195 undoMenuItem
.getAccessibleContext().setAccessibleDescription("Undo");
196 editMenu
.add(undoMenuItem
);
198 frame
.setJMenuBar(menuBar
);
200 final JTextArea textArea
= new JTextArea(5, 20);
201 textArea
.setLineWrap(true);
203 textArea
.addCaretListener(new CaretListener() {
205 * @see javax.swing.event.CaretListener#caretUpdate(javax.swing.event.CaretEvent)
209 public void caretUpdate(final CaretEvent e
) {
210 // TODO Auto-generated method stub
211 Toady
.dot
= e
.getDot();
212 Toady
.mark
= e
.getMark();
216 textArea
.addKeyListener(new KeyListener() {
218 * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
222 public void keyPressed(final KeyEvent e
) {
227 * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
231 public void keyReleased(final KeyEvent e
) {
236 * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
240 public void keyTyped(final KeyEvent e
) {
241 if ((e
.getModifiers() & (InputEvent
.ALT_DOWN_MASK
| InputEvent
.CTRL_DOWN_MASK
)) != 0)
244 final JTextArea component
= (JTextArea
) e
.getComponent();
245 if (Toady
.dot
!= Toady
.mark
)
246 Toady
.sequenceOfEdits
.add(new AreaDeletedToadyAction(Toady
.dot
, Toady
.mark
));
247 Toady
.sequenceOfEdits
.add(new KeyPressedToadyAction(e
.getKeyChar(), Toady
.dot
));
251 final JScrollPane scrollPane
= new JScrollPane(textArea
);
253 frame
.getContentPane().add(scrollPane
);
255 frame
.setDefaultCloseOperation(JFrame
.EXIT_ON_CLOSE
);
257 frame
.setVisible(true);
258 // TODO Auto-generated method stub