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;
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;
{
_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
}
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);
}
}
_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);
// 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]++;
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);
}
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())
{
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;
- }
}