diff --git a/include/wx/generic/private/listctrl.h b/include/wx/generic/private/listctrl.h index 0123cacc1d..f257fcd7a8 100644 --- a/include/wx/generic/private/listctrl.h +++ b/include/wx/generic/private/listctrl.h @@ -213,6 +213,21 @@ public: delete m_gi; } + // called by the owner when it toggles report view + void SetReportView(bool inReportView) + { + // we only need m_gi when we're not in report view so update as needed + if ( inReportView ) + { + delete m_gi; + m_gi = NULL; + } + else + { + m_gi = new GeometryInfo; + } + } + // are we in report mode? inline bool InReportView() const; @@ -424,6 +439,10 @@ public: virtual ~wxListMainWindow(); + // called by the main control when its mode changes + void SetReportView(bool inReportView); + + // helper to simplify testing for wxLC_XXX flags bool HasFlag(int flag) const { return m_parent->HasFlag(flag); } // return true if this is a virtual list control diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index ae17c83a8a..732241fdf4 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -1650,6 +1650,15 @@ wxListMainWindow::~wxListMainWindow() delete m_renameTimer; } +void wxListMainWindow::SetReportView(bool inReportView) +{ + const size_t count = m_lines.size(); + for ( size_t n = 0; n < count; n++ ) + { + m_lines[n].SetReportView(inReportView); + } +} + void wxListMainWindow::CacheLineData(size_t line) { wxGenericListCtrl *listctrl = GetListCtrl(); @@ -4443,12 +4452,22 @@ void wxGenericListCtrl::SetSingleStyle( long style, bool add ) void wxGenericListCtrl::SetWindowStyleFlag( long flag ) { + const bool wasInReportView = HasFlag(wxLC_REPORT); + // update the window style first so that the header is created or destroyed // corresponding to the new style wxWindow::SetWindowStyleFlag( flag ); if (m_mainWin) { + const bool inReportView = (flag & wxLC_REPORT) != 0; + if ( inReportView != wasInReportView ) + { + // we need to notify the main window about this change as it must + // update its data structures + m_mainWin->SetReportView(inReportView); + } + // m_mainWin->DeleteEverything(); wxMSW doesn't do that CreateOrDestroyHeaderWindowAsNeeded();