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-2015 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;
54 import net.sf.japi.swing.action.ActionBuilder;
55 import net.sf.japi.swing.action.ActionBuilderFactory;
56 import org.jetbrains.annotations.NotNull;
57 import org.jetbrains.annotations.Nullable;
58 
69 public class StatusBar<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JPanel implements ScriptEditControlCallback {
70 
74  private static final long serialVersionUID = 1L;
75 
79  @NotNull
80  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
81 
86  @NotNull
88 
93  @NotNull
95 
100  @NotNull
101  private final JLabel mouse;
102 
107  @NotNull
108  private final JLabel cursor;
109 
114  @NotNull
115  private final JLabel status;
116 
121  @NotNull
122  private final JLabel memory;
123 
127  @NotNull
128  private final Point mouseMapTmp = new Point();
129 
134  @Nullable
136 
140  @NotNull
142 
143  @Override
144  public void mapCursorChangedPos(@NotNull final Point location) {
145  mapCursorChanged(mapView == null ? null : mapView.getMapCursor());
146  }
147 
148  @Override
149  public void mapCursorChangedMode() {
150  mapCursorChanged(mapView == null ? null : mapView.getMapCursor());
151  }
152 
153  @Override
154  public void mapCursorChangedGameObject(@Nullable final MapSquare<G, A, R> mapSquare, @Nullable final G gameObject) {
155  // ignore
156  }
157 
158  @Override
159  public void mapCursorChangedSize() {
160  // ignore
161  }
162 
163  };
164 
168  @NotNull
170 
171  @Override
172  public void currentMapChanged(@Nullable final MapControl<G, A, R> mapControl) {
173  // ignore
174  }
175 
176  @Override
177  public void mapCreated(@NotNull final MapControl<G, A, R> mapControl, final boolean interactive) {
178  mapControl.addMapControlListener(mapControlListener);
179  }
180 
181  @Override
182  public void mapClosing(@NotNull final MapControl<G, A, R> mapControl) {
183  // ignore
184  }
185 
186  @Override
187  public void mapClosed(@NotNull final MapControl<G, A, R> mapControl) {
188  mapControl.removeMapControlListener(mapControlListener);
189  }
190 
191  };
192 
196  @NotNull
198 
199  @Override
200  public void activeMapViewChanged(@Nullable final MapView<G, A, R> mapView) {
202  }
203 
204  @Override
205  public void mapViewCreated(@NotNull final MapView<G, A, R> mapView) {
206  // ignore
207  }
208 
209  @Override
210  public void mapViewClosing(@NotNull final MapView<G, A, R> mapView) {
211  // ignore
212  }
213 
214  };
215 
219  @NotNull
221 
222  @Override
223  public void saved(@NotNull final DefaultMapControl<G, A, R> mapControl) {
224  final String mapType = mapControl.isPickmap() ? "map" : "pickmap";
225  setStatusText("Saved " + mapType + " '" + mapControl.getMapModel().getMapArchObject().getMapName() + "'.");
226  }
227 
228  };
229 
234  @NotNull
235  private final MouseMotionListener mouseMotionListener = new MouseMotionListener() {
236 
237  @Override
238  public void mouseDragged(@NotNull final MouseEvent e) {
239  mousePosChanged(e);
240  }
241 
242  @Override
243  public void mouseMoved(@NotNull final MouseEvent e) {
244  mousePosChanged(e);
245  }
246 
247  };
248 
253  @NotNull
254  private final ActionListener statusBarUpdate = new ActionListener() {
255 
256  @Override
257  public void actionPerformed(@NotNull final ActionEvent e) {
258  final int archetypeCount = archetypeSet.getArchetypeCount();
259 
260  final int faceObjectsCount = faceObjects.size();
261 
262  final Runtime runtime = Runtime.getRuntime();
263  final long freeMem = runtime.freeMemory();
264  final long totMem = runtime.totalMemory();
265  final long usedMem = totMem - freeMem;
266 
267  memory.setText(ACTION_BUILDER.format("memory", archetypeCount, faceObjectsCount, getMemoryString(usedMem), getMemoryString(freeMem), getMemoryString(totMem)));
268  }
269 
270  };
271 
280  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) {
281  this.archetypeSet = archetypeSet;
282  this.faceObjects = faceObjects;
283  setLayout(new GridBagLayout());
284  setBorder(new BevelBorder(BevelBorder.LOWERED));
285 
286  final GridBagConstraints gbc = new GridBagConstraints();
287  gbc.fill = GridBagConstraints.HORIZONTAL;
288  gbc.anchor = GridBagConstraints.WEST;
289  gbc.ipadx = 1;
290 
291  gbc.weightx = 0.0;
292  mouse = new JLabel(" ");
293  mouse.setBorder(new BevelBorder(BevelBorder.LOWERED));
294  add(mouse, gbc);
295 
296  cursor = new JLabel(" ");
297  cursor.setBorder(new BevelBorder(BevelBorder.LOWERED));
298  add(cursor, gbc);
299 
300  gbc.weightx = 5.0;
301  status = new JLabel(" ");
302  status.setBorder(new BevelBorder(BevelBorder.LOWERED));
303  add(status, gbc);
304 
305  gbc.weightx = 0.0;
306  memory = new JLabel(" ");
307  memory.setBorder(new BevelBorder(BevelBorder.LOWERED));
308  add(memory, gbc);
309 
310  mapManager.addMapManagerListener(mapManagerListener);
311  mapViewManager.addMapViewManagerListener(mapViewManagerListener);
312 
313  new Timer(5000, statusBarUpdate).start();
314  }
315 
320  public void setStatusText(final String text) {
321  status.setText(text);
322  }
323 
328  @NotNull
329  private static final NumberFormat FORMAT = NumberFormat.getInstance();
330 
331  static {
332  FORMAT.setMinimumFractionDigits(1);
333  FORMAT.setMaximumFractionDigits(1);
334  }
335 
339  @NotNull
340  private static final String @NotNull [] UNITS = { "Bytes", "KB", "MB", "GB" };
341 
348  @Nullable
349  private static String getMemoryString(final long mem) {
350  for (int i = UNITS.length - 1; i >= 0; i--) {
351  final long m = 1L << i * 10;
352  if (mem > m) {
353  return FORMAT.format(mem / (double) m) + UNITS[i];
354  }
355  }
356  assert false;
357  return null;
358  }
359 
365  private void mapCursorChanged(@Nullable final MapCursor<G, A, R> mapCursor) {
366  final String formatCursor;
367  if (mapCursor == null) {
368  formatCursor = "";
369  } else {
370  final Point pos = mapCursor.getLocation();
371  final int cursorX = pos.x;
372  final int cursorY = pos.y;
373  if (mapCursor.isDragging()) {
374  final Dimension offset = mapCursor.getDragOffset();
375  assert offset != null;
376  final int offsetX = Math.abs(offset.width) + 1;
377  final int offsetY = Math.abs(offset.height) + 1;
378  formatCursor = ACTION_BUILDER.format("statusCursorDragging", cursorX, cursorY, offsetX, offsetY);
379  } else {
380  formatCursor = ACTION_BUILDER.format("statusCursorActive", cursorX, cursorY);
381  }
382  }
383  cursor.setText(formatCursor);
384  }
385 
390  private void mousePosChanged(@NotNull final MouseEvent e) {
391  final MapRenderer renderer = (MapRenderer) e.getSource();
392  if (renderer.getSquareLocationAt(e.getPoint(), mouseMapTmp)) {
393  final int mouseMapX = mouseMapTmp.x;
394  final int mouseMapY = mouseMapTmp.y;
395  mouse.setText(ACTION_BUILDER.format("statusMouseOn", mouseMapX, mouseMapY));
396  } else {
397  mouse.setText(ACTION_BUILDER.format("statusMouseOff"));
398  }
399  }
400 
401  private void setCurrentMapView(@Nullable final MapView<G, A, R> mapView) {
402  if (this.mapView != null) {
403  this.mapView.getMapCursor().removeMapCursorListener(mapCursorListener);
404  this.mapView.getRenderer().removeMouseMotionListener(mouseMotionListener);
405  }
406 
407  this.mapView = mapView;
408 
409  if (this.mapView != null) {
411  this.mapView.getRenderer().addMouseMotionListener(mouseMotionListener);
412  }
413 
414  mapCursorChanged(mapView == null ? null : mapView.getMapCursor());
415  mouse.setText("");
416  }
417 
418  @Override
419  public void statusMessage(@NotNull final String message) {
420  setStatusText(message);
421  }
422 
423 }
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.textedit.scripteditor
Definition: Actions.java:20
net.sf.gridarta.model.mapmanager.MapManager
Definition: MapManager.java:37
net.sf.gridarta.gui.misc.StatusBar.status
final JLabel status
Definition: StatusBar.java:115
net.sf.gridarta.gui.misc.StatusBar.UNITS
static final String[] UNITS
Definition: StatusBar.java:340
net.sf.gridarta
net.sf.gridarta.gui.misc.StatusBar.mouseMapTmp
final Point mouseMapTmp
Definition: StatusBar.java:128
net.sf.gridarta.model.mapmodel.MapSquare
Definition: MapSquare.java:45
net.sf.gridarta.gui.map.mapview.MapViewManager
Definition: MapViewManager.java:38
net.sf
net.sf.gridarta.model.mapmanager.MapManagerListener
Definition: MapManagerListener.java:42
net.sf.gridarta.model.data.NamedObjects.size
int size()
net.sf.gridarta.gui.misc.StatusBar.archetypeSet
final ArchetypeSet< G, A, R > archetypeSet
Definition: StatusBar.java:87
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)
Definition: StatusBar.java:280
net.sf.gridarta.gui.map.mapview.MapViewManagerListener
Definition: MapViewManagerListener.java:33
net.sf.gridarta.gui.misc.StatusBar.memory
final JLabel memory
Definition: StatusBar.java:122
net.sf.gridarta.gui.map.renderer
Definition: AbstractIsoMapRenderer.java:20
net.sf.gridarta.gui.misc.StatusBar.statusMessage
void statusMessage(@NotNull final String message)
Definition: StatusBar.java:419
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
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)
Definition: StatusBar.java:365
net.sf.gridarta.model.mapcursor.MapCursorListener
Definition: MapCursorListener.java:36
net.sf.gridarta.gui.misc.StatusBar.statusBarUpdate
final ActionListener statusBarUpdate
Definition: StatusBar.java:254
net.sf.gridarta.gui
net.sf.gridarta.gui.misc.StatusBar.mapControlListener
final MapControlListener< G, A, R > mapControlListener
Definition: StatusBar.java:220
net.sf.gridarta.gui.map.mapview.MapView.getMapCursor
MapCursor< G, A, R > getMapCursor()
net.sf.gridarta.gui.misc.StatusBar.serialVersionUID
static final long serialVersionUID
Definition: StatusBar.java:74
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.archetypeset.ArchetypeSet.getArchetypeCount
int getArchetypeCount()
net.sf.gridarta.gui.misc.StatusBar.getMemoryString
static String getMemoryString(final long mem)
Definition: StatusBar.java:349
net.sf.gridarta.gui.misc.StatusBar.setStatusText
void setStatusText(final String text)
Definition: StatusBar.java:320
net.sf.gridarta.gui.misc.StatusBar.mapManagerListener
final MapManagerListener< G, A, R > mapManagerListener
Definition: StatusBar.java:169
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.textedit.scripteditor.ScriptEditControlCallback
Definition: ScriptEditControlCallback.java:27
net.sf.gridarta.gui.map.mapview.MapView
Definition: MapView.java:43
net.sf.gridarta.model.archetypeset.ArchetypeSet
Definition: ArchetypeSet.java:37
net.sf.gridarta.model.mapcursor.MapCursor
Definition: MapCursor.java:58
net.sf.gridarta.model.data
Definition: AbstractNamedObject.java:20
net.sf.gridarta.gui.misc.StatusBar.setCurrentMapView
void setCurrentMapView(@Nullable final MapView< G, A, R > mapView)
Definition: StatusBar.java:401
net.sf.gridarta.gui.misc.StatusBar.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: StatusBar.java:80
net.sf.gridarta.gui.misc.StatusBar.mousePosChanged
void mousePosChanged(@NotNull final MouseEvent e)
Definition: StatusBar.java:390
net.sf.gridarta.gui.misc.StatusBar.mouse
final JLabel mouse
Definition: StatusBar.java:101
net.sf.gridarta.model.mapcursor.MapCursor.addMapCursorListener
void addMapCursorListener(@NotNull final MapCursorListener< G, A, R > listener)
Definition: MapCursor.java:419
net.sf.gridarta.gui.misc.StatusBar.faceObjects
final NamedObjects< FaceObject > faceObjects
Definition: StatusBar.java:94
net.sf.gridarta.model.face.FaceObject
Definition: FaceObject.java:30
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.misc.StatusBar.cursor
final JLabel cursor
Definition: StatusBar.java:108
net.sf.gridarta.gui.map
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.misc.StatusBar.mapViewManagerListener
final MapViewManagerListener< G, A, R > mapViewManagerListener
Definition: StatusBar.java:197
net.sf.gridarta.model.face
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.mapcontrol.MapControl
Definition: MapControl.java:35
net.sf.gridarta.model.mapcontrol.MapControlListener
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
Definition: StatusBar.java:135
net.sf.gridarta.model.mapcontrol.DefaultMapControl
Definition: DefaultMapControl.java:44
net.sf.gridarta.gui.misc.StatusBar.FORMAT
static final NumberFormat FORMAT
Definition: StatusBar.java:329
net.sf.gridarta.gui.map.renderer.MapRenderer
Definition: MapRenderer.java:36
net.sf.gridarta.gui.misc.StatusBar.mapCursorListener
final MapCursorListener< G, A, R > mapCursorListener
Definition: StatusBar.java:141
net.sf.gridarta.model.mapcursor
Definition: MapCursor.java:20
net.sf.gridarta.model.archetypeset
Definition: ArchetypeSet.java:20
net.sf.gridarta.gui.misc.StatusBar
Definition: StatusBar.java:69
net.sf.gridarta.model.data.NamedObjects
Definition: NamedObjects.java:33
net.sf.gridarta.gui.map.renderer.MapRenderer.getSquareLocationAt
boolean getSquareLocationAt(@NotNull Point point, @NotNull Point retPoint)
net.sf.gridarta.gui.misc.StatusBar.mouseMotionListener
final MouseMotionListener mouseMotionListener
Definition: StatusBar.java:235