]> git.saurik.com Git - wxWidgets.git/commitdiff
Restore the use of wxListCtrl in report view in wxListbook.
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 15 Aug 2012 11:34:46 +0000 (11:34 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 15 Aug 2012 11:34:46 +0000 (11:34 +0000)
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

include/wx/listbook.h
src/generic/listbkg.cpp

index 4e46af08474f9301161720fadc8246bfd5f4d27f..8d7651b4ace1f4f41afefe98425071916c384556 100644 (file)
@@ -88,6 +88,9 @@ protected:
     wxBookCtrlEvent* CreatePageChangingEvent() const;
     void MakeChangedEvent(wxBookCtrlEvent &event);
 
+    // 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);
index 88a3c4a7ffd464fc9286be8533025d914b1c0c4c..9196219b1a784a245e013b32ce4b92b9b8983ea3 100644 (file)
@@ -36,8 +36,6 @@
 #include "wx/statline.h"
 #include "wx/imaglist.h"
 
-#include "wx/sysopt.h"
-
 // ----------------------------------------------------------------------------
 // various wxWidgets macros
 // ----------------------------------------------------------------------------
@@ -99,11 +97,12 @@ wxListbook::Create(wxWindow *parent,
                     wxID_ANY,
                     wxDefaultPosition,
                     wxDefaultSize,
-                    wxLC_SINGLE_SEL |
-                    (IsVertical() ? wxLC_ALIGN_LEFT : wxLC_ALIGN_TOP) |
-                    wxLC_LIST
+                    GetListCtrlFlags()
                  );
 
+    if ( GetListView()->InReportView() )
+        GetListView()->InsertColumn(0, wxS("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
@@ -117,6 +116,46 @@ wxListbook::Create(wxWindow *parent,
     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
 // ----------------------------------------------------------------------------
@@ -224,26 +263,24 @@ bool wxListbook::SetPageImage(size_t n, int imageId)
 
 void wxListbook::SetImageList(wxImageList *imageList)
 {
+    const long flagsOld = GetListCtrlFlags();
+
+    wxBookCtrlBase::SetImageList(imageList);
+
+    const long flagsNew = GetListCtrlFlags();
+
     wxListView * const list = GetListView();
 
-    // If imageList presence has changed, we update the list control style
-    if ( (imageList != NULL) != (GetImageList() != NULL) )
+    // We may need to change the list control mode if the image list presence
+    // has changed.
+    if ( flagsNew != flagsOld )
     {
         // Preserve the selection which is lost when changing the mode
         const int oldSel = GetSelection();
 
-        // Update the style to use icon view for images, list view otherwise
-        long style = list->GetWindowStyle() & ~wxLC_MASK_TYPE;
-        if ( imageList )
-        {
-            style |= wxLC_ICON;
-        }
-        else // no image list
-        {
-            style |= wxLC_LIST;
-        }
-
-        list->SetWindowStyleFlag(style);
+        list->SetWindowStyleFlag(flagsNew);
+        if ( list->InReportView() )
+            list->InsertColumn(0, wxS("Pages"));
 
         // Restore selection
         if ( oldSel != wxNOT_FOUND )
@@ -251,8 +288,6 @@ void wxListbook::SetImageList(wxImageList *imageList)
     }
 
     list->SetImageList(imageList, wxIMAGE_LIST_NORMAL);
-
-    wxBookCtrlBase::SetImageList(imageList);
 }
 
 // ----------------------------------------------------------------------------