Behaviour problems with wx.ListCtrl.SetItemState

David Hughes dfh at forestfield.co.uk
Tue Aug 1 08:51:49 PDT 2006


Skipped content of type multipart/alternative-------------- next part -----=
---------

import  wx
import  images

#----------------------------------------------------------------------

class TestVirtualList(wx.ListCtrl):
    def __init__(self, parent, log):
        wx.ListCtrl.__init__(
            self, parent, -1, =

            style=3Dwx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES
            )

        self.log =3D log

        self.il =3D wx.ImageList(16, 16)
        self.idx1 =3D self.il.Add(images.getSmilesBitmap())
        self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)


        self.InsertColumn(0, "First")
        self.InsertColumn(1, "Second")
        self.InsertColumn(2, "Third")
        self.SetColumnWidth(0, 175)
        self.SetColumnWidth(1, 175)
        self.SetColumnWidth(2, 175)

        self.SetItemCount(1000000)

        self.attr1 =3D wx.ListItemAttr()
        self.attr1.SetBackgroundColour("yellow")

        self.attr2 =3D wx.ListItemAttr()
        self.attr2.SetBackgroundColour("light blue")

        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
        self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)


    def OnItemSelected(self, event):
        self.currentItem =3D event.m_itemIndex
        self.log.WriteText('OnItemSelected: "%s", "%s", "%s", "%s"\n' %
                           (self.currentItem,
                            self.GetItemText(self.currentItem),
                            self.getColumnText(self.currentItem, 1),
                            self.getColumnText(self.currentItem, 2)))

        # unconditional change selection from 2 to 4 =

        if self.currentItem =3D=3D 2:
            self.log.WriteText("OnItem 2 Selected: Veto'd selection\n")
            self.SetItemState(2, 0, wx.LIST_STATE_SELECTED)
            wx.CallAfter(self.SetItemState, 4, wx.LIST_STATE_SELECTED, wx.L=
IST_STATE_SELECTED)

        # conditionally change selection from  6 to 8
        if self.currentItem =3D=3D 6:
            msgbox =3D wx.MessageDialog(self, 'Select Item 8 instead?','Mes=
sage', wx.YES_NO)
            if msgbox.ShowModal() =3D=3D wx.ID_YES:
                self.log.WriteText("OnItem 6 Selected: Veto'd selection\n")
                self.SetItemState(6 , 0, wx.LIST_STATE_SELECTED)
                wx.CallAfter(self.SetItemState, 8 , wx.LIST_STATE_SELECTED,=
 wx.LIST_STATE_SELECTED)

    def OnItemActivated(self, event):
        self.currentItem =3D event.m_itemIndex
        self.log.WriteText("OnItemActivated: %s\nTopItem: %s\n" %
                           (self.GetItemText(self.currentItem), self.GetTop=
Item()))

    def getColumnText(self, index, col):
        item =3D self.GetItem(index, col)
        return item.GetText()

    def OnItemDeselected(self, evt):
        self.log.WriteText("OnItemDeselected: %s" % evt.m_itemIndex)


    #---------------------------------------------------
    # These methods are callbacks for implementing the
    # "virtualness" of the list...  Normally you would
    # determine the text, attributes and/or image based
    # on values from some external data source, but for
    # this demo we'll just calculate them
    def OnGetItemText(self, item, col):
        return "Item %d, column %d" % (item, col)

    def OnGetItemImage(self, item):
        if item % 3 =3D=3D 0:
            return self.idx1
        else:
            return -1

    def OnGetItemAttr(self, item):
        if item % 3 =3D=3D 1:
            return self.attr1
        elif item % 3 =3D=3D 2:
            return self.attr2
        else:
            return None


#----------------------------------------------------------------------

def runTest(frame, nb, log):
    win =3D TestVirtualList(nb, log)
    return win

#----------------------------------------------------------------------


overview =3D """\
This example demonstrates the ListCtrl's Virtual List features. A Virtual l=
ist
can contain any number of cells, but data is not loaded into the control it=
self.
It is loaded on demand via virtual methods <code>OnGetItemText(), OnGetItem=
Image()</code>,
and <code>OnGetItemAttr()</code>. This greatly reduces the amount of memory=
 required
without limiting what can be done with the list control itself.
"""



if __name__ =3D=3D '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])

-------------- next part --------------
#--------------------------------------------------------------------------=
--
# Name:         ListCtrl.py
# Purpose:      Testing lots of stuff, controls, window types, etc.
#
# Author:       Robin Dunn & Gary Dumer
#
# Created:
# RCS-ID:       $Id: ListCtrl.py,v 1.8.2.1 2006/01/05 22:14:20 RD Exp $
# Copyright:    (c) 1998 by Total Control Software
# Licence:      wxWindows license
#--------------------------------------------------------------------------=
--

import sys
import  wx
import  wx.lib.mixins.listctrl  as  listmix

import  images

#---------------------------------------------------------------------------

musicdata =3D {
1 : ("Bad English", "The Price Of Love", "Rock"),
2 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"),
3 : ("George Michael", "Praying For Time", "Rock"),
4 : ("Gloria Estefan", "Here We Are", "Rock"),
5 : ("Linda Ronstadt", "Don't Know Much", "Rock"),
6 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"),
7 : ("Paul Young", "Oh Girl", "Rock"),
8 : ("Paula Abdul", "Opposites Attract", "Rock"),
9 : ("Richard Marx", "Should've Known Better", "Rock"),
10: ("Rod Stewart", "Forever Young", "Rock"),
11: ("Roxette", "Dangerous", "Rock"),
12: ("Sheena Easton", "The Lover In Me", "Rock"),
13: ("Sinead O'Connor", "Nothing Compares 2 U", "Rock"),
14: ("Stevie B.", "Because I Love You", "Rock"),
15: ("Taylor Dayne", "Love Will Lead You Back", "Rock"),
16: ("The Bangles", "Eternal Flame", "Rock"),
17: ("Wilson Phillips", "Release Me", "Rock"),
18: ("Billy Joel", "Blonde Over Blue", "Rock"),
19: ("Billy Joel", "Famous Last Words", "Rock"),
20: ("Billy Joel", "Lullabye (Goodnight, My Angel)", "Rock"),
21: ("Billy Joel", "The River Of Dreams", "Rock"),
22: ("Billy Joel", "Two Thousand Years", "Rock"),
23: ("Janet Jackson", "Alright", "Rock"),
24: ("Janet Jackson", "Black Cat", "Rock"),
25: ("Janet Jackson", "Come Back To Me", "Rock"),
26: ("Janet Jackson", "Escapade", "Rock"),
27: ("Janet Jackson", "Love Will Never Do (Without You)", "Rock"),
28: ("Janet Jackson", "Miss You Much", "Rock"),
29: ("Janet Jackson", "Rhythm Nation", "Rock"),
30: ("Janet Jackson", "State Of The World", "Rock"),
31: ("Janet Jackson", "The Knowledge", "Rock"),
32: ("Spyro Gyra", "End of Romanticism", "Jazz"),
33: ("Spyro Gyra", "Heliopolis", "Jazz"),
34: ("Spyro Gyra", "Jubilee", "Jazz"),
35: ("Spyro Gyra", "Little Linda", "Jazz"),
36: ("Spyro Gyra", "Morning Dance", "Jazz"),
37: ("Spyro Gyra", "Song for Lorraine", "Jazz"),
38: ("Yes", "Owner Of A Lonely Heart", "Rock"),
39: ("Yes", "Rhythm Of Love", "Rock"),
40: ("Cusco", "Dream Catcher", "New Age"),
41: ("Cusco", "Geronimos Laughter", "New Age"),
42: ("Cusco", "Ghost Dance", "New Age"),
43: ("Blue Man Group", "Drumbone", "New Age"),
44: ("Blue Man Group", "Endless Column", "New Age"),
45: ("Blue Man Group", "Klein Mandelbrot", "New Age"),
46: ("Kenny G", "Silhouette", "Jazz"),
47: ("Sade", "Smooth Operator", "Jazz"),
48: ("David Arkenstone", "Papillon (On The Wings Of The Butterfly)", "New A=
ge"),
49: ("David Arkenstone", "Stepping Stars", "New Age"),
50: ("David Arkenstone", "Carnation Lily Lily Rose", "New Age"),
51: ("David Lanz", "Behind The Waterfall", "New Age"),
52: ("David Lanz", "Cristofori's Dream", "New Age"),
53: ("David Lanz", "Heartsounds", "New Age"),
54: ("David Lanz", "Leaves on the Seine", "New Age"),
}

#---------------------------------------------------------------------------

class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
    def __init__(self, parent, ID, pos=3Dwx.DefaultPosition,
                 size=3Dwx.DefaultSize, style=3D0):
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
        listmix.ListCtrlAutoWidthMixin.__init__(self)


class TestListCtrlPanel(wx.Panel, listmix.ColumnSorterMixin):
    def __init__(self, parent, log):
        wx.Panel.__init__(self, parent, -1, style=3Dwx.WANTS_CHARS)

        self.log =3D log
        tID =3D wx.NewId()

        self.il =3D wx.ImageList(16, 16)

        self.idx1 =3D self.il.Add(images.getSmilesBitmap())
        self.sm_up =3D self.il.Add(images.getSmallUpArrowBitmap())
        self.sm_dn =3D self.il.Add(images.getSmallDnArrowBitmap())

        self.list =3D TestListCtrl(self, tID,
                                 style=3Dwx.LC_REPORT =

                                 #| wx.BORDER_SUNKEN
                                 | wx.BORDER_NONE
                                 | wx.LC_EDIT_LABELS
                                 | wx.LC_SORT_ASCENDING
                                 #| wx.LC_NO_HEADER
                                 #| wx.LC_VRULES
                                 #| wx.LC_HRULES
                                 #| wx.LC_SINGLE_SEL
                                 )
        =

        self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)

        self.PopulateList()

        # Now that the list exists we can init the other base class,
        # see wx/lib/mixins/listctrl.py
        self.itemDataMap =3D musicdata
        listmix.ColumnSorterMixin.__init__(self, 3)
        #self.SortListItems(0, True)

        self.Bind(wx.EVT_SIZE, self.OnSize)

        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
        self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.=
list)
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.li=
st)
        self.Bind(wx.EVT_LIST_DELETE_ITEM, self.OnItemDelete, self.list)
        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list)
        self.Bind(wx.EVT_LIST_COL_RIGHT_CLICK, self.OnColRightClick, self.l=
ist)
        self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.OnColBeginDrag, self.lis=
t)
        self.Bind(wx.EVT_LIST_COL_DRAGGING, self.OnColDragging, self.list)
        self.Bind(wx.EVT_LIST_COL_END_DRAG, self.OnColEndDrag, self.list)
        self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit, self.list)

        self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
        self.list.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)

        # for wxMSW
        self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)

        # for wxGTK
        self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)


    def PopulateList(self):
        if 0:
            # for normal, simple columns, you can add them like this:
            self.list.InsertColumn(0, "Artist")
            self.list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT)
            self.list.InsertColumn(2, "Genre")
        else:
            # but since we want images on the column header we have to do i=
t the hard way:
            info =3D wx.ListItem()
            info.m_mask =3D wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIS=
T_MASK_FORMAT
            info.m_image =3D -1
            info.m_format =3D 0
            info.m_text =3D "Artist"
            self.list.InsertColumnInfo(0, info)

            info.m_format =3D wx.LIST_FORMAT_RIGHT
            info.m_text =3D "Title"
            self.list.InsertColumnInfo(1, info)

            info.m_format =3D 0
            info.m_text =3D "Genre"
            self.list.InsertColumnInfo(2, info)

        items =3D musicdata.items()
        for key, data in items:
            index =3D self.list.InsertImageStringItem(sys.maxint, data[0], =
self.idx1)
            self.list.SetStringItem(index, 1, data[1])
            self.list.SetStringItem(index, 2, data[2])
            self.list.SetItemData(index, key)

        self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(2, 100)

        # show how to select an item
        self.list.SetItemState(5, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SEL=
ECTED)

        # show how to change the colour of a couple items
        item =3D self.list.GetItem(1)
        item.SetTextColour(wx.BLUE)
        self.list.SetItem(item)
        item =3D self.list.GetItem(4)
        item.SetTextColour(wx.RED)
        self.list.SetItem(item)

        self.currentItem =3D 0


    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
    def GetListCtrl(self):
        return self.list

    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
    def GetSortImages(self):
        return (self.sm_dn, self.sm_up)


    def OnRightDown(self, event):
        x =3D event.GetX()
        y =3D event.GetY()
        self.log.WriteText("x, y =3D %s\n" % str((x, y)))
        item, flags =3D self.list.HitTest((x, y))

        if flags & wx.LIST_HITTEST_ONITEM:
            self.list.Select(item)

        event.Skip()


    def getColumnText(self, index, col):
        item =3D self.list.GetItem(index, col)
        return item.GetText()


    def OnItemSelected(self, event):
        ##print event.GetItem().GetTextColour()
        self.currentItem =3D event.m_itemIndex
        self.log.WriteText("OnItemSelected: %s, %s, %s, %s\n" %
                           (self.currentItem,
                            self.list.GetItemText(self.currentItem),
                            self.getColumnText(self.currentItem, 1),
                            self.getColumnText(self.currentItem, 2)))

        if self.currentItem =3D=3D 10:
            self.log.WriteText("OnItemSelected: Veto'd selection\n")
            #event.Veto()  # doesn't work
            # this does
            self.list.SetItemState(10, 0, wx.LIST_STATE_SELECTED)
        =

        # unconditional change selection from 2 to 4 =

        if self.currentItem =3D=3D 2:
            self.log.WriteText("OnItem 2 Selected: Veto'd selection\n")
            self.list.SetItemState(2, 0, wx.LIST_STATE_SELECTED)
            wx.CallAfter(self.list.SetItemState, 4, wx.LIST_STATE_SELECTED,=
 wx.LIST_STATE_SELECTED)

        # conditionally change selection from  6 to 8
        if self.currentItem =3D=3D 6:
            msgbox =3D wx.MessageDialog(self, 'Select Item 8 instead?','Mes=
sage', wx.YES_NO)
            if msgbox.ShowModal() =3D=3D wx.ID_YES:
                self.log.WriteText("OnItem 6 Selected: Veto'd selection\n")
                self.list.SetItemState(6 , 0, wx.LIST_STATE_SELECTED)
                wx.CallAfter(self.list.SetItemState, 8 , wx.LIST_STATE_SELE=
CTED, wx.LIST_STATE_SELECTED)

        event.Skip()


    def OnItemDeselected(self, evt):
        item =3D evt.GetItem()
        self.log.WriteText("OnItemDeselected: %d" % evt.m_itemIndex)

        # Show how to reselect something we don't want deselected
        if evt.m_itemIndex =3D=3D 11:
            wx.CallAfter(self.list.SetItemState, 11, wx.LIST_STATE_SELECTED=
, wx.LIST_STATE_SELECTED)


    def OnItemActivated(self, event):
        self.currentItem =3D event.m_itemIndex
        self.log.WriteText("OnItemActivated: %s\nTopItem: %s" %
                           (self.list.GetItemText(self.currentItem), self.l=
ist.GetTopItem()))

    def OnBeginEdit(self, event):
        self.log.WriteText("OnBeginEdit")
        event.Allow()

    def OnItemDelete(self, event):
        self.log.WriteText("OnItemDelete\n")

    def OnColClick(self, event):
        self.log.WriteText("OnColClick: %d\n" % event.GetColumn())
        event.Skip()

    def OnColRightClick(self, event):
        item =3D self.list.GetColumn(event.GetColumn())
        self.log.WriteText("OnColRightClick: %d %s\n" %
                           (event.GetColumn(), (item.GetText(), item.GetAli=
gn(),
                                                item.GetWidth(), item.GetIm=
age())))

    def OnColBeginDrag(self, event):
        self.log.WriteText("OnColBeginDrag\n")
        ## Show how to not allow a column to be resized
        #if event.GetColumn() =3D=3D 0:
        #    event.Veto()


    def OnColDragging(self, event):
        self.log.WriteText("OnColDragging\n")

    def OnColEndDrag(self, event):
        self.log.WriteText("OnColEndDrag\n")

    def OnDoubleClick(self, event):
        self.log.WriteText("OnDoubleClick item %s\n" % self.list.GetItemTex=
t(self.currentItem))
        event.Skip()

    def OnRightClick(self, event):
        self.log.WriteText("OnRightClick %s\n" % self.list.GetItemText(self=
.currentItem))

        # only do this part the first time so the events are only bound once
        if not hasattr(self, "popupID1"):
            self.popupID1 =3D wx.NewId()
            self.popupID2 =3D wx.NewId()
            self.popupID3 =3D wx.NewId()
            self.popupID4 =3D wx.NewId()
            self.popupID5 =3D wx.NewId()
            self.popupID6 =3D wx.NewId()

            self.Bind(wx.EVT_MENU, self.OnPopupOne, id=3Dself.popupID1)
            self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=3Dself.popupID2)
            self.Bind(wx.EVT_MENU, self.OnPopupThree, id=3Dself.popupID3)
            self.Bind(wx.EVT_MENU, self.OnPopupFour, id=3Dself.popupID4)
            self.Bind(wx.EVT_MENU, self.OnPopupFive, id=3Dself.popupID5)
            self.Bind(wx.EVT_MENU, self.OnPopupSix, id=3Dself.popupID6)

        # make a menu
        menu =3D wx.Menu()
        # add some items
        menu.Append(self.popupID1, "FindItem tests")
        menu.Append(self.popupID2, "Iterate Selected")
        menu.Append(self.popupID3, "ClearAll and repopulate")
        menu.Append(self.popupID4, "DeleteAllItems")
        menu.Append(self.popupID5, "GetItem")
        menu.Append(self.popupID6, "Edit")

        # Popup the menu.  If an item is selected then its handler
        # will be called before PopupMenu returns.
        self.PopupMenu(menu)
        menu.Destroy()


    def OnPopupOne(self, event):
        self.log.WriteText("Popup one\n")
        print "FindItem:", self.list.FindItem(-1, "Roxette")
        print "FindItemData:", self.list.FindItemData(-1, 11)

    def OnPopupTwo(self, event):
        self.log.WriteText("Selected items:\n")
        index =3D self.list.GetFirstSelected()

        while index !=3D -1:
            self.log.WriteText("      %s: %s\n" % (self.list.GetItemText(in=
dex), self.getColumnText(index, 1)))
            index =3D self.list.GetNextSelected(index)

    def OnPopupThree(self, event):
        self.log.WriteText("Popup three\n")
        self.list.ClearAll()
        wx.CallAfter(self.PopulateList)

    def OnPopupFour(self, event):
        self.list.DeleteAllItems()

    def OnPopupFive(self, event):
        item =3D self.list.GetItem(self.currentItem)
        print item.m_text, item.m_itemId, self.list.GetItemData(self.curren=
tItem)

    def OnPopupSix(self, event):
        self.list.EditLabel(self.currentItem)


    def OnSize(self, event):
        w,h =3D self.GetClientSizeTuple()
        self.list.SetDimensions(0, 0, w, h)



#---------------------------------------------------------------------------

def runTest(frame, nb, log):
    win =3D TestListCtrlPanel(nb, log)
    return win

#---------------------------------------------------------------------------


overview =3D """\
<html>
<body>
A list control presents lists in a number of formats: list view, report vie=
w, =

icon view and small icon view. In any case, elements are numbered from zero=
. =

For all these modes (but not for virtual list controls), the items are stor=
ed =

in the control and must be added to it using InsertItem method.

<p>To intercept events from a list control, use the event table macros desc=
ribed in =

<code>wxListEvent.</code>

<h3>Mix-ins</h3>
This example demonstrates how to use mixins. The following mixins are avail=
able.

<h4>ColumnSorterMixin</h4>

<code><b>ColumnSorterMixin(numColumns)</b></code>

<p>A mixin class that handles sorting of a wxListCtrl in REPORT mode when t=
he column =

header is clicked on.

<p>There are a few requirments needed in order for this to work genericly:
<p><ol>
    <li>The combined class must have a <code>GetListCtrl</code> method that=
 returns =

    the ListCtrl to be sorted, and the list control must exist at the time =
the =

    <code>ColumnSorterMixin.__init__()</code>method is called because it us=
es =

    <code>GetListCtrl</code>.

    <li>Items in the list control must have a unique data value set with =

    <code>list.SetItemData</code>.

    <li>The combined class must have an attribute named <code>itemDataMap</=
code>
    that is a dictionary mapping the data values to a sequence of objects =

    representing the values in each column.  These valuesare compared in =

    the column sorter to determine sort order.
</ol>

<p>Interesting methods to override are <code>GetColumnSorter</code>,
<code>GetSecondarySortValues</code>, and <code>GetSortImages</code>.

<h5>Methods</h5>
<dl>
<dt><code>SetColumnCount(newNumColumns)</code>
<dd>Informs the mixin as to the number of columns in the control. When it is
set, it also sets up an event handler for <code>EVT_LIST_COL_CLICK</code> e=
vents.

<dt><code>SortListItems(col=3D-1, ascending=3D1)</code>
<dd>Sort the list on demand.  Can also be used to set the sort column and o=
rder.

<dt><code>GetColumnWidths()</code>
<dd>Returns a list of column widths.  Can be used to help restore the curre=
nt =

view later.

<dt><code>GetSortImages()</code>
<dd>Returns a tuple of image list indexes the indexes in the image list for=
 an =

image to be put on the column header when sorting in descending order

<dt><code>GetColumnSorter()</code>
<dd>Returns a callable object to be used for comparing column values when s=
orting.

<dt><code>GetSecondarySortValues(col, key1, key2)</code>
<dd>Returns a tuple of 2 values to use for secondary sort values when the
items in the selected column match equal.  The default just returns the =

item data values.

</dl>

<h4>ListCtrlAutoWidthMixin</h4>

<code><b>ListCtrlAutoWidthMixin()</b></code>

<p>A mix-in class that automatically resizes the last column to take up the =

remaining width of the ListCtrl.

<p>This causes the ListCtrl to automatically take up the full width of the =
list, =

without either a horizontal scroll bar (unless absolutely necessary) or emp=
ty =

space to the right of the last column.

<p><b>NOTE:</b> This only works for report-style lists.

<p><b>WARNING:</b> If you override the <code>EVT_SIZE</code> event in your =
ListCtrl, =

make sure you call event.Skip() to ensure that the mixin's _OnResize method=
 is =

called.

<p>This mix-in class was written by <a href=3D'mailto:ewestra at wave.co.nz'>E=
rik Westra </a>

<h5>Methods</h5>
<dl>

<dt><code>resizeLastColumn(minWidth)</code>
<dd>Resize the last column appropriately. If the list's columns are too wid=
e 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 met=
hod is =

called automatically when the ListCtrl is resized; you can also call it you=
rself =

whenever you want the last column to be resized appropriately (eg, when add=
ing, =

removing or resizing columns).  'minWidth' is the preferred minimum width f=
or =

the last column.

</dl>


<h4>ListCtrlSelectionManagerMix</h4>

<code><b>ListCtrlSelectionManagerMix()</b></code>

<p>Mixin that defines a platform independent selection policy

<p>As selection single and multi-select list return the item index or a =

list of item indexes respectively.

<h5>Methods</h5>
<dl>

<dt><code>getPopupMenu()</code>
<dd>Override to implement dynamic menus (create)

<dt><code>setPopupMenu(menu)</code>
<dd>Must be set for default behaviour.

<dt><code>afterPopupMenu()</code>
<dd>Override to implement dynamic menus (destroy).

<dt><code>getSelection()</code>
<dd>Returns the current selection (or selections  as a Python list if exten=
ded =

selection is enabled)


</body>
</html>
"""


if __name__ =3D=3D '__main__':
    import sys,os
    import run
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])



More information about the wxpython-dev mailing list