X-Git-Url: https://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2FApp.java;h=686b3dee485d4b3ffcd58203f2a3e5445be9bb17;hp=770fd2089aaac23518ecd687bec0f0d8878ee738;hb=8c8868ae29b3252f02e094c02307384cf61ba667;hpb=f1b92378a792131ac8fb33a869405851d5b2d1f7 diff --git a/tim/prune/App.java b/tim/prune/App.java index 770fd20..686b3de 100644 --- a/tim/prune/App.java +++ b/tim/prune/App.java @@ -10,7 +10,6 @@ import javax.swing.JFrame; import javax.swing.JOptionPane; import tim.prune.config.Config; -import tim.prune.data.Altitude; import tim.prune.data.Checker; import tim.prune.data.DataPoint; import tim.prune.data.Field; @@ -18,11 +17,13 @@ import tim.prune.data.LatLonRectangle; import tim.prune.data.NumberUtils; import tim.prune.data.Photo; import tim.prune.data.PhotoList; +import tim.prune.data.PointCreateOptions; import tim.prune.data.RecentFile; import tim.prune.data.SourceInfo; import tim.prune.data.Track; import tim.prune.data.TrackInfo; import tim.prune.data.SourceInfo.FILE_TYPE; +import tim.prune.data.Unit; import tim.prune.function.AsyncMediaLoader; import tim.prune.function.SaveConfig; import tim.prune.function.SelectTracksFunction; @@ -62,8 +63,12 @@ public class App private boolean _mangleTimestampsConfirmed = false; private Viewport _viewport = null; private ArrayList _dataFiles = null; - private boolean _firstDataFile = true; + private boolean _autoAppendNextFile = false; private boolean _busyLoading = false; + private AppMode _appMode = AppMode.NORMAL; + + /** Enum for the app mode - currently only two options but may expand later */ + public enum AppMode {NORMAL, DRAWRECT}; /** @@ -103,7 +108,7 @@ public class App public boolean hasDataUnsaved() { return (_undoStack.size() > _lastSavePosition - && (_track.getNumPoints() > 0 || _trackInfo.getPhotoList().getNumPhotos() > 0)); + && (_track.getNumPoints() > 0 || _trackInfo.getPhotoList().hasModifiedMedia())); } /** @@ -123,14 +128,15 @@ public class App if (inDataFiles == null || inDataFiles.size() == 0) { _dataFiles = null; } - else { + else + { _dataFiles = inDataFiles; File f = _dataFiles.get(0); _dataFiles.remove(0); // Start load of specified file if (_fileLoader == null) _fileLoader = new FileLoader(this, _frame); - _firstDataFile = true; + _autoAppendNextFile = false; // prompt for append _fileLoader.openFile(f); } } @@ -144,6 +150,7 @@ public class App { _undoStack.add(inUndo); UpdateMessageBroker.informSubscribers(inConfirmText); + setCurrentMode(AppMode.NORMAL); } /** @@ -272,6 +279,7 @@ public class App DataPoint currentPoint = _trackInfo.getCurrentPoint(); if (currentPoint != null) { + // Check for photo boolean deletePhoto = false; Photo currentPhoto = currentPoint.getPhoto(); if (currentPhoto != null) @@ -291,10 +299,11 @@ public class App // store necessary information to undo it later int pointIndex = _trackInfo.getSelection().getCurrentPointIndex(); int photoIndex = _trackInfo.getPhotoList().getPhotoIndex(currentPhoto); + int audioIndex = _trackInfo.getAudioList().getAudioIndex(currentPoint.getAudio()); DataPoint nextTrackPoint = _trackInfo.getTrack().getNextTrackPoint(pointIndex + 1); // Construct Undo object UndoOperation undo = new UndoDeletePoint(pointIndex, currentPoint, photoIndex, - nextTrackPoint != null && nextTrackPoint.getSegmentStart()); + audioIndex, nextTrackPoint != null && nextTrackPoint.getSegmentStart()); // call track to delete point if (_trackInfo.deletePoint()) { @@ -312,94 +321,15 @@ public class App // decouple photo from point currentPhoto.setDataPoint(null); } - UpdateMessageBroker.informSubscribers(); - } - // Confirm - UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.deletepoint.single")); - } - } - } - - - /** - * Delete the currently selected range - */ - public void deleteSelectedRange() - { - if (_track == null) return; - // Find out if photos should be deleted or not - int selStart = _trackInfo.getSelection().getStart(); - int selEnd = _trackInfo.getSelection().getEnd(); - if (selStart >= 0 && selEnd >= selStart) - { - int numToDelete = selEnd - selStart + 1; - boolean[] deletePhotos = new boolean[numToDelete]; - Photo[] photosToDelete = new Photo[numToDelete]; - boolean deleteAll = false; - boolean deleteNone = false; - String[] questionOptions = {I18nManager.getText("button.yes"), I18nManager.getText("button.no"), - I18nManager.getText("button.yestoall"), I18nManager.getText("button.notoall"), - I18nManager.getText("button.cancel")}; - DataPoint point = null; - for (int i=0; i -1) { + _trackInfo.getAudioList().deleteAudio(audioIndex); } - } - // call track to delete range - if (_trackInfo.deleteRange()) - { - _undoStack.push(undo); // Confirm - UpdateMessageBroker.informSubscribers("" + numToDelete + " " - + I18nManager.getText("confirm.deletepoint.multi")); + UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.deletepoint.single")); + UpdateMessageBroker.informSubscribers(DataSubscriber.DATA_ADDED_OR_REMOVED); } } } @@ -410,7 +340,7 @@ public class App */ public void finishCompressTrack() { - UndoCompress undo = new UndoCompress(_track); + UndoDeleteMarked undo = new UndoDeleteMarked(_track); // call track to do compress int numPointsDeleted = _trackInfo.deleteMarkedPoints(); // add to undo stack if successful @@ -422,7 +352,7 @@ public class App + (numPointsDeleted==1?I18nManager.getText("confirm.deletepoint.single"):I18nManager.getText("confirm.deletepoint.multi"))); } else { - showErrorMessage("function.compress", "dialog.compress.nonefound"); + showErrorMessage("function.compress", "dialog.deletemarked.nonefound"); } } @@ -474,12 +404,12 @@ public class App /** * Complete the add altitude offset function with the specified offset * @param inOffset altitude offset to add as String - * @param inFormat altitude format of offset (eg Feet, Metres) + * @param inUnit altitude units of offset (eg Feet, Metres) */ - public void finishAddAltitudeOffset(String inOffset, Altitude.Format inFormat) + public void finishAddAltitudeOffset(String inOffset, Unit inUnit) { // Sanity check - if (inOffset == null || inOffset.equals("") || inFormat==Altitude.Format.NO_FORMAT) { + if (inOffset == null || inOffset.equals("") || inUnit == null) { return; } // Construct undo information @@ -492,7 +422,7 @@ public class App // Decimal offset given try { double offsetd = Double.parseDouble(inOffset); - success = _trackInfo.getTrack().addAltitudeOffset(selStart, selEnd, offsetd, inFormat, numDecimals); + success = _trackInfo.getTrack().addAltitudeOffset(selStart, selEnd, offsetd, inUnit, numDecimals); } catch (NumberFormatException nfe) {} if (success) @@ -528,29 +458,6 @@ public class App } - /** - * Interpolate the two selected points - */ - public void interpolateSelection() - { - // Get number of points to add - Object numPointsStr = JOptionPane.showInputDialog(_frame, - I18nManager.getText("dialog.interpolate.parameter.text"), - I18nManager.getText("dialog.interpolate.title"), - JOptionPane.QUESTION_MESSAGE, null, null, ""); - int numPoints = parseNumber(numPointsStr); - if (numPoints <= 0) return; - - UndoInsert undo = new UndoInsert(_trackInfo.getSelection().getStart() + 1, - numPoints); - // call track to interpolate - if (_trackInfo.interpolate(numPoints)) - { - _undoStack.add(undo); - } - } - - /** * Average the selected points */ @@ -570,7 +477,7 @@ public class App /** - * Create a new point at the given position + * Create a new point at the end of the track * @param inPoint point to add */ public void createPoint(DataPoint inPoint) @@ -589,6 +496,33 @@ public class App } + /** + * Create a new point before the given position + * @param inPoint point to add + * @param inIndex index of following point + */ + public void createPoint(DataPoint inPoint, int inIndex) + { + // create undo object + UndoInsert undo = new UndoInsert(inIndex, 1); + _undoStack.add(undo); + // add point to track + _track.insertPoint(inPoint, inIndex); + // ensure track's field list contains point's fields + _track.extendFieldList(inPoint.getFieldList()); + _trackInfo.selectPoint(inIndex); + final int selStart = _trackInfo.getSelection().getStart(); + final int selEnd = _trackInfo.getSelection().getEnd(); + if (selStart < inIndex && selEnd > inIndex) + { + // Extend end of selection by 1 + _trackInfo.getSelection().selectRange(selStart, selEnd+1); + } + // update listeners + UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.createpoint")); + } + + /** * Cut the current selection and move it to before the currently selected point */ @@ -639,31 +573,33 @@ public class App } /** - * Receive loaded data and start load + * Receive loaded data and determine whether to filter on tracks or not * @param inFieldArray array of fields * @param inDataArray array of data - * @param inAltFormat altitude format * @param inSourceInfo information about the source of the data + * @param inTrackNameList information about the track names */ public void informDataLoaded(Field[] inFieldArray, Object[][] inDataArray, - Altitude.Format inAltFormat, SourceInfo inSourceInfo) + SourceInfo inSourceInfo, TrackNameList inTrackNameList) { - informDataLoaded(inFieldArray, inDataArray, inAltFormat, inSourceInfo, null, null); + // no link array given + informDataLoaded(inFieldArray, inDataArray, null, inSourceInfo, + inTrackNameList, null); } /** * Receive loaded data and determine whether to filter on tracks or not * @param inFieldArray array of fields * @param inDataArray array of data - * @param inAltFormat altitude format + * @param inOptions creation options such as units * @param inSourceInfo information about the source of the data * @param inTrackNameList information about the track names */ public void informDataLoaded(Field[] inFieldArray, Object[][] inDataArray, - Altitude.Format inAltFormat, SourceInfo inSourceInfo, TrackNameList inTrackNameList) + PointCreateOptions inOptions, SourceInfo inSourceInfo, TrackNameList inTrackNameList) { // no link array given - informDataLoaded(inFieldArray, inDataArray, inAltFormat, inSourceInfo, + informDataLoaded(inFieldArray, inDataArray, inOptions, inSourceInfo, inTrackNameList, null); } @@ -671,18 +607,17 @@ public class App * Receive loaded data and determine whether to filter on tracks or not * @param inFieldArray array of fields * @param inDataArray array of data - * @param inAltFormat altitude format + * @param inOptions creation options such as units * @param inSourceInfo information about the source of the data * @param inTrackNameList information about the track names * @param inLinkInfo links to photo/audio clips */ - public void informDataLoaded(Field[] inFieldArray, Object[][] inDataArray, - Altitude.Format inAltFormat, SourceInfo inSourceInfo, - TrackNameList inTrackNameList, MediaLinkInfo inLinkInfo) + public void informDataLoaded(Field[] inFieldArray, Object[][] inDataArray, PointCreateOptions inOptions, + SourceInfo inSourceInfo, TrackNameList inTrackNameList, MediaLinkInfo inLinkInfo) { // Check whether loaded array can be properly parsed into a Track Track loadedTrack = new Track(); - loadedTrack.load(inFieldArray, inDataArray, inAltFormat); + loadedTrack.load(inFieldArray, inDataArray, inOptions); if (loadedTrack.getNumPoints() <= 0) { showErrorMessage("error.load.dialogtitle", "error.load.nopoints"); @@ -715,6 +650,7 @@ public class App // go directly to load informDataLoaded(loadedTrack, inSourceInfo); } + setCurrentMode(AppMode.NORMAL); } @@ -730,16 +666,19 @@ public class App { // ask whether to replace or append int answer = 0; - if (_dataFiles == null || _firstDataFile) { + if (_autoAppendNextFile) { + // Automatically append the next file + answer = JOptionPane.YES_OPTION; + } + else { + // Ask whether to append or not answer = JOptionPane.showConfirmDialog(_frame, I18nManager.getText("dialog.openappend.text"), I18nManager.getText("dialog.openappend.title"), JOptionPane.YES_NO_CANCEL_OPTION); } - else { - // Automatically append if there's a file load queue - answer = JOptionPane.YES_OPTION; - } + _autoAppendNextFile = false; // reset flag to cancel autoappend + if (answer == JOptionPane.YES_OPTION) { // append data to current Track @@ -807,12 +746,20 @@ public class App loadNextFile(); } + /** + * External trigger to automatically append the next loaded file + * instead of prompting to replace or append + */ + public void autoAppendNextFile() + { + _autoAppendNextFile = true; + } + /** * Load the next file in the waiting list, if any */ private void loadNextFile() { - _firstDataFile = false; if (_dataFiles == null || _dataFiles.size() == 0) { _dataFiles = null; } @@ -821,6 +768,7 @@ public class App public void run() { File f = _dataFiles.get(0); _dataFiles.remove(0); + _autoAppendNextFile = true; _fileLoader.openFile(f); } }).start(); @@ -941,32 +889,12 @@ public class App showErrorMessageNoLookup("error.undofailed.title", I18nManager.getText("error.undofailed.text") + " : " + ue.getMessage()); _undoStack.clear(); - UpdateMessageBroker.informSubscribers(); } catch (EmptyStackException empty) {} + UpdateMessageBroker.informSubscribers(); } - /** - * Helper method to parse an Object into an integer - * @param inObject object, eg from dialog - * @return int value given - */ - private static int parseNumber(Object inObject) - { - int num = 0; - if (inObject != null) - { - try - { - num = Integer.parseInt(inObject.toString()); - } - catch (NumberFormatException nfe) - {} - } - return num; - } - /** * Show a map url in an external browser * @param inSourceIndex index of map source to use @@ -1035,4 +963,14 @@ public class App public boolean isBusyLoading() { return _busyLoading; } + + /** @return current app mode */ + public AppMode getCurrentMode() { + return _appMode; + } + + /** @param inMode the current app mode */ + public void setCurrentMode(AppMode inMode) { + _appMode = inMode; + } }