###################################################################### # Copyright (c) 2007, Petteri Aimonen # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # * Redistributions of source code must retain the above copyright # notice and this list of conditions. # * Redistributions in binary form must reproduce the above copyright # notice and this list of conditions in the documentation and/or other # materials provided with the distribution. '''Panel for displaying import log (and generic class for other logs)''' import wx import wx.html import events import re from dataaccess import get_importlogs def replacevisited(page, href): '''Replace all links with href with visited-colored versions''' pattern = '([^<]+)' repl = '\\1' return re.sub(pattern, repl, page) class LogHtmlWindow(wx.html.HtmlWindow): def __init__(self, *args, **kwargs): wx.html.HtmlWindow.__init__(self, *args, **kwargs) self.SetStandardFonts() self.lastlinks = [] self.currentpage = '' def SetPage(self, page): '''Set page and replace visited links''' for href in self.lastlinks: page = replacevisited(page, href) self._SetPage(page) def _SetPage(self, page, keepscroll = False): '''Set page, store to internal variable. If keepscroll is True, retain scrollbar position''' oldpos = self.GetViewStart()[1] self.currentpage = page wx.html.HtmlWindow.SetPage(self, page) if keepscroll: self.Scroll(-1, oldpos) def OnLinkClicked(self, linkinfo): '''Send NodeSelectEvent. Node userdata is in event.userdata, eg. ('animal', 1234). Link href is parsed as the tuple, splitting by ':'. Thus results in ('animal', 1234).''' self.lastlinks.append(linkinfo.GetHref()) page = replacevisited(self.currentpage, linkinfo.GetHref()) self._SetPage(page, keepscroll = True) try: level, number = linkinfo.GetHref().split(':') number = int(number) except (TypeError, ValueError): print "Invalid link href:", linkinfo.GetHref() return event = events.NodeSelectEvent() event.userdata = (level, number) wx.PostEvent(self, event) class ImportLogPanel(wx.Panel): '''Show previous import log from ImportLogger instance''' def __init__(self, *args, **kwargs): wx.Panel.__init__(self, *args, **kwargs) self.datechoice = wx.Choice(self) self.logwindow = LogHtmlWindow(self, style = wx.BORDER_SUNKEN) self.sizer = wx.BoxSizer(wx.VERTICAL) self.sizer.Add(self.datechoice, flag = wx.ALL | wx.EXPAND, border = 5) self.sizer.Add(self.logwindow, flag = wx.ALL | wx.EXPAND, border = 5, proportion = 1) self.SetAutoLayout(True) self.SetSizer(self.sizer) self.Layout() self.logs = {} self.refresh() self.datechoice.Bind(wx.EVT_CHOICE, self.render) def refresh(self, evt = None): '''Reload available logs from database and re-render''' self.logs = dict(get_importlogs()) choices = self.logs.keys() choices.sort() self.datechoice.Clear() for c in choices: self.datechoice.Append(c) # Select newest self.datechoice.SetSelection(len(choices) - 1) self.render() def render(self, evt = None): '''(Re-)render selected log''' log = self.logs[self.datechoice.GetStringSelection()] self.logwindow.SetPage(log)