From 947873e263cc974ec958884641a6a53d7f0e339b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 15 Aug 2012 11:34:46 +0000 Subject: [PATCH] Restore the use of wxListCtrl in report view in wxListbook. This reverts r71965 for wxMSW as the list mode there doesn't work correctly if there are sufficiently many items: the native control insists on laying them out in multiple columns which is inappropriate for wxListbook, so use report mode for horizontal wxListbooks. Do use the list mode in the vertical case as we do want to have multiple columns -- and not rows -- then. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72340 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/listbook.h | 3 ++ src/generic/listbkg.cpp | 77 ++++++++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 21 deletions(-) diff --git a/include/wx/listbook.h b/include/wx/listbook.h index 4e46af0847..8d7651b4ac 100644 --- a/include/wx/listbook.h +++ b/include/wx/listbook.h @@ -88,6 +88,9 @@ protected: wxBookCtrlEvent* CreatePageChangingEvent() const; void MakeChangedEvent(wxBookCtrlEvent &event); + // Get the correct wxListCtrl flags to use depending on our own flags. + long GetListCtrlFlags() const; + // event handlers void OnListSelected(wxListEvent& event); void OnSize(wxSizeEvent& event); diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 88a3c4a7ff..9196219b1a 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -36,8 +36,6 @@ #include "wx/statline.h" #include "wx/imaglist.h" -#include "wx/sysopt.h" - // ---------------------------------------------------------------------------- // various wxWidgets macros // ---------------------------------------------------------------------------- @@ -99,11 +97,12 @@ wxListbook::Create(wxWindow *parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, - wxLC_SINGLE_SEL | - (IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) | - wxLC_LIST + GetListCtrlFlags() ); + if ( GetListView()->InReportView() ) + GetListView()->InsertColumn(0, wxS("Pages")); + #ifdef __WXMSW__ // On XP with themes enabled the GetViewRect used in GetControllerSize() to // determine the space needed for the list view will incorrectly return @@ -117,6 +116,46 @@ wxListbook::Create(wxWindow *parent, return true; } +// ---------------------------------------------------------------------------- +// wxListCtrl flags +// ---------------------------------------------------------------------------- + +long wxListbook::GetListCtrlFlags() const +{ + // We'd like to always use wxLC_ICON mode but it doesn't work with the + // native wxListCtrl under MSW unless we do have icons for all the items, + // so we can't use it if we have no image list. In this case we'd like to + // use wxLC_LIST mode because it works correctly for both horizontally and + // vertically laid out controls, but MSW native wxListCtrl insists on + // creating multiple columns if there are too many items and there doesn't + // seem anything to do about it, so we have to use wxLC_REPORT mode in this + // case there. + + long flags = IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP; + if ( GetImageList() ) + { + flags |= wxLC_ICON; + } + else // No images. + { +#ifdef __WXMSW__ + if ( !IsVertical() ) + { + // Notice that we intentionally overwrite the alignment flags here + // by not using "|=", alignment isn't used for report view. + flags = wxLC_REPORT | wxLC_NO_HEADER; + } + else +#endif // __WXMSW__ + { + flags |= wxLC_LIST; + } + } + + // Use single selection in any case. + return flags | wxLC_SINGLE_SEL; +} + // ---------------------------------------------------------------------------- // wxListbook geometry management // ---------------------------------------------------------------------------- @@ -224,26 +263,24 @@ bool wxListbook::SetPageImage(size_t n, int imageId) void wxListbook::SetImageList(wxImageList *imageList) { + const long flagsOld = GetListCtrlFlags(); + + wxBookCtrlBase::SetImageList(imageList); + + const long flagsNew = GetListCtrlFlags(); + wxListView * const list = GetListView(); - // If imageList presence has changed, we update the list control style - if ( (imageList != NULL) != (GetImageList() != NULL) ) + // We may need to change the list control mode if the image list presence + // has changed. + if ( flagsNew != flagsOld ) { // Preserve the selection which is lost when changing the mode const int oldSel = GetSelection(); - // Update the style to use icon view for images, list view otherwise - long style = list->GetWindowStyle() & ~wxLC_MASK_TYPE; - if ( imageList ) - { - style |= wxLC_ICON; - } - else // no image list - { - style |= wxLC_LIST; - } - - list->SetWindowStyleFlag(style); + list->SetWindowStyleFlag(flagsNew); + if ( list->InReportView() ) + list->InsertColumn(0, wxS("Pages")); // Restore selection if ( oldSel != wxNOT_FOUND ) @@ -251,8 +288,6 @@ void wxListbook::SetImageList(wxImageList *imageList) } list->SetImageList(imageList, wxIMAGE_LIST_NORMAL); - - wxBookCtrlBase::SetImageList(imageList); } // ---------------------------------------------------------------------------- -- 2.45.2