import wx
import sys
from wx.lib.agw import ultimatelistctrl as ULC
import wx.lib.expando as ex
import wx.lib.inspection

class TestPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.sizes = self.size_gen()
        font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
        boldfont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
        boldfont.SetWeight(wx.BOLD)
        boldfont.SetPointSize(12)
 
        self.ultimateList = ULC.UltimateListCtrl(self, agwStyle = wx.LC_REPORT
                                         | wx.LC_VRULES
                                         | wx.LC_HRULES
                                         | ULC.ULC_HAS_VARIABLE_ROW_HEIGHT)
 
        self.ultimateList.InsertColumn(0, 'Name')
        self.ultimateList.InsertColumn(1, 'Title')
        self.ultimateList.InsertColumn(2, 'Genre')
 
        self.ultimateList.InsertStringItem(0, "Newsboys")
        self.ultimateList.SetStringItem(0, 1, "Go")
        self.ultimateList.SetStringItem(0, 2, "Rock")
        
        self.ultimateList.InsertStringItem(1, "Family Force 5")
        self.button = wx.Button(self.ultimateList, label='button', size=(50,30))
        self.button.Bind(wx.EVT_BUTTON, self.on_button)
        self.ultimateList.SetItemWindow(1, 1, self.button)
        self.ultimateList.SetStringItem(1, 2, "Crunk")
        
        text = "\"I\'ll Be Missing You\" is a song recorded by American rapper Puff Daddy and American singer Faith Evans, featuring R&B group 112, in memory of fellow Bad Boy Records artist Christopher \"The Notorious B.I.G.\" Wallace, who was gunned down on March 9, 1997. --Wikipedia"
        self.ultimateList.InsertStringItem(2, "Puffy")
        edit_text = ex.ExpandoTextCtrl(self.ultimateList, value = text)
        edit_text.SetMaxHeight(sys.maxint)
        self.ultimateList.SetItemWindow(2, col=1, wnd=edit_text)
        self.ultimateList.SetStringItem(2, 2, "Pop")
        
        self.ultimateList.SetColumnWidth(0, 150)
        self.ultimateList.SetColumnWidth(1, 220)
        self.ultimateList.SetColumnWidth(2, 100)
 
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.ultimateList, 1, wx.EXPAND)
        self.SetSizer(sizer)
        
    def on_button(self, event):
        
        new_size = self.sizes.next()
        print new_size
        l = self.ultimateList
        label = l.GetItemWindow(1, 1).GetLabel()
        l.DeleteItem(1)
        self.button = wx.Button(self.ultimateList, label=label, size=new_size)
        self.button.Bind(wx.EVT_BUTTON, self.on_button)
        l.InsertStringItem(1, 'Family Farce 5')
        l.SetItemWindow(1,1,self.button)
        l.SetStringItem(1,2,'Crunk')
        l.SendSizeEvent()
        '''
        self.button.SetSize(self.sizes.next())
        id = 1  #must be item index
        self.ultimateList._mainWin._dirty=True
        self.ultimateList._mainWin.ResetVisibleLinesRange(True)
        self.ultimateList._mainWin.SendNotify(id, ULC.wxEVT_COMMAND_LIST_INSERT_ITEM)
        self.ultimateList._mainWin.RefreshLines(id, self.ultimateList._mainWin.GetItemCount() - 1)
        self.ultimateList.SendSizeEvent()
        '''
    def size_gen(self):
        sizes = [(150,200),(200,200),(80,80)]
        index = 0
        while True:
            yield sizes[index]
            index = index + 1
            if index > 2:
                index = 0
 
########################################################################
class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="MvP UltimateListCtrl Demo")
        panel = TestPanel(self)
        self.Show()
        wx.lib.inspection.InspectionTool().Show()
 
#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = TestFrame()
    app.MainLoop()
