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>
24 //----------------------------------------------------------------------
27 %include my_typemaps.i
29 // Import some definitions of other classes, etc.
37 %pragma(python) code = "import wx"
39 //----------------------------------------------------------------------
42 extern wxValidator wxPyDefaultValidator;
45 //----------------------------------------------------------------------
54 wxLIST_STATE_DONTCARE,
55 wxLIST_STATE_DROPHILITED,
57 wxLIST_STATE_SELECTED,
61 wxLIST_HITTEST_NOWHERE,
62 wxLIST_HITTEST_ONITEMICON,
63 wxLIST_HITTEST_ONITEMLABEL,
64 wxLIST_HITTEST_ONITEMRIGHT,
65 wxLIST_HITTEST_ONITEMSTATEICON,
66 wxLIST_HITTEST_TOLEFT,
67 wxLIST_HITTEST_TORIGHT,
68 wxLIST_HITTEST_ONITEM,
77 wxLIST_ALIGN_SNAP_TO_GRID,
79 wxLIST_AUTOSIZE_USEHEADER,
90 enum wxListColumnFormat
95 wxLIST_FORMAT_CENTER = wxLIST_FORMAT_CENTRE
104 //wxListItemAttr(const wxColour& colText,
105 // const wxColour& colBack,
106 // const wxFont& font)
107 // : m_colText(colText), m_colBack(colBack), m_font(font) { }
110 void SetTextColour(const wxColour& colText);
111 void SetBackgroundColour(const wxColour& colBack);
112 void SetFont(const wxFont& font);
115 bool HasTextColour();
116 bool HasBackgroundColour();
119 const wxColour& GetTextColour();
120 const wxColour& GetBackgroundColour();
121 const wxFont& GetFont();
132 void ClearAttributes();
135 void SetMask(long mask);
137 void SetColumn(int col);
138 void SetState(long state);
139 void SetStateMask(long stateMask);
140 void SetText(const wxString& text);
141 void SetImage(int image);
142 void SetData(long data);
144 void SetWidth(int width);
145 void SetAlign(wxListColumnFormat align);
147 void SetTextColour(const wxColour& colText);
148 void SetBackgroundColour(const wxColour& colBack);
149 void SetFont(const wxFont& font);
156 const wxString& GetText();
161 wxListColumnFormat GetAlign();
163 wxListItemAttr *GetAttributes();
164 bool HasAttributes();
166 wxColour GetTextColour() const;
167 wxColour GetBackgroundColour() const;
168 wxFont GetFont() const;
170 // these members are public for compatibility
171 long m_mask; // Indicates what fields are valid
172 long m_itemId; // The zero-based item position
173 int m_col; // Zero-based column, if in report mode
174 long m_state; // The state of the item
175 long m_stateMask;// Which flags of m_state are valid (uses same flags)
176 wxString m_text; // The label/header text
177 int m_image; // The zero-based index into an image list
178 long m_data; // App-defined data
181 int m_format; // left, right, centre
182 int m_width; // width of column
187 class wxListEvent: public wxCommandEvent {
204 const wxString& GetLabel();
205 const wxString& GetText();
209 const wxListItem& GetItem();
214 class wxListCtrl : public wxControl {
216 wxListCtrl(wxWindow* parent, wxWindowID id,
217 const wxPoint& pos = wxPyDefaultPosition,
218 const wxSize& size = wxPyDefaultSize,
219 long style = wxLC_ICON,
220 const wxValidator& validator = wxPyDefaultValidator,
221 char* name = "listCtrl");
223 %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)"
225 bool Arrange(int flag = wxLIST_ALIGN_DEFAULT);
226 bool DeleteItem(long item);
227 bool DeleteAllItems();
228 bool DeleteColumn(int col);
229 bool DeleteAllColumns(void);
232 wxTextCtrl* EditLabel(long item);
233 bool EndEditLabel(bool cancel);
234 wxTextCtrl* GetEditControl();
236 void EditLabel(long item);
238 bool EnsureVisible(long item);
239 long FindItem(long start, const wxString& str, bool partial = FALSE);
240 %name(FindItemData)long FindItem(long start, long data);
241 %name(FindItemAtPos)long FindItem(long start, const wxPoint& pt,
243 bool GetColumn(int col, wxListItem& item);
244 int GetColumnWidth(int col);
245 int GetCountPerPage();
246 wxImageList* GetImageList(int which);
247 long GetItemData(long item);
250 %new wxListItem* GetItem(long itemId, int col=0) {
251 wxListItem* info = new wxListItem;
252 info->m_itemId = itemId;
254 info->m_mask = 0xFFFF;
255 self->GetItem(*info);
258 %new wxPoint* GetItemPosition(long item) {
259 wxPoint* pos = new wxPoint;
260 self->GetItemPosition(item, *pos);
263 %new wxRect* GetItemRect(long item, int code = wxLIST_RECT_BOUNDS) {
264 wxRect* rect= new wxRect;
265 self->GetItemRect(item, *rect, code);
270 int GetItemState(long item, long stateMask);
272 int GetItemSpacing(bool isSmall);
273 wxString GetItemText(long item);
274 long GetNextItem(long item,
275 int geometry = wxLIST_NEXT_ALL,
276 int state = wxLIST_STATE_DONTCARE);
277 int GetSelectedItemCount();
279 wxColour GetTextColour();
280 void SetTextColour(const wxColour& col);
283 long HitTest(const wxPoint& point, int& OUTPUT);
284 %name(InsertColumnWith)long InsertColumn(long col, wxListItem& info);
285 long InsertColumn(long col, const wxString& heading,
286 int format = wxLIST_FORMAT_LEFT,
289 long InsertItem(wxListItem& info);
290 %name(InsertStringItem) long InsertItem(long index, const wxString& label);
291 %name(InsertImageItem) long InsertItem(long index, int imageIndex);
292 %name(InsertImageStringItem)long InsertItem(long index, const wxString& label,
295 bool ScrollList(int dx, int dy);
296 void SetBackgroundColour(const wxColour& col);
297 bool SetColumn(int col, wxListItem& item);
298 bool SetColumnWidth(int col, int width);
299 void SetImageList(wxImageList* imageList, int which);
301 bool SetItem(wxListItem& info);
302 %name(SetStringItem)long SetItem(long index, int col, const wxString& label,
305 bool SetItemData(long item, long data);
306 bool SetItemImage(long item, int image, int selImage);
307 bool SetItemPosition(long item, const wxPoint& pos);
308 bool SetItemState(long item, long state, long stateMask);
309 void SetItemText(long item, const wxString& text);
310 void SetSingleStyle(long style, bool add = TRUE);
311 void SetWindowStyleFlag(long style);
313 // bool SortItems(wxListCtrlCompare fn, long data);
315 bool SortItems(PyObject* func) {
316 if (!PyCallable_Check(func))
319 return self->SortItems(wxPyListCtrl_SortItems, (long)func);
325 int wxCALLBACK wxPyListCtrl_SortItems(long item1, long item2, long funcPtr) {
327 PyObject* func = (PyObject*)funcPtr;
328 bool doSave = wxPyRestoreThread();
330 PyObject* args = Py_BuildValue("(ii)", item1, item2);
331 PyObject* result = PyEval_CallObject(func, args);
334 retval = PyInt_AsLong(result);
338 wxPySaveThread(doSave);
344 //----------------------------------------------------------------------
348 wxTreeItemIcon_Normal, // not selected, not expanded
349 wxTreeItemIcon_Selected, // selected, not expanded
350 wxTreeItemIcon_Expanded, // not selected, expanded
351 wxTreeItemIcon_SelectedExpanded, // selected, expanded
356 // constants for HitTest
358 wxTREE_HITTEST_ABOVE,
359 wxTREE_HITTEST_BELOW,
360 wxTREE_HITTEST_NOWHERE,
361 wxTREE_HITTEST_ONITEMBUTTON,
362 wxTREE_HITTEST_ONITEMICON,
363 wxTREE_HITTEST_ONITEMINDENT,
364 wxTREE_HITTEST_ONITEMLABEL,
365 wxTREE_HITTEST_ONITEMRIGHT,
366 wxTREE_HITTEST_ONITEMSTATEICON,
367 wxTREE_HITTEST_TOLEFT,
368 wxTREE_HITTEST_TORIGHT,
369 wxTREE_HITTEST_ONITEMUPPERPART,
370 wxTREE_HITTEST_ONITEMLOWERPART,
371 wxTREE_HITTEST_ONITEM
382 int __cmp__(wxTreeItemId* other) {
383 if (! other) return 0;
384 return *self != *other;
392 class wxPyTreeItemData : public wxTreeItemData {
394 wxPyTreeItemData(PyObject* obj = NULL) {
401 ~wxPyTreeItemData() {
402 bool doSave = wxPyRestoreThread();
404 wxPySaveThread(doSave);
407 PyObject* GetData() {
412 void SetData(PyObject* obj) {
424 %name(wxTreeItemData) class wxPyTreeItemData {
426 wxPyTreeItemData(PyObject* obj = NULL);
429 void SetData(PyObject* obj);
431 const wxTreeItemId& GetId();
432 void SetId(const wxTreeItemId& id);
437 class wxTreeEvent : public wxNotifyEvent {
439 wxTreeItemId GetItem();
440 wxTreeItemId GetOldItem();
443 const wxString& GetLabel();
449 class wxPyTreeCtrl : public wxTreeCtrl {
451 wxPyTreeCtrl(wxWindow *parent, wxWindowID id,
455 const wxValidator& validator,
457 wxTreeCtrl(parent, id, pos, size, style, validator, name) {}
460 int OnCompareItems(const wxTreeItemId& item1,
461 const wxTreeItemId& item2) {
463 bool doSave = wxPyRestoreThread();
464 if (m_myInst.findCallback("OnCompareItems"))
465 rval = m_myInst.callCallback(Py_BuildValue(
467 wxPyConstructObject((void*)&item1, "wxTreeItemId"),
468 wxPyConstructObject((void*)&item2, "wxTreeItemId")));
470 rval = wxTreeCtrl::OnCompareItems(item1, item2);
471 wxPySaveThread(doSave);
479 // These are for the GetFirstChild/GetNextChild methods below
480 %typemap(python, in) long& INOUT = long* INOUT;
481 %typemap(python, argout) long& INOUT = long* INOUT;
484 %name(wxTreeCtrl)class wxPyTreeCtrl : public wxControl {
486 wxPyTreeCtrl(wxWindow *parent, wxWindowID id = -1,
487 const wxPoint& pos = wxPyDefaultPosition,
488 const wxSize& size = wxPyDefaultSize,
489 long style = wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT,
490 const wxValidator& validator = wxPyDefaultValidator,
491 char* name = "wxTreeCtrl");
493 void _setSelf(PyObject* self, PyObject* _class);
494 %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)"
495 %pragma(python) addtomethod = "__init__:self._setSelf(self, wxTreeCtrl)"
498 unsigned int GetIndent();
499 void SetIndent(unsigned int indent);
500 wxImageList *GetImageList();
501 wxImageList *GetStateImageList();
502 void SetImageList(wxImageList *imageList/*, int which = wxIMAGE_LIST_NORMAL*/);
503 void SetStateImageList(wxImageList *imageList);
505 unsigned int GetSpacing();
506 void SetSpacing(unsigned int spacing);
508 wxString GetItemText(const wxTreeItemId& item);
509 int GetItemImage(const wxTreeItemId& item,
510 wxTreeItemIcon which = wxTreeItemIcon_Normal);
511 int GetItemSelectedImage(const wxTreeItemId& item);
513 void SetItemText(const wxTreeItemId& item, const wxString& text);
514 void SetItemImage(const wxTreeItemId& item, int image,
515 wxTreeItemIcon which = wxTreeItemIcon_Normal);
516 void SetItemSelectedImage(const wxTreeItemId& item, int image);
517 void SetItemHasChildren(const wxTreeItemId& item, bool hasChildren = TRUE);
520 // [Get|Set]ItemData substitutes. Automatically create wxPyTreeItemData
522 wxPyTreeItemData* GetItemData(const wxTreeItemId& item) {
523 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
525 data = new wxPyTreeItemData();
526 data->SetId(item); // set the id
527 self->SetItemData(item, data);
532 void SetItemData(const wxTreeItemId& item, wxPyTreeItemData* data) {
533 data->SetId(item); // set the id
534 self->SetItemData(item, data);
537 // [Get|Set]PyData are short-cuts. Also made somewhat crash-proof by
538 // automatically creating data classes.
539 PyObject* GetPyData(const wxTreeItemId& item) {
540 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
542 data = new wxPyTreeItemData();
543 data->SetId(item); // set the id
544 self->SetItemData(item, data);
546 return data->GetData();
549 void SetPyData(const wxTreeItemId& item, PyObject* obj) {
550 wxPyTreeItemData* data = (wxPyTreeItemData*)self->GetItemData(item);
552 data = new wxPyTreeItemData(obj);
553 data->SetId(item); // set the id
554 self->SetItemData(item, data);
561 bool IsVisible(const wxTreeItemId& item);
562 bool ItemHasChildren(const wxTreeItemId& item);
563 bool IsExpanded(const wxTreeItemId& item);
564 bool IsSelected(const wxTreeItemId& item);
566 wxTreeItemId GetRootItem();
567 wxTreeItemId GetSelection();
568 %name(GetItemParent) wxTreeItemId GetParent(const wxTreeItemId& item);
569 //size_t GetSelections(wxArrayTreeItemIds& selection);
571 PyObject* GetSelections() {
572 bool doSave = wxPyRestoreThread();
573 PyObject* rval = PyList_New(0);
574 wxArrayTreeItemIds array;
576 num = self->GetSelections(array);
577 for (x=0; x < num; x++) {
578 PyObject* item = wxPyConstructObject((void*)&array.Item(x),
580 PyList_Append(rval, item);
582 wxPySaveThread(doSave);
589 size_t GetChildrenCount(const wxTreeItemId& item, bool recursively = TRUE);
591 wxTreeItemId GetFirstChild(const wxTreeItemId& item, long& INOUT);
592 wxTreeItemId GetNextChild(const wxTreeItemId& item, long& INOUT);
593 wxTreeItemId GetNextSibling(const wxTreeItemId& item);
594 wxTreeItemId GetPrevSibling(const wxTreeItemId& item);
595 wxTreeItemId GetFirstVisibleItem();
596 wxTreeItemId GetNextVisible(const wxTreeItemId& item);
597 wxTreeItemId GetPrevVisible(const wxTreeItemId& item);
598 wxTreeItemId GetLastChild(const wxTreeItemId& item);
602 wxTreeItemId AddRoot(const wxString& text,
603 int image = -1, int selectedImage = -1,
604 wxPyTreeItemData *data = NULL);
605 wxTreeItemId PrependItem(const wxTreeItemId& parent,
606 const wxString& text,
607 int image = -1, int selectedImage = -1,
608 wxPyTreeItemData *data = NULL);
609 wxTreeItemId InsertItem(const wxTreeItemId& parent,
610 const wxTreeItemId& idPrevious,
611 const wxString& text,
612 int image = -1, int selectedImage = -1,
613 wxPyTreeItemData *data = NULL);
614 %name(InsertItemBefore)
615 wxTreeItemId InsertItem(const wxTreeItemId& parent,
617 const wxString& text,
618 int image = -1, int selectedImage = -1,
619 wxTreeItemData *data = NULL);
620 wxTreeItemId AppendItem(const wxTreeItemId& parent,
621 const wxString& text,
622 int image = -1, int selectedImage = -1,
623 wxPyTreeItemData *data = NULL);
625 void Delete(const wxTreeItemId& item);
626 void DeleteChildren(const wxTreeItemId& item);
627 void DeleteAllItems();
629 void Expand(const wxTreeItemId& item);
630 void Collapse(const wxTreeItemId& item);
631 void CollapseAndReset(const wxTreeItemId& item);
632 void Toggle(const wxTreeItemId& item);
636 void SelectItem(const wxTreeItemId& item);
637 void EnsureVisible(const wxTreeItemId& item);
638 void ScrollTo(const wxTreeItemId& item);
640 wxTextCtrl* EditLabel(const wxTreeItemId& item);
641 wxTextCtrl* GetEditControl();
642 void EndEditLabel(const wxTreeItemId& item, int discardChanges = FALSE);
644 void EditLabel(const wxTreeItemId& item);
647 void SortChildren(const wxTreeItemId& item);
649 void SetItemBold(const wxTreeItemId& item, int bold = TRUE);
650 bool IsBold(const wxTreeItemId& item) const;
651 wxTreeItemId HitTest(const wxPoint& point, int& OUTPUT);
655 void SetItemTextColour(const wxTreeItemId& item, const wxColour& col);
656 void SetItemBackgroundColour(const wxTreeItemId& item, const wxColour& col);
657 void SetItemFont(const wxTreeItemId& item, const wxFont& font);
660 void SetItemDropHighlight(const wxTreeItemId& item, int highlight = TRUE);
662 //bool GetBoundingRect(const wxTreeItemId& item, wxRect& rect, int textOnly = FALSE)
664 PyObject* GetBoundingRect(const wxTreeItemId& item, int textOnly = FALSE) {
666 if (self->GetBoundingRect(item, rect, textOnly)) {
667 bool doSave = wxPyRestoreThread();
668 wxRect* r = new wxRect(rect);
669 PyObject* val = wxPyConstructObject((void*)r, "wxRect");
670 wxPySaveThread(doSave);
681 %pragma(python) addtoclass = "
682 # Redefine some methods that SWIG gets a bit confused on...
683 def GetFirstChild(self, *_args, **_kwargs):
684 val1,val2 = apply(controls2c.wxTreeCtrl_GetFirstChild,(self,) + _args, _kwargs)
685 val1 = wxTreeItemIdPtr(val1)
688 def GetNextChild(self, *_args, **_kwargs):
689 val1,val2 = apply(controls2c.wxTreeCtrl_GetNextChild,(self,) + _args, _kwargs)
690 val1 = wxTreeItemIdPtr(val1)
693 def HitTest(self, *_args, **_kwargs):
694 val1, val2 = apply(controls2c.wxTreeCtrl_HitTest,(self,) + _args, _kwargs)
695 val1 = wxTreeItemIdPtr(val1)
702 //----------------------------------------------------------------------
706 class wxTabEvent : public wxCommandEvent {
712 class wxTabCtrl : public wxControl {
714 wxTabCtrl(wxWindow* parent, wxWindowID id,
715 const wxPoint& pos = wxPyDefaultPosition,
716 const wxSize& size = wxPyDefaultSize,
718 char* name = "tabCtrl");
720 %pragma(python) addtomethod = "__init__:#wx._StdWindowCallbacks(self)"
722 bool DeleteAllItems();
723 bool DeleteItem(int item);
724 wxImageList* GetImageList();
726 // TODO: void* GetItemData();
727 int GetItemImage(int item);
730 %new wxRect* GetItemRect(int item) {
731 wxRect* rect = new wxRect;
732 self->GetItemRect(item, *rect);
737 wxString GetItemText(int item);
740 int HitTest(const wxPoint& pt, long& OUTPUT);
741 void InsertItem(int item, const wxString& text,
742 int imageId = -1, void* clientData = NULL);
743 // TODO: bool SetItemData(int item, void* data);
744 bool SetItemImage(int item, int image);
745 void SetImageList(wxImageList* imageList);
746 void SetItemSize(const wxSize& size);
747 bool SetItemText(int item, const wxString& text);
748 void SetPadding(const wxSize& padding);
749 int SetSelection(int item);
756 //----------------------------------------------------------------------