package tim.prune.data;
+import java.awt.Dimension;
import java.io.File;
+import javax.swing.ImageIcon;
+
/**
* Class to represent a photo and link to DataPoint
*/
{
/** File where photo is stored */
private File _file = null;
+ /** Timestamp, if any */
+ private Timestamp _timestamp = null;
/** Associated DataPoint if correlated */
private DataPoint _dataPoint = null;
+ /** Size of original image */
+ private Dimension _size = null;
+ /** Status of photo when loaded */
+ private Status _originalStatus = Status.NOT_CONNECTED;
+ /** Current photo status */
+ private Status _currentStatus = Status.NOT_CONNECTED;
+ /** rotation flag (clockwise from 0 to 3) */
+ private int _rotation = 0;
+ // TODO: Need to store caption for image?
+ // thumbnail for image (from exif)
+ private byte[] _exifThumbnail = null;
+ /** Photo status */
+ public enum Status {
+ /** Photo is not connected to any point */
+ NOT_CONNECTED,
+ /** Photo has been connected to a point since it was loaded */
+ TAGGED,
+ /** Photo is connected to a point */
+ CONNECTED
+ };
/**
* Constructor
public Photo(File inFile)
{
_file = inFile;
- // TODO: Cache photo file contents to allow thumbnail preview
}
public void setDataPoint(DataPoint inPoint)
{
_dataPoint = inPoint;
+ // set status according to point
+ if (inPoint == null) {
+ setCurrentStatus(Status.NOT_CONNECTED);
+ }
+ else {
+ setCurrentStatus(Status.CONNECTED);
+ }
}
/**
return _dataPoint;
}
+ /**
+ * @param inTimestamp Timestamp of photo
+ */
+ public void setTimestamp(Timestamp inTimestamp)
+ {
+ _timestamp = inTimestamp;
+ }
+
+ /**
+ * @return timestamp of photo
+ */
+ public Timestamp getTimestamp()
+ {
+ return _timestamp;
+ }
+
+ /**
+ * Calculate the size of the image (slow)
+ */
+ private void calculateSize()
+ {
+ ImageIcon icon = new ImageIcon(_file.getAbsolutePath());
+ int width = icon.getIconWidth();
+ int height = icon.getIconHeight();
+ if (width > 0 && height > 0)
+ {
+ _size = new Dimension(width, height);
+ }
+ }
+
+ /**
+ * @return size of image as Dimension object
+ */
+ public Dimension getSize()
+ {
+ if (_size == null)
+ {
+ calculateSize();
+ }
+ return _size;
+ }
+
+ /**
+ * @return width of the image, if known
+ */
+ public int getWidth()
+ {
+ if (_size == null)
+ {
+ calculateSize();
+ if (_size == null) {return -1;}
+ }
+ return _size.width;
+ }
+
+ /**
+ * @return height of the image, if known
+ */
+ public int getHeight()
+ {
+ if (_size == null)
+ {
+ calculateSize();
+ if (_size == null) {return -1;}
+ }
+ return _size.height;
+ }
+
+ /**
+ * @param inStatus status of photo when loaded
+ */
+ public void setOriginalStatus(Status inStatus)
+ {
+ _originalStatus = inStatus;
+ _currentStatus = inStatus;
+ }
+
+ /**
+ * @return status of photo when it was loaded
+ */
+ public Status getOriginalStatus()
+ {
+ return _originalStatus;
+ }
+
+ /**
+ * @return current status of photo
+ */
+ public Status getCurrentStatus()
+ {
+ return _currentStatus;
+ }
+ /**
+ * @param inStatus current status of photo
+ */
+ public void setCurrentStatus(Status inStatus)
+ {
+ _currentStatus = inStatus;
+ }
+
+ /**
+ * @return true if photo is connected to a point
+ */
+ public boolean isConnected()
+ {
+ return _currentStatus != Status.NOT_CONNECTED;
+ }
+
+ /**
+ * @return byte array of thumbnail data
+ */
+ public byte[] getExifThumbnail()
+ {
+ return _exifThumbnail;
+ }
+
+ /**
+ * @param inBytes byte array from exif
+ */
+ public void setExifThumbnail(byte[] inBytes)
+ {
+ _exifThumbnail = inBytes;
+ }
+
+ /**
+ * Delete the cached data when the Photo is no longer needed
+ */
+ public void resetCachedData()
+ {
+ _size = null;
+ // remove thumbnail too
+ }
+
/**
* Check if a Photo object refers to the same File as another
* @param inOther other Photo object
return (inOther != null && inOther.getFile() != null && getFile() != null
&& inOther.getFile().equals(getFile()));
}
+
+ /**
+ * @param inRotation initial rotation value (from exif)
+ */
+ public void setRotation(int inRotation)
+ {
+ if (inRotation >= 0 && inRotation <= 3) {
+ _rotation = inRotation;
+ }
+ }
+
+ /**
+ * Rotate the image by 90 degrees
+ * @param inRight true to rotate right, false for left
+ */
+ public void rotate(boolean inRight)
+ {
+ int dir = inRight?1:3;
+ _rotation = (_rotation + dir) % 4;
+ }
+
+ /**
+ * @return rotation status
+ */
+ public int getRotationDegrees()
+ {
+ return _rotation * 90;
+ }
}