]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/demo/Main.py
pop the menu up on mouse down, not up (this is more common behaviour in Windows and...
[wxWidgets.git] / wxPython / demo / Main.py
index f4a654fb827be07a7f39148ab0d291454758c5dc..884b8ee32c65e2b343ffc866b6b84d0ed1bc9ca0 100644 (file)
@@ -20,7 +20,9 @@ import images
 
 # For debugging
 ##wx.Trap();
-##print os.getpid(); raw_input("Press a key...")
+##print "wx.VERSION_STRING = ", wx.VERSION_STRING
+##print os.getpid();
+##raw_input("Press Enter...")
 
 
 #---------------------------------------------------------------------------
@@ -28,155 +30,149 @@ import images
 
 _treeList = [
     # new stuff
-    ('Recent Additions', [
-        'wxVListBox',
-        'wxListbook',
-        'wxMaskedNumCtrl',
-        'FloatCanvas',
-        'wxXmlResourceSubclass',
-        'wxGridBagSizer',
-        'Cursor',
-        'PyPlot',
+    ('Recent Additions and Updates', [
+        'OGL',
         ]),
 
     # managed windows == things with a (optional) caption you can close
     ('Base Frames and Dialogs', [
-        'wxDialog',
-        'wxFrame',
-        'wxMDIWindows',
-        'wxMiniFrame',
-        'wxWizard',
+        'Dialog',
+        'Frame',
+        'MDIWindows',
+        'MiniFrame',
+        'Wizard',
         ]),
 
     # the common dialogs
     ('Common Dialogs', [
-        'wxColourDialog',
-        'wxDirDialog',
-        'wxFileDialog',
-        'wxFileDialog_Save',
-        'wxFindReplaceDialog',
-        'wxFontDialog',
-        'wxMessageDialog',
-        'wxPageSetupDialog',
-        'wxPrintDialog',
-        'wxProgressDialog',
-        'wxSingleChoiceDialog',
-        'wxTextEntryDialog',
+        'ColourDialog',
+        'DirDialog',
+        'FileDialog',
+        'FileDialog_Save',
+        'FindReplaceDialog',
+        'FontDialog',
+        'MessageDialog',
+        'PageSetupDialog',
+        'PrintDialog',
+        'ProgressDialog',
+        'SingleChoiceDialog',
+        'TextEntryDialog',
         ]),
 
     # dialogs from libraries
     ('More Dialogs', [
-        'ErrorDialogs',
         'ImageBrowser',
-        'wxMultipleChoiceDialog',
-        'wxScrolledMessageDialog',
+        'MultipleChoiceDialog',
+        'ScrolledMessageDialog',
         ]),
 
     # core controls
     ('Core Windows/Controls', [
+        'BitmapButton',
+        'Button',
+        'CheckBox',
+        'CheckListBox',
+        'Choice',
+        'ComboBox',
+        'Gauge',
+        'Grid',
+        'Grid_MegaExample',
+        'ListBox',
+        'ListCtrl',
+        'ListCtrl_virtual',
+        'Listbook',
+        'Menu',
+        'Notebook',
         'PopupMenu',
-        'wxButton',
-        'wxCheckBox',
-        'wxCheckListBox',
-        'wxChoice',
-        'wxComboBox',
-        'wxGauge',
-        'wxGrid',
-        'wxGrid_MegaExample',
-        'wxListbook',
-        'wxListBox',
-        'wxListCtrl',
-        'wxListCtrl_virtual',
-        'wxMenu',
-        'wxNotebook',
-        'wxPopupWindow',
-        'wxRadioBox',
-        'wxRadioButton',
-        'wxSashWindow',
-        'wxScrolledWindow',
-        'wxSlider',
-        'wxSpinButton',
-        'wxSpinCtrl',
-        'wxSplitterWindow',
-        'wxStaticBitmap',
-        'wxStaticText',
-        'wxStatusBar',
-        'wxTextCtrl',
-        'wxToggleButton',
-        'wxToolBar',
-        'wxTreeCtrl',
-        'wxValidator',
+        'PopupWindow',
+        'RadioBox',
+        'RadioButton',
+        'SashWindow',
+        'ScrolledWindow',
+        'Slider',
+        'SpinButton',
+        'SpinCtrl',
+        'SplitterWindow',
+        'StaticBitmap',
+        'StaticText',
+        'StatusBar',
+        'TextCtrl',
+        'ToggleButton',
+        'ToolBar',
+        'TreeCtrl',
+        'Validator',
         ]),
 
     ('Custom Controls', [
         'AnalogClockWindow',
         'ColourSelect',
+        'Editor',
         'GenericButtons',
-        'wxEditor',
-        'wxGenericDirCtrl',
-        'wxLEDNumberCtrl',
-        'wxMultiSash',
-        'wxPopupControl',
-        'wxPyColourChooser',
-        'wxTreeListCtrl',
+        'GenericDirCtrl',
+        'LEDNumberCtrl',
+        'MultiSash',
+        'PopupControl',
+        'PyColourChooser',
+        'TreeListCtrl',
     ]),
     
     # controls coming from other libraries
     ('More Windows/Controls', [
-        #'wxFloatBar',          deprecated
-        #'wxMVCTree',           deprecated
-        #'wxRightTextCtrl',     deprecated as we have wxTE_RIGHT now.
+        'ActiveX_FlashWindow',
+        'ActiveX_IEHtmlWindow',
+        'ActiveX_PDFWindow',
+        #'RightTextCtrl',     deprecated as we have wxTE_RIGHT now.
+        'Calendar',
+        'CalendarCtrl',
         'ContextHelp',
+        'DynamicSashWindow',
+        'EditableListBox',
         'FancyText',
-        'FloatCanvas',
         'FileBrowseButton',
+        'FloatBar',  
+        'FloatCanvas',
+        'HtmlWindow',
+        'IntCtrl',
+        'MVCTree',   
         'MaskedEditControls',
-        'PyShell',
+        'MaskedNumCtrl',
+        'MimeTypesManager',
         'PyCrust',
         'PyPlot',
+        'PyShell',
+        'ScrolledPanel',
         'SplitTree',
+        'StyledTextCtrl_1',
+        'StyledTextCtrl_2',
         'TablePrint',
         'Throbber',
-        'wxCalendar',
-        'wxCalendarCtrl',
-        'wxDynamicSashWindow',
-        'wxEditableListBox',
-        'wxHtmlWindow',
-        'wxIEHtmlWin',
-        'wxIntCtrl',
-        'wxMimeTypesManager',
-        'wxMaskedNumCtrl',
-        'wxScrolledPanel',
-        'wxStyledTextCtrl_1',
-        'wxStyledTextCtrl_2',
-        'wxTimeCtrl',
-        'wxVListBox',
+        'TimeCtrl',
+        'VListBox',
         ]),
 
     # How to lay out the controls in a frame/dialog
     ('Window Layout', [
+        'GridBagSizer',
         'LayoutAnchors',
+        'LayoutConstraints',
         'Layoutf',
         'RowColSizer',
+        'ScrolledPanel',
         'Sizers',
-        'wxGridBagSizer',
-        'wxLayoutConstraints',
-        'wxScrolledPanel',
-        'wxXmlResource',
-        'wxXmlResourceHandler',
-        'wxXmlResourceSubclass',
+        'XmlResource',
+        'XmlResourceHandler',
+        'XmlResourceSubclass',
         ]),
 
     # ditto
     ('Process and Events', [
         'EventManager',
-        'infoframe',
-        'OOR',
+        'KeyEvents',
+        'Process',
         'PythonEvents',
         'Threads',
-        'wxKeyEvents',
-        'wxProcess',
-        'wxTimer',
+        'Timer',
+        'infoframe',
         ]),
 
     # Clipboard and DnD
@@ -188,13 +184,14 @@ _treeList = [
 
     # Images
     ('Using Images', [
+        'ArtProvider',
         'Cursor',
+        'DragImage',
+        'Image',
+        'ImageAlpha',
+        'ImageFromStream',
+        'Mask',
         'Throbber',
-        'wxArtProvider',
-        'wxDragImage',
-        'wxImage',
-        'wxImageFromStream',
-        'wxMask',
         ]),
 
     # Other stuff
@@ -202,24 +199,19 @@ _treeList = [
         'ColourDB',
         'DialogUnits',
         'DrawXXXList',
+        'FileHistory',
         'FontEnumerator',
-        'NewNamespace',
+        'Joystick',
+        'OGL',
         'PrintFramework',
         'ShapedWindow',
-        'Throbber',
+        'Sound',
         'Unicode',
-        'wxFileHistory',
-        'wxJoystick',
-        'wxOGL',
-        'wxWave',
         ]),
 
     # need libs not coming with the demo
-    ('Objects using an external library', [
-        'ActiveXWrapper_Acrobat',
-        'ActiveXWrapper_IE',
-        'wxGLCanvas',
-        #'wxPlotCanvas', # deprecated, use PyPlot
+    ('Samples using an external library', [
+        'GLCanvas',
         ]),
 
 
@@ -253,17 +245,17 @@ 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
+# wxSTC in the StyledTextCtrl_2 sample first, fall back to wxTextCtrl
 # if there is an error, such as the stc module not being present.
 #
 
 try:
     ##raise ImportError
     from wx import stc
-    from wxStyledTextCtrl_2 import PythonSTC
+    from StyledTextCtrl_2 import PythonSTC
     class DemoCodeViewer(PythonSTC):
         def __init__(self, parent, ID):
-            PythonSTC.__init__(self, parent, ID)
+            PythonSTC.__init__(self, parent, ID, wx.BORDER_NONE)
             self.SetUpEditor()
 
         # Some methods to make it compatible with how the wxTextCtrl is used
@@ -377,8 +369,8 @@ try:
             # Python styles
             self.StyleSetSpec(wx.stc.STC_P_DEFAULT, 'fore:#000000')
             # Comments
-            self.StyleSetSpec(wx.stc.STC_P_COMMENTLINE, 'fore:#00CC00,back:#F0FFF0')
-            self.StyleSetSpec(wx.stc.STC_P_COMMENTBLOCK, 'fore:#00CC00,back:#F0FFF0')
+            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
@@ -430,7 +422,8 @@ 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 = ""
@@ -439,8 +432,16 @@ 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
+            if wx.Platform == '__WXGTK__':
+                dimension = 22
+            else:
+                dimension = 16
+            icon = wx.IconFromBitmap(
+                images.getMondrianImage().Scale(dimension,dimension).ConvertToBitmap() )
+            #icon = wx.Icon('bmp_source/mondrian.ico', wx.BITMAP_TYPE_ICO)
+            #icon = images.getMondrianIcon()
             self.tbicon = wx.TaskBarIcon()
             self.tbicon.SetIcon(icon, "wxPython Demo")
             self.tbicon.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
@@ -459,8 +460,24 @@ class wxPythonDemo(wx.Frame):
         self.Centre(wx.BOTH)
         self.CreateStatusBar(1, wx.ST_SIZEGRIP)
 
-        splitter = wx.SplitterWindow(self, -1)
-        splitter2 = wx.SplitterWindow(splitter, -1)
+        splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D)
+        splitter2 = wx.SplitterWindow(splitter, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D)
+
+        # Set up a log on the View Log Notebook page
+        self.log = wx.TextCtrl(splitter2, -1,
+                              style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
+        
+        # Set the wxWindows log target to be this textctrl
+        #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
+
+        # But instead of the above we want to show how to use our own wx.Log class
+        wx.Log_SetActiveTarget(MyLog(self.log))
+
+        # for serious debugging
+        #wx.Log_SetActiveTarget(wx.LogStderr())
+        #wx.Log_SetTraceMask(wx.TraceMessages)
+
+
 
         def EmptyHandler(evt): pass
         #splitter.Bind(wx.EVT_ERASE_BACKGROUND, EmptyHandler)
@@ -472,10 +489,15 @@ class wxPythonDemo(wx.Frame):
         # Make a File menu
         self.mainmenu = wx.MenuBar()
         menu = wx.Menu()
-        exitID = wx.NewId()
-        menu.Append(exitID, 'E&xit\tAlt-X', 'Get the heck outta here!')
-        self.Bind(wx.EVT_MENU, self.OnFileExit, id=exitID)
-        wx.App_SetMacExitMenuItemId(exitID)
+        item = menu.Append(-1, '&Redirect Output',
+                           'Redirect print statements to a window',
+                           wx.ITEM_CHECK)
+        self.Bind(wx.EVT_MENU, self.OnToggleRedirect, item)
+        
+        item = menu.Append(-1, 'E&xit\tAlt-X', 'Get the heck outta here!')
+        self.Bind(wx.EVT_MENU, self.OnFileExit, item)
+        wx.App_SetMacExitMenuItemId(item.GetId())
+
         self.mainmenu.Append(menu, '&File')
 
         # Make a Demo menu
@@ -483,9 +505,8 @@ class wxPythonDemo(wx.Frame):
         for item in _treeList:
             submenu = wx.Menu()
             for childItem in item[1]:
-                mID = wx.NewId()
-                submenu.Append(mID, childItem)
-                self.Bind(wx.EVT_MENU, self.OnDemoMenu, id=mID)
+                mi = submenu.Append(-1, childItem)
+                self.Bind(wx.EVT_MENU, self.OnDemoMenu, mi)
             menu.AppendMenu(wx.NewId(), item[0], submenu)
         self.mainmenu.Append(menu, '&Demo')
 
@@ -495,14 +516,14 @@ class wxPythonDemo(wx.Frame):
         findID = wx.NewId()
         findnextID = wx.NewId()
         menu = wx.Menu()
-        menu.Append(findID, '&Find\tCtrl-F', 'Find in the Demo Code')
-        menu.Append(findnextID, 'Find &Next\tF3', 'Find Next')
+        findItem = menu.Append(-1, '&Find\tCtrl-F', 'Find in the Demo Code')
+        findnextItem = menu.Append(-1, 'Find &Next\tF3', 'Find Next')
         menu.AppendSeparator()
-        menu.Append(helpID, '&About\tCtrl-H', 'wxPython RULES!!!')
-        wx.App_SetMacAboutMenuItemId(helpID)
-        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)
+        helpItem = menu.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
+        wx.App_SetMacAboutMenuItemId(helpItem.GetId())
+        self.Bind(wx.EVT_MENU, self.OnHelpAbout, helpItem)
+        self.Bind(wx.EVT_MENU, self.OnHelpFind,  findItem)
+        self.Bind(wx.EVT_MENU, self.OnFindNext,  findnextItem)
         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)
@@ -577,23 +598,6 @@ class wxPythonDemo(wx.Frame):
         self.LoadDemoSource('Main.py')
 
 
-        # Set up a log on the View Log Notebook page
-        self.log = wx.TextCtrl(splitter2, -1,
-                              style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)
-
-        # Set the wxWindows log target to be this textctrl
-        #wx.Log_SetActiveTarget(wx.LogTextCtrl(self.log))
-
-        # But instead of the above we want to show how to use our own wx.Log class
-        wx.Log_SetActiveTarget(MyLog(self.log))
-
-        # for serious debugging
-        #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)
         splitter.SplitVertically(self.tree, splitter2, 180)
@@ -602,7 +606,7 @@ class wxPythonDemo(wx.Frame):
         splitter2.SetMinimumPaneSize(20)
 
 
-        # Make the splitter on the right expand the top wind when resized
+        # Make the splitter on the right expand the top window when resized
         def SplitterOnSize(evt):
             splitter = evt.GetEventObject()
             sz = splitter.GetSize()
@@ -626,7 +630,7 @@ class wxPythonDemo(wx.Frame):
                 self.tree.EnsureVisible(selectedDemo)
 
 
-        wx.LogMessage('window handle: %s' % self.GetHandle())
+##        wx.LogMessage('window handle: %s' % self.GetHandle())
 
 
     #---------------------------------------------
@@ -685,7 +689,6 @@ class wxPythonDemo(wx.Frame):
         if itemText == self.overviewText:
             self.LoadDemoSource('Main.py')
             self.SetOverview(self.overviewText, overview)
-            self.nb.Refresh();
             self.window = None
 
         else:
@@ -704,21 +707,17 @@ class wxPythonDemo(wx.Frame):
                     wx.EndBusyCursor()
                 self.tree.Refresh()
 
-                # in case runTest is modal, make sure things look right...
-                self.nb.Refresh();
-                wx.SafeYield()
-
                 self.window = module.runTest(self, self.nb, self) ###
                 if self.window is not None:
                     self.nb.AddPage(self.window, 'Demo')
                     self.nb.SetSelection(2)
-                    self.nb.Refresh()  # without this wxMac has troubles showing the just added page
 
             else:
                 self.ovr.SetPage("")
                 self.txt.Clear()
                 self.window = None
 
+        self.tree.SetFocus()
 
 
     #---------------------------------------------
@@ -747,6 +746,15 @@ class wxPythonDemo(wx.Frame):
     def OnFileExit(self, *event):
         self.Close()
 
+    def OnToggleRedirect(self, event):
+        app = wx.GetApp()
+        if event.Checked():
+            app.RedirectStdio()
+            print "Print statements and other standard output will now be directed to this window."
+        else:
+            app.RestoreStdio()
+            print "Print statements and other standard output will now be sent to the usual location."
+        
     def OnHelpAbout(self, event):
         from About import MyAboutBox
         about = MyAboutBox(self)
@@ -804,8 +812,6 @@ class wxPythonDemo(wx.Frame):
         self.dying = True
         self.window = None
         self.mainmenu = None
-        if hasattr(self, "tbicon"):
-            del self.tbicon
         self.Destroy()
 
 
@@ -892,12 +898,12 @@ 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.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
+                                 3000, None, -1)
         self.Bind(wx.EVT_CLOSE, self.OnClose)
 
     def OnClose(self, evt):
+        self.Hide()
         frame = wxPythonDemo(None, -1, "wxPython: (A Demonstration)")
         frame.Show()
         evt.Skip()  # Make sure the default handler runs too...
@@ -910,13 +916,15 @@ 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 SplashScreen effect.        
         splash = MySplashScreen()
         splash.Show()
+
         return True
 
 
@@ -929,7 +937,7 @@ def main():
         os.chdir(demoPath)
     except:
         pass
-    app = MyApp(0) #wx.Platform == "__WXMAC__")
+    app = MyApp(0) ##wx.Platform == "__WXMAC__")
     app.MainLoop()
 
 
@@ -940,13 +948,12 @@ def main():
 overview = """<html><body>
 <h2>wxPython</h2>
 
-<p> wxPython is a <b>GUI toolkit</b> for the <a
-href="http://www.python.org/">Python</a> programming language.  It
-allows Python programmers to create programs with a robust, highly
-functional graphical user interface, simply and easily.  It is
-implemented as a Python extension module (native code) that wraps the
-popular <a href="http://wxwindows.org/front.htm">wxWindows</a> cross
-platform GUI library, which is written in C++.
+<p> wxPython is a <b>GUI toolkit</b> for the Python programming
+language.  It allows Python programmers to create programs with a
+robust, highly functional graphical user interface, simply and easily.
+It is implemented as a Python extension module (native code) that
+wraps the popular wxWindows cross 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