list = self.GetListCtrl()
if not list:
raise ValueError, "No wx.ListCtrl available"
- self.Bind(wx.EVT_LIST_COL_CLICK, self.__OnColClick, list)
+ list.Bind(wx.EVT_LIST_COL_CLICK, self.__OnColClick, list)
def SetColumnCount(self, newNumColumns):
'minWidth' is the preferred minimum width for the last column.
"""
- self.resizeCloumn(self, minWidth)
+ self.resizeColumn(minWidth)
def resizeColumn(self, minWidth):
We automatically resize the last column in the list.
"""
- wx.CallAfter(self._doResize)
+ if 'gtk2' in wx.PlatformInfo:
+ self._doResize()
+ else:
+ wx.CallAfter(self._doResize)
event.Skip()
class TextEditMixin:
- """
- A mixin class that handles enables any text in any column of a
+ """
+ A mixin class that enables any text in any column of a
multi-column listctrl to be edited by clicking on the given row
and column. You close the text editor by hitting the ENTER key or
clicking somewhere else on the listctrl. You switch to the next
To use the mixin you have to include it in the class definition
and call the __init__ function::
- class TestListCtrl(wx.ListCtrl, TextEdit):
+ class TestListCtrl(wx.ListCtrl, TextEditMixin):
def __init__(self, parent, ID, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=0):
wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
- TextEdit.__init__(self)
+ TextEditMixin.__init__(self)
Authors: Steve Zatz, Pim Van Heuven (pim@think-wize.com)
"""
+
+ editorBgColour = wx.Colour(255,255,175) # Yellow
+ editorFgColour = wx.Colour(0,0,0) # black
def __init__(self):
#editor = wx.TextCtrl(self, -1, pos=(-1,-1), size=(-1,-1),
}[col_style]
editor.Create(self, -1, style=style)
- editor.SetBackgroundColour(wx.Colour(red=255,green=255,blue=175)) #Yellow
+ editor.SetBackgroundColour(self.editorBgColour)
+ editor.SetForegroundColour(self.editorFgColour)
font = self.GetFont()
editor.SetFont(font)
self.curCol = col
+ # FIXME: this function is usually called twice - second time because
+ # it is binded to wx.EVT_KILL_FOCUS. Can it be avoided? (MW)
def CloseEditor(self, evt=None):
''' Close the editor and save the new value to the ListCtrl. '''
text = self.editor.GetValue()
self.editor.Hide()
- if self.IsVirtual():
- # replace by whather you use to populate the virtual ListCtrl
- # data source
- self.SetVirtualData(self.curRow, self.curCol, text)
- else:
- self.SetStringItem(self.curRow, self.curCol, text)
+ self.SetFocus()
+
+ # post wxEVT_COMMAND_LIST_END_LABEL_EDIT
+ # Event can be vetoed. It doesn't has SetEditCanceled(), what would
+ # require passing extra argument to CloseEditor()
+ evt = wx.ListEvent(wx.wxEVT_COMMAND_LIST_END_LABEL_EDIT, self.GetId())
+ evt.m_itemIndex = self.curRow
+ evt.m_col = self.curCol
+ item = self.GetItem(self.curRow, self.curCol)
+ evt.m_item.SetId(item.GetId())
+ evt.m_item.SetColumn(item.GetColumn())
+ evt.m_item.SetData(item.GetData())
+ evt.m_item.SetText(text) #should be empty string if editor was canceled
+ ret = self.GetEventHandler().ProcessEvent(evt)
+ if not ret or evt.IsAllowed():
+ if self.IsVirtual():
+ # replace by whather you use to populate the virtual ListCtrl
+ # data source
+ self.SetVirtualData(self.curRow, self.curCol, text)
+ else:
+ self.SetStringItem(self.curRow, self.curCol, text)
self.RefreshItem(self.curRow)
def _SelectIndex(self, row):