import os import commctrl import win32ui from pywin.mfc import docview, window from pywin.tools import hierlist # directory listbox # This has obvious limitations - doesnt track subdirs, etc. Demonstrates # simple use of Python code for querying the tree as needed. # Only use strings, and lists of strings (from curdir()) class DirHierList(hierlist.HierList): def __init__(self, root, listBoxID=win32ui.IDC_LIST1): hierlist.HierList.__init__(self, root, win32ui.IDB_HIERFOLDERS, listBoxID) def GetText(self, item): return os.path.basename(item) def GetSubList(self, item): if os.path.isdir(item): ret = [os.path.join(item, fname) for fname in os.listdir(item)] else: ret = None return ret # if the item is a dir, it is expandable. def IsExpandable(self, item): return os.path.isdir(item) def GetSelectedBitmapColumn(self, item): return self.GetBitmapColumn(item) + 6 # Use different color for selection class TestDocument(docview.Document): def __init__(self, template): docview.Document.__init__(self, template) self.hierlist = hierlist.HierListWithItems( HLIFileDir("\\"), win32ui.IDB_HIERFOLDERS, win32ui.AFX_IDW_PANE_FIRST ) class HierListView(docview.TreeView): def OnInitialUpdate(self): rc = self._obj_.OnInitialUpdate() self.hierList = self.GetDocument().hierlist self.hierList.HierInit(self.GetParent()) self.hierList.SetStyle( commctrl.TVS_HASLINES | commctrl.TVS_LINESATROOT | commctrl.TVS_HASBUTTONS ) return rc class HierListFrame(window.MDIChildWnd): pass def GetTestRoot(): tree1 = ("Tree 1", [("Item 1", "Item 1 data"), "Item 2", 3]) tree2 = ("Tree 2", [("Item 2.1", "Item 2 data"), "Item 2.2", 2.3]) return ("Root", [tree1, tree2, "Item 3"]) def demoboth(): template = docview.DocTemplate( win32ui.IDR_PYTHONTYPE, TestDocument, HierListFrame, HierListView ) template.OpenDocumentFile(None).SetTitle("Hierlist demo") demomodeless() def demomodeless(): testList2 = DirHierList("\\") dlg = hierlist.HierDialog("hier list test", testList2) dlg.CreateWindow() def demodlg(): testList2 = DirHierList("\\") dlg = hierlist.HierDialog("hier list test", testList2) dlg.DoModal() def demo(): template = docview.DocTemplate( win32ui.IDR_PYTHONTYPE, TestDocument, HierListFrame, HierListView ) template.OpenDocumentFile(None).SetTitle("Hierlist demo") # # Demo/Test for HierList items. # # Easy to make a better directory program. # class HLIFileDir(hierlist.HierListItem): def __init__(self, filename): self.filename = filename hierlist.HierListItem.__init__(self) def GetText(self): try: return "%-20s %d bytes" % ( os.path.basename(self.filename), os.stat(self.filename)[6], ) except os.error as details: return "%-20s - %s" % (self.filename, details[1]) def IsExpandable(self): return os.path.isdir(self.filename) def GetSubList(self): ret = [] for newname in os.listdir(self.filename): if newname not in (".", ".."): ret.append(HLIFileDir(os.path.join(self.filename, newname))) return ret def demohli(): template = docview.DocTemplate( win32ui.IDR_PYTHONTYPE, TestDocument, hierlist.HierListFrame, hierlist.HierListView, ) template.OpenDocumentFile(None).SetTitle("Hierlist demo") if __name__ == "__main__": import demoutils if demoutils.HaveGoodGUI(): demoboth() else: demodlg()