Python-spe-users digest, Vol 1 #45 - 2 msgs

python-spe-users-request-tdrK/[email protected] Thu, 15 Dec 2005 12:53:00 +0100
Newsgroups gmane.comp.python.spe.user
Message-ID <[email protected]>
Send Python-spe-users mailing list submissions to
	[email protected]

To subscribe or unsubscribe via the World Wide Web, visit
	http://lists.berlios.de/mailman/listinfo/python-spe-users
or, via email, send a message with subject or body 'help' to
	[email protected]

You can reach the person managing the list at
	[email protected]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Python-spe-users digest..."


_______________________________________________
http://pythonide.stani.be
http://pythonide.stani.be/manual/html/manual.html
http://pythonide.stani.be/blog/sm_donate _______________________________________________


Today's Topics:

   1. SPE Issues - 0.8.1c (Michael Foord)
   2. Re: single instance vs multiple instance app (SPE Stani's Python Editor)

--__--__--

Message: 1
Date: Thu, 15 Dec 2005 11:28:24 +0000
From: Michael Foord <mike-SGbQuXsgMABWk0Htik3J/[email protected]>
To: python-spe-users-tdrK/[email protected]
Subject: [spe-users] SPE Issues - 0.8.1c
Reply-To: [email protected]

I've just installed SPE 0.8.1c on my windoze machine. (ActivePython
2.4.2, XP SP2, wxPython 2.6.10)

I see the new way of running files. I can see how it *might* be an
advantage - but I can also see how (when doing quick test-run-debug
cycles), it now takes me 3 or more key presses to test a script instead
of just one !! :-(

This is the main reason I rejected the PyWin editor, but now SPE takes
*more* keypresses.

F9 now runs the program in a terminal instead of the shell.

That means that to run a program I now have to press F9, then hit run, then
manually exit the terminal (assuming I want to actually see the output -
rather than just have the terminal window vanish).

I used to just hit F9. :-(

I know I can hit shift-F9 and not have to hit one of the buttons - but
it's hardly more convenient !

It feels like SPE might be subject to freeping creaturism ! (adding
extra features to something that already works very well...)

(Redirect output to SPE shell doesn't seem to work - and why *should* I
have to hit shift F9 when I used to be able to hit just F9)

It also looks like it doesn't look like it prompt you to save before
running like it used to.
(Even if the correct preference is set).


Another request - can the html manual be included in the distribution,
and the 'manual' menu option launch the local one instead of the online
one ? I don't have internet access at work (censored) or home (no
connection) - so I effectively have no manual.

All the best,


Fuzzyman
http://www.voidspace.org.uk/python/index.shtml


--__--__--

Message: 2
Date: Wed, 14 Dec 2005 23:28:12 +0100
From: "SPE Stani's Python Editor" <[email protected]>
To: python-spe-users-tdrK/[email protected]
Subject: Re: [spe-users] single instance vs multiple instance app
Reply-To: [email protected]

------=_Part_1149_17205073.1134599292906
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Jose,
Next time post me files privately, but thanks a lot. Well, I did it a bit
differently but it's there for next release 0.8.1.c!
Stani

On 12/14/05, Jose Galvez <[email protected]> wrote:
>
> Dear Stani,
>
> I've modified your smdi.py file (from your most recent 0.8.1b build) to
> include a single vs multiple instance flag (see line 1161) if its set to
> true then spe behaves as a single app utilizing
> singleApp.SingleInstanceApp.  If its false it falls back to the current
> default utilizing wx.App.  I also modified the appropriate lines
> 12005-1208 and 1217-1221 to support the singleInstance flag as well.
> I've not dived deep enough into the code to see how to add this as a
> real preference in the preference panel, but I could.  In any event
> please find the attached file for your consideration.
>
> PS as always thanks for writing such a great program, spe is my python
> editor of choice!
> Jose
>
>
>
> ####(c)www.stani.be------------------------------------------------------=
-------
>
> try:
>     import sm, sm.osx
>     INFO=3Dsm.INFO.copy()
>
>     INFO['title']     =3D INFO['titleFull'] =3D 'Sdi/Mdi Framework'
>
>     INFO['description']=3D\
>     """Framework which makes it easy to switch between Sdi (Linux/Mac)
>     and Mdi (Windows).
>     """
>
>     __doc__=3DINFO['doc']%INFO
> except:
>     __doc__=3D=3D"Stani's Multiple Document Interface (c)www.stani.be"
>
> """
> Attributes of Application:
>     - properties:
>         - children
>         - config
>         - DEBUG
>         - imagePath
>         - mdi
>         - title
>         - parentFrame
>         - parentPanel
>         - pos
>         - size
>         - style
>     - methods:
>         - SetMdi
>     - classes:
>         - ChildFrame
>         - ChildPanel
>         - MenuBar
>         - ParentFrame
>         - ParentPanel
>         - StatusBar
>         - ToolBar
>
> Attributes of Frame:
>     - properties:
>         - app
>         - dead
>         - menuBar
>         - parentFrame
>         - toolBar
>     - methods:
>         - getIndex
>         - (maximize)
>         - setTitle
>         - SetStatusText
>     - events:
>         - bindTabs
>         - unbindTabs
>         - onFrameActivate
>         - onFrameClose
>         - onFrameMove
>         - onFrameSize
>         - (onFrameTab)
>     - classes:
>         - Panel
>
> Attributes of Panel:
>     - properties:
>         - changed
>         - frame
>         - title
>         - parentFrame
>         - parentPanel
>     - methods:
>
> Attributes of MenuBar:
>     - properties:
>         - app
>         - frame
>         - parentFrame
>         - parentPanel
>         - toolBar
>
> Attributes of ToolBar:
>     - properties:
>         - app
>         - frame
>         - menuBar
>
> Todo:
> - MDI_TABS IS NOT WORKING!! THIS SHOULD BE FIXED
> - icon support
> """
>
> ####Modules
> import  os, sys, pprint
> import  wx
> from    wx.lib.evtmgr import eventManager
> import  singleApp
> import NotebookCtrl
> wx_Notebook =3D NotebookCtrl.NotebookCtrl
> #import sm.spy
>
> ####Constants
> #values
> SDI                 =3D 0
> MDI_SASH            =3D 1
> MDI_SASH_TABS       =3D 2
> MDI                 =3D 3
> MDI_TABS            =3D 4
> MDI_SPLIT           =3D 5
> #descriptions
> SDI_MAC             =3D "single with tabs (mac, linux, windows)"
> MDI_SASH_WIN        =3D "multiple with sash (windows)"
> MDI_SASH_TABS_LINUX =3D "multiple with sash & tabs (linux)"
> MDI_SASH_TABS_WIN   =3D "multiple with sash & tabs (windows default)"
> MDI_WIN             =3D "multiple with palette (windows)"
> MDI_MAC             =3D "single with palette (mac)"
> MDI_TABS_LINUX      =3D "multiple with tabs (linux)"
> MDI_TABS_WIN        =3D "multiple with tabs (windows)"
> MDI_TABS_MAC        =3D "single with tabs (mac)"
> MDI_SPLIT_ALL       =3D "multiple with sash & tabs (mac default,linux
> default,windows)"
>
> DEFAULT             =3D "<default>"
> DI                  =3D {SDI_MAC                  : SDI,
>                        MDI_SASH_WIN             : MDI_SASH,
>                        MDI_SASH_TABS_LINUX      : MDI_SASH,
>                        MDI_SASH_TABS_WIN        : MDI_SASH_TABS,
>                        MDI_WIN                  : MDI,
>                        MDI_MAC                  : MDI,
>                        MDI_TABS_LINUX           : MDI,
>                        #MDI_TABS_WIN             : MDI_TABS,
>                        MDI_TABS_MAC             : MDI_TABS,
>                        MDI_SPLIT_ALL            : MDI_SPLIT,
>                        DEFAULT  : -1}
>
> PLATFORM                    =3D sys.platform
> WIN                         =3D PLATFORM.startswith('win')
> DARWIN                      =3D PLATFORM.startswith('darwin')
>
> if DARWIN:
>     print 'If spe is unstable, try this interface from the
> preferences:\n  "%s"\n'%MDI_SPLIT_ALL
>
> #wx related
> FULL_REPAINT_ON_RESIZE      =3D wx.FULL_REPAINT_ON_RESIZE
> POS                         =3D (10,10)
> SIZE                        =3D (600,400)
> STYLE_CHILDFRAME            =3D wx.DEFAULT_FRAME_STYLE
> STYLE_NOTEBOOK              =3D
> FULL_REPAINT_ON_RESIZE|wx.CLIP_CHILDREN|wx.NO_BORDER
> STYLE_PARENTFRAME           =3D wx.DEFAULT_FRAME_STYLE #| wx.MAXIMIZE
> STYLE_SPLIT                 =3D wx.SP_NOBORDER
> STYLE_TOOLBAR               =3D wx.TB_HORIZONTAL | wx.NO_BORDER | wx.TB_F=
LAT|
> wx.TB_TEXT
> TABSASH_HEIGHT              =3D 30
> TITLE                       =3D 'www.stani.be'
> UNNAMED                     =3D 'unnamed'
>
> ####Menu helper function
> def _(x):
>     if DARWIN:
>         return x#.replace('Ctrl','Cmd')
>     else:
>         return x
>
> def _strip(x):
>     return x.replace(' ','_').replace('-','_').replace('&&
> ','').replace('&','').replace('.','').replace('(','').replace(')','')
>
> def menuWrite(menuBar,f=3D'menu.txt'):
>     labels =3D []
>     for m in range(menuBar.GetMenuCount()):
>         menu        =3D menuBar.GetMenu(m)
>         menuLabel   =3D menuBar.GetLabelTop(m)
>         for item in menu.GetMenuItems():
>             label   =3D _strip(item.GetLabel())
>             if label:
>                 labels.append((menuLabel,item.GetLabel()))
>     #events
>     result =3D '\tdef __smdi__(self):\n'
>     for label in labels:
>         label =3D _strip(label[1])
>         result+=3D '\t\twx.EVT_MENU(self,%s,self.menu_%s)\n'%(label.upper=
(),
> label.lower())
>     result+=3D '\n'
>     for label in labels:
>         result+=3D'\tdef
> menu_%s(self):\n\t\t"""%s"""\n\t\tpass\n\n'%(_strip(label[1].lower()),'%s=
 >
> %s'%label)
>     print result
>     print os.getcwd()
>     print f
>     f   =3D open(f,'w')
>     f.write(result)
>     f.close()
>
> def test_menuWrite():
>     import menu
>     menuWrite(wxgMenu.Bar())
>
> ####Base
> WX_BITMAP       =3D wx.Bitmap
>
> class Bitmap:
>     def __init__(self,path,app):
>         self.path =3D path
>         self.app =3D app
>     def __call__(self,x,t=3Dwx.BITMAP_TYPE_ANY):
>         path =3D os.path.join(self.path,os.path.basename(x))
>         #if self.app.DEBUG:
>         #    print 'Bitmap: %s<%s'%(x,path)
>         return WX_BITMAP(path,t)
>
> class DummyPage(wx.StaticText):
>     """Page to fill the tabs (not meant to be visible)."""
>     def __init__(self,tabs):
>         wx.StaticText.__init__(self, tabs, wx.ID_ANY, "SPE bug: This
> shouldn't be visible")
>
> ##class NotebookPlus(wx.Notebook):
> ##    def __init__(self,app,*args,**keyw):
> ##        wx.Notebook.__init__(self,*args,**keyw)
> ##        self.app =3D app
> ##        self.Bind(wx.EVT_MIDDLE_UP,self.onFrameMiddleClick)
> ##        self.Bind(wx.EVT_LEFT_DCLICK,self.onFrameMiddleClick)
> ##
> ##    def onFrameMiddleClick(self,event):
> ##        """When a tab is middle clicked (EVT_MOUSE_LEFT&HitTest)."""
> ##        mousePos    =3D event.GetPosition()
> ##        index, other =3D self.HitTest(mousePos)
> ##        if self.app.mdi in [SDI,MDI_TABS]: #no parent tab
> ##            zero =3D 0
> ##        else:
> ##            zero =3D -1
> ##        if index>zero:
> ##            self.app.children[index-zero-1].frame.onFrameClose()
>
> class NotebookPlus(NotebookCtrl.NotebookCtrl):
>     def __init__(self,app,*args,**keyw):
>         self.app =3D app
>         keyw['size'] =3D wx.Size(26,26)
>         if keyw.has_key('style'):
>             del keyw['style']
>         NotebookCtrl.NotebookCtrl.__init__(self,*args,**keyw)
>         self.SetDrawX(True, 2)
>         self.SetUseFocusIndicator(False)
>         self.SetHighlightSelection(True)
>         self.Bind(NotebookCtrl.EVT_NOTEBOOKCTRL_PAGE_CLOSING,
> self.onClosing)
>
>     def onClosing(self,event):
>         """When a tab is middle clicked (EVT_MOUSE_LEFT&HitTest)."""
>         index =3D event.GetSelection()
>         if self.app.mdi in [SDI,MDI_TABS]: #no parent tab
>             zero =3D 0
>         else:
>             zero =3D -1
>         if index>zero:
>             self.app.children[index-zero-1].frame.onFrameClose()
>
>
> ####Foundation Classes
> class Framework:
>     """Foundation class for every frame."""
>     def __init__(self,app,Panel,parentFrame,page=3D'',extra=3D'',**option=
s):
>         #stage
>         self.__before__(app         =3D app,
>                         Panel       =3D Panel,
>                         parentFrame =3D parentFrame,
>                         page        =3D page,
>                         extra       =3D extra)
>         self.__stage__(page         =3D page,
>                        extra        =3D extra,
>                        **options)
>         self.__after__()
>         ##rest
>         self.__menu__()
>         self.__tool__(app)
>         self.__statusBar__()
>         self.__finish__()
>         self.__events__()
>         #show
>         self.Show(True)
>
>     #---components
>     def __before__(self,app,Panel,parentFrame,page,extra):
>         """Reference frame attributes (not overwritten)."""
>         self.app            =3D app
>         self.Panel          =3D Panel
>         self.parentFrame    =3D parentFrame
>         self.dead           =3D False # todo: is this still necessary
>         if not hasattr(self,'isSdiParent'):
>             self.isSdiParent    =3D False
>         self.page           =3D page
>         self.extra          =3D extra
>
>
>     def __stage__(self,page,extra,**options):
>         """Create notebook (to switch between documents) & panel
>         This is mostly overwritten."""
>         self.panel  =3D self.Panel(parent=3Dself,**options)
>
>     def __after__(self):
>         """Reference panel attributes  (not overwritten)."""
>         panel               =3D self.panel
>         panel.app           =3D self.app
>         panel.frame         =3D self
>         panel.parentFrame   =3D self.parentFrame
>         panel.parentPanel   =3D self.parentFrame.panel
>         panel.changed       =3D False
>
>     def __menu__(self):
>         """Create: Framework: menu."""
>         app                     =3D self.app
>         if app.MenuBar and not self.noMenu:
>             if app.DEBUG:
>                 print """Create: Framework: menu."""
>             if app.mdi:
>                 frame           =3D self.app
>             else:
>                 frame           =3D self
>             self.menuBar        =3D menuBar =3D app.MenuBar(app=3Dself.ap=
p
> ,frame=3Dframe)
>             self.SetMenuBar(menuBar)
>             #reference
>             menuBar.app         =3D app
>             #create
>             menuBar.frame       =3D self
>             menuBar.parentFrame =3D self.parentFrame
>             menuBar.parentPanel =3D self.parentFrame.panel
>             if hasattr(self,'palette'):
>                 self.palette.panel.app      =3D app
>                 self.palette.panel.menuBar  =3D menuBar
>         else:
>             self.menuBar        =3D None
>
>     def __tool__(self,app):
>         """Create toolbar
>
>         Very important: in the custom wx.ToolBar class after the
>         wx.ToolBar.__init__ the following code must be written:
>             parent.SetToolBar(self)"""
>         if self.app.ToolBar and not (self.noMenu or self.isSdiParent):
>             if self.app.DEBUG:
>                 print """Create: Framework: toolbar."""
>             #create
>             self.toolBar                =3D self.app.ToolBar(parent=3Dsel=
f,
> app=3Dapp,
>                 id=3Dwx.ID_ANY, style=3DSTYLE_TOOLBAR)
>             #self.SetToolBar(self.toolBar)-> do this in toolbar class
>             #reference
>             self.toolBar.app            =3D self.app
>             self.toolBar.frame          =3D self
>             if self.menuBar:
>                 self.toolBar.menuBar        =3D self.menuBar
>                 self.menuBar.toolBar        =3D self.toolBar
>         else:
>             self.toolBar =3D None
>             if self.menuBar:
>                 self.menuBar.toolBar        =3D None
>
>     def __statusBar__(self):
>         """Create statusbar (to be overwritten)."""
>         if self.noMenu:
>             self.panel.SetStatusText    =3D self.parentFrame.SetStatusTex=
t
>             self.panel.statusBar        =3D self.parentFrame.statusBar
>         else:
>             self.panel.SetStatusText    =3D self.SetStatusText
>             if self.app.StatusBar:
>                 if self.app.DEBUG:
>                     print """Create: Framework: statusbar."""
>                 self.statusBar =3D self.app.StatusBar(parent=3Dself,id=3D
> wx.ID_ANY)
>                 self.SetStatusBar(self.statusBar)
>
>     #---other
>     def __finish__(self):
>         self.setTitle(self.page,self.extra)
>         if hasattr(self.panel,'__finish__'):
>             self.panel.__finish__()
>
>     def __layoutTabs__(self,parent=3DNone):
>         """Not for mdi children"""
>         if not parent: parent =3D self
>         #sizer layout
>         sizer =3D wx.BoxSizer(wx.VERTICAL)
>         sizer.Add(self.tabs, 1, wx.EXPAND, 0)
>         parent.SetAutoLayout(True)
>         parent.SetSizer(sizer)
>         parent.Layout()
>         #events
>         self.bindTabs()
>
>     #---events
>     def __events__(self):
>         """Initialize events."""
>         eventManager.Register(self.onFrameActivate, wx.EVT_ACTIVATE
> ,    self)
>         eventManager.Register(self.onFrameClose,    wx.EVT_CLOSE,
> self)
>         eventManager.Register(self.onFrameMove,     wx.EVT_MOVE
> ,        self)
>         eventManager.Register(self.onFrameSize,     wx.EVT_SIZE
> ,        self)
>         if self.menuBar:    self.menuBar.__events__()
>         if self.toolBar:    self.toolBar.__events__()
>         if hasattr(self.panel,'onIdle'):
>             eventManager.Register(self.onFrameIdle, wx.EVT_IDLE, self)
>
>     def onFrameActivate(self, event):
>         """Activate event (to be overwritten)."""
>         getActive   =3D (not event) or event.GetActive()
>         if getActive:
>             if self.app.DEBUG:
>                 print 'Event<: Framework:
> %s.Activate(%s)'%(self.__class__,getActive)
>             if hasattr(self.panel,'onActivate'):
>                 self.panel.onActivate(event)
>             elif hasattr(self.panel,'onDeactivate'):
>                 self.panel.onDeactivate(event)
>             if self.app.DEBUG:
>                 print 'Event>: Framework:
> %s.Activate(%s)'%(self.__class__,getActive)
>         if event: event.Skip()
>
>     def onFrameClose(self, event=3DNone, destroy =3D 1):
>         """Close event (to be overwritten/extended)."""
>         debug =3D self.app.DEBUG
>         if debug:
>             print 'Event<: Framework: %s.Close'%self.__class__
>         if hasattr(self.panel,'onClose'):
>             self.dead =3D self.panel.onClose()
>         else:
>             self.dead =3D True
>         if self.dead:
>             if destroy:
>                 eventManager.DeregisterWindow(self)
>                 self.Destroy()
>                 if event: event.Skip()
>             if debug:
>                 print 'Event>: Framework: %s.Close returns
> True'%self.__class__
>             return True
>         else:
>             if debug:
>                 print 'Event>: Framework: %s.Close returns
> False'%self.__class__
>             return False
>
>     def onFrameMove(self, event=3DNone):
>         """Move event (to be overwritten)."""
>         if self.app.DEBUG:
>             print 'Event<: Framework: %s.Move'%self.__class__
>         if event: event.Skip()
>         #sm.spy.frame(1)
>         if hasattr(self.panel,'onMove'):
>             self.panel.onMove(event)
>         if self.app.DEBUG:
>             print 'Event>: Framework: %s.Move'%self.__class__
>
>     def onFrameSize(self, event=3DNone):
>         """Size event (to be overwritten)."""
>         #sm.spy.frame(1)
>         if self.app.DEBUG:
>             print 'Event<: Framework: %s.Size'%self.__class__
>         if hasattr(self.panel,'onSize'):
>             self.panel.onSize(event)
>         if self.app.DEBUG:
>             print 'Event>: Framework: %s.Size'%self.__class__
>         if event: event.Skip()
>
>     def onFrameIdle(self, event):
>         """To be overwritten."""
>         if not self.dead:
>             if hasattr(self.panel,'onIdle'):
>                 self.panel.onIdle()
>
>     def bindTabs(self):
>         """Bind events to notebook tabs (to be overwriten)."""
>         pass
>
>     def unbindTabs(self):
>         """Unbind events to notebook tabs (to be overwriten)."""
>         pass
>
>     def getIndex(self):
>         """Get index of current child."""
>         try:
>             return self.app.children.index(self.panel)
>         except ValueError:
>             return -1
>
>
> class Tabs(Framework):
>     #---events
>     def bindTabs(self):
>         self.tabs.Bind(self.app.EVENT_NOTEBOOK, self.onFrameTab)
>         #eventManager.Register(self.onFrameTab, self.app.EVENT_NOTEBOOK,
> self.tabs)
>
>     def unbindTabs(self):
>         self.tabs.Unbind(self.app.EVENT_NOTEBOOK)
>         #eventManager.DeregisterWindow(self.tabs)
>
>     def raiseTab(self,index):
>         if index > -1:
>             app =3D self.app
>             if app.DEBUG:
>                 print 'Event<: Tab:
> %s.onFrameTab(%s)'%(self.__class__,index)
>             parent      =3D app.mdi in [SDI,MDI_TABS]
>             if index =3D=3D 0 and parent:
>                 window  =3D self.parentFrame
>                 if hasattr(window,'panelFrame'):
>                     window =3D window.panelFrame
>             else:
>                 window =3D self.app.children[index-[0,1][parent]].frame
>             if app.DEBUG:
>                 print '%s.Raise()'%window
>                 print window.Raise
>             window.Raise()
>             if app.DEBUG:
>                 print 'Event>: Tab:
> %s.onFrameTab(%s)'%(self.__class__,index)
>
> #---SDI Platform dependent
> class TabWin32(Tabs):
>     """SDI Implementation for windows (see also App.SetMdi)"""
> ##    def onFrameTab(self,event):
> ##        """When a tab is changed (EVT_MOUSE_LEFT&HitTest)."""
> ##        mousePos    =3D event.GetPosition()
> ##        index, other =3D self.tabs.HitTest(mousePos)
> ##        self.raiseTab(index)
>
>     def onFrameTab(self,event):
>         self.raiseTab(event.GetSelection())
>         event.Skip()
>
> class TabUnix(Tabs):
>     """SDI Implementation for windows (see also App.SetMdi)"""
>     def onFrameTab(self,event):
>         """When a tab is changed (EVT_NOTEBOOK_CHANGING)."""
>         index       =3D event.GetSelection()
>         event.Veto()#instead of event.Skip() (don't do this here anyway)
>         self.raiseTab(index)
>
> if PLATFORM =3D=3D 'win32':
>     TabPlatform     =3D TabWin32
> else:
>     TabPlatform     =3D TabUnix
>
> ####Parent classes
> class Parent(Framework):
>     #---initialize
>     def __init__(self, app, page =3D '', **options):
>         self.options            =3D options
>         self.noMenu         =3D False
>         Framework.__init__(self,
>             app             =3D app,
>             Panel           =3D app.ParentPanel,
>             page            =3D page,
>             parentFrame     =3D self,
>             **options)
>
>     def __finish__(self):
>         Framework.__finish__(self)
>
>     #---events
>     def onFrameClose(self,event=3DNone):
>         self.dead =3D Framework.onFrameClose(self,event,destroy=3D0)
>         if not self.dead: return
>         #Avoid event exceptions of child frames
>         for child in self.app.children:
>             eventManager.DeregisterWindow(child.frame)
>             child.dead =3D 1
>         #Destroy itself
>         self.Destroy()
>         if event: event.Skip()
>
>     #---menu
>     def menu_new(self, event=3DNone):
>         self.child()
>
>     def menu_close(self,event=3DNone):
>         childActive =3D self.app.childActive
>         if childActive:
>             childActive.onFrameClose()
>
>     #---parentPanel
>     def child(self,*args,**keyw):
>         self.ChildFrame(self,*args,**keyw)
>
>     def maximize(self):
>         if self.app.mdi =3D=3D MDI_SPLIT:
>             return True
>         i =3D 0
>         m =3D 0
>         for child in self.app.children:
>             if child.frame.IsMaximized():
>                 return True
>         return False
>
>     #---other
>     def setTitle(self,page=3D'',extra=3D'',draw=3DTrue,colour=3DNone):
>         if draw:
>             t           =3D self.app.title
>             if page:
>                 t       =3D '%s - %s'%(page,t)
>             self.SetTitle(t)
>
>
> class MdiParentFrame(Parent,wx.MDIParentFrame):
>     """Uniformed parent Mdi/Sdi class based on Mdi.
>
>     self.Panel is defined by joined class"""
>     def __init__(self,app,
>             id      =3D wx.ID_ANY,
>             page   =3D 'parentFrame',
>             parent  =3D None,
>             size    =3D SIZE,
>             style   =3D STYLE_PARENTFRAME,
>             pos     =3D POS,
>             **options):
>         wx.MDIParentFrame.__init__(self,
>             id      =3D id,
>             name    =3D page,
>             parent  =3D parent,
>             size    =3D size,
>             style   =3D style | FULL_REPAINT_ON_RESIZE,
>             title   =3D page,
>             pos     =3D pos)
>         if style & wx.MAXIMIZE:
>             try: #not working on mandrake9
>                 self.Maximize(1)
>             except:
>                 pass
>         #This always has to be last!
>         Parent.__init__(self,app=3Dapp,page=3Dpage,**options)
>
>     def __stage__(self,page,extra,**options):
>         self.panelFrame     =3D wx.MDIChildFrame(parent=3Dself,id=3Dwx.ID=
_ANY)
>         self.panelFrame.SetTitle(self.app.panelFrameTitle)
>         #parentPanel
>         self.panel          =3D self.Panel(parent=3Dself.panelFrame,**opt=
ions)
>         eventManager.Register(self.onSashClose, wx.EVT_CLOSE,
> self.panelFrame)
>         #palette
>         if self.app.Palette:
>             self.palette    =3D self.app.Palette(parent=3Dself,id=3Dwx.ID=
_ANY)
>             self.palette.Show()
>
>     def onSashClose(self,event):
>         if hasattr(self.panel,'onClosePanelFrame'):
>             self.panel.onClosePanelFrame(event)
>
>     def setTitle(self,page=3D'',extra=3D'',draw=3DTrue,colour=3DNone):
>         if draw:
>             self.SetTitle(self.app.title)
>
> class MdiTabsParentFrame(TabPlatform,MdiParentFrame):
>     def __stage__(self,page,extra,**options):
>         app                 =3D self.app
>         self.panelFrame     =3D wx.MDIChildFrame(parent=3Dself,id=3Dwx.ID=
_ANY)
>         self.panelFrame.SetTitle(app.panelFrameTitle)
>         self.panelFrame.Raise=3D self.panelFrame.Activate
>         #parentPanel
>         self.tabs   =3D NotebookPlus(app=3Dapp,parent=3Dself.parentFrame,=
 id=3D
> wx.ID_ANY,
>             style =3D STYLE_NOTEBOOK )
>         self.panel  =3D self.Panel(parent=3Dself.tabs,**options)
>         self.tabs.AddPage(self.panel, page)
>         self.__layoutTabs__()
>         #events
>         eventManager.Register(self.onSashClose, wx.EVT_CLOSE,
> self.panelFrame)
>         #palette
>         if app.Palette:
>             self.palette    =3D self.app.Palette(parent=3Dself,id=3Dwx.ID=
_ANY)
>             self.palette.Show()
>
>
> class MdiSashParentFrame(MdiParentFrame):
>     """Uniformed parent Mdi/Sdi class based on Mdi.
>
>     self.Panel is defined by joined class"""
>     def __stage__(self,page,extra,**options):
>         """Create tabs to switch between documents as an
> wx.SashLayoutWindow"""
>         if self.app.DEBUG:
>             print 'Create: Mdi:   %s.tabs'%(self.__class__,)
>         #sash for parentPanel
>         self.sashId =3D wx.NewId()
>         self.sash =3D wx.SashLayoutWindow(id=3Dself.sashId,
>               name=3D'sash', parent=3Dself, style=3Dwx.NO_BORDER)
>         self.sash.SetDefaultSize(wx.Size(792, 200))
>         self.sash.SetOrientation(wx.LAYOUT_HORIZONTAL)
>         self.sash.SetAlignment(wx.LAYOUT_BOTTOM)
>         self.sash.SetSashVisible(wx.SASH_TOP, 1)
>         self.sash.SetMinimumSizeY(1)
>         self.sash.Show(True)
>         eventManager.Register(self.onFrameSashDragged, wx.EVT_SASH_DRAGGE=
D,
> self.sash)
>         #parentPanel
>         self.panel          =3D self.Panel(parent=3Dself.sash,**options)
>         #layout
>         self.panelSizer     =3D wx.BoxSizer(wx.VERTICAL)
>         self.panelSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND, 0)
>         self.sash.SetAutoLayout(1)
>         self.sash.SetSizer(self.panelSizer)
>
>     def __finish__(self):
>         Parent.__finish__(self)
>         wx.LayoutAlgorithm().LayoutMDIFrame(self)
>
>     #---events
>     def onFrameSashDragged(self,event):
>         """Called when the shashwindow is dragged."""
>         if event.GetDragStatus() =3D=3D wx.SASH_STATUS_OUT_OF_RANGE:
>             return
>         eID =3D event.GetId()
>         if eID =3D=3D self.sashId:
>             self.sash.SetDefaultSize(wx.Size(1000,event.GetDragRect
> ().height))
>         wx.LayoutAlgorithm().LayoutMDIFrame(self)
>
>     def onFrameSize(self, event):
>         """Overwritten for sash dragging."""
>         Framework.onFrameSize(self)
>         wx.LayoutAlgorithm().LayoutMDIFrame(self)
>
> class MdiSashTabsParentFrame(TabPlatform,MdiSashParentFrame):
>     def __stage__(self,page,**options):
>         """Create tabs to switch between documents as an
> wx.SashLayoutWindow"""
>         if self.app.DEBUG:
>             print 'Create: Mdi: %s.tabs'%(self.__class__,)
>         self.tabsSash =3D wx.SashLayoutWindow(id=3Dwx.ID_ANY,
>               name=3D'tabs', parent=3Dself, style=3Dwx.CLIP_CHILDREN)
>         self.tabsSash.SetOrientation(wx.LAYOUT_HORIZONTAL)
>         self.tabsSash.SetAlignment(wx.LAYOUT_TOP)
>         self.tabsSash.SetDefaultSize(wx.Size(792, TABSASH_HEIGHT))
>         self.tabs =3D NotebookPlus(app=3Dself.app,id=3Dwx.ID_ANY, parent=
=3D
> self.tabsSash, style=3DSTYLE_NOTEBOOK)
>         self.__layoutTabs__(self.tabsSash)
>         MdiSashParentFrame.__stage__(self,page,**options)
>
>     def onFrameTab(self,event):
>         """When a tab is changed (EVT_MOUSE_LEFT&HitTest)."""
>         TabPlatform.onFrameTab(self,event)
>         event.Skip()
>
> class MdiSplitParentFrame(Parent,wx.Frame):
>     def __init__(self,app,
>             id      =3D wx.ID_ANY,
>             page    =3D 'parentFrame',
>             parent  =3D None,
>             size    =3D SIZE,
>             style   =3D STYLE_PARENTFRAME,
>             pos     =3D POS,
>             **options):
>         wx.Frame.__init__(self,
>             id      =3D id,
>             name    =3D page,
>             parent  =3D parent,
>             size    =3D size,
>             style   =3D style | FULL_REPAINT_ON_RESIZE,
>             title   =3D page,
>             pos     =3D pos)
>         if style & wx.MAXIMIZE:
>             try: #not working on mandrake9
>                 self.Maximize(1)
>             except:
>                 pass
>         #self.isSdiParent    =3D True
>         #This always has to be last!
>         Parent.__init__(self,app=3Dapp,page=3Dpage,**options)
>
>     def __stage__(self,page,extra,**options):
>         self.split  =3D split =3D wx.SplitterWindow(self,wx.ID_ANY
> ,style=3DSTYLE_SPLIT)
>         self.tabs   =3D NotebookPlus(app=3Dself.app,parent=3Dsplit, id=3D=
wx.ID_ANY
> ,
>             style =3D STYLE_NOTEBOOK )
>         #self.tabs   =3D wx.Notebook(parent=3Dsplit, id=3Dwx.ID_ANY,
>         #    style =3D STYLE_NOTEBOOK )
>         self.panel  =3D self.Panel(parent=3Dsplit,**options)
>         split.SetMinimumPaneSize(20)
>         split.SplitHorizontally(self.tabs, self.panel, -200)
>
>
>         self.bindTabs()
>
>     def bindTabs(self,event=3DNone):
>         self.tabs.Bind(NotebookCtrl.EVT_NOTEBOOKCTRL_PAGE_CHANGED,
> self.onFrameTab)
>         #eventManager.Register(self.onFrameTab,
> wx.EVT_NOTEBOOK_PAGE_CHANGED, self.tabs)
>
>     def unbindTabs(self):
>         self.tabs.Unbind(NotebookCtrl.EVT_NOTEBOOKCTRL_PAGE_CHANGED)
>         #eventManager.DeregisterWindow(self.tabs)
>
>     def onFrameTab(self,event):
>         index =3D event.GetSelection()
>         if index>-1:
>             self.app.children[index].frame.onFrameActivate()
>         event.Skip()
>
> class SdiParentFrame(TabPlatform,Parent,wx.Frame):
>     """Uniformed parent Mdi/Sdi class based on Sdi."""
>     def __init__(self,app,
>             id      =3D wx.ID_ANY,
>             page    =3D 'parentFrame',
>             parent  =3D None,
>             size    =3D SIZE,
>             style   =3D STYLE_PARENTFRAME,
>             pos     =3D POS,
>             **options):
>         wx.Frame.__init__(self,
>             id      =3D id,
>             name    =3D page,
>             parent  =3D parent,
>             size    =3D size,
>             style   =3D style | FULL_REPAINT_ON_RESIZE,
>             title   =3D page,
>             pos     =3D pos)
>         if style & wx.MAXIMIZE:
>             try: #not working on mandrake9
>                 self.Maximize(1)
>             except:
>                 pass
>         self.isSdiParent    =3D True
>         #This always has to be last!
>         Parent.__init__(self,app=3Dapp,page=3Dpage,**options)
>
>     def __stage__(self,page,extra,**options):
>         """Create tabs to switch between documents as an wx.Notebook"""
>         if self.app.DEBUG:
>             print 'Create: Sdi:   %s.tabs'%(self.__class__,)
>         self.tabs   =3D NotebookPlus(app=3Dself.app,parent=3Dself, id=3Dw=
x.ID_ANY,
>             style =3D STYLE_NOTEBOOK )
>         self.panel  =3D self.Panel(parent=3Dself.tabs,**options)
>         self.tabs.AddPage(self.panel, page)
>         self.__layoutTabs__()
>
>     def setTitle(self,page=3D'',extra=3D'',draw=3DTrue,colour=3DNone):
>         if draw:
>             self.SetTitle(self.app.title)
>
> ####Child classes
> class Child(Framework):
>     #---initialize
>     def __init__(self,parentFrame,page=3D'',extra=3D'',parent=3DNone,**op=
tions):
>         app             =3D parentFrame.app
>         self.pageTitle  =3D ''
>         self._pageTitle  =3D '?'
>         self.extraTitle =3D ''
>         self._extraTitle =3D ''
>         Framework.__init__(self,
>             app         =3D app,
>             Panel       =3D app.ChildPanel,
>             parentFrame =3D parentFrame,
>             page        =3D page,
>             extra       =3D extra,
>             **options)
>
>     def __finish__(self):
>         app             =3D self.app
>         panel           =3D self.panel
>         app.childActive =3D panel
>         app.children.append(panel)
>         self.addPageToParent(panel,app.mdi)
>         #finish
>         Framework.__finish__(self)
>
>     def addPageToParent(self,panel,mdi):
>         """"Add page with childs title to parent
>         Can be overwritten."""
>         parentFrame     =3D self.parentFrame
>         tabs            =3D parentFrame.tabs
>         tabs.AddPage(page=3DDummyPage(tabs), text=3Dself.page,select=3D(m=
di not
> in [SDI,MDI_TABS]))
>
>     #---events
>     def onFrameActivate(self, event=3DNone):
>         """Activate event."""#todo: update tabs above if not right
>         if (not event) or event.GetActive():
>             if self.app.DEBUG:
>                 'Event:  Child: %s.Activate'%self.__class__
>             self.app.childActive    =3D self.panel
>         Framework.onFrameActivate(self,event)
>
>     def onFrameClose(self, event =3D None):
>         """Close event."""
>         debug =3D self.app.DEBUG
>         if debug:
>             print 'Event<: Child: %s.Close'%self.__class__
>         self.dead =3D Framework.onFrameClose(self,destroy=3D0)
>         if not self.dead:
>             if self.app.DEBUG:
>                 print 'Event>: Child: %s.Close returns
> False'%self.__class__
>             return False
>         #deregister events
>         eventManager.DeregisterWindow(self)
>         if event: event.Skip()
>         #index
>         mdi     =3D self.app.mdi
>         index   =3D self.getIndex()
>         if mdi in [SDI,MDI_TABS]:  delta =3D 1
>         else:                      delta =3D 0
>         #Update children
>         children    =3D self.app.children
>         children.remove(self.panel)
>         if children:
>             childActive =3D self.app.childActive =3D children[0]
>         else:
>             childActive =3D self.app.childActive =3D None
>         #update rest
>         parentFrame =3D self.parentFrame
>         if hasattr(parentFrame,'tabs'):
>             #Update childBook tabs
>             current =3D index+delta
>             # * parent frame (mdi & sdi)
>             parentFrame.unbindTabs()
>             parentFrame.tabs.DeletePage(current)
>             if (mdi in [SDI,MDI_SASH_TABS,MDI_TABS] or (mdi=3D=3DMDI_SPLI=
T and
> children)) and childActive:
>                 parentFrame.tabs.SetSelection(0)
>             parentFrame.bindTabs()
>             # * children frames (sdi)
>             if mdi in [SDI,MDI_TABS] and childActive: #not for mdichild
>                 eventManager.DeregisterWindow(self.tabs)
>                 c       =3D 1
>                 for child in children:
>                     child.frame.unbindTabs()
>                     tabs   =3D child.frame.tabs
>                     tabs.DeletePage(current)#remove closed item from othe=
r
> children
>                     if c>=3Dcurrent:
>                         tabs.SetSelection(c)#adapt selection
>                     child.frame.bindTabs()
>                     c +=3D 1
>         if childActive:
>             childActive.frame.Activate()
>         if mdi!=3DMDI_SPLIT:
>             self.Destroy()
>         if debug:
>             print 'Event>: Child: %s.Close returns True'%self.__class__
>         return True
>
>     def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=
=3DNone):
>         if new:
>             #parameters
>             if page:    self.pageTitle  =3D page
>             if extra:   self.extraTitle =3D extra
>             #go
>             m               =3D ['','*'][self.panel.changed]
>             if self.pageTitle:
>                 self._pageTitle   =3D  '%s%s'%(self.pageTitle,m)
>             else:
>                 self._pageTitle   =3D  ''
>         if draw:
>             if self.app.mdiName =3D=3D SDI or WIN:
>                 self.SetTitle(self.extraTitle)
>             else:
>                 self.SetTitle(self.pageTitle)
>
> class MdiSashTabsChildFrame(Child,wx.MDIChildFrame):
>     def __init__(self,parentFrame,
>         id          =3D wx.ID_ANY,
>         page        =3D UNNAMED,
>         extra       =3D '',
>         style       =3D STYLE_CHILDFRAME,
>         maximize    =3D None,
>         **options):
>         self.noMenu =3D True
>         app             =3D parentFrame.app
>         #debug message
>         if app.DEBUG:
>             print 'Create: Mdi: %s'%self.__class__
>         if maximize =3D=3D None:
>             maximize =3D parentFrame.maximize()
>         if maximize:
>             style   |=3D wx.MAXIMIZE
>         wx.MDIChildFrame.__init__(self,
>             id      =3D id,
>             name    =3D page,
>             parent  =3D parentFrame,
>             style   =3D style | FULL_REPAINT_ON_RESIZE,
>             title   =3D page)
>         self.Maximize()#if maximize and PLATFORM !=3D 'win32':#sm:seems
> better to leave this away.
>         self.Raise  =3D self.Activate #raise doesn't work here
>         #This always has to be last!
>         Child.__init__(self,
>             parentFrame =3D parentFrame,
>             page        =3D page,
>             extra       =3D extra,
>             **options)
>
>     def __finish__(self):
>         self.tabs       =3D self.parentFrame.tabs
>         Child.__finish__(self)
>
>     def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=
=3DNone):
>         Child.setTitle(self,page,extra,new,draw)
>         self.parentFrame.setTitle(self._pageTitle,draw=3Ddraw)
>         if new and draw:
>             index =3D self.getIndex()
>             self.tabs.SetPageText(index,self._pageTitle)
>             if not(colour is None) and hasattr(self.tabs,'SetPageColour')=
:
>                 self.tabs.SetPageColour(index,colour)
>
>     def onFrameActivate(self, event):
>         if event.GetActive():
>             self.setTitle(new=3DFalse)
>             self.parentFrame.tabs.SetSelection(self.getIndex())
>         Child.onFrameActivate(self,event)
>
> class MdiChildFrame(MdiSashTabsChildFrame, Child):
>     """Mdi Child frame without tabs."""
>     def addPageToParent(self,panel,mdi):
>         pass
>
>     def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=
=3DNone):
>         Child.setTitle(self,page,extra,new,draw)
>         self.parentFrame.setTitle(self._pageTitle,draw=3Ddraw)
>
>     def __finish__(self):
>         Child.__finish__(self)
>
>     def onFrameActivate(self, event):
>         if event.GetActive():
>             self.setTitle(new=3DFalse)
>         Child.onFrameActivate(self,event)
>
> class MdiTabsChildFrame(TabPlatform,MdiSashTabsChildFrame, Child):
>     def __stage__(self,page,extra,**options):
>         """Create tabs to switch between documents as an
> wx.SashLayoutWindow"""
>         if self.app.DEBUG:
>             print 'Create: Sdi:   %s.tabs'%(self.__class__,)
>         tabs =3D self.tabs   =3D NotebookPlus(app=3Dself.app,parent=3Dsel=
f, id=3D
> wx.ID_ANY,
>             style =3D STYLE_NOTEBOOK )
>         panel =3D self.panel =3D self.Panel(parent=3Dtabs,**options)
>         #Add parent tab to itself
>         tabs.AddPage(page=3DDummyPage(tabs),text=3Dself.app.title)
>         #Add child tabs to itself and vice versa
>         for child in self.app.children:
>             childTabs   =3D child.frame.tabs
>             tabs.AddPage(page=3DDummyPage(tabs),text=3Dchild.frame._pageT=
itle)
>             childTabs.AddPage(page=3DDummyPage(childTabs),text=3Dpage)
>         #Add itself to itself
>         tabs.AddPage(page=3Dpanel,text=3Dpage,select=3DTrue)
>         self.__layoutTabs__()
>
>     def __finish__(self):
>         Child.__finish__(self)
>
>     def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=
=3DNone):
>         Child.setTitle(self,page,extra,new)
>         if new and draw:
>             index   =3D self.getIndex()+1
>             self.tabs.SetPageText(index,self._pageTitle)
>             if not(colour is None) and hasattr(self.tabs,'SetPageColour')=
:
>                 self.tabs.SetPageColour(index,colour)
>
>     def onFrameActivate(self, event):
>         if event.GetActive():
>             self.setTitle(new=3DFalse)
>             self.parentFrame.tabs.SetSelection(self.getIndex()+1)
>         Child.onFrameActivate(self,event)
>
> class MdiSplitChildFrame(Child,wx.Panel):
>     def __init__(self,parentFrame,
>         id          =3D wx.ID_ANY,
>         style       =3D STYLE_CHILDFRAME,
>         page        =3D '',
>         extra       =3D '',
>         maximize    =3D None,
>         **options):
>         self.noMenu =3D True
>         app         =3D parentFrame.app
>         #debug message
>         if app.DEBUG:
>             print 'Create: MdiSplit: %s'%self.__class__,page,extra
>         wx.Panel.__init__(self,
>             id      =3D id,
>             name    =3D page,
>             parent  =3D parentFrame.tabs,
>             size    =3D wx.Size(600,400),
>             style   =3D style | FULL_REPAINT_ON_RESIZE,)
>             #title   =3D page)
>         #This always has to be last!
>         Child.__init__(self,
>             parentFrame =3D parentFrame,
>             page        =3D page,
>             extra       =3D extra,
>             **options)
>
>     def __stage__(self,page,extra,**options):
>         """Create tabs to switch between documents as an
> wx.SashLayoutWindow"""
>         if self.app.DEBUG:
>             print 'Create: Sdi:   %s.tabs'%(self.__class__,)
>         self.panel =3D self.Panel(parent=3Dself,name=3Dpage,**options)
>         sizer =3D wx.BoxSizer(wx.VERTICAL)
>         sizer.Add(self.panel, 1, wx.EXPAND, 0)
>         self.SetAutoLayout(True)
>         self.SetSizer(sizer)
>         self.Layout()
>
>     def addPageToParent(self,panel,mdi):
>         """"Add page with childs title to parent
>         Can be overwritten."""
>         parentFrame     =3D self.parentFrame
>         tabs            =3D self.tabs =3D parentFrame.tabs
>         parentFrame.unbindTabs()
>         tabs.AddPage(page=3Dself, text=3Dself.page,select=3D(mdi not in
> [SDI,MDI_TABS]))
>         parentFrame.bindTabs()
>
>     def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=
=3DNone):
>         Child.setTitle(self,page,extra,new)
>         if new and draw:
>             index   =3D self.getIndex()
>             self.tabs.SetPageText(index,self._pageTitle)
>             if not(colour is None) and hasattr(self.tabs,'SetPageColour')=
:
>                 self.tabs.SetPageColour(index,colour)
>
>     def SetIcon(self,*args,**keyw):
>         pass
>
>     def IsMaximized(self):
>         return True
>
>     def Activate(self):
>         self.parentFrame.tabs.SetSelection(self.getIndex())
>
> class SdiChildFrame(TabPlatform,Child,wx.Frame):
>     def __init__(self,parentFrame,
>         id          =3D wx.ID_ANY,
>         style       =3D STYLE_CHILDFRAME,
>         page        =3D '',
>         extra       =3D '',
>         maximize    =3D None,
>         **options):
>         self.noMenu =3D False
>         app             =3D parentFrame.app
>         #debug message
>         if app.DEBUG:
>             print 'Create: Sdi: %s'%self.__class__,page,extra
>         #maximize&init
>         if maximize =3D=3D None:
>             maximize =3D parentFrame.maximize()
>         if maximize:
>             style   |=3D wx.MAXIMIZE
>         wx.Frame.__init__(self,
>             id      =3D id,
>             name    =3D page,
>             parent  =3D parentFrame,
>             size    =3D wx.Size(600,400),
>             style   =3D style | FULL_REPAINT_ON_RESIZE,
>             title   =3D page)
>         if maximize:
>             if PLATFORM !=3D 'win32':
>                 self.Maximize()
>             else:
>                 self.SetSize(app.size)
>         #This always has to be last!
>         Child.__init__(self,
>             parentFrame =3D parentFrame,
>             page        =3D page,
>             extra       =3D extra,
>             **options)
>
>     def __stage__(self,page,extra,**options):
>         """Create tabs to switch between documents as an
> wx.SashLayoutWindow"""
>         if self.app.DEBUG:
>             print 'Create: Sdi:   %s.tabs'%(self.__class__,)
>         tabs =3D self.tabs   =3D NotebookPlus(app=3Dself.app,parent=3Dsel=
f, id=3D
> wx.ID_ANY,
>             style =3D STYLE_NOTEBOOK )
>         panel =3D self.panel =3D self.Panel(parent=3Dtabs,**options)
>         #Add parent tab to itself
>         tabs.AddPage(page=3DDummyPage(tabs),text=3Dself.app.title)
>         #Add child tabs to itself and vice versa
>         for child in self.app.children:
>             childTabs   =3D child.frame.tabs
>             tabs.AddPage(page=3DDummyPage(tabs),text=3Dchild.frame._pageT=
itle)
>             childTabs.AddPage(page=3DDummyPage(childTabs),text=3Dpage)
>         #Add itself to itself
>         tabs.AddPage(page=3Dpanel,text=3Dpage,select=3DTrue)
>         self.__layoutTabs__()
>
>     def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=
=3DNone):
>         Child.setTitle(self,page,extra,new)
>         if new and draw:
>             self.tabs.SetPageText(self.getIndex()+1,self._pageTitle)
>
> ####Application
> ####use single or multiple instances
> #could be done with a variable of some sort
> singleInstance =3D True #set to true for single instance app or set to fa=
lse
> for multiple instance app
> if singleInstance:
>     APP =3D singleApp.SingleInstanceApp
> else:
>     APP =3D wx.App
>
> class App(APP):#singleApp.SingleInstanceApp
>     def __init__(self, ParentPanel, ChildPanel, MenuBar, ToolBar,
> StatusBar,
>             Palette=3DNone, mdi=3DDEFAULT, debug=3D0, title=3D'name',
>             panelFrameTitle=3D'panel',size=3Dwx.Size(800,400),
>             imagePath =3D None, pos=3Dwx.Point(wx.ID_ANY,wx.ID_ANY),
>             style=3DSTYLE_PARENTFRAME,**attributes):
>         #passing arguments
>         global CHILDPANEL
>         self.ParentPanel    =3D ParentPanel
>         self.ChildPanel     =3D CHILDPANEL =3D ChildPanel
>         self.MenuBar        =3D MenuBar
>         self.ToolBar        =3D ToolBar
>         self.StatusBar      =3D StatusBar
>         self.Palette        =3D Palette
>         self.SetMdi(mdi)
>         self.DEBUG          =3D debug
>         self.title          =3D title
>         self.panelFrameTitle=3D panelFrameTitle
>         self.size           =3D size
>         self.imagePath      =3D imagePath
>         self.pos            =3D pos
>         self.style          =3D style
>         #initialization
>         self.children       =3D []
>         self.childActive    =3D None
>         if self.imagePath:
>             self.bitmap     =3D wx.Bitmap =3D Bitmap(imagePath,self)
>         else:
>             self.bitmap     =3D wx.Bitmap
>         #options
>         self.attributes     =3D attributes
>         for key in attributes:
>             if hasattr(self,key):
>                 print "Warning: Application can't accept attribute
> '%s'."%key
>             else:
>                 setattr(self,key,attributes[key])
>         #start
>         print "Launching application..."
>         if singleInstance:
>             singleApp.SingleInstanceApp.__init__(self,name=3Dtitle,redire=
ct=3Dnot
> debug)
>         else:
>             wx.App.__init__(self,redirect=3Dnot debug)
>
>     def OnArgs(self, evt):
>         if hasattr(self.parentPanel,'onArgs'):
>             self.parentPanel.onArgs(evt.data)
>         self.GetTopWindow().Raise()
>         self.GetTopWindow().Iconize(False)
>
>     def OnInit(self):
>         if singleInstance and self.active:
>             return False
>         else:
>             if singleInstance:
>                 self.Bind(singleApp.EVT_POST_ARGS, self.OnArgs)
>             wx.InitAllImageHandlers()
>             self.parentFrame =3D self.ParentFrame(self,
>                 size    =3D self.size,
>                 page    =3D self.title,
>                 pos     =3D self.pos,
>                 style   =3D self.style,
>                 **self.attributes)
>             self.parentPanel =3D self.parentFrame.panel
>             self.parentFrame.Show(True)
>             self.SetTopWindow(self.parentFrame)
>             return True
>
>     def SetMdi(self,mdiName=3DDEFAULT):
>         """Defines parent and children frame classes."""
>         self.mdiName    =3D mdiName
>         if not DI.has_key(mdiName):
>             mdiName     =3D DEFAULT
>         if mdiName =3D=3D DEFAULT:
>             if   WIN:
>                 mdiName =3D MDI_SASH_TABS_WIN
>             elif DARWIN:#mac osx
>                 mdiName =3D MDI_SPLIT_ALL
>             else:
>                 mdiName =3D MDI_SPLIT_ALL#MDI_SASH_TABS_LINUX
>
>         self.mdi    =3D DI[mdiName]
>         if      self.mdi =3D=3D SDI:
>             self.ParentFrame        =3D SdiParentFrame
>             self.ChildFrame         =3D SdiChildFrame
>         elif    self.mdi =3D=3D MDI_SASH:
>             self.ParentFrame        =3D MdiSashParentFrame
>             self.ChildFrame         =3D MdiChildFrame
>         elif    self.mdi =3D=3D MDI_SASH_TABS:
>             self.ParentFrame        =3D MdiSashTabsParentFrame
>             self.ChildFrame         =3D MdiSashTabsChildFrame
>             #self.EVENT_NOTEBOOK     =3D wx.EVT_NOTEBOOK_PAGE_CHANGED
>         elif    self.mdi =3D=3D MDI:
>             self.ParentFrame        =3D MdiParentFrame
>             self.ChildFrame         =3D MdiChildFrame
>         elif    self.mdi =3D=3D MDI_TABS:
>             self.ParentFrame        =3D MdiTabsParentFrame
>             self.ChildFrame         =3D MdiTabsChildFrame
>         elif    self.mdi =3D=3D MDI_SPLIT:
>             self.ParentFrame        =3D MdiSplitParentFrame
>             self.ChildFrame         =3D MdiSplitChildFrame
>
>         self.EVENT_NOTEBOOK =3D NotebookCtrl.EVT_NOTEBOOKCTRL_PAGE_CHANGE=
D
> ##        #Tabs: notebook event is platformdependent
> ##        if WIN:
> ##            #Under Windows, GetSelection() will return the same value a=
s
> ##            #GetOldSelection() when called from
> EVT_NOTEBOOK_PAGE_CHANGING handler and
> ##            #not the page which is going to be selected
> ##            #Therefore on Windows a combination of mouse click and
> hittest must be used.
> ##            self.EVENT_NOTEBOOK =3D wx.EVT_LEFT_DOWN
> ##        else:
> ##            self.EVENT_NOTEBOOK =3D wx.EVT_NOTEBOOK_PAGE_CHANGING
>
>
> ####Test app
> class TestMenuBar(wx.MenuBar):
>     def __init__(self,app,frame,*args,**kwds):
>         wx.MenuBar.__init__(self,*args,**kwds)
>         self.file   =3D wx.Menu()
>         self.file.Append(wx.ID_NEW, _("&New\tCtrl+N"), "", wx.ITEM_NORMAL=
)
>         self.file.Append(wx.ID_CLOSE, _("&Close\tCtrl+W"), "",
> wx.ITEM_NORMAL)
>         self.file.Append(wx.ID_EXIT, _("&Exit\tAlt+F4"), "",
> wx.ITEM_NORMAL)
>         self.Append(self.file, "&File")
>     def __events__(self):
>         wx.EVT_MENU(self.frame,wx.ID_NEW,self.menu_new)
>         wx.EVT_MENU(self.frame,wx.ID_CLOSE,self.menu_close)
>         wx.EVT_MENU(self.frame,wx.ID_EXIT,self.menu_exit)
>     def menu_new(self,event=3DNone):
>         self.parentPanel.new()
>     def menu_close(self,event=3DNone):
>         self.parentPanel.close()
>     def menu_exit(self,event=3DNone):
>         self.parentFrame.onFrameClose()
>
> ArtIDs =3D [ wx.ART_FILE_OPEN,
>            wx.ART_PRINT,
>            wx.ART_ADD_BOOKMARK,
>            wx.ART_REPORT_VIEW,
>            wx.ART_LIST_VIEW,
>            wx.ART_HELP,
>            ]
>
> class TestToolBar(wx.ToolBar):
>     def __init__(self,parent=3DNone,id=3Dwx.ID_ANY,menu=3DNone,app=3DNone=
,**kwds):
>         self.app =3D app
>         wx.ToolBar.__init__(self,parent=3Dparent,id=3Did,**kwds)
>         parent.SetToolBar(self)
>         self.tools =3D []
>         for id in ArtIDs:
>             toolId =3D wx.NewId()
>             bmp =3D wx.ArtProvider_GetBitmap(id, wx.ART_TOOLBAR, (16,16))
>             self.AddLabelTool(toolId, "", bmp, wx.NullBitmap,
> wx.ITEM_NORMAL, "info", "")
>             self.tools.append(toolId)
>         self.Realize()
>
>     def __events__(self):
>         for id in self.tools:
>             wx.EVT_TOOL(self,id, self.test)
>     def test(self,event):
>         print 'test seems ok'
>
> class TestParentPanel(wx.TextCtrl):
>     def __init__(self,parent,**kwds):
>         wx.TextCtrl.__init__(self,parent=3Dparent,id=3Dwx.ID_ANY
> ,value=3D'parent',**kwds)
>         self.test_child =3D 0
>     def new(self):
>         value           =3D 'child%02d'%self.test_child
>         self.app.ChildFrame(self.frame,page=3Dvalue,value=3Dvalue)
>         self.test_child +=3D 1
>     def close(self):
>         active =3D self.app.childActive
>         if active: active.frame.onFrameClose()
>
> class TestChildPanel(wx.TextCtrl):
>     def __init__(self,parent,**kwds):
>         wx.TextCtrl.__init__(self,parent=3Dparent,id=3Dwx.ID_ANY,**kwds)
>
> def __test__(debug,mdi=3DMDI):
>     app =3D App(TestParentPanel,
>               TestChildPanel,
>               TestMenuBar,
>               TestToolBar,
>               wx.StatusBar,
>               mdi=3Dmdi,
>               title=3D'Parent',
>               debug=3Ddebug)
>     app.MainLoop()
>
> if __name__=3D=3D'__main__':
>     __test__(debug=3D1,mdi=3DMDI_TABS_WIN)#multiple document interface fo=
r
> windows
>     #__test__(debug=3D1,mdi=3DMDI_TABS_MAC)#single document interface for=
 mac
>     #__test__(debug=3D1,mdi=3DMDI_SPLIT_ALL)#multiple document interface =
for
> mac
>
>
>


--
http://pythonide.stani.be
http://pythonide.stani.be/manual/html/manual.html

------=_Part_1149_17205073.1134599292906
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Jose,<br>
Next time post me files privately, but thanks a lot. Well, I did it a bit d=
ifferently but it's there for next release 0.8.1.c!<br>
Stani<br><br><div><span class=3D"gmail_quote">On 12/14/05, <b class=3D"gmai=
l_sendername">Jose Galvez</b> &lt;<a href=3D"mailto:[email protected]">j=
[email protected]</a>&gt; wrote:</span><blockquote class=3D"gmail_quote" =
style=3D"border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8=
ex; padding-left: 1ex;">
Dear Stani,<br><br>I've modified your smdi.py file (from your most recent 0=
.8.1b build) to<br>include a single vs multiple instance flag (see line 116=
1) if its set to<br>true then spe behaves as a single app utilizing<br>
singleApp.SingleInstanceApp.&nbsp;&nbsp;If its false it falls back to the c=
urrent<br>default utilizing wx.App.&nbsp;&nbsp;I also modified the appropri=
ate lines<br>12005-1208 and 1217-1221 to support the singleInstance flag as=
 well.<br>I've not dived deep enough into the code to see how to add this a=
s a
<br>real preference in the preference panel, but I could.&nbsp;&nbsp;In any=
 event<br>please find the attached file for your consideration.<br><br>PS a=
s always thanks for writing such a great program, spe is my python<br>edito=
r of choice!
<br>Jose<br><br><br>####(c)www.stani.be------------------------------------=
-------------------------<br><br>try:<br>&nbsp;&nbsp;&nbsp;&nbsp;import sm,=
 sm.osx<br>&nbsp;&nbsp;&nbsp;&nbsp;INFO=3Dsm.INFO.copy()<br><br>&nbsp;&nbsp=
;&nbsp;&nbsp;INFO['title']&nbsp;&nbsp;&nbsp;&nbsp; =3D INFO['titleFull'] =
=3D 'Sdi/Mdi Framework'
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;INFO['description']=3D\<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&quot;&quot;&quot;Framework which makes it easy to switch between S=
di (Linux/Mac)<br>&nbsp;&nbsp;&nbsp;&nbsp;and Mdi (Windows).<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&quot;&quot;&quot;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;__doc__=3DIN=
FO['doc']%INFO<br>except:
<br>&nbsp;&nbsp;&nbsp;&nbsp;__doc__=3D=3D&quot;Stani's Multiple Document In=
terface (c)www.stani.be&quot;<br><br>&quot;&quot;&quot;<br>Attributes of Ap=
plication:<br>&nbsp;&nbsp;&nbsp;&nbsp;- properties:<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;- children<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;- config<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
- DEBUG<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- imagePath<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- mdi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;- title<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;- parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- parent=
Panel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pos<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- size<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;- style<br>&nbsp;&nbsp;&nbsp;&nbsp;- methods:<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- SetMdi<br>&nbsp;&nbsp;&nbsp;&=
nbsp;- classes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- ChildF=
rame
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- ChildPanel<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- MenuBar<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;- ParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;- ParentPanel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;- StatusBar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Too=
lBar<br><br>Attributes of Frame:<br>&nbsp;&nbsp;&nbsp;&nbsp;- properties:<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- app<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- dead
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- menuBar<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- parentFrame<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;- toolBar<br>&nbsp;&nbsp;&nbsp;&nbsp;- methods:=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- getIndex<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- (maximize)<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;- setTitle<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;- SetStatusText<br>&nbsp;&nbsp;&nbsp;&nbsp;- events:<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- bindTabs<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- unbindTabs<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- onFrameActivate<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- onFrameClose<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;- onFrameMove<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;- onFrameSize<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;- (onFrameTab)<br>&nbsp;&nbsp;&nbsp;&nbsp;- classes:<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- Panel<br><br>Attributes of Panel:<br>&nbsp=
;&nbsp;&nbsp;&nbsp;- properties:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- changed<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- frame<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;- title<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;- parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pa=
rentPanel<br>&nbsp;&nbsp;&nbsp;&nbsp;- methods:<br><br>Attributes of MenuBa=
r:<br>&nbsp;&nbsp;&nbsp;&nbsp;- properties:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;- app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;- frame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- parentFrame
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- parentPanel<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- toolBar<br><br>Attributes of To=
olBar:<br>&nbsp;&nbsp;&nbsp;&nbsp;- properties:<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;- app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;- frame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- menuBar<=
br><br>Todo:<br>- MDI_TABS IS NOT WORKING!! THIS SHOULD BE FIXED<br>
- icon support<br>&quot;&quot;&quot;<br><br>####Modules<br>import&nbsp;&nbs=
p;os, sys, pprint<br>import&nbsp;&nbsp;wx<br>from&nbsp;&nbsp;&nbsp;&nbsp;wx=
.lib.evtmgr import eventManager<br>import&nbsp;&nbsp;singleApp<br>import No=
tebookCtrl<br>wx_Notebook =3D NotebookCtrl.NotebookCtrl
<br>#import sm.spy<br><br>####Constants<br>#values<br>SDI&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp; =3D 0<br>MDI_SASH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;=3D 1<br>MDI_SASH_TABS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
; =3D 2<br>MDI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D 3<br>MDI_TABS&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D 4<br>MDI_SPLIT&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D 5<br>#description=
s
<br>SDI_MAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp; =3D &quot;single with tabs (mac, linux, windows)&quot;<br>MDI_SASH=
_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D &quot;multiple with=
 sash (windows)&quot;<br>MDI_SASH_TABS_LINUX =3D &quot;multiple with sash &=
amp; tabs (linux)&quot;<br>
MDI_SASH_TABS_WIN&nbsp;&nbsp; =3D &quot;multiple with sash &amp; tabs (wind=
ows default)&quot;<br>MDI_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp; =3D &quot;multiple with palette (windows)&quot;<=
br>MDI_MAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp; =3D &quot;single with palette (mac)&quot;<br>MDI_TABS_LINUX&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D &quot;multiple with tabs (linux)&quot;
<br>MDI_TABS_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D &quot;m=
ultiple with tabs (windows)&quot;<br>MDI_TABS_MAC&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;=3D &quot;single with tabs (mac)&quot;<br>MDI_SPLIT_A=
LL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D &quot;multiple with sash &amp; t=
abs (mac default,linux default,windows)&quot;
<br><br>DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp; =3D &quot;&lt;default&gt;&quot;<br>DI&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;=3D
{SDI_MAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
SDI,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_SASH_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;
: MDI_SASH,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_SASH_TABS_LINUX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: MDI_SASH,<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_SASH_TABS_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
MDI_SASH_TABS,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
MDI,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_MAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:
MDI,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_TABS_LINUX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
: MDI,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#MDI_TABS_WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;
: MDI_TABS,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_TABS_MAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;
: MDI_TABS,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
MDI_SPLIT_ALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;:
MDI_SPLIT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
DEFAULT&nbsp;&nbsp;: -1}<br><br>PLATFORM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;=3D
sys.platform<br>WIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;
=3D PLATFORM.startswith('win')<br>DARWIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;=3D
PLATFORM.startswith('darwin')<br><br>if DARWIN:<br>&nbsp;&nbsp;&nbsp;&nbsp;=
print 'If spe is unstable, try this interface from the preferences:\n&nbsp;=
&nbsp;&quot;%s&quot;\n'%MDI_SPLIT_ALL<br><br>#wx related<br>FULL_REPAINT_ON=
_RESIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D wx.FULL_REPAINT_ON_RESIZE
<br>POS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;
=3D (10,10)<br>SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;=3D
(600,400)<br>STYLE_CHILDFRAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;=3D wx.DEFAULT_FRAME_STYLE<br>STYLE_NOTEBOOK&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;=3D
FULL_REPAINT_ON_RESIZE|wx.CLIP_CHILDREN|wx.NO_BORDER<br>STYLE_PARENTFRAME&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D wx.DEFAULT_F=
RAME_STYLE #| wx.MAXIMIZE<br>STYLE_SPLIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D wx.SP_NOB=
ORDER<br>STYLE_TOOLBAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D wx.TB_HORIZONTAL | wx.NO_BORDER | wx.TB_FLAT | wx.TB_TEXT<br>TABSASH_HE=
IGHT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;=3D 30<br>TITLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;
=3D '<a href=3D"http://www.stani.be">www.stani.be</a>'<br>UNNAMED&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D 'unnamed'<br><br>####Menu helper function<br>def _(x):<br>&nbsp;&nbsp;&=
nbsp;&nbsp;if DARWIN:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re=
turn x#.replace('Ctrl','Cmd')<br>&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x<br><br>def _strip(x):<br>&n=
bsp;&nbsp;&nbsp;&nbsp;return x.replace(' ','_').replace('-','_').replace('&=
amp;&amp; ','').replace('&amp;','').replace('.','').replace('(','').replace=
(')','')
<br><br>def menuWrite(menuBar,f=3D'menu.txt'):<br>&nbsp;&nbsp;&nbsp;&nbsp;l=
abels =3D []<br>&nbsp;&nbsp;&nbsp;&nbsp;for m in range(menuBar.GetMenuCount=
()):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D menuBar.GetMenu(m)<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menuLabel&nbsp;&nbsp; =3D menuBar.GetLabelT=
op(m)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for item in=20
menu.GetMenuItems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;label&nbsp;&nbsp; =3D _strip(item.GetLabel())<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if label=
:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;labels.append((menuLabel,item.GetLabel()))<br>&nb=
sp;&nbsp;&nbsp;&nbsp;#events<br>&nbsp;&nbsp;&nbsp;&nbsp;result =3D '\tdef _=
_smdi__(self):\n'<br>&nbsp;&nbsp;&nbsp;&nbsp;for label in labels:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label =3D _strip(label[=
1])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result+=3D '\t\twx.E=
VT_MENU(self,%s,self.menu_%s)\n'%(label.upper(),label.lower())<br>&nbsp;&nb=
sp;&nbsp;&nbsp;result+=3D '\n'<br>&nbsp;&nbsp;&nbsp;&nbsp;for label in labe=
ls:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result+=3D'\tdef men=
u_%s(self):\n\t\t&quot;&quot;&quot;%s&quot;&quot;&quot;\n\t\tpass\n\n'%(_st=
rip(label[1].lower()),'%s &gt; %s'%label)
<br>&nbsp;&nbsp;&nbsp;&nbsp;print result<br>&nbsp;&nbsp;&nbsp;&nbsp;print o=
s.getcwd()<br>&nbsp;&nbsp;&nbsp;&nbsp;print f<br>&nbsp;&nbsp;&nbsp;&nbsp;f&=
nbsp;&nbsp; =3D open(f,'w')<br>&nbsp;&nbsp;&nbsp;&nbsp;f.write(result)<br>&=
nbsp;&nbsp;&nbsp;&nbsp;f.close()<br><br>def test_menuWrite():<br>&nbsp;&nbs=
p;&nbsp;&nbsp;import menu<br>&nbsp;&nbsp;&nbsp;&nbsp;menuWrite(wxgMenu.Bar(=
))<br><br>####Base
<br>WX_BITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D wx.Bitmap<br><br>clas=
s Bitmap:<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,path,app):<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.path =3D path<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.app =3D app<br>&nbsp;&nbsp;&nbsp;=
&nbsp;def __call__(self,x,t=3Dwx.BITMAP_TYPE_ANY):<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;path =3D os.path.join
(self.path,os.path.basename(x))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;#if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;#&nbsp;&nbsp;&nbsp;&nbsp;print 'Bitmap: %s&lt;%s'%(x,path)<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return WX_BITMAP(path,t)<br><br>clas=
s DummyPage(wx.StaticText):<br>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Pa=
ge to fill the tabs (not meant to be visible).&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,tabs):<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.StaticText.__init__(self,
tabs, wx.ID_ANY, &quot;SPE bug: This shouldn't be visible&quot;)<br><br>##c=
lass NotebookPlus(wx.Notebook):<br>##&nbsp;&nbsp;&nbsp;&nbsp;def __init__(s=
elf,app,*args,**keyw):<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;wx.Notebook.__init__(self,*args,**keyw)<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;self.app
 =3D app<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Bind(wx.=
EVT_MIDDLE_UP,self.onFrameMiddleClick)<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;self.Bind(wx.EVT_LEFT_DCLICK,self.onFrameMiddleClick)<br>#=
#<br>##&nbsp;&nbsp;&nbsp;&nbsp;def onFrameMiddleClick(self,event):<br>##&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;When a tab i=
s middle clicked (EVT_MOUSE_LEFT&amp;HitTest).&quot;&quot;&quot;
<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mousePos&nbsp;&nbsp;&=
nbsp;&nbsp;=3D event.GetPosition()<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;index, other =3D self.HitTest(mousePos)<br>##&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.mdi in [SDI,MDI_TABS]: #no paren=
t tab<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;zero =3D 0<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;els=
e:<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;zero =3D -1
<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index&gt;zero:<br>=
##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=
elf.app.children[index-zero-1].frame.onFrameClose()<br><br>class NotebookPl=
us(NotebookCtrl.NotebookCtrl):<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self=
,app,*args,**keyw):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self=
.app =3D app
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyw['size'] =3D wx.Siz=
e(26,26)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if keyw.has_key=
('style'):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;del keyw['style']<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;NotebookCtrl.NotebookCtrl.__init__(self,*args,**keyw)<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetDrawX(True, 2)<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
self.SetUseFocusIndicator(False)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.SetHighlightSelection(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;self.Bind(NotebookCtrl.EVT_NOTEBOOKCTRL_PAGE_CLOSING,self=
.onClosing)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onClosing(self,event):<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;When a tab =
is middle clicked (EVT_MOUSE_LEFT&amp;HitTest).&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index =3D event.GetSele=
ction()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.mdi =
in [SDI,MDI_TABS]: #no parent tab<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zero =3D 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;zero =3D -1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;if index&gt;zero:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.app.children
[index-zero-1].frame.onFrameClose()<br><br><br>####Foundation Classes<br>cl=
ass Framework:<br>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Foundation clas=
s for every frame.&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init_=
_(self,app,Panel,parentFrame,page=3D'',extra=3D'',**options):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#stage<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__before__(app&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp; =3D app,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Panel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D Panel,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;parentFrame
=3D parentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D extra)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__stage_=
_(page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D page,<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D extra,<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
**options)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__after_=
_()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;##rest<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__menu__()<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__tool__(app)<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;self.__statusBar__()<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;self.__finish__()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;self.__events__()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;#show
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Show(True)<br><br>=
&nbsp;&nbsp;&nbsp;&nbsp;#---components<br>&nbsp;&nbsp;&nbsp;&nbsp;def __bef=
ore__(self,app,Panel,parentFrame,page,extra):<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Reference frame attributes (not ove=
rwritten).&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self.app
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Panel&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D Panel<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parentFrame&nbsp;&nbsp;&nbsp;&nbsp=
;=3D parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.de=
ad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D False # todo: is this still necessary<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;if not hasattr(self,'isSdiParent'):<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.isSdiParent&nbsp=
;&nbsp;&nbsp;&nbsp;=3D False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self.page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =
=3D page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.extra&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D extra<br><br><br=
>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(self,page,extra,**options):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Creat=
e notebook (to switch between documents) &amp; panel<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This is mostly overwritten.&quot;&quot;&quot;<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel&nbsp;&nbsp;=
=3D self.Panel(parent=3Dself,**options)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def =
__after__(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Refer=
ence panel attributes&nbsp;&nbsp;(not overwritten).&quot;&quot;&quot;<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D self.panel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.app=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D self.app<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.frame&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D self<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;panel.parentFrame&nbsp;&nbsp; =3D self.parentFrame<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel.parentPanel&nbsp;&nbsp=
; =3D self.parentFrame.panel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;panel.changed
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D False<br><br>&nbsp;&nbsp;&nbsp;&nb=
sp;def __menu__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
quot;&quot;&quot;Create: Framework: menu.&quot;&quot;&quot;<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;
=3D self.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.Menu=
Bar and not self.noMenu:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;if app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;Create: Framework: menu.&quot;&quot;&quot;<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.mdi:<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;frame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;
=3D self.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D self<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.menuBar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
menuBar =3D app.MenuBar(app=3Dself.app,frame=3Dframe)<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetMenuBar(menuB=
ar)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;#reference<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;menuBar.app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;#create<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;menuBar.frame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D self<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
menuBar.parentFrame =3D self.parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menuBar.parentPanel =3D self.paren=
tFrame.panel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;if hasattr(self,'palette'):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;self.palette.panel.app&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;=3D
app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;self.palette.panel.menuBar&nbsp;&nbsp;=3D
menuBar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.menuB=
ar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
None<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __tool__(self,app):<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Create toolbar<br><br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Very important: in the cus=
tom wx.ToolBar class after the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;wx.ToolBar.__init__ the following code must be written:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;parent.SetToolBar(self)&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if self.app.ToolBar and not (self.noMenu or self.isSdiPa=
rent):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;Create: Framework: toolbar.&quot;&quot;&quot;<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#create<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel=
f.toolBar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.app.ToolBar(parent=3Dself, app=3Dapp,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id=3Dwx.=
ID_ANY,
style=3DSTYLE_TOOLBAR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;#self.SetToolBar(self.toolBar)-&gt;
do this in toolbar class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;#reference<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.toolBar.app&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.toolBar.frame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;=3D
self<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;if self.menuBar:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.toolBar.menuBar&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.menuBar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.menuBar.toolBar&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.toolBar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.=
toolBar =3D None<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;if self.menuBar:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.menuBar.tool=
Bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
None<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __statusBar__(self):<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Create statusbar (to=
 be overwritten).&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;if self.noMenu:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel.SetStatusText&nbsp;&nbsp;&nbsp;&nbsp=
;=3D
self.parentFrame.SetStatusText<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel.statusBar&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.parentFrame.statusBar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.panel.SetStatusText&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.SetStatusText<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if self.app.StatusBar:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.a=
pp.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;&quot;&quot;Create: Framework: statusbar.&quot;&quot;&quot;<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;self.statusBar
=3D self.app.StatusBar(parent=3Dself,id=3Dwx.ID_ANY)<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;self.SetStatusBar(self.statusBar)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;#---othe=
r<br>&nbsp;&nbsp;&nbsp;&nbsp;def __finish__(self):<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;self.setTitle(self.page,self.extra)<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.panel
,'__finish__'):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;self.panel.__finish__()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def =
__layoutTabs__(self,parent=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&quot;&quot;&quot;Not for mdi children&quot;&quot;&quot;<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not parent: parent =3D self=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#sizer layout
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizer =3D wx.BoxSizer(w=
x.VERTICAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizer.Add(se=
lf.tabs, 1, wx.EXPAND, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;parent.SetAutoLayout(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;parent.SetSizer(sizer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;parent.Layout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#eve=
nts<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
self.bindTabs()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;#---events<br>&nbsp;&nbsp;&n=
bsp;&nbsp;def __events__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&quot;&quot;&quot;Initialize events.&quot;&quot;&quot;<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eventManager.Register(self.onFrameAc=
tivate,
wx.EVT_ACTIVATE,&nbsp;&nbsp;&nbsp;&nbsp;self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;eventManager.Register(self.onFrameClose,&nbsp;&nbsp;&=
nbsp;&nbsp;wx.EVT_CLOSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eventManager.Regis=
ter(self.onFrameMove,&nbsp;&nbsp;&nbsp;&nbsp;
wx.EVT_MOVE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self)<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eventManager.Register(self.onFram=
eSize,&nbsp;&nbsp;&nbsp;&nbsp;
wx.EVT_SIZE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self)<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.menuBar:&nbsp;&nbsp;&nbsp=
;&nbsp;self.menuBar.__events__()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;if self.toolBar:&nbsp;&nbsp;&nbsp;&nbsp;self.toolBar.__events__()<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.panel,'o=
nIdle'):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;eventManager.Register
(self.onFrameIdle,
wx.EVT_IDLE, self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameActivate(self,=
 event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&qu=
ot;Activate event (to be overwritten).&quot;&quot;&quot;<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getActive&nbsp;&nbsp; =3D (not event) or e=
vent.GetActive()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if getA=
ctive:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
'Event&lt;: Framework: %s.Activate(%s)'%(self.__class__,getActive)<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasat=
tr(self.panel,'onActivate'):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel.onActivate(=
event)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;elif hasattr(self.panel,'onDeactivate'):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;self.panel.onDeactivate(event)<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.DEBUG:<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;print
'Event&gt;: Framework: %s.Activate(%s)'%(self.__class__,getActive)<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event: event.Skip()<br><br>&n=
bsp;&nbsp;&nbsp;&nbsp;def onFrameClose(self, event=3DNone, destroy =3D 1):<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Close =
event (to be overwritten/extended).&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug =3D self.app.DEBU=
G<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if debug:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print 'Event=
&lt;: Framework: %s.Close'%self.__class__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;if hasattr(self.panel,'onClose'):<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.dead =3D self.pane=
l.onClose()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.dead =3D True<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.dead:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if destroy:<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;eventManager.DeregisterWindow(self)<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.Destroy()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event: event.Skip
()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;if debug:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
'Event&gt;: Framework: %s.Close returns True'%self.__class__<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return True<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if debug:<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;print
'Event&gt;: Framework: %s.Close returns False'%self.__class__<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return False<=
br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameMove(self, event=3DNone):<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Move event (t=
o be overwritten).&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;if=20
self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;print 'Event&lt;: Framework: %s.Move'%self.__class__<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event: event.Skip()<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#sm.spy.frame(1)<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.panel,'onMove'):<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.=
panel.onMove
(event)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.DEBU=
G:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;print 'Event&gt;: Framework: %s.Move'%self.__class__<br><br>&nbsp;&nbsp;=
&nbsp;&nbsp;def onFrameSize(self, event=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Size event (to be overwritten).&=
quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#sm.spy.frame(1)<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.DEBUG:<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print 'Even=
t&lt;: Framework: %s.Size'%self.__class__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;if hasattr(self.panel,'onSize'):<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel.onSize(event)=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if=20
self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;print 'Event&gt;: Framework: %s.Size'%self.__class__<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event: event.Skip()<br><br>=
&nbsp;&nbsp;&nbsp;&nbsp;def onFrameIdle(self, event):<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;To be overwritten.&quot;&qu=
ot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not self.dead:<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ha=
sattr(self.panel,'onIdle'):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel.onIdle()<br>=
<br>&nbsp;&nbsp;&nbsp;&nbsp;def bindTabs(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Bind events to notebook tabs (to =
be overwriten).&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br><br>&nbsp;&nbsp=
;&nbsp;&nbsp;def unbindTabs(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&quot;&quot;&quot;Unbind events to notebook tabs (to be overwrit=
en).&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=
ass<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def getIndex(self):<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Get index of current child=
.&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self.app.ch=
ildren.index(self.panel)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;except ValueError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;return -1<br><br><br>class Tabs(Framework):<br>&nbsp;&n=
bsp;&nbsp;&nbsp;#---events<br>&nbsp;&nbsp;&nbsp;&nbsp;def bindTabs(self):<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.Bind
(self.app.EVENT_NOTEBOOK, self.onFrameTab)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;#eventManager.Register(self.onFrameTab, self.app.EVENT_N=
OTEBOOK, self.tabs)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def unbindTabs(self):<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.Unbind(self.app.=
EVENT_NOTEBOOK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#eventMa=
nager.DeregisterWindow(
self.tabs)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def raiseTab(self,index):<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if index &gt; -1:<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app =3D self.=
app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;if app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
'Event&lt;: Tab:&nbsp;&nbsp; %s.onFrameTab(%s)'%(self.__class__,index)<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pare=
nt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
app.mdi in [SDI,MDI_TABS]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;if index =3D=3D 0 and parent:<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;window&nbsp;&nbsp;=3D
self.parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(window,'panelFrame'):<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window
=3D window.panelFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window
=3D self.app.children[index-[0,1][parent]].frame<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.DEBUG:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;print '%s.Raise()'%window<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print window.=
Raise<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;window.Raise()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;if app.DEBUG:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;print
'Event&gt;: Tab:&nbsp;&nbsp; %s.onFrameTab(%s)'%(self.__class__,index)<br><=
br>#---SDI Platform dependent<br>class TabWin32(Tabs):<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&quot;&quot;&quot;SDI Implementation for windows (see also App.SetMd=
i)&quot;&quot;&quot;<br>##&nbsp;&nbsp;&nbsp;&nbsp;def onFrameTab(self,event=
):
<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Whe=
n a tab is changed (EVT_MOUSE_LEFT&amp;HitTest).&quot;&quot;&quot;<br>##&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mousePos&nbsp;&nbsp;&nbsp;&nbs=
p;=3D event.GetPosition()<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;index, other =3D self.tabs.HitTest(mousePos)<br>##&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;self.raiseTab
(index)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameTab(self,event):<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.raiseTab(event.GetSelection=
())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.Skip()<br><br>=
class TabUnix(Tabs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;SDI Imple=
mentation for windows (see also App.SetMdi
)&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameTab(self,event):<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;When a=
 tab is changed (EVT_NOTEBOOK_CHANGING).&quot;&quot;&quot;<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
; =3D event.GetSelection()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;event.Veto()#instead of=20
event.Skip() (don't do this here anyway)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;self.raiseTab(index)<br><br>if PLATFORM =3D=3D 'win32':<br=
>&nbsp;&nbsp;&nbsp;&nbsp;TabPlatform&nbsp;&nbsp;&nbsp;&nbsp; =3D TabWin32<b=
r>else:<br>&nbsp;&nbsp;&nbsp;&nbsp;TabPlatform&nbsp;&nbsp;&nbsp;&nbsp; =3D =
TabUnix<br><br>####Parent classes<br>class Parent(Framework):
<br>&nbsp;&nbsp;&nbsp;&nbsp;#---initialize<br>&nbsp;&nbsp;&nbsp;&nbsp;def _=
_init__(self, app, page =3D '', **options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;self.options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
options<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.noMenu&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D False<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Framework.__init__(self,<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D app,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;Panel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D app.ParentPanel,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;=3D
page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;parentFrame&nbsp;&nbsp;&nbsp;&nbsp; =3D self,<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options)<br><br>&nbsp=
;&nbsp;&nbsp;&nbsp;def __finish__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;Framework.__finish__(self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;=
#---events<br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameClose(self,event=3DNone):<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.dead
 =3D Framework.onFrameClose(self,event,destroy=3D0)<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;if not self.dead: return<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Avoid event exceptions of child frames<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for child in self.app.children=
:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;eventManager.DeregisterWindow
(child.frame)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;child.dead =3D 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;#Destroy itself<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s=
elf.Destroy()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event: =
event.Skip()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;#---menu<br>&nbsp;&nbsp;&nbsp;&=
nbsp;def menu_new(self, event=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;self.child()<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;def menu_close(self,event=3DNone):<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childActive =3D self.app.childActive<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if childActive:<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childActive=
.onFrameClose()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;#---parentPanel<br>&nbsp;&nb=
sp;&nbsp;&nbsp;def child(self,*args,**keyw):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;
self.ChildFrame(self,*args,**keyw)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def maxim=
ize(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.m=
di =3D=3D MDI_SPLIT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;return True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;i =3D 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m =3D 0=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for child in self.app.c=
hildren:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;if=20
child.frame.IsMaximized():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return True<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return False<br><br>&nbsp;&nbsp;&nbs=
p;&nbsp;#---other<br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=3D'',ex=
tra=3D'',draw=3DTrue,colour=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;if draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;
=3D self.app.title<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if page:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;
=3D '%s - %s'%(page,t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;self.SetTitle(t)<br><br><br>class MdiParentFrame(Par=
ent,wx.MDIParentFrame):<br>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Unifor=
med parent Mdi/Sdi class based on Mdi.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;self.=
Panel is defined by joined class&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,app,<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;=3D wx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp; =3D 'parentFrame',<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbs=
p;&nbsp;=3D None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;=3D SIZE,<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp; =
=3D STYLE_PARENTFRAME,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp; =3D POS,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.MDIParen=
tFrame.__init__(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D id,<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nb=
sp;&nbsp;&nbsp;&nbsp;=3D page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;&nbsp;=3D parent,<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbs=
p;&nbsp;&nbsp;=3D size,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp; =3D style | FULL_REPAINT_ON_RESIZ=
E,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;title&nbsp;&nbsp; =3D page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp; =3D pos)<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if style &amp; wx.MAXIMIZE:<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try: =
#not working on mandrake9<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Maximize(1)<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;pass
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#This always has to be =
last!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parent.__init__(se=
lf,app=3Dapp,page=3Dpage,**options)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __st=
age__(self,page,extra,**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;self.panelFrame&nbsp;&nbsp;&nbsp;&nbsp;
=3D wx.MDIChildFrame(parent=3Dself,id=3Dwx.ID_ANY)<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;self.panelFrame.SetTitle(self.app.panelFrameTitl=
e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#parentPanel<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.Panel(parent=3Dself.panelFrame,**options)<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;eventManager.Register(self.onSashClose, wx.EVT_CLOSE=
, self.panelFrame)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#pale=
tte<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.Palette:=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;self.palette&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.app.Palette(parent=3Dself,id=3Dwx.ID_ANY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.palette.Show()<br><br>&=
nbsp;&nbsp;&nbsp;&nbsp;def onSashClose(self,event):<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.panel,'onClosePanelFrame'):<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel=
f.panel.onClosePanelFrame(event)
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=3D'',extra=3D'',draw=
=3DTrue,colour=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
if draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.SetTitle(self.app.title)<br><br>class MdiTabsParentFrame(TabP=
latform,MdiParentFrame):<br>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(self,page=
,extra,**options):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;
=3D self.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panelF=
rame&nbsp;&nbsp;&nbsp;&nbsp;
=3D wx.MDIChildFrame(parent=3Dself,id=3Dwx.ID_ANY)<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;self.panelFrame.SetTitle(app.panelFrameTitle)<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panelFrame.Raise=3D s=
elf.panelFrame.Activate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
#parentPanel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs&n=
bsp;&nbsp;
=3D NotebookPlus(app=3Dapp,parent=3Dself.parentFrame, id=3Dwx.ID_ANY,<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style=
 =3D STYLE_NOTEBOOK )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;se=
lf.panel&nbsp;&nbsp;=3D self.Panel(parent=3Dself.tabs,**options)<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.AddPage(self.panel, page=
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__layoutTabs__()
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#events<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eventManager.Register(self.onSashClose,=
 wx.EVT_CLOSE, self.panelFrame)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;#palette<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.=
Palette:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.palette&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.app.Palette(parent=3Dself,id=3Dwx.ID_ANY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.palette.Show()<br><br><=
br>class MdiSashParentFrame(MdiParentFrame):<br>&nbsp;&nbsp;&nbsp;&nbsp;&qu=
ot;&quot;&quot;Uniformed parent Mdi/Sdi class based on Mdi.<br><br>&nbsp;&n=
bsp;&nbsp;&nbsp;self.Panel
 is defined by joined class&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;de=
f __stage__(self,page,extra,**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&quot;&quot;&quot;Create tabs to switch between documents a=
s an wx.SashLayoutWindow&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if=20
self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;print
'Create: Mdi:&nbsp;&nbsp; %s.tabs'%(self.__class__,)<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#sash for parentPanel<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;self.sashId =3D wx.NewId()<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sash =3D wx.SashLayoutWindow(id=3Dself.s=
ashId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;name=3D'sash',
parent=3Dself, style=3Dwx.NO_BORDER)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;self.sash.SetDefaultSize(wx.Size(792, 200))<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sash.SetOrientation(wx.LAYOUT_HORIZON=
TAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sash.SetAlignm=
ent(wx.LAYOUT_BOTTOM)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;se=
lf.sash.SetSashVisible
(wx.SASH_TOP, 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sa=
sh.SetMinimumSizeY(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;se=
lf.sash.Show(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event=
Manager.Register(self.onFrameSashDragged, wx.EVT_SASH_DRAGGED, self.sash)<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#parentPanel<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.Panel(parent=3Dself.sash,**options)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;#layout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;self.panelSizer&nbsp;&nbsp;&nbsp;&nbsp; =3D wx.BoxSizer(wx.VERTICAL)<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panelSizer.Add(self.pane=
l, 1, wx.ALL | wx.EXPAND, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self.sash.SetAutoLayout(1)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.sash.SetSizer(self=
.panelSizer)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __finish__(self):<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parent.__finish__(self)<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.LayoutAlgorithm().LayoutMDIFra=
me(self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;#---events<br>&nbsp;&nbsp;&nbsp;&nb=
sp;def onFrameSashDragged(self,event):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Calle=
d when the shashwindow is dragged.&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event.GetDragStatus() =3D=3D wx.SASH_STATUS=
_OUT_OF_RANGE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;return<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eI=
D =3D event.GetId()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if e=
ID =3D=3D=20
self.sashId:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;self.sash.SetDefaultSize(wx.Size(1000,event.GetDragRect().heig=
ht))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.LayoutAlgorithm(=
).LayoutMDIFrame(self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameSize(self,=
 event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&qu=
ot;Overwritten for sash dragging.&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Framework.onFrameSize(s=
elf)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.LayoutAlgorithm(=
).LayoutMDIFrame(self)<br><br>class MdiSashTabsParentFrame(TabPlatform,MdiS=
ashParentFrame):<br>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(self,page,**optio=
ns):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;C=
reate tabs to switch between documents as an=20
wx.SashLayoutWindow&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print 'Create: Mdi: %s.tabs'%(self.__class=
__,)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabsSash =3D w=
x.SashLayoutWindow(id=3Dwx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=3D'tabs',
parent=3Dself, style=3Dwx.CLIP_CHILDREN)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;self.tabsSash.SetOrientation(wx.LAYOUT_HORIZONTAL)<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabsSash.SetAlignment(wx.L=
AYOUT_TOP)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabsSash=
.SetDefaultSize(wx.Size(792, TABSASH_HEIGHT))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs
=3D NotebookPlus(app=3Dself.app,id=3Dwx.ID_ANY, parent=3Dself.tabsSash,
style=3DSTYLE_NOTEBOOK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
self.__layoutTabs__(self.tabsSash)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;MdiSashParentFrame.__stage__(self,page,**options)<br><br>&nbsp;&=
nbsp;&nbsp;&nbsp;def onFrameTab(self,event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;When a tab is changed (EVT_MOUSE_LEF=
T&amp;HitTest).&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TabPlatform.onFrameTab(=
self,event)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.Skip()=
<br><br>class MdiSplitParentFrame(Parent,wx.Frame):<br>&nbsp;&nbsp;&nbsp;&n=
bsp;def __init__(self,app,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D wx.ID_=
ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;=3D 'parentFrame',
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;parent&nbsp;&nbsp;=3D None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;=3D SIZE,<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nb=
sp;&nbsp; =3D STYLE_PARENTFRAME,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp; =3D POS,<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**opt=
ions):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.Frame.__init__=
(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D id,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;name&nbsp;&nbsp;&nbsp;&nbsp;=3D page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;&nbsp;=3D parent,<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&n=
bsp;&nbsp;&nbsp;&nbsp;=3D size,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp; =3D style | FULL_REPAINT_=
ON_RESIZE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;title&nbsp;&nbsp; =3D page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp; =3D pos)=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if style &amp;=20
wx.MAXIMIZE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;try: #not working on mandrake9<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Ma=
ximize(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;except:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;#self.isSdiParent&nbsp;&nbsp;&nbsp;&nbsp;=3D True<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#This always has to be las=
t!<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parent.__init__(self,app=3D=
app,page=3Dpage,**options)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(sel=
f,page,extra,**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;self.split&nbsp;&nbsp;=3D
split =3D wx.SplitterWindow(self,wx.ID_ANY,style=3DSTYLE_SPLIT)<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs&nbsp;&nbsp; =3D NotebookP=
lus(app=3Dself.app,parent=3Dsplit, id=3Dwx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style =3D STYLE_NOTEBOOK=
 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#self.tabs&nbsp;&nbsp=
; =3D wx.Notebook(parent=3Dsplit, id=3D
wx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;=
&nbsp;&nbsp;style =3D STYLE_NOTEBOOK )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;self.panel&nbsp;&nbsp;=3D self.Panel(parent=3Dsplit,**option=
s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split.SetMinimumPaneS=
ize(20)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;split.SplitHoriz=
ontally(self.tabs, self.panel, -200)<br><br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.bindTabs()<br><br>=
&nbsp;&nbsp;&nbsp;&nbsp;def bindTabs(self,event=3DNone):<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.Bind(NotebookCtrl.EVT_NOTEBOOKCT=
RL_PAGE_CHANGED, self.onFrameTab)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;#eventManager.Register(self.onFrameTab, wx.EVT_NOTEBOOK_PAGE_CHAN=
GED
, self.tabs)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def unbindTabs(self):<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.Unbind(NotebookCtrl.EVT=
_NOTEBOOKCTRL_PAGE_CHANGED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;#eventManager.DeregisterWindow(self.tabs)<br><br>&nbsp;&nbsp;&nbsp;&nbs=
p;def onFrameTab(self,event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;index =3D=20
event.GetSelection()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if =
index&gt;-1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;self.app.children[index].frame.onFrameActivate()<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.Skip()<br><br>class SdiParentFr=
ame(TabPlatform,Parent,wx.Frame):<br>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&q=
uot;Uniformed parent Mdi/Sdi class based on Sdi.&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,app,<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;=3D wx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;=3D 'parentFrame',=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;parent&nbsp;&nbsp;=3D None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;=3D SIZE,<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nb=
sp;&nbsp; =3D STYLE_PARENTFRAME,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp; =3D POS,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.Frame.__=
init__(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D id,<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;=
&nbsp;&nbsp;=3D page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;parent&nbsp;&nbsp;=3D parent,<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&=
nbsp;=3D size,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;style&nbsp;&nbsp; =3D style | FULL_REPAINT_ON_RESIZE,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;title&nbsp;&nbsp; =3D page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp; =3D pos)<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if style &amp; wx.MAXIMIZE:<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try: =
#not working on mandrake9<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Maximize(1)<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;pass
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.isSdiParent&nbsp;&=
nbsp;&nbsp;&nbsp;=3D True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;#This always has to be last!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;Parent.__init__(self,app=3Dapp,page=3Dpage,**options)<br><br>&nbsp;&=
nbsp;&nbsp;&nbsp;def __stage__(self,page,extra,**options):<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Create tabs to switch =
between documents as an=20
wx.Notebook&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;print
'Create: Sdi:&nbsp;&nbsp; %s.tabs'%(self.__class__,)<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs&nbsp;&nbsp; =3D NotebookPlus(app=3Ds=
elf.app,parent=3Dself, id=3Dwx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style =3D STYLE_NOTEBOOK )<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel&nbsp;&nbsp;=3D self.Pa=
nel(parent=3Dself.tabs,**options)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.AddPage(self.=
panel, page)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__layo=
utTabs__()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=3D'',extra=
=3D'',draw=3DTrue,colour=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;if draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;self.SetTitle(self.app.title)<br><br>
####Child classes<br>class Child(Framework):<br>&nbsp;&nbsp;&nbsp;&nbsp;#--=
-initialize<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,parentFrame,page=
=3D'',extra=3D'',parent=3DNone,**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;
=3D parentFrame.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self=
.pageTitle&nbsp;&nbsp;=3D ''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self._pageTitle&nbsp;&nbsp;=3D '?'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;self.extraTitle =3D ''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;self._extraTitle =3D ''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;Framework.__init__(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;
=3D app,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;Panel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D app.ChildPanel,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;parentFrame =3D parentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;=3D
page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D extra,<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options)<br><b=
r>&nbsp;&nbsp;&nbsp;&nbsp;def __finish__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;
=3D self.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;panel&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D self.panel<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app.childActive =3D panel<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app.children.append(panel)<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.addPageToParent(pan=
el,app.mdi)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#finish<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Framework.__finish__(self)
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def addPageToParent(self,panel,mdi):<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;&quot;Add pa=
ge with childs title to parent<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;Can be overwritten.&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;parentFrame&nbsp;&nbsp;&nbsp;&nbsp; =3D self.parentFra=
me<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
parentFrame.tabs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.Ad=
dPage(page=3DDummyPage(tabs),
text=3Dself.page,select=3D(mdi not in [SDI,MDI_TABS]))<br><br>&nbsp;&nbsp;&=
nbsp;&nbsp;#---events<br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameActivate(self, =
event=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&qu=
ot;&quot;Activate event.&quot;&quot;&quot;#todo: update tabs above if not r=
ight<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (not event) or event.Get=
Active():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Event:&nbsp;&nbsp;Chi=
ld:
%s.Activate'%self.__class__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;self.app.childActive&nbsp;&nbsp;&nbsp;&nbsp;=3D=
 self.panel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Framework.on=
FrameActivate(self,event)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameClose(s=
elf, event =3D None):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&q=
uot;&quot;&quot;Close event.&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug =3D self.app.DEBU=
G<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if debug:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print 'Event=
&lt;: Child: %s.Close'%self.__class__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;self.dead =3D Framework.onFrameClose(self,destroy=3D0)<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not self.dead:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if=20
self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
'Event&gt;: Child: %s.Close returns False'%self.__class__<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return False<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#deregister events<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eventManager.DeregisterWindow(sel=
f)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event: event.Skip(=
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#index<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mdi&nbsp;&nbsp;&nbsp;&nbsp; =3D=20
self.app.mdi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;=
&nbsp; =3D self.getIndex()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;if mdi in [SDI,MDI_TABS]:&nbsp;&nbsp;delta =3D 1<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;else:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;delta
=3D 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Update children<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children&nbsp;&nbsp;&nbsp=
;&nbsp;=3D self.app.children<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;children.remove(self.panel)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;if children:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;childActive =3D self.app.childActive =3D children[0]<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chi=
ldActive =3D self.app.childActive =3D None<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;#update rest<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;parentFrame =3D self.parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;if hasattr(parentFrame,'tabs'):<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Update childBook tabs<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur=
rent =3D index+delta
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;# * parent frame (mdi &amp; sdi)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFrame.unbindTabs()<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFrame.tabs=
.DeletePage(current)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;if
(mdi in [SDI,MDI_SASH_TABS,MDI_TABS] or (mdi=3D=3DMDI_SPLIT and children))
and childActive:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFrame.tabs.SetSelection(0)<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=
arentFrame.bindTabs()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;# * children frames (sdi)<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
mdi in [SDI,MDI_TABS] and childActive: #not for mdichild<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;eventManager.DeregisterWindow(self.tabs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for child in children:<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;child.frame.unbindTabs()<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;tabs&nbsp;&nbsp;
=3D child.frame.tabs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.D=
eletePage(current)#remove
closed item from other children<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;if
c&gt;=3Dcurrent:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;tabs.SetSelection(c)#adapt
selection<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child.frame.bindT=
abs()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c +=3D 1<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if childActive:<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childActive.frame.Ac=
tivate()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mdi!=3DMDI_S=
PLIT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;self.Destroy()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if debug:<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
'Event&gt;: Child: %s.Close returns True'%self.__class__<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return True<br><br>&nbsp;&nbsp;&nbsp;&nbsp=
;def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=3DNon=
e):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if new:<br>&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#parameters<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
if
page:&nbsp;&nbsp;&nbsp;&nbsp;self.pageTitle&nbsp;&nbsp;=3D page<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if extra:&n=
bsp;&nbsp; self.extraTitle =3D extra<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#go<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D ['','*'][self.panel.changed]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.pageTitle:<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;self._pageTitle&nbsp;&nbsp;
=3D&nbsp;&nbsp;'%s%s'%(self.pageTitle,m)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self=
._pageTitle&nbsp;&nbsp;
=3D&nbsp;&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if dra=
w:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;if self.app.mdiName =3D=3D SDI or WIN:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetT=
itle(self.extraTitle)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetTitle(self.page=
Title)<br><br>class MdiSashTabsChildFrame(Child,
wx.MDIChildFrame):<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,parentFrame=
,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D wx.ID_ANY,<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;=3D UNNAMED,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ext=
ra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D '',<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D STYLE_=
CHILDFRAME,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maximize&nbs=
p;&nbsp;&nbsp;&nbsp;=3D None,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options):<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.noMenu =3D True<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D parentFrame.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#deb=
ug message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.DEBUG:=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;print 'Create: Mdi: %s'%self.__class__<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;if maximize =3D=3D None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maximize =3D parentFrame.maximize(=
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if maximize:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;style&nbsp;&nbsp; |=3D wx.MAXIMIZE<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;wx.MDIChildFrame.__init__(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;=3D id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;=3D page,<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;&nbsp;=3D =
parentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;style&nbsp;&nbsp; =3D style | FULL_REPAINT_ON_RESIZE,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;title&nbsp;&nbsp; =3D page)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self.Maximize()#if
maximize and PLATFORM !=3D 'win32':#sm:seems better to leave this away.<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Raise&nbsp;&nbsp;=3D s=
elf.Activate #raise doesn't work here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;#This always has to be last!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;Child.__init__(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFrame =3D parentFrame,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D extra,<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options)<br><b=
r>&nbsp;&nbsp;&nbsp;&nbsp;def __finish__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;self.tabs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D s=
elf.parentFrame.tabs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Chi=
ld.__finish__(self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=
=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=3DNone):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.setTitle(self,pag=
e,extra,new,draw)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.p=
arentFrame.setTitle(self._pageTitle,draw=3Ddraw)<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;if new and draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index =3D self.getIndex()<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ta=
bs.SetPageText(index,self._pageTitle)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;if
not(colour is None) and hasattr(self.tabs,'SetPageColour'):<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.tabs.SetPageColour(index,colour)<br><br>&nbsp;&nbsp;&nbsp;&nb=
sp;def onFrameActivate(self, event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;if event.GetActive():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setTitle
(new=3DFalse)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;self.parentFrame.tabs.SetSelection(self.getIndex())<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.onFrameActivate(self,event)=
<br><br>class MdiChildFrame(MdiSashTabsChildFrame, Child):<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&quot;&quot;&quot;Mdi Child frame without tabs.&quot;&quot;&quot=
;
<br>&nbsp;&nbsp;&nbsp;&nbsp;def addPageToParent(self,panel,mdi):<br>&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br><br>&nbsp;&nbsp;&nbsp;&nbs=
p;def setTitle(self,page=3D'',extra=3D'',new=3DTrue,draw=3DTrue,colour=3DNo=
ne):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.setTitle(self=
,page,extra,new,draw)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;se=
lf.parentFrame.setTitle
(self._pageTitle,draw=3Ddraw)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __finish__=
(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.__finish__=
(self)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def onFrameActivate(self, event):<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event.GetActive():<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.=
setTitle(new=3DFalse)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Child.onFrameActivate(self,event)<br><br>class MdiTabsChildFrame(TabPlatfor=
m,MdiSashTabsChildFrame, Child):<br>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(s=
elf,page,extra,**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&quot;&quot;&quot;Create tabs to switch between documents as an=20
wx.SashLayoutWindow&quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;if self.app.DEBUG:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
'Create: Sdi:&nbsp;&nbsp; %s.tabs'%(self.__class__,)<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs
=3D self.tabs&nbsp;&nbsp; =3D NotebookPlus(app=3Dself.app,parent=3Dself,
id=3Dwx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;style =3D STYLE_NOTEBOOK )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;panel =3D self.panel =3D self.Panel(parent=3Dtabs,**opti=
ons)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Add parent tab to =
itself<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.AddPage(page=
=3DDummyPage(tabs),text=3Dself.app.title
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Add child tabs to its=
elf and vice versa<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for c=
hild in self.app.children:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;childTabs&nbsp;&nbsp; =3D child.frame.tabs<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.=
AddPage(page=3DDummyPage(tabs),text=3Dchild.frame._pageTitle)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chi=
ldTabs.AddPage(page=3DDummyPage(childTabs),text=3Dpage)<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Add itself to itself<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.AddPage(page=3Dpanel,text=3Dpage,select=
=3DTrue)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__layoutTa=
bs__()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __finish__(self):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.__finish__(self)<=
br><br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=3D'',extra=3D'',new=
=3DTrue,draw=3DTrue,colour=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;Child.setTitle(self,page,extra,new)<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;if new and draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;&nbsp; =3D self.getInde=
x
()+1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self.tabs.SetPageText(index,self._pageTitle)<br>&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
not(colour is None) and hasattr(self.tabs,'SetPageColour'):<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.tabs.SetPageColour(index,colour)<br><br>&nbsp;&nbsp;&nbsp;&nb=
sp;def onFrameActivate(self, event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;if event.GetActive():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setTitle
(new=3DFalse)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;self.parentFrame.tabs.SetSelection(self.getIndex()+1)<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.onFrameActivate(self,even=
t)<br><br>class MdiSplitChildFrame(Child,wx.Panel):<br>&nbsp;&nbsp;&nbsp;&n=
bsp;def __init__(self,parentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
=3D=20
wx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D STYLE_CHILDFRAME,<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;=3D '',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extra&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D '',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;maximize&nbsp;&nbsp;&nbsp;&nbsp;=3D None,<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;self.noMenu =3D True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D=20
parentFrame.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#debug m=
essage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.DEBUG:<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pri=
nt 'Create: MdiSplit: %s'%self.__class__,page,extra<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.Panel.__init__(self,<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;=3D id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;=3D page,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;parent&nbsp;&nbsp;=3D parentFrame.tabs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;=3D wx=
.Size(600,400),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;style&nbsp;&nbsp; =3D style | FULL_REPAINT_ON_RESIZE,)<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#tit=
le&nbsp;&nbsp; =3D page)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;#This always has to be last!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;Child.__init__(self,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;parentFrame =3D parentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;=3D
page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D extra,<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options)<br><b=
r>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(self,page,extra,**options):<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Create tabs t=
o switch between documents as an wx.SashLayoutWindow&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.DEBUG:<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prin=
t
'Create: Sdi:&nbsp;&nbsp; %s.tabs'%(self.__class__,)<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panel =3D self.Panel(parent=3Dself,name=
=3Dpage,**options)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sizer=
 =3D wx.BoxSizer(wx.VERTICAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;sizer.Add(self.panel, 1, wx.EXPAND, 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;self.SetAutoLayout
(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetSizer(siz=
er)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Layout()<br><br=
>&nbsp;&nbsp;&nbsp;&nbsp;def addPageToParent(self,panel,mdi):<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;&quot;Add page with=
 childs title to parent<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
Can be overwritten.&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFrame&nbsp;&nbsp;=
&nbsp;&nbsp; =3D self.parentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;tabs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;=3D
self.tabs =3D parentFrame.tabs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;parentFrame.unbindTabs()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;tabs.AddPage(page=3Dself, text=3Dself.page,select=3D(mdi not in [SD=
I,MDI_TABS]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFram=
e.bindTabs()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=3D'',ext=
ra=3D'',new=3DTrue,draw=3DTrue,colour=3DNone):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.setTitle(self,pag=
e,extra,new)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if new and =
draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;index&nbsp;&nbsp; =3D self.getIndex()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tabs.SetPageText(index,sel=
f._pageTitle)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;if
not(colour is None) and hasattr(self.tabs,'SetPageColour'):<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.tabs.SetPageColour(index,colour)<br><br>&nbsp;&nbsp;&nbsp;&nb=
sp;def SetIcon(self,*args,**keyw):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;pass<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def IsMaximized(self):<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return True
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def Activate(self):<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parentFrame.tabs.SetSelection(self.getInde=
x())<br><br>class SdiChildFrame(TabPlatform,Child,wx.Frame):<br>&nbsp;&nbsp=
;&nbsp;&nbsp;def __init__(self,parentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;=3D wx.ID_ANY
,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp; =3D STYLE_CHILDFRAME,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D '=
',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extra&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp; =3D '',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;maximize&nbsp;&nbsp;&nbsp;&nbsp;=3D None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;**options):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;self.noMenu =3D False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;app&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;
=3D parentFrame.app<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#deb=
ug message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if app.DEBUG:=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;print 'Create: Sdi: %s'%self.__class__,page,extra<br>&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;#maximize&amp;init<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;if maximize =3D=3D None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maximize =3D=20
parentFrame.maximize()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=
f maximize:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;style&nbsp;&nbsp; |=3D wx.MAXIMIZE<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;wx.Frame.__init__(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;=3D id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;=3D page,<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;&nbsp;=
=3D parentFrame,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;siz=
e&nbsp;&nbsp;&nbsp;&nbsp;=3D wx.Size(600,400),<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp; =3D style =
| FULL_REPAINT_ON_RESIZE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp; =3D page)<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if maximize:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if PLATFORM !=3D 'win32':<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;self.Maximize
()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetSize(app.size)<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#This always has to be last!<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.__init__(self,<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentFrame =3D p=
arentFrame,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
page,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D extra,<br>&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**options)<br><b=
r>&nbsp;&nbsp;&nbsp;&nbsp;def __stage__(self,page,extra,**options):<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Create tabs t=
o switch between documents as an wx.SashLayoutWindow&quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.app.DEBUG:<br>&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prin=
t
'Create: Sdi:&nbsp;&nbsp; %s.tabs'%(self.__class__,)<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs
=3D self.tabs&nbsp;&nbsp; =3D NotebookPlus(app=3Dself.app,parent=3Dself,
id=3Dwx.ID_ANY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;style =3D STYLE_NOTEBOOK )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;panel =3D self.panel =3D self.Panel(parent=3Dtabs,**opti=
ons)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Add parent tab to =
itself<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.AddPage(page=
=3DDummyPage(tabs),text=3Dself.app.title
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Add child tabs to its=
elf and vice versa<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for c=
hild in self.app.children:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;childTabs&nbsp;&nbsp; =3D child.frame.tabs<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.=
AddPage(page=3DDummyPage(tabs),text=3Dchild.frame._pageTitle)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chi=
ldTabs.AddPage(page=3DDummyPage(childTabs),text=3Dpage)<br>&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Add itself to itself<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tabs.AddPage(page=3Dpanel,text=3Dpage,select=
=3DTrue)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__layoutTa=
bs__()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def setTitle(self,page=3D'',extra=3D'=
',new=3DTrue,draw=3DTrue,colour=3DNone):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Child.setTitle(self,pag=
e,extra,new)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if new and =
draw:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;self.tabs.SetPageText(self.getIndex()+1,self._pageTitle)<br><br>####A=
pplication<br>####use single or multiple instances<br>#could be done with a=
 variable of some sort
<br>singleInstance =3D True #set to true for single instance app or set to =
false for multiple instance app<br>if singleInstance:<br>&nbsp;&nbsp;&nbsp;=
&nbsp;APP =3D singleApp.SingleInstanceApp<br>else:<br>&nbsp;&nbsp;&nbsp;&nb=
sp;APP =3D wx.App<br><br>class App(APP):#singleApp.SingleInstanceApp
<br>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, ParentPanel, ChildPanel, Men=
uBar, ToolBar, StatusBar,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;Palette=3DNone, mdi=3DDEFAULT, debug=3D0, title=
=3D'name',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;panelFrameTitle=3D'panel',size=3Dwx.Size(800,400),<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imagePath =3D=
 None, pos=3D
wx.Point(wx.ID_ANY,wx.ID_ANY),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style=3DSTYLE_PARENTFRAME,**attributes):<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#passing arguments<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global CHILDPANEL<br>&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentPanel&nbsp;&nbsp;&nbsp;&nbs=
p;=3D ParentPanel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.C=
hildPanel&nbsp;&nbsp;&nbsp;&nbsp; =3D CHILDPANEL =3D ChildPanel
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.MenuBar&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D MenuBar<br>&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;self.ToolBar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;=3D ToolBar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;se=
lf.StatusBar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D StatusBar<br>&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Palette&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;=3D Palette<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;self.SetMdi(mdi)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;self.DEBUG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
=3D debug
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.title&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D title<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.panelFrameTitle=3D panelFrameTitle<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.size&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D size<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.imagePath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;=3D imagePath<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.p=
os&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
=3D
pos<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.style&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D style<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#initialization<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;self.children&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p; =3D []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.childActi=
ve&nbsp;&nbsp;&nbsp;&nbsp;=3D None<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;if self.imagePath:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.bitmap&nbsp;&nbsp;&nbsp;&nbsp;
=3D wx.Bitmap =3D Bitmap(imagePath,self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;self.bitmap&nbsp;&nbsp;&nbsp;&nbsp; =3D wx.Bitmap<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#options<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.attributes&nbsp;&nbsp;&nbsp;&nbsp; =
=3D attributes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for key i=
n attributes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;if hasattr(self,key):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;print
&quot;Warning: Application can't accept attribute '%s'.&quot;%key<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;setattr(self,key,attributes[key])<br>&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#start<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;print &quot;Launching application...&quot;<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if singleInstance:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;singleApp.SingleInstanceApp.__init__(self,name=3Dtitle,redirect=3Dnot debu=
g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.App.__init__=
(self,redirect=3Dnot debug)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def OnArgs(self,=
 evt):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if hasattr(self.p=
arentPanel
,'onArgs'):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;self.parentPanel.onArgs(evt.data)<br>&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;self.GetTopWindow().Raise()<br>&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;self.GetTopWindow().Iconize(False)<br><br>&nbsp;&=
nbsp;&nbsp;&nbsp;def OnInit(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;if singleInstance and self.active:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret=
urn False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if singl=
eInstance:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Bind(singleApp.EVT_POST_ARGS,
self.OnArgs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;wx.InitAllImageHandlers()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parentFrame =3D self.ParentFram=
e(self,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.size,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;&nbsp;&nbsp;&nbsp;=3D
self.title,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;&nbsp;&nbsp;&nbsp;
=3D self.pos,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;style&nbsp;&nbsp; =3D self.style,<br>=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;**self.attributes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parentPanel =3D self.parentFra=
me.panel<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.parentFrame.Show(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.SetTopWindow
(self.parentFrame)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;return True<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def SetMdi(se=
lf,mdiName=3DDEFAULT):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
quot;&quot;&quot;Defines parent and children frame classes.&quot;&quot;&quo=
t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.mdiName&nbsp;&nb=
sp;&nbsp;&nbsp;=3D mdiName<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not DI.has_key(mdiName):=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;mdiName&nbsp;&nbsp;&nbsp;&nbsp; =3D DEFAULT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;if mdiName =3D=3D DEFAULT:<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp; WIN:<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;mdiName =3D MDI_SASH_TABS_WIN<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif DARWIN:#mac osx<br>&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;mdiName =3D MDI_SPLIT_ALL
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mdiName
=3D MDI_SPLIT_ALL#MDI_SASH_TABS_LINUX<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;self.mdi&nbsp;&nbsp;&nbsp;&nbsp;=3D DI[mdiName]<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;self.mdi =3D=3D SDI:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;=3D
SdiParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;self.ChildFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;
=3D SdiChildFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&n=
bsp;&nbsp;&nbsp;&nbsp;self.mdi =3D=3D MDI_SASH:<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentFrame&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
MdiSashParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;self.ChildFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;
=3D MdiChildFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&n=
bsp;&nbsp;&nbsp;&nbsp;self.mdi =3D=3D MDI_SASH_TABS:<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentFrame&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
MdiSashTabsParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;self.ChildFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;
=3D MdiSashTabsChildFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;#self.EVENT_NOTEBOOK&nbsp;&nbsp;&nbsp;&nbsp;
=3D wx.EVT_NOTEBOOK_PAGE_CHANGED<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;elif&nbsp;&nbsp;&nbsp;&nbsp;self.mdi =3D=3D MDI:<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentFrame&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
MdiParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;self.ChildFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;
=3D MdiChildFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&n=
bsp;&nbsp;&nbsp;&nbsp;self.mdi =3D=3D MDI_TABS:<br>&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentFrame&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
MdiTabsParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;self.ChildFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;
=3D MdiTabsChildFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el=
if&nbsp;&nbsp;&nbsp;&nbsp;self.mdi =3D=3D MDI_SPLIT:<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ParentFrame&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=3D
MdiSplitParentFrame<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;self.ChildFrame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;
=3D MdiSplitChildFrame<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;self.EVENT_NOTEBOOK =3D NotebookCtrl.EVT_NOTEBOOKCTRL_PAGE_CHANGED<br>##=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Tabs: notebook event is pl=
atformdependent<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if WIN=
:<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;#Under
Windows, GetSelection() will return the same value as<br>##&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#GetOldSelection()
when called from EVT_NOTEBOOK_PAGE_CHANGING handler and<br>##&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#not the page whi=
ch is going to be selected<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#Therefore
on Windows a combination of mouse click and hittest must be used.<br>##&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.EV=
ENT_NOTEBOOK =3D wx.EVT_LEFT_DOWN<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;else:<br>##&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;self.EVENT_NOTEBOOK =3D wx.EVT_NOTEBOOK_PAGE_CHANGING<b=
r><br><br>
####Test app<br>class TestMenuBar(wx.MenuBar):<br>&nbsp;&nbsp;&nbsp;&nbsp;d=
ef __init__(self,app,frame,*args,**kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;wx.MenuBar.__init__(self,*args,**kwds)<br>&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.file&nbsp;&nbsp; =3D wx.Menu()<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.file.Append(wx.ID_NEW, _(=
&quot;&amp;New\tCtrl+N&quot;), &quot;&quot;,=20
wx.ITEM_NORMAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fil=
e.Append(wx.ID_CLOSE, _(&quot;&amp;Close\tCtrl+W&quot;), &quot;&quot;, wx.I=
TEM_NORMAL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.file.Ap=
pend(wx.ID_EXIT, _(&quot;&amp;Exit\tAlt+F4&quot;), &quot;&quot;, wx.ITEM_NO=
RMAL
)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Append(self.file,=
 &quot;&amp;File&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;def __events__(self):<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.EVT_MENU(self.frame,wx.=
ID_NEW,self.menu_new)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx=
.EVT_MENU(self.frame,wx.ID_CLOSE,self.menu_close)<br>&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;
wx.EVT_MENU(self.frame,wx.ID_EXIT,self.menu_exit)<br>&nbsp;&nbsp;&nbsp;&nbs=
p;def menu_new(self,event=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;self.parentPanel.new()<br>&nbsp;&nbsp;&nbsp;&nbsp;def menu_close=
(self,event=3DNone):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel=
f.parentPanel.close()<br>&nbsp;&nbsp;&nbsp;&nbsp;def menu_exit(self,event=
=3DNone):
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.parentFrame.onFram=
eClose()<br><br>ArtIDs =3D [ wx.ART_FILE_OPEN,<br>&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.ART_PRINT,<br>&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.ART_ADD_BOOKMARK,<br>&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.ART_REPORT_VIEW,<br>&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wx.ART_LIST_VIEW,=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
wx.ART_HELP,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
; ]<br><br>class TestToolBar(wx.ToolBar):<br>&nbsp;&nbsp;&nbsp;&nbsp;def __=
init__(self,parent=3DNone,id=3Dwx.ID_ANY,menu=3DNone,app=3DNone,**kwds):<br=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.app =3D app<br>&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.ToolBar.__init__(self,parent=
=3Dparent,id=3Did,**kwds)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent.SetToolBar(self)=
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tools =3D []<br>&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for id in ArtIDs:<br>&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toolId =3D =
wx.NewId()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;bmp
=3D wx.ArtProvider_GetBitmap(id, wx.ART_TOOLBAR, (16,16))<br>&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.AddLabelTool=
(toolId,
&quot;&quot;, bmp, wx.NullBitmap, wx.ITEM_NORMAL, &quot;info&quot;, &quot;&=
quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;self.tools.append(toolId)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;self.Realize()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def __events__(self)=
:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for id in self.tools:<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
wx.EVT_TOOL(self,id, self.test)<br>&nbsp;&nbsp;&nbsp;&nbsp;def test(self,ev=
ent):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print 'test seems =
ok'<br><br>class TestParentPanel(wx.TextCtrl):<br>&nbsp;&nbsp;&nbsp;&nbsp;d=
ef __init__(self,parent,**kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;wx.TextCtrl.__init__(self,parent=3Dparent,id=3D
wx.ID_ANY,value=3D'parent',**kwds)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;self.test_child =3D 0<br>&nbsp;&nbsp;&nbsp;&nbsp;def new(self):<=
br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
=3D 'child%02d'%self.test_child<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;self.app.ChildFrame(self.frame,page=3Dvalue,value=3Dvalue)<br>&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.test_child +=3D 1<br>&nbsp;=
&nbsp;&nbsp;&nbsp;def close(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;active =3D self.app.childActive<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if active: active.frame.onFrameClose
()<br><br>class TestChildPanel(wx.TextCtrl):<br>&nbsp;&nbsp;&nbsp;&nbsp;def=
 __init__(self,parent,**kwds):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;wx.TextCtrl.__init__(self,parent=3Dparent,id=3Dwx.ID_ANY,**kwds)<br>=
<br>def __test__(debug,mdi=3DMDI):<br>&nbsp;&nbsp;&nbsp;&nbsp;app =3D App(T=
estParentPanel,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;TestChildPanel,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestMenuBar,<br>&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestToolB=
ar,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;wx.StatusBar,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mdi=3Dmdi,<br>&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title=3D'P=
arent',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;debug=3Ddebug)<br>&nbsp;&nbsp;&nbsp;&nbsp;
app.MainLoop()<br><br>if __name__=3D=3D'__main__':<br>&nbsp;&nbsp;&nbsp;&nb=
sp;__test__(debug=3D1,mdi=3DMDI_TABS_WIN)#multiple document interface for w=
indows<br>&nbsp;&nbsp;&nbsp;&nbsp;#__test__(debug=3D1,mdi=3DMDI_TABS_MAC)#s=
ingle document interface for mac<br>&nbsp;&nbsp;&nbsp;&nbsp;#__test__(debug=
=3D1,mdi=3DMDI_SPLIT_ALL)#multiple document interface for mac
<br><br><br></blockquote></div><br><br clear=3D"all"><br>-- <br><a href=3D"=
http://pythonide.stani.be">http://pythonide.stani.be</a><br><a href=3D"http=
://pythonide.stani.be/manual/html/manual.html">http://pythonide.stani.be/ma=
nual/html/manual.html
</a>

------=_Part_1149_17205073.1134599292906--


--__--__--

_______________________________________________
Python-spe-users mailing list
[email protected]
http://lists.berlios.de/mailman/listinfo/python-spe-users


End of Python-spe-users Digest