1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.support.components;
14
15 import java.awt.Dimension;
16 import java.awt.Toolkit;
17 import java.awt.event.FocusEvent;
18 import java.awt.event.FocusListener;
19 import java.awt.event.KeyAdapter;
20 import java.awt.event.KeyEvent;
21
22 import javax.swing.JTextArea;
23 import javax.swing.KeyStroke;
24 import javax.swing.event.UndoableEditEvent;
25 import javax.swing.event.UndoableEditListener;
26 import javax.swing.undo.CannotRedoException;
27 import javax.swing.undo.CannotUndoException;
28 import javax.swing.undo.UndoManager;
29
30 import com.eviware.soapui.support.UISupport;
31 import com.eviware.soapui.support.actions.FindAndReplaceDialog;
32 import com.eviware.soapui.support.actions.FindAndReplaceable;
33 import com.eviware.soapui.support.components.JEditorStatusBar.JEditorStatusBarTarget;
34 import com.eviware.soapui.support.swing.JTextComponentPopupMenu;
35
36 /***
37 * JTextArea with Undo/Redo keyboard/popup support
38 *
39 * @author Ole.Matzura
40 */
41
42 public class JUndoableTextArea extends JTextArea implements Undoable, UndoableEditListener, FocusListener, FindAndReplaceable, JEditorStatusBarTarget
43 {
44 public static final int UNDO_LIMIT = 1500;
45
46 private UndoManager undoManager;
47 private boolean discardEditsOnSet = false;
48 private FindAndReplaceDialog findAndReplaceAction;
49
50 public JUndoableTextArea()
51 {
52 super();
53 init();
54 }
55
56 private void init()
57 {
58
59 getDocument().addUndoableEditListener(this);
60 addFocusListener(this);
61
62 setMinimumSize( new Dimension( 50, 50 ));
63 addKeyListener( new KeyAdapter() {
64
65 public void keyPressed(KeyEvent e)
66 {
67 if( KeyStroke.getKeyStrokeForEvent( e ).equals( UISupport.getKeyStroke( "menu Z" )))
68 undo();
69 else if( KeyStroke.getKeyStrokeForEvent( e ).equals( UISupport.getKeyStroke( "menu Y" )))
70 redo();
71 else if( KeyStroke.getKeyStrokeForEvent( e ).equals( UISupport.getKeyStroke( "menu X" )))
72 cut();
73 else if( KeyStroke.getKeyStrokeForEvent( e ).equals( UISupport.getKeyStroke( "menu C" )))
74 copy();
75 else if( KeyStroke.getKeyStrokeForEvent( e ).equals( UISupport.getKeyStroke( "F3" )))
76 findAndReplace();
77 }} );
78
79 JTextComponentPopupMenu.add( this );
80 }
81
82 public JUndoableTextArea( int i, int j )
83 {
84 super( i, j );
85 init();
86 }
87
88 public JUndoableTextArea( String text )
89 {
90 super( text );
91 init();
92 }
93
94 protected void findAndReplace()
95 {
96 if( findAndReplaceAction == null )
97 findAndReplaceAction = new FindAndReplaceDialog( this );
98
99 findAndReplaceAction.show();
100 }
101
102 public void setText(String text)
103 {
104 ensureUndoManager();
105 super.setText(text == null ? "" : text);
106
107 if( discardEditsOnSet && undoManager != null )
108 undoManager.discardAllEdits();
109 }
110
111 public boolean isDiscardEditsOnSet()
112 {
113 return discardEditsOnSet;
114 }
115
116 public void setDiscardEditsOnSet(boolean discardEditsOnSet)
117 {
118 this.discardEditsOnSet = discardEditsOnSet;
119 }
120
121 public UndoManager getUndoManager()
122 {
123 return undoManager;
124 }
125
126 private void ensureUndoManager()
127 {
128 if (isEditable() && undoManager == null )
129 {
130 undoManager = new UndoManager();
131 undoManager.setLimit(UNDO_LIMIT);
132 }
133 }
134
135 public void focusGained(FocusEvent fe)
136 {
137 ensureUndoManager();
138 }
139
140 public void focusLost(FocusEvent fe)
141 {
142
143 }
144
145 public void undoableEditHappened(UndoableEditEvent e)
146 {
147 if (undoManager != null)
148 undoManager.addEdit(e.getEdit());
149 }
150
151 public void undo()
152 {
153 if( !isEditable() )
154 {
155 getToolkit().beep();
156 return;
157 }
158
159 try
160 {
161 if( undoManager != null )
162 undoManager.undo();
163 }
164 catch (CannotUndoException cue)
165 {
166 Toolkit.getDefaultToolkit().beep();
167 }
168 }
169
170 public void redo()
171 {
172 if( !isEditable() )
173 {
174 getToolkit().beep();
175 return;
176 }
177
178 try
179 {
180 if( undoManager != null )
181 undoManager.redo();
182 }
183 catch (CannotRedoException cue)
184 {
185 Toolkit.getDefaultToolkit().beep();
186 }
187 }
188
189 public void setSelectedText(String txt)
190 {
191 replaceSelection( txt );
192 }
193
194 public boolean canRedo()
195 {
196 return undoManager != null && undoManager.canRedo();
197 }
198
199 public boolean canUndo()
200 {
201 return undoManager != null && undoManager.canUndo();
202 }
203 }