From: Vadim Zeitlin Date: Fri, 6 Jun 2008 23:50:21 +0000 (+0000) Subject: use report mode for the wxListbook list control if there are no images (#9484) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c17181221523cfedac96aff5769ee3a57976105c?ds=inline use report mode for the wxListbook list control if there are no images (#9484) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54001 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/interface/listbook.h b/interface/listbook.h index 55d9427045..28855b7ef3 100644 --- a/interface/listbook.h +++ b/interface/listbook.h @@ -14,6 +14,10 @@ uses a wxListCtrl to show the labels instead of the tabs. + The underlying wxListCtrl displays page labels in a one-column report view + by default. Calling wxListbook::SetImageList will implicitly switch the + control to use an icon view. + There is no documentation for this class yet but its usage is identical to wxNotebook (except for the features clearly related to tabs only), so please refer to that class documentation for now. You can also diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 2bfb0b4d09..a19f3ce07d 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -103,10 +103,11 @@ wxListbook::Create(wxWindow *parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, - wxLC_ICON | wxLC_SINGLE_SEL | - (IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) + wxLC_SINGLE_SEL | wxLC_REPORT | wxLC_NO_HEADER ); + GetListView()->InsertColumn(0, wxT("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 @@ -232,11 +233,19 @@ wxString wxListbook::GetPageText(size_t n) const return GetListView()->GetItemText(n); } -int wxListbook::GetPageImage(size_t WXUNUSED(n)) const +int wxListbook::GetPageImage(size_t n) const { - wxFAIL_MSG( _T("wxListbook::GetPageImage() not implemented") ); + wxListItem item; + item.SetId(n); - return wxNOT_FOUND; + if (GetListView()->GetItem(item)) + { + return item.GetImage(); + } + else + { + return wxNOT_FOUND; + } } bool wxListbook::SetPageImage(size_t n, int imageId) @@ -250,7 +259,55 @@ bool wxListbook::SetPageImage(size_t n, int imageId) void wxListbook::SetImageList(wxImageList *imageList) { - GetListView()->SetImageList(imageList, wxIMAGE_LIST_NORMAL); + wxListView * const list = GetListView(); + + // If imageList presence has changed, we update the list control view + if ( (imageList != NULL) != (GetImageList() != NULL) ) + { + wxArrayString labels; + labels.Alloc(GetPageCount()); + + wxArrayInt imageIds; + imageIds.Alloc(GetPageCount()); + + const int oldSel = GetSelection(); + size_t i; + + // Grab snapshot of all list control items before changing the window + // style (which deletes the items) + for ( i = 0; i < GetPageCount(); i++ ) + { + labels.Add(GetPageText(i)); + imageIds.Add(GetPageImage(i)); + } + + // Update the style to use icon view for images, report view otherwise + long style = wxLC_SINGLE_SEL; + if ( imageList ) + { + list->SetWindowStyleFlag(style | + (IsVertical() ? wxLC_ALIGN_LEFT + : wxLC_ALIGN_TOP) | + wxLC_ICON); + } + else // no image list + { + list->SetWindowStyleFlag(style | wxLC_REPORT | wxLC_NO_HEADER); + list->InsertColumn(0, wxT("Pages")); + } + + // Add back the list control items + for ( i = 0; i < GetPageCount(); i++ ) + { + list->InsertItem(i, labels[i], imageIds[i]); + } + + // Restore selection + if ( oldSel != wxNOT_FOUND ) + SetSelection(oldSel); + } + + list->SetImageList(imageList, wxIMAGE_LIST_NORMAL); wxBookCtrlBase::SetImageList(imageList); }