#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# trk2gpx.py
# Version 1.0.2 by Benjamin Lebsanft
# Licensed under CC-BY-SA 3.0
# http://wiki.openstreetmap.org/wiki/User:Lebsanbe#My_Software

import pygtk
pygtk.require('2.0')
import gtk

# callback_save wird beim klicken des Buttons aufgerufen

def callback_save(widget):

	# Eingabedatei wird vom Filechooser Button geholt

	if fileChooser.get_filename() != None:

	# Ausgabedatei wird über Filechooser manuell gewählt

		dialog = gtk.FileChooserDialog("Save..",
                               		None,
                               		gtk.FILE_CHOOSER_ACTION_SAVE,
                               		(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                	gtk.STOCK_OPEN, gtk.RESPONSE_OK))
		dialog.set_default_response(gtk.RESPONSE_OK)
		response = dialog.run()	

		# wenn man einen gültigen Namen eingegeben hat startet der Umwandlungsprozess

		if response == gtk.RESPONSE_OK:

			# in points wird das schlüssel-wert-paar mit koordinaten und wert gespeichert

			points = {}

			# öffne Eingabedatei und schreibe jede Zeile in das Array lines

			lines = open( fileChooser.get_filename(), 'r' ).readlines()

			# durchlaufe Eingabedatei zeilenweise

			for j in range(len(lines)):

				# splitte Zeile am Strichpunkt

				value = lines[j].split(";")

				# Wenn Strichpunkt vorhanden beträgt die Lenge des Arrays mit den gespaltenen Werten 2
				# So lassen sich ganz einfach die Wegpunktzeilen vom Track trennen

				if len(value) == 2:

					#splitte Wegpunktzeilen am Komma
		
					lonlat = value[0].split(",")

					# Erzeuge Schlüssel aus den gespaltenen Daten
					# lonlat[0] ist dabei lat und lonlat[1] ist lon
					# Anführungszeichen werden für spätere Ausgabe eingefügt und Klammern 
					# mit l- und rstrip() entfernt

					key = "lat=\"" + lonlat[0].lstrip("(") + "\" " + "lon=\"" + lonlat[1] + "\""
					points[key] = value[1].rstrip()

			# GPX Datei Header
	
			output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<gpx\n  version=\"1.0\"\n  creator=\"trk2gpx.py\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns=\"http://www.topografix.com/GPX/1/0\"\n  xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n"

			# Durchlaufe jedes Schlüssel-Wert-Paar
			# coords ist hier z.B. lat="48.3059" lon="10.9285"
			# types der jeweilige Wert wie A oder Bank etc.

			for (coords,types) in points.items():

				# Füge es entsprechend in die Ausgabe ein
	
				output +=  "<wpt " + coords + ">\n  <name>" + types + "</name>\n</wpt>"

			# Beende Ausgabestrom

			output += "\n</gpx>"

			# Schreibe Datei		

			write_output = open( dialog.get_filename(), 'w+' )
			write_output.write(output)

		# Wird keine Ausgabe Datei gewählt bricht der Dialog sauber ab

		elif response == gtk.RESPONSE_CANCEL:
   		 	print 'Closed, no files selected'
		dialog.destroy()

	else:
		the_dialog = gtk.MessageDialog(window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "Bitte wählen Sie eine Eingabedatei")
        	result = the_dialog.run()
        	the_dialog.destroy()

# Erzeuge GTK Fenster

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("TRK to GPX Converter")
window.set_border_width(20)
window.set_resizable(False) 

# Setze Minimalbreite auf 300

window.set_geometry_hints(min_width=300)

# Erzeuge GTK Frame

frame = gtk.Frame("Wähle TRK Datei: ")

# Erzeuge Vboxen

vbox = gtk.VBox(False, 10)
vbox2 = gtk.VBox(False, 10)
vbox3 = gtk.VBox(False, 10)
frame.add(vbox2)
window.add(vbox)
vbox.pack_start(frame, True)

# Funktionen zum sauberen Beenden der Dialoge

window.connect("destroy", lambda wid:gtk.main_quit())
window.connect("delete_event", lambda a1,a2:gtk.main_quit())	

# Erzeuge GTK Filechooserbutton

fileChooser = gtk.FileChooserButton("Wähle Datei")
fileChooser.set_current_folder('~')

vbox2.pack_start(fileChooser, False)

# Beim Eingabedateidialog nur .trk Dateien anzeigen

filter = gtk.FileFilter()
filter.set_name("TRK Dateien")
filter.add_pattern("*.trk")
fileChooser.add_filter(filter)

# Packe GTK Boxen

vbox.pack_start(vbox3, True)

hbox = gtk.HBox(False, 10)
vbox3.pack_start(hbox, False)

xalign2 = gtk.Alignment(0)
hbox.pack_start(xalign2, True)   

# Erzeuge GTK Button

button = gtk.Button("Konvertiere...")

# Callback Funktion für Klicks auf den Button

button.connect("clicked", callback_save) 
   
hbox.pack_start(button, False)

# Zeige alle Widgets

window.show_all()

# Starte GUI

gtk.main()
