def __init__(self, project, list_view, app_frame, tree_node): TreeItemData.__init__(self, list_view) self.project = project self.rows = {} self.last_row_id = None self.project_id = project.get_id() self.app_frame = app_frame self.where_clause = None self.__row_cnt__ = None self.tree = app_frame.tree self.unread_count = 0 self.name = project.name self.tree_node = tree_node #~ self.filter_expression = TrueExpression() expressions = [x.filter_expression for x in project.filters] self.filter_expression = NorExpression(expressions) self.where_clause = self.filter_expression.get_where(project.log_entries_table)
class ProjectTreeItemData(TreeItemData): CNT_READ_AHEAD = 100 ROW_BUFFER_SIZE = 3 * CNT_READ_AHEAD def __init__(self, project, list_view, app_frame, tree_node): TreeItemData.__init__(self, list_view) self.project = project self.rows = {} self.last_row_id = None self.project_id = project.get_id() self.app_frame = app_frame self.where_clause = None self.__row_cnt__ = None self.tree = app_frame.tree self.unread_count = 0 self.name = project.name self.tree_node = tree_node #~ self.filter_expression = TrueExpression() expressions = [x.filter_expression for x in project.filters] self.filter_expression = NorExpression(expressions) self.where_clause = self.filter_expression.get_where(project.log_entries_table) def OnSelChanged(self, event): log.debug("ProjectTreeItemData.OnSelChanged()") self.MarkAsRead() row_count = self.project.get_row_count(self.where_clause) log.debug("row_count: %s" % row_count) self.app_frame.sb.SetStatus('row_cnt', "Rows: %s" % row_count, True) self.__row_cnt__ = int(row_count) self.rows = {} self.list_view.SaveColumnWidthDict() self.list_view.SetColumns(self.project.parameters) self.list_view.SetItemCount(row_count) self.list_view.OnGetItemTextCallback = self self.list_view.Refresh() self.list_view.MoveLast() def OnGetItemText(self, item, col): #~ if col == 0: #~ log.debug("ProjectTreeItemData.OnGetItemText(%s, %s)" % (item, col)) if not self.last_row_id: going_up = False elif self.last_row_id < item: going_up = False elif self.last_row_id > item: going_up = True else: going_up = False self.last_row_id = item if not item in self.rows: log.debug("ProjectTreeItemData.OnGetItemText(%s, %s)" % (item, col)) if len(self.rows) + ProjectTreeItemData.CNT_READ_AHEAD > ProjectTreeItemData.ROW_BUFFER_SIZE: self.__shrink_buffer__(going_up, item) if going_up: log.debug("going up") offset = item - ProjectTreeItemData.CNT_READ_AHEAD + 1 else: offset = item for index, new_row in enumerate(self.project.get_next(offset, ProjectTreeItemData.CNT_READ_AHEAD, self.where_clause)): #~ log.debug("new_row: %s" % new_row) self.rows[offset + index] = new_row log.debug("size of row buffer: %s" % len(self.rows)) return self.rows[item][col] def __shrink_buffer__(self, going_up, item): log.debug("shrinking buffer") new_buffer = {} for key, value in self.rows.iteritems(): if going_up and key <= item + ProjectTreeItemData.ROW_BUFFER_SIZE: new_buffer[key] = value elif not going_up and key >= item - ProjectTreeItemData.ROW_BUFFER_SIZE: new_buffer[key] = value self.rows = new_buffer log.debug("buffer: %s, len: %s" % (sorted(self.rows.keys()), len(self.rows))) def IncomingMessage(self, msg): item_index = self.list_view.GetItemCount() self.__row_cnt__ += 1 self.app_frame.sb.SetStatus('row_cnt', "Rows: %s" % self.__row_cnt__, True) log_repeat.debug("self.__row_cnt__: %s" % self.__row_cnt__) if len(self.rows) + 1 > ProjectTreeItemData.ROW_BUFFER_SIZE: self.__shrink_buffer__(False, item_index + ProjectTreeItemData.CNT_READ_AHEAD) log_repeat.debug("appending %s to list at %s" % (str(msg), item_index)) self.rows[item_index] = msg self.list_view.SetItemCount(item_index + 1) #~ self.list_view.Refresh() if self.app_frame.auto_scroll: self.list_view.MoveLast() log_repeat.debug("IncomingMessage,size of row buffer: %s" % len(self.rows)) def MarkAsUnRead(self): #~ log.debug("MarkAsUnRead(%s)" % self.name) self.unread_count += 1 self.tree.SetItemText(self.tree_node, "%s (%s)" % (self.name, self.unread_count)) self.tree.SetItemBold(self.tree_node, True) def MarkAsRead(self): self.unread_count = 0 self.tree.SetItemText(self.tree_node, self.name) self.tree.SetItemBold(self.tree_node, False)