#!/usr/bin/python from urllib import urlopen # http://wxpython.org/ from wxPython.wx import * from wxPython.html import * import atomef,lazydom atom=lazydom.namespace('http://purl.org/atom/ns#') # Yet Another 3 Paned Aggregator class wx3pa(wxApp): # model entry=None # view tree=None list=None data=None def OnInit(self): # layout frame = wxFrame(NULL, -1, "3 Paned Aggregator Mockup-demo") split1 = wxSplitterWindow(frame,-1) split2 = wxSplitterWindow(split1,-1) # panes self.tree=wxTreeCtrl(split1,-1) self.list=wxListCtrl(split2,-1,style=wxLC_REPORT|wxSUNKEN_BORDER) self.data=wxHtmlWindow(split2,-1) # attach the panes to the frame split1.SplitVertically(self.tree, split2) split2.SplitHorizontally(self.list, self.data) self.SetTopWindow(frame) frame.Show(true) # resize split1.SetMinimumPaneSize(20) split2.SetMinimumPaneSize(20) split1.SetSashPosition(300,true) split2.SetSashPosition(200) # wire up the events EVT_TREE_SEL_CHANGED(self, self.tree.GetId(), self.selectFeed) EVT_LIST_ITEM_SELECTED(self, self.list.GetId(), self.selectItem) return true # load a list of subscriptions def load(self,subs): root = self.tree.AddRoot("Feeds") names = subs.keys() names.sort() for name in names: child=self.tree.AppendItem(root,name.encode('iso-8859-1')) self.tree.SetPyData(child,subs[name]) self.tree.Expand(root) # select a single feed and display titles from each item def selectFeed(self, event): self.list.DeleteAllItems() if not self.list.GetColumn(0): self.list.InsertColumn(0, 'Title') url = self.tree.GetPyData(event.GetItem()) self.entry=atomef.parse(urlopen(url)).find(atom.entry) for i in range(0,len(self.entry)): title=self.entry[i][atom.title] if title: row=self.list.InsertStringItem(i,title.toString()) self.list.SetItemData(row,i) self.list.SetColumnWidth(0,wxLIST_AUTOSIZE_USEHEADER) # show the html description for a single item def selectItem(self, event): item=self.entry[event.GetItem().GetData()] body=item[atom.content] or item[atom.summary] self.data.SetPage(body.toHtml()) if __name__ == '__main__': app = wx3pa(0) app.load({ 'Boing Boing':'http://new.blogger.com/pyra/temporary/atom-prototype?blogID=40471', 'Ben Trott':'http://btrott.typepad.com/typepad/atom.xml', 'Mark Pilgrim':'http://diveintomark.org/xml/atom-2003-08-05-snapshot.xml', 'Simon Fell':'http://www.pocketsoap.com/weblog/necho.xml', }) app.MainLoop()