1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/palmos/treectrl.cpp
4 // Author: William Osborne - minimal working wxPalmOS port
8 // Copyright: (c) William Osborne
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
29 #include "wx/palmos/private.h"
33 #include "wx/dynarray.h"
34 #include "wx/imaglist.h"
35 #include "wx/settings.h"
37 // macros to hide the cast ugliness
38 // --------------------------------
40 // ptr is the real item id, i.e. wxTreeItemId::m_pItem
41 #define HITEM_PTR(ptr) (HTREEITEM)(ptr)
43 // item here is a wxTreeItemId
44 #define HITEM(item) HITEM_PTR((item).m_pItem)
46 // the native control doesn't support multiple selections under MSW and we
47 // have 2 ways to emulate them: either using TVS_CHECKBOXES style and let
48 // checkboxes be the selection status (checked == selected) or by really
49 // emulating everything, i.e. intercepting mouse and key events &c. The first
50 // approach is much easier but doesn't work with comctl32.dll < 4.71 and also
52 #define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0
54 // ----------------------------------------------------------------------------
56 // ----------------------------------------------------------------------------
58 // ----------------------------------------------------------------------------
60 // ----------------------------------------------------------------------------
62 // ----------------------------------------------------------------------------
64 // ----------------------------------------------------------------------------
66 #if wxUSE_EXTENDED_RTTI
67 WX_DEFINE_FLAGS( wxTreeCtrlStyle
)
69 wxBEGIN_FLAGS( wxTreeCtrlStyle
)
70 // new style border flags, we put them first to
71 // use them for streaming out
72 wxFLAGS_MEMBER(wxBORDER_SIMPLE
)
73 wxFLAGS_MEMBER(wxBORDER_SUNKEN
)
74 wxFLAGS_MEMBER(wxBORDER_DOUBLE
)
75 wxFLAGS_MEMBER(wxBORDER_RAISED
)
76 wxFLAGS_MEMBER(wxBORDER_STATIC
)
77 wxFLAGS_MEMBER(wxBORDER_NONE
)
79 // old style border flags
80 wxFLAGS_MEMBER(wxSIMPLE_BORDER
)
81 wxFLAGS_MEMBER(wxSUNKEN_BORDER
)
82 wxFLAGS_MEMBER(wxDOUBLE_BORDER
)
83 wxFLAGS_MEMBER(wxRAISED_BORDER
)
84 wxFLAGS_MEMBER(wxSTATIC_BORDER
)
85 wxFLAGS_MEMBER(wxBORDER
)
87 // standard window styles
88 wxFLAGS_MEMBER(wxTAB_TRAVERSAL
)
89 wxFLAGS_MEMBER(wxCLIP_CHILDREN
)
90 wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW
)
91 wxFLAGS_MEMBER(wxWANTS_CHARS
)
92 wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE
)
93 wxFLAGS_MEMBER(wxALWAYS_SHOW_SB
)
94 wxFLAGS_MEMBER(wxVSCROLL
)
95 wxFLAGS_MEMBER(wxHSCROLL
)
97 wxFLAGS_MEMBER(wxTR_EDIT_LABELS
)
98 wxFLAGS_MEMBER(wxTR_NO_BUTTONS
)
99 wxFLAGS_MEMBER(wxTR_HAS_BUTTONS
)
100 wxFLAGS_MEMBER(wxTR_TWIST_BUTTONS
)
101 wxFLAGS_MEMBER(wxTR_NO_LINES
)
102 wxFLAGS_MEMBER(wxTR_FULL_ROW_HIGHLIGHT
)
103 wxFLAGS_MEMBER(wxTR_LINES_AT_ROOT
)
104 wxFLAGS_MEMBER(wxTR_HIDE_ROOT
)
105 wxFLAGS_MEMBER(wxTR_ROW_LINES
)
106 wxFLAGS_MEMBER(wxTR_HAS_VARIABLE_ROW_HEIGHT
)
107 wxFLAGS_MEMBER(wxTR_SINGLE
)
108 wxFLAGS_MEMBER(wxTR_MULTIPLE
)
109 wxFLAGS_MEMBER(wxTR_EXTENDED
)
110 wxFLAGS_MEMBER(wxTR_DEFAULT_STYLE
)
112 wxEND_FLAGS( wxTreeCtrlStyle
)
114 IMPLEMENT_DYNAMIC_CLASS_XTI(wxTreeCtrl
, wxControl
,"wx/treectrl.h")
116 wxBEGIN_PROPERTIES_TABLE(wxTreeCtrl
)
117 wxEVENT_PROPERTY( TextUpdated
, wxEVT_COMMAND_TEXT_UPDATED
, wxCommandEvent
)
118 wxEVENT_RANGE_PROPERTY( TreeEvent
, wxEVT_COMMAND_TREE_BEGIN_DRAG
, wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK
, wxTreeEvent
)
119 wxPROPERTY_FLAGS( WindowStyle
, wxTreeCtrlStyle
, long , SetWindowStyleFlag
, GetWindowStyleFlag
, EMPTY_MACROVALUE
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
120 wxEND_PROPERTIES_TABLE()
122 wxBEGIN_HANDLERS_TABLE(wxTreeCtrl
)
123 wxEND_HANDLERS_TABLE()
125 wxCONSTRUCTOR_5( wxTreeCtrl
, wxWindow
* , Parent
, wxWindowID
, Id
, wxPoint
, Position
, wxSize
, Size
, long , WindowStyle
)
127 IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl
, wxControl
)
130 // ----------------------------------------------------------------------------
132 // ----------------------------------------------------------------------------
134 // indices in gs_expandEvents table below
149 // handy table for sending events - it has to be initialized during run-time
150 // now so can't be const any more
151 static /* const */ wxEventType gs_expandEvents
[IDX_WHAT_MAX
][IDX_HOW_MAX
];
154 but logically it's a const table with the following entries:
157 { wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxEVT_COMMAND_TREE_ITEM_COLLAPSING },
158 { wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxEVT_COMMAND_TREE_ITEM_EXPANDING }
162 // ============================================================================
164 // ============================================================================
166 // ----------------------------------------------------------------------------
167 // construction and destruction
168 // ----------------------------------------------------------------------------
170 void wxTreeCtrl::Init()
174 bool wxTreeCtrl::Create(wxWindow
*parent
,
179 const wxValidator
& validator
,
180 const wxString
& name
)
185 wxTreeCtrl::~wxTreeCtrl()
189 // ----------------------------------------------------------------------------
191 // ----------------------------------------------------------------------------
193 /* static */ wxVisualAttributes
194 wxTreeCtrl::GetClassDefaultAttributes(wxWindowVariant variant
)
196 wxVisualAttributes attrs
;
202 // simple wrappers which add error checking in debug mode
204 bool wxTreeCtrl::DoGetItem(wxTreeViewItem
* tvItem
) const
209 void wxTreeCtrl::DoSetItem(wxTreeViewItem
* tvItem
)
213 unsigned int wxTreeCtrl::GetCount() const
219 unsigned int wxTreeCtrl::GetIndent() const
224 void wxTreeCtrl::SetIndent(unsigned int indent
)
228 wxImageList
*wxTreeCtrl::GetImageList() const
230 return m_imageListNormal
;
233 wxImageList
*wxTreeCtrl::GetStateImageList() const
235 return m_imageListState
;
238 void wxTreeCtrl::SetAnyImageList(wxImageList
*imageList
, int which
)
242 void wxTreeCtrl::SetImageList(wxImageList
*imageList
)
246 void wxTreeCtrl::SetStateImageList(wxImageList
*imageList
)
250 void wxTreeCtrl::AssignImageList(wxImageList
*imageList
)
254 void wxTreeCtrl::AssignStateImageList(wxImageList
*imageList
)
258 size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId
& item
,
259 bool recursively
) const
264 // ----------------------------------------------------------------------------
266 // ----------------------------------------------------------------------------
268 bool wxTreeCtrl::SetBackgroundColour(const wxColour
&colour
)
273 bool wxTreeCtrl::SetForegroundColour(const wxColour
&colour
)
278 // ----------------------------------------------------------------------------
280 // ----------------------------------------------------------------------------
282 wxString
wxTreeCtrl::GetItemText(const wxTreeItemId
& item
) const
287 void wxTreeCtrl::SetItemText(const wxTreeItemId
& item
, const wxString
& text
)
291 int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId
& item
,
292 wxTreeItemIcon which
) const
297 void wxTreeCtrl::DoSetItemImageFromData(const wxTreeItemId
& item
,
299 wxTreeItemIcon which
) const
303 void wxTreeCtrl::DoSetItemImages(const wxTreeItemId
& item
,
309 int wxTreeCtrl::GetItemImage(const wxTreeItemId
& item
,
310 wxTreeItemIcon which
) const
315 void wxTreeCtrl::SetItemImage(const wxTreeItemId
& item
, int image
,
316 wxTreeItemIcon which
)
320 wxTreeItemData
*wxTreeCtrl::GetItemData(const wxTreeItemId
& item
) const
325 void wxTreeCtrl::SetItemData(const wxTreeItemId
& item
, wxTreeItemData
*data
)
329 void wxTreeCtrl::SetIndirectItemData(const wxTreeItemId
& item
,
330 wxTreeItemIndirectData
*data
)
334 bool wxTreeCtrl::HasIndirectData(const wxTreeItemId
& item
) const
339 void wxTreeCtrl::SetItemHasChildren(const wxTreeItemId
& item
, bool has
)
343 void wxTreeCtrl::SetItemBold(const wxTreeItemId
& item
, bool bold
)
347 void wxTreeCtrl::SetItemDropHighlight(const wxTreeItemId
& item
, bool highlight
)
351 void wxTreeCtrl::RefreshItem(const wxTreeItemId
& item
)
355 wxColour
wxTreeCtrl::GetItemTextColour(const wxTreeItemId
& item
) const
360 wxColour
wxTreeCtrl::GetItemBackgroundColour(const wxTreeItemId
& item
) const
365 wxFont
wxTreeCtrl::GetItemFont(const wxTreeItemId
& item
) const
370 void wxTreeCtrl::SetItemTextColour(const wxTreeItemId
& item
,
375 void wxTreeCtrl::SetItemBackgroundColour(const wxTreeItemId
& item
,
380 void wxTreeCtrl::SetItemFont(const wxTreeItemId
& item
, const wxFont
& font
)
384 // ----------------------------------------------------------------------------
386 // ----------------------------------------------------------------------------
388 bool wxTreeCtrl::IsVisible(const wxTreeItemId
& item
) const
393 bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId
& item
) const
398 bool wxTreeCtrl::IsExpanded(const wxTreeItemId
& item
) const
403 bool wxTreeCtrl::IsSelected(const wxTreeItemId
& item
) const
408 bool wxTreeCtrl::IsBold(const wxTreeItemId
& item
) const
413 // ----------------------------------------------------------------------------
415 // ----------------------------------------------------------------------------
417 wxTreeItemId
wxTreeCtrl::GetRootItem() const
419 // Root may be real (visible) or virtual (hidden).
420 if ( GET_VIRTUAL_ROOT() )
423 return wxTreeItemId(TreeView_GetRoot(GetHwnd()));
426 wxTreeItemId
wxTreeCtrl::GetSelection() const
431 wxTreeItemId
wxTreeCtrl::GetItemParent(const wxTreeItemId
& item
) const
436 wxTreeItemId
wxTreeCtrl::GetFirstChild(const wxTreeItemId
& item
,
437 wxTreeItemIdValue
& cookie
) const
442 wxTreeItemId
wxTreeCtrl::GetNextChild(const wxTreeItemId
& WXUNUSED(item
),
443 wxTreeItemIdValue
& cookie
) const
448 wxTreeItemId
wxTreeCtrl::GetLastChild(const wxTreeItemId
& item
) const
453 wxTreeItemId
wxTreeCtrl::GetNextSibling(const wxTreeItemId
& item
) const
458 wxTreeItemId
wxTreeCtrl::GetPrevSibling(const wxTreeItemId
& item
) const
463 wxTreeItemId
wxTreeCtrl::GetFirstVisibleItem() const
468 wxTreeItemId
wxTreeCtrl::GetNextVisible(const wxTreeItemId
& item
) const
473 wxTreeItemId
wxTreeCtrl::GetPrevVisible(const wxTreeItemId
& item
) const
478 // ----------------------------------------------------------------------------
479 // multiple selections emulation
480 // ----------------------------------------------------------------------------
482 bool wxTreeCtrl::IsItemChecked(const wxTreeItemId
& item
) const
487 void wxTreeCtrl::SetItemCheck(const wxTreeItemId
& item
, bool check
)
491 size_t wxTreeCtrl::GetSelections(wxArrayTreeItemIds
& selections
) const
496 // ----------------------------------------------------------------------------
498 // ----------------------------------------------------------------------------
500 wxTreeItemId
wxTreeCtrl::DoInsertItem(const wxTreeItemId
& parent
,
501 wxTreeItemId hInsertAfter
,
502 const wxString
& text
,
503 int image
, int selectedImage
,
504 wxTreeItemData
*data
)
509 wxTreeItemId
wxTreeCtrl::AddRoot(const wxString
& text
,
510 int image
, int selectedImage
,
511 wxTreeItemData
*data
)
516 wxTreeItemId
wxTreeCtrl::PrependItem(const wxTreeItemId
& parent
,
517 const wxString
& text
,
518 int image
, int selectedImage
,
519 wxTreeItemData
*data
)
524 wxTreeItemId
wxTreeCtrl::InsertItem(const wxTreeItemId
& parent
,
525 const wxTreeItemId
& idPrevious
,
526 const wxString
& text
,
527 int image
, int selectedImage
,
528 wxTreeItemData
*data
)
533 wxTreeItemId
wxTreeCtrl::InsertItem(const wxTreeItemId
& parent
,
535 const wxString
& text
,
536 int image
, int selectedImage
,
537 wxTreeItemData
*data
)
542 wxTreeItemId
wxTreeCtrl::AppendItem(const wxTreeItemId
& parent
,
543 const wxString
& text
,
544 int image
, int selectedImage
,
545 wxTreeItemData
*data
)
550 void wxTreeCtrl::Delete(const wxTreeItemId
& item
)
555 // delete all children (but don't delete the item itself)
556 void wxTreeCtrl::DeleteChildren(const wxTreeItemId
& item
)
560 void wxTreeCtrl::DeleteAllItems()
564 void wxTreeCtrl::DoExpand(const wxTreeItemId
& item
, int flag
)
568 void wxTreeCtrl::Expand(const wxTreeItemId
& item
)
572 void wxTreeCtrl::Collapse(const wxTreeItemId
& item
)
576 void wxTreeCtrl::CollapseAndReset(const wxTreeItemId
& item
)
580 void wxTreeCtrl::Toggle(const wxTreeItemId
& item
)
584 void wxTreeCtrl::Unselect()
588 void wxTreeCtrl::UnselectAll()
592 void wxTreeCtrl::SelectItem(const wxTreeItemId
& item
, bool select
)
596 void wxTreeCtrl::UnselectItem(const wxTreeItemId
& item
)
600 void wxTreeCtrl::ToggleItemSelection(const wxTreeItemId
& item
)
604 void wxTreeCtrl::EnsureVisible(const wxTreeItemId
& item
)
608 void wxTreeCtrl::ScrollTo(const wxTreeItemId
& item
)
612 wxTextCtrl
*wxTreeCtrl::GetEditControl() const
617 void wxTreeCtrl::DeleteTextCtrl()
621 wxTextCtrl
* wxTreeCtrl::EditLabel(const wxTreeItemId
& item
,
622 wxClassInfo
* textControlClass
)
627 // End label editing, optionally cancelling the edit
628 void wxTreeCtrl::EndEditLabel(const wxTreeItemId
& WXUNUSED(item
), bool discardChanges
)
632 wxTreeItemId
wxTreeCtrl::HitTest(const wxPoint
& point
, int& flags
)
637 bool wxTreeCtrl::GetBoundingRect(const wxTreeItemId
& item
,
644 // ----------------------------------------------------------------------------
646 // ----------------------------------------------------------------------------
648 // this is just a tiny namespace which is friend to wxTreeCtrl and so can use
649 // functions such as IsDataIndirect()
650 class wxTreeSortHelper
653 static int CALLBACK
Compare(LPARAM data1
, LPARAM data2
, LPARAM tree
);
656 static wxTreeItemId
GetIdFromData(wxTreeCtrl
*tree
, LPARAM item
)
658 wxTreeItemData
*data
= (wxTreeItemData
*)item
;
659 if ( tree
->IsDataIndirect(data
) )
661 data
= ((wxTreeItemIndirectData
*)data
)->GetData();
664 return data
->GetId();
668 int CALLBACK
wxTreeSortHelper::Compare(LPARAM pItem1
,
672 wxCHECK_MSG( pItem1
&& pItem2
, 0,
673 wxT("sorting tree without data doesn't make sense") );
675 wxTreeCtrl
*tree
= (wxTreeCtrl
*)htree
;
677 return tree
->OnCompareItems(GetIdFromData(tree
, pItem1
),
678 GetIdFromData(tree
, pItem2
));
681 int wxTreeCtrl::OnCompareItems(const wxTreeItemId
& item1
,
682 const wxTreeItemId
& item2
)
684 return wxStrcmp(GetItemText(item1
), GetItemText(item2
));
687 void wxTreeCtrl::SortChildren(const wxTreeItemId
& item
)
689 wxCHECK_RET( item
.IsOk(), wxT("invalid tree item") );
691 // rely on the fact that TreeView_SortChildren does the same thing as our
692 // default behaviour, i.e. sorts items alphabetically and so call it
693 // directly if we're not in derived class (much more efficient!)
694 if ( GetClassInfo() == CLASSINFO(wxTreeCtrl
) )
696 TreeView_SortChildren(GetHwnd(), HITEM(item
), 0);
701 tvSort
.hParent
= HITEM(item
);
702 tvSort
.lpfnCompare
= wxTreeSortHelper::Compare
;
703 tvSort
.lParam
= (LPARAM
)this;
704 TreeView_SortChildrenCB(GetHwnd(), &tvSort
, 0 /* reserved */);
708 // ----------------------------------------------------------------------------
710 // ----------------------------------------------------------------------------
712 // why do they define INDEXTOSTATEIMAGEMASK but not the inverse?
713 #define STATEIMAGEMASKTOINDEX(state) (((state) & TVIS_STATEIMAGEMASK) >> 12)
715 void wxTreeCtrl::SetState(const wxTreeItemId
& node
, int state
)
719 int wxTreeCtrl::GetState(const wxTreeItemId
& node
)
724 #endif // wxUSE_TREECTRL