Gridarta Editor
ScriptEditUndoActions.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.textedit.scripteditor;
21 
22 import java.util.HashMap;
23 import java.util.Map;
24 import javax.swing.Action;
25 import javax.swing.event.UndoableEditEvent;
26 import javax.swing.event.UndoableEditListener;
27 import javax.swing.text.Document;
28 import javax.swing.undo.CannotRedoException;
29 import javax.swing.undo.CannotUndoException;
30 import javax.swing.undo.UndoManager;
31 import javax.swing.undo.UndoableEdit;
33 import net.sf.japi.swing.action.ActionBuilder;
34 import net.sf.japi.swing.action.ActionBuilderFactory;
35 import net.sf.japi.swing.action.ActionMethod;
36 import org.jetbrains.annotations.NotNull;
37 import org.jetbrains.annotations.Nullable;
38 
43 public class ScriptEditUndoActions {
44 
48  @NotNull
49  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
50 
54  @NotNull
55  private final Action aUndo = ACTION_BUILDER.createAction(true, "scriptEditUndo", this);
56 
60  @NotNull
61  private final Action aRedo = ACTION_BUILDER.createAction(true, "scriptEditRedo", this);
62 
66  @NotNull
67  private final Map<Document, UndoManager> undo = new HashMap<>();
68 
72  @Nullable
73  private Document currentDocument;
74 
79  @NotNull
80  private final UndoableEditListener undoableEditListener = new UndoableEditListener() {
81 
82  @Override
83  public void undoableEditHappened(final UndoableEditEvent e) {
84  getUndoManager((Document) e.getSource()).addEdit(e.getEdit());
85  refresh();
86  }
87 
88  };
89 
94  public void addDocument(@NotNull final Document document) {
95  assert !undo.containsKey(document);
96  document.addUndoableEditListener(undoableEditListener);
97  undo.put(document, new UndoManager());
98  }
99 
104  public void removeDocument(@NotNull final Document document) {
105  assert undo.containsKey(document);
106  undo.remove(document);
107  document.removeUndoableEditListener(undoableEditListener);
108  if (currentDocument == document) {
109  setCurrentDocument(null);
110  }
111  }
112 
117  public void resetUndo(@NotNull final Document document) {
118  getUndoManager(document).discardAllEdits();
119  }
120 
124  @ActionMethod
125  public void scriptEditUndo() {
126  final UndoManager undoManager = getCurrentUndoManager();
127  try {
128  if (undoManager != null && undoManager.canUndo()) {
129  undoManager.undo();
130  refresh();
131  }
132  } catch (final CannotUndoException ignored) {
133  // ignore
134  }
135  }
136 
140  @ActionMethod
141  public void scriptEditRedo() {
142  final UndoManager undoManager = getCurrentUndoManager();
143  try {
144  if (undoManager != null && undoManager.canRedo()) {
145  undoManager.redo();
146  refresh();
147  }
148  } catch (final CannotRedoException ignored) {
149  }
150  }
151 
155  private void refresh() {
156  final UndoableEdit undoManager = getCurrentUndoManager();
157 
158  final boolean canUndo = undoManager != null && undoManager.canUndo();
159  aUndo.setEnabled(canUndo);
160  if (canUndo) {
161  aUndo.putValue(Action.NAME, ACTION_BUILDER.format("scriptEditUndo.name", undoManager.getUndoPresentationName()));
162  } else {
163  aUndo.putValue(Action.NAME, ActionBuilderUtils.getString(ACTION_BUILDER, "scriptEditUndo.text"));
164  }
165 
166  final boolean canRedo = undoManager != null && undoManager.canRedo();
167  aRedo.setEnabled(canRedo);
168  if (canRedo) {
169  aRedo.putValue(Action.NAME, ACTION_BUILDER.format("scriptEditRedo.name", undoManager.getRedoPresentationName()));
170  } else {
171  aRedo.putValue(Action.NAME, ActionBuilderUtils.getString(ACTION_BUILDER, "scriptEditRedo.text"));
172  }
173  }
174 
179  public void setCurrentDocument(@Nullable final Document currentDocument) {
180  if (this.currentDocument != currentDocument) {
181  this.currentDocument = currentDocument;
182  refresh();
183  }
184  }
185 
191  @NotNull
192  private UndoManager getUndoManager(@NotNull final Document document) {
193  final UndoManager result = undo.get(document);
194  assert result != null;
195  return result;
196  }
197 
203  @Nullable
204  private UndoManager getCurrentUndoManager() {
205  return currentDocument == null ? null : getUndoManager(currentDocument);
206  }
207 
208 }
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.getCurrentUndoManager
UndoManager getCurrentUndoManager()
Definition: ScriptEditUndoActions.java:204
net.sf.gridarta
net.sf
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.removeDocument
void removeDocument(@NotNull final Document document)
Definition: ScriptEditUndoActions.java:104
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.aRedo
final Action aRedo
Definition: ScriptEditUndoActions.java:61
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.resetUndo
void resetUndo(@NotNull final Document document)
Definition: ScriptEditUndoActions.java:117
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: ScriptEditUndoActions.java:49
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.getUndoManager
UndoManager getUndoManager(@NotNull final Document document)
Definition: ScriptEditUndoActions.java:192
net
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.scriptEditRedo
void scriptEditRedo()
Definition: ScriptEditUndoActions.java:141
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.scriptEditUndo
void scriptEditUndo()
Definition: ScriptEditUndoActions.java:125
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.refresh
void refresh()
Definition: ScriptEditUndoActions.java:155
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.setCurrentDocument
void setCurrentDocument(@Nullable final Document currentDocument)
Definition: ScriptEditUndoActions.java:179
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.undo
final Map< Document, UndoManager > undo
Definition: ScriptEditUndoActions.java:67
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.currentDocument
Document currentDocument
Definition: ScriptEditUndoActions.java:73
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.undoableEditListener
final UndoableEditListener undoableEditListener
Definition: ScriptEditUndoActions.java:80
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.addDocument
void addDocument(@NotNull final Document document)
Definition: ScriptEditUndoActions.java:94
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions.aUndo
final Action aUndo
Definition: ScriptEditUndoActions.java:55
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.textedit.scripteditor.ScriptEditUndoActions
Definition: ScriptEditUndoActions.java:43