MGR: In Event Log, work around a wxWidgets 3.0 bug in wxGenericListCtrl (Linux only) which causes headers to be misaligned after horizontal scrolling.

This commit is contained in:
Charlie Fenton 2015-10-06 06:34:16 -07:00
parent edfa2bf428
commit 72fa38391b
3 changed files with 73 additions and 4 deletions

View File

@ -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;

View File

@ -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
}

View File

@ -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