Gridarta Editor
GoLocationDialog.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.dialog.golocation;
21 
22 import java.awt.GridBagConstraints;
23 import java.awt.GridBagLayout;
24 import java.awt.Insets;
25 import java.awt.Point;
26 import java.awt.Window;
27 import javax.swing.Box;
28 import javax.swing.BoxLayout;
29 import javax.swing.JButton;
30 import javax.swing.JComponent;
31 import javax.swing.JDialog;
32 import javax.swing.JLabel;
33 import javax.swing.JOptionPane;
34 import javax.swing.JPanel;
35 import javax.swing.JTextField;
36 import javax.swing.WindowConstants;
37 import javax.swing.border.CompoundBorder;
38 import javax.swing.border.EtchedBorder;
39 import javax.swing.border.TitledBorder;
40 import javax.swing.text.JTextComponent;
49 import net.sf.gridarta.utils.Size2D;
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 import org.jetbrains.annotations.Nullable;
55 
60 public class GoLocationDialog<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JOptionPane {
61 
65  private static final long serialVersionUID = 1L;
66 
70  @NotNull
71  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
72 
76  @NotNull
78 
82  @NotNull
83  private final MapView<G, A, R> mapView;
84 
88  @NotNull
89  private final JTextField xCoordinateField = new JTextField();
90 
94  @NotNull
95  private final JTextField yCoordinateField = new JTextField();
96 
100  @NotNull
101  private final JButton okButton = new JButton(ACTION_BUILDER.createAction(false, "goLocationOkay", this));
102 
106  @NotNull
107  private final JButton cancelButton = new JButton(ACTION_BUILDER.createAction(false, "goLocationCancel", this));
108 
112  @NotNull
113  private final JDialog dialog;
114 
121  this.goLocationDialogManager = goLocationDialogManager;
122 
123  okButton.setDefaultCapable(true);
124  final JButton applyButton = new JButton(ACTION_BUILDER.createAction(false, "goLocationApply", this));
125  setOptions(new Object[] { okButton, applyButton, cancelButton });
126 
127  this.mapView = mapView;
128  setMessage(createPanel());
129 
133 
134  dialog = createDialog(mapView.getComponent(), ActionBuilderUtils.getString(ACTION_BUILDER, "goLocation.title"));
135  dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
136  dialog.getRootPane().setDefaultButton(okButton);
137  dialog.setModal(false);
138 
139  dialog.pack();
140  dialog.setVisible(true);
141  }
142 
147  @NotNull
148  private JPanel createPanel() {
149  final JPanel mainPanel = new JPanel();
150  mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
151 
152  mainPanel.setBorder(GUIConstants.DIALOG_BORDER);
153 
154  mainPanel.add(new JLabel(ACTION_BUILDER.format("goLocationText", mapView.getMapControl().getMapModel().getMapArchObject().getMapName())));
155  mainPanel.add(Box.createVerticalStrut(5));
156 
157  final JComponent coordinatesPanel = new JPanel(new GridBagLayout());
158  final GridBagConstraints gbcLabel = new GridBagConstraints();
159  final GridBagConstraints gbcField = new GridBagConstraints();
160  gbcLabel.insets = new Insets(2, 2, 2, 2);
161  gbcField.insets = new Insets(2, 2, 2, 2);
162  gbcLabel.anchor = GridBagConstraints.EAST;
163  gbcField.gridwidth = GridBagConstraints.REMAINDER;
164  coordinatesPanel.setBorder(new CompoundBorder(new TitledBorder(new EtchedBorder()), GUIConstants.DIALOG_BORDER));
165 
166  final Point point = mapView.getMapCursor().getLocation();
167 
168  coordinatesPanel.add(ActionBuilderUtils.newLabel(ACTION_BUILDER, "goLocationX"), gbcLabel);
169  xCoordinateField.setText(Integer.toString(point.x));
170  xCoordinateField.setColumns(3);
171  coordinatesPanel.add(xCoordinateField, gbcField);
172 
173  coordinatesPanel.add(ActionBuilderUtils.newLabel(ACTION_BUILDER, "goLocationY"), gbcLabel);
174  yCoordinateField.setText(Integer.toString(point.y));
175  yCoordinateField.setColumns(3);
176  coordinatesPanel.add(yCoordinateField, gbcField);
177 
178  mainPanel.add(coordinatesPanel);
179  mainPanel.add(Box.createVerticalStrut(5));
180 
181  return mainPanel;
182  }
183 
187  @ActionMethod
188  public void goLocationOkay() {
189  if (goLocation()) {
191  }
192  }
193 
197  @ActionMethod
198  public void goLocationApply() {
199  goLocation();
200  }
201 
205  @ActionMethod
206  public void goLocationCancel() {
208  }
209 
215  private boolean goLocation() {
216  final Size2D mapSize = mapView.getMapControl().getMapModel().getMapArchObject().getMapSize();
217  final Point point = new Point();
218  try {
219  point.x = parseCoordinate(xCoordinateField, mapSize.getWidth());
220  point.y = parseCoordinate(yCoordinateField, mapSize.getHeight());
221  } catch (final IllegalArgumentException ignored) {
222  return false;
223  }
224 
225  mapView.setCursorLocation(point);
226  return true;
227  }
228 
236  private int parseCoordinate(@NotNull final JTextComponent textField, final int range) {
237  final int result;
238  try {
239  result = Integer.parseInt(textField.getText());
240  } catch (final NumberFormatException e) {
241  ACTION_BUILDER.showMessageDialog(this, "goLocationCoordinateNotANumber");
242  textField.requestFocus();
243  throw e;
244  } catch (final IllegalArgumentException e) {
245  ACTION_BUILDER.showMessageDialog(this, "goLocationCoordinateOutOfRange");
246  textField.requestFocus();
247  throw e;
248  }
249  if (result < 0 || result >= range) {
250  ACTION_BUILDER.showMessageDialog(this, "goLocationCoordinateOutOfRange");
251  textField.requestFocus();
252  throw new IllegalArgumentException("invalid coordinate value: " + result);
253  }
254 
255  return result;
256  }
257 
258  @Override
259  public void setValue(@Nullable final Object newValue) {
260  super.setValue(newValue);
261  if (newValue != UNINITIALIZED_VALUE) {
263  }
264  }
265 
270  @NotNull
271  public Window getDialog() {
272  return dialog;
273  }
274 
275 }
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The ActionBuilder.
Definition: GoLocationDialog.java:71
net.sf.gridarta.utils.Size2D.getWidth
int getWidth()
Returns the width of the area.
Definition: Size2D.java:96
net.sf.gridarta.gui.map.mapview.MapView.setCursorLocation
void setCursorLocation(@NotNull Point point)
Sets the cursor location.
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.setValue
void setValue(@Nullable final Object newValue)
Definition: GoLocationDialog.java:259
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.mapview.MapView.getMapControl
MapControl< G, A, R > getMapControl()
Return the controller of this view.
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.mapview.MapView.getComponent
Component getComponent()
Returns the component associated with this MapView that can be used as parent for dialogs.
net.sf.gridarta.gui.utils.TextComponentUtils.setActionNextFocus
static void setActionNextFocus(@NotNull final JTextField textField, @NotNull final Component nextComponent)
Transfers the focus to another component when ENTER is pressed.
Definition: TextComponentUtils.java:69
net.sf
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.goLocationOkay
void goLocationOkay()
Action method for okay.
Definition: GoLocationDialog.java:188
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.goLocationApply
void goLocationApply()
Action method for apply.
Definition: GoLocationDialog.java:198
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.utils.ActionBuilderUtils.newLabel
static JLabel newLabel(@NotNull final ActionBuilder actionBuilder, @NotNull final String key)
Creates a new JLabel from a resource key.
Definition: ActionBuilderUtils.java:117
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.GoLocationDialog
GoLocationDialog(@NotNull final AbstractPerMapDialogManager< G, A, R, GoLocationDialog< G, A, R >> goLocationDialogManager, @NotNull final MapView< G, A, R > mapView)
Creates a new instance.
Definition: GoLocationDialog.java:120
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.serialVersionUID
static final long serialVersionUID
The serial Version UID.
Definition: GoLocationDialog.java:65
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.okButton
final JButton okButton
The JButton for ok.
Definition: GoLocationDialog.java:101
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.map.mapview.MapView.getMapCursor
MapCursor< G, A, R > getMapCursor()
Returns the MapCursor of this view.
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.goLocationDialogManager
final AbstractPerMapDialogManager< G, A, R, GoLocationDialog< G, A, R > > goLocationDialogManager
The dialog manager for this dialog.
Definition: GoLocationDialog.java:77
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.gui.dialog.golocation.GoLocationDialog.xCoordinateField
final JTextField xCoordinateField
The text input field for the x coordinate.
Definition: GoLocationDialog.java:89
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.getDialog
Window getDialog()
Returns the Window for this instance.
Definition: GoLocationDialog.java:271
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.goLocation
boolean goLocation()
Moves the cursor to the given coordinates.
Definition: GoLocationDialog.java:215
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
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.gui.dialog.golocation.GoLocationDialog.mapView
final MapView< G, A, R > mapView
The affected map view this go location dialog affects.
Definition: GoLocationDialog.java:83
net.sf.gridarta.gui.map.AbstractPerMapDialogManager
Maintains (dialog) instance associated to map view instances.
Definition: AbstractPerMapDialogManager.java:39
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.gui.dialog.golocation.GoLocationDialog.yCoordinateField
final JTextField yCoordinateField
The text input field for the y coordinate.
Definition: GoLocationDialog.java:95
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.createPanel
JPanel createPanel()
Creates the GUI.
Definition: GoLocationDialog.java:148
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.parseCoordinate
int parseCoordinate(@NotNull final JTextComponent textField, final int range)
Parses a coordinate input field.
Definition: GoLocationDialog.java:236
net.sf.gridarta.gui.map.AbstractPerMapDialogManager.disposeDialog
void disposeDialog(final MapView< G, A, R > mapView)
Dispose a dialog.
Definition: AbstractPerMapDialogManager.java:98
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.utils.TextComponentUtils.setAutoSelectOnFocus
static void setAutoSelectOnFocus(@NotNull final JTextComponent textComponent)
Selects all text of a JTextComponent when the component gains the focus.
Definition: TextComponentUtils.java:47
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog
A dialog to ask the user for coordinates to move the cursor to.
Definition: GoLocationDialog.java:60
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.dialog
final JDialog dialog
The JDialog instance.
Definition: GoLocationDialog.java:113
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.goLocationCancel
void goLocationCancel()
Action method for cancel.
Definition: GoLocationDialog.java:206
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.model.mapcontrol.MapControl.getMapModel
MapModel< G, A, R > getMapModel()
Returns the map model.
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.dialog.golocation.GoLocationDialog.cancelButton
final JButton cancelButton
The JButton for cancel.
Definition: GoLocationDialog.java:107
net.sf.gridarta.gui.utils.TextComponentUtils
Utility class for JTextComponent related functions.
Definition: TextComponentUtils.java:34
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.gui.utils.GUIConstants.DIALOG_BORDER
Border DIALOG_BORDER
The Border object to be used when creating dialogs.
Definition: GUIConstants.java:38