[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