]> git.saurik.com Git - wxWidgets.git/blame - src/palmos/treectrl.cpp
Added wxAddGrab, wxRemoveGrab for use by popup window implementations
[wxWidgets.git] / src / palmos / treectrl.cpp
CommitLineData
ffecfa5a
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/palmos/treectrl.cpp
3// Purpose: wxTreeCtrl
e2731512 4// Author: William Osborne - minimal working wxPalmOS port
ffecfa5a
JS
5// Modified by:
6// Created: 10/13/04
e2731512 7// RCS-ID: $Id$
ffecfa5a
JS
8// Copyright: (c) William Osborne
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
ffecfa5a
JS
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#if wxUSE_TREECTRL
28
29#include "wx/palmos/private.h"
30
ffecfa5a
JS
31#include "wx/app.h"
32#include "wx/log.h"
33#include "wx/dynarray.h"
34#include "wx/imaglist.h"
35#include "wx/settings.h"
ffecfa5a 36
ffecfa5a
JS
37// macros to hide the cast ugliness
38// --------------------------------
39
40// ptr is the real item id, i.e. wxTreeItemId::m_pItem
41#define HITEM_PTR(ptr) (HTREEITEM)(ptr)
42
43// item here is a wxTreeItemId
44#define HITEM(item) HITEM_PTR((item).m_pItem)
45
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
51// looks quite ugly.
52#define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0
53
54// ----------------------------------------------------------------------------
55// private functions
56// ----------------------------------------------------------------------------
57
58// ----------------------------------------------------------------------------
59// private classes
60// ----------------------------------------------------------------------------
61
62// ----------------------------------------------------------------------------
63// wxWin macros
64// ----------------------------------------------------------------------------
65
66#if wxUSE_EXTENDED_RTTI
67WX_DEFINE_FLAGS( wxTreeCtrlStyle )
68
69wxBEGIN_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)
78
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)
86
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)
96
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)
111
112wxEND_FLAGS( wxTreeCtrlStyle )
113
114IMPLEMENT_DYNAMIC_CLASS_XTI(wxTreeCtrl, wxControl,"wx/treectrl.h")
115
116wxBEGIN_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
120wxEND_PROPERTIES_TABLE()
121
122wxBEGIN_HANDLERS_TABLE(wxTreeCtrl)
123wxEND_HANDLERS_TABLE()
124
125wxCONSTRUCTOR_5( wxTreeCtrl , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle )
126#else
127IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl)
128#endif
129
130// ----------------------------------------------------------------------------
131// constants
132// ----------------------------------------------------------------------------
133
134// indices in gs_expandEvents table below
135enum
136{
137 IDX_COLLAPSE,
138 IDX_EXPAND,
139 IDX_WHAT_MAX
140};
141
142enum
143{
144 IDX_DONE,
145 IDX_DOING,
146 IDX_HOW_MAX
147};
148
149// handy table for sending events - it has to be initialized during run-time
150// now so can't be const any more
151static /* const */ wxEventType gs_expandEvents[IDX_WHAT_MAX][IDX_HOW_MAX];
152
153/*
154 but logically it's a const table with the following entries:
155=
156{
157 { wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxEVT_COMMAND_TREE_ITEM_COLLAPSING },
158 { wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxEVT_COMMAND_TREE_ITEM_EXPANDING }
159};
160*/
161
162// ============================================================================
163// implementation
164// ============================================================================
165
166// ----------------------------------------------------------------------------
167// construction and destruction
168// ----------------------------------------------------------------------------
169
170void wxTreeCtrl::Init()
171{
172}
173
174bool wxTreeCtrl::Create(wxWindow *parent,
175 wxWindowID id,
176 const wxPoint& pos,
177 const wxSize& size,
178 long style,
179 const wxValidator& validator,
180 const wxString& name)
181{
182 return false;
183}
184
185wxTreeCtrl::~wxTreeCtrl()
186{
187}
188
189// ----------------------------------------------------------------------------
190// accessors
191// ----------------------------------------------------------------------------
192
193/* static */ wxVisualAttributes
194wxTreeCtrl::GetClassDefaultAttributes(wxWindowVariant variant)
195{
196 wxVisualAttributes attrs;
197
198 return attrs;
199}
200
201
202// simple wrappers which add error checking in debug mode
203
204bool wxTreeCtrl::DoGetItem(wxTreeViewItem* tvItem) const
205{
206 return false;
207}
208
209void wxTreeCtrl::DoSetItem(wxTreeViewItem* tvItem)
210{
211}
212
213size_t wxTreeCtrl::GetCount() const
214{
215 return 0;
216}
217
218unsigned int wxTreeCtrl::GetIndent() const
219{
220 return 0;
221}
222
223void wxTreeCtrl::SetIndent(unsigned int indent)
224{
225}
226
227wxImageList *wxTreeCtrl::GetImageList() const
228{
229 return m_imageListNormal;
230}
231
232wxImageList *wxTreeCtrl::GetStateImageList() const
233{
234 return m_imageListState;
235}
236
237void wxTreeCtrl::SetAnyImageList(wxImageList *imageList, int which)
238{
239}
240
241void wxTreeCtrl::SetImageList(wxImageList *imageList)
242{
243}
244
245void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
246{
247}
248
249void wxTreeCtrl::AssignImageList(wxImageList *imageList)
250{
251}
252
253void wxTreeCtrl::AssignStateImageList(wxImageList *imageList)
254{
255}
256
257size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item,
258 bool recursively) const
259{
260 return 0;
261}
262
263// ----------------------------------------------------------------------------
264// control colours
265// ----------------------------------------------------------------------------
266
267bool wxTreeCtrl::SetBackgroundColour(const wxColour &colour)
268{
269 return false;
270}
271
272bool wxTreeCtrl::SetForegroundColour(const wxColour &colour)
273{
274 return false;
275}
276
277// ----------------------------------------------------------------------------
278// Item access
279// ----------------------------------------------------------------------------
280
281wxString wxTreeCtrl::GetItemText(const wxTreeItemId& item) const
282{
283 return wxString;
284}
285
286void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
287{
288}
289
290int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId& item,
291 wxTreeItemIcon which) const
292{
293 return -1;
294}
295
296void wxTreeCtrl::DoSetItemImageFromData(const wxTreeItemId& item,
297 int image,
298 wxTreeItemIcon which) const
299{
300}
301
302void wxTreeCtrl::DoSetItemImages(const wxTreeItemId& item,
303 int image,
304 int imageSel)
305{
306}
307
308int wxTreeCtrl::GetItemImage(const wxTreeItemId& item,
309 wxTreeItemIcon which) const
310{
311 return -1;
312}
313
314void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image,
315 wxTreeItemIcon which)
316{
317}
318
319wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const
320{
321 return NULL;
322}
323
324void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data)
325{
326}
327
328void wxTreeCtrl::SetIndirectItemData(const wxTreeItemId& item,
329 wxTreeItemIndirectData *data)
330{
331}
332
333bool wxTreeCtrl::HasIndirectData(const wxTreeItemId& item) const
334{
335 return false;
336}
337
338void wxTreeCtrl::SetItemHasChildren(const wxTreeItemId& item, bool has)
339{
340}
341
342void wxTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold)
343{
344}
345
346void wxTreeCtrl::SetItemDropHighlight(const wxTreeItemId& item, bool highlight)
347{
348}
349
350void wxTreeCtrl::RefreshItem(const wxTreeItemId& item)
351{
352}
353
354wxColour wxTreeCtrl::GetItemTextColour(const wxTreeItemId& item) const
355{
356 return wxNullColour;
357}
358
359wxColour wxTreeCtrl::GetItemBackgroundColour(const wxTreeItemId& item) const
360{
361 return wxNullColour;
362}
363
364wxFont wxTreeCtrl::GetItemFont(const wxTreeItemId& item) const
365{
366 return wxNullFont;
367}
368
369void wxTreeCtrl::SetItemTextColour(const wxTreeItemId& item,
370 const wxColour& col)
371{
372}
373
374void wxTreeCtrl::SetItemBackgroundColour(const wxTreeItemId& item,
375 const wxColour& col)
376{
377}
378
379void wxTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font)
380{
381}
382
383// ----------------------------------------------------------------------------
384// Item status
385// ----------------------------------------------------------------------------
386
387bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
388{
389 return false;
390}
391
392bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
393{
394 return false;
395}
396
397bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const
398{
399 return false;
400}
401
402bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const
403{
404 return false;
405}
406
407bool wxTreeCtrl::IsBold(const wxTreeItemId& item) const
408{
409 return false;
410}
411
412// ----------------------------------------------------------------------------
413// navigation
414// ----------------------------------------------------------------------------
415
416wxTreeItemId wxTreeCtrl::GetRootItem() const
417{
418 // Root may be real (visible) or virtual (hidden).
419 if ( GET_VIRTUAL_ROOT() )
420 return TVI_ROOT;
421
422 return wxTreeItemId(TreeView_GetRoot(GetHwnd()));
423}
424
425wxTreeItemId wxTreeCtrl::GetSelection() const
426{
427 return 0;
428}
429
430wxTreeItemId wxTreeCtrl::GetItemParent(const wxTreeItemId& item) const
431{
432 return 0;
433}
434
435wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
436 wxTreeItemIdValue& cookie) const
437{
438 return 0;
439}
440
441wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
442 wxTreeItemIdValue& cookie) const
443{
444 return 0;
445}
446
ffecfa5a
JS
447wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
448{
449 return 0;
450}
451
452wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
453{
454 return 0;
455}
456
457wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
458{
459 return 0;
460}
461
462wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const
463{
464 return 0;
465}
466
467wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
468{
469 return 0;
470}
471
472wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
473{
474 return 0;
475}
476
477// ----------------------------------------------------------------------------
478// multiple selections emulation
479// ----------------------------------------------------------------------------
480
481bool wxTreeCtrl::IsItemChecked(const wxTreeItemId& item) const
482{
483 return false;
484}
485
486void wxTreeCtrl::SetItemCheck(const wxTreeItemId& item, bool check)
487{
488}
489
490size_t wxTreeCtrl::GetSelections(wxArrayTreeItemIds& selections) const
491{
492 return 0;
493}
494
495// ----------------------------------------------------------------------------
496// Usual operations
497// ----------------------------------------------------------------------------
498
499wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
500 wxTreeItemId hInsertAfter,
501 const wxString& text,
502 int image, int selectedImage,
503 wxTreeItemData *data)
504{
505 return 0;
506}
507
ffecfa5a
JS
508wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
509 int image, int selectedImage,
510 wxTreeItemData *data)
511{
512 return 0;
513}
514
515wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent,
516 const wxString& text,
517 int image, int selectedImage,
518 wxTreeItemData *data)
519{
520 return 0;
521}
522
523wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
524 const wxTreeItemId& idPrevious,
525 const wxString& text,
526 int image, int selectedImage,
527 wxTreeItemData *data)
528{
529 return 0;
530}
531
532wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
533 size_t index,
534 const wxString& text,
535 int image, int selectedImage,
536 wxTreeItemData *data)
537{
538 return 0;
539}
540
541wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent,
542 const wxString& text,
543 int image, int selectedImage,
544 wxTreeItemData *data)
545{
546 return 0;
547}
548
549void wxTreeCtrl::Delete(const wxTreeItemId& item)
550{
551 return 0;
552}
553
554// delete all children (but don't delete the item itself)
555void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item)
556{
557}
558
559void wxTreeCtrl::DeleteAllItems()
560{
561}
562
563void wxTreeCtrl::DoExpand(const wxTreeItemId& item, int flag)
564{
565}
566
567void wxTreeCtrl::Expand(const wxTreeItemId& item)
568{
569}
570
571void wxTreeCtrl::Collapse(const wxTreeItemId& item)
572{
573}
574
575void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item)
576{
577}
578
579void wxTreeCtrl::Toggle(const wxTreeItemId& item)
580{
581}
582
ffecfa5a
JS
583void wxTreeCtrl::Unselect()
584{
585}
586
587void wxTreeCtrl::UnselectAll()
588{
589}
590
591void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
592{
593}
594
595void wxTreeCtrl::UnselectItem(const wxTreeItemId& item)
596{
597}
598
599void wxTreeCtrl::ToggleItemSelection(const wxTreeItemId& item)
600{
601}
602
603void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
604{
605}
606
607void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
608{
609}
610
611wxTextCtrl *wxTreeCtrl::GetEditControl() const
612{
613 return NULL;
614}
615
616void wxTreeCtrl::DeleteTextCtrl()
617{
618}
619
620wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
621 wxClassInfo* textControlClass)
622{
623 return NULL;
624}
625
626// End label editing, optionally cancelling the edit
627void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool discardChanges)
628{
629}
630
631wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
632{
633 return 0;
634}
635
636bool wxTreeCtrl::GetBoundingRect(const wxTreeItemId& item,
637 wxRect& rect,
638 bool textOnly) const
639{
640 return false;
641}
642
643// ----------------------------------------------------------------------------
644// sorting stuff
645// ----------------------------------------------------------------------------
646
647// this is just a tiny namespace which is friend to wxTreeCtrl and so can use
648// functions such as IsDataIndirect()
649class wxTreeSortHelper
650{
651public:
652 static int CALLBACK Compare(LPARAM data1, LPARAM data2, LPARAM tree);
653
654private:
655 static wxTreeItemId GetIdFromData(wxTreeCtrl *tree, LPARAM item)
656 {
657 wxTreeItemData *data = (wxTreeItemData *)item;
658 if ( tree->IsDataIndirect(data) )
659 {
660 data = ((wxTreeItemIndirectData *)data)->GetData();
661 }
662
663 return data->GetId();
664 }
665};
666
667int CALLBACK wxTreeSortHelper::Compare(LPARAM pItem1,
668 LPARAM pItem2,
669 LPARAM htree)
670{
671 wxCHECK_MSG( pItem1 && pItem2, 0,
672 wxT("sorting tree without data doesn't make sense") );
673
674 wxTreeCtrl *tree = (wxTreeCtrl *)htree;
675
676 return tree->OnCompareItems(GetIdFromData(tree, pItem1),
677 GetIdFromData(tree, pItem2));
678}
679
680int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
681 const wxTreeItemId& item2)
682{
683 return wxStrcmp(GetItemText(item1), GetItemText(item2));
684}
685
686void wxTreeCtrl::SortChildren(const wxTreeItemId& item)
687{
688 wxCHECK_RET( item.IsOk(), wxT("invalid tree item") );
689
690 // rely on the fact that TreeView_SortChildren does the same thing as our
691 // default behaviour, i.e. sorts items alphabetically and so call it
692 // directly if we're not in derived class (much more efficient!)
693 if ( GetClassInfo() == CLASSINFO(wxTreeCtrl) )
694 {
695 TreeView_SortChildren(GetHwnd(), HITEM(item), 0);
696 }
697 else
698 {
699 TV_SORTCB tvSort;
700 tvSort.hParent = HITEM(item);
701 tvSort.lpfnCompare = wxTreeSortHelper::Compare;
702 tvSort.lParam = (LPARAM)this;
703 TreeView_SortChildrenCB(GetHwnd(), &tvSort, 0 /* reserved */);
704 }
705}
706
ffecfa5a
JS
707// ----------------------------------------------------------------------------
708// State control.
709// ----------------------------------------------------------------------------
710
711// why do they define INDEXTOSTATEIMAGEMASK but not the inverse?
712#define STATEIMAGEMASKTOINDEX(state) (((state) & TVIS_STATEIMAGEMASK) >> 12)
713
714void wxTreeCtrl::SetState(const wxTreeItemId& node, int state)
715{
716}
717
718int wxTreeCtrl::GetState(const wxTreeItemId& node)
719{
720 return 0;
721}
722
723#endif // wxUSE_TREECTRL
724