source: josm/trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java@ 2985

Last change on this file since 2985 was 2621, checked in by Gubaer, 14 years ago

Moved layer listener management from Layer to MapView
Made sure that listeners also unregister when they register for layer change events.

This will certainly break plugins. Plugin updates will follow later.

File size: 3.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.history;
3
4import java.awt.Dimension;
5import java.awt.Point;
6import java.util.ArrayList;
7import java.util.HashMap;
8import java.util.Map;
9
10import org.openstreetmap.josm.Main;
11import org.openstreetmap.josm.data.osm.history.History;
12import org.openstreetmap.josm.gui.MapView;
13import org.openstreetmap.josm.gui.layer.Layer;
14import org.openstreetmap.josm.tools.WindowGeometry;
15
16public class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
17 static private HistoryBrowserDialogManager instance;
18 static public HistoryBrowserDialogManager getInstance() {
19 if (instance == null) {
20 instance = new HistoryBrowserDialogManager();
21 }
22 return instance;
23 }
24
25 private Map<Long, HistoryBrowserDialog> dialogs;
26
27 protected HistoryBrowserDialogManager() {
28 dialogs = new HashMap<Long, HistoryBrowserDialog>();
29 MapView.addLayerChangeListener(this);
30 }
31
32 public boolean existsDialog(long id) {
33 return dialogs.containsKey(id);
34 }
35
36 public void show(long id, HistoryBrowserDialog dialog) {
37 if (dialogs.values().contains(dialog)) {
38 show(id);
39 } else {
40 placeOnScreen(dialog);
41 dialog.setVisible(true);
42 dialogs.put(id, dialog);
43 }
44 }
45
46 public void show(long id) {
47 if (dialogs.keySet().contains(id)) {
48 dialogs.get(id).toFront();
49 }
50 }
51
52 protected boolean hasDialogWithCloseUpperLeftCorner(Point p) {
53 for (HistoryBrowserDialog dialog: dialogs.values()) {
54 Point corner = dialog.getLocation();
55 if (p.x >= corner.x -5 && corner.x + 5 >= p.x
56 && p.y >= corner.y -5 && corner.y + 5 >= p.y)
57 return true;
58 }
59 return false;
60 }
61
62 public void placeOnScreen(HistoryBrowserDialog dialog) {
63 WindowGeometry geometry = WindowGeometry.centerOnScreen(new Dimension(800,500));
64 geometry.apply(dialog);
65 Point p = dialog.getLocation();
66 while(hasDialogWithCloseUpperLeftCorner(p)) {
67 p.x +=20;
68 p.y += 20;
69 }
70 dialog.setLocation(p);
71 }
72
73 public void hide(HistoryBrowserDialog dialog) {
74 long id = 0;
75 for (long i: dialogs.keySet()) {
76 if (dialogs.get(i) == dialog) {
77 id = i;
78 break;
79 }
80 }
81 if (id > 0) {
82 dialogs.remove(id);
83 }
84 dialog.setVisible(false);
85 dialog.dispose();
86 }
87
88 /**
89 * Hides and destroys all currently visible history browser dialogs
90 *
91 */
92 public void hideAll() {
93 ArrayList<HistoryBrowserDialog> dialogs = new ArrayList<HistoryBrowserDialog>();
94 dialogs.addAll(this.dialogs.values());
95 for (HistoryBrowserDialog dialog: dialogs) {
96 dialog.unlinkAsListener();
97 hide(dialog);
98 }
99 }
100
101 public void show(History h) {
102 if (h == null)
103 return;
104 if (existsDialog(h.getId())) {
105 show(h.getId());
106 } else {
107 HistoryBrowserDialog dialog = new HistoryBrowserDialog(h);
108 show(h.getId(), dialog);
109 }
110 }
111
112 /* ----------------------------------------------------------------------------- */
113 /* LayerChangeListener */
114 /* ----------------------------------------------------------------------------- */
115 public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
116 public void layerAdded(Layer newLayer) {}
117
118 public void layerRemoved(Layer oldLayer) {
119 // remove all history browsers if the number of layers drops to 0
120 //
121 if (Main.map.mapView.getNumLayers() == 0) {
122 hideAll();
123 }
124 }
125}
Note: See TracBrowser for help on using the repository browser.