some fixes
authorDaniel Martin Yerga <yerga@debian.(none)>
Tue, 12 May 2009 15:37:37 +0000 (17:37 +0200)
committerDaniel Martin Yerga <yerga@debian.(none)>
Tue, 12 May 2009 15:37:37 +0000 (17:37 +0200)
TODO
changelog
markets/tsx [new file with mode: 0644]
stockthis.py

diff --git a/TODO b/TODO
index e72b2f2..1c8e381 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,5 +1,10 @@
  * Sort markets for countries.
- * Add favorites and create favorites view.
+ * Add favorites and create favorites view (portfolios). -> refresh automatically
+ * Indexes for markets.
+ * Currencies.
+ * Improve the alignment of the labels in quotes view.
+ * Improve the font size in Companies view.
+
 
 ftse350 UK
 
@@ -79,7 +84,3 @@ http://finance.yahoo.com/q/cp?s=^GSPTSE
 
 S&P CNX NIFTY (^NSEI) 50 India
 http://es.finance.yahoo.com/q/cp?s=^NSEI
-
-
-
-
index 96a937d..6295da3 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,8 +1,16 @@
+2009-05-09  Daniel Martín Yerga  <dyerga@gmail.com>
+
+    * stockthis.py: Show error if fails to get internet data.
+    Rename Components to Companies.
+
+2009-05-02  Daniel Martín Yerga  <dyerga@gmail.com>
+
+    * stockthis.py: Added grid lines to the components treeview.
+
 2009-05-01  Daniel Martín Yerga  <dyerga@gmail.com>
 
-    * marketdata.py: Added mibtel
+    * marketdata.py: Added mibtel, ftse250 markets.
 
 2009-04-30  Daniel Martín Yerga  <dyerga@gmail.com>
 
-    * Release 0.1 
-    
+    * Release 0.1
diff --git a/markets/tsx b/markets/tsx
new file mode 100644 (file)
index 0000000..dcb6e0e
--- /dev/null
@@ -0,0 +1,208 @@
+ABX.TO BARRICK GOLD CORP COM NPV       39.13 May 8     Up 0.58 (1.50%) 4,547,656
+ACM-A.TO       ASTRAL MEDIA INC CLASS'A'NON-VT 30.00 May 8     Down 0.26 (0.86%)       127,401
+ACO-X.TO       ATCO LTD CLASS I NON-VOTING COM 35.35 May 8     Down 0.35 (0.98%)       56,390
+AEM.TO AGNICO EAGLE MINES COM NPV      57.22 May 8     Up 1.12 (2.00%) 941,214
+AER.TO AEROPLAN INCOME FD      9.02 May 8      Up 0.27 (3.09%) 726,526
+AET-UN.TO      ARC ENERGY TRUST TRUST UNITS    17.40 May 8     Up 0.79 (4.76%) 1,628,693
+AGF-B.TO       AGF MANAGEMENT LTD CLASS'B'NON- 13.05 May 8     Up 0.50 (3.98%) 218,905
+AGI.TO ALAMOS GOLD INC COM NPV 8.25 May 8      Down 0.12 (1.43%)       492,555
+AGU.TO AGRIUM INC COM NPV      52.00 May 8     Down 0.46 (0.88%)       1,028,580
+ALA-UN.TO      ALTAGAS INCOME TST TRUST UNITS  16.23 May 8     Up 0.53 (3.38%) 417,418
+ARE.TO AECON GROUP INC. COM NPV        11.82 May 8     Down 0.14 (1.17%)       339,422
+ARZ.TO AURIZON MINES COM NPV   4.80 May 8      Up 0.21 (4.58%) 446,280
+ATD-B.TO       ALIMENTATION COUCHE-TARD INC    13.58 May 8     Up 0.18 (1.34%) 249,599
+AVN-UN.TO      ADVANTAGE ENERGY I TRUST UNITS  4.20 May 8      Up 0.21 (5.26%) 804,537
+AXC.TO ADDAX PETROLEUM COM NPV 38.15 May 8     Up 4.37 (12.94%)        883,743
+BA-UN.TO       BELL ALIANT REGIONAL COMM INC F 24.18 May 8     Down 0.02 (0.08%)       167,131
+BAM-A.TO       BROOKFIELD ASSET MGMT INC       21.22 May 8     Up 1.05 (5.21%) 1,121,243
+BBD-B.TO       BOMBARDIER INC CLASS'B'S/VTG NP 4.16 May 8      Up 0.12 (2.97%) 8,797,732
+BCE.TO BCE INC COM NPV 24.67 May 8     Down 0.23 (0.92%)       4,635,476
+BEI-UN.TO      BOARDWALK R/EST IN TRUST UNITS  30.43 May 8     Up 1.11 (3.79%) 103,884
+BFC.TO BFI CANADA LTD  11.90 May 8     Up 0.26 (2.23%) 830,950
+BIR.TO BIRCHCLIFF ENERGY LTD   6.88 May 8      Up 0.22 (3.30%) 1,362,352
+BMO.TO BK OF MONTREAL COM NPV  44.70 May 8     Up 1.53 (3.54%) 2,285,097
+BNP-UN.TO      BONAVISTA ENERGY T TRUST UNITS  19.41 May 8     Up 0.91 (4.92%) 278,706
+BNS.TO BK OF NOVA SCOTIA COM NPV       37.66 May 8     Up 1.54 (4.26%) 3,033,259
+BPO.TO BROOKFIELD PROPERT COM NPV      9.84 May 8      Up 0.43 (4.57%) 973,437
+BTE-UN.TO      BAYTEX ENERGY TR        18.60 May 8     Up 0.79 (4.44%) 372,932
+BVF.TO BIOVAIL CORP COM NPV    13.08 May 8     Up 0.92 (7.57%) 1,659,974
+CAE.TO CAE INC COM NPV 8.28 May 8      Up 0.33 (4.15%) 322,969
+CAR-UN.TO      CANADIAN APT PPTYS REAL ESTA    12.75 May 8     0.00 (0.00%)    174,345
+CCA.TO COGECO CABLE INC        29.25 May 8     Down 0.39 (1.32%)       137,657
+CCL-B.TO       CCL INDUSTRIES INC 'B'NON-VTG C 23.00 May 8     Down 1.55 (6.31%)       797,922
+CCO.TO CAMECO CORP COM NPV     29.69 May 8     Up 0.51 (1.75%) 1,065,167
+CFP.TO CANFOR CORPORATION COM NPV      6.58 May 8      Up 0.23 (3.62%) 125,628
+CGX-UN.TO      CINEPLEX GALAXY IN SBI NPV      15.24 May 8     Up 0.02 (0.13%) 111,256
+CIX.TO CI FINL INC     17.55 May 8     Up 1.10 (6.69%) 717,635
+CJR-B.TO       CORUS ENTERTAINMNT CLASS 'B' NO 16.34 May 8     Up 0.53 (3.35%) 171,920
+CLC-UN.TO      CML HLTHCARE INC UNITS  13.50 May 8     Up 0.20 (1.50%) 171,331
+CLS.TO CELESTICA INC. SV       7.26 May 8      Down 0.11 (1.49%)       653,858
+CM.TO  CANADIAN IMP BANK COM NPV       61.19 May 8     Up 2.24 (3.80%) 1,506,395
+CNQ.TO CDN NAT RES COM NPV     63.44 May 8     Up 3.10 (5.14%) 3,260,549
+CNR.TO CDN NATL RAILWAYS COM NPV       49.20 May 8     Down 0.36 (0.73%)       1,139,984
+COM.TO CARDIOME PHARMA CO COM NPV      5.18 May 8      Up 0.16 (3.19%) 117,493
+COS-UN.TO      CANADIAN OIL SANDS TRUST UNITS  29.90 May 8     Up 1.55 (5.47%) 1,680,617
+CP.TO  CAN PACIFIC RYS COM NPV 44.82 May 8     Up 1.00 (2.28%) 701,252
+CPG-UN.TO      CRESCENT PT ENERGY TR   30.00 May 8     Up 0.39 (1.32%) 972,385
+CR.TO  CREW ENERGY INC 6.74 May 8      Up 0.42 (6.65%) 1,141,462
+CSH-UN.TO      CHARTWELL SENIORS TRUST UNITS   5.00 May 8      Up 0.28 (5.93%) 402,879
+CTC-A.TO       CANADIAN TIRE CORP LTD CL A NV  50.42 May 8     Up 0.02 (0.04%) 241,306
+CU.TO  CDN UTILITIES CLASS'A'COM NON-V
+CUF-UN.TO      COMINAR REAL ESTAT TRUST UNITS  14.69 May 8     Up 0.08 (0.55%) 185,939
+CWB.TO CDN WESTERN BANK COM NPV        14.27 May 8     Up 0.07 (0.49%) 311,988
+CWI-UN.TO      CONSUMERS' WATERHE TRUST UNITS  6.90 May 8      Down 0.10 (1.43%)       219,181
+CWT-UN.TO      CALLOWAY REAL ESTA TRUST UNITS  13.05 May 8     Up 0.95 (7.85%) 605,850
+DAY-UN.TO      DAYLIGHT RESOURCES COM NPV      7.80 May 8      Up 0.26 (3.45%) 1,513,186
+DC-A.TO        DUNDEE CORPORATION 'A'SUB-VTG N 7.28 May 8      Up 0.50 (7.37%) 146,563
+DHF-UN.TO      DAVIS HENDERSON INCOME FD       14.09 May 8     Up 0.13 (0.93%) 196,289
+DII-B.TO       DOREL INDUSTRIES CLASS'B'SUB VT 22.75 May 8     Up 0.75 (3.41%) 73,222
+ECA.TO ENCANA CORP COM NPV     65.42 May 8     Up 4.10 (6.69%) 3,736,847
+EFX-UN.TO      ENERFLEX SYSTEMS I TRUST UNITS  11.15 May 8     Up 0.20 (1.83%) 98,788
+EGU.TO EURO GOLDFIELDS COM NPV 3.19 May 8      Up 0.07 (2.24%) 85,522
+ELD.TO ELDORADO GOLD CORP COM NPV      9.75 May 8      Down 0.30 (2.99%)       3,440,913
+EMA.TO EMERA INC COM NPV       19.96 May 8     Down 0.05 (0.25%)       163,557
+EMP-A.TO       EMPIRE CO CLASS'A'N/VTG COM NPV 47.50 May 8     Down 0.50 (1.04%)       124,910
+ENB.TO ENBRIDGE INC COM NPV    36.82 May 8     Down 0.60 (1.60%)       1,535,674
+EP-UN.TO       EPCOR POWER L.P. SBI NPV        13.67 May 8     Up 0.29 (2.17%) 120,974
+EQN.TO EQUINOX MINERALS COM NPV        2.58 May 8      Up 0.08 (3.20%) 4,205,460
+ERF-UN.TO      ENERPLUS RES FUND TRUST UNITS-S 27.20 May 8     Up 1.46 (5.67%) 660,229
+ESI.TO ENSIGN ENERGY SVS COM NPV       14.80 May 8     Up 0.64 (4.52%) 157,230
+EXE-UN.TO      EXTENDICARE REAL I TRUST UNITS  5.50 May 8      Up 0.25 (4.76%) 365,159
+FCE-UN.TO      FORT CHICAGO ENERG CL 'A' UNITS 7.28 May 8      Up 0.08 (1.11%) 2,078,685
+FFH.TO FAIRFAX FINL HLDGS SUB-VTG COM  323.10 May 8    Up 9.91 (3.16%) 40,400
+FGL.TO FORZANI GROUP CLASS'A'COM NPV
+FM.TO  1ST QUANTUM MINLS COM NPV
+FNV.TO FRANCO NEVADA CORP COM NPV
+FNX.TO FNX MINING CO INC COM NPV
+FRU-UN.TO      FREEHOLD ROYALTY T TRUST UNITS
+FSV.TO FIRSTSERVICE CORP SUB-VTG COM N
+FTS.TO FORTIS INC COM NPV
+FTT.TO FINNING INTL INC COM NPV
+G.TO   GOLDCORP INC COM NPV
+GAM.TO GAMMON GOLD INC COM NPV
+GIB-A.TO       CGI GROUP INC CL A SV
+GIL.TO GILDAN ACTIVEWEAR COM NPV
+GNA.TO GERDAU AMERISTEEL CORP
+GWO.TO GREAT WEST LIFECO COM NPV
+HBM.TO HUDBAY MINERALS IN COM NPV
+HCG.TO HOME CAPITAL GROUP COM NPV
+HPX.TO HIGHPINE OIL & GAS COM NPV
+HR-UN.TO       H&R REAL ESTATE INVT TR
+HSE.TO HUSKY ENERGY INC COM NPV
+HTE-UN.TO      HARVEST ENERGY TR TRUST UNITS
+IAG.TO INDL ALLIANCE INS COM NPV
+IGM.TO IGM FINANCIAL INC COM NPV
+IIC.TO ING CANADA INC COM NPV
+IMG.TO IAMGOLD CORP COM NPV
+IMN.TO INMET MINING CORP COM NPV
+IMO.TO IMPERIAL OIL COM NPV
+INN-UN.TO      INNVEST REAL ESTAT TRUST UNITS
+IPL-UN.TO      INTER PIPELINE FD CLASS'A'LTD P
+IVN.TO IVANHOE MINES COM NPV
+JAZ-UN.TO      JAZZ AIR INCOME FD TRUST UNITS
+K.TO   KINROSS GOLD CORP
+KEY-UN.TO      KEYERA FACILITIES TRUST UNITS
+KHD.TO CANADIAN HYDRO DEV COM NPV
+L.TO   LOBLAWS COS LTD COM NPV
+LB.TO  LAURENTIAN BNK CDA COM CAD1
+LIF-UN.TO      LABRADOR IRON ORE TRUST UNITS
+LUN.TO LUNDIN MINING CORP COM NPV
+MBT.TO MANITOBA TELECOM S COM NPV
+MDA.TO MACDONALD DETTWILE COM NPV
+MDI.TO MAJOR DRILLING INC COM NPV
+MDS.TO MDS INC COM NPV
+MFC.TO MANULIFE FINL CORP COM NPV
+MFI.TO MAPLE LEAF FOODS COM NPV
+MFL.TO MINEFINDERS CORP COM NPV
+MG-A.TO        MAGNA INTERNATIONAL INC CL A SV
+MRU-A.TO       METRO INC CL A SV
+MX.TO  METHANEX CORP COM NPV
+NA.TO  NATL BK OF CANADA COM NPV
+NAE-UN.TO      NAL OIL & GAS TST TRUST UNITS
+NCX.TO NOVA CHEMICALS COM NPV
+NGD.TO NEW GOLD INC COM NPV
+NKO.TO NIKO RESOURCES COM NPV
+NPI-UN.TO      NORTHLAND PWR INC TRUST UNIT
+NVA.TO NUVISTA ENERGY COM NPV
+NWF-UN.TO      NORTH WEST CO UNIT TRUST
+NXY.TO NEXEN INC COM NPV
+OCX.TO ONEX CORPORATION SV
+OSK.TO OSISKO MINING CORP
+OTC.TO OPEN TEXT CO COM NPV
+PAA.TO PAN AMER SILVER COM NPV
+PBG.TO PETROBANK ENERGY & COM NPV
+PCA.TO PETRO CANADA COM NPV
+PD-UN.TO       PRECISION DRILLING TR
+PEY-UN.TO      PEYTO ENERGY TRUST UNIT TRUST
+PGF-UN.TO      PENGROWTH ENERGY T SBI NPV
+PIF-UN.TO      PEMBINA PIPELINE INCOME TRUST U
+PJC-A.TO       JEAN COUTU GROUP CLASS'A'SUB VT
+PMT-UN.TO      PARAMOUNT ENERGY TRUST UNITS
+PMZ-UN.TO      PRIMARIS RETAIL RE TRUST UNITS
+POT.TO POTASH CORP SASK COM NPV
+POW.TO POWER CORP CDA
+PRE.TO PACIFIC RUBIALES ENERGY CORP
+PRQ.TO PROGRESS ENERGY RESOURCES CORP
+PSI.TO PASON SYSTEM INCOR COM NPV
+PVE-UN.TO      PROVIDENT ENERGY T TRUST UNITS
+PWF.TO POWER FINL CORP COM NPV
+PWT-UN.TO      PENN WEST ENERGY TR
+QBR-B.TO       QUEBECOR INC CLASS'B'SUB VTG NP
+QUA.TO QUADRA MINING COM NPV
+RBA.TO RITCHIE BROS AUCTIONEERS
+RBI.TO RED BACK MNG LTD COM NPV
+RCI-B.TO       ROGERS COMMUNICATIONS INC. CL B
+REF-UN.TO      CDN REAL EST INV T TRUST UNITS
+REI-UN.TO      RIOCAN REAL ESTATE TRUST UNITS
+RET-A.TO       REITMANS(CANADA) CLASS'A'NON VT
+RIM.TO RESEARCH IN MOTION LTD
+RON.TO RONA INC COM NPV
+RUS.TO RUSSEL METALS INC COM NPV
+RY.TO  ROYAL BK OF CANADA COM NPV
+S.TO   SHERRITT INTL CORP COM NPV
+SAP.TO SAPUTO INC
+SC.TO  SHOPPERS DRUG MART COM NPV
+SCC.TO SEARS CANADA INC COM NPV
+SCL-A.TO       SHAWCOR LTD
+SIF-UN.TO      ENERGY SAVINGS INC UNITS
+SJR-B.TO       SHAW COMMUNICATION 'B'CNV NPV
+SLF.TO SUN LIFE FINL INC COM NPV
+SLW.TO SILVER WHEATON COR COM NPV
+SNC.TO SNC-LAVALIN GROUP COM NPV
+SPB.TO SUPERIOR PLUS INCOME FD
+SSO.TO SILVER STD RES INC COM NPV
+STN.TO STANTEC INC COM NPV
+SU.TO  SUNCOR ENERGY INC
+SVM.TO SILVERCORP METALS INC
+SVY.TO SAVANNA ENERGY SER COM NPV
+SXC.TO SXC HEALTH SOLUTIO COM NPV
+T.TO   TELUS CORPORATION COM NPV
+TA.TO  TRANSALTA CORP MTN COM NPV
+TCK-B.TO       TECK COMINCO LIMITED CL B SV
+TCL-A.TO       TRANSCONTINENTAL INC A
+TCM.TO THOMPSON CREEK MET COM NPV
+TCW.TO TRICAN WELL SERVIC COM NPV
+TD.TO  TORONTO-DOMINION COM NPV
+TDG.TO TRINIDAD ENERGY SVCS INCOME
+TFI.TO TRANSFORCE INCOME FD
+THI.TO Tim Hortons Inc
+TIH.TO TOROMONT INDUSTRIE COM STK NPV
+TLM.TO TALISMAN ENERGY IN COM NPV
+TNX.TO TANZANIAN ROYALTY COM NPV
+TOG.TO TRISTAR OIL & GAS COM NPV
+TRE.TO SINO-FOREST CORP COM NPV
+TRI.TO THOMSON REUTERS CORP
+TRP.TO TRANSCANADA CORP COM NPV
+TRZ-B.TO       TRANSAT AT INC COM NPV VTG SHS
+TS-B.TO        TORSTAR CLASS'B'N/VTG COM NPV
+UTS.TO UTS ENERGY CORP COM NPV
+UUU.TO Uranium One Inc
+VET-UN.TO      VERMILION ENERGY TRUST UNITS
+VT.TO  VITERRA INC
+WFT.TO WEST FRASER TIMBER COM NPV
+WJA.TO WESTJET AIRLINES COM VOTING SHA
+WN.TO  WESTON (GEORGE) COM NPV
+WTE-UN.TO      WESTSHORE TERMINAL TRUST UNIT
+X.TO   TMX GROUP INC/GROUPE TMX INC
+YLO-UN.TO      YELLOW PAGES INCOM TRUST UNITS
+YRI.TO YAMANA GOLD INC COM NPV
index 15ec37d..7fb51f5 100644 (file)
@@ -27,13 +27,13 @@ try:
     HILDON = True
 except:
     HILDON = False
-    
+
 try:
     import osso
     OSSO = True
-    osso_c = osso.Context("net.yerga.stockthis", "0.1", False)
+    osso_c = osso.Context("net.yerga.stockthis", "0.2", False)
 except:
-    OSSO = False    
+    OSSO = False
 
 from marketdata import markets, idmarket, localmarkets, localids
 
@@ -48,7 +48,7 @@ if '/usr/share' in runningpath:
     running_locally = False
 else:
     running_locally = True
-    
+
 if running_locally:
     imgdir = 'pixmaps/'
 else:
@@ -68,18 +68,18 @@ class StocksPy:
             if FREMANTLE:
                 self.window = hildon.StackableWindow()
             else:
-                self.window = hildon.Window()                
-            self.program.add_window(self.window) 
+                self.window = hildon.Window()
+            self.program.add_window(self.window)
         else:
             self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
 
-        self.window.set_default_size(800, 480)  
-        self.window.set_title('StocksPy')
+        self.window.set_default_size(800, 480)
+        self.window.set_title('StockThis')
         self.window.connect("destroy", gtk.main_quit)
         self.window.connect("key-press-event", self.on_key_press)
         self.window.connect("window-state-event", self.on_window_state_change)
         self.window_in_fullscreen = False
-        
+
         if HILDON:
             if FREMANTLE:
                 menu = hildon.AppMenu()
@@ -90,49 +90,49 @@ class StocksPy:
                 self.window.set_menu(menu)
                 about_menu = gtk.MenuItem("About")
                 about_menu.set_size_request(-1, 55)
-            
+
             about_menu.connect("activate", self.on_about)
-            menu.append(about_menu)            
+            menu.append(about_menu)
             menu.show_all()
         else:
             #TODO: create a gtk.menubar
             pass
-        
-        
+
+
         vbox = gtk.VBox()
-        
+
         self.toolbar = gtk.HBox()
         self.toolbar.set_property("no-show-all", True)
         self.toolbar.hide()
         self.toolbar.set_homogeneous(True)
         self.toolbar.set_size_request(-1, 55)
-        
+
         self.markets_btn = gtk.Button('Markets')
         self.markets_btn.connect("clicked", self.create_markets_view)
         self.markets_btn.set_property("can_focus", False)
-        
-        self.components_btn = gtk.Button('Components')
+
+        self.components_btn = gtk.Button('Companies')
         self.components_btn.connect("clicked", self.show_components_view)
-        self.components_btn.set_property("can_focus", False)          
-        
+        self.components_btn.set_property("can_focus", False)
+
         self.graph_btn = gtk.Button('Graphs')
         self.graph_btn.connect("clicked", self.create_graphs_view)
         self.graph_btn.set_property("can_focus", False)
-        
+
         self.refresh_btn = gtk.Button('Refresh')
         self.refresh_btn.connect("clicked", self.refresh_stock_data)
         self.refresh_btn.set_property("can_focus", False)
-        
+
         self.quotes_btn = gtk.Button('Quotes')
         self.quotes_btn.connect("clicked", self.show_quotes_view)
-        self.quotes_btn.set_property("can_focus", False)        
-        
-        self.toolbar.pack_start(self.markets_btn)        
+        self.quotes_btn.set_property("can_focus", False)
+
+        self.toolbar.pack_start(self.markets_btn)
         self.toolbar.pack_start(self.components_btn)
         self.toolbar.pack_start(self.graph_btn)
-        self.toolbar.pack_start(self.quotes_btn) 
-        self.toolbar.pack_start(self.refresh_btn)        
-        
+        self.toolbar.pack_start(self.quotes_btn)
+        self.toolbar.pack_start(self.refresh_btn)
+
         self.mainbox = gtk.VBox()
 
 
@@ -154,26 +154,26 @@ class StocksPy:
 
         self.window.show_all()
 
-    def create_markets_view(self, widget): 
+    def create_markets_view(self, widget):
         names = markets
         ids = idmarket
         self.toolbar.hide()
-        
+
         actual_view = self.mainbox.get_children()
         if len(actual_view) > 0:
             for a_widget in actual_view:
                 a_widget.destroy()
 
-        self.marketsbox = gtk.VBox()        
+        self.marketsbox = gtk.VBox()
         lnames = len(names)
-        
+
         for i in range(lnames):
             button = gtk.Button(names[i])
             button.connect("clicked", self.create_components_view, ids[i])
             button.set_size_request(-1, 65)
             button.set_property("can_focus", False)
             self.marketsbox.pack_start(button, True, True, 2)
-        
+
         self.mainbox.pack_start(self.marketsbox, True, True, 2)
         self.mainbox.show_all()
 
@@ -181,11 +181,11 @@ class StocksPy:
         kind = self.market_id
         self.create_components_view(widget, kind)
 
-    def create_components_view(self, widget, kind):    
+    def create_components_view(self, widget, kind):
         actual_view = self.mainbox.get_children()
         for i in actual_view:
             i.destroy()
-    
+
         self.market_id = kind
         self.toolbar.show()
         self.components_btn.hide()
@@ -193,62 +193,63 @@ class StocksPy:
         self.refresh_btn.hide()
         self.graph_btn.hide()
         self.quotes_btn.hide()
-        
+
         names = localmarkets[idmarket.index(kind)]
         ids = localids[idmarket.index(kind)]
-        
+
         self.compbox = gtk.VBox()
-        
+
         self.components_trv = gtk.TreeView()
-        
+        self.components_trv.set_grid_lines(gtk.TREE_VIEW_GRID_LINES_HORIZONTAL)
+
         if not FREMANTLE:
             selection = self.components_trv.get_selection()
             selection.connect("changed", self.changed_selection, ids)
         else:
             self.components_trv.connect("row-activated", self.select_component, ids)
-            
+
         self.components_trv.set_rubber_banding(True)
-        self.components_trv.set_headers_visible(False)        
+        self.components_trv.set_headers_visible(False)
         self.components_model = self.__create_components_model()
         self.components_trv.set_model(self.components_model)
-        self._components_trv_columns(self.components_trv)   
+        self._components_trv_columns(self.components_trv)
         self.add_initial_components(names, ids)
-        
-        self.compbox.pack_start(self.components_trv, True, True, 0) 
+
+        self.compbox.pack_start(self.components_trv, True, True, 0)
 
         self.mainbox.pack_start(self.compbox, True, True, 0)
         self.mainbox.show_all()
 
     def select_component(self, widget, path, column, ids):
         self.create_quotes_view(widget,self.components_model[path][1] )
-   
+
     def changed_selection(self, widget, ids):
         n, i, m = self.get_selected_from_treeview(self.components_trv, self.components_model, 1)
         if n is not None:
             self.create_quotes_view(widget, n)
-            
+
     def __create_components_model(self):
         lstore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
         return lstore
 
-    def _components_trv_columns(self, treeview): 
+    def _components_trv_columns(self, treeview):
         renderer = gtk.CellRendererText()
         renderer.set_property('scale', 1.6)
         #renderer.set_property("background", 'lightgray')
         renderer.set_property("xpad", 15)
         column = gtk.TreeViewColumn('Name', renderer, text=0)
         column.set_expand(True)
-        treeview.append_column(column) 
-        
+        treeview.append_column(column)
+
         renderer = gtk.CellRendererText()
         column = gtk.TreeViewColumn('IDS', renderer, text=1)
         column.set_visible(False)
-        treeview.append_column(column)         
-        
+        treeview.append_column(column)
+
     def add_initial_components(self, kind, ids):
         for i in range(len(kind)):
-            niter = self.components_model.append() 
-            self.components_model.set(niter, 0, kind[i], 1, ids[i])    
+            niter = self.components_model.append()
+            self.components_model.set(niter, 0, kind[i], 1, ids[i])
 
     def get_selected_from_treeview(self, treeview, model, setting):
         selection = treeview.get_selection()
@@ -269,93 +270,93 @@ class StocksPy:
         self.components_btn.show()
         self.markets_btn.show()
         self.refresh_btn.show()
-        self.graph_btn.show() 
-        self.quotes_btn.hide() 
-    
+        self.graph_btn.show()
+        self.quotes_btn.hide()
+
         #actual_view = self.mainbox.get_children()
         #actual_view[0].destroy()
-        
+
         try:
             self.graphbox.destroy()
         except:
             pass
-        
+
         for i in range(len(localids)):
             if kind in localids[i]:
-                ind1, ind2 = i, localids[i].index(kind)  
+                ind1, ind2 = i, localids[i].index(kind)
 
         self.quotesbox = gtk.VBox()
 
-        label1 = gtk.Label('')
-        label1.set_markup('<b><big>'+localmarkets[ind1][ind2]+'</big></b>')
-        color = gtk.gdk.color_parse("#03A5FF")          
-        label1.modify_fg(gtk.STATE_NORMAL, color)
+        self.titlelbl = gtk.Label('')
+        self.titlelbl.set_markup('<b><big>'+localmarkets[ind1][ind2]+'</big></b>')
+        color = gtk.gdk.color_parse("#03A5FF")
+        self.titlelbl.modify_fg(gtk.STATE_NORMAL, color)
 
         self.databox = gtk.VBox()
-        
+
         self.imagebox = gtk.VBox()
-        self.dataimg = gtk.Image()        
+        self.dataimg = gtk.Image()
         self.imagebox.pack_start(self.dataimg)
-        
-        self.show_data(kind)        
-        
+
+        self.show_data(kind)
+
         hbox1 = gtk.HBox()
-        
+
         label2 = gtk.Label('')
         label2.set_markup('<b><big>Price:</big></b>')
         self.lprice = gtk.Label('')
-        
+
         hbox1.pack_start(label2, False, False, 50)
         hbox1.pack_start(self.lprice, False, False, 185)
-        
+
         hbox2 = gtk.HBox()
 
         label4 = gtk.Label('')
         label4.set_markup('<b><big>Change:</big></b>')
         self.lchange = gtk.Label('')
         self.lpercent = gtk.Label('')
-        
+
         hbox2.pack_start(label4, False, False, 50)
-        hbox2.pack_start(self.lchange  , False, False, 145)             
+        hbox2.pack_start(self.lchange  , False, False, 145)
         hbox2.pack_start(self.lpercent, False, False, 0)
-                
+
         hbox3 = gtk.HBox()
-        
+
         label7 = gtk.Label('')
         label7.set_markup('<b><big>Volume:</big></b>')
         self.lvolume = gtk.Label('')
-        
+
         hbox3.pack_start(label7, False, False, 50)
-        hbox3.pack_start(self.lvolume  , False, False, 145)    
-        
+        hbox3.pack_start(self.lvolume  , False, False, 145)
+
         hbox4 = gtk.HBox()
-        
+
         label9 = gtk.Label('')
         label9.set_markup('<b><big>52 week high:</big></b>')
         self.l52whigh = gtk.Label('')
-        
+
         hbox4.pack_start(label9, False, False, 50)
-        hbox4.pack_start(self.l52whigh , False, False, 55)             
-        
+        hbox4.pack_start(self.l52whigh , False, False, 55)
+
         hbox5 = gtk.HBox()
-        
+
         label11 = gtk.Label('')
         label11.set_markup('<b><big>52 week low:</big></b>')
         self.l52wlow = gtk.Label('')
-        
+
         hbox5.pack_start(label11, False, False, 50)
         hbox5.pack_start(self.l52wlow , False, False, 70)
-    
+
         self.databox.pack_start(hbox1, True, True, 0)
         self.databox.pack_start(hbox2, True, True, 0)
         self.databox.pack_start(hbox3, True, True, 0)
         self.databox.pack_start(hbox4, True, True, 0)
         self.databox.pack_start(hbox5, True, True, 0)
-               
-        self.quotesbox.pack_start(label1, False, False, 0)
-        self.quotesbox.pack_start(gtk.HSeparator(), False, False, 0)     
-        self.quotesbox.pack_start(self.databox, True, True, 0)     
-        self.quotesbox.pack_start(self.imagebox, True, True, 0)    
+
+        self.quotesbox.pack_start(self.titlelbl, False, False, 0)
+        self.quotesbox.pack_start(gtk.HSeparator(), False, False, 0)
+        self.quotesbox.pack_start(self.databox, True, True, 0)
+        self.quotesbox.pack_start(self.imagebox, True, True, 0)
 
         self.mainbox.pack_start(self.quotesbox, True, True, 0)
         self.mainbox.show_all()
@@ -369,14 +370,20 @@ class StocksPy:
         self.databox.hide()
         thread.start_new_thread(self.get_data, (kind,))
 
-    def get_data(self, kind):    
+    def get_data(self, kind):
         self.graph_btn.show()
         self.refresh_btn.show()
-        self.quotes_btn.hide() 
-        
+        self.quotes_btn.hide()
+
         from ystockquote import ystockquote as yt
-        data = yt.get_all(kind)
-        
+        try:
+            data = yt.get_all(kind)
+        except:
+            print 'Failed to get internet data'
+            data = {'price': 'N/A', 'change': 'N/A', 'volume':'N/A',
+                    '52_week_high': 'N/A', '52_week_low': 'N/A'}
+            self.titlelbl.set_markup('<b><big>Failed to get data</big></b>')
+
         try:
             ch_percent = 100.0 * float(data['change'])/float(data['price'])
         except ValueError:
@@ -385,58 +392,58 @@ class StocksPy:
         self.lprice.set_label(data['price'])
         self.lchange.set_label(data['change'])
         self.lpercent.set_label('%6.2f %%' % ch_percent)
-        
+
         if '-' in data['change']:
             color = gtk.gdk.color_parse("#FF0000")
         else:
-            color = gtk.gdk.color_parse("#16EB78")   
-                     
+            color = gtk.gdk.color_parse("#16EB78")
+
         self.lpercent.modify_fg(gtk.STATE_NORMAL, color)
-        self.lchange.modify_fg(gtk.STATE_NORMAL, color) 
-                   
+        self.lchange.modify_fg(gtk.STATE_NORMAL, color)
+
         self.lvolume.set_label(data['volume'])
         self.l52whigh.set_label(data['52_week_high'])
         self.l52wlow.set_label(data['52_week_low'])
-               
-        self.databox.show_all()  
-        self.imagebox.hide()  
+
+        self.databox.show_all()
+        self.imagebox.hide()
 
     def refresh_stock_data(self, widget):
         self.show_data(self.stocks_id)
 
-    def create_graphs_view(self, widget):        
+    def create_graphs_view(self, widget):
         self.graph_btn.hide()
         self.refresh_btn.hide()
         self.quotes_btn.show()
-        
+
         self.graph = gtk.Image()
-        
+
         kind = self.stocks_id
-        
+
         self.show_graph(None, '1d', kind)
-        
+
         for i in range(len(localids)):
             if kind in localids[i]:
                 ind1, ind2 = i, localids[i].index(kind)
 
-        #self.mainbox.destroy()  
+        #self.mainbox.destroy()
         #self.mainbox = gtk.VBox()
-        #self.swin.add_with_viewport(self.mainbox) 
-        
+        #self.swin.add_with_viewport(self.mainbox)
+
         actual_view = self.mainbox.get_children()
         for a_widget in actual_view:
-            a_widget.destroy() 
+            a_widget.destroy()
 
         self.graphbox = gtk.VBox()
 
-        label1 = gtk.Label(localmarkets[ind1][ind2])
+        self.graphs_title = gtk.Label(localmarkets[ind1][ind2])
         color = gtk.gdk.color_parse("#03A5FF")
-        label1.modify_fg(gtk.STATE_NORMAL, color)
-        
+        self.graphs_title.modify_fg(gtk.STATE_NORMAL, color)
+
         hbox1 = gtk.HBox()
         hbox1.set_size_request(-1, 55)
         hbox1.set_homogeneous(True)
-        
+
         self.btn1d = gtk.Button('1d')
         self.btn1d.set_property("can_focus", False)
         self.btn1d.connect("clicked", self.show_graph, '1d', kind)
@@ -461,22 +468,22 @@ class StocksPy:
         self.btnmax = gtk.Button('max')
         self.btnmax.set_property("can_focus", False)
         self.btnmax.connect("clicked", self.show_graph, 'max', kind)
-        
+
         hbox1.pack_start(self.btn1d)
-        hbox1.pack_start(self.btn5d)        
-        hbox1.pack_start(self.btn3m)        
-        hbox1.pack_start(self.btn6m)        
-        hbox1.pack_start(self.btn1y) 
-        hbox1.pack_start(self.btn2y)        
-        hbox1.pack_start(self.btn5y)        
-        hbox1.pack_start(self.btnmax)      
-           
-        self.graphbox.pack_start(label1, False, False, 2)
-        self.graphbox.pack_start(hbox1, False, False, 0)     
+        hbox1.pack_start(self.btn5d)
+        hbox1.pack_start(self.btn3m)
+        hbox1.pack_start(self.btn6m)
+        hbox1.pack_start(self.btn1y)
+        hbox1.pack_start(self.btn2y)
+        hbox1.pack_start(self.btn5y)
+        hbox1.pack_start(self.btnmax)
+
+        self.graphbox.pack_start(self.graphs_title, False, False, 2)
+        self.graphbox.pack_start(hbox1, False, False, 0)
         self.graphbox.pack_start(self.graph, True, True, 5)
-        
+
         self.mainbox.pack_start(self.graphbox, False, False, 2)
-        self.mainbox.show_all()   
+        self.mainbox.show_all()
 
     def show_graph(self, widget, option, kind):
         import thread
@@ -486,51 +493,56 @@ class StocksPy:
     def get_graph_data(self, option, kind):
         if option == '1d':
             url = 'http://uk.ichart.yahoo.com/b?s=%s' % kind
-        elif option == '5d':  
+        elif option == '5d':
             url = 'http://uk.ichart.yahoo.com/w?s=%s' % kind
-        elif option == '3m':  
+        elif option == '3m':
             url = 'http://chart.finance.yahoo.com/c/3m/s/%s' % kind.lower()
-        elif option == '6m':  
+        elif option == '6m':
             url = 'http://chart.finance.yahoo.com/c/6m/s/%s' % kind.lower()
-        elif option == '1y':  
+        elif option == '1y':
             url = 'http://chart.finance.yahoo.com/c/1y/s/%s' % kind.lower()
-        elif option == '2y':  
+        elif option == '2y':
             url = 'http://chart.finance.yahoo.com/c/2y/s/%s' % kind.lower()
-        elif option == '5y':  
+        elif option == '5y':
             url = 'http://chart.finance.yahoo.com/c/5y/s/%s' % kind.lower()
-        elif option == 'max':  
+        elif option == 'max':
             url = 'http://chart.finance.yahoo.com/c/my/s/%s' % kind.lower()
-                
-        myimg = urllib2.urlopen(url)
-        imgdata=myimg.read()
 
-        pbl = gtk.gdk.PixbufLoader()
-        pbl.write(imgdata)
+        try:
+            myimg = urllib2.urlopen(url)
+            imgdata=myimg.read()
+
+            pbl = gtk.gdk.PixbufLoader()
+            pbl.write(imgdata)
+
+            pbuf = pbl.get_pixbuf()
+            pbl.close()
+            self.graph.set_from_pixbuf(pbuf)
+        except:
+            print 'no internet data'
+            self.graphs_title.set_label('Failed to get data')
+            self.graph.destroy()
 
-        pbuf = pbl.get_pixbuf()
-        pbl.close()
-        
-        self.graph.set_from_pixbuf(pbuf)
 
     #Functions for fullscreen
-    def on_window_state_change(self, widget, event, *args):           
+    def on_window_state_change(self, widget, event, *args):
         if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
             self.window_in_fullscreen = True
         else:
             self.window_in_fullscreen = False
 
     #F6 fullscreen, F7 bigger font, F8 smaller font
-    def on_key_press(self, widget, event, *args):  
+    def on_key_press(self, widget, event, *args):
         if event.keyval == gtk.keysyms.F6:
             if self.window_in_fullscreen:
                 self.window.unfullscreen ()
             else:
-                self.window.fullscreen () 
+                self.window.fullscreen ()
 
     def on_about(self, widget):
         dialog = gtk.AboutDialog()
         dialog.set_name("StockThis")
-        dialog.set_version("0.1")
+        dialog.set_version("0.2")
         dialog.set_copyright("Copyright © 2009")
         dialog.set_website("http://stockthis.garage.maemo.org")
         dialog.set_authors(["Daniel Martin Yerga <dyerga@gmail.com>"])
@@ -540,10 +552,9 @@ class StocksPy:
         dialog.set_artists(["Logo by Daniel Martin Yerga"])
         dialog.run()
         dialog.destroy()
-          
+
 if __name__ == "__main__":
     stockspy = StocksPy()
     gtk.gdk.threads_enter()
     gtk.main()
     gtk.gdk.threads_leave()
-