package tim.prune.data; import java.util.ArrayList; /** * Class to hold a list of Media, either Photos or Audio files */ public abstract class MediaList { /** list of media objects */ protected ArrayList<MediaObject> _media = null; /** * Empty constructor */ public MediaList() { this(null); } /** * Constructor * @param inList ArrayList containing media objects */ protected MediaList(ArrayList<MediaObject> inList) { _media = inList; if (_media == null) { _media = new ArrayList<MediaObject>(); } } /** * @return the number of media in the list */ public int getNumMedia() { return _media.size(); } /** * Add an object to the list * @param inObject object to add */ public void addMedia(MediaObject inObject) { if (inObject != null) { _media.add(inObject); } } /** * Add an object to the list at a specified index (used for undo) * @param inObject object to add * @param inIndex index at which to add */ public void addMedia(MediaObject inObject, int inIndex) { if (inObject != null) { _media.add(inIndex, inObject); } } /** * Remove the selected media from the list * @param inIndex index number to remove */ public void deleteMedia(int inIndex) { // Maybe throw exception if this fails? _media.remove(inIndex); } /** * Checks if the specified object is already in the list * @param inMedia media object to check * @return true if it's already in the list */ public boolean contains(MediaObject inMedia) { return (getMediaIndex(inMedia) > -1); } /** * Get the index of the given media * @param inMedia object to check * @return index of this object in the list, or -1 if not found */ public int getMediaIndex(MediaObject inMedia) { // Check if we need to check final int num = getNumMedia(); if (num <= 0 || inMedia == null) return -1; // Loop over list for (int i=0; i<num; i++) { MediaObject m = _media.get(i); if (m != null && m.equals(inMedia)) { return i; } } // not found return -1; } /** * Get the media at the given index * @param inIndex index number, starting at 0 * @return specified object */ public MediaObject getMedia(int inIndex) { if (inIndex < 0 || inIndex >= getNumMedia()) return null; return _media.get(inIndex); } /** * Crop the list to the specified size * @param inIndex previous size */ public void cropTo(int inIndex) { if (inIndex <= 0) { // delete whole list _media.clear(); } else { // delete to previous size while (_media.size() > inIndex) { _media.remove(_media.size()-1); } } } /** * @return array of file names */ public String[] getNameList() { final int num = getNumMedia(); String[] names = new String[num]; for (int i=0; i<num; i++) { names[i] = getMedia(i).getName(); } return names; } /** * @return true if list contains correlated media */ public boolean hasCorrelatedMedia() { for (MediaObject m : _media) { if (m.getDataPoint() != null) { return true; } } return false; } /** * @return true if list contains uncorrelated media */ public boolean hasUncorrelatedMedia() { for (MediaObject m : _media) { if (m.getDataPoint() == null && m.hasTimestamp()) { return true; } } return false; } /** * Remove all correlated media from the list */ public void removeCorrelatedMedia() { if (getNumMedia() > 0) { // Construct new list to copy into ArrayList<MediaObject> listCopy = new ArrayList<MediaObject>(); // Loop over list for (MediaObject m : _media) { // Copy media if it has no point if (m != null) { if (m.getDataPoint() == null) listCopy.add(m); else m.resetCachedData(); } } // Switch reference to new list _media = listCopy; } } /** * @return true if any of the media objects have Files */ public boolean hasMediaWithFile() { for (MediaObject m: _media) { if (m.getFile() != null) { return true; } } return false; } /** * @return true if there are any modified media in the list */ public boolean hasModifiedMedia() { for (MediaObject m: _media) { if (m.isModified()) { return true; } } return false; } /** * @return clone of list contents */ public abstract MediaList cloneList(); /** * Restore contents from other MediaList * @param inOther MediaList with cloned contents */ public void restore(MediaList inOther) { _media.clear(); if (inOther != null && inOther.getNumMedia() > 0) { // Copy contents from other list _media.addAll(inOther._media); } } }