X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Fload%2FJpegLoader.java;h=c506236f44eb3e3e3aa2a37ce6683cd382da85de;hp=cab6c565524bc5a48bcab9b9e4b80b56b36660ed;hb=52bf9e8686c916be37a26a0b75340393d4478b05;hpb=ca9bdb3916f9c39adbbf95d06ac95c21dafbb4e6 diff --git a/tim/prune/load/JpegLoader.java b/tim/prune/load/JpegLoader.java index cab6c56..c506236 100644 --- a/tim/prune/load/JpegLoader.java +++ b/tim/prune/load/JpegLoader.java @@ -18,9 +18,11 @@ import javax.swing.JPanel; import javax.swing.JProgressBar; import tim.prune.App; +import tim.prune.Config; import tim.prune.I18nManager; import tim.prune.data.Altitude; import tim.prune.data.DataPoint; +import tim.prune.data.LatLonRectangle; import tim.prune.data.Latitude; import tim.prune.data.Longitude; import tim.prune.data.Photo; @@ -39,12 +41,15 @@ public class JpegLoader implements Runnable private App _app = null; private JFrame _parentFrame = null; private JFileChooser _fileChooser = null; + private GenericFileFilter _fileFilter = null; private JCheckBox _subdirCheckbox = null; private JCheckBox _noExifCheckbox = null; + private JCheckBox _outsideAreaCheckbox = null; private JDialog _progressDialog = null; private JProgressBar _progressBar = null; private int[] _fileCounts = null; private boolean _cancelled = false; + private LatLonRectangle _trackRectangle = null; private TreeSet _photos = null; @@ -57,31 +62,45 @@ public class JpegLoader implements Runnable { _app = inApp; _parentFrame = inParentFrame; + String[] fileTypes = {"jpg", "jpe", "jpeg"}; + _fileFilter = new GenericFileFilter("filetype.jpeg", fileTypes); } /** * Open the GUI to select options and start the load + * @param inRectangle track rectangle */ - public void openDialog() + public void openDialog(LatLonRectangle inRectangle) { - // TODO: Allow restriction of load area, either to current track or manually-entered range + // Create file chooser if necessary if (_fileChooser == null) { _fileChooser = new JFileChooser(); _fileChooser.setMultiSelectionEnabled(true); _fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + _fileChooser.setFileFilter(_fileFilter); _fileChooser.setDialogTitle(I18nManager.getText("menu.file.addphotos")); _subdirCheckbox = new JCheckBox(I18nManager.getText("dialog.jpegload.subdirectories")); _subdirCheckbox.setSelected(true); _noExifCheckbox = new JCheckBox(I18nManager.getText("dialog.jpegload.loadjpegswithoutcoords")); _noExifCheckbox.setSelected(true); + _outsideAreaCheckbox = new JCheckBox(I18nManager.getText("dialog.jpegload.loadjpegsoutsidearea")); + _outsideAreaCheckbox.setSelected(true); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(_subdirCheckbox); panel.add(_noExifCheckbox); + panel.add(_outsideAreaCheckbox); _fileChooser.setAccessory(panel); + // start from directory in config if already set by other operations + File configDir = Config.getWorkingDirectory(); + if (configDir != null) {_fileChooser.setCurrentDirectory(configDir);} } + // enable/disable track checkbox + _trackRectangle = inRectangle; + _outsideAreaCheckbox.setEnabled(_trackRectangle != null && !_trackRectangle.isEmpty()); + // Show file dialog to choose file / directory(ies) if (_fileChooser.showOpenDialog(_parentFrame) == JFileChooser.APPROVE_OPTION) { // Bring up dialog before starting @@ -170,9 +189,7 @@ public class JpegLoader implements Runnable } else { - // Found some photos to load - // TODO: Load jpeg information into dialog for confirmation? - // Pass information back to app + // Found some photos to load - pass information back to app _app.informPhotosLoaded(_photos); } } @@ -231,7 +248,8 @@ public class JpegLoader implements Runnable _progressBar.repaint(); // Check whether filename corresponds with accepted filenames - if (!acceptPhotoFilename(inFile.getName())) {return;} + if (!_fileFilter.acceptFilename(inFile.getName())) {return;} + // If it's a Jpeg, we can use ExifReader to get coords, otherwise we could try exiftool (if it's installed) // Create Photo object Photo photo = new Photo(inFile); @@ -251,6 +269,7 @@ public class JpegLoader implements Runnable // Make DataPoint and attach to Photo DataPoint point = createDataPoint(jpegData); point.setPhoto(photo); + point.setSegmentStart(true); photo.setDataPoint(point); photo.setOriginalStatus(PhotoStatus.TAGGED); _fileCounts[3]++; @@ -265,17 +284,13 @@ public class JpegLoader implements Runnable catch (JpegException jpe) { // don't list errors, just count them } // Use file timestamp if exif timestamp isn't available - if (photo.getTimestamp() == null) - { + if (photo.getTimestamp() == null) { photo.setTimestamp(new Timestamp(inFile.lastModified())); - //System.out.println("No exif, using timestamp from file: " + inFile.lastModified() + " -> " + photo.getTimestamp().getText()); } - else - { - //System.out.println("timestamp from file = " + photo.getTimestamp().getText()); - } - // Add the photo if it's got a point or if pointless photos should be added - if (photo.getDataPoint() != null || _noExifCheckbox.isSelected()) + // Check the criteria for adding the photo - check whether the photo has coordinates and if so if they're within the rectangle + if ( (photo.getDataPoint() != null || _noExifCheckbox.isSelected()) + && (photo.getDataPoint() == null || !_outsideAreaCheckbox.isEnabled() + || _outsideAreaCheckbox.isSelected() || _trackRectangle.containsPoint(photo.getDataPoint()))) { _photos.add(photo); } @@ -300,6 +315,10 @@ public class JpegLoader implements Runnable File file = inFiles[i]; if (file.exists() && file.canRead()) { + // Store first directory in config for later + if (i == 0 && inFirstDir) { + Config.setWorkingDirectory(file.isDirectory()?file:file.getParentFile()); + } // Check whether it's a file or a directory if (file.isFile()) { @@ -393,34 +412,4 @@ public class JpegLoader implements Runnable catch (NumberFormatException nfe) {} return stamp; } - - - /** - * Check whether to accept the given filename - * @param inName name of file - * @return true if accepted, false otherwise - */ - private static boolean acceptPhotoFilename(String inName) - { - if (inName != null && inName.length() > 4) - { - // Check for three-character file extensions jpg and jpe - String lastFour = inName.substring(inName.length() - 4).toLowerCase(); - if (lastFour.equals(".jpg") || lastFour.equals(".jpe")) - { - return true; - } - // If not found, check for file extension jpeg - if (inName.length() > 5) - { - String lastFive = inName.substring(inName.length() - 5).toLowerCase(); - if (lastFive.equals(".jpeg")) - { - return true; - } - } - } - // Not matched so don't accept - return false; - } }