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 }