package tim.prune.undo; import tim.prune.I18nManager; import tim.prune.data.DataPoint; import tim.prune.data.Photo; import tim.prune.data.TrackInfo; /** * Operation to undo an auto-correlation of photos with points */ public class UndoCorrelatePhotos implements UndoOperation { private DataPoint[] _contents = null; private DataPoint[] _photoPoints = null; private int _numPhotosCorrelated = -1; /** * Constructor * @param inTrackInfo track information */ public UndoCorrelatePhotos(TrackInfo inTrackInfo) { // Copy track contents _contents = inTrackInfo.getTrack().cloneContents(); // Copy points associated with photos before correlation int numPhotos = inTrackInfo.getPhotoList().getNumPhotos(); _photoPoints = new DataPoint[numPhotos]; for (int i=0; i<numPhotos; i++) { _photoPoints[i] = inTrackInfo.getPhotoList().getPhoto(i).getDataPoint(); } } /** * @param inNumCorrelated number of photos correlated */ public void setNumPhotosCorrelated(int inNumCorrelated) { _numPhotosCorrelated = inNumCorrelated; } /** * @return description of operation including parameters */ public String getDescription() { return I18nManager.getText("undo.correlatephotos") + " (" + _numPhotosCorrelated + ")"; } /** * Perform the undo operation on the given Track * @param inTrackInfo TrackInfo object on which to perform the operation */ public void performUndo(TrackInfo inTrackInfo) throws UndoException { // restore track to previous values inTrackInfo.getTrack().replaceContents(_contents); // restore photo association for (int i=0; i<_photoPoints.length; i++) { Photo photo = inTrackInfo.getPhotoList().getPhoto(i); // Only need to look at connected photos, since correlation wouldn't disconnect if (photo.getCurrentStatus() == Photo.Status.CONNECTED) { DataPoint prevPoint = _photoPoints[i]; DataPoint currPoint = photo.getDataPoint(); photo.setDataPoint(prevPoint); if (currPoint != null) { currPoint.setPhoto(null); // disconnect } if (prevPoint != null) { prevPoint.setPhoto(photo); // reconnect to prev point } } } // clear selection inTrackInfo.getSelection().clearAll(); } }