Gridarta Editor
MapFolderTreeActions.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.gui.mapfiles;
21 
22 import javax.swing.Action;
23 import javax.swing.JCheckBoxMenuItem;
24 import javax.swing.JMenu;
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 MapFolderTreeActions<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements EditorAction {
44 
48  @NotNull
49  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
50 
54  @NotNull
56 
60  @NotNull
62 
66  @NotNull
68 
72  @NotNull
73  private final String createFolderKey;
74 
78  @NotNull
79  private final String deleteFolderKey;
80 
84  @NotNull
85  private final String confirmDeleteFolderKey;
86 
90  @NotNull
91  private final String deleteFolderNotEmptyKey;
92 
96  @Nullable
97  private JMenu folderMenu;
98 
102  @Nullable
104 
108  @Nullable
109  private Action aCreateFolderAction;
110 
114  @Nullable
115  private Action aDeletePickmapFolder;
116 
121  @NotNull
123 
124  @Override
125  public void activeMapFolderChanged(@Nullable final MapFolder<G, A, R> mapFolder) {
126  activeMapFolder = mapFolder;
127  refresh();
128  }
129 
130  @Override
131  public void folderAdded(@NotNull final MapFolder<G, A, R> mapFolder) {
132  refresh();
133  }
134 
135  @Override
136  public void folderRemoved(@NotNull final MapFolder<G, A, R> mapFolder) {
137  refresh();
138  }
139 
140  };
141 
146  @NotNull
148 
149  @Override
150  public void lockedChanged(final boolean locked) {
151  refresh();
152  }
153 
154  };
155 
168  public MapFolderTreeActions(@NotNull final MapFolderTree<G, A, R> mapFolderTree, @NotNull final PickmapSettings pickmapSettings, @NotNull final NewMapDialogFactory<G, A, R> newMapDialogFactory, @NotNull final String createFolderKey, @NotNull final String deleteFolderKey, @NotNull final String confirmDeleteFolderKey, @NotNull final String deleteFolderNotEmptyKey) {
169  this.mapFolderTree = mapFolderTree;
170  this.pickmapSettings = pickmapSettings;
171  this.newMapDialogFactory = newMapDialogFactory;
172  this.createFolderKey = createFolderKey;
173  this.deleteFolderKey = deleteFolderKey;
174  this.confirmDeleteFolderKey = confirmDeleteFolderKey;
175  this.deleteFolderNotEmptyKey = deleteFolderNotEmptyKey;
176  mapFolderTree.addModelListener(mapFolderTreeListener);
177  activeMapFolder = mapFolderTree.getActiveMapFolder();
178  pickmapSettings.addPickmapSettingsListener(pickmapSettingsListener);
179  refresh();
180  }
181 
187  @Deprecated
188  public void setPickmapFoldersMenu(@Nullable final JMenu folderMenu) {
189  this.folderMenu = folderMenu;
190  refresh();
191  }
192 
196  private void refresh() {
197  if (aCreateFolderAction != null) {
198  //noinspection ConstantConditions
199  aCreateFolderAction.setEnabled(doCreateFolder(false));
200  }
201  if (aDeletePickmapFolder != null) {
202  //noinspection ConstantConditions
203  aDeletePickmapFolder.setEnabled(doDeletePickmapFolder(false));
204  }
205 
206  if (folderMenu == null) {
207  return;
208  }
209 
210  MenuUtils.removeAll(folderMenu);
211  for (final MapFolder<G, A, R> mapFolder : mapFolderTree) {
212  final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem();
213  final Action action = new MapFolderTreeAction<>(mapFolderTree, mapFolder, menuItem);
214  menuItem.setAction(action);
215  menuItem.setSelected(mapFolder == activeMapFolder);
216  assert folderMenu != null;
217  folderMenu.add(menuItem);
218  }
219  }
220 
224  @ActionMethod
225  public void createPickmapFolder() {
226  doCreateFolder(true);
227  }
228 
234  private boolean doCreateFolder(final boolean performAction) {
235  if (pickmapSettings.isLocked()) {
236  return false;
237  }
238 
239  if (performAction) {
240  newMapDialogFactory.showNewPickmapFolderDialog(mapFolderTree, activeMapFolder);
241  }
242 
243  return true;
244  }
245 
249  @ActionMethod
250  public void deletePickmapFolder() {
251  doDeletePickmapFolder(true);
252  }
253 
259  private boolean doDeletePickmapFolder(final boolean performAction) {
260  if (pickmapSettings.isLocked()) {
261  return false;
262  }
263 
264  final MapFolder<G, A, R> mapFolder = activeMapFolder;
265  if (mapFolder == null || mapFolder.getParent() == null) {
266  return false;
267  }
268 
269  if (performAction) {
270  if (mapFolder.getPickmaps() > 0 && !ACTION_BUILDER.showQuestionDialog(null/*XXX:parent*/, confirmDeleteFolderKey, mapFolder.getName(), mapFolder.getPickmaps())) {
271  return false;
272  }
273 
274  try {
275  mapFolderTree.removeMapFolder(mapFolder, true);
276  } catch (final MapFolderNotEmptyException ex) {
277  ACTION_BUILDER.showMessageDialog(null/*XXX:parent*/, deleteFolderNotEmptyKey, mapFolder.getName());
278  }
279  }
280 
281  return true;
282  }
283 
284  @Override
285  public void setAction(@NotNull final Action action, @NotNull final String name) {
286  if (name.equals(createFolderKey)) {
287  aCreateFolderAction = action;
288  } else if (name.equals(deleteFolderKey)) {
289  aDeletePickmapFolder = action;
290  } else {
291  throw new IllegalArgumentException();
292  }
293  refresh();
294  }
295 
296 }
Action aDeletePickmapFolder
Action called for "delete active folder".
Interface for event listeners that are interested in changes on PickmapSettings.
void refresh()
Updates the actions&#39; states.
static final ActionBuilder ACTION_BUILDER
Action Builder.
final MapFolderTree< G, A, R > mapFolderTree
The model to operate on.
Graphical User Interface of Gridarta.
void createPickmapFolder()
Action callback function to create a new pickmap folder.
boolean doCreateFolder(final boolean performAction)
Executes the "create folder" action.
synchronized void removeMapFolder(@NotNull final MapFolder< G, A, R > mapFolder, final boolean deleteFile)
Removes a map folder from this model.
void deletePickmapFolder()
Action callback function to delete the current pickmap folder.
final NewMapDialogFactory< G, A, R > newMapDialogFactory
The factory for creating new pickmap folders.
static void removeAll(@NotNull final JMenu menu)
Remove all menu entries.
Definition: MenuUtils.java:72
final String confirmDeleteFolderKey
The dialog key for "confirm delete folder?".
MapFolderTreeActions(@NotNull final MapFolderTree< G, A, R > mapFolderTree, @NotNull final PickmapSettings pickmapSettings, @NotNull final NewMapDialogFactory< G, A, R > newMapDialogFactory, @NotNull final String createFolderKey, @NotNull final String deleteFolderKey, @NotNull final String confirmDeleteFolderKey, @NotNull final String deleteFolderNotEmptyKey)
Creates a new instance.
MapFolder< G, A, R > activeMapFolder
The last known active folder.
Encapsulates functionality related to actions for pickmap folder selection.
Base package of all Gridarta classes.
void setPickmapFoldersMenu(@Nullable final JMenu folderMenu)
Sets the pickmap folders menu to manage.
final MapFolderTreeListener< G, A, R > mapFolderTreeListener
The MapFolderTreeListener which is registered to the selected pickmap.
void showNewPickmapFolderDialog(@NotNull final MapFolderTree< G, A, R > mapFolderTree, @Nullable final MapFolder< G, A, R > parent)
Shows a dialog for creating a new pickmap folder.
Action aCreateFolderAction
Action for "create folder".
Reflects a game object (object on a map).
Definition: GameObject.java:36
int getPickmaps()
Returns the number of pickmaps in this folder.
Definition: MapFolder.java:221
Utility class implementing menu related functions.
Definition: MenuUtils.java:39
final PickmapSettingsListener pickmapSettingsListener
The PickmapSettingsListener attached to pickmapSettings.
A global editor action.
final String deleteFolderKey
The action key for "delete folder".
GameObjects are the objects based on Archetypes found on maps.
void setAction(@NotNull final Action action, @NotNull final String name)
Sets the Action instance for this editor action.
Utility class to create NewMapDialog instances.
String getName()
Returns the name.
Definition: MapFolder.java:130
final PickmapSettings pickmapSettings
The PickmapSettings to use.
JMenu folderMenu
The pickmap folders menu to update.
boolean isLocked()
Returns whether pickmaps are immutable.
boolean doDeletePickmapFolder(final boolean performAction)
Executes the "delete pickmap" action.
MapFolder< G, A, R > getParent()
Returns the parent folder.
Definition: MapFolder.java:121
final String createFolderKey
The action key for "create folder".
final String deleteFolderNotEmptyKey
The dialog key for "folder is not empty".
An action for the entry in the pickmaps folder menu.
Container for settings that affect pickmaps.