import wx, sys
import wx.lib.agw.aui as aui


class FrameWithDynamicCenterPane(wx.Frame):
    def __init__(self):
        super(FrameWithDynamicCenterPane, self).__init__(None)
        self.manager = aui.AuiManager(self)
        self.textPaneCount = 0
        self.addToolbar()
        self.addTextPane()
        self.bindEvents()

    def addToolbar(self):
        toolbar = aui.AuiToolBar(self)
        self.addTools(toolbar)
        self.manager.AddPane(toolbar, aui.AuiPaneInfo().Top().ToolbarPane())
        self.manager.Update()

    def addTools(self, toolbar):
        for bitmapId, toolId, eventHandler in \
                ((wx.ART_QUIT, wx.ID_EXIT, lambda event: self.Close()),
                 (wx.ART_NEW, wx.ID_ADD, lambda event: self.addTextPane())):
            bitmap = wx.ArtProvider.GetBitmap(bitmapId, wx.ART_TOOLBAR, 
                                              (16, 16))
            toolbar.AddSimpleTool(toolId, '', bitmap)
            toolbar.Bind(wx.EVT_MENU, eventHandler, id=toolId)
        toolbar.Realize()

    def addTextPane(self):
        count = str(self.textPaneCount)
        self.addPane(wx.TextCtrl(self), 'Text control ' + count,
                     'textcontrol' + count)
        self.textPaneCount += 1

    def bindEvents(self):
        for eventType in aui.EVT_AUI_PANE_CLOSE, aui.EVT_AUI_PANE_FLOATING:
           self.manager.Bind(eventType, self.onPaneClosingOrFloating)

    def onPaneClosingOrFloating(self, event):
        pane = event.GetPane()
        dockedPanes = self.dockedPanes()
        if self.isCenterPane(pane) and len(dockedPanes) == 1:
            event.Veto() 
        else:
            event.Skip() 
            if self.isCenterPane(pane):
                
                dockedPanes.remove(pane)
                dockedPanes[0].Center()
                
    def addPane(self, window, caption, name): 
        paneInfo = aui.AuiPaneInfo().CloseButton(True).Floatable(True).\
            FloatingSize((300, 200)).Name(name).Caption(caption).\
            CaptionVisible().MaximizeButton().DestroyOnClose()
        if not self.dockedPanes():
            paneInfo.Center()
        self.manager.AddPane(window, paneInfo)
        self.manager.Update()
   
    def dockedPanes(self):
        return [pane for pane in self.manager.GetAllPanes() \
                if not pane.IsToolbar() and not pane.IsFloating() \
                and not pane.IsNotebookPage()]

    @staticmethod
    def isCenterPane(pane):
        return pane.dock_direction_get() == aui.AUI_DOCK_CENTER
 

app = wx.App(None)
frame = FrameWithDynamicCenterPane()
frame.Show()
app.MainLoop()
