Gridarta Editor
AbstractMapTilePane.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.map.maptilepane;
21 
22 import java.awt.Component;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.io.File;
26 import javax.swing.BorderFactory;
27 import javax.swing.JButton;
28 import javax.swing.JComponent;
29 import javax.swing.JPanel;
30 import javax.swing.border.CompoundBorder;
31 import javax.swing.filechooser.FileFilter;
50 import net.sf.japi.swing.action.ActionBuilder;
51 import net.sf.japi.swing.action.ActionBuilderFactory;
52 import net.sf.japi.swing.action.ActionMethod;
53 import org.jetbrains.annotations.NotNull;
54 
65 public abstract class AbstractMapTilePane<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JPanel {
66 
70  private static final long serialVersionUID = 1L;
71 
75  @NotNull
76  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
77 
81  @NotNull
83 
87  @NotNull
88  private final MapModel<G, A, R> mapModel;
89 
93  @NotNull
95 
99  @NotNull
100  private final TileLink @NotNull [] tileLinks;
101 
105  private final int @NotNull [] nextFocus;
106 
110  @NotNull
111  private final FileFilter mapFileFilter;
112 
116  private final MapTilePanel @NotNull [] tilePaths;
117 
118  @NotNull
120 
124  private final boolean canAttachMaps;
125 
136  protected AbstractMapTilePane(@NotNull final MapManager<G, A, R> mapManager, @NotNull final ProjectSettings projectSettings, @NotNull final MapModel<G, A, R> mapModel, @NotNull final MapLink @NotNull [] @NotNull [] tileLink, @NotNull final Direction @NotNull [] directionMapping, final int @NotNull [] nextFocus, @NotNull final FileFilter mapFileFilter) {
137  this.projectSettings = projectSettings;
138  this.mapModel = mapModel;
139  this.nextFocus = nextFocus.clone();
140  this.mapFileFilter = mapFileFilter;
141  assert tileLink.length == 10;
142  tileLinks = new TileLink[] { //
143  newTileLink("mapNorth", tileLink[0], Direction.SOUTH), //
144  newTileLink("mapEast", tileLink[1], Direction.WEST), //
145  newTileLink("mapSouth", tileLink[2], Direction.NORTH), //
146  newTileLink("mapWest", tileLink[3], Direction.EAST), //
147  newTileLink("mapNorthEast", tileLink[4], Direction.SOUTH_WEST), //
148  newTileLink("mapSouthEast", tileLink[5], Direction.NORTH_WEST), //
149  newTileLink("mapSouthWest", tileLink[6], Direction.NORTH_EAST), //
150  newTileLink("mapNorthWest", tileLink[7], Direction.SOUTH_EAST), //
151  newTileLink("mapUp", tileLink[8], Direction.DOWN), //
152  newTileLink("mapDown", tileLink[9], Direction.UP) //
153  };
154  attachTiledMaps = new AttachTiledMaps<>(mapManager, tileLinks);
155  canAttachMaps = tileLink[0].length + tileLink[1].length + tileLink[2].length + tileLink[3].length + tileLink[4].length + tileLink[5].length + tileLink[6].length + tileLink[7].length + tileLink[8].length + tileLink[9].length > 0;
157  tilePaths = buildComponents(directionMapping);
158  }
159 
166  @NotNull
167  private static TileLink newTileLink(@NotNull final String key, @NotNull final MapLink @NotNull [] mapLinks, @NotNull final Direction revLink) {
168  return new TileLink(ActionBuilderUtils.getString(ACTION_BUILDER, key), mapLinks, revLink);
169  }
170 
176  @NotNull
177  private MapTilePanel @NotNull [] buildComponents(@NotNull final Direction @NotNull [] directionMapping) {
178  setLayout(new GridBagLayout());
179  final GridBagConstraints gbc = new GridBagConstraints();
180  gbc.gridwidth = GridBagConstraints.REMAINDER;
181  gbc.weightx = 1.0;
182  gbc.fill = GridBagConstraints.BOTH;
183  final MapTilePanel[] tilePanels = createTilePanels(directionMapping.length);
184  add(buildTilePanels(tilePanels, directionMapping), gbc);
185  add(buildSubPanel(), gbc);
186  return tilePanels;
187  }
188 
194  @NotNull
195  private MapTilePanel @NotNull [] createTilePanels(final int directions) {
196  final MapTilePanel[] tilePanels = new MapTilePanel[directions];
197  for (int index = 0; index < tilePanels.length; index++) {
198  final File mapDir = projectSettings.getMapsDirectory();
199  final MapFile mapFile = mapModel.getMapFile();
200  final TilePanel tilePanel = new TilePanel(mapFileFilter, mapArchObject.getTilePath(Direction.values()[index]), mapFile == null ? null : mapFile.getFile(), mapDir);
201  tilePanels[index] = new MapTilePanel(index, nextFocus, tilePanel, tileLinks[index].getName());
202  }
203  return tilePanels;
204  }
205 
212  @NotNull
213  private static Component buildTilePanels(@NotNull final MapTilePanel @NotNull [] tilePanels, @NotNull final Direction @NotNull [] directionMapping) {
214  final JComponent panel = new JPanel(new DirectionLayout());
215  panel.setBorder(new CompoundBorder(BorderFactory.createTitledBorder(ActionBuilderUtils.getString(ACTION_BUILDER, "mapTiles")), GUIConstants.DIALOG_BORDER));
216  for (int index = 0; index < tilePanels.length; index++) {
217  panel.add(tilePanels[index].getTilePanel(), directionMapping[index]);
218  }
219  return panel;
220  }
221 
227  @NotNull
228  private Component buildSubPanel() {
229  final JComponent subPanel = new JPanel(new GridBagLayout());
230  subPanel.setBorder(new CompoundBorder(BorderFactory.createTitledBorder(ActionBuilderUtils.getString(ACTION_BUILDER, "mapControl")), GUIConstants.DIALOG_BORDER));
231  final GridBagConstraints gbc = new GridBagConstraints();
232  gbc.fill = GridBagConstraints.NONE;
233  gbc.weightx = 1.0;
234  gbc.weighty = 1.0;
235  if (canAttachMaps) {
236  gbc.anchor = GridBagConstraints.EAST;
237  subPanel.add(new JButton(ACTION_BUILDER.createAction(false, "mapTilesAttach", this)), gbc);
238  }
239  gbc.gridwidth = GridBagConstraints.REMAINDER;
240  gbc.anchor = canAttachMaps ? GridBagConstraints.WEST : GridBagConstraints.CENTER;
241  subPanel.add(new JButton(ACTION_BUILDER.createAction(false, "mapTilesClear", this)), gbc);
242  return subPanel;
243  }
244 
248  @ActionMethod
249  public void mapTilesAttach() {
250  final String[] tmpTilePaths = new String[tilePaths.length];
251  for (int i = 0; i < tmpTilePaths.length; i++) {
252  tmpTilePaths[i] = tilePaths[i].getTilePanel().getText();
253  }
254  final File mapsDirectory = projectSettings.getMapsDirectory();
255  try {
256  attachTiledMaps.attachTiledMaps(mapModel, tmpTilePaths, mapsDirectory, true);
257  } catch (final CannotLoadMapFileException ex) {
258  ACTION_BUILDER.showMessageDialog(this, "mapErrorPath2", ex.getMapPath()); // XXX: ignores ex.getMessage()
259  return;
260  } catch (final CannotSaveMapFileException ex) {
261  ACTION_BUILDER.showMessageDialog(this, "mapErrorFatalWrite", ex.getMessage()); // XXX: ignores ex.getMapFile()
262  return;
263  } catch (final MapSizeMismatchException ex) {
264  ACTION_BUILDER.showMessageDialog(this, "mapErrorDifferentSize", mapModel.getMapArchObject().getMapName(), ex.getMapSize().getWidth(), ex.getMapSize().getHeight(), ex.getMapFile(), ex.getOtherMapSize().getWidth(), ex.getOtherMapSize().getHeight());
265  return;
266  } catch (final UnsavedMapException ignored) {
267  ACTION_BUILDER.showMessageDialog(this, "mapErrorUnsaved");
268  return;
269  }
270  for (int i = 0; i < tmpTilePaths.length; i++) {
271  tilePaths[i].getTilePanel().setText(tmpTilePaths[i], true);
272  }
273  }
274 
278  @ActionMethod
279  public void mapTilesClear() {
280  for (final MapTilePanel tilePath : tilePaths) {
281  tilePath.getTilePanel().setText("", true);
282  }
283  }
284 
289  public void modifyMapProperties() {
290  for (int i = 0; i < tilePaths.length; i++) {
292  }
293  }
294 
298  public void restoreMapProperties() {
299  for (final MapTilePanel tilePath : tilePaths) {
300  tilePath.getTilePanel().mapTileRevert();
301  }
302  }
303 
309  @NotNull
310  public MapTilePanel getTilePath(final int direction) {
311  return tilePaths[direction];
312  }
313 
314 }
net.sf.gridarta.utils.Size2D.getWidth
int getWidth()
Returns the width of the area.
Definition: Size2D.java:96
net.sf.gridarta.model.direction.Direction
A direction.
Definition: Direction.java:28
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.modifyMapProperties
void modifyMapProperties()
Invoke this method if the dialog using this pane is confirmed with OK to write the information from t...
Definition: AbstractMapTilePane.java:289
net.sf.gridarta.model.mapmodel.MapModel
A MapModel reflects the data of a map.
Definition: MapModel.java:75
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.attachTiledMaps
final AttachTiledMaps< G, A, R > attachTiledMaps
Definition: AbstractMapTilePane.java:119
net.sf.gridarta.gui.utils.DirectionLayout
This class implements a layout that is similar to {} but implements those directions used in Daimonin...
Definition: DirectionLayout.java:42
net.sf.gridarta.model.mapmodel.MapModel.getMapArchObject
A getMapArchObject()
Returns the Map Arch Object with the meta information about the map.
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.mapModel
final MapModel< G, A, R > mapModel
The map in context.
Definition: AbstractMapTilePane.java:88
net.sf.gridarta.model.mapmanager.MapManager
A MapManager manages all opened maps.
Definition: MapManager.java:37
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.tileLinks
final TileLink[] tileLinks
The tile links for the attach map algorithm.
Definition: AbstractMapTilePane.java:100
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.utils.GUIConstants
Defines common UI constants used in different dialogs.
Definition: GUIConstants.java:33
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.newTileLink
static TileLink newTileLink(@NotNull final String key, @NotNull final MapLink @NotNull[] mapLinks, @NotNull final Direction revLink)
Creates a new TileLink.
Definition: AbstractMapTilePane.java:167
net.sf.gridarta.model.direction.Direction.SOUTH
SOUTH
South.
Definition: Direction.java:43
net.sf
net.sf.gridarta.model.maparchobject.MapArchObject.getTilePath
String getTilePath(@NotNull Direction direction)
Returns a tile path.
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.buildComponents
MapTilePanel[] buildComponents(@NotNull final Direction @NotNull[] directionMapping)
Builds the components of this panel.
Definition: AbstractMapTilePane.java:177
net.sf.gridarta.model.direction.Direction.SOUTH_WEST
SOUTH_WEST
South west.
Definition: Direction.java:63
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.mapArchObject
final MapArchObject< A > mapArchObject
The MapArchObject to show.
Definition: AbstractMapTilePane.java:94
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.mapTilesClear
void mapTilesClear()
Action method for tiles clearing paths.
Definition: AbstractMapTilePane.java:279
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.canAttachMaps
final boolean canAttachMaps
Whether "attach maps" function is available.
Definition: AbstractMapTilePane.java:124
net.sf.gridarta.gui.map.maptilepane.MapTilePanel.getTilePanel
TilePanel getTilePanel()
Definition: MapTilePanel.java:68
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.model.direction.Direction.NORTH
NORTH
North.
Definition: Direction.java:33
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: AbstractMapTilePane.java:76
net.sf.gridarta.model.direction.Direction.NORTH_WEST
NORTH_WEST
North west.
Definition: Direction.java:68
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.mapTilesAttach
void mapTilesAttach()
Action method for tiles attaching automatically.
Definition: AbstractMapTilePane.java:249
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane
A Panel for managing the tiling of maps.
Definition: AbstractMapTilePane.java:65
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.utils.Size2D.getHeight
int getHeight()
Returns the height of the area.
Definition: Size2D.java:104
net.sf.gridarta.actions.MapSizeMismatchException.getOtherMapSize
Size2D getOtherMapSize()
Returns the size of the second map.
Definition: MapSizeMismatchException.java:93
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.createTilePanels
MapTilePanel[] createTilePanels(final int directions)
Builds all MapTilePanels for all directions.
Definition: AbstractMapTilePane.java:195
net.sf.gridarta.actions.AttachTiledMaps
Attaches maps to adjacent tiled maps.
Definition: AttachTiledMaps.java:50
net.sf.gridarta.gui.map.maptilepane.TilePanel.setText
void setText(@NotNull final String text, final boolean keepRA)
Sets the text.
Definition: TilePanel.java:219
net.sf.gridarta.model.direction.Direction.SOUTH_EAST
SOUTH_EAST
South east.
Definition: Direction.java:58
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.serialVersionUID
static final long serialVersionUID
Serial Version UID.
Definition: AbstractMapTilePane.java:70
net.sf.gridarta.model.mapmodel.MapFile.getFile
File getFile()
Returns a File for this map file.
Definition: MapFile.java:102
net.sf.gridarta.gui.map.maptilepane.MapTilePanel
A MapTilePanel extends a TilePanel with a border and makes focus traversal work within the map tile p...
Definition: MapTilePanel.java:34
net.sf.gridarta.model.direction.Direction.DOWN
DOWN
Down.
Definition: Direction.java:78
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.restoreMapProperties
void restoreMapProperties()
Restores the settings from the map.
Definition: AbstractMapTilePane.java:298
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.mapFileFilter
final FileFilter mapFileFilter
Swing FileFilter for map files.
Definition: AbstractMapTilePane.java:111
net.sf.gridarta.actions.MapSizeMismatchException.getMapSize
Size2D getMapSize()
Returns the size of the first map.
Definition: MapSizeMismatchException.java:84
net.sf.gridarta.model.mapmodel.UnsavedMapException
Exception thrown if an operation is attempted on an unsaved map.
Definition: UnsavedMapException.java:26
net.sf.gridarta.model.direction.Direction.UP
UP
Up.
Definition: Direction.java:73
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Returns the value of a key.
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.actions.AttachTiledMaps.attachTiledMaps
void attachTiledMaps(@NotNull final MapModel< G, A, R > mapModel, @NotNull final String @NotNull[] tilePaths, @NotNull final File mapsDirectory, final boolean performAction)
Updates tile paths of a map.
Definition: AttachTiledMaps.java:85
net.sf.gridarta.model.mapmodel.MapFile
The location of a map file with a map directory.
Definition: MapFile.java:31
net.sf.gridarta.model.maparchobject.MapArchObject.setTilePath
void setTilePath(@NotNull Direction direction, @NotNull String tilePath)
Sets a tile path.
net.sf.gridarta.actions.MapSizeMismatchException
Exception thrown if the size of a map file is unexpected.
Definition: MapSizeMismatchException.java:30
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.AbstractMapTilePane
AbstractMapTilePane(@NotNull final MapManager< G, A, R > mapManager, @NotNull final ProjectSettings projectSettings, @NotNull final MapModel< G, A, R > mapModel, @NotNull final MapLink @NotNull[] @NotNull[] tileLink, @NotNull final Direction @NotNull[] directionMapping, final int @NotNull[] nextFocus, @NotNull final FileFilter mapFileFilter)
Creates a new instance.
Definition: AbstractMapTilePane.java:136
net.sf.gridarta.model.settings.ProjectSettings
Settings that apply to a project.
Definition: ProjectSettings.java:29
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.buildTilePanels
static Component buildTilePanels(@NotNull final MapTilePanel @NotNull[] tilePanels, @NotNull final Direction @NotNull[] directionMapping)
Builds the tile panel.
Definition: AbstractMapTilePane.java:213
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.getTilePath
MapTilePanel getTilePath(final int direction)
Returns one tile path.
Definition: AbstractMapTilePane.java:310
net.sf.gridarta.actions.CannotSaveMapFileException
Exception thrown if a map file cannot be saved.
Definition: CannotSaveMapFileException.java:30
net.sf.gridarta.actions.MapSizeMismatchException.getMapFile
File getMapFile()
Returns the map File of the first map.
Definition: MapSizeMismatchException.java:75
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.model.direction.Direction.EAST
EAST
East.
Definition: Direction.java:38
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.projectSettings
final ProjectSettings projectSettings
The project settings instance.
Definition: AbstractMapTilePane.java:82
net.sf.gridarta.actions
Definition: AbstractServerActions.java:20
net.sf.gridarta.model.direction.Direction.NORTH_EAST
NORTH_EAST
North east.
Definition: Direction.java:53
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.model.settings.ProjectSettings.getMapsDirectory
File getMapsDirectory()
Returns the default maps directory.
net.sf.gridarta.model.tiles
Definition: MapLink.java:20
net.sf.gridarta.model.mapmodel.MapModel.getMapFile
MapFile getMapFile()
Returns the map file.
net.sf.gridarta.model.direction.Direction.WEST
WEST
West.
Definition: Direction.java:48
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.nextFocus
final int[] nextFocus
Indices of next focus.
Definition: AbstractMapTilePane.java:105
net.sf.gridarta.gui.map.maptilepane.TilePanel.getText
String getText()
Returns the text.
Definition: TilePanel.java:233
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.direction
Definition: Direction.java:20
net.sf.gridarta.model.settings
Definition: AbstractDefaultProjectSettings.java:20
net.sf.gridarta.actions.CannotLoadMapFileException.getMapPath
String getMapPath()
Returns the map path that could not be loaded.
Definition: CannotLoadMapFileException.java:58
net.sf.gridarta.gui.map.maptilepane.TilePanel
A tile panel displays exactly one direction for map tiling.
Definition: TilePanel.java:52
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.tilePaths
final MapTilePanel[] tilePaths
The JTextFields with the tile paths.
Definition: AbstractMapTilePane.java:116
net.sf.gridarta.gui.utils.GUIConstants.DIALOG_BORDER
Border DIALOG_BORDER
The Border object to be used when creating dialogs.
Definition: GUIConstants.java:38
net.sf.gridarta.gui.map.maptilepane.AbstractMapTilePane.buildSubPanel
Component buildSubPanel()
Creates the sub-panel that holds the buttons to attach maps or clear all paths.
Definition: AbstractMapTilePane.java:228
net.sf.gridarta.actions.CannotLoadMapFileException
Exception thrown if a map file cannot be loaded.
Definition: CannotLoadMapFileException.java:29