1#!/usr/bin/env python
2
3import wx
4import wx.adv
5import os
6import sys
7import images
8import random
9
10import wx.dataview as dv
11
12from wx.lib.expando import ExpandoTextCtrl
13import wx.lib.agw.aui as AUI
14import wx.lib.agw.floatspin as FS
15
16try:
17    dirName = os.path.dirname(os.path.abspath(__file__))
18except:
19    dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
20
21sys.path.append(os.path.split(dirName)[0])
22
23try:
24    import agw.persist as PM
25except ImportError: # if it's not there locally, try the wxPython lib.
26    import wx.lib.agw.persist as PM
27
28_sampleText1 = "wx.Frame with AUI perspective, wx.MenuBar, wx.ColourDialog, " \
29               "wx.FindReplaceDialog, wx.FontDialog, wx.TextEntryDialog, " \
30               "wx.ColourPickerCtrl, wx.DirPickerCtrl, wx.FilePickerCtrl, " \
31               "AuiToolBar, wx.RadioBox, wx.ToggleButton, wx.ComboBox, " \
32               "wx.Slider, wx.SpinCtrl, FloatSpin\n\n" \
33               "PersistenceManager Style: PM.PM_DEFAULT_STYLE\n"
34
35_sampleText2 = "wx.Frame, wx.SplitterWindow, wx.TreeCtrl, wx.Notebook, " \
36               "wx.CheckListBox, wx.CheckBox, wx.SearchCtrl, wx.TextCtrl, " \
37               "wx.DatePickerCtrl, wx.Choice, AuiNotebook, wx.ListCtrl, " \
38               "TreeListCtrl, wx.HtmlListBox\n\nPersistenceManager Style: " \
39               "PM.PM_SAVE_RESTORE_TREE_LIST_SELECTIONS\n"
40
41_sampleList = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']
42_sampleList2 = _sampleList + ['nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen']
43
44_title = "PersistentControls for wxPython :-D "
45_configFile1 = os.path.join(dirName, "Example1")
46_configFile2 = os.path.join(dirName, "Example2")
47
48
49ID_AuiToolBar = wx.ID_HIGHEST + 100
50
51
52class PersistentPanel(wx.Panel):
53
54    def __init__(self, parent, log):
55
56        wx.Panel.__init__(self, parent)
57
58        mainSizer = wx.BoxSizer(wx.VERTICAL)
59        sizer = wx.FlexGridSizer(3, 2, 10, 10)
60
61        btn1 = wx.Button(self, -1, "Example 1")
62        text1 = ExpandoTextCtrl(self, -1, _sampleText1, size=(300,-1), style=wx.TE_READONLY)
63
64        btn2 = wx.Button(self, -1, "Example 2")
65        text2 = ExpandoTextCtrl(self, -1, _sampleText2, size=(300,-1), style=wx.TE_READONLY)
66
67        sizer.Add(btn1, 0, wx.ALIGN_CENTER)
68        sizer.Add(text1, 1, wx.EXPAND)
69
70        sizer.Add(btn2, 0, wx.ALIGN_CENTER)
71        sizer.Add(text2, 1, wx.EXPAND)
72
73        sizer.AddGrowableCol(1)
74        mainSizer.Add(sizer, 1, wx.EXPAND|wx.ALL, 20)
75        self.SetSizer(mainSizer)
76        mainSizer.Layout()
77
78        btn1.Bind(wx.EVT_BUTTON, self.OnExample1)
79        btn2.Bind(wx.EVT_BUTTON, self.OnExample2)
80
81
82    def OnExample1(self, event):
83
84        frame = PersistentFrame1(self, _title + "- Example 1", (700, 500))
85
86
87    def OnExample2(self, event):
88
89        frame = PersistentFrame2(self, _title + "- Example 2", (700, 500))
90
91
92class PersistentFrame1(wx.Frame):
93
94    def __init__(self, parent, title, size):
95
96        wx.Frame.__init__(self, parent, -1, title, size=size, name="Example1")
97
98        self._auiMgr = AUI.AuiManager()
99        self._auiMgr.SetManagedWindow(self)
100
101        self._persistMgr = PM.PersistenceManager.Get()
102        self._persistMgr.SetPersistenceFile(_configFile1)
103
104        self.CreateMenuBar()
105        self.CreateAuiToolBar()
106
107        self.BuildPanes()
108
109        self.SetIcon(images.Mondrian.Icon)
110        self.CenterOnParent()
111        self.Show()
112
113        self.Bind(wx.EVT_CLOSE, self.OnClose)
114        wx.CallAfter(self.RegisterControls)
115
116
117    def CreateMenuBar(self):
118
119        # Prepare the menu bar
120        menuBar = wx.MenuBar()
121        menuBar.SetName("MenuBar1")
122
123        # 1st menu from left
124        menu1 = wx.Menu()
125        menu1.Append(101, "wx.Colo&urDialog")
126        menu1.Append(102, "wx.F&ontDialog")
127        menu1.AppendSeparator()
128        menu1.Append(103, "wx.&TextEntryDialog")
129        menu1.AppendSeparator()
130        menu1.Append(105, "&Close", "Close this frame")
131        # Add menu to the menu bar
132        menuBar.Append(menu1, "&Dialogs")
133
134        menu2 = wx.Menu()
135        # Radio items
136        menu2.Append(201, "Radio 1-1", "", wx.ITEM_RADIO)
137        menu2.Append(202, "Radio 1-2", "", wx.ITEM_RADIO)
138        menu2.Append(203, "Radio 1-3", "", wx.ITEM_RADIO)
139        menu2.AppendSeparator()
140        menu2.Append(204, "Radio 2-1", "", wx.ITEM_RADIO)
141        menu2.Append(205, "Radio 2-2", "", wx.ITEM_RADIO)
142        menuBar.Append(menu2, "&Radio Items")
143
144        menu3 = wx.Menu()
145        # Check menu items
146        menu3.Append(301, "Check 1", "", wx.ITEM_CHECK)
147        menu3.Append(302, "Check 2", "", wx.ITEM_CHECK)
148        menu3.Append(303, "Check 3", "", wx.ITEM_CHECK)
149        menuBar.Append(menu3, "Chec&k Items")
150
151        self.SetMenuBar(menuBar)
152
153        self.Bind(wx.EVT_MENU_RANGE, self.OnDialogs, id=101, id2=103)
154        self.Bind(wx.EVT_MENU, self.CloseWindow, id=105)
155
156
157    def CreateAuiToolBar(self):
158
159        tb3 = AUI.AuiToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize, AUI.AUI_TB_DEFAULT_STYLE)
160        tb3.SetName("AuiToolBar")
161        tb3.SetToolBitmapSize(wx.Size(16, 16))
162
163        tb3_bmp1 = wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16, 16))
164        tb3.AddSimpleTool(ID_AuiToolBar, "Check 1", tb3_bmp1, "Check 1", AUI.ITEM_CHECK)
165        tb3.AddSimpleTool(ID_AuiToolBar+1, "Check 2", tb3_bmp1, "Check 2", AUI.ITEM_CHECK)
166        tb3.AddSimpleTool(ID_AuiToolBar+2, "Check 3", tb3_bmp1, "Check 3", AUI.ITEM_CHECK)
167        tb3.AddSimpleTool(ID_AuiToolBar+3, "Check 4", tb3_bmp1, "Check 4", AUI.ITEM_CHECK)
168        tb3.AddSeparator()
169        tb3.AddSimpleTool(ID_AuiToolBar+4, "Radio 1", tb3_bmp1, "Radio 1", AUI.ITEM_RADIO)
170        tb3.AddSimpleTool(ID_AuiToolBar+5, "Radio 2", tb3_bmp1, "Radio 2", AUI.ITEM_RADIO)
171        tb3.AddSimpleTool(ID_AuiToolBar+6, "Radio 3", tb3_bmp1, "Radio 3", AUI.ITEM_RADIO)
172        tb3.AddSeparator()
173        tb3.AddSimpleTool(ID_AuiToolBar+7, "Radio 1 (Group 2)", tb3_bmp1, "Radio 1 (Group 2)", AUI.ITEM_RADIO)
174        tb3.AddSimpleTool(ID_AuiToolBar+8, "Radio 2 (Group 2)", tb3_bmp1, "Radio 2 (Group 2)", AUI.ITEM_RADIO)
175        tb3.AddSimpleTool(ID_AuiToolBar+9, "Radio 3 (Group 2)", tb3_bmp1, "Radio 3 (Group 2)", AUI.ITEM_RADIO)
176
177        tb3.Realize()
178
179        self._auiMgr.AddPane(tb3, AUI.AuiPaneInfo().Name("tb3").Caption("AuiToolbar").ToolbarPane().Top())
180
181
182    def BuildPanes(self):
183
184        pickerPanel = wx.Panel(self)
185
186        box1 = wx.BoxSizer(wx.VERTICAL)
187        fgs = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
188
189        fgs.Add(wx.StaticText(pickerPanel, -1, "wx.ColourPickerCtrl:"), 0, wx.ALIGN_CENTER_VERTICAL)
190        cp1 = wx.ColourPickerCtrl(pickerPanel, name="ColourPicker1")
191        fgs.Add(cp1, 0, wx.ALIGN_CENTER)
192        fgs.Add(wx.StaticText(pickerPanel, -1, "        with label:"), 0, wx.ALIGN_CENTER_VERTICAL)
193        cp3 = wx.ColourPickerCtrl(pickerPanel, style=wx.CLRP_SHOW_LABEL, name="ColourPicker2")
194        fgs.Add(cp3, 0, wx.ALIGN_CENTER)
195
196        fgs.Add(wx.StaticText(pickerPanel, -1, "wx.DirPickerCtrl:"), 0, wx.ALIGN_CENTER_VERTICAL)
197        dp1 = wx.DirPickerCtrl(pickerPanel, name="DirPicker1")
198        fgs.Add(dp1, 0, wx.ALIGN_CENTER)
199
200        fgs.Add(wx.StaticText(pickerPanel, -1, "wx.FilePickerCtrl:"), 0, wx.ALIGN_CENTER_VERTICAL)
201        fp1 = wx.FilePickerCtrl(pickerPanel, name="FilePicker1")
202        fgs.Add(fp1, 0, wx.ALIGN_CENTER)
203
204        fgs.Add(wx.StaticText(pickerPanel, -1, "wx.FontPickerCtrl:"), 0, wx.ALIGN_CENTER_VERTICAL)
205        fnt1 = wx.FontPickerCtrl(pickerPanel, style=wx.FNTP_FONTDESC_AS_LABEL, name="FontPicker1")
206        fgs.Add(fnt1, 0, wx.ALIGN_CENTER)
207
208        box1.Add(fgs, 1, wx.EXPAND|wx.ALL, 5)
209        pickerPanel.SetSizer(box1)
210        box1.Layout()
211
212        otherPanel = wx.Panel(self)
213        box2 = wx.BoxSizer(wx.VERTICAL)
214
215        radiobox = wx.RadioBox(otherPanel, -1, "RadioBox", choices=_sampleList, majorDimension=2,
216                               style=wx.RA_SPECIFY_COLS, name="RadioBox1")
217        toggle = wx.ToggleButton(otherPanel, -1, "ToggleButton", name="Toggle1")
218        combo = wx.ComboBox(otherPanel, -1, choices=_sampleList, style=wx.CB_DROPDOWN|wx.CB_READONLY,
219                            name="ComboBox1")
220
221        boldFont = wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, "")
222
223        box2 = wx.BoxSizer(wx.HORIZONTAL)
224        box2.Add((0, 0), 1)
225        box2.Add(radiobox, 0, wx.ALL|wx.ALIGN_CENTER, 5)
226        box2.Add((20, 0))
227
228        sizer_1 = wx.BoxSizer(wx.VERTICAL)
229        sizer_1.Add((20, 20), 1)
230        sizer_1.Add(toggle, 0, wx.ALL, 5)
231        sizer_1.Add((0, 10))
232        label_1 = wx.StaticText(otherPanel, -1, "ComboBox")
233        label_1.SetFont(boldFont)
234        sizer_1.Add(label_1, 0, wx.ALL, 5)
235        sizer_1.Add(combo, 0, wx.LEFT|wx.RIGHT, 5)
236        sizer_1.Add((20, 20), 1)
237        box2.Add(sizer_1, 1, wx.EXPAND|wx.ALIGN_CENTER, 0)
238        box2.Add((0, 0), 1, 1)
239
240        otherPanel.SetSizer(box2)
241
242        otherPanel2 = wx.Panel(self)
243        box3 = wx.BoxSizer(wx.VERTICAL)
244
245        gs1 = wx.FlexGridSizer(2, 3, 5, 10)
246
247        slider = wx.Slider(otherPanel2, -1, 3, 0, 10, style=wx.SL_HORIZONTAL|wx.SL_LABELS,
248                           name="Slider1")
249        spinctrl = wx.SpinCtrl(otherPanel2, -1, "20", min=0, max=100, name="SpinCtrl1")
250        floatspin = FS.FloatSpin(otherPanel2, -1, value=150, min_val=20, max_val=200, name="FloatSpin1")
251        floatspin.SetDigits(2)
252
253        label_2 = wx.StaticText(otherPanel2, -1, "Slider")
254        label_2.SetFont(boldFont)
255        gs1.Add(label_2, 0, wx.ALIGN_CENTER_VERTICAL, 0)
256        label_3 = wx.StaticText(otherPanel2, -1, "SpinCtrl")
257        label_3.SetFont(boldFont)
258        gs1.Add(label_3, 0, wx.ALIGN_CENTER_VERTICAL, 0)
259        label_4 = wx.StaticText(otherPanel2, -1, "FloatSpin")
260        label_4.SetFont(boldFont)
261        gs1.Add(label_4, 0, wx.ALIGN_CENTER_VERTICAL, 0)
262        gs1.Add(slider, 0, wx.ALIGN_CENTER_VERTICAL, 0)
263        gs1.Add(spinctrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
264        gs1.Add(floatspin, 0, wx.ALIGN_CENTER_VERTICAL, 0)
265        gs1.AddGrowableCol(0)
266        gs1.AddGrowableCol(1)
267        gs1.AddGrowableCol(2)
268        box3.Add(gs1, 1, wx.EXPAND|wx.ALL, 5)
269        otherPanel2.SetSizer(box3)
270
271        self._auiMgr.AddPane(pickerPanel, AUI.AuiPaneInfo().Name("DummyPanel1").Caption("Pickers").
272                             Left().MinSize(wx.Size(300, -1)).FloatingSize(wx.Size(300, 300)))
273        self._auiMgr.AddPane(otherPanel, AUI.AuiPaneInfo().Name("DummyPanel2").CenterPane())
274        self._auiMgr.AddPane(otherPanel2, AUI.AuiPaneInfo().Name("DummyPanel3").Bottom().
275                             BestSize(wx.Size(-1, 200)).Caption("Slider & Spins").
276                             FloatingSize(wx.Size(300, 300)))
277        self._auiMgr.Update()
278
279
280    def RegisterControls(self):
281
282        self.Freeze()
283        self.Register()
284        self.Thaw()
285
286
287    def Register(self, children=None):
288
289        if children is None:
290            self._persistMgr.RegisterAndRestore(self)
291            self._persistMgr.RegisterAndRestore(self.GetMenuBar())
292            children = self.GetChildren()
293
294        for child in children:
295
296            name = child.GetName()
297
298            if name not in PM.BAD_DEFAULT_NAMES and "widget" not in name and \
299               "wxSpinButton" not in name and "auiFloating" not in name and \
300               "AuiTabCtrl" not in name and "AuiNotebook" not in name:
301                self._persistMgr.RegisterAndRestore(child)
302
303            if child.GetChildren():
304                self.Register(child.GetChildren())
305
306
307    def CloseWindow(self, event):
308
309        self.Close()
310
311
312    def OnClose(self, event):
313
314        self._persistMgr.SaveAndUnregister()
315        event.Skip()
316
317
318    def OnDialogs(self, event):
319
320        evId = event.GetId()
321
322        if evId == 101:
323            # wx.ColourDialog
324            data = wx.ColourData()
325            dlg = wx.ColourDialog(self, data)
326            dlg.SetName("ColourDialog1")
327
328        elif evId == 102:
329            # wx.FontDialog
330            data = wx.FontData()
331            dlg = wx.FontDialog(self, data)
332            dlg.SetName("FontDialog1")
333
334        elif evId == 103:
335            # wx.TextEntryDialog
336            dlg = wx.TextEntryDialog(self, 'What is your favorite programming language?',
337                                     'Eh??', 'Python')
338            dlg.SetValue("Python is the best!")
339            dlg.SetName("TextEntryDialog1")
340
341        self._persistMgr.RegisterAndRestore(dlg)
342
343        if dlg.ShowModal() == wx.ID_OK:
344            self._persistMgr.Save(dlg)
345
346        self._persistMgr.Unregister(dlg)
347        dlg.Destroy()
348
349
350# The wx.HtmlListBox derives from wx.VListBox, but draws each item
351# itself as a wx.HtmlCell.
352class MyHtmlListBox(wx.html.HtmlListBox):
353
354    def OnGetItem(self, n):
355        if n % 2 == 0:
356            return "This is item# <b>%d</b>" % n
357        else:
358            return "This is item# <b>%d</b> <br>Any <font color='RED'>HTML</font> is okay." % n
359
360
361class PersistentFrame2(wx.Frame):
362
363    def __init__(self, parent, title, size):
364
365        wx.Frame.__init__(self, parent, -1, title, size=size, name="Example2")
366
367        self._persistMgr = PM.PersistenceManager.Get()
368        self._persistMgr.SetManagerStyle(PM.PM_DEFAULT_STYLE|PM.PM_SAVE_RESTORE_TREE_LIST_SELECTIONS)
369        self._persistMgr.SetPersistenceFile(_configFile2)
370
371        self.split1 = wx.SplitterWindow(self, -1, style=wx.SP_3D|wx.SP_BORDER, name="Splitter1")
372        self.treectrl = self.CreateTreeListCtrl(False)
373
374        self.split2 = wx.SplitterWindow(self.split1, -1, style=wx.SP_3D|wx.SP_BORDER, name="Splitter2")
375        self.notebook = wx.Notebook(self.split2, name="Notebook1")
376        dummyPanel = wx.Panel(self.split2)
377
378        text = "Hello world!\nI am a simple wx.TextCtrl" \
379               "I will remember my value if you change it!"
380
381        self.checklistbox = wx.CheckListBox(dummyPanel, -1, choices=_sampleList2, name="CheckListBox1")
382        self.textctrl = wx.TextCtrl(dummyPanel, -1, text, style=wx.TE_MULTILINE, name="TextCtrl1")
383        self.searchctrl = wx.SearchCtrl(dummyPanel, -1, "", name="SearchCtrl1")
384        self.checkbox = wx.CheckBox(dummyPanel, -1, "CheckBox", name="CheckBox1")
385        self.datepickerctrl = wx.adv.DatePickerCtrl(dummyPanel, style=wx.adv.DP_DROPDOWN, name="DatePicker1")
386        self.choice = wx.Choice(dummyPanel, -1, choices=_sampleList, name="Choice1")
387
388        self.split2.SplitHorizontally(self.notebook, dummyPanel)
389        self.split1.SplitVertically(self.treectrl, self.split2)
390
391        self.DoLayout(dummyPanel)
392        self.SetIcon(images.Mondrian.Icon)
393
394        self.Bind(wx.EVT_CLOSE, self.OnClose)
395        wx.CallAfter(self.RegisterControls)
396
397        self.CenterOnParent()
398        self.Show()
399
400
401    def DoLayout(self, dummyPanel):
402
403        sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
404        sizer_6 = wx.BoxSizer(wx.VERTICAL)
405
406        self.notebook.AddPage(self.CreateNotebook(), "AuiNotebook")
407        self.notebook.AddPage(self.CreateListCtrl(), "wx.ListCtrl")
408        self.notebook.AddPage(self.CreateTreeListCtrl(True), "TreeListCtrl")
409        self.notebook.AddPage(self.CreateHtmlListBox(), "wx.HtmlListBox")
410
411        sizer_5.Add(self.checklistbox, 1, wx.EXPAND|wx.ALL, 5)
412        sizer_6.Add(self.textctrl, 1, wx.EXPAND|wx.BOTTOM, 10)
413        sizer_6.Add(self.searchctrl, 0, wx.BOTTOM, 10)
414        sizer_6.Add(self.checkbox, 0, wx.BOTTOM, 10)
415        sizer_6.Add(self.datepickerctrl, 0, wx.BOTTOM, 10)
416        sizer_6.Add(self.choice, 0, 0, 0)
417        sizer_5.Add(sizer_6, 1, wx.ALL|wx.EXPAND, 5)
418
419        dummyPanel.SetSizer(sizer_5)
420        self.Layout()
421
422
423    def CreateNotebook(self):
424
425        # create the notebook off-window to avoid flicker
426        ctrl = AUI.AuiNotebook(self.notebook, -1)
427        ctrl.SetName("AuiNotebook1")
428        page_bmp = wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16, 16))
429        ctrl.AddPage(wx.Panel(ctrl), "Page 1", False, page_bmp)
430        ctrl.AddPage(wx.TextCtrl(ctrl, -1, "Some text", wx.DefaultPosition, wx.DefaultSize,
431                                 wx.TE_MULTILINE|wx.NO_BORDER), "Page 1", False, page_bmp)
432
433        ctrl.AddPage(wx.TextCtrl(ctrl, -1, "Some more text", wx.DefaultPosition, wx.DefaultSize,
434                                 wx.TE_MULTILINE|wx.NO_BORDER), "Page 2")
435
436        ctrl.AddPage(wx.TextCtrl(ctrl, -1, "Some more text", wx.DefaultPosition, wx.DefaultSize,
437                                 wx.TE_MULTILINE|wx.NO_BORDER), "Page 3")
438
439        ctrl.AddPage(wx.TextCtrl(ctrl, -1, "Some more text", wx.DefaultPosition, wx.DefaultSize,
440                                 wx.TE_MULTILINE|wx.NO_BORDER), "Page 4")
441
442        return ctrl
443
444
445    def CreateListCtrl(self):
446
447        il = wx.ImageList(16, 16)
448        il.Add(images.Smiles.GetBitmap())
449
450        listCtrl = wx.ListCtrl(self.notebook, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER, name="ListCtrl1")
451        for col in range(6):
452            listCtrl.InsertColumn(col, "Column %d"%col)
453
454        listCtrl.AssignImageList(il, wx.IMAGE_LIST_SMALL)
455        text = "Row: %d, Col: %d"
456        for row in range(30):
457            if random.randint(0, 1):
458                idx = listCtrl.InsertItem(sys.maxsize, text%(row+1, 1), 0)
459            else:
460                idx = listCtrl.InsertItem(sys.maxsize, text%(row+1, 1))
461
462            for col in range(1, 6):
463                listCtrl.SetItem(idx, col, text%(row+1, col+1), random.randint(0, 1)-1)
464
465        return listCtrl
466
467
468    def CreateTreeListCtrl(self, isTreeList):
469
470        if isTreeList:
471            treeList = dv.TreeListCtrl(self.notebook, style=wx.TR_DEFAULT_STYLE|wx.TR_FULL_ROW_HIGHLIGHT|
472                                              wx.SUNKEN_BORDER|wx.TR_MULTIPLE, name="TreeList1")
473        else:
474            treeList = wx.TreeCtrl(self.split1, style=wx.TR_DEFAULT_STYLE|wx.SUNKEN_BORDER|wx.TR_MULTIPLE,
475                                   name="TreeCtrl1")
476
477        il = wx.ImageList(16, 16)
478        fldridx = il.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, (16, 16)))
479        smileidx = il.Add(images.Smiles.GetBitmap())
480
481        treeList.AssignImageList(il)
482
483        if isTreeList:
484            # create some columns
485            treeList.AppendColumn("Main column")
486            treeList.AppendColumn("Column 1")
487            treeList.AppendColumn("Column 2")
488            ##treeList.SetMainColumn(0) # the one with the tree in it...
489            treeList.SetColumnWidth(0, 175)
490
491        if isTreeList:
492            root = treeList.InsertItem(treeList.GetRootItem(), dv.TLI_FIRST, "The Root Item")
493        else:
494            root = treeList.AddRoot("The Root Item")
495
496        if isTreeList:
497            treeList.SetItemText(root, 1, "col 1 root")
498            treeList.SetItemText(root, 2, "col 2 root")
499
500        treeList.SetItemImage(root, fldridx)
501
502        for x in range(15):
503            txt = "Item %d" % x
504            child = treeList.AppendItem(root, txt)
505            treeList.SetItemImage(child, smileidx)
506            if isTreeList:
507                treeList.SetItemText(child, 1, txt + "(c1)")
508                treeList.SetItemText(child, 2, txt + "(c2)")
509
510            for y in range(5):
511                txt = "item %d-%s" % (x, chr(ord("a")+y))
512                last = treeList.AppendItem(child, txt)
513                treeList.SetItemImage(last, fldridx)
514                if isTreeList:
515                    treeList.SetItemText(last, 1, txt + "(c1)")
516                    treeList.SetItemText(last, 2, txt + "(c2)")
517
518                for z in range(5):
519                    txt = "item %d-%s-%d" % (x, chr(ord("a")+y), z)
520                    item = treeList.AppendItem(last,  txt)
521                    treeList.SetItemImage(item, smileidx)
522                    if isTreeList:
523                        treeList.SetItemText(item, 1, txt + "(c1)")
524                        treeList.SetItemText(item, 2, txt + "(c2)")
525
526        treeList.Expand(root)
527        return treeList
528
529
530    def CreateHtmlListBox(self):
531
532        hlb = MyHtmlListBox(self.notebook, -1, style=wx.BORDER_SUNKEN|wx.LB_MULTIPLE, name="HtmlListBox1")
533        hlb.SetItemCount(300)
534        hlb.SetSelection(0)
535
536        return hlb
537
538
539    def OnClose(self, event):
540
541        self._persistMgr.SaveAndUnregister()
542        event.Skip()
543
544
545    def RegisterControls(self):
546
547        self.Freeze()
548        self.Register()
549        self.Thaw()
550
551
552    def Register(self, children=None):
553
554        if children is None:
555            self._persistMgr.RegisterAndRestore(self)
556            children = self.GetChildren()
557
558        for child in children:
559
560            name = child.GetName()
561
562            if name not in PM.BAD_DEFAULT_NAMES and "wxtreelist" not in name and \
563               "AuiTabCtrl" not in name:
564                self._persistMgr.RegisterAndRestore(child)
565
566            if child.GetChildren():
567                self.Register(child.GetChildren())
568
569
570#----------------------------------------------------------------------
571
572def runTest(frame, nb, log):
573
574    win = PersistentPanel(nb, log)
575    return win
576
577#----------------------------------------------------------------------
578
579overview = PM.__doc__
580
581if __name__ == '__main__':
582    import sys,os
583    import run
584    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
585