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
This commit is contained in:
Vadim Zeitlin
2012-08-15 11:34:46 +00:00
parent 524a2c6e51
commit 947873e263
2 changed files with 59 additions and 21 deletions

View File

@@ -88,6 +88,9 @@ protected:
wxBookCtrlEvent* CreatePageChangingEvent() const; wxBookCtrlEvent* CreatePageChangingEvent() const;
void MakeChangedEvent(wxBookCtrlEvent &event); void MakeChangedEvent(wxBookCtrlEvent &event);
// Get the correct wxListCtrl flags to use depending on our own flags.
long GetListCtrlFlags() const;
// event handlers // event handlers
void OnListSelected(wxListEvent& event); void OnListSelected(wxListEvent& event);
void OnSize(wxSizeEvent& event); void OnSize(wxSizeEvent& event);

View File

@@ -36,8 +36,6 @@
#include "wx/statline.h" #include "wx/statline.h"
#include "wx/imaglist.h" #include "wx/imaglist.h"
#include "wx/sysopt.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// various wxWidgets macros // various wxWidgets macros
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -99,11 +97,12 @@ wxListbook::Create(wxWindow *parent,
wxID_ANY, wxID_ANY,
wxDefaultPosition, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
wxLC_SINGLE_SEL | GetListCtrlFlags()
(IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) |
wxLC_LIST
); );
if ( GetListView()->InReportView() )
GetListView()->InsertColumn(0, wxS("Pages"));
#ifdef __WXMSW__ #ifdef __WXMSW__
// On XP with themes enabled the GetViewRect used in GetControllerSize() to // On XP with themes enabled the GetViewRect used in GetControllerSize() to
// determine the space needed for the list view will incorrectly return // determine the space needed for the list view will incorrectly return
@@ -117,6 +116,46 @@ wxListbook::Create(wxWindow *parent,
return true; 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 // wxListbook geometry management
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -224,26 +263,24 @@ bool wxListbook::SetPageImage(size_t n, int imageId)
void wxListbook::SetImageList(wxImageList *imageList) void wxListbook::SetImageList(wxImageList *imageList)
{ {
const long flagsOld = GetListCtrlFlags();
wxBookCtrlBase::SetImageList(imageList);
const long flagsNew = GetListCtrlFlags();
wxListView * const list = GetListView(); wxListView * const list = GetListView();
// If imageList presence has changed, we update the list control style // We may need to change the list control mode if the image list presence
if ( (imageList != NULL) != (GetImageList() != NULL) ) // has changed.
if ( flagsNew != flagsOld )
{ {
// Preserve the selection which is lost when changing the mode // Preserve the selection which is lost when changing the mode
const int oldSel = GetSelection(); const int oldSel = GetSelection();
// Update the style to use icon view for images, list view otherwise list->SetWindowStyleFlag(flagsNew);
long style = list->GetWindowStyle() & ~wxLC_MASK_TYPE; if ( list->InReportView() )
if ( imageList ) list->InsertColumn(0, wxS("Pages"));
{
style |= wxLC_ICON;
}
else // no image list
{
style |= wxLC_LIST;
}
list->SetWindowStyleFlag(style);
// Restore selection // Restore selection
if ( oldSel != wxNOT_FOUND ) if ( oldSel != wxNOT_FOUND )
@@ -251,8 +288,6 @@ void wxListbook::SetImageList(wxImageList *imageList)
} }
list->SetImageList(imageList, wxIMAGE_LIST_NORMAL); list->SetImageList(imageList, wxIMAGE_LIST_NORMAL);
wxBookCtrlBase::SetImageList(imageList);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------