#!usr/bin/env python

#problem_sizers.py

import wx

class TestFrame(wx.Frame):
    def __init__(self, parent, id, *args, **kwargs):
        wx.Frame.__init__(self, parent, id, *args, **kwargs)
        framesizer = wx.BoxSizer(wx.VERTICAL)
        p = TestPanel(self, wx.ID_ANY)
        framesizer.Add(p, 0, wx.EXPAND)

        self.SetSizerAndFit(framesizer)
        self.Layout()
        
class TestPanel(wx.Panel):
    def __init__(self, parent, id, *args, **kwargs):
        wx.Panel.__init__(self, parent, *args, **kwargs)
        self.mainsizer = wx.BoxSizer(wx.VERTICAL)
        self.initial_view = True
        zero = self.makeZeroSizer()
        self.mainsizer.Add(zero, 0, wx.EXPAND)
        two = self.makeTwoSizer()
        self.mainsizer.Add(two, 0, wx.EXPAND)
        self.SetSizer(self.mainsizer)
        text = '''
Press 'One' then 'Two' then 'Three'
Two problems:
1. The rows seem to remain even if I'm destroying the children in the sizer.
2. Some of the text is staying behind the new text (eg. you can see part of the "W" remaining after the switch to "A"
Any Ideas???
What am I doing wrong???
        '''
        self.tc.SetValue(text)

        
    def makeZeroSizer(self):
        fgs = wx.FlexGridSizer(rows=2, cols=2)
        text1_1 = wx.StaticText(self, wx.ID_ANY, label='Status: ')
        self.text1_2 = wx.StaticText(self, wx.ID_ANY, label='initial',
            size=(250,-1))
        text2_1 = wx.StaticText(self, wx.ID_ANY, label='Rows: ')
        self.text2_2 = wx.StaticText(self, wx.ID_ANY, label='0')
        
        fgs.AddMany([
            (text1_1, 0, wx.ALIGN_RIGHT),
            (self.text1_2, 0, wx.EXPAND),
            (text2_1, 0, wx.ALIGN_RIGHT),
            (self.text2_2, 0, wx.EXPAND)
            ])

        return fgs
        
    def makeTwoSizer(self):
        sizer = wx.BoxSizer(wx.VERTICAL)
        text = wx.StaticText(self, wx.ID_ANY, label='Just some placeholder text')
        self.tc = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_MULTILINE,
            size=(-1,300))
        butsiz = wx.BoxSizer(wx.HORIZONTAL)
        self.butone = wx.Button(self, wx.ID_ANY, label='One')
        self.buttwo = wx.Button(self, wx.ID_ANY, label='Two')
        self.butthree = wx.Button(self, wx.ID_ANY, label='Three')
        butsiz.AddStretchSpacer()
        butsiz.Add(self.butone, 0, wx.ALIGN_CENTER)
        butsiz.Add(self.buttwo, 0, wx.ALIGN_CENTER)
        butsiz.Add(self.butthree, 0, wx.ALIGN_CENTER)
        butsiz.AddStretchSpacer()
        sizer.Add(text, 0, wx.EXPAND)
        sizer.Add(self.tc, 0, wx.EXPAND)
        sizer.Add(butsiz, 0, wx.EXPAND)
        
        self.Bind(wx.EVT_BUTTON, self.OnOne, self.butone)
        self.Bind(wx.EVT_BUTTON, self.OnTwo, self.buttwo)
        self.Bind(wx.EVT_BUTTON, self.OnThree, self.butthree)
        
        return sizer
        
    def makeOneSizer(self, data):
        fgs = wx.FlexGridSizer(rows=len(data), cols=2)
        
        for i in data:
            set = i[0] +': '
            text = wx.StaticText(self, wx.ID_ANY, label=set)
            fgs.Add(text, 0, wx.ALIGN_RIGHT)
            text = wx.StaticText(self, wx.ID_ANY, label=i[1])
            fgs.Add(text, 0, wx.EXPAND)
            
        return fgs
        
    def processData(self, data):
        if not self.initial_view:
            self.mainsizer.Detach(1)
            self.one_sizer.Destroy()
        self.initial_view = False
        self.one_sizer = self.makeOneSizer(data)
        self.mainsizer.Insert(1, self.one_sizer, 0, wx.EXPAND|wx.ALL, 3)
        self.Layout()
        self.GetParent().Fit()
        self.Refresh()
        self.GetParent().Refresh()
        
    def OnOne(self, evt):
        data = [('WS1', '5'), ('AS2', '7'), ('NC', '8'), ('WH', '2'),
            ('WFQ', '3'), ('AVN', '4')]
        self.processData(data)
        self.text2_2.SetLabel(str(len(data)))
        self.text1_2.SetLabel('Button One')
        
    def OnTwo(self, evt):
        data = [('NS2', '4'), ('AVW', '9'), ('WAG', '8'), ('XCF', '14')]
        self.processData(data)
        self.text2_2.SetLabel(str(len(data)))
        self.text1_2.SetLabel('Button Two')

    def OnThree(self, evt):
        data = [('AVW', '9'), ('WFQ', '3')]
        self.processData(data)
        self.text2_2.SetLabel(str(len(data)))
        self.text1_2.SetLabel('Button Three')

if __name__ == "__main__":
    app = wx.App(0)
    frame = TestFrame(None, wx.ID_ANY, 'Test Frame')
    frame.Show(True)
    
    app.MainLoop()