]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/wxPython/tests/wxSlash.py
Added a demo showing how to use wxPostEvent
[wxWidgets.git] / utils / wxPython / tests / wxSlash.py
index 6a493ac1063dab7a4b535e1e0beee85a791a0e9c..ae1164d233e0aed215277b6170bac5d5d20d5387 100644 (file)
@@ -1,12 +1,5 @@
 #!/usr/bin/python
-from wxPython.wx import *
-from httplib import HTTP
-from htmllib import HTMLParser
-import os
-import re
-import formatter
-
-__doc__ = """This is wxSlash 1.0
+"""This is wxSlash 1.1
 
     It's the obligatory Slashdot.org headlines reader that any modern
 widget set/library must have in order to be taken seriously :-)
@@ -15,13 +8,13 @@ widget set/library must have in order to be taken seriously :-)
 file from http://slashdot.org, which contains the headlines in a computer
 friendly format. It then displays said headlines in a wxWindows list control.
 
-    You can read articles using either Python's html library or an external 
+    You can read articles using either Python's html library or an external
 browser. Uncheck the 'browser->internal' menu item to use the latter option.
-Use the settings dialog box to set how external browser is started.
+Use the settings dialog box to set which external browser is started.
 
     This code is available under the wxWindows license, see elsewhere. If you
 modify this code, be aware of the fact that slashdot.org's maintainer,
-CmdrTaco, explicitly asks 'ultramode.txt' downloaders not to do this 
+CmdrTaco, explicitly asks 'ultramode.txt' downloaders not to do this
 automatically more than twice per hour. If this feature is abused, CmdrTaco
 may remove the ultramode file completely and that will make a *lot* of people
 unhappy.
@@ -34,6 +27,13 @@ the idea for this applet.
     Harm van der Heijden (H.v.d.Heijden@phys.tue.nl)
 """
 
+from wxPython.wx import *
+from httplib import HTTP
+from htmllib import HTMLParser
+import os
+import re
+import formatter
+
 class HTMLTextView(wxFrame):
     def __init__(self, parent, id, title='HTMLTextView', url=None):
         wxFrame.__init__(self, parent, id, title, wxPyDefaultPosition,
@@ -50,7 +50,7 @@ class HTMLTextView(wxFrame):
         self.mainmenu.Append(menu, '&File')
         self.SetMenuBar(self.mainmenu)
         self.CreateStatusBar(1)
-        
+
         self.text = wxTextCtrl(self, -1, "", wxPyDefaultPosition,
                                wxPyDefaultSize, wxTE_MULTILINE | wxTE_READONLY)
 
@@ -59,7 +59,7 @@ class HTMLTextView(wxFrame):
 
     def logprint(self, x):
         self.SetStatusText(x)
-        
+
     def OpenURL(self, url):
         self.url = url
         m = re.match('file:(\S+)\s*', url)
@@ -95,7 +95,7 @@ class HTMLTextView(wxFrame):
         self.text.SetValue(tmp.read())
         self.SetTitle(url)
         self.logprint(url)
-        
+
     def OnFileOpen(self, event):
         dlg = wxTextEntryDialog(self, "Enter URL to open:", "")
         if dlg.ShowModal() == wxID_OK:
@@ -110,7 +110,7 @@ class HTMLTextView(wxFrame):
 
     def OnCloseWindow(self, event):
         self.Destroy()
-        
+
 
 def ParseSlashdot(f):
     art_sep = re.compile('%%\r?\n')
@@ -121,10 +121,10 @@ def ParseSlashdot(f):
     for i in range(1,len(list)-1):
         art_list.append(line_sep.split(list[i]))
     return art_list
-        
+
 def myprint(x):
     print x
-    
+
 def RetrieveAsFile(host, path='', logprint = myprint):
     try:
         h = HTTP(host)
@@ -143,38 +143,25 @@ def RetrieveAsFile(host, path='', logprint = myprint):
 #    f = open('/home/harm/ultramode.txt','r')
     return f
 
-# This one isn't defined in the default wxPython modules...
-def EVT_LIST_ITEM_SELECTED(win, id, func):
-    win.Connect(id, -1, wxEVT_COMMAND_LIST_ITEM_SELECTED, func)
-    
+
 class AppStatusBar(wxStatusBar):
     def __init__(self, parent):
         wxStatusBar.__init__(self,parent, -1)
         self.SetFieldsCount(2)
-        self.SetStatusWidths([100,-1])
+        self.SetStatusWidths([-1, 100])
         self.but = wxButton(self, 1001, "Refresh")
         EVT_BUTTON(self, 1001, parent.OnViewRefresh)
         self.OnSize(None)
-        
+
     def logprint(self,x):
-        self.SetStatusText(x,1)
+        self.SetStatusText(x,0)
 
     def OnSize(self, event):
-        rect = self.GetFieldRect(0)
+        rect = self.GetFieldRect(1)
         self.but.SetPosition(wxPoint(rect.x+2, rect.y+2))
-       # The width/height we get is false. Why? Now I use a stupid trick:
-       rect2 = self.GetFieldRect(1)
-       rect.width = rect2.x - 8;
-       rect.height = 25;
         self.but.SetSize(wxSize(rect.width-4, rect.height-4))
 
 # This is a simple timer class to start a function after a short delay;
-# For example, if you're about to perform function f which may take a long
-# time, write "Please wait" in the statusbar, then create a QuickTimer(f)
-# object to automatically call f after a short delay. That way, wxWindows
-# will get a chance to update the statusbar before the long function is 
-# called.
-# FIXME: can this be done better using an OnIdle kind of thing?
 class QuickTimer(wxTimer):
     def __init__(self, func, wait=100):
        wxTimer.__init__(self)
@@ -219,15 +206,23 @@ class AppFrame(wxFrame):
        menu.Append(230, '&About', 'Some documentation');
        EVT_MENU(self, 230, self.OnAbout)
        self.mainmenu.Append(menu, '&Help')
-        
+
         self.SetMenuBar(self.mainmenu)
-        
-        self.BrowserSettings = "netscape -remote 'OpenURL(%s, new_window)'"
-        
+
+       if wxPlatform == '__WXGTK__':
+           # I like lynx. Also Netscape 4.5 doesn't react to my cmdline opts
+           self.BrowserSettings = "xterm -e lynx %s &"
+       elif wxPlatform == '__WXMSW__':
+           # netscape 4.x likes to hang out here...
+           self.BrowserSettings = '\\progra~1\\Netscape\\Communicator\\Program\\netscape.exe %s'
+       else:
+           # a wild guess...
+           self.BrowserSettings = 'netscape %s'
+           
        # A status bar to tell people what's happening
        self.sb = AppStatusBar(self)
         self.SetStatusBar(self.sb)
-        
+
         self.list = wxListCtrl(self, 1100)
        self.list.SetSingleStyle(wxLC_REPORT)
        self.list.InsertColumn(0, 'Subject')
@@ -240,14 +235,17 @@ class AppFrame(wxFrame):
         self.list.SetColumnWidth(3, 100)
 
         EVT_LIST_ITEM_SELECTED(self, 1100, self.OnItemSelected)
-        
+       EVT_LEFT_DCLICK(self.list, self.OnLeftDClick)
+
        self.logprint("Connecting to slashdot... Please wait.")
-       # Need a longer time here. Don't really know why
+       # wxYield doesn't yet work here. That's why we use a timer
+       # to make sure that we see some GUI stuff before the slashdot
+       # file is transfered.
        self.timer = QuickTimer(self.DoRefresh, 1000)
 
     def logprint(self, x):
         self.sb.logprint(x)
-        
+
     def OnFileExit(self, event):
         self.Destroy()
 
@@ -260,16 +258,17 @@ class AppFrame(wxFrame):
         i = 0;
         for article in art_list:
             self.list.InsertStringItem(i, article[0])
-            self.list.SetItemString(i, 1, article[2])
-            self.list.SetItemString(i, 2, article[3])
-            self.list.SetItemString(i, 3, article[6])
+            self.list.SetStringItem(i, 1, article[2])
+            self.list.SetStringItem(i, 2, article[3])
+            self.list.SetStringItem(i, 3, article[6])
             self.url.append(article[1])
             i = i + 1
        self.logprint("File retrieved OK.")
 
     def OnViewRefresh(self, event):
-       self.timer = QuickTimer(self.DoRefresh)
        self.logprint("Connecting to slashdot... Please wait.");
+       wxYield()
+       self.DoRefresh()
 
     def DoViewIndex(self):
         if self.UseInternal:
@@ -283,7 +282,8 @@ class AppFrame(wxFrame):
 
     def OnViewIndex(self, event):
        self.logprint("Starting browser... Please wait.")
-       self.timer = QuickTimer(self.DoViewIndex)
+       wxYield()
+       self.DoViewIndex()
 
     def DoViewArticle(self):
         if self.current<0: return
@@ -298,14 +298,15 @@ class AppFrame(wxFrame):
 
     def OnViewArticle(self, event):
        self.logprint("Starting browser... Please wait.")
-       self.timer = QuickTimer(self.DoViewArticle)
+       wxYield()
+       self.DoViewArticle()
 
     def OnBrowserInternal(self, event):
         if self.mainmenu.Checked(220):
             self.UseInternal = 1
         else:
             self.UseInternal = 0
-        
+
     def OnBrowserSettings(self, event):
         dlg = wxTextEntryDialog(self, "Enter command to view URL.\nUse %s as a placeholder for the URL.", "", self.BrowserSettings);
         if dlg.ShowModal() == wxID_OK:
@@ -314,11 +315,27 @@ class AppFrame(wxFrame):
     def OnAbout(self, event):
        dlg = wxMessageDialog(self, __doc__, "wxSlash", wxOK | wxICON_INFORMATION)
        dlg.ShowModal()
-        
+
     def OnItemSelected(self, event):
         self.current = event.m_itemIndex
         self.logprint("URL: %s" % (self.url[self.current]))
-        
+
+    def OnLeftDClick(self, event):
+       (x,y) = event.Position();
+       # Actually, we should convert x,y to logical coords using
+       # a dc, but only for a wxScrolledWindow widget.
+       # Now wxGTK derives wxListCtrl from wxScrolledWindow,
+       # and wxMSW from wxControl... So that doesn't work.
+       #dc = wxClientDC(self.list)
+       ##self.list.PrepareDC(dc)
+       #x = dc.DeviceToLogicalX( event.GetX() )
+       #y = dc.DeviceToLogicalY( event.GetY() )
+       id = self.list.HitTest(wxPoint(x,y))
+       #print "Double click at %d %d" % (x,y), id
+       # Okay, we got a double click. Let's assume it's the current selection
+       wxYield()
+       self.OnViewArticle(event)
+
     def OnCloseWindow(self, event):
         self.Destroy()