maj master
authorJuke <juke@free.fr>
Wed, 17 Mar 2010 11:35:25 +0000 (12:35 +0100)
committerJuke <juke@free.fr>
Wed, 17 Mar 2010 11:35:25 +0000 (12:35 +0100)
TODO
build_myapp.py
src/opt/masstransit/masstransit.cfg
src/opt/masstransit/masstransit.py

diff --git a/TODO b/TODO
index dde4ff9..ce4b411 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,44 +1,57 @@
 TODO : Intercepter les erreurs de Transilien.fr
-TODO : Intercepter les erreurs Reseaux
-TODO : Integrer python-conix
+
+
 TODO : Faire un  widget sur le bureau
 TODO : Integrer les bus RATP
 TODO : Integrer les prochains passage à une gare toute destination confondues
-TODO : Avoir la liste complete des gares dans un fichier
 TODO : Ecrire un parser python pour avoir la liste complete des gares.
 TODO : Afficher les horaires de passage aux differentes stations intermediaire.
 TODO : Integrer les RER RATP
 TODO : Sauvegarder les derniers choix
 TODO : Gerer l'autocompletion des champs
-TODO : Faire un bouton Retour
 TODO : Possibilité de bookmarker des trajets
-TODO : Faire un .deb
 TODO : Trouver une icone
-TODO : Remplacer liste des gares par un assesseur
-TODO : Remplacer get_liste_train par un assesseur
-TODO : Remplacer get_liste_horaire par un assesseur
-TODO : Remplacer get_list_ligne_horaire par un assesseur
-TODO : Trier les gares par ordre alphabetique
-TODO : Intercepter les entrées vides
 TODO : ajouter les argument à l'url avec httplib
-TODO : ajouter les quais
-TODO : ajouter les terminus
-TODO : enlever les print de debug
-TODO : corriger les noms des variables
 TODO : corriger la taille des lignes
 TODO : Fusionner liste horaire et liste train
 TODO : etre ok sur pylint
-TODO : faire des try sur les import
-TODO : documenter les classes
 TODO : Ajouter les signatures au paquet
 TODO : Faire passer le paquet dans testing
+TODO : Faire une methode get_combo_source
+TODO : essayer de supprimer curseur_horaire
+TODO : faire une interface QT
+TODO : faire une interface texte
+TODO : Mettre le changelog dans les paquets
+TODO : DIVISE refresh_treestore en parse et affiche
+TODO : ne tenter de se connecter que si il est deco
+
+ABANDONNE : remplacer les horizontal box par GtkHButtonBox -> mauvais rendu
+
+
 
-DONE 0.1.1 : Modélisation Objet
-DONE 0.1.2 : Corriger l'indentation
-DONE 0.1.3 : Faire un objet ListeHoraire
-DONE 0.1.4 : Faire un .deb
-DONE 0.1.5 : transformer example.cfg en masstransit.cfg
-DONE 0.1.6 : mettre les chemin par rapport à /opt/masstransit/
-DONE 0.7.1 : correction d'un bug de chemin + changement numerotation
-DONE 0.8.0 : corriger le deb (lanceur + chmod)
-DONE 0.8.1 : ajouter Gpodder en dependance
+DONE 0.1.1     : Modélisation Objet
+DONE 0.1.2     : Corriger l'indentation
+DONE 0.1.3     : Faire un objet ListeHoraire
+DONE 0.1.4     : Faire un .deb
+DONE 0.1.5     : transformer example.cfg en masstransit.cfg
+DONE 0.1.6     : mettre les chemin par rapport à /opt/masstransit/
+DONE 0.7.1     : correction d'un bug de chemin + changement numerotation
+DONE 0.8.0     : corriger le deb (lanceur + chmod)
+DONE 0.8.1     : ajouter Gpodder en dependance
+DONE 0.9.0     : Avoir la liste complete des gares dans un fichier
+DONE 0.10.0 : Trier les gares par ordre alphabetique
+DONE 0.11.0 : Remplacer get_list_ligne_horaire par un assesseur
+DONE 0.12.0 : enlever les print de debug
+DONE 0.13.0 : corriger les noms des variables
+DONE 0.14.0 : faire des try sur les import
+DONE 0.15.0    : documenter les classes
+DONE 0.16.0 : Faire une methode list_ligne_horaire_to_treestore
+DONE 0.17.0 : Intercepter les entrées vides
+DONE 0.18.0 : ajouter les quais
+DONE 0.19.0 : ajouter les terminus
+DONE 0.19.1 : enlever les print de debug
+DONE 0.20.0 : regler le problème de la casse pour la liste des gares
+DONE 0.21.0 : Faire un bouton Retour
+DONE 0.21.1 : documenter les classes
+DONE 0.22.0 : Intercepter les erreurs Reseaux
+DONE 0.23.0 : Integrer python-conix
index c0a38ec..66f0157 100644 (file)
@@ -37,7 +37,7 @@ if __name__ == "__main__":
        #  chmod +x /usr/bin/mclock.py""" #Set here your pre install script
        #  p.preremove="""#!/bin/sh
        #  chmod +x /usr/bin/mclock.py""" #Set here your pre remove script
-       version = "0.7.1"           #Version of your software, e.g. "1.2.0" or "0.8.2"
+       version = "0.20.0"           #Version of your software, e.g. "1.2.0" or "0.8.2"
        build = "1"                 #Build number, e.g. "1" for the first build of this version of your software. Increment for later re-builds of the same version of your software.
        #Text with changelog information to be displayed in the package "Details" tab of the Maemo Application Manager
        changeloginformation = "Fixed (large) icon." 
index b7d87ce..14e9dc9 100644 (file)
 [ListeDesGares]
-bibliotheque francois mitterand = BFM
-savigny sur orge  = SAO
-melun = MEL
-juvisy = JY
-gare de lyon = PAA
-chatelet = CLX
-villeneuve st georges = VSG
-le mee = WEE
+BAGNEAUX SUR LOING = BXN
+BOIS LE ROI = BJR
+BOURRON MARLOTTE GREZ = BOM
+BOUSSY ST ANTOINE = BXI
+BRUNOY = BNY
+CESSON = CES
+CHANTILLY GOUVIEUX = CLY
+CHATELET LES HALLES = CLX
+COMBS LA VILLE QUINCY = CBV
+CORBEIL ESSONNES = COE
+CREIL = CL
+DORDIVES = DDI
+EVRY = EVR
+EVRY COURCOURONNES = EVC
+FERRIERES FONTENAY = FFY
+FONTAINEBLEAU AVON = FON
+GARE DU NORD = GDS
+GARGES SARCELLES = GAJ
+GOUSSAINVILLE = GOU
+GRAND BOURG = GBG
+GRIGNY CENTRE = GGG
+JUVISY = JY
+LA BORNE BLANCHE = BBN
+LE BRAS DE FER = BFX
+LE MEE = WEE
+LE VERT DE MAISONS = VD
+LES NOUES = LNX
+LIEUSAINT MOISSY = LIU
+LOUVRES = LOV
+MAISONS ALFORT ALFORTVILLE = MFA
+MELUN = MEL
+MONTARGIS = MS
+MONTEREAU = MTU
+MONTGERON CROSNE = KRW
+MONTIGNY SUR LOING = MKN
+MORET VENEUX LES SABLONS = MOR
+NEMOURS ST PIERRE = NSP
+ORANGIS BOIS DE L EPINE = OBP
+ORRY LA VILLE COYE LA FORET = ORY
+PIERREFITTE STAINS = PRF
+RIS ORANGIS = RIS
+SAVIGNY LE TEMPLE NANDY = ZTN
+SOUPPES CHÂTEAU LANDON = SPP
+ST DENIS = SDE
+ST MAMMES = SF
+STADE DE FRANCE ST DENIS = SFD
+SURVILLIERS FOSSES = SUR
+THOMERY = TMR
+VIGNEUX SUR SEINE = VGS
+VILLENEUVE PRAIRIE = VP
+VILLENEUVE ST GEORGES = VSG
+VILLENEUVE TRIAGE = VTV
+VILLIERS LE BEL GONESSE ARNOUVILLE = VIB
+VIRY CHATILLON = VWC
+YERRES = YES
+ARGENTEUIL = ARW
+AUBERGENVILLE ELISABETHVILLE = AEH
+BECON LES BRUYERES = BEC
+BOIS COLOMBES = BCO
+CHAVILLE RIVE DROITE = CWJ
+CLICHY LEVALLOIS = CLL
+COLOMBES = CBK
+CONFLANS SAINTE HONORINE = CSH
+CORMEILLES EN PARISIS = CPA
+COURBEVOIE = KOU
+EPONE MEZIERES = EPO
+ERAGNY NEUVILLE = ERA
+ERMONT EAUBONNE = ERE
+GARE ST LAZARE = PSL
+HERBLAY = HRY
+HOUILLES CARRIERES SUR SEINE = HAR
+LA DEFENSE GARE SNCF = LDU
+LA FRETTE MONTIGNY = FMY
+LA GARENNE COLOMBES = LGK
+LE STADE = LSD
+LE VAL D OR = VDO
+LES CLAIRIERES DE VERNEUIL = KVE
+LES MUREAUX = LMU
+LES VALLEES = LWA
+MAISONS LAFFITTE = MLF
+MANTES LA JOLIE = MTE
+MANTES STATION = MTQ
+MONTREUIL = MFL
+NANTERRE UNIVERSITE = NUN
+POISSY = PSY
+PONT CARDINET = PTC
+PONTOISE = PSE
+PUTEAUX = PTX
+SANNOIS = SNN
+SARTROUVILLE = SVL
+SEVRES VILLE D AVRAY = VDV
+ST CLOUD = SCD
+ST OUEN L AUMONE QUARTIER DE L EGLIS = XOA
+SURESNES MONT VALERIEN = MVH
+VAL D ARGENTEUIL = VDA
+VERNOUILLET VERNEUIL = VET
+VERSAILLES RIVE DROITE = VRD
+VILLENNES SUR SEINE = VSW
+VIROFLAY RIVE DROITE = VFD
+ABLON = ABL
+ARPAJON = ARP
+ATHIS MONS = ATH
+BIBLIOTHEQUE F. MITTERRAND = BFM
+BIEVRES = BIS
+BOULEVARD VICTOR = BVI
+BRETIGNY = BY
+BREUILLET BRUYERES LE CHATEL = BIH
+BREUILLET VILLAGE = BRW
+CHAMP DE MARS TOUR EIFFEL = CPM
+CHAVILLE VELIZY = CHV
+CHILLY MAZARIN = CAZ
+CHOISY LE ROI = CLR
+DOURDAN = D
+EGLY = ELY
+EPINAY SUR ORGE = EYO
+GRAVIGNY BALIZY = GBI
+IGNY = IGY
+INVALIDES = INV
+ISSY = ISY
+ISSY VAL DE SEINE = ISP
+IVRY SUR SEINE = IV
+JAVEL = JVL
+JOUY EN JOSAS = JAS
+LA NORVILLE ST GERMAIN LES ARPAJON = NG
+LES ARDOINES = LAD
+LONGJUMEAU = LJU
+MASSY PALAISEAU RER C = MPU
+MEUDON VAL FLEURY = MFY
+MUSEE D ORSAY = MDS
+PETIT JOUY LES LOGES = PJ
+PETIT VAUX = PV
+PONT DE L ALMA = PDM
+PORCHEFONTAINE = POA
+SAVIGNY SUR ORGE = SAO
+SERMAISE = SXE
+ST CHERON = SCW
+ST MICHEL NOTRE DAME = SHL
+ST MICHEL SUR ORGE = SHO
+STE GENEVIEVE DES BOIS = SXG
+VAUBOYEN = VBO
+VERSAILLES CHANTIERS = VC
+VERSAILLES R G CHATEAU DE VERSAILLES = VRG
+VILLENEUVE LE ROI = VRI
+VIROFLAY RIVE GAUCHE = VFG
+VITRY SUR SEINE = VY
+BOURAY = BSO
+CHAMARANDE = CHK
+ETAMPES = ETP
+ETRECHY = ETY
+GARE D'AUSTERLITZ = PZB
+LARDY = LYO
+MAROLLES EN HUREPOIX = MSX
+ST MARTIN D ETAMPES = SME
+CHAMPAGNE SUR SEINE = CME
+CHARTRETTES = CJR
+HERICY = HER
+LA GRANDE PAROISSE = GPA
+LIVRY SUR SEINE = LYQ
+VERNOU SUR SEINE = VSS
+VULAINES SUR SEINE SAMOREAU = VUN
+GARE DE LYON = PLY
+FONTAINE LE PORT = FPO
+CHANGIS ST JEAN = CJN
+CHATEAU THIERRY = CTH
+CHELLES GOURNAY = CSG
+CHEZY SUR MARNE = CYZ
+COULOMMIERS = CO
+ESBLY = EY
+FAREMOUTIERS POMMEUSE = FMP
+GUERARD LA CELLE SUR MORIN = GCM
+LA FERTE SOUS JOUARRE = LFJ
+LAGNY THORIGNY = LGY
+MARLES EN BRIE = MLB
+MEAUX = MEA
+MORTCERF = MOF
+MOUROUX = MXK
+NANTEUIL SAACY = NAU
+NOGENT L ARTAUD CHARLY = NAA
+TOURNAN = TOU
+TRILPORT = TLP
+VAIRES TORCY = VAI
+ASNIERES = AEE
+AUBER = AUU
+BRY SUR MARNE = BQA
+BUSSY ST GEORGES = BXG
+CHARLES DE GAULLE-ETOILE = CGP
+GARE DE LYON = GYN
+LA DEFENSE RER A = GAW
+LOGNES = LQN
+MARNE LA VALLEE CHESSY = MVC
+NANTERRE PREFECTURE SNCF = NAF
+NATION = NTN
+NEUILLY PLAISANCE = NYP
+NOISIEL = NSL
+NOISY CHAMPS = NYC
+NOISY LE GRAND MONT D EST = NYG
+TORCY MARNE LA VALLEE = TOC
+VAL D EUROPE = VDE
+VAL DE FONTENAY RER A = VFR
+VINCENNES = VNC
+CERGY LE HAUT = CJV
+CERGY PREFECTURE = CYP
+CERGY ST CHRISTOPHE = CYC
+CONFLANS FIN D OISE = CFD
+NEUVILLE UNIVERSITE = NUE
+AEROPORT CDG 2 TGV = RYR
+ANTONY = ATW
+AUBERVILLIERS LA COURNEUVE = ALC
+AULNAY SOUS BOIS = AB
+BLANC MESNIL = BAM
+BOURG LA REINE = BQQ
+BURES SUR YVETTE = BVJ
+CITE UNIVERSITAIRE = CUF
+COURCELLE SUR YVETTE = CVW
+DENFERT ROCHEREAU = DFR
+DRANCY = DRN
+FONTAINE MICHALON = FMN
+GIF SUR YVETTE = GIF
+LA CROIX DE BERNY = XBY
+LA HACQUINIERE = HAQ
+LA PLAINE STADE DE FRANCE = LPN
+LE BOURGET = LBT
+LE GUICHET = GUW
+LES BACONNETS = BQC
+LOZERE = LZV
+LUXEMBOURG = LXJ
+MASSY PALAISEAU RER B = MP
+MASSY VERRIERES RER B = MVP
+ORSAY VILLE = ORS
+PALAISEAU = PAX
+PALAISEAU VILLEBON = PAW
+PARC DE SCEAUX = PCX
+PARC DES EXPOSITIONS = PEX
+PORT ROYAL = PWR
+SEVRAN BEAUDOTTES = BDE
+ST MICHEL NOTRE DAME = XND
+ST REMY LES CHEVREUSE = SNM
+VILLEPINTE = VPN
+AEROPORT CDG 1 = RSY
+ARCUEIL CACHAN = ARK
+BAGNEUX = BGK
+GENTILLY = GTL
+LAPLACE = LJA
+CHANTELOUP LES VIGNES = CVF
+GARGENVILLE = GGV
+ISSOU PORCHEVILLE = IPO
+JUZIERS = JUZ
+LIMAY = LIM
+MEULAN HARDRICOURT = MHD
+THUN LE PARADIS = TPA
+TRIEL SUR SEINE = TSS
+VAUX SUR SEINE = VXS
+FONTENAY AUX ROSES = FNR
+MITRY CLAYE = MY
+ROBINSON = RNS
+SCEAUX = SKX
+SEVRAN LIVRY = SEV
+VERT GALANT = VGL
+VILLEPARISIS MITRY LE NEUF = VII
+BOUFFEMONT MOISSELLES = BOF
+DEUIL MONTMAGNY = DEU
+DOMONT = DMO
+ECOUEN EZANVILLE = ECZ
+EPINAY VILLETANEUSE = EPV
+GARE DU NORD = PNB
+GROSLAY = GRL
+LUZARCHES = LUZ
+MONTSOULT MAFFLIERS = MSO
+SARCELLES ST BRICE = SLL
+SEUGY = SWY
+VIARMES = VMS
+VILLAINES = VW
+CHARTRES = CH
+CHAVILLE RIVE GAUCHE = CVI
+CLAMART = CMA
+COIGNIERES = CGW
+DREUX = DX
+EPERNON = EPN
+FONTENAY LE FLEURY = FAF
+GARANCIERES LA QUEUE = GAQ
+GAZERAN = GZA
+HOUDAN = HOA
+JOUY = JOY
+LA VERRIERE = VYL
+LE PERRAY = LPE
+LES ESSARTS LE ROI = LSI
+MAINTENON = MTN
+MARCHEZAIS BROUE = MBR
+MEUDON = MDN
+MONTFORT L AMAURY MERE = MLM
+ORGERUS BEHOUST = OGB
+PARIS MONTPARNASSE = PMP
+PLAISIR GRIGNON = PG
+PLAISIR LES CLAYES = PIE
+RAMBOUILLET = RBT
+SEVRES RIVE GAUCHE = SVR
+ST CYR = SCR
+ST PIAT = SPI
+ST QUENTIN EN YVELINES = SQY
+TACOIGNIERES RICHEBOURG = TAE
+TRAPPES = TVO
+VANVES MALAKOFF = VMK
+VILLEPREUX LES CLAYES = VEP
+VILLIERS NEAUPHLE PONTCHARTRAIN = VEH
+CHAMP DE COURSES D ENGHIEN = CEG
+CHAMPAGNE SUR OISE = CPO
+ENGHIEN LES BAINS = EN
+ERMONT EAUBONNE = ERT
+ERMONT HALTE = ERM
+FREPILLON = FPN
+GROS NOYER ST PRIX = GNX
+L ISLE ADAM PARMAIN = IAP
+LA BARRE ORMESSON = LBJ
+MERIEL = MLV
+MERY SUR OISE = MWO
+PERSAN BEAUMONT = PEB
+ST LEU LA FORET = SLF
+TAVERNY = TVY
+VALMONDOIS = VMD
+VAUCELLES = VCX
+MAREIL SUR MAULDRE = MJM
+MAULE = MAE
+NEZEL AULNAY = NZL
 
index e516fe6..5ae9447 100755 (executable)
 #!/usr/bin/python
-import pygtk
-pygtk.require("2.0")
-import gtk
+# -*- coding: utf-8 -*-
+"affichage des horaires de train"
+
+
+
 import urllib2
 import HTMLParser
-import hildon
 import ConfigParser
+import errno
+import conic
+
+
+magic = 0xAA55
 
-from portrait import FremantleRotation
+try:
+    import hildon
+except ImportError: 
+    raise ImportError("erreur d'importation de hildon")
 
-#main_window = mainWindow # your main hildon.StackableWindow
-app_name = 'NameOfYourApp' # the name of your app
-app_version = '1.0' # the version number of your app
-initial_mode = FremantleRotation.AUTOMATIC
+try :
+    from portrait import FremantleRotation
+except ImportError: 
+    raise ImportError("erreur d'importation de portrait")
+
+try :
+    import gtk
+except ImportError: 
+    raise ImportError("erreur d'importation de gtk")
+
+try : 
+    import pygtk
+except ImportError: 
+    raise ImportError("erreur d'importation de pygtk")
+    
+pygtk.require("2.0")
 
 class LigneHoraire(object):
-    def __init__(self, code_mission, heure_de_passage):
-        self.code_mission = code_mission
-        self.heure_de_passage = heure_de_passage
+    "une ligne code_mission | heure_de_passage"
+    def __init__(self, code_mission, heure_de_passage, destination, voie):
+        self.__code_mission = code_mission
+        self.__heure_de_passage = heure_de_passage
+        self.__destination = destination
+        self.__voie = voie
     
     def add_to_treestore(self, treestore):
-        print treestore
-        treestore.append(None, [self.code_mission, self.heure_de_passage])
+        "ajoute la ligne à un treestore"
+        treestore.append(None, [self.__code_mission, self.__heure_de_passage, self.__destination, self.__voie])
     
     
 
-class tableParser(HTMLParser.HTMLParser):
+class TableParser(HTMLParser.HTMLParser):
+    "Parse les tableaux html contenant les horaires"
     def __init__(self):
         HTMLParser.HTMLParser.__init__(self)
-        self.table_horaires3 = False
-        self.code_de_mission = False
-        self.a_code_de_mission = False
-        self.heure_de_passage = False
-        self.liste_train = []
-        self.liste_horaire = []
-        self.list_ligne_horaire = []
+        self.__table_horaires3 = False
+        self.__code_de_mission = False
+        self.__a_code_de_mission = False
+        self.__heure_de_passage = False
+        self.__destination = False
+        self.__voie = False
+        self.__liste_train = []
+        self.__liste_horaire = []
+        self.__liste_destination = []
+        self.__liste_voie = []
+        
         
     def handle_starttag(self, tag, attrs):
+        "execute a chaque balise ouvrante"
         if (tag == 'table' and (dict(attrs)['class'] == 'horaires3')):
-            self.table_horaires3 = True
+            self.__table_horaires3 = True
         
-        elif self.table_horaires3 and tag == 'td':
+        elif self.__table_horaires3 and tag == 'td':
             try:
-                self.code_de_mission = (
+                self.__code_de_mission = (
                     dict(attrs)['headers'] == 'Code_de_mission')
-                self.heure_de_passage = (
+                self.__heure_de_passage = (
                     dict(attrs)['headers'] == 'Heure_de_passage')
+                self.__destination = (
+                    dict(attrs)['headers'] == 'Destination')
+                self.__voie = (
+                    dict(attrs)['headers'] == 'Voie')
             except KeyError:
                 if dict(attrs).has_key('headers'):
                     raise
                 else:
                     pass
         else:
-            self.a_code_de_mission = (tag == 'a' and self.code_de_mission)
+            self.__a_code_de_mission = (tag == 'a' and self.__code_de_mission)
         
     def handle_data(self, data):
-        if self.a_code_de_mission:
-            self.liste_train.append(data.strip())
-        if self.heure_de_passage:
-            self.liste_horaire.append(data.strip())
+        "execute pour chaque contenu de balise"
+        if self.__a_code_de_mission:
+            self.__liste_train.append(data.strip())
+        if self.__heure_de_passage:
+            self.__liste_horaire.append(data.strip())
+        if self.__destination:
+            self.__liste_destination.append(data.strip())
+        if self.__voie:
+            self.__liste_voie.append(data.strip())
             
-    def handle_endtag(self,tag):
-        self.a_code_de_mission ^= (self.a_code_de_mission and tag == 'a')
-        self.heure_de_passage ^= (self.heure_de_passage and tag == 'td')
-    
-    def get_list_ligne_horaire(self):
-        print 'get_list_ligne_horaire'
-        z = 0
-        print self.liste_train
-        for i in self.liste_train:
-            self.list_ligne_horaire.append(LigneHoraire(code_mission=i, heure_de_passage=self.liste_horaire[z]))
-            z += 1
-        return self.list_ligne_horaire
+    def handle_endtag(self, tag):
+        "execute à chaque balise fermante"
+        self.__a_code_de_mission ^= (self.__a_code_de_mission and tag == 'a')
+        self.__heure_de_passage ^= (self.__heure_de_passage and tag == 'td')
+        self.__destination ^= (self.__destination and tag == 'td')
+        self.__voie ^= (self.__voie and tag == 'td')
     
     
+    @property
+    def __list_ligne_horaire(self):
+        "getter"
+        __list_ligne_horaire = []
+        __curseur_horaire = 0
+        for __i in self.__liste_train:
+            __list_ligne_horaire.append(LigneHoraire(
+                code_mission=__i, 
+                heure_de_passage=self.__liste_horaire[__curseur_horaire],
+                destination=self.__liste_destination[__curseur_horaire],
+                voie=self.__liste_voie[__curseur_horaire]
+                ))
+            __curseur_horaire += 1
+        return __list_ligne_horaire
+
+    def fill_treestore(self, treestore):
+        "remlpli le treestore avec les resultats"
+        for __i in self.__list_ligne_horaire:
+            __i.add_to_treestore(treestore)
+
+def connection_cb(connection, event, magic):
+    print "connection_cb(%s, %s, %x)" % (connection, event, magic)
+    print event.get_status()
 
 class Trajet(object):
+    "trajet d'une gare source à une gare_dest"
     def __init__(self, gare_source, gare_dest):
-        self.gare_source = gare_source
-        self.gare_dest = gare_dest
-        self.parse() 
-    def get_liste_train(self):
-        return self.p.liste_train 
-    def get_liste_horaire(self): 
-        return self.p.liste_horaire
-    def parse(self):
-        self.p = tableParser()
-        #print "URL:" 
-        #print 'http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.gare_source.shortname+'&codeTr3aDest='+self.gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true'
-        rsrc = urllib2.urlopen('http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.gare_source.shortname+'&codeTr3aDest='+self.gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true')
-        self.p.feed(rsrc.read())
-        print "parsing ok"
+        self.__gare_source = gare_source
+        self.__gare_dest = gare_dest
         
     def refresh_treestore(self, treestore):
-        print 'refresh'
-        print treestore
-        
+        "met à jour les horaires d'un trajet"
         treestore.clear()
-        liste_ligne_horaire = self.p.get_list_ligne_horaire()
-        print liste_ligne_horaire
-        for i in liste_ligne_horaire:
-            print i
-            i.add_to_treestore(treestore)
+        __parser = TableParser()
+        __parser.feed(urllib2.urlopen('http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.__gare_source.shortname+'&codeTr3aDest='+self.__gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true').read())
+        __parser.fill_treestore(treestore)
+
 
 class ConfFile(object):
+    "fichier contenant les gares"
     def __init__(self, fichier):
-        self.c = ConfigParser.ConfigParser()
-        self.c.read(fichier)
-    def get_short_name(self, longname):
-        return self.c.get('ListeDesGares', longname)
-    def get_liste_des_gares(self):
-        return self.c.items('ListeDesGares') 
+        self.config = ConfigParser.ConfigParser()
+        self.config.read(fichier)
+        
 
 class LongNameGare(object):
+    "nom long d'une gare"
     def __init__(self, longname):
-        self.longname = longname
+        self.__longname = longname
     def get_gare(self, conffile):
-        short_name = conffile.get_short_name(self.longname)
-        return Gare(short_name)
+        "retourne une gare à partir d'un nom long"
+        return Gare(conffile.config.get('ListeDesGares', self.__longname))
 
 class Gare(object):
+    "gare"
     def __init__(self, shortname):
         self.shortname = shortname
 
-
-
-
 class TransilienUI:
+    "interface hildon"
     def __init__(self):
-        mainWindow = hildon.Window()
-        mainWindow.set_title("Horaires des Prochains Trains")
-        mainWindow.connect("destroy", self.on_mainWindow_destroy)
+        self.main_window = hildon.Window()
+        self.main_window.set_title("Horaires des Prochains Trains")
+        self.main_window.connect("destroy", self.on_main_window_destroy)
 
-        rotation_object = FremantleRotation(app_name, mainWindow, app_version, initial_mode)
-        refreshButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
-                              hildon.BUTTON_ARRANGEMENT_HORIZONTAL, "Actualiser")
-        refreshButton.connect("clicked", self.on_refreshButton_clicked)
+        rotation_object = FremantleRotation(
+            'NameOfYourApp', 
+            self.main_window, 
+            '1.0', 
+            FremantleRotation.AUTOMATIC
+            )
+        
+        refresh_button = hildon.Button(
+            gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, 
+            hildon.BUTTON_ARRANGEMENT_HORIZONTAL, 
+            "Actualiser"
+            )
+        retour_button = hildon.Button(
+            gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, 
+            hildon.BUTTON_ARRANGEMENT_HORIZONTAL, 
+            "Retour"
+            )
+        refresh_button.connect("clicked", self.on_refresh_button_clicked)
+        retour_button.connect("clicked", self.on_retour_button_clicked)
 
-        self.treestore = gtk.TreeStore(str, str)
+        self.treestore = gtk.TreeStore(str, str, str, str)
         self.treeview = gtk.TreeView(self.treestore)
 
-        self.tvcolumn_train = gtk.TreeViewColumn('Train', gtk.CellRendererText(), text=0)
-        self.treeview.append_column(self.tvcolumn_train)
+        self.treeview.append_column(
+            gtk.TreeViewColumn( 
+                'Train', 
+                gtk.CellRendererText(), 
+                text=0
+            ))
         
-        self.tvcolumn_horaire = gtk.TreeViewColumn('Horaire', gtk.CellRendererText(), text=1)
-        self.treeview.append_column(self.tvcolumn_horaire)
+        self.treeview.append_column(
+            gtk.TreeViewColumn(
+                'Horaire', 
+                gtk.CellRendererText(), 
+                text=1
+            ))
+            
+        self.treeview.append_column(
+            gtk.TreeViewColumn(
+                'Destination', 
+                gtk.CellRendererText(), 
+                text=2
+            ))
+        self.treeview.append_column(
+            gtk.TreeViewColumn(
+                'Voie', 
+                gtk.CellRendererText(), 
+                text=3
+            ))
 
 
-        picker_button_source = hildon.PickerButton(gtk.HILDON_SIZE_AUTO,                            hildon.BUTTON_ARRANGEMENT_VERTICAL)
-        picker_button_source.set_title("Gare de Depart")
+        
+        
         self.combo_source = hildon.TouchSelectorEntry(text=True)
         self.combo_dest = hildon.TouchSelectorEntry(text=True)
 
-        for i in ConfFile('/opt/masstransit/masstransit.cfg').get_liste_des_gares():
-            self.combo_source.append_text(i[0])
-            self.combo_dest.append_text(i[0])
-        picker_button_source.set_selector(self.combo_source)
+        liste = ConfFile('/opt/masstransit/masstransit.cfg').config.items('ListeDesGares')
+        liste.sort()
+        for i in liste:
+            self.combo_source.append_text(i[0].capitalize())
+            self.combo_dest.append_text(i[0].capitalize())
         
-
-        picker_button_dest = hildon.PickerButton(gtk.HILDON_SIZE_AUTO,                            hildon.BUTTON_ARRANGEMENT_VERTICAL)
+        picker_button_source = hildon.PickerButton(
+            gtk.HILDON_SIZE_AUTO, 
+            hildon.BUTTON_ARRANGEMENT_VERTICAL)
+        
+        picker_button_dest = hildon.PickerButton(
+            gtk.HILDON_SIZE_AUTO, 
+            hildon.BUTTON_ARRANGEMENT_VERTICAL
+            )
+        
+        picker_button_source.set_title("Gare de Depart")
         picker_button_dest.set_title("Gare d'arrivee")
-        picker_button_dest.set_selector(self.combo_dest)
         
-        vBox = gtk.VBox()
-        hBox = gtk.HBox()
-        vBox.pack_start(hBox)
-        hBox.pack_start(picker_button_source)
-        hBox.pack_start(picker_button_dest)
-        vBox.pack_start(self.treeview)
-        vBox.pack_start(refreshButton)
+        picker_button_source.set_selector(self.combo_source)
+        picker_button_dest.set_selector(self.combo_dest)
         
+        vertical_box = gtk.VBox()
+        horizontal_box = gtk.HBox()
+        vertical_box.pack_start(horizontal_box)
+        horizontal_box.pack_start(picker_button_source)
+        horizontal_box.pack_start(picker_button_dest)
+        horizontal_box.pack_start(retour_button)
+        vertical_box.pack_start(self.treeview)
+        vertical_box.pack_start(refresh_button)
 
-        mainWindow.add(vBox)
-        mainWindow.show_all()
+        self.main_window.add(vertical_box)
+        self.main_window.show_all()
 
-    def on_mainWindow_destroy(self, widget):
+    def on_main_window_destroy(self, widget):
+        "quitte l'application à la fermeture de la fenetre"
         gtk.main_quit()
 
-    def on_refreshButton_clicked(self, widget):
+    
+    def on_retour_button_clicked(self, widget):
+        "le bouton retour est clicked"
+        col_source = self.combo_source.get_active(0)
+        col_dest = self.combo_dest.get_active(0)
+        self.combo_source.set_active(0, col_dest)
+        self.combo_dest.set_active(0, col_source)
+        self.refresh()
+    
+    def on_refresh_button_clicked(self, widget):
+        "le bouton refresh est clicked"
+        self.refresh()
+    
+    def refresh(self):
+        "met a jour les horaires"
         conf = ConfFile('/opt/masstransit/masstransit.cfg')
-        gare_source = LongNameGare(self.combo_source.get_current_text()).get_gare(conf)
-        gare_dest = LongNameGare(self.combo_dest.get_current_text()).get_gare(conf)
-        trajet = Trajet(gare_source , gare_dest)
-        print trajet
-        print self.treestore
-        trajet.refresh_treestore(self.treestore)
-
-
+        try :
+            gare_source = LongNameGare(self.combo_source.get_current_text()).get_gare(conf)
+        except AttributeError:
+            if self.combo_source.get_current_text() is None:
+                gtk.Dialog.run(hildon.hildon_note_new_information(self.main_window, "Vous devez remplir la gare source"))
+            else:
+                raise
+        else:
+            try :
+                gare_dest = LongNameGare(self.combo_dest.get_current_text()).get_gare(conf)     
+            except AttributeError:
+                if self.combo_dest.get_current_text() is None:
+                    gtk.Dialog.run(hildon.hildon_note_new_information(self.main_window, "Vous devez remplir la gare de destination"))
+                else:
+                    raise
+            else:
+                trajet = Trajet(gare_source , gare_dest)
+                try :
+                    trajet.refresh_treestore(self.treestore)
+                except urllib2.URLError, e:
+                    global magic
+                    connection = conic.Connection()
+                    connection.connect("connection-event", connection_cb, magic)
+                    connection.request_connection(conic.CONNECT_FLAG_NONE)
+                    trajet.refresh_treestore(self.treestore)
+                    
+        
 if __name__ == "__main__":
     TransilienUI()
     gtk.main()
+