diff --git a/include/wx/listbook.h b/include/wx/listbook.h index 5edfc0c6a8..4a4d7a660f 100644 --- a/include/wx/listbook.h +++ b/include/wx/listbook.h @@ -73,7 +73,6 @@ public: virtual int SetSelection(size_t n) wxOVERRIDE { return DoSetSelection(n, SetSelection_SendEvent); } virtual int ChangeSelection(size_t n) wxOVERRIDE { return DoSetSelection(n); } virtual int HitTest(const wxPoint& pt, long *flags = NULL) const wxOVERRIDE; - virtual void SetImageList(wxImageList *imageList) wxOVERRIDE; virtual bool DeleteAllPages() wxOVERRIDE; @@ -82,14 +81,13 @@ public: protected: virtual wxWindow *DoRemovePage(size_t page) wxOVERRIDE; + virtual void OnImagesChanged() wxOVERRIDE; + void UpdateSelectedPage(size_t newsel) wxOVERRIDE; wxBookCtrlEvent* CreatePageChangingEvent() const wxOVERRIDE; void MakeChangedEvent(wxBookCtrlEvent &event) wxOVERRIDE; - // 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); @@ -98,6 +96,12 @@ private: // this should be called when we need to be relaid out void UpdateSize(); + // Get the correct wxListCtrl flags to use depending on our own flags. + long GetListCtrlFlags(bool hasImages) const; + + // Update list control wxLC_ICON flag depending on whether we have images. + void SyncListCtrlIconFlag(bool hasImages); + wxDECLARE_EVENT_TABLE(); wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxListbook); diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp index 19b3ae1fb8..969ec429dd 100644 --- a/src/generic/listbkg.cpp +++ b/src/generic/listbkg.cpp @@ -86,7 +86,7 @@ wxListbook::Create(wxWindow *parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, - GetListCtrlFlags() + GetListCtrlFlags(HasImages()) ); if ( GetListView()->InReportView() ) @@ -103,7 +103,7 @@ wxListbook::Create(wxWindow *parent, // wxListCtrl flags // ---------------------------------------------------------------------------- -long wxListbook::GetListCtrlFlags() const +long wxListbook::GetListCtrlFlags(bool hasImages) 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, @@ -115,7 +115,7 @@ long wxListbook::GetListCtrlFlags() const // case there. long flags = IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP; - if ( GetImageList() ) + if ( hasImages ) { flags |= wxLC_ICON; } @@ -252,27 +252,24 @@ bool wxListbook::SetPageImage(size_t n, int imageId) } // ---------------------------------------------------------------------------- -// image list stuff +// images support // ---------------------------------------------------------------------------- -void wxListbook::SetImageList(wxImageList *imageList) +void wxListbook::OnImagesChanged() { - const long flagsOld = GetListCtrlFlags(); - - wxBookCtrlBase::SetImageList(imageList); - - const long flagsNew = GetListCtrlFlags(); - wxListView * const list = GetListView(); // We may need to change the list control mode if the image list presence // has changed. - if ( flagsNew != flagsOld ) + const bool hasImages = HasImages(); + if ( list->HasFlag(wxLC_ICON) != hasImages ) { // Preserve the selection which is lost when changing the mode const int oldSel = GetSelection(); - list->SetWindowStyleFlag(flagsNew); + // Note that we can't just ToggleWindowStyle(wxLC_ICON) here because we + // may also need to turn off wxLC_REPORT under MSW. + list->SetWindowStyleFlag(GetListCtrlFlags(hasImages)); if ( list->InReportView() ) list->InsertColumn(0, wxS("Pages")); @@ -281,7 +278,12 @@ void wxListbook::SetImageList(wxImageList *imageList) SetSelection(oldSel); } - list->SetImageList(imageList, wxIMAGE_LIST_NORMAL); + // We also need to propagate the actual images to use to the list control. + const Images& images = GetImages(); + if ( !images.empty() ) + list->SetNormalImages(images); + else + list->SetImageList(GetImageList(), wxIMAGE_LIST_NORMAL); } // ----------------------------------------------------------------------------