// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.history;
import java.awt.Dimension;
import java.awt.Point;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.history.History;
import org.openstreetmap.josm.gui.MapView;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.tools.WindowGeometry;
public class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
static private HistoryBrowserDialogManager instance;
static public HistoryBrowserDialogManager getInstance() {
if (instance == null) {
instance = new HistoryBrowserDialogManager();
}
return instance;
}
private Map<Long, HistoryBrowserDialog> dialogs;
protected HistoryBrowserDialogManager() {
dialogs = new HashMap<Long, HistoryBrowserDialog>();
MapView.addLayerChangeListener(this);
}
public boolean existsDialog(long id) {
return dialogs.containsKey(id);
}
public void show(long id, HistoryBrowserDialog dialog) {
if (dialogs.values().contains(dialog)) {
show(id);
} else {
placeOnScreen(dialog);
dialog.setVisible(true);
dialogs.put(id, dialog);
}
}
public void show(long id) {
if (dialogs.keySet().contains(id)) {
dialogs.get(id).toFront();
}
}
protected boolean hasDialogWithCloseUpperLeftCorner(Point p) {
for (HistoryBrowserDialog dialog: dialogs.values()) {
Point corner = dialog.getLocation();
if (p.x >= corner.x -5 && corner.x + 5 >= p.x
&& p.y >= corner.y -5 && corner.y + 5 >= p.y)
return true;
}
return false;
}
public void placeOnScreen(HistoryBrowserDialog dialog) {
WindowGeometry geometry = WindowGeometry.centerOnScreen(new Dimension(800,500));
geometry.apply(dialog);
Point p = dialog.getLocation();
while(hasDialogWithCloseUpperLeftCorner(p)) {
p.x +=20;
p.y += 20;
}
dialog.setLocation(p);
}
public void hide(HistoryBrowserDialog dialog) {
long id = 0;
for (long i: dialogs.keySet()) {
if (dialogs.get(i) == dialog) {
id = i;
break;
}
}
if (id > 0) {
dialogs.remove(id);
}
dialog.setVisible(false);
dialog.dispose();
}
/**
* Hides and destroys all currently visible history browser dialogs
*
*/
public void hideAll() {
ArrayList<HistoryBrowserDialog> dialogs = new ArrayList<HistoryBrowserDialog>();
dialogs.addAll(this.dialogs.values());
for (HistoryBrowserDialog dialog: dialogs) {
dialog.unlinkAsListener();
hide(dialog);
}
}
public void show(History h) {
if (h == null)
return;
if (existsDialog(h.getId())) {
show(h.getId());
} else {
HistoryBrowserDialog dialog = new HistoryBrowserDialog(h);
show(h.getId(), dialog);
}
}
/* ----------------------------------------------------------------------------- */
/* LayerChangeListener */
/* ----------------------------------------------------------------------------- */
public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
public void layerAdded(Layer newLayer) {}
public void layerRemoved(Layer oldLayer) {
// remove all history browsers if the number of layers drops to 0
//
if (Main.map.mapView.getNumLayers() == 0) {
hideAll();
}
}
}