[mkgmapgui] 01/38: Imported Upstream version 1.1
Bas Couwenberg
sebastic at xs4all.nl
Sun Dec 14 16:14:57 UTC 2014
This is an automated email from the git hooks/post-receive script.
sebastic-guest pushed a commit to branch master
in repository mkgmapgui.
commit daa509ff52c14fca9eb5b95d77ae95beea80bae1
Author: Mònica Ramírez Arceda <monica at probeta.net>
Date: Sun May 15 20:44:14 2011 +0200
Imported Upstream version 1.1
---
META-INF/MANIFEST.MF | 3 +
tim/mkgmapgui/FileListModel.java | 81 +++++++
tim/mkgmapgui/GuiController.java | 13 ++
tim/mkgmapgui/GuiWindow.java | 448 ++++++++++++++++++++++++++++++++++++
tim/mkgmapgui/MkgmapGui.java | 108 +++++++++
tim/mkgmapgui/Operation.java | 81 +++++++
tim/mkgmapgui/SingleFileFilter.java | 63 +++++
tim/mkgmapgui/ThreadPoller.java | 40 ++++
tim/mkgmapgui/license.txt | 339 +++++++++++++++++++++++++++
tim/mkgmapgui/readme.txt | 38 +++
10 files changed, 1214 insertions(+)
diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..2fa78f6
--- /dev/null
+++ b/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: tim.mkgmapgui.MkgmapGui
+
diff --git a/tim/mkgmapgui/FileListModel.java b/tim/mkgmapgui/FileListModel.java
new file mode 100644
index 0000000..069db73
--- /dev/null
+++ b/tim/mkgmapgui/FileListModel.java
@@ -0,0 +1,81 @@
+package tim.mkgmapgui;
+
+import java.io.File;
+import java.util.ArrayList;
+
+import javax.swing.AbstractListModel;
+
+/**
+ * Class to hold the list of IMG Files to combine
+ */
+public class FileListModel extends AbstractListModel
+{
+ /** ArrayList of files */
+ private ArrayList<File> _files = new ArrayList<File>();
+
+ /**
+ * Add the file to the list
+ * @param inFile file to add
+ */
+ public void addFile(File inFile)
+ {
+ if (!contains(inFile)) {
+ _files.add(inFile);
+ }
+ this.fireContentsChanged(this, 0, getSize()-1);
+ }
+
+ /**
+ * Remove the specified file from the list
+ * @param inIndex index to remove
+ */
+ public void removeFile(int inIndex)
+ {
+ _files.remove(inIndex);
+ this.fireContentsChanged(this, 0, getSize()-1);
+ }
+
+ /**
+ * @return number of entries in list
+ */
+ public int getSize() {
+ return _files.size();
+ }
+
+ /**
+ * @param inIndex index to get
+ * @return list element
+ */
+ public Object getElementAt(int inIndex) {
+ return _files.get(inIndex).getName();
+ }
+
+ /**
+ * Check if the specified File is already in the list
+ * @param inFile file to check
+ * @return true if it's already present
+ */
+ public boolean contains(File inFile)
+ {
+ int numFiles = getSize();
+ for (int i=0; i<numFiles; i++) {
+ if (_files.get(i).equals(inFile)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @return array of file paths
+ */
+ public String[] getFiles()
+ {
+ int numFiles = getSize();
+ String[] filenames = new String[numFiles];
+ for (int i=0; i<numFiles; i++) {
+ filenames[i] = _files.get(i).getAbsolutePath();
+ }
+ return filenames;
+ }
+}
diff --git a/tim/mkgmapgui/GuiController.java b/tim/mkgmapgui/GuiController.java
new file mode 100644
index 0000000..b4c6cfe
--- /dev/null
+++ b/tim/mkgmapgui/GuiController.java
@@ -0,0 +1,13 @@
+package tim.mkgmapgui;
+
+/**
+ * Interface for communicating back to the GUI
+ */
+public interface GuiController
+{
+ /**
+ * Inform the controller that the
+ * operation was successfully completed
+ */
+ public void operationComplete();
+}
diff --git a/tim/mkgmapgui/GuiWindow.java b/tim/mkgmapgui/GuiWindow.java
new file mode 100644
index 0000000..15ab22e
--- /dev/null
+++ b/tim/mkgmapgui/GuiWindow.java
@@ -0,0 +1,448 @@
+package tim.mkgmapgui;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.GridLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.lang.reflect.Method;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.border.EtchedBorder;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+/**
+ * Class for controlling the gui window for the Mkgmap wrapper
+ */
+public class GuiWindow implements GuiController
+{
+ /** Classloader to get mkgmap jar */
+ private ClassLoader _classLoader = null;
+ /** Main dialog window */
+ private JFrame _mainWindow = null;
+ /** Text field for displaying/entering osm file path */
+ private JTextField _osmField = null;
+ /** Text field for entering map number */
+ private JTextField _mapNumField = null;
+ /** Button to start conversion */
+ private JButton _convertButton = null;
+ /** File chooser for osm files */
+ private JFileChooser _osmFileChooser = null;
+ /** File chooser for img files */
+ private JFileChooser _imgFileChooser = null;
+ /** File list model for img files */
+ private FileListModel _fileListModel = null;
+ /** List for img files */
+ private JList _fileList = null;
+ /** Button to remove file from list */
+ private JButton _removeImgFileButton = null;
+ /** Button to start combination */
+ private JButton _combineButton = null;
+ /** Operation to perform */
+ private Operation _operation = null;
+ /** Flag for operation failure */
+ private boolean _operationFailed = false;
+ /** Progress bar */
+ private JProgressBar _progressBar = null;
+
+
+ /**
+ * Constructor
+ * @param inClassLoader class loader
+ */
+ public GuiWindow(ClassLoader inClassLoader)
+ {
+ _classLoader = inClassLoader;
+ _osmFileChooser = new JFileChooser();
+ _osmFileChooser.setFileFilter(new SingleFileFilter("OSM files", ".osm"));
+ _osmFileChooser.setAcceptAllFileFilterUsed(false);
+ _imgFileChooser = new JFileChooser();
+ _imgFileChooser.setFileFilter(new SingleFileFilter("IMG files", ".img"));
+ _imgFileChooser.setAcceptAllFileFilterUsed(false);
+ }
+
+ /**
+ * Show the dialog
+ */
+ public void showDialog()
+ {
+ _mainWindow = new JFrame("Mkgmap GUI 1.1");
+ _mainWindow.addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ System.exit(0);
+ }
+ });
+ _mainWindow.getContentPane().add(makeComponents());
+ _mainWindow.pack();
+ _mainWindow.setVisible(true);
+ }
+
+ /**
+ * @return GUI components
+ */
+ private Component makeComponents()
+ {
+ JPanel gridPanel = new JPanel();
+ gridPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+ gridPanel.setLayout(new GridLayout(1, 2, 5, 5));
+ // Convert panel
+ JPanel convertPanel = makePanel();
+ // Add file chooser for osm file
+ JPanel chooseOsmPanel = new JPanel();
+ chooseOsmPanel.setLayout(new BorderLayout(0, 4));
+ chooseOsmPanel.add(new JLabel("Converts an osm file to an img file"), BorderLayout.NORTH);
+ JPanel chooseOptionsPanel = new JPanel();
+ GridBagLayout gridbag = new GridBagLayout();
+ chooseOptionsPanel.setLayout(gridbag);
+ GridBagConstraints c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = 0;
+ c.weightx = 0.0; c.weighty = 0.0;
+ c.insets = new Insets(1, 2, 1, 2);
+ JLabel label = new JLabel("Osm file : ");
+ gridbag.setConstraints(label, c);
+ chooseOptionsPanel.add(label);
+ // text field for input file
+ _osmField = new JTextField("", 11);
+ _osmField.addKeyListener(new KeyAdapter() {
+ public void keyReleased(KeyEvent e) {
+ _convertButton.setEnabled(_osmField.getText().length() > 0);
+ super.keyReleased(e);
+ }
+ });
+ c.gridx = 1;
+ c.weightx = 1;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ gridbag.setConstraints(_osmField, c);
+ chooseOptionsPanel.add(_osmField);
+ // browse button
+ JButton chooseOsmButton = new JButton("Browse ...");
+ chooseOsmButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ int answer = _osmFileChooser.showOpenDialog(_mainWindow);
+ if (answer == JFileChooser.APPROVE_OPTION) {
+ _osmField.setText(_osmFileChooser.getSelectedFile().getAbsolutePath());
+ _convertButton.setEnabled(true);
+ }
+ }
+ });
+ c.gridx = 2;
+ c.weightx = 0;
+ c.fill = GridBagConstraints.NONE;
+ gridbag.setConstraints(chooseOsmButton, c);
+ chooseOptionsPanel.add(chooseOsmButton);
+ // second row
+ label = new JLabel("Map number : ");
+ c.gridx = 0; c.gridy = 1;
+ gridbag.setConstraints(label, c);
+ chooseOptionsPanel.add(label);
+ _mapNumField = new JTextField("", 10);
+ c.gridx = 1;
+ c.weightx = 1.0;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ gridbag.setConstraints(_mapNumField, c);
+ chooseOptionsPanel.add(_mapNumField);
+ // put together
+ chooseOsmPanel.add(chooseOptionsPanel, BorderLayout.CENTER);
+ convertPanel.add(chooseOsmPanel, BorderLayout.NORTH);
+ // (and maybe for config file too?)
+ _convertButton = addOkButton("Convert", convertPanel);
+ _convertButton.setEnabled(false);
+ _convertButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ convertOsmFile(_osmField.getText());
+ }
+ });
+ gridPanel.add(convertPanel);
+
+ // Combine panel
+ JPanel combinePanel = makePanel();
+ combinePanel.add(new JLabel("Combines several img files into one"), BorderLayout.NORTH);
+ // Add list of osm files to combine, buttons to add new one, remove one
+ _fileListModel = new FileListModel();
+ _fileList = new JList(_fileListModel);
+ _fileList.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(ListSelectionEvent inEvent) {
+ if (!inEvent.getValueIsAdjusting()) {
+ checkCombineButtons();
+ }
+ }
+ });
+ combinePanel.add(new JScrollPane(_fileList), BorderLayout.CENTER);
+ JPanel combineButtonPanel = new JPanel();
+ combineButtonPanel.setLayout(new BoxLayout(combineButtonPanel, BoxLayout.Y_AXIS));
+ JButton addImgButton = new JButton("Add file");
+ addImgButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ addImgFile();
+ }
+ });
+ combineButtonPanel.add(addImgButton);
+ _removeImgFileButton = new JButton("Remove file");
+ _removeImgFileButton.setEnabled(false);
+ _removeImgFileButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent arg0) {
+ removeImgFile();
+ }
+ });
+ combineButtonPanel.add(_removeImgFileButton);
+ combinePanel.add(combineButtonPanel, BorderLayout.EAST);
+ _combineButton = addOkButton("Combine", combinePanel);
+ _combineButton.setEnabled(false);
+ _combineButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ combineImgFiles(_fileListModel.getFiles());
+ }
+ });
+ gridPanel.add(combinePanel);
+
+ // Add progress bar
+ JPanel mainPanel = new JPanel();
+ mainPanel.setLayout(new BorderLayout());
+ mainPanel.add(gridPanel, BorderLayout.CENTER);
+ _progressBar = new JProgressBar();
+ _progressBar.setVisible(false);
+ _progressBar.setIndeterminate(true);
+ mainPanel.add(_progressBar, BorderLayout.SOUTH);
+ return mainPanel;
+ }
+
+
+ /**
+ * @return a panel for each of the two options
+ */
+ private JPanel makePanel()
+ {
+ JPanel panel = new JPanel();
+ panel.setLayout(new BorderLayout(1, 2));
+ panel.setBorder(BorderFactory.createCompoundBorder(
+ BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(3, 3, 3, 3))
+ );
+ return panel;
+ }
+
+ /**
+ * Add an OK button to the given panel
+ * @param inText text for button
+ * @param inParent parent panel with borderlayout
+ * @return button (which is already added)
+ */
+ private JButton addOkButton(String inText, JPanel inParent)
+ {
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ JButton button = new JButton(inText);
+ buttonPanel.add(button);
+ inParent.add(buttonPanel, BorderLayout.SOUTH);
+ return button;
+ }
+
+ /**
+ * Do the conversion using the specified osm file
+ * @param inOsmPath path to osm file
+ */
+ private void convertOsmFile(String inOsmPath)
+ {
+ // Check osm path is ok
+ if (inOsmPath == null) {return;}
+ File osmFile = new File(inOsmPath);
+ if (osmFile.exists() && osmFile.canRead() && osmFile.isFile()
+ && osmFile.getAbsolutePath().toLowerCase().endsWith(".osm"))
+ {
+ // Select output file
+ int answer = _imgFileChooser.showSaveDialog(_mainWindow);
+ // Maybe set default here
+ if (answer == JFileChooser.APPROVE_OPTION)
+ {
+ File saveFile = _imgFileChooser.getSelectedFile();
+ if (!saveFile.getName().toLowerCase().endsWith(".img")) {
+ saveFile = new File(saveFile.getAbsolutePath() + ".img");
+ }
+ // Check whether to overwrite file
+ if (saveFile.exists()
+ && JOptionPane.showConfirmDialog(_mainWindow, "Overwrite file " + saveFile.getAbsolutePath() + " ?",
+ "File exists", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION)
+ {
+ // Don't overwrite file, abort
+ return;
+ }
+ // Use given map number if any
+ int mapNum = 12345678;
+ try
+ {
+ int enteredNum = Integer.parseInt(_mapNumField.getText());
+ if (enteredNum > 0 && enteredNum < 1e9) {
+ mapNum = enteredNum;
+ }
+ else {
+ JOptionPane.showMessageDialog(_mainWindow,
+ "Map number '" + enteredNum + "' is out of range - using '" + mapNum + "' instead.",
+ "Problem with map number", JOptionPane.WARNING_MESSAGE);
+ }
+ } catch (NumberFormatException nfe) {
+ JOptionPane.showMessageDialog(_mainWindow,
+ "Couldn't turn '" + _mapNumField.getText() + "' into a number - using '" + mapNum + "' instead.",
+ "Problem with map number", JOptionPane.WARNING_MESSAGE);
+ }
+ String mapName = "" + mapNum;
+ try
+ {
+ // Make Operation object and start in new thread
+ Thread mkgmapThread = launchOperation(Operation.makeConvertOperation(osmFile, mapName, saveFile));
+ // Start new polling thread
+ new Thread(new ThreadPoller(this, mkgmapThread)).start();
+ }
+ catch (Exception e) {
+ JOptionPane.showMessageDialog(_mainWindow, "Invocation error: " + e.getMessage(),
+ "Error", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ }
+ else {
+ JOptionPane.showMessageDialog(_mainWindow, "Selected file is not a readable osm file",
+ "Error", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
+ /**
+ * Add an img file to the list
+ */
+ private void addImgFile()
+ {
+ int result = _imgFileChooser.showOpenDialog(_mainWindow);
+ if (result == JFileChooser.APPROVE_OPTION) {
+ _fileListModel.addFile(_imgFileChooser.getSelectedFile());
+ }
+ checkCombineButtons();
+ }
+
+ /**
+ * Remove img file from list
+ */
+ private void removeImgFile()
+ {
+ int selIndex = _fileList.getSelectedIndex();
+ if (selIndex >= 0 && selIndex < _fileListModel.getSize()) {
+ _fileListModel.removeFile(selIndex);
+ }
+ checkCombineButtons();
+ }
+
+ /**
+ * Enable or disable the combine buttons
+ */
+ private void checkCombineButtons()
+ {
+ _removeImgFileButton.setEnabled(_fileListModel.getSize() > 0
+ && _fileList.getSelectedIndex() >= 0
+ && _fileList.getSelectedIndex() < _fileListModel.getSize());
+ _combineButton.setEnabled(_fileListModel.getSize() > 0);
+ }
+
+ /**
+ * Combine the selected files to a new img file
+ * @param inFiles array of filenames of img files to combine
+ */
+ private void combineImgFiles(String[] inFiles)
+ {
+ // Select output file to save to
+ _imgFileChooser.cancelSelection();
+ _imgFileChooser.setSelectedFile(new File("gmapsupp.img"));
+ int result = _imgFileChooser.showSaveDialog(_mainWindow);
+ if (result == JFileChooser.APPROVE_OPTION)
+ {
+ // Make Operation object and start in new thread
+ Thread mkgmapThread = launchOperation(Operation.makeCombineOperation(inFiles, _imgFileChooser.getSelectedFile()));
+ // Start new polling thread
+ new Thread(new ThreadPoller(this, mkgmapThread)).start();
+ }
+ }
+
+ /**
+ * Launch the specified operation in a new thread
+ * @param inOperation operation to launch
+ * @return created thread
+ */
+ private Thread launchOperation(Operation inOperation)
+ {
+ _progressBar.setVisible(true);
+ _operation = inOperation;
+ Thread mkgmapThread = new Thread(new Runnable() {
+ public void run() {
+ launchOperation();
+ }
+ });
+ mkgmapThread.setContextClassLoader(_classLoader);
+ mkgmapThread.start();
+ return mkgmapThread;
+ }
+
+ /**
+ * Launch the selected operation
+ */
+ private void launchOperation()
+ {
+ _operationFailed = false;
+ String[] mainMethodArgs = _operation.getArgs();
+ try
+ {
+ Class<?> mainClass = _classLoader.loadClass("uk.me.parabola.mkgmap.main.Main");
+ Method mainMethod = mainClass.getMethod("main", (new String[]{}).getClass());
+ // Found main method
+ mainMethod.invoke(null, new Object[] {mainMethodArgs});
+ }
+ catch (Exception e)
+ {
+ if (e.getCause() != null && e.getCause() instanceof OutOfMemoryError) {
+ JOptionPane.showMessageDialog(_mainWindow,
+ "Ran out of memory! Try again using the -Xmx=512M parameter to allocate more memory",
+ "Out of memory", JOptionPane.ERROR_MESSAGE);
+ }
+ else {
+ JOptionPane.showMessageDialog(_mainWindow,
+ e.getClass().getName() + " error occurred" + (e.getMessage() == null?"":"): " + e.getMessage()),
+ "Internal error", JOptionPane.ERROR_MESSAGE);
+ }
+ _operationFailed = true;
+ }
+ }
+
+ /**
+ * Inform controller that operation is complete
+ */
+ public void operationComplete()
+ {
+ _progressBar.setVisible(false);
+ if (!_operationFailed)
+ {
+ // Rename file using _operation
+ if (!_operation.getOutputFile().renameTo(_operation.getRequestedFile())) {
+ // Show error if rename failed
+ JOptionPane.showMessageDialog(_mainWindow,
+ "Failed to rename file. Output file is still at " + _operation.getOutputFile().getAbsolutePath(),
+ "Rename failed", JOptionPane.ERROR_MESSAGE);
+ }
+ _mainWindow.dispose();
+ }
+ }
+}
diff --git a/tim/mkgmapgui/MkgmapGui.java b/tim/mkgmapgui/MkgmapGui.java
new file mode 100644
index 0000000..859e48a
--- /dev/null
+++ b/tim/mkgmapgui/MkgmapGui.java
@@ -0,0 +1,108 @@
+package tim.mkgmapgui;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * Gui wrapper for calling mkgmap (available separately)
+ */
+public class MkgmapGui
+{
+
+ /**
+ * @param args command line arguments
+ */
+ public static void main(String[] args)
+ {
+ String jarloc = null;
+ if (args != null && args.length > 0) {
+ if (args.length == 1) {
+ jarloc = args[0];
+ }
+ else {
+ // Complain about too many arguments given
+ System.err.println("Too many arguments given, expected at most one!\nUsage: java -jar mkgmapgui.jar [mkgmap.jar]");
+ }
+ }
+ File mkgmapJar = findMkgmapJar(jarloc);
+ if (mkgmapJar == null || !mkgmapJar.exists() || !mkgmapJar.canRead()) {
+ System.err.println("Could not find mkgmap jar file");
+ }
+ else {
+ launchMkgmap(mkgmapJar);
+ }
+ }
+
+ /**
+ * Find the mkgmap jar either in the specified location or in the current directory
+ * @param inLoc optional path to mkgmap.jar file
+ * @return File where jar file found, or null
+ */
+ private static File findMkgmapJar(String inLoc)
+ {
+ if (inLoc != null) {
+ File specifiedFile = new File(inLoc);
+ // If it's a direct link to the jar then great!
+ if (checkFile(specifiedFile)) {return specifiedFile;}
+ // If it's a directory then search through it
+ if (specifiedFile.exists() && specifiedFile.isDirectory())
+ {
+ File foundFile = findMkgmapJar(specifiedFile);
+ if (foundFile != null) {return foundFile;}
+ }
+ }
+ // Now check in curent directory
+ return findMkgmapJar(new File("").getAbsoluteFile());
+ }
+
+ /**
+ * Find the Mkgmap jar in the specified directory
+ * @param inDirectory directory to look in
+ * @return File if found, or null
+ */
+ private static File findMkgmapJar(File inDirectory)
+ {
+ if (inDirectory != null && inDirectory.exists() && inDirectory.isDirectory())
+ {
+ File[] files = inDirectory.listFiles();
+ for (int i=0; i<files.length; i++) {
+ if (checkFile(files[i])) {
+ return files[i];
+ }
+ }
+ }
+ // not found
+ return null;
+ }
+
+ /**
+ * Check the given file to see if it is acceptable
+ * @param inFile File to check
+ * @return true if file is an acceptable mkgmap jar file
+ */
+ private static boolean checkFile(File inFile)
+ {
+ return (inFile != null && inFile.exists() && inFile.isFile() && inFile.canRead()
+ && inFile.getName().toLowerCase().startsWith("mkgmap")
+ && inFile.getName().toLowerCase().endsWith(".jar"));
+ }
+
+ /**
+ * Launch the Mkgmap program
+ * @param inMkgmapJar jar file for mkgmap
+ */
+ private static void launchMkgmap(File inMkgmapJar)
+ {
+ try
+ {
+ URLClassLoader cl = new URLClassLoader(new URL[] {inMkgmapJar.toURI().toURL()});
+ GuiWindow window = new GuiWindow(cl);
+ window.showDialog();
+ }
+ catch (MalformedURLException e) {
+ System.err.println("Failed to load Jar: " + e.getMessage());
+ }
+ }
+}
diff --git a/tim/mkgmapgui/Operation.java b/tim/mkgmapgui/Operation.java
new file mode 100644
index 0000000..a9e4189
--- /dev/null
+++ b/tim/mkgmapgui/Operation.java
@@ -0,0 +1,81 @@
+package tim.mkgmapgui;
+
+import java.io.File;
+
+/**
+ * Class to represent an operation of mkgmap
+ * including input parameters and what to do with the output
+ */
+public class Operation
+{
+ private String[] _arguments = null;
+ private File _outputFile = null;
+ private File _requestedFile = null;
+
+ /**
+ * Constructor
+ * @param inArgs command line arguments to mkgmap
+ * @param inOutputFile output file generated by mkgmap
+ * @param inRequestedFile requested output file
+ */
+ public Operation(String[] inArgs, File inOutputFile, File inRequestedFile)
+ {
+ _arguments = inArgs;
+ _outputFile = inOutputFile;
+ _requestedFile = inRequestedFile;
+ if (!_requestedFile.getName().toLowerCase().endsWith(".img")) {
+ _requestedFile = new File(_requestedFile.getAbsolutePath() + ".img");
+ }
+ }
+
+ /**
+ * Constructor for a convert operation
+ * @param inOsmFile osm file to convert
+ * @param inName name of map
+ * @param inRequestedFile file requested by user
+ * @return Operation object
+ */
+ public static Operation makeConvertOperation(File inOsmFile, String inName, File inRequestedFile)
+ {
+ String[] args = new String[] {"--mapname=" + inName, inOsmFile.getAbsolutePath()};
+ return new Operation(args, new File(inName + ".img"), inRequestedFile);
+ }
+
+ /**
+ * Constructor for a combine operation
+ * @param inFiles array of files to combine
+ * @param inRequestedFile file requested by user
+ * @return Operation object
+ */
+ public static Operation makeCombineOperation(String[] inPaths, File inRequestedFile)
+ {
+ String[] args = new String[inPaths.length + 1];
+ args[0] = "--gmapsupp";
+ System.arraycopy(inPaths, 0, args, 1, inPaths.length);
+ return new Operation(args, new File("gmapsupp.img"), inRequestedFile);
+ }
+
+ /**
+ * @return command line arguments for mkgmap
+ */
+ public String[] getArgs()
+ {
+ return _arguments;
+ }
+
+ /**
+ * @return output file from mkgmap
+ */
+ public File getOutputFile()
+ {
+ return _outputFile;
+ }
+
+ /**
+ * @return requested file
+ */
+ public File getRequestedFile()
+ {
+ return _requestedFile;
+ }
+}
diff --git a/tim/mkgmapgui/SingleFileFilter.java b/tim/mkgmapgui/SingleFileFilter.java
new file mode 100644
index 0000000..9288fff
--- /dev/null
+++ b/tim/mkgmapgui/SingleFileFilter.java
@@ -0,0 +1,63 @@
+package tim.mkgmapgui;
+
+import java.io.File;
+import javax.swing.filechooser.FileFilter;
+
+
+/**
+ * Class to act as a simple file filter based on a single file extension
+ */
+public class SingleFileFilter extends FileFilter
+{
+ /** Filter description for display */
+ private String _filterDesc = null;
+ /** Allowed file suffix */
+ private String _suffix = null;
+
+ /**
+ * Constructor
+ * @param inDescription filter description
+ * @param inSuffix allowed file suffix
+ */
+ public SingleFileFilter(String inDescription, String inSuffix)
+ {
+ _filterDesc = inDescription;
+ _suffix = inSuffix;
+ }
+
+ /**
+ * Check whether to accept the specified file or not
+ * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
+ */
+ public boolean accept(File inFile) {
+ return inFile.isDirectory() || acceptFilename(inFile.getName());
+ }
+
+ /**
+ * Check whether to accept the given filename
+ * @param inName name of file
+ * @return true if accepted, false otherwise
+ */
+ public boolean acceptFilename(String inName)
+ {
+ if (inName != null)
+ {
+ int nameLen = inName.length();
+ if (_suffix != null && nameLen > _suffix.length())
+ {
+ return inName.toLowerCase().endsWith(_suffix);
+ }
+ }
+ // Not matched so don't accept
+ return false;
+ }
+
+ /**
+ * Get description
+ * @see javax.swing.filechooser.FileFilter#getDescription()
+ */
+ public String getDescription() {
+ return _filterDesc;
+ }
+
+}
diff --git a/tim/mkgmapgui/ThreadPoller.java b/tim/mkgmapgui/ThreadPoller.java
new file mode 100644
index 0000000..a66695a
--- /dev/null
+++ b/tim/mkgmapgui/ThreadPoller.java
@@ -0,0 +1,40 @@
+package tim.mkgmapgui;
+
+/**
+ * Poller to check operation thread
+ * and report results back to controller
+ */
+public class ThreadPoller implements Runnable
+{
+ private GuiController _controller = null;
+ private Thread _thread = null;
+
+
+ /**
+ * Constructor
+ * @param inController controller
+ * @param inThread thread to watch
+ */
+ public ThreadPoller(GuiController inController, Thread inThread)
+ {
+ _controller = inController;
+ _thread = inThread;
+ }
+
+ /**
+ * Run method
+ */
+ public void run()
+ {
+ boolean running = true;
+ while (running)
+ {
+ try {
+ Thread.sleep(2000);
+ }
+ catch (InterruptedException e) {}
+ running = (_thread.getState() != Thread.State.TERMINATED);
+ }
+ _controller.operationComplete();
+ }
+}
diff --git a/tim/mkgmapgui/license.txt b/tim/mkgmapgui/license.txt
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/tim/mkgmapgui/license.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/tim/mkgmapgui/readme.txt b/tim/mkgmapgui/readme.txt
new file mode 100644
index 0000000..e56b2e3
--- /dev/null
+++ b/tim/mkgmapgui/readme.txt
@@ -0,0 +1,38 @@
+Mkgmapgui version 1.1
+=====================
+
+Mkgmapgui is a graphical frontend for calling the mkgmap tool.
+Full details can be found at http://activityworkshop.net/software/mkgmapgui/
+
+Mkgmapgui is copyright activityworkshop.net and distributed under the terms of the Gnu GPL version 2.
+You may freely use the software, and may help others to freely use it too. For further information
+on your rights and how they are protected, see the included license.txt file.
+
+Mkgmapgui comes without warranty and without guarantee - the authors cannot be held responsible for
+losses incurred through use of the program, however caused.
+
+
+Running
+=======
+
+To run Mkgmapgui from the jar file, call it from a command prompt or shell and give it the path to mkgmap:
+ java -Xmx512M -jar mkgmapgui.jar downloads/mkgmap
+
+The -Xmx512M parameter allocates 512 MB to the java runtime, which is probably necessary for the conversion
+step of mkgmap (depending on your map size). The last, optional parameter specifies the directory in which
+the mkgmap jar file can be found.
+
+You can make a shortcut, menu item, alias, desktop icon or other link to make running it easier.
+
+Version history
+===============
+
+1 First version
+1.1 Added entry field for map number (required for merging later), fixed existing file detection
+
+
+Further information and updates
+===============================
+
+To obtain the source code (if it wasn't included in your jar file), or for further information,
+please visit the website: http://activityworkshop.net/
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/mkgmapgui.git
More information about the Pkg-grass-devel
mailing list