]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxListCtrlAutoWidthMixin from Erik Westra.
authorRobin Dunn <robin@alldunn.com>
Mon, 1 Apr 2002 20:31:23 +0000 (20:31 +0000)
committerRobin Dunn <robin@alldunn.com>
Mon, 1 Apr 2002 20:31:23 +0000 (20:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14888 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

wxPython/CHANGES.txt
wxPython/demo/wxListCtrl.py
wxPython/wxPython/lib/mixins/listctrl.py

index 8246e66d34f1689aeca2b220ecbaa2cf3809149c..c740a60ee4a327eff1a453ead6e227bcc646cf77 100644 (file)
@@ -68,6 +68,7 @@ UNICODE!
     codecs first and then pass the unicode string to the wxPython
     method.
 
+Added wxListCtrlAutoWidthMixin from Erik Westra.
 
 
 
index b861392e54e0523d7948d5e98f543fbc00d7ae98..7e510dc04f09b0b4b262af5443b5fbb4694f003e 100644 (file)
@@ -11,7 +11,7 @@
 #----------------------------------------------------------------------------
 
 from wxPython.wx import *
-from wxPython.lib.mixins.listctrl import wxColumnSorterMixin
+from wxPython.lib.mixins.listctrl import wxColumnSorterMixin, wxListCtrlAutoWidthMixin
 
 #---------------------------------------------------------------------------
 
@@ -74,6 +74,15 @@ musicdata = {
 
 import images
 
+
+class TestListCtrl(wxListCtrl, wxListCtrlAutoWidthMixin):
+    def __init__(self, parent, ID, pos=wxDefaultPosition,
+                 size=wxDefaultSize, style=0):
+        wxListCtrl.__init__(self, parent, ID, pos, size, style)
+        wxListCtrlAutoWidthMixin.__init__(self)
+
+
+
 class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
     def __init__(self, parent, log):
         wxPanel.__init__(self, parent, -1, style=wxWANTS_CHARS)
@@ -91,7 +100,7 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
         #self.sm_up = self.il.AddIcon(wxIconFromXPMData(images.getSmallUpArrowData()))
         #self.sm_dn = self.il.AddIcon(wxIconFromXPMData(images.getSmallDnArrowData()))
 
-        self.list = wxListCtrl(self, tID,
+        self.list = TestListCtrl(self, tID,
                                style=wxLC_REPORT|wxSUNKEN_BORDER)#|wxLC_VRULES|wxLC_HRULES)
         self.list.SetImageList(self.il, wxIMAGE_LIST_SMALL)
 
@@ -99,7 +108,7 @@ class TestListCtrlPanel(wxPanel, wxColumnSorterMixin):
         self.list.SetToolTip(wxToolTip("This is a ToolTip!"))
 
         if 0:
-            # for normal simple columns, you can add them like this:
+            # for normal, simple columns, you can add them like this:
             self.list.InsertColumn(0, "Artist")
             self.list.InsertColumn(1, "Title", wxLIST_FORMAT_RIGHT)
             self.list.InsertColumn(2, "Genre")
index f215ee220f721a3f86670d00364cca97869a8bbb..dd57fc851e717c548e549a2da8fb3549fa917c7b 100644 (file)
@@ -128,9 +128,110 @@ class wxColumnSorterMixin:
 
 
 #----------------------------------------------------------------------------
+#----------------------------------------------------------------------------
+
+class wxListCtrlAutoWidthMixin:
+    """ A mix-in class that automatically resizes the last column to take up
+       the remaining width of the wxListCtrl.
+
+       This causes the wxListCtrl to automatically take up the full width of
+       the list, without either a horizontal scroll bar (unless absolutely
+       necessary) or empty space to the right of the last column.
+
+       NOTE:    This only works for report-style lists.
+
+       WARNING: If you override the EVT_SIZE event in your wxListCtrl, make
+                sure you call event.Skip() to ensure that the mixin's
+                _OnResize method is called.
+
+       This mix-in class was written by Erik Westra <ewestra@wave.co.nz>
+"""
+    def __init__(self):
+       """ Standard initialiser.
+       """
+       EVT_SIZE(self, self._onResize)
+       self._lastColMinWidth = None
+
+
+    def resizeLastColumn(self, minWidth):
+       """ Resize the last column appropriately.
+
+           If the list's columns are too wide to fit within the window, we use
+           a horizontal scrollbar.  Otherwise, we expand the right-most column
+           to take up the remaining free space in the list.
+
+           This method is called automatically when the wxListCtrl is resized;
+           you can also call it yourself whenever you want the last column to
+           be resized appropriately (eg, when adding, removing or resizing
+           columns).
+
+           'minWidth' is the preferred minimum width for the last column.
+       """
+       self.lastColMinWidth = minWidth
+       self._doResize()
+
+    # =====================
+    # == Private Methods ==
+    # =====================
 
+    def _onResize(self, event):
+       """ Respond to the wxListCtrl being resized.
 
+           We automatically resize the last column in the list.
+       """
+       self._doResize()
 
 
+    def _doResize(self):
+       """ Resize the last column as appropriate.
 
+           If the list's columns are too wide to fit within the window, we use
+           a horizontal scrollbar.  Otherwise, we expand the right-most column
+           to take up the remaining free space in the list.
 
+           We remember the current size of the last column, before resizing,
+           as the preferred minimum width if we haven't previously been given
+           or calculated a minimum width.  This ensure that repeated calls to
+           _doResize() don't cause the last column to size itself too large.
+       """
+       numCols = self.GetColumnCount()
+       if numCols == 0: return # Nothing to resize.
+
+       if self._lastColMinWidth == None:
+           self._lastColMinWidth = self.GetColumnWidth(numCols - 1)
+
+       listWidth = self.GetSize().width
+       if self.GetItemCount() > self.GetCountPerPage():
+           # We're showing the vertical scrollbar -> allow for scrollbar width
+           scrollWidth = wxSystemSettings_GetSystemMetric(wxSYS_VSCROLL_X)
+           listWidth = listWidth - scrollWidth
+
+       totColWidth = 0 # Width of all columns except last one.
+       for col in range(numCols-1):
+           totColWidth = totColWidth + self.GetColumnWidth(col)
+
+       lastColWidth = self.GetColumnWidth(numCols - 1)
+
+       margin = 6 # NOTE: This is the extra number of pixels required to make
+                  #       the wxListCtrl size correctly, at least under
+                  #       Windows 2000.  Unfortunately, different OSs and
+                  #       even different versions of the same OS may implement
+                  #       the wxListCtrl differently, so different margins may
+                  #       be needed to get the columns resized correctly.  No
+                  #       doubt the margin could be calculated in a more
+                  #       intelligent manner...
+
+       if totColWidth + self._lastColMinWidth > listWidth - margin:
+           # We haven't got the width to show the last column at its minimum
+           # width -> set it to its minimum width and allow the horizontal
+           # scrollbar to show.
+           self.SetColumnWidth(numCols-1, self._lastColMinWidth)
+           return
+
+       # Resize the last column to take up the remaining available space.
+
+       self.SetColumnWidth(numCols-1, listWidth - totColWidth - margin)
+
+
+
+#----------------------------------------------------------------------------