Allow use of report mode non-native wxListCtrl in wxListBook under Mac.

The use of wxListBook in report mode was disabled for wxOSX in r54001 and
r54318 (see #9484) because it created problems with the native wxListCtrl
implementation but the report mode can be used if we're using the generic
wxListCtrl version so do allow to use it if the system option governing the
choice of the version to use is set to "generic".

Of course, the real fix would be to correct the bugs in the native wxListCtrl
version and use report mode always but for now this at least restores correct
behaviour with the generic version.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65559 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-09-16 19:36:29 +00:00
parent 75595b9750
commit 0dc44daa33

View File

@@ -36,11 +36,25 @@
#include "wx/statline.h" #include "wx/statline.h"
#include "wx/imaglist.h" #include "wx/imaglist.h"
// FIXME: native OS X wxListCtrl hangs if this code is used for it so disable #include "wx/sysopt.h"
// it for now
#if !defined(__WXMAC__) namespace
#define CAN_USE_REPORT_VIEW {
// FIXME: This function exists because native OS X wxListCtrl seems to have
// problems with report view, either imperfect display or reported hanging, so
// disable it for now (but it should be fixed, and this function removed).
bool CanUseReportView()
{
#if defined(__WXMAC__) && !defined(__WXUNIVERSAL__) && wxOSX_USE_CARBON
if (wxSystemOptions::GetOptionInt(wxMAC_ALWAYS_USE_GENERIC_LISTCTRL) == 0)
return false;
else
#endif #endif
return true;
}
} // anonymous namespace
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// various wxWidgets macros // various wxWidgets macros
@@ -109,16 +123,12 @@ wxListbook::Create(wxWindow *parent,
wxDefaultPosition, wxDefaultPosition,
wxDefaultSize, wxDefaultSize,
wxLC_SINGLE_SEL | wxLC_SINGLE_SEL |
#ifdef CAN_USE_REPORT_VIEW (CanUseReportView() ? GetListCtrlReportViewFlags()
GetListCtrlReportViewFlags() : GetListCtrlIconViewFlags())
#else // !CAN_USE_REPORT_VIEW
GetListCtrlIconViewFlags()
#endif // CAN_USE_REPORT_VIEW/!CAN_USE_REPORT_VIEW
); );
#ifdef CAN_USE_REPORT_VIEW if ( CanUseReportView() )
GetListView()->InsertColumn(0, wxT("Pages")); GetListView()->InsertColumn(0, wxT("Pages"));
#endif // CAN_USE_REPORT_VIEW
#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
@@ -142,15 +152,11 @@ long wxListbook::GetListCtrlIconViewFlags() const
return (IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) | wxLC_ICON; return (IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) | wxLC_ICON;
} }
#ifdef CAN_USE_REPORT_VIEW
long wxListbook::GetListCtrlReportViewFlags() const long wxListbook::GetListCtrlReportViewFlags() const
{ {
return wxLC_REPORT | wxLC_NO_HEADER; return wxLC_REPORT | wxLC_NO_HEADER;
} }
#endif // CAN_USE_REPORT_VIEW
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxListbook geometry management // wxListbook geometry management
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -258,38 +264,39 @@ bool wxListbook::SetPageImage(size_t n, int imageId)
void wxListbook::SetImageList(wxImageList *imageList) void wxListbook::SetImageList(wxImageList *imageList)
{ {
#ifdef CAN_USE_REPORT_VIEW if ( CanUseReportView() )
wxListView * const list = GetListView();
// If imageList presence has changed, we update the list control view
if ( (imageList != NULL) != (GetImageList() != NULL) )
{ {
// Preserve the selection which is lost when changing the mode wxListView * const list = GetListView();
const int oldSel = GetSelection();
// Update the style to use icon view for images, report view otherwise // If imageList presence has changed, we update the list control view
long style = wxLC_SINGLE_SEL; if ( (imageList != NULL) != (GetImageList() != NULL) )
if ( imageList )
{ {
style |= GetListCtrlIconViewFlags(); // Preserve the selection which is lost when changing the mode
} const int oldSel = GetSelection();
else // no image list
{ // Update the style to use icon view for images, report view otherwise
style |= GetListCtrlReportViewFlags(); long style = wxLC_SINGLE_SEL;
if ( imageList )
{
style |= GetListCtrlIconViewFlags();
}
else // no image list
{
style |= GetListCtrlReportViewFlags();
}
list->SetWindowStyleFlag(style);
if ( !imageList )
list->InsertColumn(0, wxT("Pages"));
// Restore selection
if ( oldSel != wxNOT_FOUND )
SetSelection(oldSel);
} }
list->SetWindowStyleFlag(style); list->SetImageList(imageList, wxIMAGE_LIST_NORMAL);
if ( !imageList )
list->InsertColumn(0, wxT("Pages"));
// Restore selection
if ( oldSel != wxNOT_FOUND )
SetSelection(oldSel);
} }
list->SetImageList(imageList, wxIMAGE_LIST_NORMAL);
#endif // CAN_USE_REPORT_VIEW
wxBookCtrlBase::SetImageList(imageList); wxBookCtrlBase::SetImageList(imageList);
} }