]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/Main.py
reSWIGged
[wxWidgets.git] / wxPython / demo / Main.py
index 589f2d39f33ec88ce8a717f799f9fb53321b0ab1..bd75b35f5bb95a8f9146a1cab246da122fea7408 100644 (file)
@@ -18,7 +18,10 @@ import wx.html
 
 import images
 
-##wx.Trap()
+# For debugging
+##wx.Trap();
+##print os.getpid(); raw_input("Press a key...")
+
 
 #---------------------------------------------------------------------------
 
@@ -28,6 +31,12 @@ _treeList = [
     ('Recent Additions', [
         'wxVListBox',
         'wxListbook',
+        'wxMaskedNumCtrl',
+        'FloatCanvas',
+        'wxXmlResourceSubclass',
+        'wxGridBagSizer',
+        'Cursor',
+        'PyPlot',
         ]),
 
     # managed windows == things with a (optional) caption you can close
@@ -72,7 +81,6 @@ _treeList = [
         'wxChoice',
         'wxComboBox',
         'wxGauge',
-        'wxGenericDirCtrl',
         'wxGrid',
         'wxGrid_MegaExample',
         'wxListbook',
@@ -100,40 +108,48 @@ _treeList = [
         'wxValidator',
         ]),
 
-    # controls coming from other librairies
+    ('Custom Controls', [
+        'AnalogClockWindow',
+        'ColourSelect',
+        'GenericButtons',
+        'wxEditor',
+        'wxGenericDirCtrl',
+        'wxLEDNumberCtrl',
+        'wxMultiSash',
+        'wxPopupControl',
+        'wxPyColourChooser',
+        'wxTreeListCtrl',
+    ]),
+    
+    # controls coming from other libraries
     ('More Windows/Controls', [
         #'wxFloatBar',          deprecated
         #'wxMVCTree',           deprecated
         #'wxRightTextCtrl',     deprecated as we have wxTE_RIGHT now.
-        'AnalogClockWindow',
-        'ColourSelect',
         'ContextHelp',
         'FancyText',
+        'FloatCanvas',
         'FileBrowseButton',
-        'GenericButtons',
         'MaskedEditControls',
         'PyShell',
         'PyCrust',
+        'PyPlot',
         'SplitTree',
         'TablePrint',
         'Throbber',
         'wxCalendar',
         'wxCalendarCtrl',
-        'wxPyColourChooser',
         'wxDynamicSashWindow',
         'wxEditableListBox',
-        'wxEditor',
         'wxHtmlWindow',
         'wxIEHtmlWin',
         'wxIntCtrl',
-        'wxLEDNumberCtrl',
         'wxMimeTypesManager',
-        'wxMultiSash',
-        'wxPopupControl',
+        'wxMaskedNumCtrl',
+        'wxScrolledPanel',
         'wxStyledTextCtrl_1',
         'wxStyledTextCtrl_2',
         'wxTimeCtrl',
-        'wxTreeListCtrl',
         'wxVListBox',
         ]),
 
@@ -143,10 +159,12 @@ _treeList = [
         'Layoutf',
         'RowColSizer',
         'Sizers',
+        'wxGridBagSizer',
         'wxLayoutConstraints',
         'wxScrolledPanel',
         'wxXmlResource',
         'wxXmlResourceHandler',
+        'wxXmlResourceSubclass',
         ]),
 
     # ditto
@@ -170,6 +188,7 @@ _treeList = [
 
     # Images
     ('Using Images', [
+        'Cursor',
         'Throbber',
         'wxArtProvider',
         'wxDragImage',
@@ -200,7 +219,7 @@ _treeList = [
         'ActiveXWrapper_Acrobat',
         'ActiveXWrapper_IE',
         'wxGLCanvas',
-        'wxPlotCanvas',
+        #'wxPlotCanvas', # deprecated, use PyPlot
         ]),
 
 
@@ -212,6 +231,7 @@ _treeList = [
 
 
 #---------------------------------------------------------------------------
+# Show how to derive a custom wxLog class
 
 class MyLog(wx.PyLog):
     def __init__(self, textCtrl, logTime=0):
@@ -235,6 +255,7 @@ class MyTP(wx.PyTipProvider):
 # A class to be used to display source code in the demo.  Try using the
 # wxSTC in the wxStyledTextCtrl_2 sample first, fall back to wxTextCtrl
 # if there is an error, such as the stc module not being present.
+#
 
 try:
     ##raise ImportError
@@ -243,9 +264,7 @@ try:
     class DemoCodeViewer(PythonSTC):
         def __init__(self, parent, ID):
             PythonSTC.__init__(self, parent, ID)
-            self.SetEdgeMode(stc.STC_EDGE_NONE)
-            self.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT))
-            self.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
+            self.SetUpEditor()
 
         # Some methods to make it compatible with how the wxTextCtrl is used
         def SetValue(self, value):
@@ -275,6 +294,119 @@ try:
             self.SetSelectionStart(start)
             self.SetSelectionEnd(end)
 
+        def SetUpEditor(self):
+            """
+            This method carries out the work of setting up the demo editor.            
+            It's seperate so as not to clutter up the init code.
+            """
+            import keyword
+            
+            self.SetLexer(stc.STC_LEX_PYTHON)
+            self.SetKeyWords(0, " ".join(keyword.kwlist))
+    
+            # Enable folding
+            self.SetProperty("fold", "1" ) 
+
+            # Highlight tab/space mixing (shouldn't be any)
+            self.SetProperty("tab.timmy.whinge.level", "1")
+
+            # Set left and right margins
+            self.SetMargins(2,2)
+    
+            # Set up the numbers in the margin for margin #1
+            self.SetMarginType(1, wx.stc.STC_MARGIN_NUMBER)
+            # Reasonable value for, say, 4-5 digits using a mono font (40 pix)
+            self.SetMarginWidth(1, 40)
+    
+            # Indentation and tab stuff
+            self.SetIndent(4)               # Proscribed indent size for wx
+            self.SetIndentationGuides(True) # Show indent guides
+            self.SetBackSpaceUnIndents(True)# Backspace unindents rather than delete 1 space
+            self.SetTabIndents(True)        # Tab key indents
+            self.SetTabWidth(4)             # Proscribed tab size for wx
+            self.SetUseTabs(False)          # Use spaces rather than tabs, or
+                                            # TabTimmy will complain!    
+            # White space
+            self.SetViewWhiteSpace(False)   # Don't view white space
+    
+            # EOL
+            #self.SetEOLMode(wx.stc.STC_EOL_CRLF)  # Just leave it at the default (autosense)
+            self.SetViewEOL(False)    
+            # No right-edge mode indicator
+            self.SetEdgeMode(stc.STC_EDGE_NONE)
+    
+            # Setup a margin to hold fold markers
+            self.SetMarginType(2, stc.STC_MARGIN_SYMBOL)
+            self.SetMarginMask(2, stc.STC_MASK_FOLDERS)
+            self.SetMarginSensitive(2, True)
+            self.SetMarginWidth(2, 12)
+    
+            # and now set up the fold markers
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDEREND,     stc.STC_MARK_BOXPLUSCONNECTED,  "white", "black")
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPENMID, stc.STC_MARK_BOXMINUSCONNECTED, "white", "black")
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDERMIDTAIL, stc.STC_MARK_TCORNER,  "white", "black")
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDERTAIL,    stc.STC_MARK_LCORNER,  "white", "black")
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDERSUB,     stc.STC_MARK_VLINE,    "white", "black")
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDER,        stc.STC_MARK_BOXPLUS,  "white", "black")
+            self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPEN,    stc.STC_MARK_BOXMINUS, "white", "black")
+    
+            # Global default style
+            if wx.Platform == '__WXMSW__':
+                self.StyleSetSpec(stc.STC_STYLE_DEFAULT, 
+                                  'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
+            else:
+                self.StyleSetSpec(stc.STC_STYLE_DEFAULT, 
+                                  'fore:#000000,back:#FFFFFF,face:Courier,size:12')
+    
+            # Clear styles and revert to default.
+            self.StyleClearAll()
+
+            # Following style specs only indicate differences from default.
+            # The rest remains unchanged.
+
+            # Line numbers in margin
+            self.StyleSetSpec(wx.stc.STC_STYLE_LINENUMBER,'fore:#000000,back:#99A9C2')
+    
+            # Highlighted brace
+            self.StyleSetSpec(wx.stc.STC_STYLE_BRACELIGHT,'fore:#00009D,back:#FFFF00')
+            # Unmatched brace
+            self.StyleSetSpec(wx.stc.STC_STYLE_BRACEBAD,'fore:#00009D,back:#FF0000')
+            # Indentation guide
+            self.StyleSetSpec(wx.stc.STC_STYLE_INDENTGUIDE, "fore:#CDCDCD")
+    
+            # Python styles
+            self.StyleSetSpec(wx.stc.STC_P_DEFAULT, 'fore:#000000')
+            # Comments
+            self.StyleSetSpec(wx.stc.STC_P_COMMENTLINE,  'fore:#008000,back:#F0FFF0')
+            self.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, 'fore:#008000,back:#F0FFF0')
+            # Numbers
+            self.StyleSetSpec(wx.stc.STC_P_NUMBER, 'fore:#008080')
+            # Strings and characters
+            self.StyleSetSpec(wx.stc.STC_P_STRING, 'fore:#800080')
+            self.StyleSetSpec(wx.stc.STC_P_CHARACTER, 'fore:#800080')
+            # Keywords
+            self.StyleSetSpec(wx.stc.STC_P_WORD, 'fore:#000080,bold')
+            # Triple quotes
+            self.StyleSetSpec(wx.stc.STC_P_TRIPLE, 'fore:#800080,back:#FFFFEA')
+            self.StyleSetSpec(wx.stc.STC_P_TRIPLEDOUBLE, 'fore:#800080,back:#FFFFEA')
+            # Class names
+            self.StyleSetSpec(wx.stc.STC_P_CLASSNAME, 'fore:#0000FF,bold')
+            # Function names
+            self.StyleSetSpec(wx.stc.STC_P_DEFNAME, 'fore:#008080,bold')
+            # Operators
+            self.StyleSetSpec(wx.stc.STC_P_OPERATOR, 'fore:#800000,bold')
+            # Identifiers. I leave this as not bold because everything seems
+            # to be an identifier if it doesn't match the above criterae
+            self.StyleSetSpec(wx.stc.STC_P_IDENTIFIER, 'fore:#000000')
+
+            # Caret color
+            self.SetCaretForeground("BLUE")
+            # Selection background
+            self.SetSelBackground(1, '#66CCFF')
+
+            self.SetSelBackground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT))
+            self.SetSelForeground(True, wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
+
 
 except ImportError:
     class DemoCodeViewer(wx.TextCtrl):
@@ -298,7 +430,7 @@ class wxPythonDemo(wx.Frame):
 
     def __init__(self, parent, id, title):
         wx.Frame.__init__(self, parent, -1, title, size = (800, 600),
-                         style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE)
+                          style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE)
 
         self.cwd = os.getcwd()
         self.curOverview = ""
@@ -307,22 +439,24 @@ class wxPythonDemo(wx.Frame):
         icon = images.getMondrianIcon()
         self.SetIcon(icon)
 
-        if wx.Platform == '__WXMSW__':
+        if wx.Platform != '__WXMAC__':
             # setup a taskbar icon, and catch some events from it
+            icon = wx.IconFromBitmap(
+                images.getMondrianImage().Scale(16,16).ConvertToBitmap() )            
             self.tbicon = wx.TaskBarIcon()
             self.tbicon.SetIcon(icon, "wxPython Demo")
-            wx.EVT_TASKBAR_LEFT_DCLICK(self.tbicon, self.OnTaskBarActivate)
-            wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.OnTaskBarMenu)
-            wx.EVT_MENU(self.tbicon, self.TBMENU_RESTORE, self.OnTaskBarActivate)
-            wx.EVT_MENU(self.tbicon, self.TBMENU_CLOSE, self.OnTaskBarClose)
+            self.tbicon.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
+            self.tbicon.Bind(wx.EVT_TASKBAR_RIGHT_UP, self.OnTaskBarMenu)
+            self.tbicon.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE)
+            self.tbicon.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE)
 
         wx.CallAfter(self.ShowTip)
 
         self.otherWin = None
-        wx.EVT_IDLE(self, self.OnIdle)
-        wx.EVT_CLOSE(self, self.OnCloseWindow)
-        wx.EVT_ICONIZE(self, self.OnIconfiy)
-        wx.EVT_MAXIMIZE(self, self.OnMaximize)
+        self.Bind(wx.EVT_IDLE, self.OnIdle)
+        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+        self.Bind(wx.EVT_ICONIZE, self.OnIconfiy)
+        self.Bind(wx.EVT_MAXIMIZE, self.OnMaximize)
 
         self.Centre(wx.BOTH)
         self.CreateStatusBar(1, wx.ST_SIZEGRIP)
@@ -331,8 +465,8 @@ class wxPythonDemo(wx.Frame):
         splitter2 = wx.SplitterWindow(splitter, -1)
 
         def EmptyHandler(evt): pass
-        #wx.EVT_ERASE_BACKGROUND(splitter, EmptyHandler)
-        #wx.EVT_ERASE_BACKGROUND(splitter2, EmptyHandler)
+        #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
+        #splitter2.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
 
         # Prevent TreeCtrl from displaying all items after destruction when True
         self.dying = False
@@ -342,7 +476,7 @@ class wxPythonDemo(wx.Frame):
         menu = wx.Menu()
         exitID = wx.NewId()
         menu.Append(exitID, 'E&xit\tAlt-X', 'Get the heck outta here!')
-        wx.EVT_MENU(self, exitID, self.OnFileExit)
+        self.Bind(wx.EVT_MENU, self.OnFileExit, id=exitID)
         wx.App_SetMacExitMenuItemId(exitID)
         self.mainmenu.Append(menu, '&File')
 
@@ -353,7 +487,7 @@ class wxPythonDemo(wx.Frame):
             for childItem in item[1]:
                 mID = wx.NewId()
                 submenu.Append(mID, childItem)
-                wx.EVT_MENU(self, mID, self.OnDemoMenu)
+                self.Bind(wx.EVT_MENU, self.OnDemoMenu, id=mID)
             menu.AppendMenu(wx.NewId(), item[0], submenu)
         self.mainmenu.Append(menu, '&Demo')
 
@@ -368,12 +502,12 @@ class wxPythonDemo(wx.Frame):
         menu.AppendSeparator()
         menu.Append(helpID, '&About\tCtrl-H', 'wxPython RULES!!!')
         wx.App_SetMacAboutMenuItemId(helpID)
-        wx.EVT_MENU(self, helpID, self.OnHelpAbout)
-        wx.EVT_MENU(self, findID, self.OnHelpFind)
-        wx.EVT_MENU(self, findnextID, self.OnFindNext)
-        wx.EVT_COMMAND_FIND(self, -1, self.OnFind)
-        wx.EVT_COMMAND_FIND_NEXT(self, -1, self.OnFind)
-        wx.EVT_COMMAND_FIND_CLOSE(self, -1 , self.OnFindClose)
+        self.Bind(wx.EVT_MENU, self.OnHelpAbout, id=helpID)
+        self.Bind(wx.EVT_MENU, self.OnHelpFind, id=findID)
+        self.Bind(wx.EVT_MENU, self.OnFindNext, id=findnextID)
+        self.Bind(wx.EVT_COMMAND_FIND, self.OnFind)
+        self.Bind(wx.EVT_COMMAND_FIND_NEXT, self.OnFind)
+        self.Bind(wx.EVT_COMMAND_FIND_CLOSE, self.OnFindClose)
         self.mainmenu.Append(menu, '&Help')
         self.SetMenuBar(self.mainmenu)
 
@@ -408,10 +542,10 @@ class wxPythonDemo(wx.Frame):
 
         self.tree.Expand(root)
         self.tree.Expand(firstChild)
-        wx.EVT_TREE_ITEM_EXPANDED   (self.tree, tID, self.OnItemExpanded)
-        wx.EVT_TREE_ITEM_COLLAPSED  (self.tree, tID, self.OnItemCollapsed)
-        wx.EVT_TREE_SEL_CHANGED     (self.tree, tID, self.OnSelChanged)
-        wx.EVT_LEFT_DOWN            (self.tree,      self.OnTreeLeftDown)
+        self.tree.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, id=tID)
+        self.tree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, id=tID)
+        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=tID)
+        self.tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)
 
         # Create a Notebook
         self.nb = wx.Notebook(splitter2, -1, style=wx.CLIP_CHILDREN)
@@ -432,8 +566,8 @@ class wxPythonDemo(wx.Frame):
             def OnOvrSize(evt, ovr=self.ovr):
                 ovr.SetSize(evt.GetSize())
 
-            wx.EVT_SIZE(panel, OnOvrSize)
-            wx.EVT_ERASE_BACKGROUND(panel, EmptyHandler)
+            panel.Bind(wx.EVT_SIZE, OnOvrSize)
+            panel.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
 
 
         self.SetOverview(self.overviewText, overview)
@@ -442,7 +576,7 @@ class wxPythonDemo(wx.Frame):
         # Set up a notebook page for viewing the source code of each sample
         self.txt = DemoCodeViewer(self.nb, -1)
         self.nb.AddPage(self.txt, "Demo Code")
-        self.GetDemoFile('Main.py')
+        self.LoadDemoSource('Main.py')
 
 
         # Set up a log on the View Log Notebook page
@@ -459,8 +593,6 @@ class wxPythonDemo(wx.Frame):
         #wx.Log_SetActiveTarget(wx.LogStderr())
         #wx.Log_SetTraceMask(wx.TraceMessages)
 
-        self.Show(True)
-
 
         # add the windows to the splitter and split it.
         splitter2.SplitHorizontally(self.nb, self.log, -120)
@@ -476,7 +608,8 @@ class wxPythonDemo(wx.Frame):
             sz = splitter.GetSize()
             splitter.SetSashPosition(sz.height - 120, False)
             evt.Skip()
-        wx.EVT_SIZE(splitter2, SplitterOnSize)
+
+        splitter2.Bind(wx.EVT_SIZE, SplitterOnSize)
 
 
         # select initial items
@@ -550,7 +683,7 @@ class wxPythonDemo(wx.Frame):
             self.nb.DeletePage(2)
 
         if itemText == self.overviewText:
-            self.GetDemoFile('Main.py')
+            self.LoadDemoSource('Main.py')
             self.SetOverview(self.overviewText, overview)
             self.nb.Refresh();
             self.window = None
@@ -560,7 +693,11 @@ class wxPythonDemo(wx.Frame):
                 wx.BeginBusyCursor()
                 wx.LogMessage("Running demo %s.py..." % itemText)
                 try:
-                    self.GetDemoFile(itemText + '.py')
+                    self.LoadDemoSource(itemText + '.py')
+
+                    if (sys.modules.has_key(itemText)):
+                       reload(sys.modules[itemText])
+                    
                     module = __import__(itemText, globals())
                     self.SetOverview(itemText + " Overview", module.overview)
                 finally:
@@ -586,7 +723,7 @@ class wxPythonDemo(wx.Frame):
 
     #---------------------------------------------
     # Get the Demo files
-    def GetDemoFile(self, filename):
+    def LoadDemoSource(self, filename):
         self.txt.Clear()
         try:
             self.txt.SetValue(open(filename).read())
@@ -755,10 +892,9 @@ class MySplashScreen(wx.SplashScreen):
     def __init__(self):
         bmp = wx.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
         wx.SplashScreen.__init__(self, bmp,
-                                wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_TIMEOUT,
-                                4000, None, -1,
-                                style = wx.SIMPLE_BORDER|wx.FRAME_NO_TASKBAR|wx.STAY_ON_TOP)
-        wx.EVT_CLOSE(self, self.OnClose)
+                                 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
+                                 3000, None, -1)
+        self.Bind(wx.EVT_CLOSE, self.OnClose)
 
     def OnClose(self, evt):
         frame = wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
@@ -773,13 +909,17 @@ class MyApp(wx.App):
         the main frame when it is time to do so.
         """
 
-        #import locale
-        #self.locale = wx.Locale(wx.LANGUAGE_FRENCH)
-        #locale.setlocale(locale.LC_ALL, 'fr')
-
         wx.InitAllImageHandlers()
+
+        # Normally when using a SplashScreen you would create it, show
+        # it and then continue on with the applicaiton's
+        # initialization, finally creating and showing the main
+        # application window(s).  In this case we have nothing else to
+        # do so we'll delay showing the main frame until later (see
+        # OnClose above) so the users can see the SplashScrren effect.        
         splash = MySplashScreen()
         splash.Show()
+
         return True
 
 
@@ -792,7 +932,7 @@ def main():
         os.chdir(demoPath)
     except:
         pass
-    app = MyApp(wx.Platform == "__WXMAC__")
+    app = MyApp(0) #wx.Platform == "__WXMAC__")
     app.MainLoop()
 
 
@@ -814,7 +954,7 @@ platform GUI library, which is written in C++.
 <p> Like Python and wxWindows, wxPython is <b>Open Source</b> which
 means that it is free for anyone to use and the source code is
 available for anyone to look at and modify.  Or anyone can contribute
-fixes or enhnacments to the project.
+fixes or enhancements to the project.
 
 <p> wxPython is a <b>cross-platform</b> toolkit.  This means that the
 same program will run on multiple platforms without modification.