001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.data.imagery;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.util.ArrayList;
007 import java.util.Collection;
008 import java.util.Collections;
009 import java.util.LinkedList;
010 import java.util.List;
011 import java.util.ListIterator;
012
013 import org.openstreetmap.josm.Main;
014 import org.openstreetmap.josm.data.coor.LatLon;
015 import org.openstreetmap.josm.gui.layer.ImageryLayer;
016
017 public class OffsetBookmark {
018 public static final List<OffsetBookmark> allBookmarks = new ArrayList<OffsetBookmark>();
019
020 public String projectionCode;
021 public String layerName;
022 public String name;
023 public double dx, dy;
024 public double centerX, centerY;
025
026 public boolean isUsable(ImageryLayer layer) {
027 if (projectionCode == null) return false;
028 if (!Main.getProjection().toCode().equals(projectionCode)) return false;
029 return layer.getInfo().getName().equals(layerName);
030 }
031
032 public OffsetBookmark(String projectionCode, String layerName, String name, double dx, double dy) {
033 this(projectionCode, layerName, name, dx, dy, 0, 0);
034 }
035
036 public OffsetBookmark(String projectionCode, String layerName, String name, double dx, double dy, double centerX, double centerY) {
037 this.projectionCode = projectionCode;
038 this.layerName = layerName;
039 this.name = name;
040 this.dx = dx;
041 this.dy = dy;
042 this.centerX = centerX;
043 this.centerY = centerY;
044 }
045
046 public OffsetBookmark(Collection<String> list) {
047 ArrayList<String> array = new ArrayList<String>(list);
048 this.projectionCode = array.get(0);
049 this.layerName = array.get(1);
050 this.name = array.get(2);
051 this.dx = Double.valueOf(array.get(3));
052 this.dy = Double.valueOf(array.get(4));
053 if (array.size() >= 7) {
054 this.centerX = Double.valueOf(array.get(5));
055 this.centerY = Double.valueOf(array.get(6));
056 }
057 if (projectionCode == null) {
058 System.err.println(tr("Projection ''{0}'' is not found, bookmark ''{1}'' is not usable", projectionCode, name));
059 }
060 }
061
062 public ArrayList<String> getInfoArray() {
063 ArrayList<String> res = new ArrayList<String>(7);
064 if (projectionCode != null) {
065 res.add(projectionCode);
066 } else {
067 res.add("");
068 }
069 res.add(layerName);
070 res.add(name);
071 res.add(String.valueOf(dx));
072 res.add(String.valueOf(dy));
073 if (this.centerX != 0 || this.centerY != 0) {
074 res.add(String.valueOf(centerX));
075 res.add(String.valueOf(centerY));
076 }
077 return res;
078 }
079
080 public static void loadBookmarks() {
081 for(Collection<String> c : Main.pref.getArray("imagery.offsets",
082 Collections.<Collection<String>>emptySet())) {
083 allBookmarks.add(new OffsetBookmark(c));
084 }
085 }
086
087 public static void saveBookmarks() {
088 LinkedList<Collection<String>> coll = new LinkedList<Collection<String>>();
089 for (OffsetBookmark b : allBookmarks) {
090 coll.add(b.getInfoArray());
091 }
092 Main.pref.putArray("imagery.offsets", coll);
093 }
094
095 public static OffsetBookmark getBookmarkByName(ImageryLayer layer, String name) {
096 for (OffsetBookmark b : allBookmarks) {
097 if (b.isUsable(layer) && name.equals(b.name))
098 return b;
099 }
100 return null;
101 }
102
103 public static void bookmarkOffset(String name, ImageryLayer layer) {
104 LatLon center;
105 if (Main.isDisplayingMapView()) {
106 center = Main.getProjection().eastNorth2latlon(Main.map.mapView.getCenter());
107 } else {
108 center = new LatLon(0,0);
109 }
110 OffsetBookmark nb = new OffsetBookmark(
111 Main.getProjection().toCode(), layer.getInfo().getName(),
112 name, layer.getDx(), layer.getDy(), center.lon(), center.lat());
113 for (ListIterator<OffsetBookmark> it = allBookmarks.listIterator();it.hasNext();) {
114 OffsetBookmark b = it.next();
115 if (b.isUsable(layer) && name.equals(b.name)) {
116 it.set(nb);
117 saveBookmarks();
118 return;
119 }
120 }
121 allBookmarks.add(nb);
122 saveBookmarks();
123 }
124 }