Gridarta Editor
PickmapChooserView.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 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.panel.pickmapchooser;
21 
22 import java.awt.Component;
23 import java.io.File;
24 import java.io.IOException;
25 import javax.swing.BorderFactory;
26 import javax.swing.JPopupMenu;
27 import javax.swing.JTabbedPane;
28 import javax.swing.SwingConstants;
29 import javax.swing.event.ChangeListener;
48 import net.sf.gridarta.utils.Size2D;
49 import org.apache.log4j.Category;
50 import org.apache.log4j.Logger;
51 import org.jetbrains.annotations.NotNull;
52 import org.jetbrains.annotations.Nullable;
53 
58 public class PickmapChooserView<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> {
59 
63  @NotNull
64  private static final Category LOG = Logger.getLogger(PickmapChooserView.class);
65 
69  @NotNull
71 
75  @NotNull
77 
81  @NotNull
83 
87  @NotNull
89 
93  @NotNull
95 
99  @NotNull
100  private final JTabbedPane pickmapPanel = new JTabbedPane(SwingConstants.TOP);
101 
105  @Nullable
107 
111  @NotNull
113 
114  @Override
115  public void activeMapFolderChanged(@Nullable final MapFolder<G, A, R> mapFolder) {
116  if (activeMapFolder != null) {
118  }
119  activeMapFolder = mapFolder;
120  if (activeMapFolder != null) {
122  }
123 
124  synchronized (mapFolderTree) {
126  pickmapPanel.removeAll();
127  if (activeMapFolder != null) {
128  for (final PickmapState<G, A, R> pickmapState : activeMapFolder) {
129  addPickmap(pickmapState);
130  }
131  }
132  }
133  }
134 
135  @Override
136  public void folderAdded(@NotNull final MapFolder<G, A, R> mapFolder) {
137  // ignore
138  }
139 
140  @Override
141  public void folderRemoved(@NotNull final MapFolder<G, A, R> mapFolder) {
142  // ignore
143  }
144 
145  };
146 
150  @NotNull
152 
153  @Override
154  public void pickmapAdded(@NotNull final PickmapState<G, A, R> pickmapState) {
155  addPickmap(pickmapState);
156  }
157 
158  @Override
159  public void pickmapRemoved(@NotNull final PickmapState<G, A, R> pickmapState) {
160  removePickmap(pickmapState);
161  }
162 
163  @Override
164  public void pickmapReverted(@NotNull final PickmapState<G, A, R> pickmapState, @NotNull final MapControl<G, A, R> oldPickmap) {
165  revertPickmap(pickmapState, oldPickmap);
166  }
167 
168  };
169 
174  @NotNull
176 
177  @Override
178  public void activePickmapChanged(@Nullable final PickmapState<G, A, R> pickmapState) {
179  }
180 
181  @Override
182  public void pickmapReverted(@NotNull final PickmapState<G, A, R> pickmapState) {
183  }
184 
185  @Override
186  public void pickmapModifiedChanged(final int index, @NotNull final PickmapState<G, A, R> pickmapState) {
187  pickmapPanel.setTitleAt(index, getTitle(pickmapState));
188  }
189 
190  };
191 
201  this.pickmapChooserModel = pickmapChooserModel;
202  this.mapFolderTree = mapFolderTree;
203  this.mapArchObjectFactory = mapArchObjectFactory;
204  this.mapReaderFactory = mapReaderFactory;
205  this.pickmapManager = pickmapManager;
207  pickmapPanel.setBorder(BorderFactory.createEmptyBorder(CommonConstants.SPACE_PICKMAP_ARCHETYPE_TOP, 0, 0, 0));
209  //noinspection SynchronizationOnLocalVariableOrMethodParameter
210  synchronized (mapFolderTree) {
212  }
213  }
214 
219  public void setPopupMenu(@NotNull final JPopupMenu popupMenu) {
220  pickmapPanel.setComponentPopupMenu(popupMenu);
221  }
222 
228  public void addChangeListener(@NotNull final ChangeListener changeListener) {
229  pickmapPanel.addChangeListener(changeListener);
230  }
231 
236  private void addPickmap(@NotNull final PickmapState<G, A, R> pickmapState) {
237  try {
238  pickmapState.loadPickmap();
239  } catch (final IOException ex) {
240  LOG.warn("cannot load pickmap " + pickmapState.getFile() + ": " + ex.getMessage());
241  return;
242  }
243 
244  final int index = pickmapChooserModel.addMapFile(pickmapState);
245  final MapView<G, A, R> mapView = pickmapState.getMapView();
246  pickmapPanel.insertTab(getTitle(pickmapState), null, mapView == null ? null : mapView.getScrollPane(), null, index);
247  }
248 
253  private void removePickmap(@NotNull final PickmapState<G, A, R> pickmapState) {
254  final int index = pickmapChooserModel.removeMapFile(pickmapState);
255  if (index >= 0) {
256  pickmapPanel.remove(index);
257  }
258  }
259 
265  private void revertPickmap(@NotNull final PickmapState<G, A, R> pickmapState, @NotNull final MapControl<G, A, R> oldPickmap) {
266  final int index = pickmapChooserModel.revertMapFile(oldPickmap, pickmapState);
267  if (index == -1) {
268  return;
269  }
270  pickmapPanel.setTitleAt(index, getTitle(pickmapState));
271  final MapView<G, A, R> mapView = pickmapState.getMapView();
272  pickmapPanel.setComponentAt(index, mapView == null ? null : mapView.getScrollPane());
273  }
274 
279  private void setActivePickmap(@NotNull final PickmapState<G, A, R> pickmapState) {
280  final int index = pickmapChooserModel.indexOf(pickmapState);
281  if (index == -1) {
282  return;
283  }
284  pickmapPanel.setSelectedIndex(index);
285  }
286 
292  @NotNull
293  private String getTitle(@NotNull final PickmapState<G, A, R> pickmapState) {
294  final String name = pickmapState.getFile().getName();
295  final MapControl<G, A, R> mapControl = pickmapState.getPickmap();
296  final boolean modified = mapControl != null && mapControl.getMapModel().isModified();
297  return modified ? name + " *" : name;
298  }
299 
304  @NotNull
305  public Component getPickmapPanel() {
306  return pickmapPanel;
307  }
308 
313  public int getSelectedIndex() {
314  return pickmapPanel.getSelectedIndex();
315  }
316 
324  public void newPickmap(@NotNull final Size2D mapSize, @NotNull final String pickmapName) throws DuplicatePickmapException, IOException {
326  if (activeMapFolder == null) {
327  return;
328  }
329 
330  if (!PickmapState.isValidPickmapName(pickmapName)) {
331  throw new IOException("invalid pickmap name: " + pickmapName);
332  }
333 
334  for (final PickmapState<G, A, R> pickmapState : activeMapFolder) {
335  if (pickmapName.equals(pickmapState.getFile().getName())) {
336  throw new DuplicatePickmapException(pickmapName);
337  }
338  }
339  final MapFile mapFile2 = new MapFile(new MapFile(activeMapFolder.getDir()), MapPathUtils.newMapPath(pickmapName));
340 
341  if (mapFile2.getFile().isDirectory()) {
342  throw new IOException("pickmap file is a directory: " + mapFile2);
343  }
344  if (mapFile2.getFile().exists()) {
345  throw new IOException("pickmap file exists: " + mapFile2);
346  }
347 
348  final File dir = mapFile2.getFile().getParentFile();
349  if (!dir.exists()) {
350  if (!dir.mkdirs()) {
351  throw new IOException("cannot create directory: " + dir);
352  }
353  }
354 
355  final A mapArchObject = mapArchObjectFactory.newMapArchObject(true);
356  mapArchObject.setMapSize(mapSize);
357  mapArchObject.setMapName(pickmapName);
358  final MapControl<G, A, R> mapControl = pickmapManager.newMap(null, mapArchObject, mapFile2, false);
359  try {
360  mapControl.save();
361  } finally {
362  pickmapManager.release(mapControl);
363  }
364 
365  final PickmapState<G, A, R> pickmapState;
366  try {
367  pickmapState = activeMapFolder.addPickmap(pickmapName, mapReaderFactory, pickmapManager);
368  } catch (final InvalidNameException ex) {
369  throw new AssertionError(ex); // the name has been checked before
370  }
371  setActivePickmap(pickmapState);
372  }
373 
374 }
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView
A View for choosing pickmaps.
Definition: PickmapChooserView.java:58
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.getTitle
String getTitle(@NotNull final PickmapState< G, A, R > pickmapState)
Returns the title of a pickmap to use as the tab name.
Definition: PickmapChooserView.java:293
net.sf.gridarta.gui.mapfiles.MapFolderTreeListener
Interface for listeners interested in events of MapFolderTrees.
Definition: MapFolderTreeListener.java:34
net.sf.gridarta.model.mapmanager.MapManager
A MapManager manages all opened maps.
Definition: MapManager.java:37
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.setPopupMenu
void setPopupMenu(@NotNull final JPopupMenu popupMenu)
Sets the popup menu to show.
Definition: PickmapChooserView.java:219
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.pickmapManager
final MapManager< G, A, R > pickmapManager
The MapManager instance for loading pickmaps.
Definition: PickmapChooserView.java:94
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.io.MapReaderFactory
A factory for creating MapReader instances.
Definition: MapReaderFactory.java:32
net.sf.gridarta.gui.mapfiles.MapFolderTree
Stores all known MapFiles.
Definition: MapFolderTree.java:42
net.sf.gridarta.gui.mapfiles.PickmapState.isValidPickmapName
static boolean isValidPickmapName(@NotNull final CharSequence name)
Returns whether a pickmap name is valid.
Definition: PickmapState.java:130
net.sf
net.sf.gridarta.gui.mapfiles.MapFolder.addFolderListener
void addFolderListener(@NotNull final MapFolderListener< G, A, R > listenerMap)
Adds a MapFolderListener to be notified of events.
Definition: MapFolder.java:229
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.setActivePickmap
void setActivePickmap(@NotNull final PickmapState< G, A, R > pickmapState)
Sets the active pickmap.
Definition: PickmapChooserView.java:279
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel.indexOf
int indexOf(@NotNull final PickmapState< G, A, R > pickmapState)
Returns the index of a map file.
Definition: PickmapChooserModel.java:144
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.mapfiles.MapFolder.removeFolderListener
void removeFolderListener(@NotNull final MapFolderListener< G, A, R > listenerMap)
Removes a MapFolderListener to be notified of events.
Definition: MapFolder.java:237
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModelListener< G, A, R >
net.sf.gridarta.utils.CommonConstants
Class with constants used in Gridarta and derivates.
Definition: CommonConstants.java:28
net.sf.gridarta.model.mapmanager.MapManager.newMap
MapControl< G, A, R > newMap(@Nullable List< G > objects, @NotNull A mapArchObject, @Nullable MapFile mapFile, boolean interactive)
Creates a new map control without view.
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.pickmapChooserModel
final PickmapChooserModel< G, A, R > pickmapChooserModel
The attached PickmapChooserModel.
Definition: PickmapChooserView.java:70
net.sf.gridarta.gui.mapfiles.MapFolderListener
Interface for listeners interested in events of MapFolders.
Definition: MapFolderListener.java:34
net.sf.gridarta.model.mapmodel.MapPathUtils.newMapPath
static MapPath newMapPath(@NotNull final String string)
Creates a MapPath instance from string representation.
Definition: MapPathUtils.java:43
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.model.mapmodel.MapPathUtils
Utility class for MapPath related functions.
Definition: MapPathUtils.java:28
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel.removeMapFile
int removeMapFile(@NotNull final PickmapState< G, A, R > pickmapState)
Removes a map file.
Definition: PickmapChooserModel.java:89
net.sf.gridarta.model.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.model.mapmodel.MapModel.isModified
boolean isModified()
Return whether the map has been modified from the on-disk state.
net.sf.gridarta.gui.mapfiles.DuplicatePickmapException
Indicates that a pickmap name is not unique within its folder.
Definition: DuplicatePickmapException.java:28
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.mapArchObjectFactory
final MapArchObjectFactory< A > mapArchObjectFactory
The MapArchObjectFactory instance.
Definition: PickmapChooserView.java:82
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.mapFolderTree
final MapFolderTree< G, A, R > mapFolderTree
The model to display.
Definition: PickmapChooserView.java:76
net.sf.gridarta.gui.mapfiles.MapFolder.getDir
File getDir()
Returns the base directory.
Definition: MapFolder.java:143
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel.revertMapFile
int revertMapFile(@NotNull final MapControl< G, A, R > oldPickmap, @NotNull final PickmapState< G, A, R > pickmapState)
Reverts a map file.
Definition: PickmapChooserModel.java:105
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.PickmapChooserView
PickmapChooserView(@NotNull final PickmapChooserModel< G, A, R > pickmapChooserModel, @NotNull final MapFolderTree< G, A, R > mapFolderTree, @NotNull final MapArchObjectFactory< A > mapArchObjectFactory, @NotNull final MapReaderFactory< G, A > mapReaderFactory, @NotNull final MapManager< G, A, R > pickmapManager)
Creates a new instance.
Definition: PickmapChooserView.java:200
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.LOG
static final Category LOG
The Logger for printing log messages.
Definition: PickmapChooserView.java:64
net.sf.gridarta.gui.mapfiles.InvalidNameException
Indicates that a folder or pickmap name is invalid.
Definition: InvalidNameException.java:28
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.mapfiles.MapFolderTreeListener.activeMapFolderChanged
void activeMapFolderChanged(@Nullable MapFolder< G, A, R > mapFolder)
The active folder has changed.
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.model.mapmodel.MapFile.getFile
File getFile()
Returns a File for this map file.
Definition: MapFile.java:102
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.pickmapPanel
final JTabbedPane pickmapPanel
Panel with pickmaps.
Definition: PickmapChooserView.java:100
net.sf.gridarta.gui.mapfiles.MapFolder
Model class representing a folder of MapFiles.
Definition: MapFolder.java:47
net.sf.gridarta.gui.mapfiles.MapFolder.addPickmap
PickmapState< G, A, R > addPickmap(@NotNull final String name, @NotNull final MapReaderFactory< G, A > mapReaderFactory, @NotNull final MapManager< G, A, R > pickmapManager)
Adds a new PickmapState to this folder.
Definition: MapFolder.java:155
net.sf.gridarta.gui.map.mapview.MapView
A map view consists of a map grid and a map cursor, and is attached to a map control.
Definition: MapView.java:43
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.getSelectedIndex
int getSelectedIndex()
Returns the selected index.
Definition: PickmapChooserView.java:313
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel< G, A, R >
net.sf.gridarta.gui.map.mapview.MapView.getScrollPane
JScrollPane getScrollPane()
Returns the JScrollPane of this map view.
net.sf.gridarta.model.mapcontrol.MapControl.save
void save()
Saves the map to a file.
net.sf.gridarta.model.mapmodel.MapFile
The location of a map file with a map directory.
Definition: MapFile.java:31
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.getPickmapPanel
Component getPickmapPanel()
Returns the JTabbedPane with all pickmaps.
Definition: PickmapChooserView.java:305
net.sf.gridarta.model.io
Reading and writing of maps, handling of paths.
Definition: AbstractAnimationObjectsReader.java:20
net.sf.gridarta.gui.mapfiles.PickmapState
Maintains the state of a pickmap file.
Definition: PickmapState.java:45
net.sf.gridarta.model.mapmanager.MapManager.release
void release(@NotNull MapControl< G, A, R > mapControl)
Releases a MapControl instance.
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.activeMapFolder
MapFolder< G, A, R > activeMapFolder
The last known active folder.
Definition: PickmapChooserView.java:106
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel.addPickmapChooserListener
void addPickmapChooserListener(@NotNull final PickmapChooserModelListener< G, A, R > pickmapChooserModelListener)
Adds a PickmapChooserModelListener to be notified.
Definition: PickmapChooserModel.java:179
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel.clear
void clear()
Removes all map files.
Definition: PickmapChooserModel.java:167
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.mapFolderTreeListener
final MapFolderTreeListener< G, A, R > mapFolderTreeListener
The listener attached to mapFolderTree.
Definition: PickmapChooserView.java:112
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.mapFolderListener
final MapFolderListener< G, A, R > mapFolderListener
The listener attached to activeMapFolder.
Definition: PickmapChooserView.java:151
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserModel.addMapFile
int addMapFile(@NotNull final PickmapState< G, A, R > pickmapState)
Adds a map file.
Definition: PickmapChooserModel.java:76
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.newPickmap
void newPickmap(@NotNull final Size2D mapSize, @NotNull final String pickmapName)
Add a new pickmap.
Definition: PickmapChooserView.java:324
net.sf.gridarta.gui.mapfiles.MapFolderTree.addModelListener
void addModelListener(@NotNull final MapFolderTreeListener< G, A, R > listener)
Adds a MapFolderTreeListener to be informed about changes.
Definition: MapFolderTree.java:188
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.addChangeListener
void addChangeListener(@NotNull final ChangeListener changeListener)
Adds a ChangeListener to be notified when the selected pickmap tab changes.
Definition: PickmapChooserView.java:228
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.mapReaderFactory
final MapReaderFactory< G, A > mapReaderFactory
The map reader factory instance.
Definition: PickmapChooserView.java:88
net.sf.gridarta.model.mapcontrol.MapControl
Currently nothing more than a marker interface for unification.
Definition: MapControl.java:35
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.pickmapChooserModelListener
final PickmapChooserModelListener< G, A, R > pickmapChooserModelListener
The PickmapChooserModelListener attached to {} to detect modified pickmaps.
Definition: PickmapChooserView.java:175
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.revertPickmap
void revertPickmap(@NotNull final PickmapState< G, A, R > pickmapState, @NotNull final MapControl< G, A, R > oldPickmap)
Called when a pickmap in the model has been reverted.
Definition: PickmapChooserView.java:265
net.sf.gridarta.model.mapcontrol.MapControl.getMapModel
MapModel< G, A, R > getMapModel()
Returns the map model.
net.sf.gridarta.gui.mapfiles.MapFolderTree.getActiveMapFolder
MapFolder< G, A, R > getActiveMapFolder()
Returns the active map folder.
Definition: MapFolderTree.java:147
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.removePickmap
void removePickmap(@NotNull final PickmapState< G, A, R > pickmapState)
Called when a pickmap has been removed from the model.
Definition: PickmapChooserView.java:253
net.sf.gridarta.model.maparchobject.MapArchObjectFactory.newMapArchObject
A newMapArchObject(boolean addDefaultAttributes)
Creates a new MapArchObject instance.
net.sf.gridarta.utils.Size2D
The class Size2D represents a 2d rectangular area.
Definition: Size2D.java:30
net.sf.gridarta.utils.CommonConstants.SPACE_PICKMAP_ARCHETYPE_TOP
static final int SPACE_PICKMAP_ARCHETYPE_TOP
The height of rigid area between the two tab-panes on the pickmap- and archetype-panel.
Definition: CommonConstants.java:49
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.maparchobject.MapArchObjectFactory
Factory for creating MapArchObject instances.
Definition: MapArchObjectFactory.java:28
net.sf.gridarta.gui.panel.pickmapchooser.PickmapChooserView.addPickmap
void addPickmap(@NotNull final PickmapState< G, A, R > pickmapState)
Called when a new pickmap has been added to the model.
Definition: PickmapChooserView.java:236
net.sf.gridarta.gui.mapfiles
Definition: DuplicateMapFolderException.java:20