001 // License: GPL. See LICENSE file for details.
002 // Copyright 2007 by Christian Gallioz (aka khris78)
003 // Parts of code from Geotagged plugin (by Rob Neild)
004 // and the core JOSM source code (by Immanuel Scholz and others)
005
006 package org.openstreetmap.josm.gui.layer.geoimage;
007
008 import java.awt.Image;
009 import java.io.File;
010 import java.util.Date;
011
012 import org.openstreetmap.josm.data.coor.CachedLatLon;
013 import org.openstreetmap.josm.data.coor.LatLon;
014
015 /*
016 * Stores info about each image
017 */
018
019 final public class ImageEntry implements Comparable<ImageEntry>, Cloneable {
020 private File file;
021 private Integer exifOrientation;
022 private LatLon exifCoor;
023 private Double exifImgDir;
024 private Date exifTime;
025 Image thumbnail;
026
027 /** The following values are computed from the correlation with the gpx track */
028 private CachedLatLon pos;
029 /** Speed in kilometer per second */
030 private Double speed;
031 /** Elevation (altitude) in meters */
032 private Double elevation;
033 /** The time after correlation with a gpx track */
034 private Date gpsTime;
035
036 /**
037 * When the corralation dialog is open, we like to show the image position
038 * for the current time offset on the map in real time.
039 * On the other hand, when the user aborts this operation, the old values
040 * should be restored. We have a temprary copy, that overrides
041 * the normal values if it is not null. (This may be not the most elegant
042 * solution for this, but it works.)
043 */
044 ImageEntry tmp;
045
046 /**
047 * getter methods that refer to the temporary value
048 */
049 public CachedLatLon getPos() {
050 if (tmp != null)
051 return tmp.pos;
052 return pos;
053 }
054 public Double getSpeed() {
055 if (tmp != null)
056 return tmp.speed;
057 return speed;
058 }
059 public Double getElevation() {
060 if (tmp != null)
061 return tmp.elevation;
062 return elevation;
063 }
064 public Date getGpsTime() {
065 if (tmp != null)
066 return tmp.gpsTime;
067 return gpsTime;
068 }
069
070 /**
071 * other getter methods
072 */
073 public File getFile() {
074 return file;
075 }
076 public Integer getExifOrientation() {
077 return exifOrientation;
078 }
079 public Date getExifTime() {
080 return exifTime;
081 }
082 public LatLon getExifCoor() {
083 return exifCoor;
084 }
085 public Double getExifImgDir() {
086 return exifImgDir;
087 }
088
089 public boolean hasThumbnail() {
090 return thumbnail != null;
091 }
092
093 /**
094 * setter methods
095 */
096 public void setPos(CachedLatLon pos) {
097 this.pos = pos;
098 }
099 public void setPos(LatLon pos) {
100 this.pos = new CachedLatLon(pos);
101 }
102 public void setSpeed(Double speed) {
103 this.speed = speed;
104 }
105 public void setElevation(Double elevation) {
106 this.elevation = elevation;
107 }
108 public void setFile(File file) {
109 this.file = file;
110 }
111 public void setExifOrientation(Integer exifOrientation) {
112 this.exifOrientation = exifOrientation;
113 }
114 public void setExifTime(Date exifTime) {
115 this.exifTime = exifTime;
116 }
117 public void setGpsTime(Date gpsTime) {
118 this.gpsTime = gpsTime;
119 }
120 public void setExifCoor(LatLon exifCoor) {
121 this.exifCoor = exifCoor;
122 }
123 public void setExifImgDir(double exifDir) {
124 this.exifImgDir = exifDir;
125 }
126
127 @Override
128 public ImageEntry clone() {
129 Object c;
130 try {
131 c = super.clone();
132 } catch (CloneNotSupportedException e) {
133 throw new RuntimeException();
134 }
135 return (ImageEntry) c;
136 }
137
138 public int compareTo(ImageEntry image) {
139 if (exifTime != null && image.exifTime != null)
140 return exifTime.compareTo(image.exifTime);
141 else if (exifTime == null && image.exifTime == null)
142 return 0;
143 else if (exifTime == null)
144 return -1;
145 else
146 return 1;
147 }
148
149 /**
150 * Make a fresh copy and save it in the temporary variable.
151 */
152 public void cleanTmp() {
153 tmp = clone();
154 tmp.setPos(null);
155 tmp.tmp = null;
156 }
157
158 /**
159 * Copy the values from the temporary variable to the main instance.
160 */
161 public void applyTmp() {
162 if (tmp != null) {
163 pos = tmp.pos;
164 speed = tmp.speed;
165 elevation = tmp.elevation;
166 gpsTime = tmp.gpsTime;
167 tmp = null;
168 }
169 }
170
171 /**
172 * If it has been tagged i.e. matched to a gpx track or retrieved lat/lon from exif
173 */
174 public boolean isTagged() {
175 return pos != null;
176 }
177
178 /**
179 * String representation. (only partial info)
180 */
181 @Override
182 public String toString() {
183 String result = file.getName()+": "+
184 "pos = "+pos+" | "+
185 "exifCoor = "+exifCoor+" | "+
186 (tmp == null ? " tmp==null" :
187 " [tmp] pos = "+tmp.pos+"");
188 return result;
189 }
190 }