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