]> git.saurik.com Git - wxWidgets.git/blob - src/palmos/treectrl.cpp
clean-up and fix
[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 unsigned int wxTreeCtrl::GetCount() const
214 {
215 // TODO
216 return 0;
217 }
218
219 unsigned int wxTreeCtrl::GetIndent() const
220 {
221 return 0;
222 }
223
224 void wxTreeCtrl::SetIndent(unsigned int indent)
225 {
226 }
227
228 wxImageList *wxTreeCtrl::GetImageList() const
229 {
230 return m_imageListNormal;
231 }
232
233 wxImageList *wxTreeCtrl::GetStateImageList() const
234 {
235 return m_imageListState;
236 }
237
238 void wxTreeCtrl::SetAnyImageList(wxImageList *imageList, int which)
239 {
240 }
241
242 void wxTreeCtrl::SetImageList(wxImageList *imageList)
243 {
244 }
245
246 void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
247 {
248 }
249
250 void wxTreeCtrl::AssignImageList(wxImageList *imageList)
251 {
252 }
253
254 void wxTreeCtrl::AssignStateImageList(wxImageList *imageList)
255 {
256 }
257
258 size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item,
259 bool recursively) const
260 {
261 return 0;
262 }
263
264 // ----------------------------------------------------------------------------
265 // control colours
266 // ----------------------------------------------------------------------------
267
268 bool wxTreeCtrl::SetBackgroundColour(const wxColour &colour)
269 {
270 return false;
271 }
272
273 bool wxTreeCtrl::SetForegroundColour(const wxColour &colour)
274 {
275 return false;
276 }
277
278 // ----------------------------------------------------------------------------
279 // Item access
280 // ----------------------------------------------------------------------------
281
282 wxString wxTreeCtrl::GetItemText(const wxTreeItemId& item) const
283 {
284 return wxString;
285 }
286
287 void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
288 {
289 }
290
291 int wxTreeCtrl::DoGetItemImageFromData(const wxTreeItemId& item,
292 wxTreeItemIcon which) const
293 {
294 return -1;
295 }
296
297 void wxTreeCtrl::DoSetItemImageFromData(const wxTreeItemId& item,
298 int image,
299 wxTreeItemIcon which) const
300 {
301 }
302
303 void wxTreeCtrl::DoSetItemImages(const wxTreeItemId& item,
304 int image,
305 int imageSel)
306 {
307 }
308
309 int wxTreeCtrl::GetItemImage(const wxTreeItemId& item,
310 wxTreeItemIcon which) const
311 {
312 return -1;
313 }
314
315 void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image,
316 wxTreeItemIcon which)
317 {
318 }
319
320 wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const
321 {
322 return NULL;
323 }
324
325 void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data)
326 {
327 }
328
329 void wxTreeCtrl::SetIndirectItemData(const wxTreeItemId& item,
330 wxTreeItemIndirectData *data)
331 {
332 }
333
334 bool wxTreeCtrl::HasIndirectData(const wxTreeItemId& item) const
335 {
336 return false;
337 }
338
339 void wxTreeCtrl::SetItemHasChildren(const wxTreeItemId& item, bool has)
340 {
341 }
342
343 void wxTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold)
344 {
345 }
346
347 void wxTreeCtrl::SetItemDropHighlight(const wxTreeItemId& item, bool highlight)
348 {
349 }
350
351 void wxTreeCtrl::RefreshItem(const wxTreeItemId& item)
352 {
353 }
354
355 wxColour wxTreeCtrl::GetItemTextColour(const wxTreeItemId& item) const
356 {
357 return wxNullColour;
358 }
359
360 wxColour wxTreeCtrl::GetItemBackgroundColour(const wxTreeItemId& item) const
361 {
362 return wxNullColour;
363 }
364
365 wxFont wxTreeCtrl::GetItemFont(const wxTreeItemId& item) const
366 {
367 return wxNullFont;
368 }
369
370 void wxTreeCtrl::SetItemTextColour(const wxTreeItemId& item,
371 const wxColour& col)
372 {
373 }
374
375 void wxTreeCtrl::SetItemBackgroundColour(const wxTreeItemId& item,
376 const wxColour& col)
377 {
378 }
379
380 void wxTreeCtrl::SetItemFont(const wxTreeItemId& item, const wxFont& font)
381 {
382 }
383
384 // ----------------------------------------------------------------------------
385 // Item status
386 // ----------------------------------------------------------------------------
387
388 bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const
389 {
390 return false;
391 }
392
393 bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
394 {
395 return false;
396 }
397
398 bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const
399 {
400 return false;
401 }
402
403 bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const
404 {
405 return false;
406 }
407
408 bool wxTreeCtrl::IsBold(const wxTreeItemId& item) const
409 {
410 return false;
411 }
412
413 // ----------------------------------------------------------------------------
414 // navigation
415 // ----------------------------------------------------------------------------
416
417 wxTreeItemId wxTreeCtrl::GetRootItem() const
418 {
419 // Root may be real (visible) or virtual (hidden).
420 if ( GET_VIRTUAL_ROOT() )
421 return TVI_ROOT;
422
423 return wxTreeItemId(TreeView_GetRoot(GetHwnd()));
424 }
425
426 wxTreeItemId wxTreeCtrl::GetSelection() const
427 {
428 return 0;
429 }
430
431 wxTreeItemId wxTreeCtrl::GetItemParent(const wxTreeItemId& item) const
432 {
433 return 0;
434 }
435
436 wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item,
437 wxTreeItemIdValue& cookie) const
438 {
439 return 0;
440 }
441
442 wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& WXUNUSED(item),
443 wxTreeItemIdValue& cookie) const
444 {
445 return 0;
446 }
447
448 wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
449 {
450 return 0;
451 }
452
453 wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
454 {
455 return 0;
456 }
457
458 wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
459 {
460 return 0;
461 }
462
463 wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const
464 {
465 return 0;
466 }
467
468 wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
469 {
470 return 0;
471 }
472
473 wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
474 {
475 return 0;
476 }
477
478 // ----------------------------------------------------------------------------
479 // multiple selections emulation
480 // ----------------------------------------------------------------------------
481
482 bool wxTreeCtrl::IsItemChecked(const wxTreeItemId& item) const
483 {
484 return false;
485 }
486
487 void wxTreeCtrl::SetItemCheck(const wxTreeItemId& item, bool check)
488 {
489 }
490
491 size_t wxTreeCtrl::GetSelections(wxArrayTreeItemIds& selections) const
492 {
493 return 0;
494 }
495
496 // ----------------------------------------------------------------------------
497 // Usual operations
498 // ----------------------------------------------------------------------------
499
500 wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
501 wxTreeItemId hInsertAfter,
502 const wxString& text,
503 int image, int selectedImage,
504 wxTreeItemData *data)
505 {
506 return 0;
507 }
508
509 wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
510 int image, int selectedImage,
511 wxTreeItemData *data)
512 {
513 return 0;
514 }
515
516 wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent,
517 const wxString& text,
518 int image, int selectedImage,
519 wxTreeItemData *data)
520 {
521 return 0;
522 }
523
524 wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
525 const wxTreeItemId& idPrevious,
526 const wxString& text,
527 int image, int selectedImage,
528 wxTreeItemData *data)
529 {
530 return 0;
531 }
532
533 wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent,
534 size_t index,
535 const wxString& text,
536 int image, int selectedImage,
537 wxTreeItemData *data)
538 {
539 return 0;
540 }
541
542 wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent,
543 const wxString& text,
544 int image, int selectedImage,
545 wxTreeItemData *data)
546 {
547 return 0;
548 }
549
550 void wxTreeCtrl::Delete(const wxTreeItemId& item)
551 {
552 return 0;
553 }
554
555 // delete all children (but don't delete the item itself)
556 void wxTreeCtrl::DeleteChildren(const wxTreeItemId& item)
557 {
558 }
559
560 void wxTreeCtrl::DeleteAllItems()
561 {
562 }
563
564 void wxTreeCtrl::DoExpand(const wxTreeItemId& item, int flag)
565 {
566 }
567
568 void wxTreeCtrl::Expand(const wxTreeItemId& item)
569 {
570 }
571
572 void wxTreeCtrl::Collapse(const wxTreeItemId& item)
573 {
574 }
575
576 void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item)
577 {
578 }
579
580 void wxTreeCtrl::Toggle(const wxTreeItemId& item)
581 {
582 }
583
584 void wxTreeCtrl::Unselect()
585 {
586 }
587
588 void wxTreeCtrl::UnselectAll()
589 {
590 }
591
592 void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
593 {
594 }
595
596 void wxTreeCtrl::UnselectItem(const wxTreeItemId& item)
597 {
598 }
599
600 void wxTreeCtrl::ToggleItemSelection(const wxTreeItemId& item)
601 {
602 }
603
604 void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
605 {
606 }
607
608 void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
609 {
610 }
611
612 wxTextCtrl *wxTreeCtrl::GetEditControl() const
613 {
614 return NULL;
615 }
616
617 void wxTreeCtrl::DeleteTextCtrl()
618 {
619 }
620
621 wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
622 wxClassInfo* textControlClass)
623 {
624 return NULL;
625 }
626
627 // End label editing, optionally cancelling the edit
628 void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool discardChanges)
629 {
630 }
631
632 wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
633 {
634 return 0;
635 }
636
637 bool wxTreeCtrl::GetBoundingRect(const wxTreeItemId& item,
638 wxRect& rect,
639 bool textOnly) const
640 {
641 return false;
642 }
643
644 // ----------------------------------------------------------------------------
645 // sorting stuff
646 // ----------------------------------------------------------------------------
647
648 // this is just a tiny namespace which is friend to wxTreeCtrl and so can use
649 // functions such as IsDataIndirect()
650 class wxTreeSortHelper
651 {
652 public:
653 static int CALLBACK Compare(LPARAM data1, LPARAM data2, LPARAM tree);
654
655 private:
656 static wxTreeItemId GetIdFromData(wxTreeCtrl *tree, LPARAM item)
657 {
658 wxTreeItemData *data = (wxTreeItemData *)item;
659 if ( tree->IsDataIndirect(data) )
660 {
661 data = ((wxTreeItemIndirectData *)data)->GetData();
662 }
663
664 return data->GetId();
665 }
666 };
667
668 int CALLBACK wxTreeSortHelper::Compare(LPARAM pItem1,
669 LPARAM pItem2,
670 LPARAM htree)
671 {
672 wxCHECK_MSG( pItem1 && pItem2, 0,
673 wxT("sorting tree without data doesn't make sense") );
674
675 wxTreeCtrl *tree = (wxTreeCtrl *)htree;
676
677 return tree->OnCompareItems(GetIdFromData(tree, pItem1),
678 GetIdFromData(tree, pItem2));
679 }
680
681 int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
682 const wxTreeItemId& item2)
683 {
684 return wxStrcmp(GetItemText(item1), GetItemText(item2));
685 }
686
687 void wxTreeCtrl::SortChildren(const wxTreeItemId& item)
688 {
689 wxCHECK_RET( item.IsOk(), wxT("invalid tree item") );
690
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) )
695 {
696 TreeView_SortChildren(GetHwnd(), HITEM(item), 0);
697 }
698 else
699 {
700 TV_SORTCB tvSort;
701 tvSort.hParent = HITEM(item);
702 tvSort.lpfnCompare = wxTreeSortHelper::Compare;
703 tvSort.lParam = (LPARAM)this;
704 TreeView_SortChildrenCB(GetHwnd(), &tvSort, 0 /* reserved */);
705 }
706 }
707
708 // ----------------------------------------------------------------------------
709 // State control.
710 // ----------------------------------------------------------------------------
711
712 // why do they define INDEXTOSTATEIMAGEMASK but not the inverse?
713 #define STATEIMAGEMASKTOINDEX(state) (((state) & TVIS_STATEIMAGEMASK) >> 12)
714
715 void wxTreeCtrl::SetState(const wxTreeItemId& node, int state)
716 {
717 }
718
719 int wxTreeCtrl::GetState(const wxTreeItemId& node)
720 {
721 return 0;
722 }
723
724 #endif // wxUSE_TREECTRL
725