From 72fa38391b172677fd88d07dbb3f3f72021aebed Mon Sep 17 00:00:00 2001 From: Charlie Fenton Date: Tue, 6 Oct 2015 06:34:16 -0700 Subject: [PATCH] MGR: In Event Log, work around a wxWidgets 3.0 bug in wxGenericListCtrl (Linux only) which causes headers to be misaligned after horizontal scrolling. --- clientgui/DlgEventLog.cpp | 11 ++++++++- clientgui/DlgEventLogListCtrl.cpp | 39 +++++++++++++++++++++++++++++-- clientgui/DlgEventLogListCtrl.h | 27 ++++++++++++++++++++- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/clientgui/DlgEventLog.cpp b/clientgui/DlgEventLog.cpp index a186bc0c5b..fb63e3d7fe 100644 --- a/clientgui/DlgEventLog.cpp +++ b/clientgui/DlgEventLog.cpp @@ -99,13 +99,22 @@ CDlgEventLog::CDlgEventLog( wxWindow* parent, wxWindowID id, const wxString& cap Create(parent, id, caption, pos, size, style); +#ifdef __WXGTK__ + m_pList->SaveEventHandler((m_pList->GetMainWin())->GetEventHandler()); + (m_pList->GetMainWin())->PushEventHandler(new MyEvtLogEvtHandler(m_pList)); +#endif + wxLogTrace(wxT("Function Start/End"), wxT("CDlgEventLog::CDlgEventLog - Constructor Function End")); } CDlgEventLog::~CDlgEventLog() { wxLogTrace(wxT("Function Start/End"), wxT("CDlgEventLog::CDlgEventLog - Destructor Function Begin")); - + +#ifdef __WXGTK__ + m_pList->PopEventHandler(true); +#endif + if (m_pMessageInfoAttr) { delete m_pMessageInfoAttr; m_pMessageInfoAttr = NULL; diff --git a/clientgui/DlgEventLogListCtrl.cpp b/clientgui/DlgEventLogListCtrl.cpp index 1efa746943..d5a7d83f33 100644 --- a/clientgui/DlgEventLogListCtrl.cpp +++ b/clientgui/DlgEventLogListCtrl.cpp @@ -32,6 +32,42 @@ #include "DlgEventLogListCtrl.h" #include "DlgEventLog.h" +#ifdef __WXGTK__ +IMPLEMENT_DYNAMIC_CLASS(MyEvtLogEvtHandler, wxEvtHandler) + +BEGIN_EVENT_TABLE(MyEvtLogEvtHandler, wxEvtHandler) + EVT_PAINT(MyEvtLogEvtHandler::OnPaint) +END_EVENT_TABLE() + +MyEvtLogEvtHandler::MyEvtLogEvtHandler() {} + +MyEvtLogEvtHandler::MyEvtLogEvtHandler(wxGenericListCtrl *theListControl) { + m_listCtrl = theListControl; + m_view_startX = 0; +} + +void MyEvtLogEvtHandler::OnPaint(wxPaintEvent & event) +{ + if (m_listCtrl) { + // Work around a wxWidgets 3.0 bug in wxGenericListCtrl (Linux + // only) which causes headers to be misaligned after horizontal + // scrolling due to wxListHeaderWindow::OnPaint() calling + // parent->GetViewStart() before the parent window has been + // scrolled to the new position. + int view_startX; + ((CDlgEventLogListCtrl*)m_listCtrl)->savedHandler->ProcessEvent(event); + m_listCtrl->GetViewStart( &view_startX, NULL ); + if (view_startX != m_view_startX) { + m_view_startX = view_startX; + ((wxWindow *)m_listCtrl->m_headerWin)->Refresh(); + ((wxWindow *)m_listCtrl->m_headerWin)->Update(); + } + } else { + event.Skip(); + } +} +#endif + IMPLEMENT_DYNAMIC_CLASS(CDlgEventLogListCtrl, DLG_LISTCTRL_BASE) @@ -40,6 +76,7 @@ BEGIN_EVENT_TABLE(CDlgEventLogListCtrl, DLG_LISTCTRL_BASE) #ifdef __WXMAC__ EVT_SIZE(CDlgEventLogListCtrl::OnSize) #endif + END_EVENT_TABLE() @@ -55,10 +92,8 @@ CDlgEventLogListCtrl::CDlgEventLogListCtrl(CDlgEventLog* pView, wxWindowID iList #ifdef __WXMAC__ m_fauxHeaderView = NULL; m_fauxBodyView = NULL; -#ifdef __WXMAC__ SetupMacAccessibilitySupport(); #endif -#endif } diff --git a/clientgui/DlgEventLogListCtrl.h b/clientgui/DlgEventLogListCtrl.h index 1ce6978272..79652e5e8c 100644 --- a/clientgui/DlgEventLogListCtrl.h +++ b/clientgui/DlgEventLogListCtrl.h @@ -22,7 +22,7 @@ #pragma interface "DlgEventLogListCtrl.cpp" #endif -#ifdef __WXMAC__ +#if (defined(__WXMAC__) || defined(__WXGTK__)) #define DLG_LISTCTRL_BASE wxGenericListCtrl #else #define DLG_LISTCTRL_BASE wxListView @@ -46,6 +46,12 @@ public: ~CDlgEventLogListCtrl(); #endif +#ifdef __WXGTK__ + void SaveEventHandler(wxEvtHandler *stdHandler) { savedHandler = stdHandler; } + wxEvtHandler* savedHandler; + wxScrolledWindow* GetMainWin(void) { return (wxScrolledWindow*) m_mainWin; } +#endif + private: virtual wxString OnGetItemText(long item, long column) const; @@ -70,4 +76,23 @@ private: #endif }; +#ifdef __WXGTK__ +// Define a custom event handler +class MyEvtLogEvtHandler : public wxEvtHandler +{ + DECLARE_DYNAMIC_CLASS(MyEvtLogEvtHandler) + +public: + MyEvtLogEvtHandler(); + MyEvtLogEvtHandler(wxGenericListCtrl *theListControl); + void OnPaint(wxPaintEvent & event); + +private: + wxGenericListCtrl * m_listCtrl; + int m_view_startX; + + DECLARE_EVENT_TABLE() +}; +#endif + #endif