#----------------------------------------------------------------------------
from wxPython.wx import *
-from wxPython.lib.mixins.listctrl import wxColumnSorterMixin
+from wxPython.lib.mixins.listctrl import wxColumnSorterMixin, wxListCtrlAutoWidthMixin
#---------------------------------------------------------------------------
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)
#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)
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")
#----------------------------------------------------------------------------
+#----------------------------------------------------------------------------
+
+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)
+
+
+
+#----------------------------------------------------------------------------