From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Thu, 16 Sep 2010 19:36:29 +0000 (+0000)
Subject: Allow use of report mode non-native wxListCtrl in wxListBook under Mac.
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0dc44daa338774eafd9ef9e9c31212acf07532e2

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
---

diff --git a/src/generic/listbkg.cpp b/src/generic/listbkg.cpp
index f829305777..bd48126901 100644
--- a/src/generic/listbkg.cpp
+++ b/src/generic/listbkg.cpp
@@ -36,11 +36,25 @@
 #include "wx/statline.h"
 #include "wx/imaglist.h"
 
-// FIXME: native OS X wxListCtrl hangs if this code is used for it so disable
-//        it for now
-#if !defined(__WXMAC__)
-    #define CAN_USE_REPORT_VIEW
+#include "wx/sysopt.h"
+
+namespace
+{
+
+// 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
+        return true;
+}
+
+} // anonymous namespace
 
 // ----------------------------------------------------------------------------
 // various wxWidgets macros
@@ -109,16 +123,12 @@ wxListbook::Create(wxWindow *parent,
                     wxDefaultPosition,
                     wxDefaultSize,
                     wxLC_SINGLE_SEL |
-#ifdef CAN_USE_REPORT_VIEW
-                    GetListCtrlReportViewFlags()
-#else // !CAN_USE_REPORT_VIEW
-                    GetListCtrlIconViewFlags()
-#endif // CAN_USE_REPORT_VIEW/!CAN_USE_REPORT_VIEW
+                    (CanUseReportView() ? GetListCtrlReportViewFlags()
+                                        : GetListCtrlIconViewFlags())
                  );
 
-#ifdef CAN_USE_REPORT_VIEW
-    GetListView()->InsertColumn(0, wxT("Pages"));
-#endif // CAN_USE_REPORT_VIEW
+    if ( CanUseReportView() )
+        GetListView()->InsertColumn(0, wxT("Pages"));
 
 #ifdef __WXMSW__
     // 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;
 }
 
-#ifdef CAN_USE_REPORT_VIEW
-
 long wxListbook::GetListCtrlReportViewFlags() const
 {
     return wxLC_REPORT | wxLC_NO_HEADER;
 }
 
-#endif // CAN_USE_REPORT_VIEW
-
 // ----------------------------------------------------------------------------
 // wxListbook geometry management
 // ----------------------------------------------------------------------------
@@ -258,38 +264,39 @@ bool wxListbook::SetPageImage(size_t n, int imageId)
 
 void wxListbook::SetImageList(wxImageList *imageList)
 {
-#ifdef CAN_USE_REPORT_VIEW
-    wxListView * const list = GetListView();
-
-    // If imageList presence has changed, we update the list control view
-    if ( (imageList != NULL) != (GetImageList() != NULL) )
+    if ( CanUseReportView() )
     {
-        // Preserve the selection which is lost when changing the mode
-        const int oldSel = GetSelection();
+        wxListView * const list = GetListView();
 
-        // Update the style to use icon view for images, report view otherwise
-        long style = wxLC_SINGLE_SEL;
-        if ( imageList )
+        // If imageList presence has changed, we update the list control view
+        if ( (imageList != NULL) != (GetImageList() != NULL) )
         {
-            style |= GetListCtrlIconViewFlags();
-        }
-        else // no image list
-        {
-            style |= GetListCtrlReportViewFlags();
+            // Preserve the selection which is lost when changing the mode
+            const int oldSel = GetSelection();
+
+            // Update the style to use icon view for images, report view otherwise
+            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);
-        if ( !imageList )
-            list->InsertColumn(0, wxT("Pages"));
-
-        // Restore selection
-        if ( oldSel != wxNOT_FOUND )
-           SetSelection(oldSel);
+        list->SetImageList(imageList, wxIMAGE_LIST_NORMAL);
     }
 
-    list->SetImageList(imageList, wxIMAGE_LIST_NORMAL);
-#endif // CAN_USE_REPORT_VIEW
-
     wxBookCtrlBase::SetImageList(imageList);
 }