/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.gui.actions;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.xml.bind.JAXBException;
import mobac.data.gpx.GPXUtils;
import mobac.data.gpx.gpx11.Gpx;
import mobac.gui.MainGUI;
import mobac.gui.mapview.layer.GpxLayer;
import mobac.gui.panels.JGpxPanel;
import mobac.program.model.Settings;
import mobac.utilities.I18nUtils;
import mobac.utilities.file.GpxFileFilter;
import org.apache.log4j.Logger;
public class GpxLoad implements ActionListener {
private Logger log = Logger.getLogger(GpxLoad.class);
JGpxPanel panel;
public GpxLoad(JGpxPanel panel) {
super();
this.panel = panel;
}
public void actionPerformed(ActionEvent event) {
if (!GPXUtils.checkJAXBVersion())
return;
JFileChooser fc = new JFileChooser();
try {
File dir = new File(Settings.getInstance().gpxFileChooserDir);
fc.setCurrentDirectory(dir); // restore the saved directory
} catch (Exception e) {
}
fc.setMultiSelectionEnabled(true);
fc.addChoosableFileFilter(new GpxFileFilter(false));
final MainGUI mainGUI = MainGUI.getMainGUI();
int returnVal = fc.showOpenDialog(mainGUI);
if (returnVal != JFileChooser.APPROVE_OPTION)
return;
Settings.getInstance().gpxFileChooserDir = fc.getCurrentDirectory().getAbsolutePath();
File[] f = fc.getSelectedFiles();
// check already opened gpx files
boolean duplicates = false;
for (File selectedFile : f) {
duplicates = panel.isFileOpen(selectedFile.getAbsolutePath());
if (duplicates)
break;
}
if (duplicates) {
int answer = JOptionPane
.showConfirmDialog(mainGUI, I18nUtils.localizedStringForKey("rp_gpx_msg_confirm_reopen_file"),
I18nUtils.localizedStringForKey("Warning"), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (answer != JOptionPane.YES_OPTION)
return;
}
// process
if (f.length > 1) {
doMultiLoad(f, mainGUI);
} else if (f.length == 1) {
doLoad(f[0], mainGUI);
}
mainGUI.previewMap.refreshMap();
}
/**
* @param f
*/
private void doLoad(File f, Component parent) {
try {
Gpx gpx = GPXUtils.loadGpxFile(f);
GpxLayer gpxLayer = new GpxLayer(gpx);
gpxLayer.setFile(f);
panel.addGpxLayer(gpxLayer);
} catch (JAXBException e) {
JOptionPane.showMessageDialog(parent, "<html>Unable to load the GPX file <br><i>" + f.getAbsolutePath()
+ "</i><br><br><b>Please make sure the file is a valid GPX v1.1 file.</b><br>"
+ "<br>Internal error message:<br>" + e.getMessage() + "</html>", "GPX loading failed",
JOptionPane.ERROR_MESSAGE);
throw new RuntimeException(e);
}
}
private void doMultiLoad(final File[] files, final MainGUI mainGUI) {
final JDialog progressDialog = new JDialog(mainGUI);
// prepare progress dialog
progressDialog.setSize(400, 50);
progressDialog.setResizable(false);
progressDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
progressDialog.setLocation(
Math.max(0, (int) (mainGUI.getLocation().getX() + mainGUI.getSize().getWidth() / 2 - 200)),
Math.max(0, (int) (mainGUI.getLocation().getY() + mainGUI.getSize().getHeight() / 2 - 25)));
final JProgressBar progressBar = new JProgressBar(0, files.length);
progressDialog.add(progressBar);
mainGUI.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
mainGUI.setEnabled(false);
progressDialog.setVisible(true);
Thread job = new Thread() {
private int counter = 0;
public void run() {
try {
// iterate over files to load
for (final File file : files) {
counter++;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setValue(counter);
progressDialog.setTitle("Processing " + counter + " of " + files.length + " <"
+ file.getName() + ">");
}
});
doLoad(file, progressDialog);
}
} catch (RuntimeException e) {
log.error(e.getMessage(), e);
} finally {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// close progress dialog
mainGUI.previewMap.repaint();
mainGUI.setCursor(Cursor.getDefaultCursor());
if (progressDialog != null) {
progressDialog.setVisible(false);
progressDialog.dispose();
}
mainGUI.setEnabled(true);
mainGUI.toFront();
}
});
}
};
};
job.start();
}
}