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 <mon...@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

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to