306 self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchMessageChanged, self.SearchMessage) |
306 self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchMessageChanged, self.SearchMessage) |
307 self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, |
307 self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, |
308 self.OnSearchMessageSearchButtonClick, self.SearchMessage) |
308 self.OnSearchMessageSearchButtonClick, self.SearchMessage) |
309 self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, |
309 self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN, |
310 self.OnSearchMessageCancelButtonClick, self.SearchMessage) |
310 self.OnSearchMessageCancelButtonClick, self.SearchMessage) |
311 filter_sizer.AddWindow(self.SearchMessage, 3, flag=wx.GROW) |
311 filter_sizer.AddWindow(self.SearchMessage, 3, border=5, flag=wx.RIGHT|wx.GROW) |
|
312 |
|
313 self.CleanButton = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap("Clean"), |
|
314 size=wx.Size(28, 28), style=wx.NO_BORDER) |
|
315 self.CleanButton.SetToolTipString(_("Clean log messages")) |
|
316 self.Bind(wx.EVT_BUTTON, self.OnCleanButton, self.CleanButton) |
|
317 filter_sizer.AddWindow(self.CleanButton) |
312 |
318 |
313 message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) |
319 message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0) |
314 message_panel_sizer.AddGrowableCol(0) |
320 message_panel_sizer.AddGrowableCol(0) |
315 message_panel_sizer.AddGrowableRow(0) |
321 message_panel_sizer.AddGrowableRow(0) |
316 main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW) |
322 main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW) |
377 self.CurrentMessage = None |
383 self.CurrentMessage = None |
378 self.HasNewData = False |
384 self.HasNewData = False |
379 |
385 |
380 def SetLogSource(self, log_source): |
386 def SetLogSource(self, log_source): |
381 self.LogSource = log_source |
387 self.LogSource = log_source |
|
388 self.CleanButton.Enable(self.LogSource is not None) |
382 if log_source is not None: |
389 if log_source is not None: |
383 self.ResetLogMessages() |
390 self.ResetLogMessages() |
384 self.RefreshView() |
391 self.RefreshView() |
385 |
392 |
386 def GetLogMessageFromSource(self, msgidx, level): |
393 def GetLogMessageFromSource(self, msgidx, level): |
394 def SetLogCounters(self, log_count): |
401 def SetLogCounters(self, log_count): |
395 new_messages = [] |
402 new_messages = [] |
396 for level, count, prev in zip(xrange(LogLevelsCount), log_count, self.previous_log_count): |
403 for level, count, prev in zip(xrange(LogLevelsCount), log_count, self.previous_log_count): |
397 if count is not None and prev != count: |
404 if count is not None and prev != count: |
398 if prev is None: |
405 if prev is None: |
399 dump_end = count - 1 |
406 dump_end = -1 |
400 else: |
407 else: |
401 dump_end = prev - 1 |
408 dump_end = prev - 1 |
402 for msgidx in xrange(count-1, dump_end,-1): |
409 for msgidx in xrange(count-1, dump_end,-1): |
403 new_message = self.GetLogMessageFromSource(msgidx, level) |
410 new_message = self.GetLogMessageFromSource(msgidx, level) |
404 if new_message is not None: |
411 if new_message is None: |
405 if prev is None: |
412 break |
406 self.OldestMessages.append((msgidx, new_message)) |
413 if prev is None: |
407 if len(new_messages) == 0 or new_message > new_messages[0]: |
414 self.OldestMessages.append((msgidx, new_message)) |
408 new_messages = [new_message] |
415 if len(new_messages) == 0: |
|
416 new_messages = [new_message] |
409 else: |
417 else: |
410 new_messages.insert(0, new_message) |
418 new_messages.insert(0, new_message) |
|
419 else: |
|
420 new_messages.insert(0, new_message) |
411 if prev is None and len(self.OldestMessages) <= level: |
421 if prev is None and len(self.OldestMessages) <= level: |
412 self.OldestMessages.append((-1, None)) |
422 self.OldestMessages.append((-1, None)) |
413 self.previous_log_count[level] = count |
423 self.previous_log_count[level] = count |
414 new_messages.sort() |
424 new_messages.sort() |
415 if len(new_messages) > 0: |
425 if len(new_messages) > 0: |
606 self.CurrentSearchValue = "" |
616 self.CurrentSearchValue = "" |
607 self.SearchMessage.SetValue("") |
617 self.SearchMessage.SetValue("") |
608 self.ResetMessagePanel() |
618 self.ResetMessagePanel() |
609 event.Skip() |
619 event.Skip() |
610 |
620 |
|
621 def OnCleanButton(self, event): |
|
622 if self.LogSource is not None: |
|
623 self.LogSource.ResetLogCount() |
|
624 self.ResetLogMessages() |
|
625 self.RefreshView() |
|
626 event.Skip() |
|
627 |
611 def GenerateOnDurationButton(self, duration): |
628 def GenerateOnDurationButton(self, duration): |
612 def OnDurationButton(): |
629 def OnDurationButton(): |
613 self.ScrollMessagePanelByTimestamp(duration) |
630 self.ScrollMessagePanelByTimestamp(duration) |
614 return OnDurationButton |
631 return OnDurationButton |
615 |
632 |