Gridarta Editor
MapCursorActions.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.mapcursor;
21 
22 import java.awt.Point;
23 import java.util.Set;
24 import javax.swing.Action;
40 import net.sf.gridarta.utils.Size2D;
41 import net.sf.japi.swing.action.ActionMethod;
42 import org.jetbrains.annotations.NotNull;
43 import org.jetbrains.annotations.Nullable;
44 
49 public class MapCursorActions<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements EditorAction, MapCursorListener<G, A, R>, MapViewManagerListener<G, A, R> {
50 
55  private static final int BORDER = 3;
56 
60  @NotNull
61  private static final Direction @NotNull [] DIRECTIONS = Direction.values();
62 
63  @NotNull
65 
69  @Nullable
70  private final Action @NotNull [] aMoveCursor;
71 
75  @Nullable
77 
82  @NotNull
84 
85  @Override
86  public void mapSizeChanged(@NotNull final Size2D newSize) {
88  }
89 
90  @Override
91  public void mapSquaresChanged(@NotNull final Set<MapSquare<G, A, R>> mapSquares) {
92  // ignore
93  }
94 
95  @Override
96  public void mapObjectsChanged(@NotNull final Set<G> gameObjects, @NotNull final Set<G> transientGameObjects) {
97  // ignore
98  }
99 
100  @Override
101  public void errorsChanged(@NotNull final ErrorCollector<G, A, R> errors) {
102  // ignore
103  }
104 
105  @Override
106  public void mapFileChanged(@Nullable final MapFile oldMapFile) {
107  // ignore
108  }
109 
110  @Override
111  public void modifiedChanged() {
112  // ignore
113  }
114 
115  };
116 
121  this.mapActions = mapActions;
122  aMoveCursor = new Action[DIRECTIONS.length];
123  }
124 
128  @ActionMethod
129  public void moveCursorNorth() {
131  }
132 
136  @ActionMethod
137  public void moveCursorSouth() {
139  }
140 
144  @ActionMethod
145  public void moveCursorEast() {
146  doMoveCursor(true, Direction.EAST);
147  }
148 
152  @ActionMethod
153  public void moveCursorWest() {
154  doMoveCursor(true, Direction.WEST);
155  }
156 
160  @ActionMethod
161  public void moveCursorNorthEast() {
163  }
164 
168  @ActionMethod
169  public void moveCursorNorthWest() {
171  }
172 
176  @ActionMethod
177  public void moveCursorSouthEast() {
179  }
180 
184  @ActionMethod
185  public void moveCursorSouthWest() {
187  }
188 
192  private void refreshActions() {
193  for (final Direction direction : DIRECTIONS) {
194  final Action action = aMoveCursor[direction.ordinal()];
195  if (action != null) {
196  action.setEnabled(doMoveCursor(false, direction));
197  }
198  }
199  }
200 
207  private boolean doMoveCursor(final boolean performAction, @NotNull final Direction direction) {
208  final MapView<G, A, R> mapView = currentMapView;
209  if (mapView == null) {
210  return false;
211  }
212 
213  final MapCursor<G, A, R> mapCursor = mapView.getMapCursor();
214  if (!mapCursor.goTo(performAction, direction)) {
215  if (!mapActions.doEnterMap(performAction, direction)) {
216  return false;
217  }
218  } else if (performAction) {
219  final MapRenderer renderer = mapView.getRenderer();
220  final Point location = mapCursor.getLocation();
221  location.translate(BORDER * direction.getDx(), BORDER * direction.getDy());
222  renderer.scrollRectToVisible(renderer.getSquareBounds(location));
223  }
224 
225  return true;
226  }
227 
228  @Override
229  public void setAction(@NotNull final Action action, @NotNull final String name) {
230  if (name.startsWith("moveCursor")) {
231  boolean found = false;
232  for (final Direction direction : DIRECTIONS) {
233  if (name.equals("moveCursor" + direction.getId())) {
234  aMoveCursor[direction.ordinal()] = action;
235  found = true;
236  break;
237  }
238  }
239  if (!found) {
240  throw new IllegalArgumentException("unsupported action name: " + name);
241  }
242  } else {
243  throw new IllegalArgumentException("unsupported action name: " + name);
244  }
245  refreshActions();
246  }
247 
248  @Override
249  public void activeMapViewChanged(@Nullable final MapView<G, A, R> mapView) {
250  currentMapView = mapView;
251  refreshActions();
252  }
253 
254  @Override
255  public void mapViewCreated(@NotNull final MapView<G, A, R> mapView) {
256  mapView.getMapControl().getMapModel().addMapModelListener(mapModelListener);
257  }
258 
259  @Override
260  public void mapViewClosing(@NotNull final MapView<G, A, R> mapView) {
261  mapView.getMapControl().getMapModel().removeMapModelListener(mapModelListener);
262  }
263 
264  @Override
265  public void mapCursorChangedPos(@NotNull final Point location) {
266  refreshActions();
267  }
268 
269  @Override
270  public void mapCursorChangedMode() {
271  // ignore
272  }
273 
274  @Override
275  public void mapCursorChangedGameObject(@Nullable final MapSquare<G, A, R> mapSquare, @Nullable final G gameObject) {
276  // ignore
277  }
278 
279  @Override
280  public void mapCursorChangedSize() {
281  refreshActions();
282  }
283 
284 }
net.sf.gridarta.gui.mapcursor.MapCursorActions.refreshActions
void refreshActions()
Enable/disable menu entries based on the current cursor state.
Definition: MapCursorActions.java:192
net.sf.gridarta.model.direction.Direction
A direction.
Definition: Direction.java:28
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorNorthWest
void moveCursorNorthWest()
Action method for "move cursor north west".
Definition: MapCursorActions.java:169
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorWest
void moveCursorWest()
Action method for "move cursor west".
Definition: MapCursorActions.java:153
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapCursorChangedMode
void mapCursorChangedMode()
This event handler is called when MapCursor changes mode (drag, select).
Definition: MapCursorActions.java:270
net.sf.gridarta.model.mapmodel.MapSquare
A single Map Square.
Definition: MapSquare.java:45
net.sf.gridarta.gui.map.mapactions
Definition: EnterMap.java:20
net.sf.gridarta.model.direction.Direction.SOUTH
SOUTH
South.
Definition: Direction.java:43
net.sf.gridarta.gui.mapcursor.MapCursorActions.doMoveCursor
boolean doMoveCursor(final boolean performAction, @NotNull final Direction direction)
Executes the "move cursor" action.
Definition: MapCursorActions.java:207
net.sf
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapViewCreated
void mapViewCreated(@NotNull final MapView< G, A, R > mapView)
This event handler is called when a map view was created.
Definition: MapCursorActions.java:255
net.sf.gridarta.gui.map.mapview.MapViewManagerListener
Interface for listeners interested in events related to {} instances.
Definition: MapViewManagerListener.java:33
net.sf.gridarta.model.direction.Direction.SOUTH_WEST
SOUTH_WEST
South west.
Definition: Direction.java:63
net.sf.gridarta.gui.map.renderer
Definition: AbstractIsoMapRenderer.java:20
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorEast
void moveCursorEast()
Action method for "move cursor east".
Definition: MapCursorActions.java:145
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.gui.map.mapview.MapView.getRenderer
MapRenderer getRenderer()
Returns the MapRenderer for this view.
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorNorth
void moveCursorNorth()
Action method for "move cursor north".
Definition: MapCursorActions.java:129
net.sf.gridarta.model.mapcursor.MapCursorListener
Interface for listeners listening to MapCursor related events.
Definition: MapCursorListener.java:36
net.sf.gridarta.gui.map.renderer.MapRenderer.scrollRectToVisible
void scrollRectToVisible(@NotNull Rectangle aRect)
Ensures that a rectangular area is visible.
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapCursorChangedPos
void mapCursorChangedPos(@NotNull final Point location)
This event handler is called when MapCursor has moved.
Definition: MapCursorActions.java:265
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorSouthEast
void moveCursorSouthEast()
Action method for "move cursor south east".
Definition: MapCursorActions.java:177
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorSouth
void moveCursorSouth()
Action method for "move cursor south".
Definition: MapCursorActions.java:137
net.sf.gridarta.gui.map.mapactions.MapActions.doEnterMap
boolean doEnterMap(final boolean performAction, @NotNull final Direction direction)
Executes the "enter map" action.
Definition: MapActions.java:1079
net.sf.gridarta.model.direction.Direction.NORTH
NORTH
North.
Definition: Direction.java:33
net.sf.gridarta.gui.map.mapview.MapView.getMapCursor
MapCursor< G, A, R > getMapCursor()
Returns the MapCursor of this view.
net.sf.gridarta.model.direction.Direction.NORTH_WEST
NORTH_WEST
North west.
Definition: Direction.java:68
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions
Cursor related actions.
Definition: MapCursorActions.java:49
net
net.sf.gridarta.model.mapcursor.MapCursor.goTo
boolean goTo(final boolean performAction, @NotNull final Direction dir)
Moves the cursor one square relative to current position.
Definition: MapCursor.java:389
errors
errors
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:1
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.mapcursor.MapCursorActions.aMoveCursor
final Action[] aMoveCursor
Actions for "move cursor".
Definition: MapCursorActions.java:70
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapCursorChangedSize
void mapCursorChangedSize()
Called whenever the map cursor's map grid size has changed.
Definition: MapCursorActions.java:280
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapCursorChangedGameObject
void mapCursorChangedGameObject(@Nullable final MapSquare< G, A, R > mapSquare, @Nullable final G gameObject)
Called whenever the selected game object has changed.
Definition: MapCursorActions.java:275
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapViewClosing
void mapViewClosing(@NotNull final MapView< G, A, R > mapView)
This event handler is called when a map view is to be closed.
Definition: MapCursorActions.java:260
net.sf.gridarta.model.validation.ErrorCollector
An interface for classes that collect errors.
Definition: ErrorCollector.java:33
net.sf.gridarta.model.mapcursor.MapCursor.getLocation
Point getLocation()
Get position of cursor.
Definition: MapCursor.java:227
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.model.validation
This package contains the framework for validating maps.
Definition: AbstractValidator.java:20
net.sf.gridarta.model.mapcursor.MapCursor
MapCursor provides methods to move and drag on map.
Definition: MapCursor.java:58
net.sf.gridarta.gui.map.mapactions.MapActions
Manages actions in the "map" menu.
Definition: MapActions.java:73
net.sf.gridarta.model.mapmodel.MapFile
The location of a map file with a map directory.
Definition: MapFile.java:31
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapModelListener
final MapModelListener< G, A, R > mapModelListener
The map model listener used to detect map size changes in {}.
Definition: MapCursorActions.java:83
net.sf.gridarta.model.mapmodel.MapModelListener
Interface for listeners listening on MapModel events.
Definition: MapModelListener.java:36
net.sf.gridarta.gui.map.renderer.MapRenderer.getSquareBounds
Rectangle getSquareBounds(@NotNull Point p)
Returns coordinates, length and width of map square.
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorSouthWest
void moveCursorSouthWest()
Action method for "move cursor south west".
Definition: MapCursorActions.java:185
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.mapcursor.MapCursorActions.BORDER
static final int BORDER
The visible border around the cursor.
Definition: MapCursorActions.java:55
net.sf.gridarta.gui.mapcursor.MapCursorActions.setAction
void setAction(@NotNull final Action action, @NotNull final String name)
Sets the Action instance for this editor action.
Definition: MapCursorActions.java:229
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.DIRECTIONS
static final Direction[] DIRECTIONS
All Directions.
Definition: MapCursorActions.java:61
net.sf.gridarta.gui.mapcursor.MapCursorActions.MapCursorActions
MapCursorActions(@NotNull final MapActions< G, A, R > mapActions)
Creates a new instance.
Definition: MapCursorActions.java:120
net.sf.gridarta.model.direction.Direction.EAST
EAST
East.
Definition: Direction.java:38
net.sf.gridarta.gui.mapcursor.MapCursorActions.activeMapViewChanged
void activeMapViewChanged(@Nullable final MapView< G, A, R > mapView)
This event handler is called when the current map view has changed.
Definition: MapCursorActions.java:249
net.sf.gridarta.model.direction.Direction.NORTH_EAST
NORTH_EAST
North east.
Definition: Direction.java:53
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.currentMapView
MapView< G, A, R > currentMapView
The active map view, or.
Definition: MapCursorActions.java:76
net.sf.gridarta.gui.map.renderer.MapRenderer
Common interface for renderers of map control instances.
Definition: MapRenderer.java:36
net.sf.gridarta.model.direction.Direction.WEST
WEST
West.
Definition: Direction.java:48
net.sf.gridarta.utils.EditorAction
A global editor action.
Definition: EditorAction.java:29
net.sf.gridarta.model.mapcursor
Definition: MapCursor.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.mapActions
final MapActions< G, A, R > mapActions
Definition: MapCursorActions.java:64
net.sf.gridarta.utils.Size2D
The class Size2D represents a 2d rectangular area.
Definition: Size2D.java:30
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.direction
Definition: Direction.java:20
net.sf.gridarta.gui.mapcursor.MapCursorActions.moveCursorNorthEast
void moveCursorNorthEast()
Action method for "move cursor north east".
Definition: MapCursorActions.java:161