X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fcorrelate%2FPhotoCorrelator.java;h=84c179ec3d3a23576d9e6ee83cdf1133758e20af;hb=140e9d165f85c3d4f0435a311e091209313faa2a;hp=ccf5345103826ee2fb05f9e9b9253562835e2ab2;hpb=52bf9e8686c916be37a26a0b75340393d4478b05;p=GpsPrune.git diff --git a/tim/prune/correlate/PhotoCorrelator.java b/tim/prune/correlate/PhotoCorrelator.java index ccf5345..84c179e 100644 --- a/tim/prune/correlate/PhotoCorrelator.java +++ b/tim/prune/correlate/PhotoCorrelator.java @@ -17,7 +17,6 @@ import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; -import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -27,6 +26,7 @@ import javax.swing.JTable; import javax.swing.JTextField; import tim.prune.App; +import tim.prune.GenericFunction; import tim.prune.I18nManager; import tim.prune.data.DataPoint; import tim.prune.data.Distance; @@ -37,15 +37,14 @@ import tim.prune.data.TimeDifference; import tim.prune.data.Timestamp; import tim.prune.data.Track; import tim.prune.data.TrackInfo; +import tim.prune.undo.UndoCorrelatePhotos; /** * Class to manage the automatic correlation of photos to points * including the GUI stuff to control the correlation options */ -public class PhotoCorrelator +public class PhotoCorrelator extends GenericFunction { - private App _app; - private JFrame _parentFrame; private JDialog _dialog; private JButton _nextButton = null, _backButton = null; private JButton _okButton = null; @@ -66,29 +65,36 @@ public class PhotoCorrelator /** * Constructor * @param inApp App object to report actions to - * @param inFrame parent frame for dialogs */ - public PhotoCorrelator(App inApp, JFrame inFrame) + public PhotoCorrelator(App inApp) { - _app = inApp; - _parentFrame = inFrame; - _dialog = new JDialog(inFrame, I18nManager.getText("dialog.correlate.title"), true); - _dialog.setLocationRelativeTo(inFrame); - _dialog.getContentPane().add(makeDialogContents()); - _dialog.pack(); + super(inApp); } + /** Get the name key */ + public String getNameKey() { + return "function.correlatephotos"; + } + /** * Reset dialog and show it */ public void begin() { + // First create dialog if necessary + if (_dialog == null) + { + _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true); + _dialog.setLocationRelativeTo(_parentFrame); + _dialog.getContentPane().add(makeDialogContents()); + _dialog.pack(); + } // Check whether track has timestamps, exit if not if (!_app.getTrackInfo().getTrack().hasData(Field.TIMESTAMP)) { JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("dialog.correlate.notimestamps"), - I18nManager.getText("dialog.correlate.title"), JOptionPane.INFORMATION_MESSAGE); + I18nManager.getText(getNameKey()), JOptionPane.INFORMATION_MESSAGE); return; } // Check for any non-correlated photos, show warning continue/cancel @@ -96,7 +102,7 @@ public class PhotoCorrelator { Object[] buttonTexts = {I18nManager.getText("button.continue"), I18nManager.getText("button.cancel")}; if (JOptionPane.showOptionDialog(_parentFrame, I18nManager.getText("dialog.correlate.nouncorrelatedphotos"), - I18nManager.getText("dialog.correlate.title"), JOptionPane.YES_NO_OPTION, + I18nManager.getText(getNameKey()), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, buttonTexts, buttonTexts[1]) == JOptionPane.NO_OPTION) { @@ -127,7 +133,7 @@ public class PhotoCorrelator _tipLabel.setVisible(true); setupSecondCard(null); } - _dialog.show(); + _dialog.setVisible(true); } @@ -160,8 +166,11 @@ public class PhotoCorrelator JPanel card2Top = new JPanel(); card2Top.setLayout(new BoxLayout(card2Top, BoxLayout.Y_AXIS)); _tipLabel = new JLabel(I18nManager.getText("dialog.correlate.options.tip")); + _tipLabel.setBorder(BorderFactory.createEmptyBorder(8, 6, 5, 6)); card2Top.add(_tipLabel); - card2Top.add(new JLabel(I18nManager.getText("dialog.correlate.options.intro"))); + JLabel introLabel = new JLabel(I18nManager.getText("dialog.correlate.options.intro")); + introLabel.setBorder(BorderFactory.createEmptyBorder(8, 6, 5, 6)); + card2Top.add(introLabel); // time offset section JPanel offsetPanel = new JPanel(); offsetPanel.setBorder(BorderFactory.createTitledBorder(I18nManager.getText("dialog.correlate.options.offsetpanel"))); @@ -256,7 +265,7 @@ public class PhotoCorrelator card2Top.add(previewButton); card2.add(card2Top, BorderLayout.NORTH); // preview - _previewTable = new JTable(); + _previewTable = new JTable(new PhotoPreviewTableModel()); JScrollPane previewScrollPane = new JScrollPane(_previewTable); previewScrollPane.setPreferredSize(new Dimension(300, 100)); card2.add(previewScrollPane, BorderLayout.CENTER); @@ -298,7 +307,7 @@ public class PhotoCorrelator { public void actionPerformed(ActionEvent e) { - _app.finishCorrelatePhotos(getPointPairs()); + finishCorrelation(); _dialog.dispose(); } }); @@ -330,7 +339,9 @@ public class PhotoCorrelator for (int i=0; i set = new TreeSet(); // loop through rows of table adding to list int numRows = inModel.getRowCount(); int i; @@ -615,10 +630,10 @@ public class PhotoCorrelator } // pull out middle entry and return index TimeIndexPair pair = null; - Iterator iterator = set.iterator(); + Iterator iterator = set.iterator(); for (i=0; i<(numRows+1)/2; i++) { - pair = (TimeIndexPair) iterator.next(); + pair = iterator.next(); } return pair.getIndex(); } @@ -654,4 +669,99 @@ public class PhotoCorrelator // no uncorrelated photos found return false; } + + /** + * Finish the correlation by modifying the track + * and passing the Undo information back to the App + */ + private void finishCorrelation() + { + PointPair[] pointPairs = getPointPairs(); + if (pointPairs == null || pointPairs.length <= 0) {return;} + + // begin to construct undo information + UndoCorrelatePhotos undo = new UndoCorrelatePhotos(_app.getTrackInfo()); + // loop over Photos + int arraySize = pointPairs.length; + int i = 0, numPhotos = 0; + int numPointsToCreate = 0; + PointPair pair = null; + for (i=0; i 0) + { + // make new array for added points + DataPoint[] addedPoints = new DataPoint[numPointsToCreate]; + int pointNum = 0; + DataPoint pointToAdd = null; + for (i=0; i 0L) + { + // interpolate point + pointToAdd = DataPoint.interpolate(pair.getPointBefore(), pair.getPointAfter(), pair.getFraction()); + } + if (pointToAdd != null) + { + // link photo to point + pointToAdd.setPhoto(pair.getPhoto()); + pair.getPhoto().setDataPoint(pointToAdd); + // set to start of segment so not joined in track + pointToAdd.setSegmentStart(true); + // add to point array + addedPoints[pointNum] = pointToAdd; + pointNum++; + } + } + } + // expand track + _app.getTrackInfo().getTrack().appendPoints(addedPoints); + } + + // send undo information back to controlling app + undo.setNumPhotosCorrelated(numPhotos); + _app.completeFunction(undo, ("" + numPhotos + " " + + (numPhotos==1?I18nManager.getText("confirm.correlate.single"):I18nManager.getText("confirm.correlate.multi")))); + // observers already informed by track update + } }