Gridarta Editor
StatusBar.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.misc;
21 
22 import java.awt.Dimension;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.awt.Point;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.awt.event.MouseEvent;
29 import java.awt.event.MouseMotionListener;
30 import java.text.NumberFormat;
31 import javax.swing.JLabel;
32 import javax.swing.JPanel;
33 import javax.swing.Timer;
34 import javax.swing.border.BevelBorder;
53 import net.sf.japi.swing.action.ActionBuilder;
54 import net.sf.japi.swing.action.ActionBuilderFactory;
55 import org.jetbrains.annotations.NotNull;
56 import org.jetbrains.annotations.Nullable;
57 
68 public class StatusBar<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JPanel implements ScriptEditControlCallback {
69 
73  private static final long serialVersionUID = 1L;
74 
78  @NotNull
79  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
80 
85  @NotNull
87 
92  @NotNull
94 
99  @NotNull
100  private final JLabel mouse;
101 
106  @NotNull
107  private final JLabel cursor;
108 
113  @NotNull
114  private final JLabel status;
115 
120  @NotNull
121  private final JLabel memory;
122 
126  @NotNull
127  private final Point mouseMapTmp = new Point();
128 
133  @Nullable
135 
139  @NotNull
141 
142  @Override
143  public void mapCursorChangedPos(@NotNull final Point location) {
144  mapCursorChanged(mapView == null ? null : mapView.getMapCursor());
145  }
146 
147  @Override
148  public void mapCursorChangedMode() {
149  mapCursorChanged(mapView == null ? null : mapView.getMapCursor());
150  }
151 
152  @Override
153  public void mapCursorChangedGameObject(@Nullable final MapSquare<G, A, R> mapSquare, @Nullable final G gameObject) {
154  // ignore
155  }
156 
157  @Override
158  public void mapCursorChangedSize() {
159  // ignore
160  }
161 
162  };
163 
167  @NotNull
169 
170  @Override
171  public void currentMapChanged(@Nullable final MapControl<G, A, R> mapControl) {
172  // ignore
173  }
174 
175  @Override
176  public void mapCreated(@NotNull final MapControl<G, A, R> mapControl, final boolean interactive) {
177  mapControl.addMapControlListener(mapControlListener);
178  }
179 
180  @Override
181  public void mapClosing(@NotNull final MapControl<G, A, R> mapControl) {
182  // ignore
183  }
184 
185  @Override
186  public void mapClosed(@NotNull final MapControl<G, A, R> mapControl) {
187  mapControl.removeMapControlListener(mapControlListener);
188  }
189 
190  };
191 
195  @NotNull
197 
198  @Override
199  public void activeMapViewChanged(@Nullable final MapView<G, A, R> mapView) {
201  }
202 
203  @Override
204  public void mapViewCreated(@NotNull final MapView<G, A, R> mapView) {
205  // ignore
206  }
207 
208  @Override
209  public void mapViewClosing(@NotNull final MapView<G, A, R> mapView) {
210  // ignore
211  }
212 
213  };
214 
218  @NotNull
219  private final MapControlListener<G, A, R> mapControlListener = mapControl -> {
220  final String mapType = mapControl.isPickmap() ? "map" : "pickmap";
221  setStatusText("Saved " + mapType + " '" + mapControl.getMapModel().getMapArchObject().getMapName() + "'.");
222  };
223 
228  @NotNull
229  private final MouseMotionListener mouseMotionListener = new MouseMotionListener() {
230 
231  @Override
232  public void mouseDragged(@NotNull final MouseEvent e) {
233  mousePosChanged(e);
234  }
235 
236  @Override
237  public void mouseMoved(@NotNull final MouseEvent e) {
238  mousePosChanged(e);
239  }
240 
241  };
242 
247  @NotNull
248  private final ActionListener statusBarUpdate = new ActionListener() {
249 
250  @Override
251  public void actionPerformed(@NotNull final ActionEvent e) {
252  final int archetypeCount = archetypeSet.getArchetypeCount();
253 
254  final int faceObjectsCount = faceObjects.size();
255 
256  final Runtime runtime = Runtime.getRuntime();
257  final long freeMem = runtime.freeMemory();
258  final long totMem = runtime.totalMemory();
259  final long usedMem = totMem - freeMem;
260 
261  memory.setText(ACTION_BUILDER.format("memory", archetypeCount, faceObjectsCount, getMemoryString(usedMem), getMemoryString(freeMem), getMemoryString(totMem)));
262  }
263 
264  };
265 
274  public StatusBar(@NotNull final MapManager<G, A, R> mapManager, @NotNull final MapViewManager<G, A, R> mapViewManager, @NotNull final ArchetypeSet<G, A, R> archetypeSet, @NotNull final NamedObjects<FaceObject> faceObjects) {
275  this.archetypeSet = archetypeSet;
276  this.faceObjects = faceObjects;
277  setLayout(new GridBagLayout());
278  setBorder(new BevelBorder(BevelBorder.LOWERED));
279 
280  final GridBagConstraints gbc = new GridBagConstraints();
281  gbc.fill = GridBagConstraints.HORIZONTAL;
282  gbc.anchor = GridBagConstraints.WEST;
283  gbc.ipadx = 1;
284 
285  gbc.weightx = 0.0;
286  mouse = new JLabel(" ");
287  mouse.setBorder(new BevelBorder(BevelBorder.LOWERED));
288  add(mouse, gbc);
289 
290  cursor = new JLabel(" ");
291  cursor.setBorder(new BevelBorder(BevelBorder.LOWERED));
292  add(cursor, gbc);
293 
294  gbc.weightx = 5.0;
295  status = new JLabel(" ");
296  status.setBorder(new BevelBorder(BevelBorder.LOWERED));
297  add(status, gbc);
298 
299  gbc.weightx = 0.0;
300  memory = new JLabel(" ");
301  memory.setBorder(new BevelBorder(BevelBorder.LOWERED));
302  add(memory, gbc);
303 
304  mapManager.addMapManagerListener(mapManagerListener);
305  mapViewManager.addMapViewManagerListener(mapViewManagerListener);
306 
307  new Timer(5000, statusBarUpdate).start();
308  }
309 
314  public void setStatusText(final String text) {
315  status.setText(text);
316  }
317 
322  @NotNull
323  private static final NumberFormat FORMAT = NumberFormat.getInstance();
324 
325  static {
326  FORMAT.setMinimumFractionDigits(1);
327  FORMAT.setMaximumFractionDigits(1);
328  }
329 
333  @NotNull
334  private static final String @NotNull [] UNITS = { "Bytes", "KB", "MB", "GB" };
335 
342  @Nullable
343  private static String getMemoryString(final long mem) {
344  for (int i = UNITS.length - 1; i >= 0; i--) {
345  final long m = 1L << i * 10;
346  if (mem > m) {
347  return FORMAT.format(mem / (double) m) + UNITS[i];
348  }
349  }
350  assert false;
351  return null;
352  }
353 
359  private void mapCursorChanged(@Nullable final MapCursor<G, A, R> mapCursor) {
360  final String formatCursor;
361  if (mapCursor == null) {
362  formatCursor = "";
363  } else {
364  final Point pos = mapCursor.getLocation();
365  final int cursorX = pos.x;
366  final int cursorY = pos.y;
367  if (mapCursor.isDragging()) {
368  final Dimension offset = mapCursor.getDragOffset();
369  assert offset != null;
370  final int offsetX = Math.abs(offset.width) + 1;
371  final int offsetY = Math.abs(offset.height) + 1;
372  formatCursor = ACTION_BUILDER.format("statusCursorDragging", cursorX, cursorY, offsetX, offsetY);
373  } else {
374  formatCursor = ACTION_BUILDER.format("statusCursorActive", cursorX, cursorY);
375  }
376  }
377  cursor.setText(formatCursor);
378  }
379 
384  private void mousePosChanged(@NotNull final MouseEvent e) {
385  final MapRenderer renderer = (MapRenderer) e.getSource();
386  if (renderer.getSquareLocationAt(e.getPoint(), mouseMapTmp)) {
387  final int mouseMapX = mouseMapTmp.x;
388  final int mouseMapY = mouseMapTmp.y;
389  mouse.setText(ACTION_BUILDER.format("statusMouseOn", mouseMapX, mouseMapY));
390  } else {
391  mouse.setText(ACTION_BUILDER.format("statusMouseOff"));
392  }
393  }
394 
395  private void setCurrentMapView(@Nullable final MapView<G, A, R> mapView) {
396  if (this.mapView != null) {
397  this.mapView.getMapCursor().removeMapCursorListener(mapCursorListener);
398  this.mapView.getRenderer().removeMouseMotionListener(mouseMotionListener);
399  }
400 
401  this.mapView = mapView;
402 
403  if (this.mapView != null) {
405  this.mapView.getRenderer().addMouseMotionListener(mouseMotionListener);
406  }
407 
408  mapCursorChanged(mapView == null ? null : mapView.getMapCursor());
409  mouse.setText("");
410  }
411 
412  @Override
413  public void statusMessage(@NotNull final String message) {
414  setStatusText(message);
415  }
416 
417 }
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.textedit.scripteditor
Classes for the script editor used within the editor to create and modify Python and Lua scripts.
Definition: Actions.java:20
net.sf.gridarta.model.mapmanager.MapManager
A MapManager manages all opened maps.
Definition: MapManager.java:37
net.sf.gridarta.gui.misc.StatusBar.status
final JLabel status
The label that shows the one line text message.
Definition: StatusBar.java:114
net.sf.gridarta.gui.misc.StatusBar.UNITS
static final String[] UNITS
The units used by getMemoryString(long).
Definition: StatusBar.java:334
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.misc.StatusBar.mouseMapTmp
final Point mouseMapTmp
Temporary used to get map coordinates.
Definition: StatusBar.java:127
net.sf.gridarta.model.mapmodel.MapSquare
A single Map Square.
Definition: MapSquare.java:45
net.sf.gridarta.gui.map.mapview.MapViewManager
Maintains all map views.
Definition: MapViewManager.java:38
net.sf
net.sf.gridarta.model.mapmanager.MapManagerListener
Interface for listeners listening to MapManager changes.
Definition: MapManagerListener.java:42
net.sf.gridarta.model.data.NamedObjects.size
int size()
Get the number of objects.
net.sf.gridarta.gui.misc.StatusBar.archetypeSet
final ArchetypeSet< G, A, R > archetypeSet
The ArchetypeSet.
Definition: StatusBar.java:86
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.misc.StatusBar.StatusBar
StatusBar(@NotNull final MapManager< G, A, R > mapManager, @NotNull final MapViewManager< G, A, R > mapViewManager, @NotNull final ArchetypeSet< G, A, R > archetypeSet, @NotNull final NamedObjects< FaceObject > faceObjects)
Constructs a status bar that has the given main controller object set as its controller.
Definition: StatusBar.java:274
net.sf.gridarta.gui.map.mapview.MapViewManagerListener
Interface for listeners interested in events related to {} instances.
Definition: MapViewManagerListener.java:33
net.sf.gridarta.gui.misc.StatusBar.memory
final JLabel memory
The label that shows the memory status.
Definition: StatusBar.java:121
net.sf.gridarta.gui.map.renderer
Definition: AbstractIsoMapRenderer.java:20
net.sf.gridarta.gui.misc.StatusBar.statusMessage
void statusMessage(@NotNull final String message)
A message that should be reported to the user.
Definition: StatusBar.java:413
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.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.textedit
net.sf.gridarta.gui.misc.StatusBar.mapCursorChanged
void mapCursorChanged(@Nullable final MapCursor< G, A, R > mapCursor)
Sets the coordinates of the MapCursor to cursor label and the offset when in drag mode.
Definition: StatusBar.java:359
net.sf.gridarta.model.mapcursor.MapCursorListener
Interface for listeners listening to MapCursor related events.
Definition: MapCursorListener.java:36
net.sf.gridarta.gui.misc.StatusBar.statusBarUpdate
final ActionListener statusBarUpdate
The action listener which is registered to periodically update the status bar.
Definition: StatusBar.java:248
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.misc.StatusBar.mapControlListener
final MapControlListener< G, A, R > mapControlListener
The MapControlListener used to detect saved maps.
Definition: StatusBar.java:219
net.sf.gridarta.gui.map.mapview.MapView.getMapCursor
MapCursor< G, A, R > getMapCursor()
Returns the MapCursor of this view.
net.sf.gridarta.gui.misc.StatusBar.serialVersionUID
static final long serialVersionUID
The serial Version UID.
Definition: StatusBar.java:73
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.archetypeset.ArchetypeSet.getArchetypeCount
int getArchetypeCount()
Returns the number of Archetypes available.
net.sf.gridarta.gui.misc.StatusBar.getMemoryString
static String getMemoryString(final long mem)
Returns the given memory amount as a string scales the value to be bytes, kilobytes or megabytes.
Definition: StatusBar.java:343
net.sf.gridarta.gui.misc.StatusBar.setStatusText
void setStatusText(final String text)
Sets the level status text, which usually displays arch numbers.
Definition: StatusBar.java:314
net.sf.gridarta.gui.misc.StatusBar.mapManagerListener
final MapManagerListener< G, A, R > mapManagerListener
The map manager listener to detect current map changes.
Definition: StatusBar.java:168
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.textedit.scripteditor.ScriptEditControlCallback
Callback functions to be implemented by users of ScriptEditControl.
Definition: ScriptEditControlCallback.java:27
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.archetypeset.ArchetypeSet
Interface that captures similarities between different ArchetypeSet implementations.
Definition: ArchetypeSet.java:37
net.sf.gridarta.model.mapcursor.MapCursor
MapCursor provides methods to move and drag on map.
Definition: MapCursor.java:58
net.sf.gridarta.model.data
Classes for handling data that is organized in a tree.
Definition: AbstractNamedObject.java:20
net.sf.gridarta.gui.misc.StatusBar.setCurrentMapView
void setCurrentMapView(@Nullable final MapView< G, A, R > mapView)
Definition: StatusBar.java:395
net.sf.gridarta.gui.misc.StatusBar.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: StatusBar.java:79
net.sf.gridarta.gui.misc.StatusBar.mousePosChanged
void mousePosChanged(@NotNull final MouseEvent e)
Set new mouse and map coordinates to mouse label.
Definition: StatusBar.java:384
net.sf.gridarta.gui.misc.StatusBar.mouse
final JLabel mouse
The label that shows the mouse.
Definition: StatusBar.java:100
net.sf.gridarta.model.mapcursor.MapCursor.addMapCursorListener
void addMapCursorListener(@NotNull final MapCursorListener< G, A, R > listener)
Register a MapCursorListener.
Definition: MapCursor.java:419
net.sf.gridarta.gui.misc.StatusBar.faceObjects
final NamedObjects< FaceObject > faceObjects
The NamedObjects instance to use.
Definition: StatusBar.java:93
net.sf.gridarta.model.face.FaceObject
Common interface for FaceObject.
Definition: FaceObject.java:30
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.misc.StatusBar.cursor
final JLabel cursor
The label that shows the cursor.
Definition: StatusBar.java:107
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.misc.StatusBar.mapViewManagerListener
final MapViewManagerListener< G, A, R > mapViewManagerListener
The map view manager listener to detect current map changes.
Definition: StatusBar.java:196
net.sf.gridarta.model.face
The face is the appearance of an object.
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.mapcontrol.MapControl
Currently nothing more than a marker interface for unification.
Definition: MapControl.java:35
net.sf.gridarta.model.mapcontrol.MapControlListener
Interface for listeners listening on changes in MapControl instances.
Definition: MapControlListener.java:33
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.misc.StatusBar.mapView
MapView< G, A, R > mapView
The map view for which mapCursorListener is registered, or.
Definition: StatusBar.java:134
net.sf.gridarta.gui.misc.StatusBar.FORMAT
static final NumberFormat FORMAT
The DecimalFormat to use for formatting the numbers in {}.
Definition: StatusBar.java:323
net.sf.gridarta.gui.map.renderer.MapRenderer
Common interface for renderers of map control instances.
Definition: MapRenderer.java:36
net.sf.gridarta.gui.misc.StatusBar.mapCursorListener
final MapCursorListener< G, A, R > mapCursorListener
The map cursor listener to detect map cursor changes.
Definition: StatusBar.java:140
net.sf.gridarta.model.mapcursor
Definition: MapCursor.java:20
net.sf.gridarta.model.archetypeset
Definition: ArchetypeSet.java:20
net.sf.gridarta.gui.misc.StatusBar
Implements the main status bar of the application.
Definition: StatusBar.java:68
net.sf.gridarta.model.data.NamedObjects
This class manages NamedObjects, managing their tree as well as providing a method for showing a dial...
Definition: NamedObjects.java:33
net.sf.gridarta.gui.map.renderer.MapRenderer.getSquareLocationAt
boolean getSquareLocationAt(@NotNull Point point, @NotNull Point retPoint)
Returns the map location at the given point.
net.sf.gridarta.gui.misc.StatusBar.mouseMotionListener
final MouseMotionListener mouseMotionListener
The MouseMotionListener for tracking the mouse position in map windows.
Definition: StatusBar.java:229