# For debugging
##wx.Trap();
-##print "wx.VERSION_STRING = ", wx.VERSION_STRING
-##print os.getpid();
+##print "wx.VERSION_STRING = %s (%s)" % (wx.VERSION_STRING, wx.USE_UNICODE and 'unicode' or 'ansi')
+##print "pid:", os.getpid()
##raw_input("Press Enter...")
_treeList = [
# new stuff
('Recent Additions/Updates', [
- 'StockButtons',
- 'Ticker',
- 'Choicebook',
+ 'AnalogClock',
+ 'AUI_DockingWindowMgr',
+ 'AUI_Notebook',
+ 'CheckListCtrlMixin',
+ 'ComboTreeBox',
+ 'Pickers',
+ 'PseudoDC',
+ 'RichTextCtrl',
+ 'Treebook',
+ 'Toolbook',
+ 'BitmapFromBuffer',
+ 'RawBitmapAccess',
+ 'DragScroller',
+## 'AlphaDrawing',
+ 'DelayedResult',
+ 'ExpandoTextCtrl',
+ 'ButtonPanel',
+ 'FlatNotebook',
]),
# managed windows == things with a (optional) caption you can close
('Frames and Dialogs', [
+ 'AUI_DockingWindowMgr',
'Dialog',
'Frame',
'MDIWindows',
'FindReplaceDialog',
'FontDialog',
'MessageDialog',
+ 'MultiChoiceDialog',
'PageSetupDialog',
'PrintDialog',
'ProgressDialog',
# dialogs from libraries
('More Dialogs', [
'ImageBrowser',
- 'MultipleChoiceDialog',
'ScrolledMessageDialog',
]),
'CheckBox',
'CheckListBox',
'Choice',
- 'Choicebook',
'ComboBox',
'Gauge',
'Grid',
'ListBox',
'ListCtrl',
'ListCtrl_virtual',
- 'Listbook',
+ 'ListCtrl_edit',
'Menu',
- 'Notebook',
'PopupMenu',
'PopupWindow',
'RadioBox',
'SpinCtrl',
'SplitterWindow',
'StaticBitmap',
+ 'StaticBox',
'StaticText',
'StatusBar',
'StockButtons',
'TreeCtrl',
'Validator',
]),
+
+ ('"Book" Controls', [
+ 'AUI_Notebook',
+ 'Choicebook',
+ 'Listbook',
+ 'Notebook',
+ 'Toolbook',
+ 'Treebook',
+ ]),
('Custom Controls', [
- 'AnalogClockWindow',
+ 'AnalogClock',
+ 'ButtonPanel',
'ColourSelect',
+ 'ComboTreeBox',
'Editor',
+ 'FlatNotebook',
'GenericButtons',
'GenericDirCtrl',
'LEDNumberCtrl',
#'RightTextCtrl', deprecated as we have wxTE_RIGHT now.
'Calendar',
'CalendarCtrl',
+ 'CheckListCtrlMixin',
'ContextHelp',
+ 'DatePickerCtrl',
'DynamicSashWindow',
'EditableListBox',
+ 'ExpandoTextCtrl',
'FancyText',
'FileBrowseButton',
'FloatBar',
'FloatCanvas',
+ 'FoldPanelBar',
+ 'GIFAnimationCtrl',
'HtmlWindow',
+ 'HyperLinkCtrl',
'IntCtrl',
'MVCTree',
'MaskedEditControls',
'MaskedNumCtrl',
- 'MimeTypesManager',
+ 'MediaCtrl',
+ 'MultiSplitterWindow',
+ 'Pickers',
'PyCrust',
'PyPlot',
'PyShell',
+ 'RichTextCtrl',
'ScrolledPanel',
'SplitTree',
'StyledTextCtrl_1',
# ditto
('Process and Events', [
+ 'DelayedResult',
'EventManager',
'KeyEvents',
'Process',
'PythonEvents',
'Threads',
'Timer',
- ##'infoframe', # needs better explaination and some fixing
+ ##'infoframe', # needs better explanation and some fixing
]),
# Clipboard and DnD
# Images
('Using Images', [
+## 'AlphaDrawing',
'ArtProvider',
+ 'BitmapFromBuffer',
'Cursor',
'DragImage',
+ 'GIFAnimationCtrl',
'Image',
'ImageAlpha',
'ImageFromStream',
'Mask',
+ 'RawBitmapAccess',
'Throbber',
]),
# Other stuff
('Miscellaneous', [
+## 'AlphaDrawing',
'ColourDB',
- ##'DialogUnits', # needs more explainations
+ ##'DialogUnits', # needs more explanations
+ 'DragScroller',
'DrawXXXList',
'FileHistory',
'FontEnumerator',
+ 'GLCanvas',
'Joystick',
+ 'MimeTypesManager',
+ 'MouseGestures',
'OGL',
'PrintFramework',
+ 'PseudoDC',
'ShapedWindow',
'Sound',
+ 'StandardPaths',
'Unicode',
]),
- # need libs not coming with the demo
- ('Samples using an external library', [
- 'GLCanvas',
- ]),
-
('Check out the samples dir too', [
]),
self.logTime = logTime
def DoLogString(self, message, timeStamp):
- if self.logTime:
- message = time.strftime("%X", time.localtime(timeStamp)) + \
- ": " + message
+ #print message, timeStamp
+ #if self.logTime:
+ # message = time.strftime("%X", time.localtime(timeStamp)) + \
+ # ": " + message
if self.tc:
self.tc.AppendText(message + '\n')
def GetTip(self):
return "This is my tip"
+#---------------------------------------------------------------------------
+# A class to be used to simply display a message in the demo pane
+# rather than running the sample itself.
+
+class MessagePanel(wx.Panel):
+ def __init__(self, parent, message, caption='', flags=0):
+ wx.Panel.__init__(self, parent)
+
+ # Make widgets
+ if flags:
+ artid = None
+ if flags & wx.ICON_EXCLAMATION:
+ artid = wx.ART_WARNING
+ elif flags & wx.ICON_ERROR:
+ artid = wx.ART_ERROR
+ elif flags & wx.ICON_QUESTION:
+ artid = wx.ART_QUESTION
+ elif flags & wx.ICON_INFORMATION:
+ artid = wx.ART_INFORMATION
+
+ if artid is not None:
+ bmp = wx.ArtProvider.GetBitmap(artid, wx.ART_MESSAGE_BOX, (32,32))
+ icon = wx.StaticBitmap(self, -1, bmp)
+ else:
+ icon = (32,32) # make a spacer instead
+
+ if caption:
+ caption = wx.StaticText(self, -1, caption)
+ caption.SetFont(wx.Font(28, wx.SWISS, wx.NORMAL, wx.BOLD))
+
+ message = wx.StaticText(self, -1, message)
+
+ # add to sizers for layout
+ tbox = wx.BoxSizer(wx.VERTICAL)
+ if caption:
+ tbox.Add(caption)
+ tbox.Add((10,10))
+ tbox.Add(message)
+
+ hbox = wx.BoxSizer(wx.HORIZONTAL)
+ hbox.Add((10,10), 1)
+ hbox.Add(icon)
+ hbox.Add((10,10))
+ hbox.Add(tbox)
+ hbox.Add((10,10), 1)
+
+ box = wx.BoxSizer(wx.VERTICAL)
+ box.Add((10,10), 1)
+ box.Add(hbox, 0, wx.EXPAND)
+ box.Add((10,10), 2)
+
+ self.SetSizer(box)
+ self.Fit()
+
#---------------------------------------------------------------------------
# A class to be used to display source code in the demo. Try using the
'fore:#000000,back:#FFFFFF,face:Courier New,size:9')
else:
self.StyleSetSpec(stc.STC_STYLE_DEFAULT,
- 'fore:#000000,back:#FFFFFF,face:Courier,size:12')
+ 'fore:#000000,back:#FFFFFF,face:Courier,size:9')
# Clear styles and revert to default.
self.StyleClearAll()
# The rest remains unchanged.
# Line numbers in margin
- self.StyleSetSpec(wx.stc.STC_STYLE_LINENUMBER,'fore:#000000,back:#99A9C2')
-
+ 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
def GetText(self):
return self.GetValue()
- def GetPositionFromLine(line):
+ def GetPositionFromLine(self, line):
return self.XYToPosition(0,line)
def GotoLine(self, line):
- pos = self.editor.GetPositionFromLine(line)
- self.editor.SetInsertionPoint(pos)
- self.editor.ShowPosition(pos)
+ pos = self.GetPositionFromLine(line)
+ self.SetInsertionPoint(pos)
+ self.ShowPosition(pos)
def SelectLine(self, line):
start = self.GetPositionFromLine(line)
try:
os.makedirs(GetModifiedDirectory())
if not os.path.exists(GetModifiedDirectory()):
- wx.LogMessage("BUG: Created demo directory but it still doesn't exit")
+ wx.LogMessage("BUG: Created demo directory but it still doesn't exist")
raise AssetionError
except:
wx.LogMessage("Error creating demo directory: %s" % GetModifiedDirectory())
def LoadDict(self, modID):
if self.name != __name__:
source = self.modules[modID][1]
- description = self.modules[modID][3]
+ #description = self.modules[modID][3]
+ description = self.modules[modID][2]
try:
self.modules[modID][0] = {}
self.box = wx.BoxSizer(wx.VERTICAL)
# Main Label
- self.box.Add(wx.StaticText(self, -1, "An error has occured while trying to run the demo")
+ self.box.Add(wx.StaticText(self, -1, "An error has occurred while trying to run the demo")
, 0, wx.ALIGN_CENTER | wx.TOP, 10)
# Exception Information
self.frame = frame
# Set the image
- icon = self.MakeIcon(images.getMondrianImage())
+ icon = self.MakeIcon(images.getWXPdemoImage())
self.SetIcon(icon, "wxPython Demo")
+ self.imgidx = 1
# bind some events
self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
icon size...
"""
if "wxMSW" in wx.PlatformInfo:
- img.Scale(16, 16)
+ img = img.Scale(16, 16)
elif "wxGTK" in wx.PlatformInfo:
- img.Scale(22, 22)
- # wxMac can be any size upto 128.128....
+ img = img.Scale(22, 22)
+ # wxMac can be any size upto 128x128, so leave the source img alone....
icon = wx.IconFromBitmap(img.ConvertToBitmap() )
return icon
def OnTaskBarClose(self, evt):
self.frame.Close()
- # because of the way wx.TaskBarIcon.PopupMenu is implemented we have to
- # prod the main idle handler a bit to get the window to actually close
- wx.GetApp().ProcessIdle()
-
def OnTaskBarChange(self, evt):
- icon = self.MakeIcon(images.getRobinImage())
- self.SetIcon(icon, "This is a new icon")
+ names = [ "WXPdemo", "Mondrian", "Pencil", "Carrot" ]
+ name = names[self.imgidx]
+
+ getFunc = getattr(images, "get%sImage" % name)
+ self.imgidx += 1
+ if self.imgidx >= len(names):
+ self.imgidx = 0
+
+ icon = self.MakeIcon(getFunc())
+ self.SetIcon(icon, "This is a new icon: " + name)
def OnTaskBarRemove(self, evt):
wx.Frame.__init__(self, parent, -1, title, size = (950, 720),
style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
+ self.SetMinSize((640,480))
+
self.loaded = False
self.cwd = os.getcwd()
self.curOverview = ""
self.codePage = None
self.shell = None
self.firstTime = True
+ self.finddlg = None
- icon = images.getMondrianIcon()
+ icon = images.getWXPdemoIcon()
self.SetIcon(icon)
- self.tbicon = DemoTaskBarIcon(self)
-
+ try:
+ self.tbicon = DemoTaskBarIcon(self)
+ except:
+ self.tbicon = None
+
wx.CallAfter(self.ShowTip)
self.otherWin = None
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())
+ wx.App.SetMacExitMenuItemId(item.GetId())
self.mainmenu.Append(menu, '&File')
# Make a Demo menu
menu.AppendMenu(wx.NewId(), item[0], submenu)
self.mainmenu.Append(menu, '&Demo')
- # Make a Demo Code menu
- #TODO: Add new menu items
- # Like the option-enabled entries to select the
- # active module
- #TODO: should we bother?
-
- #menu = wx.Menu()
- #saveID = wx.NewId()
- #restoreID = wx.NewId()
- #
- #menu.Append(saveID, '&Save\tCtrl-S', 'Save edited demo')
- #menu.Append(restoreID, '&Delete Modified\tCtrl-R', 'Delete modified copy')
- #self.Bind(wx.EVT_MENU, self.codePage.OnSave, id=saveID)
- #self.Bind(wx.EVT_MENU, self.codePage.OnRestore, id=restoreID)
- #self.mainmenu.Append(menu, 'Demo &Code')
- #
# Make a Help menu
menu = wx.Menu()
shellItem = menu.Append(-1, 'Open Py&Shell Window\tF5',
'An interactive interpreter window with the demo app and frame objects in the namesapce')
menu.AppendSeparator()
- helpItem = menu.Append(-1, '&About\tCtrl-H', 'wxPython RULES!!!')
- wx.App_SetMacAboutMenuItemId(helpItem.GetId())
+ helpItem = menu.Append(-1, '&About wxPython Demo', 'wxPython RULES!!!')
+ wx.App.SetMacAboutMenuItemId(helpItem.GetId())
self.Bind(wx.EVT_MENU, self.OnOpenShellWindow, shellItem)
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)
+ self.Bind(wx.EVT_FIND, self.OnFind)
+ self.Bind(wx.EVT_FIND_NEXT, self.OnFind)
+ self.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose)
+ self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateFindItems, findItem)
+ self.Bind(wx.EVT_UPDATE_UI, self.OnUpdateFindItems, findnextItem)
self.mainmenu.Append(menu, '&Help')
self.SetMenuBar(self.mainmenu)
self.finddata = wx.FindReplaceData()
+ self.finddata.SetFlags(wx.FR_DOWN)
if 0:
# This is another way to set Accelerators, in addition to
#wx.Log_SetTraceMask(wx.TraceMessages)
+ self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
+ wx.GetApp().Bind(wx.EVT_ACTIVATE_APP, self.OnAppActivate)
+
# add the windows to the splitter and split it.
splitter2.SplitHorizontally(self.nb, self.log, -160)
splitter.SplitVertically(self.tree, splitter2, 200)
- splitter.SetMinimumPaneSize(20)
- splitter2.SetMinimumPaneSize(20)
+ splitter.SetMinimumPaneSize(120)
+ splitter2.SetMinimumPaneSize(60)
# Make the splitter on the right expand the top window when resized
def SplitterOnSize(evt):
self.ShutdownDemoModule()
overviewText = ""
- # o If the demo returns a window it is placed in a tab.
- # o Otherwise, a placeholder tab is created, informing the user that the
- # demo runs outside the main window, and allowing it to be reloaded.
- # o If an error occurs (or has occured before) an error tab is created.
+ # o The RunTest() for all samples must now return a window that can
+ # be palced in a tab in the main notebook.
+ # o If an error occurs (or has occurred before) an error tab is created.
if module is not None:
wx.LogMessage("Running demo module...")
about.Destroy()
def OnHelpFind(self, event):
+ if self.finddlg != None:
+ return
+
self.nb.SetSelection(1)
self.finddlg = wx.FindReplaceDialog(self, self.finddata, "Find",
- wx.FR_NOUPDOWN |
- wx.FR_NOMATCHCASE |
- wx.FR_NOWHOLEWORD)
+ wx.FR_NOMATCHCASE | wx.FR_NOWHOLEWORD)
self.finddlg.Show(True)
+
+ def OnUpdateFindItems(self, evt):
+ evt.Enable(self.finddlg == None)
+
+
def OnFind(self, event):
editor = self.codePage.editor
self.nb.SetSelection(1)
end = editor.GetLastPosition()
textstring = editor.GetRange(0, end).lower()
- start = editor.GetSelection()[1]
findstring = self.finddata.GetFindString().lower()
- loc = textstring.find(findstring, start)
+ backward = not (self.finddata.GetFlags() & wx.FR_DOWN)
+ if backward:
+ start = editor.GetSelection()[0]
+ loc = textstring.rfind(findstring, 0, start)
+ else:
+ start = editor.GetSelection()[1]
+ loc = textstring.find(findstring, start)
if loc == -1 and start != 0:
# string not found, start at beginning
- start = 0
- loc = textstring.find(findstring, start)
+ if backward:
+ start = end
+ loc = textstring.rfind(findstring, 0, start)
+ else:
+ start = 0
+ loc = textstring.find(findstring, start)
if loc == -1:
dlg = wx.MessageDialog(self, 'Find String Not Found',
'Find String Not Found in Demo File',
return
else:
self.finddlg.Destroy()
+ self.finddlg = None
editor.ShowPosition(loc)
editor.SetSelection(loc, loc + len(findstring))
def OnFindClose(self, event):
event.GetDialog().Destroy()
+ self.finddlg = None
def OnOpenShellWindow(self, evt):
self.demoPage = None
self.codePage = None
self.mainmenu = None
- self.tbicon.Destroy()
+ if self.tbicon is not None:
+ self.tbicon.Destroy()
self.Destroy()
#---------------------------------------------
def OnIconfiy(self, evt):
- wx.LogMessage("OnIconfiy: %d" % evt.Iconized())
+ wx.LogMessage("OnIconfiy: %s" % evt.Iconized())
evt.Skip()
#---------------------------------------------
wx.LogMessage("OnMaximize")
evt.Skip()
+ #---------------------------------------------
+ def OnActivate(self, evt):
+ wx.LogMessage("OnActivate: %s" % evt.GetActive())
+ evt.Skip()
-
+ #---------------------------------------------
+ def OnAppActivate(self, evt):
+ wx.LogMessage("OnAppActivate: %s" % evt.GetActive())
+ evt.Skip()
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
class MySplashScreen(wx.SplashScreen):
def __init__(self):
- bmp = wx.Image(opj("bitmaps/splash.gif")).ConvertToBitmap()
+ bmp = wx.Image(opj("bitmaps/splash.png")).ConvertToBitmap()
wx.SplashScreen.__init__(self, bmp,
wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT,
- 3000, None, -1)
+ 5000, None, -1)
self.Bind(wx.EVT_CLOSE, self.OnClose)
+ self.fc = wx.FutureCall(2000, self.ShowMain)
+
def OnClose(self, evt):
+ # Make sure the default handler runs too so this window gets
+ # destroyed
+ evt.Skip()
self.Hide()
+
+ # if the timer is still running then go ahead and show the
+ # main frame now
+ if self.fc.IsRunning():
+ self.fc.Stop()
+ self.ShowMain()
+
+
+ def ShowMain(self):
frame = wxPythonDemo(None, "wxPython: (A Demonstration)")
frame.Show()
- evt.Skip() # Make sure the default handler runs too...
-
+ if self.fc.IsRunning():
+ self.Raise()
+
class MyApp(wx.App):
def OnInit(self):
the main frame when it is time to do so.
"""
+ wx.SystemOptions.SetOptionInt("mac.window-plain-transition", 1)
+
# For debugging
#self.SetAssertMode(wx.PYAPP_ASSERT_DIALOG)
# 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.
+ # ShowMain above) so the users can see the SplashScreen effect.
splash = MySplashScreen()
splash.Show()