import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.Set;
-import java.util.Stack;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import tim.prune.function.AsyncMediaLoader;
import tim.prune.function.SaveConfig;
import tim.prune.function.SelectTracksFunction;
-import tim.prune.function.browser.BrowserLauncher;
-import tim.prune.function.browser.UrlGenerator;
import tim.prune.function.edit.FieldEditList;
import tim.prune.function.edit.PointEditor;
import tim.prune.gui.MenuManager;
import tim.prune.gui.SidebarController;
import tim.prune.gui.UndoManager;
import tim.prune.gui.Viewport;
+import tim.prune.gui.colour.ColourerCaretaker;
+import tim.prune.gui.colour.PointColourer;
import tim.prune.load.FileLoader;
import tim.prune.load.JpegLoader;
import tim.prune.load.MediaLinkInfo;
import tim.prune.load.TrackNameList;
import tim.prune.save.ExifSaver;
import tim.prune.save.FileSaver;
+import tim.prune.tips.TipManager;
import tim.prune.undo.*;
private FileLoader _fileLoader = null;
private JpegLoader _jpegLoader = null;
private FileSaver _fileSaver = null;
- private Stack<UndoOperation> _undoStack = null;
+ private UndoStack _undoStack = null;
+ private ColourerCaretaker _colCaretaker = null;
private boolean _mangleTimestampsConfirmed = false;
private Viewport _viewport = null;
private ArrayList<File> _dataFiles = null;
public App(JFrame inFrame)
{
_frame = inFrame;
- _undoStack = new Stack<UndoOperation>();
+ _undoStack = new UndoStack();
_track = new Track();
_trackInfo = new TrackInfo(_track);
FunctionLibrary.initialise(this);
+ _colCaretaker = new ColourerCaretaker(this);
+ UpdateMessageBroker.addSubscriber(_colCaretaker);
+ _colCaretaker.setColourer(Config.getPointColourer());
}
/**
* @return the undo stack
*/
- public Stack<UndoOperation> getUndoStack()
+ public UndoStack getUndoStack()
{
return _undoStack;
}
+ /**
+ * Update the system's point colourer using the one in the Config
+ */
+ public void updatePointColourer()
+ {
+ if (_colCaretaker != null) {
+ _colCaretaker.setColourer(Config.getPointColourer());
+ }
+ }
+
+ /**
+ * @return colourer object, or null
+ */
+ public PointColourer getPointColourer()
+ {
+ if (_colCaretaker == null) {return null;}
+ return _colCaretaker.getColourer();
+ }
+
+ /**
+ * Show the specified tip if appropriate
+ * @param inTipNumber tip number from TipManager
+ */
+ public void showTip(int inTipNumber)
+ {
+ String key = TipManager.fireTipTrigger(inTipNumber);
+ if (key != null && !key.equals(""))
+ {
+ JOptionPane.showMessageDialog(_frame, I18nManager.getText(key),
+ I18nManager.getText("tip.title"), JOptionPane.INFORMATION_MESSAGE);
+ }
+ }
+
+
/**
* Load the specified data files one by one
* @param inDataFiles arraylist containing File objects to load
// pass to track for completion
if (_track.editPoint(currentPoint, inEditList, false))
{
- _undoStack.push(undo);
+ _undoStack.add(undo);
// Confirm point edit
UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.point.edit"));
}
int audioIndex = _trackInfo.getAudioList().getAudioIndex(currentPoint.getAudio());
DataPoint nextTrackPoint = _trackInfo.getTrack().getNextTrackPoint(pointIndex + 1);
// Construct Undo object
- UndoOperation undo = new UndoDeletePoint(pointIndex, currentPoint, photoIndex,
+ UndoDeletePoint undo = new UndoDeletePoint(pointIndex, currentPoint, photoIndex,
audioIndex, nextTrackPoint != null && nextTrackPoint.getSegmentStart());
+ undo.setAtBoundaryOfSelectedRange(pointIndex == _trackInfo.getSelection().getStart() ||
+ pointIndex == _trackInfo.getSelection().getEnd());
// call track to delete point
if (_trackInfo.deletePoint())
{
// Delete was successful so add undo info to stack
- _undoStack.push(undo);
+ _undoStack.add(undo);
if (currentPhoto != null)
{
// delete photo if necessary
}
- /**
- * Finish the compression by deleting the marked points
- */
- public void finishCompressTrack()
- {
- UndoDeleteMarked undo = new UndoDeleteMarked(_track);
- // call track to do compress
- int numPointsDeleted = _trackInfo.deleteMarkedPoints();
- // add to undo stack if successful
- if (numPointsDeleted > 0)
- {
- undo.setNumPointsDeleted(numPointsDeleted);
- _undoStack.add(undo);
- UpdateMessageBroker.informSubscribers("" + numPointsDeleted + " "
- + (numPointsDeleted==1?I18nManager.getText("confirm.deletepoint.single"):I18nManager.getText("confirm.deletepoint.multi")));
- }
- else {
- showErrorMessage("function.compress", "dialog.deletemarked.nonefound");
- }
- }
-
/**
* Reverse the currently selected section of the track
*/
* @param inPoint point to add
*/
public void createPoint(DataPoint inPoint)
+ {
+ createPoint(inPoint, true);
+ }
+
+ /**
+ * Create a new point at the end of the track
+ * @param inPoint point to add
+ * @param inNewSegment true for a single point, false for a continuation
+ */
+ public void createPoint(DataPoint inPoint, boolean inNewSegment)
{
// create undo object
UndoCreatePoint undo = new UndoCreatePoint();
_undoStack.add(undo);
// add point to track
- inPoint.setSegmentStart(true);
+ inPoint.setSegmentStart(inNewSegment);
_track.appendPoints(new DataPoint[] {inPoint});
// ensure track's field list contains point's fields
_track.extendFieldList(inPoint.getFieldList());
// 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)
+ 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);
}
else
{
- new UndoManager(this, _frame);
+ new UndoManager(this, _frame).show();
}
}
{
for (int i=0; i<inNumUndos; i++)
{
- _undoStack.pop().performUndo(_trackInfo);
+ _undoStack.popOperation().performUndo(_trackInfo);
}
String message = "" + inNumUndos + " "
+ (inNumUndos==1?I18nManager.getText("confirm.undo.single"):I18nManager.getText("confirm.undo.multi"));
UpdateMessageBroker.informSubscribers();
}
-
/**
- * Show a map url in an external browser
- * @param inSourceIndex index of map source to use
+ * @return the current data status, used for later comparison
*/
- public void showExternalMap(int inSourceIndex)
+ public DataStatus getCurrentDataStatus()
{
- BrowserLauncher.launchBrowser(UrlGenerator.generateUrl(inSourceIndex, _trackInfo));
+ return new DataStatus(_undoStack.size(), _undoStack.getNumUndos());
}
+
/**
* Display a standard error message
* @param inTitleKey key to lookup for window title