]> git.saurik.com Git - wxWidgets.git/blob - src/palmos/treectrl.cpp
Now works when derived from wxTextCtrlBase, using wxScrollHelper.
[wxWidgets.git] / src / palmos / treectrl.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/palmos/treectrl.cpp
3 // Purpose: wxTreeCtrl
4 // Author: William Osborne - minimal working wxPalmOS port
5 // Modified by:
6 // Created: 10/13/04
7 // RCS-ID: $Id$
8 // Copyright: (c) William Osborne
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
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
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"
36
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
67 WX_DEFINE_FLAGS( wxTreeCtrlStyle )
68
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)
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
112 wxEND_FLAGS( wxTreeCtrlStyle )
113
114 IMPLEMENT_DYNAMIC_CLASS_XTI(wxTreeCtrl, wxControl,"wx/treectrl.h")
115
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()
121
122 wxBEGIN_HANDLERS_TABLE(wxTreeCtrl)
123 wxEND_HANDLERS_TABLE()
124
125 wxCONSTRUCTOR_5( wxTreeCtrl , wxWindow* , Parent , wxWindowID , Id , wxPoint , Position , wxSize , Size , long , WindowStyle )
126 #else
127 IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl)
128 #endif
129
130 // ----------------------------------------------------------------------------
131 // constants
132 // ----------------------------------------------------------------------------
133
134 // indices in gs_expandEvents table below
135 enum
136 {
137 IDX_COLLAPSE,
138 IDX_EXPAND,
139 IDX_WHAT_MAX
140 };
141
142 enum
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
151 static /* 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
170 void wxTreeCtrl::Init()
171 {
172 }
173
174 bool 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
185 wxTreeCtrl::~wxTreeCtrl()
186 {
187 }
188
189 // ----------------------------------------------------------------------------
190 // accessors
191 // ----------------------------------------------------------------------------
192
193 /* static */ wxVisualAttributes
194 wxTreeCtrl::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
204 bool wxTreeCtrl::DoGetItem(wxTreeViewItem* tvItem) const
205 {
206 return false;
207 }
208
209 void wxTreeCtrl::DoSetItem(wxTreeViewItem* tvItem)
210 {
211 }
212
213 size_t wxTreeCtrl::GetCount() const
214 {
215 return 0;
216 }
217
218 unsigned int wxTreeCtrl::GetIndent() const
219 {
220 return 0;
221 }
222
223 void wxTreeCtrl::SetIndent(unsigned int indent)
224 {
225 }
226
227 wxImageList *wxTreeCtrl::GetImageList() const
228 {
229 return m_imageListNormal;
230 }
231
232 wxImageList *wxTreeCtrl::GetStateImageList() const
233 {
234 return m_imageListState;
235 }
236
237 void wxTreeCtrl::SetAnyImageList(wxImageList *imageList, int which)
238 {
239 }
240
241 void wxTreeCtrl::SetImageList(wxImageList *imageList)
242 {
243 }
244
245 void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
246 {
247 }
248
249 void wxTreeCtrl::AssignImageList(wxImageList *imageList)
250 {
251 }
252
253 void wxTreeCtrl::AssignStateImageList(wxImageList *imageList)
254 {
255 }
256
257 size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item,
258 bool recursively) const
259 {
260 return 0;
261 }
262
263 // ----------------------------------------------------------------------------
264 // control colours
265 // ----------------------------------------------------------------------------
266
267 bool wxTreeCtrl::SetBackgroundColour(const wxColour &colour)
268 {
269 return false;
270 }
271
272 bool wxTreeCtrl::SetForegroundColour(const wxColour &colour)
273 {
274 return false;
275 }
276
277 // ----------------------------------------------------------------------------
278 // Item access
279 // ----------------------------------------------------------------------------
280
281 wxString wxTreeCtrl::GetItemText(const wxTreeItemId& item) const
282 {
283 return wxString;
284 }
285
286 void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
287 {
288 }
289
290 int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId& item,
291 wxTreeItemIcon which) const
292 {
293 return -1;
294 }
295
296 void wxTreeCtrl::DoSetItemImageFromData(const wxTreeItemId& item,
297 int image,
298 wxTreeItemIcon which) const
299 {
300 }
301
302 void wxTreeCtrl::DoSetItemImages(const wxTreeItemId& item,
303 int image,
304 int imageSel)
305 {
306 }
307
308 int wxTreeCtrl::GetItemImage(const wxTreeItemId& item,
309 wxTreeItemIcon which) const
310 {
311 return -1;
312 }
313
314 void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image,
315 wxTreeItemIcon which)
316 {
317 }
318
319 wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const
320 {
321 return NULL;
322 }
323
324 void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data)
325 {
326 }
327
328 void wxTreeCtrl::SetIndirectItemData(const wxTreeItemId& item,
329 wxTreeItemIndirectData *data)
330 {
331 }
332
333 bool wxTreeCtrl::HasIndirectData(const wxTreeItemId& item) const
334 {
335 return false;
336 }
337
338 void wxTreeCtrl::SetItemHasChildren(const wxTreeItemId& item, bool has)
339 {
340 }
341
342 void wxTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold)
343 {
344 }
345
346 void wxTreeCtrl::SetItemDropHighlight(const wxTreeItemId& item, bool highlight)
347 {
348 }
349
350 void wxTreeCtrl::RefreshItem(const wxTreeItemId& item)
351 {
352 }
353
354 wxColour wxTreeCtrl::GetItemTextColour(const wxTreeItemId& item) const
355 {
356 return wxNullColour;
357 }
358
359 wxColour wxTreeCtrl::GetItemBackgroundColour(const wxTreeItemId& item) const
360 {
361 return wxNullColour;
362 }
363
364 wxFont wxTreeCtrl::GetItemFont(const wxTreeItemId& item) const
365 {
366 return wxNullFont;
367 }
368
369 void wxTreeCtrl::SetItemTextColour(const wxTreeItemId& item,
370 const wxColour& col)
371 {
372 }
373
374 void wxTreeCtrl::SetItemBackgroundColour(const wxTreeItemId& item,
375 const wxColour& col)
376 {
377 }
378
379 void wxTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font)
380 {
381 }
382
383 // ----------------------------------------------------------------------------
384 // Item status
385 // ----------------------------------------------------------------------------
386
387 bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
388 {
389 return false;
390 }
391
392 bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
393 {
394 return false;
395 }
396
397 bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const
398 {
399 return false;
400 }
401
402 bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const
403 {
404 return false;
405 }
406
407 bool wxTreeCtrl::IsBold(const wxTreeItemId& item) const
408 {
409 return false;
410 }
411
412 // ----------------------------------------------------------------------------
413 // navigation
414 // ----------------------------------------------------------------------------
415
416 wxTreeItemId 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
425 wxTreeItemId wxTreeCtrl::GetSelection() const
426 {
427 return 0;
428 }
429
430 wxTreeItemId wxTreeCtrl::GetItemParent(const wxTreeItemId& item) const
431 {
432 return 0;
433 }
434
435 wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
436 wxTreeItemIdValue& cookie) const
437 {
438 return 0;
439 }
440
441 wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
442 wxTreeItemIdValue& cookie) const
443 {
444 return 0;
445 }
446
447 wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
448 {
449 return 0;
450 }
451
452 wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
453 {
454 return 0;
455 }
456
457 wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
458 {
459 return 0;
460 }
461
462 wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const
463 {
464 return 0;
465 }
466
467 wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
468 {
469 return 0;
470 }
471
472 wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
473 {
474 return 0;
475 }
476
477 // ----------------------------------------------------------------------------
478 // multiple selections emulation
479 // ----------------------------------------------------------------------------
480
481 bool wxTreeCtrl::IsItemChecked(const wxTreeItemId& item) const
482 {
483 return false;
484 }
485
486 void wxTreeCtrl::SetItemCheck(const wxTreeItemId& item, bool check)
487 {
488 }
489
490 size_t wxTreeCtrl::GetSelections(wxArrayTreeItemIds& selections) const
491 {
492 return 0;
493 }
494
495 // ----------------------------------------------------------------------------
496 // Usual operations
497 // ----------------------------------------------------------------------------
498
499 wxTreeItemId 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
508 wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
509 int image, int selectedImage,
510 wxTreeItemData *data)
511 {
512 return 0;
513 }
514
515 wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent,
516 const wxString& text,
517 int image, int selectedImage,
518 wxTreeItemData *data)
519 {
520 return 0;
521 }
522
523 wxTreeItemId 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
532 wxTreeItemId 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
541 wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent,
542 const wxString& text,
543 int image, int selectedImage,
544 wxTreeItemData *data)
545 {
546 return 0;
547 }
548
549 void wxTreeCtrl::Delete(const wxTreeItemId& item)
550 {
551 return 0;
552 }
553
554 // delete all children (but don't delete the item itself)
555 void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item)
556 {
557 }
558
559 void wxTreeCtrl::DeleteAllItems()
560 {
561 }
562
563 void wxTreeCtrl::DoExpand(const wxTreeItemId& item, int flag)
564 {
565 }
566
567 void wxTreeCtrl::Expand(const wxTreeItemId& item)
568 {
569 }
570
571 void wxTreeCtrl::Collapse(const wxTreeItemId& item)
572 {
573 }
574
575 void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item)
576 {
577 }
578
579 void wxTreeCtrl::Toggle(const wxTreeItemId& item)
580 {
581 }
582
583 void wxTreeCtrl::Unselect()
584 {
585 }
586
587 void wxTreeCtrl::UnselectAll()
588 {
589 }
590
591 void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
592 {
593 }
594
595 void wxTreeCtrl::UnselectItem(const wxTreeItemId& item)
596 {
597 }
598
599 void wxTreeCtrl::ToggleItemSelection(const wxTreeItemId& item)
600 {
601 }
602
603 void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
604 {
605 }
606
607 void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
608 {
609 }
610
611 wxTextCtrl *wxTreeCtrl::GetEditControl() const
612 {
613 return NULL;
614 }
615
616 void wxTreeCtrl::DeleteTextCtrl()
617 {
618 }
619
620 wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
621 wxClassInfo* textControlClass)
622 {
623 return NULL;
624 }
625
626 // End label editing, optionally cancelling the edit
627 void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool discardChanges)
628 {
629 }
630
631 wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
632 {
633 return 0;
634 }
635
636 bool 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()
649 class wxTreeSortHelper
650 {
651 public:
652 static int CALLBACK Compare(LPARAM data1, LPARAM data2, LPARAM tree);
653
654 private:
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
667 int 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
680 int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
681 const wxTreeItemId& item2)
682 {
683 return wxStrcmp(GetItemText(item1), GetItemText(item2));
684 }
685
686 void 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
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
714 void wxTreeCtrl::SetState(const wxTreeItemId& node, int state)
715 {
716 }
717
718 int wxTreeCtrl::GetState(const wxTreeItemId& node)
719 {
720 return 0;
721 }
722
723 #endif // wxUSE_TREECTRL
724