1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: More control (widget) classes for wxPython
9 // Copyright: (c) 1998 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
20 #include <wx/listctrl.h>
21 #include <wx/treectrl.h>
22 #include <wx/imaglist.h>
25 //----------------------------------------------------------------------
28 %include my_typemaps.i
30 // Import some definitions of other classes, etc.
38 %pragma(python) code = "import wx"
40 //----------------------------------------------------------------------
50 wxLIST_STATE_DONTCARE,
51 wxLIST_STATE_DROPHILITED,
53 wxLIST_STATE_SELECTED,
57 wxLIST_HITTEST_NOWHERE,
58 wxLIST_HITTEST_ONITEMICON,
59 wxLIST_HITTEST_ONITEMLABEL,
60 wxLIST_HITTEST_ONITEMRIGHT,
61 wxLIST_HITTEST_ONITEMSTATEICON,
62 wxLIST_HITTEST_TOLEFT,
63 wxLIST_HITTEST_TORIGHT,
64 wxLIST_HITTEST_ONITEM,
73 wxLIST_ALIGN_SNAP_TO_GRID,
75 wxLIST_AUTOSIZE_USEHEADER,
86 enum wxListColumnFormat
91 wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE
96 /* List control event types */
97 wxEVT_COMMAND_LIST_BEGIN_DRAG,
98 wxEVT_COMMAND_LIST_BEGIN_RDRAG,
99 wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT,
100 wxEVT_COMMAND_LIST_END_LABEL_EDIT,
101 wxEVT_COMMAND_LIST_DELETE_ITEM,
102 wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS,
103 wxEVT_COMMAND_LIST_GET_INFO,
104 wxEVT_COMMAND_LIST_SET_INFO,
105 wxEVT_COMMAND_LIST_ITEM_SELECTED,
106 wxEVT_COMMAND_LIST_ITEM_DESELECTED,
107 wxEVT_COMMAND_LIST_KEY_DOWN,
108 wxEVT_COMMAND_LIST_INSERT_ITEM,
109 wxEVT_COMMAND_LIST_COL_CLICK,
110 wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
111 wxEVT_COMMAND_LIST_ITEM_RIGHT_CLICK,
112 wxEVT_COMMAND_LIST_ITEM_MIDDLE_CLICK,
130 wxLC_SORT_DESCENDING,
146 //wxListItemAttr(const wxColour& colText,
147 // const wxColour& colBack,
148 // const wxFont& font)
149 // : m_colText(colText), m_colBack(colBack), m_font(font) { }
152 void SetTextColour(const wxColour& colText);
153 void SetBackgroundColour(const wxColour& colBack);
154 void SetFont(const wxFont& font);
157 bool HasTextColour();
158 bool HasBackgroundColour();
161 const wxColour& GetTextColour();
162 const wxColour& GetBackgroundColour();
163 const wxFont& GetFont();
167 class wxListItem : public wxObject {
174 void ClearAttributes();
177 void SetMask(long mask);
179 void SetColumn(int col);
180 void SetState(long state);
181 void SetStateMask(long stateMask);
182 void SetText(const wxString& text);
183 void SetImage(int image);
184 void SetData(long data);
186 void SetWidth(int width);
187 void SetAlign(wxListColumnFormat align);
189 void SetTextColour(const wxColour& colText);
190 void SetBackgroundColour(const wxColour& colBack);
191 void SetFont(const wxFont& font);
198 const wxString& GetText();
203 wxListColumnFormat GetAlign();
205 wxListItemAttr *GetAttributes();
206 bool HasAttributes();
208 wxColour GetTextColour() const;
209 wxColour GetBackgroundColour() const;
210 wxFont GetFont() const;
212 // these members are public for compatibility
213 long m_mask; // Indicates what fields are valid
214 long m_itemId; // The zero-based item position
215 int m_col; // Zero-based column, if in report mode
216 long m_state; // The state of the item
217 long m_stateMask;// Which flags of m_state are valid (uses same flags)
218 wxString m_text; // The label/header text
219 int m_image; // The zero-based index into an image list
220 long m_data; // App-defined data
223 int m_format; // left, right, centre
224 int m_width; // width of column
229 class wxListEvent: public wxNotifyEvent {
246 const wxString& GetLabel();
247 const wxString& GetText();
251 const wxListItem& GetItem();
256 class wxListCtrl : public wxControl {
258 wxListCtrl(wxWindow* parent, wxWindowID id,
259 const wxPoint& pos = wxDefaultPosition,
260 const wxSize& size = wxDefaultSize,
261 long style = wxLC_ICON,
262 const wxValidator& validator = wxDefaultValidator,
263 char* name = "listCtrl");
265 %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)"
267 bool Arrange(int flag = wxLIST_ALIGN_DEFAULT);
268 void AssignImageList(wxImageList* imageList, int which);
269 %pragma(python) addtomethod = "AssignImageList:_args[0].thisown = 0"
270 bool DeleteItem(long item);
271 bool DeleteAllItems();
272 bool DeleteColumn(int col);
273 bool DeleteAllColumns(void);
276 wxTextCtrl* EditLabel(long item);
277 bool EndEditLabel(bool cancel);
278 wxTextCtrl* GetEditControl();
280 void EditLabel(long item);
282 bool EnsureVisible(long item);
283 long FindItem(long start, const wxString& str, bool partial = FALSE);
284 %name(FindItemData)long FindItem(long start, long data);
285 %name(FindItemAtPos)long FindItem(long start, const wxPoint& pt,
287 bool GetColumn(int col, wxListItem& item);
288 int GetColumnWidth(int col);
289 int GetCountPerPage();
290 wxImageList* GetImageList(int which);
291 long GetItemData(long item);
294 %new wxListItem* GetItem(long itemId, int col=0) {
295 wxListItem* info = new wxListItem;
296 info->m_itemId = itemId;
298 info->m_mask = 0xFFFF;
299 self->GetItem(*info);
302 %new wxPoint* GetItemPosition(long item) {
303 wxPoint* pos = new wxPoint;
304 self->GetItemPosition(item, *pos);
307 %new wxRect* GetItemRect(long item, int code = wxLIST_RECT_BOUNDS) {
308 wxRect* rect= new wxRect;
309 self->GetItemRect(item, *rect, code);
314 int GetItemState(long item, long stateMask);
316 int GetItemSpacing(bool isSmall);
317 wxString GetItemText(long item);
318 long GetNextItem(long item,
319 int geometry = wxLIST_NEXT_ALL,
320 int state = wxLIST_STATE_DONTCARE);
321 int GetSelectedItemCount();
323 wxColour GetTextColour();
324 void SetTextColour(const wxColour& col);
327 long HitTest(const wxPoint& point, int& OUTPUT);
328 %name(InsertColumnInfo)long InsertColumn(long col, wxListItem& info);
329 long InsertColumn(long col, const wxString& heading,
330 int format = wxLIST_FORMAT_LEFT,
333 long InsertItem(wxListItem& info);
334 %name(InsertStringItem) long InsertItem(long index, const wxString& label);
335 %name(InsertImageItem) long InsertItem(long index, int imageIndex);
336 %name(InsertImageStringItem)long InsertItem(long index, const wxString& label,
339 bool ScrollList(int dx, int dy);
340 void SetBackgroundColour(const wxColour& col);
341 bool SetColumn(int col, wxListItem& item);
342 bool SetColumnWidth(int col, int width);
343 void SetImageList(wxImageList* imageList, int which);
345 bool SetItem(wxListItem& info);
346 %name(SetStringItem)long SetItem(long index, int col, const wxString& label,
349 bool SetItemData(long item, long data);
350 bool SetItemImage(long item, int image, int selImage);
351 bool SetItemPosition(long item, const wxPoint& pos);
352 bool SetItemState(long item, long state, long stateMask);
353 void SetItemText(long item, const wxString& text);
354 void SetSingleStyle(long style, bool add = TRUE);
355 void SetWindowStyleFlag(long style);
357 // bool SortItems(wxListCtrlCompare fn, long data);
359 bool SortItems(PyObject* func) {
360 if (!PyCallable_Check(func))
363 return self->SortItems(wxPyListCtrl_SortItems, (long)func);
369 int wxCALLBACK wxPyListCtrl_SortItems(long item1, long item2, long funcPtr) {
371 PyObject* func = (PyObject*)funcPtr;
372 bool doSave = wxPyRestoreThread();
374 PyObject* args = Py_BuildValue("(ii)", item1, item2);
375 PyObject* result = PyEval_CallObject(func, args);
378 retval = PyInt_AsLong(result);
382 wxPySaveThread(doSave);
388 //----------------------------------------------------------------------
392 wxTreeItemIcon_Normal, // not selected, not expanded
393 wxTreeItemIcon_Selected, // selected, not expanded
394 wxTreeItemIcon_Expanded, // not selected, expanded
395 wxTreeItemIcon_SelectedExpanded, // selected, expanded
400 // constants for HitTest
402 wxTREE_HITTEST_ABOVE,
403 wxTREE_HITTEST_BELOW,
404 wxTREE_HITTEST_NOWHERE,
405 wxTREE_HITTEST_ONITEMBUTTON,
406 wxTREE_HITTEST_ONITEMICON,
407 wxTREE_HITTEST_ONITEMINDENT,
408 wxTREE_HITTEST_ONITEMLABEL,
409 wxTREE_HITTEST_ONITEMRIGHT,
410 wxTREE_HITTEST_ONITEMSTATEICON,
411 wxTREE_HITTEST_TOLEFT,
412 wxTREE_HITTEST_TORIGHT,
413 wxTREE_HITTEST_ONITEMUPPERPART,
414 wxTREE_HITTEST_ONITEMLOWERPART,
415 wxTREE_HITTEST_ONITEM
420 /* Tree control event types */
421 wxEVT_COMMAND_TREE_BEGIN_DRAG,
422 wxEVT_COMMAND_TREE_BEGIN_RDRAG,
423 wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT,
424 wxEVT_COMMAND_TREE_END_LABEL_EDIT,
425 wxEVT_COMMAND_TREE_DELETE_ITEM,
426 wxEVT_COMMAND_TREE_GET_INFO,
427 wxEVT_COMMAND_TREE_SET_INFO,
428 wxEVT_COMMAND_TREE_ITEM_EXPANDED,
429 wxEVT_COMMAND_TREE_ITEM_EXPANDING,
430 wxEVT_COMMAND_TREE_ITEM_COLLAPSED,
431 wxEVT_COMMAND_TREE_ITEM_COLLAPSING,
432 wxEVT_COMMAND_TREE_SEL_CHANGED,
433 wxEVT_COMMAND_TREE_SEL_CHANGING,
434 wxEVT_COMMAND_TREE_KEY_DOWN,
435 wxEVT_COMMAND_TREE_ITEM_ACTIVATED,
436 wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK,
437 wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK,
438 wxEVT_COMMAND_TREE_END_DRAG,
449 int __cmp__(wxTreeItemId* other) {
450 if (! other) return -1;
451 return *self != *other;
459 class wxPyTreeItemData : public wxTreeItemData {
461 wxPyTreeItemData(PyObject* obj = NULL) {
468 ~wxPyTreeItemData() {
469 bool doSave = wxPyRestoreThread();
471 wxPySaveThread(doSave);
474 PyObject* GetData() {
479 void SetData(PyObject* obj) {
480 bool doSave = wxPyRestoreThread();
482 wxPySaveThread(doSave);
493 %name(wxTreeItemData) class wxPyTreeItemData : public wxObject {
495 wxPyTreeItemData(PyObject* obj = NULL);
498 void SetData(PyObject* obj);
500 const wxTreeItemId& GetId();
501 void SetId(const wxTreeItemId& id);
506 class wxTreeEvent : public wxNotifyEvent {
508 wxTreeItemId GetItem();
509 wxTreeItemId GetOldItem();
512 const wxString& GetLabel();
518 class wxPyTreeCtrl : public wxTreeCtrl {
519 DECLARE_ABSTRACT_CLASS(wxPyTreeCtrl);
521 wxPyTreeCtrl(wxWindow *parent, wxWindowID id,
525 const wxValidator& validator,
527 wxTreeCtrl(parent, id, pos, size, style, validator, name) {}
529 int OnCompareItems(const wxTreeItemId& item1,
530 const wxTreeItemId& item2) {
532 bool doSave = wxPyRestoreThread();
533 if (m_myInst.findCallback("OnCompareItems"))
534 rval = m_myInst.callCallback(Py_BuildValue(
536 wxPyConstructObject((void*)&item1, "wxTreeItemId"),
537 wxPyConstructObject((void*)&item2, "wxTreeItemId")));
539 rval = wxTreeCtrl::OnCompareItems(item1, item2);
540 wxPySaveThread(doSave);
546 IMPLEMENT_ABSTRACT_CLASS(wxPyTreeCtrl, wxTreeCtrl);
550 // These are for the GetFirstChild/GetNextChild methods below
551 %typemap(python, in) long& INOUT = long* INOUT;
552 %typemap(python, argout) long& INOUT = long* INOUT;
555 %name(wxTreeCtrl)class wxPyTreeCtrl : public wxControl {
557 wxPyTreeCtrl(wxWindow *parent, wxWindowID id = -1,
558 const wxPoint& pos = wxDefaultPosition,
559 const wxSize& size = wxDefaultSize,
560 long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT,
561 const wxValidator& validator = wxDefaultValidator,
562 char* name = "wxTreeCtrl");
564 void _setSelf(PyObject* self, PyObject* _class);
565 %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)"
566 %pragma(python) addtomethod = "__init__:self._setSelf(self, wxTreeCtrl)"
568 void AssignImageList(wxImageList* imageList);
569 %pragma(python) addtomethod = "AssignImageList:_args[0].thisown = 0"
571 unsigned int GetIndent();
572 void SetIndent(unsigned int indent);
573 wxImageList *GetImageList();
574 wxImageList *GetStateImageList();
575 void SetImageList(wxImageList *imageList);
576 void SetStateImageList(wxImageList *imageList);
578 unsigned int GetSpacing();
579 void SetSpacing(unsigned int spacing);
581 wxString GetItemText(const wxTreeItemId& item);
582 int GetItemImage(const wxTreeItemId& item,
583 wxTreeItemIcon which = wxTreeItemIcon_Normal);
584 int GetItemSelectedImage(const wxTreeItemId& item);
586 void SetItemText(const wxTreeItemId& item, const wxString& text);
587 void SetItemImage(const wxTreeItemId& item, int image,
588 wxTreeItemIcon which = wxTreeItemIcon_Normal);
589 void SetItemSelectedImage(const wxTreeItemId& item, int image);
590 void SetItemHasChildren(const wxTreeItemId& item, bool hasChildren = TRUE);
593 // [Get|Set]ItemData substitutes. Automatically create wxPyTreeItemData
595 wxPyTreeItemData* GetItemData(const wxTreeItemId& item) {
596 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
598 data = new wxPyTreeItemData();
599 data->SetId(item); // set the id
600 self->SetItemData(item, data);
605 void SetItemData(const wxTreeItemId& item, wxPyTreeItemData* data) {
606 data->SetId(item); // set the id
607 self->SetItemData(item, data);
610 // [Get|Set]PyData are short-cuts. Also made somewhat crash-proof by
611 // automatically creating data classes.
612 PyObject* GetPyData(const wxTreeItemId& item) {
613 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
615 data = new wxPyTreeItemData();
616 data->SetId(item); // set the id
617 self->SetItemData(item, data);
619 return data->GetData();
622 void SetPyData(const wxTreeItemId& item, PyObject* obj) {
623 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
625 data = new wxPyTreeItemData(obj);
626 data->SetId(item); // set the id
627 self->SetItemData(item, data);
634 bool IsVisible(const wxTreeItemId& item);
635 bool ItemHasChildren(const wxTreeItemId& item);
636 bool IsExpanded(const wxTreeItemId& item);
637 bool IsSelected(const wxTreeItemId& item);
639 wxTreeItemId GetRootItem();
640 wxTreeItemId GetSelection();
641 %name(GetItemParent) wxTreeItemId GetParent(const wxTreeItemId& item);
642 //size_t GetSelections(wxArrayTreeItemIds& selection);
644 PyObject* GetSelections() {
645 bool doSave = wxPyRestoreThread();
646 PyObject* rval = PyList_New(0);
647 wxArrayTreeItemIds array;
649 num = self->GetSelections(array);
650 for (x=0; x < num; x++) {
651 wxTreeItemId *tii = new wxTreeItemId(array.Item(x));
652 PyObject* item = wxPyConstructObject((void*)tii, "wxTreeItemId", TRUE);
653 PyList_Append(rval, item);
655 wxPySaveThread(doSave);
662 size_t GetChildrenCount(const wxTreeItemId& item, bool recursively = TRUE);
664 wxTreeItemId GetFirstChild(const wxTreeItemId& item, long& INOUT);
665 wxTreeItemId GetNextChild(const wxTreeItemId& item, long& INOUT);
666 wxTreeItemId GetNextSibling(const wxTreeItemId& item);
667 wxTreeItemId GetPrevSibling(const wxTreeItemId& item);
668 wxTreeItemId GetFirstVisibleItem();
669 wxTreeItemId GetNextVisible(const wxTreeItemId& item);
670 wxTreeItemId GetPrevVisible(const wxTreeItemId& item);
671 wxTreeItemId GetLastChild(const wxTreeItemId& item);
675 wxTreeItemId AddRoot(const wxString& text,
676 int image = -1, int selectedImage = -1,
677 wxPyTreeItemData *data = NULL);
678 wxTreeItemId PrependItem(const wxTreeItemId& parent,
679 const wxString& text,
680 int image = -1, int selectedImage = -1,
681 wxPyTreeItemData *data = NULL);
682 wxTreeItemId InsertItem(const wxTreeItemId& parent,
683 const wxTreeItemId& idPrevious,
684 const wxString& text,
685 int image = -1, int selectedImage = -1,
686 wxPyTreeItemData *data = NULL);
687 %name(InsertItemBefore)
688 wxTreeItemId InsertItem(const wxTreeItemId& parent,
690 const wxString& text,
691 int image = -1, int selectedImage = -1,
692 wxTreeItemData *data = NULL);
693 wxTreeItemId AppendItem(const wxTreeItemId& parent,
694 const wxString& text,
695 int image = -1, int selectedImage = -1,
696 wxPyTreeItemData *data = NULL);
698 void Delete(const wxTreeItemId& item);
699 void DeleteChildren(const wxTreeItemId& item);
700 void DeleteAllItems();
702 void Expand(const wxTreeItemId& item);
703 void Collapse(const wxTreeItemId& item);
704 void CollapseAndReset(const wxTreeItemId& item);
705 void Toggle(const wxTreeItemId& item);
709 void SelectItem(const wxTreeItemId& item);
710 void EnsureVisible(const wxTreeItemId& item);
711 void ScrollTo(const wxTreeItemId& item);
713 wxTextCtrl* EditLabel(const wxTreeItemId& item);
714 wxTextCtrl* GetEditControl();
715 void EndEditLabel(const wxTreeItemId& item, int discardChanges = FALSE);
717 void EditLabel(const wxTreeItemId& item);
720 void SortChildren(const wxTreeItemId& item);
722 void SetItemBold(const wxTreeItemId& item, int bold = TRUE);
723 bool IsBold(const wxTreeItemId& item) const;
724 wxTreeItemId HitTest(const wxPoint& point, int& OUTPUT);
728 void SetItemTextColour(const wxTreeItemId& item, const wxColour& col);
729 void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col);
730 void SetItemFont(const wxTreeItemId& item, const wxFont& font);
733 void SetItemDropHighlight(const wxTreeItemId& item, int highlight = TRUE);
735 //bool GetBoundingRect(const wxTreeItemId& item, wxRect& rect, int textOnly = FALSE)
737 PyObject* GetBoundingRect(const wxTreeItemId& item, int textOnly = FALSE) {
739 if (self->GetBoundingRect(item, rect, textOnly)) {
740 bool doSave = wxPyRestoreThread();
741 wxRect* r = new wxRect(rect);
742 PyObject* val = wxPyConstructObject((void*)r, "wxRect");
743 wxPySaveThread(doSave);
754 %pragma(python) addtoclass = "
755 # Redefine some methods that SWIG gets a bit confused on...
756 def GetFirstChild(self, *_args, **_kwargs):
757 val1,val2 = apply(controls2c.wxTreeCtrl_GetFirstChild,(self,) + _args, _kwargs)
758 val1 = wxTreeItemIdPtr(val1)
761 def GetNextChild(self, *_args, **_kwargs):
762 val1,val2 = apply(controls2c.wxTreeCtrl_GetNextChild,(self,) + _args, _kwargs)
763 val1 = wxTreeItemIdPtr(val1)
766 def HitTest(self, *_args, **_kwargs):
767 val1, val2 = apply(controls2c.wxTreeCtrl_HitTest,(self,) + _args, _kwargs)
768 val1 = wxTreeItemIdPtr(val1)
775 //----------------------------------------------------------------------
782 /* tab control event types */
783 wxEVT_COMMAND_TAB_SEL_CHANGED,
784 wxEVT_COMMAND_TAB_SEL_CHANGING,
788 class wxTabEvent : public wxCommandEvent {
794 class wxTabCtrl : public wxControl {
796 wxTabCtrl(wxWindow* parent, wxWindowID id,
797 const wxPoint& pos = wxDefaultPosition,
798 const wxSize& size = wxDefaultSize,
800 char* name = "tabCtrl");
802 %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)"
804 bool DeleteAllItems();
805 bool DeleteItem(int item);
806 wxImageList* GetImageList();
808 // TODO: void* GetItemData();
809 int GetItemImage(int item);
812 %new wxRect* GetItemRect(int item) {
813 wxRect* rect = new wxRect;
814 self->GetItemRect(item, *rect);
819 wxString GetItemText(int item);
822 int HitTest(const wxPoint& pt, long& OUTPUT);
823 void InsertItem(int item, const wxString& text,
824 int imageId = -1, void* clientData = NULL);
825 // TODO: bool SetItemData(int item, void* data);
826 bool SetItemImage(int item, int image);
827 void SetImageList(wxImageList* imageList);
828 void SetItemSize(const wxSize& size);
829 bool SetItemText(int item, const wxString& text);
830 void SetPadding(const wxSize& padding);
831 int SetSelection(int item);
838 //----------------------------------------------------------------------
841 wxPyPtrTypeMap_Add("wxTreeItemData", "wxPyTreeItemData");
842 wxPyPtrTypeMap_Add("wxTreeCtrl", "wxPyTreeCtrl");
845 //----------------------------------------------------------------------