Gridarta Editor
MapDesktop.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.mapdesktop;
21 
22 import java.beans.PropertyVetoException;
23 import java.util.IdentityHashMap;
24 import java.util.Iterator;
25 import java.util.Map;
26 import javax.swing.Action;
27 import javax.swing.Icon;
28 import javax.swing.ImageIcon;
29 import javax.swing.JDesktopPane;
30 import javax.swing.JInternalFrame;
31 import javax.swing.JMenu;
32 import javax.swing.event.InternalFrameEvent;
33 import javax.swing.event.InternalFrameListener;
47 import net.sf.japi.swing.action.ActionBuilder;
48 import net.sf.japi.swing.action.ActionBuilderFactory;
49 import net.sf.japi.swing.action.ActionMethod;
50 import org.apache.log4j.Category;
51 import org.apache.log4j.Logger;
52 import org.jetbrains.annotations.NotNull;
53 import org.jetbrains.annotations.Nullable;
54 
60 public class MapDesktop<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JDesktopPane implements EditorAction {
61 
65  @NotNull
66  private static final Category LOG = Logger.getLogger(MapDesktop.class);
67 
71  @NotNull
72  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
73 
77  private static final long serialVersionUID = 1L;
78 
82  @NotNull
84 
88  @NotNull
90 
94  @NotNull
96 
100  @NotNull
102 
106  @Nullable
107  private Action aPrevWindow;
108 
112  @Nullable
113  private Action aNextWindow;
114 
118  @NotNull
119  private final Map<MapView<G, A, R>, WindowAction<G, A, R>> windowActions = new IdentityHashMap<>();
120 
126  @NotNull
127  private final Map<MapView<G, A, R>, MapViewFrameListener> mapViewFrameListeners = new IdentityHashMap<>();
128 
132  @NotNull
134 
135  @Override
136  public void currentMapChanged(@Nullable final MapControl<G, A, R> mapControl) {
137  // ignore
138  }
139 
140  @Override
141  public void mapCreated(@NotNull final MapControl<G, A, R> mapControl, final boolean interactive) {
143  }
144 
145  @Override
146  public void mapClosing(@NotNull final MapControl<G, A, R> mapControl) {
147  // ignore
148  }
149 
150  @Override
151  public void mapClosed(@NotNull final MapControl<G, A, R> mapControl) {
153  }
154 
155  };
156 
161  @NotNull
163 
164  @Override
165  public void mapViewCreated(@NotNull final MapView<G, A, R> mapView) {
166  addMapView(mapView);
167  }
168 
169  @Override
170  public void mapViewRaise(@NotNull final MapView<G, A, R> mapView) {
171  setCurrentMapView(mapView);
172  }
173 
174  @Override
175  public void mapViewClosing(@NotNull final MapView<G, A, R> mapView) {
176  removeMapView(mapView);
177  }
178 
179  };
180 
184  @NotNull
186 
187  @Override
188  public void iconChanged(@NotNull final MapControl<G, A, R> mapControl) {
189  final Iterator<MapView<G, A, R>> it = mapViewsManager.getMapViewIterator(mapControl);
190  while (it.hasNext()) {
191  updateFrameIcon(it.next());
192  }
193  }
194 
195  };
196 
205  this.mapViewManager = mapViewManager;
206  this.mapManager = mapManager;
207  this.mapImageCache = mapImageCache;
208  this.mapViewsManager = mapViewsManager;
211  updateFocus(false);
212  }
213 
218  public void setCurrentMapView(@NotNull final MapView<G, A, R> mapView) {
220  // De-iconify if necessary
221  final JInternalFrame internalFrame = mapView.getInternalFrame();
222  if (internalFrame.isIcon()) {
223  try {
224  internalFrame.setIcon(false);
225  } catch (final PropertyVetoException e) {
226  LOG.warn(ACTION_BUILDER.format("logUnexpectedException", e));
227  }
228  mapView.activate();
229  return;
230  }
231  updateFocus(true);
232  internalFrame.requestFocus();
233  internalFrame.restoreSubcomponentFocus();
234  }
235 
240  private void removeMapView(@NotNull final MapView<G, A, R> mapView) {
241  final JInternalFrame internalFrame = mapView.getInternalFrame();
242  internalFrame.removeInternalFrameListener(mapViewFrameListeners.remove(mapView));
243  mapViewManager.removeMapView(mapView);
244  if (windowActions.remove(mapView) == null) {
245  assert false;
246  }
247  remove(internalFrame);
248  // This is important: Removing a JInternalFrame from a JDesktopPane doesn't deselect it.
249  // Thus it will still be referenced. To prevent a closed map from being referenced by Swing,
250  // we check whether it's selected and if so deselect it.
251  if (getSelectedFrame() == mapView) {
252  setSelectedFrame(null);
253  }
254  internalFrame.dispose();
255  repaint();
256 
257  updateFocus(true);
258  refreshMenus();
259  }
260 
265  private void addMapView(@NotNull final MapView<G, A, R> mapView) {
266  final WindowAction<G, A, R> windowAction = new WindowAction<>(this, mapView, mapManager);
267  windowActions.put(mapView, windowAction);
268  updateFrameIcon(mapView);
269 
270  final JInternalFrame internalFrame = mapView.getInternalFrame();
271  final MapViewFrameListener mapViewFrameListener = new MapViewFrameListener(mapView);
272  if (mapViewFrameListeners.put(mapView, mapViewFrameListener) != null) {
273  assert false;
274  }
275  internalFrame.addInternalFrameListener(mapViewFrameListener);
276  add(internalFrame);
277  mapViewManager.addMapView(mapView);
278  setCurrentMapView(mapView);
279  internalFrame.setVisible(true);
280  internalFrame.setBounds(0, 0, getWidth(), getHeight());
281  try {
282  internalFrame.setMaximum(true);
283  } catch (final PropertyVetoException e) {
284  LOG.error("PropertyVetoException: " + e);
285  }
286  refreshMenus();
287  }
288 
293  private void updateFrameIcon(@NotNull final MapView<G, A, R> mapView) {
294  final Action windowAction = windowActions.get(mapView);
295  assert windowAction != null;
296  final Icon icon = new ImageIcon(mapImageCache.getOrCreateIcon(mapView.getMapControl()));
297  mapView.getInternalFrame().setFrameIcon(icon);
298  windowAction.putValue(Action.SMALL_ICON, icon);
299  }
300 
307  public void addWindowAction(@NotNull final JMenu menu, @NotNull final MapView<G, A, R> mapView, final int index) {
308  final WindowAction<G, A, R> windowAction = windowActions.get(mapView);
309  assert windowAction != null;
310  windowAction.setIndex(index);
311  menu.add(windowAction);
312  }
313 
318  private void activateAndRaiseMapView(@NotNull final MapView<G, A, R> mapView) {
319  mapManager.setCurrentMap(mapView.getMapControl());
320  mapView.activate();
321  final JInternalFrame internalFrame = mapView.getInternalFrame();
322  internalFrame.moveToFront();
323  setSelectedFrame(internalFrame);
324  }
325 
331  private void mapViewFocusLostNotify(@NotNull final MapView<G, A, R> mapView) {
333  updateFocus(true);
334  }
335 
340  private void mapViewFocusGainedNotify(@NotNull final MapView<G, A, R> mapView) {
342  mapViewsManager.setFocus(mapView);
343  mapManager.setCurrentMap(mapView.getMapControl());
344  }
345 
351  private void updateFocus(final boolean careAboutIconification) {
352  // Show the next map (if such exists)
353  for (final MapView<G, A, R> mapView : mapViewManager) {
354  final JInternalFrame internalFrame = mapView.getInternalFrame();
355  if (internalFrame.isIcon()) {
356  if (!careAboutIconification) {
357  try {
358  internalFrame.setIcon(false);
359  } catch (final PropertyVetoException e) {
360  LOG.warn(ACTION_BUILDER.format("logUnexpectedException", e));
361  }
362  activateAndRaiseMapView(mapView);
363  return;
364  }
365  } else {
366  activateAndRaiseMapView(mapView);
367  return;
368  }
369  }
370 
371  // No non-iconified map windows found
373  }
374 
378  @ActionMethod
379  public void prevWindow() {
380  doPrevWindow(true);
381  }
382 
386  @ActionMethod
387  public void nextWindow() {
388  doNextWindow(true);
389  }
390 
394  private void refreshMenus() {
395  if (aPrevWindow != null) {
396  aPrevWindow.setEnabled(doPrevWindow(false));
397  }
398  if (aNextWindow != null) {
399  aNextWindow.setEnabled(doNextWindow(false));
400  }
401  }
402 
408  private boolean doPrevWindow(final boolean performAction) {
409  if (!mapViewManager.doPrevWindow(performAction)) {
410  return false;
411  }
412 
413  if (performAction) {
414  updateFocus(false);
415  }
416 
417  return true;
418  }
419 
425  private boolean doNextWindow(final boolean performAction) {
426  if (!mapViewManager.doNextWindow(performAction)) {
427  return false;
428  }
429 
430  if (performAction) {
431  updateFocus(false);
432  }
433 
434  return true;
435  }
436 
437  @Override
438  public void setAction(@NotNull final Action action, @NotNull final String name) {
439  if (name.equals("prevWindow")) {
440  aPrevWindow = action;
441  } else if (name.equals("nextWindow")) {
442  aNextWindow = action;
443  } else {
444  throw new IllegalArgumentException("unsupported action name: " + name);
445  }
446  refreshMenus();
447  }
448 
452  private class MapViewFrameListener implements InternalFrameListener {
453 
457  @NotNull
458  private final MapView<G, A, R> mapView;
459 
465  this.mapView = mapView;
466  }
467 
468  @Override
469  public void internalFrameActivated(@NotNull final InternalFrameEvent e) {
470  // ignore
471  }
472 
473  @Override
474  public void internalFrameClosed(@NotNull final InternalFrameEvent e) {
475  // ignore
476  }
477 
478  @Override
479  public void internalFrameClosing(@NotNull final InternalFrameEvent e) {
481  }
482 
483  @Override
484  public void internalFrameDeactivated(@NotNull final InternalFrameEvent e) {
485  // ignore
486  }
487 
488  @Override
489  public void internalFrameDeiconified(@NotNull final InternalFrameEvent e) {
491  }
492 
493  @Override
494  public void internalFrameIconified(@NotNull final InternalFrameEvent e) {
496  }
497 
498  @Override
499  public void internalFrameOpened(@NotNull final InternalFrameEvent e) {
500  // ignore
501  }
502 
503  }
504 
505 }
net.sf.gridarta.gui.mapimagecache
Definition: ImageType.java:20
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameActivated
void internalFrameActivated(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:469
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.gui.map.mapview.MapViewManager.deactivateMapView
void deactivateMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewManager.java:105
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapViewsManager
final MapViewsManager< G, A, R > mapViewsManager
Definition: MapDesktop.java:101
net.sf.gridarta.gui.mapdesktop.MapDesktop.serialVersionUID
static final long serialVersionUID
Definition: MapDesktop.java:77
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapManagerListener
final MapManagerListener< G, A, R > mapManagerListener
Definition: MapDesktop.java:133
net.sf.gridarta.model.mapmanager.MapManager
Definition: MapManager.java:37
net.sf.gridarta
net.sf.gridarta.gui.map.mapview.MapViewManager
Definition: MapViewManager.java:38
net.sf
net.sf.gridarta.gui.map.mapview.MapViewsManager.getMapViewIterator
Iterator< MapView< G, A, R > > getMapViewIterator(@NotNull final MapControl< G, A, R > mapControl)
Definition: MapViewsManager.java:256
net.sf.gridarta.model.mapmanager.MapManagerListener
Definition: MapManagerListener.java:42
net.sf.gridarta.gui.mapdesktop.MapDesktop.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: MapDesktop.java:72
net.sf.gridarta.gui.map.mapview.MapViewManager.doNextWindow
boolean doNextWindow(final boolean performAction)
Definition: MapViewManager.java:203
net.sf.gridarta.gui.map.mapview.MapViewsManager.removeMapViewsListener
void removeMapViewsListener(@NotNull final MapControl< G, A, R > mapControl, @NotNull final MapViewsListener< G, A, R > listener)
Definition: MapViewsManager.java:198
net.sf.gridarta.gui.mapdesktop.MapDesktop.updateFocus
void updateFocus(final boolean careAboutIconification)
Definition: MapDesktop.java:351
net.sf.gridarta.model.mapmanager.MapManager.addMapManagerListener
void addMapManagerListener(@NotNull MapManagerListener< G, A, R > listener)
net.sf.gridarta.gui.mapdesktop.MapDesktop.doNextWindow
boolean doNextWindow(final boolean performAction)
Definition: MapDesktop.java:425
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapManager
final MapManager< G, A, R > mapManager
Definition: MapDesktop.java:89
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.mapView
final MapView< G, A, R > mapView
Definition: MapDesktop.java:458
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener
Definition: MapDesktop.java:452
net.sf.gridarta.gui.mapdesktop.WindowAction.setIndex
final void setIndex(final int index)
Definition: WindowAction.java:163
net.sf.gridarta.model.mapcontrol
Definition: DefaultMapControl.java:20
net.sf.gridarta.gui.mapdesktop.WindowAction
Definition: WindowAction.java:45
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameIconified
void internalFrameIconified(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:494
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapImageCacheListener
final MapImageCacheListener< G, A, R > mapImageCacheListener
Definition: MapDesktop.java:185
net.sf.gridarta.gui.mapdesktop.MapDesktop.setCurrentMapView
void setCurrentMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:218
net.sf.gridarta.gui
net.sf.gridarta.gui.map.mapview.MapViewManager.addMapView
void addMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewManager.java:92
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameDeiconified
void internalFrameDeiconified(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:489
net.sf.gridarta.gui.mapimagecache.MapImageCache
Definition: MapImageCache.java:54
net.sf.gridarta.gui.mapdesktop.MapDesktop.doPrevWindow
boolean doPrevWindow(final boolean performAction)
Definition: MapDesktop.java:408
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.mapimagecache.MapImageCache.getOrCreateIcon
Image getOrCreateIcon(@NotNull final File mapFile)
Definition: MapImageCache.java:198
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapViewFocusGainedNotify
void mapViewFocusGainedNotify(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:340
net.sf.gridarta.gui.map.mapview.MapViewsManager.closeMapView
void closeMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewsManager.java:308
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapViewManager
final MapViewManager< G, A, R > mapViewManager
Definition: MapDesktop.java:83
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameClosing
void internalFrameClosing(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:479
net.sf.gridarta.gui.mapdesktop.MapDesktop.LOG
static final Category LOG
Definition: MapDesktop.java:66
net.sf.gridarta.gui.mapdesktop.MapDesktop.updateFrameIcon
void updateFrameIcon(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:293
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapDesktop
MapDesktop(@NotNull final MapViewManager< G, A, R > mapViewManager, @NotNull final MapManager< G, A, R > mapManager, @NotNull final MapImageCache< G, A, R > mapImageCache, @NotNull final MapViewsManager< G, A, R > mapViewsManager)
Definition: MapDesktop.java:204
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.gui.mapimagecache.MapImageCacheListener
Definition: MapImageCacheListener.java:33
net.sf.gridarta.gui.map.mapview.MapView
Definition: MapView.java:43
net.sf.gridarta.gui.mapdesktop.MapDesktop.addWindowAction
void addWindowAction(@NotNull final JMenu menu, @NotNull final MapView< G, A, R > mapView, final int index)
Definition: MapDesktop.java:307
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameOpened
void internalFrameOpened(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:499
net.sf.gridarta.gui.mapimagecache.MapImageCache.addMapImageCacheListener
void addMapImageCacheListener(@NotNull final MapImageCacheListener< G, A, R > listener)
Definition: MapImageCache.java:325
net.sf.gridarta.gui.map.mapview.MapViewsListener
Definition: MapViewsListener.java:33
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapViewsListener
final MapViewsListener< G, A, R > mapViewsListener
Definition: MapDesktop.java:162
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapViewFrameListeners
final Map< MapView< G, A, R >, MapViewFrameListener > mapViewFrameListeners
Definition: MapDesktop.java:127
net.sf.gridarta.gui.mapdesktop.MapDesktop.activateAndRaiseMapView
void activateAndRaiseMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:318
net.sf.gridarta.gui.mapdesktop.MapDesktop.windowActions
final Map< MapView< G, A, R >, WindowAction< G, A, R > > windowActions
Definition: MapDesktop.java:119
net.sf.gridarta.gui.map.mapview.MapViewManager.setActiveMapView
void setActiveMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewManager.java:63
net.sf.gridarta.gui.map.mapview.MapViewsManager.addMapViewsListener
void addMapViewsListener(@NotNull final MapControl< G, A, R > mapControl, @NotNull final MapViewsListener< G, A, R > listener)
Definition: MapViewsManager.java:189
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapImageCache
final MapImageCache< G, A, R > mapImageCache
Definition: MapDesktop.java:95
net.sf.gridarta.gui.mapdesktop.MapDesktop.aPrevWindow
Action aPrevWindow
Definition: MapDesktop.java:107
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.mapdesktop.MapDesktop
Definition: MapDesktop.java:60
net.sf.gridarta.gui.map
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.mapdesktop.MapDesktop.nextWindow
void nextWindow()
Definition: MapDesktop.java:387
net.sf.gridarta.gui.mapdesktop.MapDesktop.removeMapView
void removeMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:240
net.sf.gridarta.gui.map.mapview.MapViewManager.doPrevWindow
boolean doPrevWindow(final boolean performAction)
Definition: MapViewManager.java:183
net.sf.gridarta.model.mapcontrol.MapControl
Definition: MapControl.java:35
net.sf.gridarta.gui.mapdesktop.MapDesktop.aNextWindow
Action aNextWindow
Definition: MapDesktop.java:113
net.sf.gridarta.gui.map.mapview.MapViewManager.activateMapView
void activateMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewManager.java:120
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameClosed
void internalFrameClosed(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:474
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.internalFrameDeactivated
void internalFrameDeactivated(@NotNull final InternalFrameEvent e)
Definition: MapDesktop.java:484
net.sf.gridarta.utils.EditorAction
Definition: EditorAction.java:29
net.sf.gridarta.gui.mapdesktop.MapDesktop.mapViewFocusLostNotify
void mapViewFocusLostNotify(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:331
net.sf.gridarta.gui.map.mapview.MapViewsManager.setFocus
void setFocus(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewsManager.java:246
net.sf.gridarta.model.mapmanager.MapManager.setCurrentMap
void setCurrentMap(@Nullable MapControl< G, A, R > mapControl)
net.sf.gridarta.gui.mapdesktop.MapDesktop.refreshMenus
void refreshMenus()
Definition: MapDesktop.java:394
net.sf.gridarta.gui.map.mapview.MapViewsManager
Definition: MapViewsManager.java:47
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.mapdesktop.MapDesktop.setAction
void setAction(@NotNull final Action action, @NotNull final String name)
Definition: MapDesktop.java:438
net.sf.gridarta.gui.mapdesktop.MapDesktop.prevWindow
void prevWindow()
Definition: MapDesktop.java:379
net.sf.gridarta.gui.map.mapview.MapViewManager.removeMapView
void removeMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapViewManager.java:75
net.sf.gridarta.gui.mapdesktop.MapDesktop.addMapView
void addMapView(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:265
net.sf.gridarta.gui.mapdesktop.MapDesktop.MapViewFrameListener.MapViewFrameListener
MapViewFrameListener(@NotNull final MapView< G, A, R > mapView)
Definition: MapDesktop.java:464