content: 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
   */
  public class Photo extends MediaObject
  {
  	/** Size of original image */
  	private Dimension _size = null;
  	/** rotation flag (clockwise from 0 to 3) */
  	private int _rotation = 0;
  	/** Bearing, if any */
  	private double _bearing = -1.0;
  	/** thumbnail for image (from exif) */
  	private byte[] _exifThumbnail = null;
  
  	/**
  	 * Constructor
  	 * @param inFile File object for photo
  	 */
  	public Photo(File inFile)
  	{
  		super(inFile, null);
  	}
  
  	/**
  	 * Constructor using data, eg from zip file or URL
  	 * @param inData data as byte array
  	 * @param inName name of file from which it came
  	 * @param inUrl url from which it came (or null)
  	 */
  	public Photo(byte[] inData, String inName, String inUrl)
  	{
  		super(inData, inName, inUrl);
  	}
  
  	/**
  	 * Calculate the size of the image (slow)
  	 */
  	private void calculateSize()
  	{
  		final ImageIcon icon;
  		if (_file != null) {
  			icon = new ImageIcon(_file.getAbsolutePath());
  		}
  		else {
  			icon = new ImageIcon(_data);
  		}
  		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 (getSize() == null) {return -1;}
  		return _size.width;
  	}
  
  	/**
  	 * @return height of the image, if known
  	 */
  	public int getHeight()
  	{
  		if (getSize() == null) {return -1;}
  		return _size.height;
  	}
  
  	/**
  	 * @return byte array of thumbnail data
  	 */
  	public byte[] getExifThumbnail() {
  		return _exifThumbnail;
  	}
  
  	/**
  	 * @param inBytes byte array from exif
  	 */
  	public void setExifThumbnail(byte[] inBytes) {
  		_exifThumbnail = inBytes;
  	}
  
  	/**
  	 * @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;
  	}
  
  	/**
  	 * @return a new image icon for the whole image
  	 */
  	public ImageIcon createImageIcon()
  	{
  		if (_file != null) {
  			return new ImageIcon(_file.getAbsolutePath());
  		}
  		if (_data != null) {
  			return new ImageIcon(_data);
  		}
  		return null;
  	}
  
  	/**
  	 * @param inValue bearing in degrees, 0 to 360
  	 */
  	public void setBearing(double inValue) {
  		_bearing = inValue;
  	}
  
  	/** @return bearing in degrees */
  	public double getBearing() {
  		return _bearing;
  	}
  }
  