00001
00086 #ifndef INC_MGUI_TREE_H
00087 #define INC_MGUI_TREE_H
00088
00089 #ifndef INC_MGUI_CTRL_H
00090 #include <mgui/ctrl.h>
00091 #endif
00092
00093 #ifndef INC_MGUI_KEYCODE_H
00094 #include <mgui/keycode.h>
00095 #endif
00096
00097 #ifndef INC_MGUI_POINTERBUTTON_H
00098 #include <mgui/pointerbutton.h>
00099 #endif
00100
00101 #ifndef INC_MGUI_CUSTOMDRAW_H
00102 #include <mgui/customdraw.h>
00103 #endif
00104
00105 #ifndef INC_MI32_MISTRING_H
00106 #include <mi32/mistring.h>
00107 #endif
00108
00109
00110 #ifndef GENERATING_DOXYGEN_OUTPUT
00111 namespace MGUI {
00112 class CTRL_TOOLTIP;
00113 class CUSTOMDRAW_TREE;
00114 class IMAGELIST;
00115 }
00116 #endif
00117
00118
00119 namespace MGUI {
00120
00122 class CTRL_TREE : public CTRL {
00123 public:
00124
00126 enum CTRLSTYLE {
00127 CTRLSTYLE_Default = 0x0000,
00128 CTRLSTYLE_ShowLines = 0x0001,
00129 CTRLSTYLE_ShowLinesAtRoot = 0x0002,
00130 CTRLSTYLE_NoButtons = 0x0004,
00131 CTRLSTYLE_SingleExpand = 0x0008,
00132 CTRLSTYLE_NoToolTips = 0x0010,
00133 CTRLSTYLE_EditableText = 0x0020,
00134 CTRLSTYLE_NoScrollHorizontal = 0x0040,
00135 CTRLSTYLE_SizeInPixels = 0x0080,
00136 CTRLSTYLE_ImageIdxIsIconID = 0x0100,
00137 };
00138
00140 enum ITEMSTYLE {
00141 ITEMSTYLE_Default = 0x0000,
00142 ITEMSTYLE_OwnerText = 0x0001,
00143 ITEMSTYLE_OwnerImages = 0x0002,
00144 ITEMSTYLE_AllowChildReorder = 0x0004,
00145 };
00146
00148 enum ITEMHND {
00149 ITEMHND_Last = -2,
00150 ITEMHND_None = -1,
00151 ITEMHND_Root = 0,
00152 };
00153
00155 enum ITEMSTATUS {
00156 ITEMSTATUS_None = 0x00,
00157 ITEMSTATUS_Bold = 0x01,
00158 ITEMSTATUS_DropHighlighted = 0x10,
00159 ITEMSTATUS_Expanded = 0x02,
00160 ITEMSTATUS_ExpandedOnce = 0x04,
00161 ITEMSTATUS_Selected = 0x08,
00162 };
00163
00165 enum FIND {
00166 FIND_Selected,
00167 FIND_DropHighlight,
00168 FIND_Parent,
00169 FIND_FirstChild,
00170 FIND_NextSibling,
00171 FIND_PreviousSibling,
00172 FIND_TopParent,
00173 };
00174
00176 enum CHILDPRESENCE {
00177 CHILDPRESENCE_No = 0,
00178 CHILDPRESENCE_Yes = 1,
00179 CHILDPRESENCE_Ask = 2
00180 };
00181
00183 enum CHILDVISIBILITY {
00184 CHILDVISIBILITY_Expand,
00185 CHILDVISIBILITY_Collapse,
00186 CHILDVISIBILITY_CollapseReset,
00187 CHILDVISIBILITY_Toggle
00188 };
00189
00191 enum IMAGETYPE {
00192 IMAGETYPE_Primary,
00193 IMAGETYPE_State
00194 };
00195
00197 enum ITEMVALUES {
00198 ITEMVALUES_None = 0x0000,
00199 ITEMVALUE_ChildPresence = 0x0001,
00200 ITEMVALUE_ImageNormal = 0x0002,
00201 ITEMVALUE_ImageSelected = 0x0004,
00202 ITEMVALUE_ImageState = 0x0008,
00203 ITEMVALUE_Status = 0x0010,
00204 ITEMVALUE_Text = 0x0020,
00205 ITEMVALUE_ID = 0x0040,
00206 ITEMVALUE_Style = 0x0080,
00207 ITEMVALUE_HeightMult = 0x0100,
00208 ITEMVALUES_All = 0x0FFF
00209 };
00210
00212
00213 enum HITRESULT {
00214 HITRESULT_Nowhere = 0x0001,
00215 HITRESULT_OnItemIcon = 0x0002,
00216 HITRESULT_OnItemText = 0x0004,
00217 HITRESULT_OnItemIndent = 0x0008,
00218 HITRESULT_OnItemButton = 0x0010,
00219 HITRESULT_OnItemRight = 0x0020,
00220 HITRESULT_OnItemStateIcon = 0x0040,
00221 HITRESULT_OnItem = (HITRESULT_OnItemIcon | HITRESULT_OnItemText | HITRESULT_OnItemStateIcon)
00222 };
00223
00224 #if !defined(GENERATING_DOXYGEN_OUTPUT)
00225 class PRIV;
00226 #endif
00227
00230 class ITEMINFO {
00231 public:
00232
00234 ITEMINFO (
00235 );
00236
00237
00238 ITEMINFO (
00239 ITEMHND itemhnd,
00240 ID id
00241 );
00242
00244 explicit ITEMINFO (
00245 const MISTRING& text,
00246 ID id = 0
00247 );
00248
00250 ~ITEMINFO (
00251 );
00252
00254 CHILDPRESENCE GetChildPresence (
00255 ) const { return (m_ChildPresence); }
00256
00258 ITEMHND GetHandle (
00259 ) const { return (m_itemhnd); }
00260
00262 int GetHeightMult (
00263 ) const { return (m_HeightMult); }
00264
00266 ID GetID (
00267 ) const { return (m_id); }
00268
00270 int GetImageNormal (
00271 ) const { return (m_ImageNormal); }
00272
00275 int GetImagePrimary (
00276 ) const { return ((m_status & ITEMSTATUS_Selected) ? GetImageSelected() : GetImageNormal()); }
00277
00279 int GetImageSelected (
00280 ) const { return ((m_ImageSelected == -2) ? m_ImageNormal : m_ImageSelected); }
00281
00284 int GetImageState (
00285 ) const { return (m_ImageState); }
00286
00288 ITEMSTATUS GetStatus (
00289 ) const { return (m_status); }
00290
00292 ITEMSTYLE GetStyle (
00293 ) const { return (m_style); }
00294
00297 const MISTRING& GetText (
00298 ) const { return (m_text); }
00299
00301 ITEMVALUES GetValidValues (
00302 ) const { return (static_cast<ITEMVALUES>(m_ValidValues)); }
00303
00305 void Set (
00306 const ITEMINFO& iteminfo
00307 );
00308
00311 void SetBold (
00312 bool bold = true
00313 );
00314
00317 void SetChildPresence (
00318 CHILDPRESENCE ChildPresence
00319 ) { m_ValidValues |= ITEMVALUE_ChildPresence; m_ChildPresence = ChildPresence; }
00320
00323 void SetHeightMult (
00324 int HeightMult
00325 ) { m_ValidValues |= ITEMVALUE_HeightMult; m_HeightMult = HeightMult; }
00326
00328 void SetID (
00329 ID id
00330 ) { m_ValidValues |= ITEMVALUE_ID; m_id = id; }
00331
00333 void SetImageNormal (
00334 int IdxNormal
00335 );
00336
00338 void SetImageSelected (
00339 int IdxSelected
00340 );
00341
00343 void SetImageState (
00344 unsigned int IdxState
00345 ) { m_ValidValues |= ITEMVALUE_ImageState; m_ImageState = (IdxState < 16) ? IdxState : 0; }
00346
00349 void SetRetainImages (
00350 );
00351
00354 void SetRetainText (
00355 );
00356
00358 void SetStatus (
00359 ITEMSTATUS status
00360 ) { m_ValidValues |= ITEMVALUE_Status; m_status = status; }
00361
00364 void SetStyle (
00365 ITEMSTYLE style
00366 ) { m_ValidValues |= ITEMVALUE_Style; m_style = style; }
00367
00369 void SetText (
00370 const MISTRING& text
00371 ) { m_ValidValues |= ITEMVALUE_Text; m_text = text; }
00372
00373 #ifndef GENERATING_DOXYGEN_OUTPUT
00374
00375 void SetHandle (
00376 ITEMHND itemhnd
00377 ) { m_itemhnd = itemhnd; }
00378 #endif
00379
00380 private:
00381 #ifndef GENERATING_DOXYGEN_OUTPUT
00382 unsigned int m_ValidValues;
00383 ITEMHND m_itemhnd;
00384 ID m_id;
00385 ITEMSTATUS m_status;
00386 ITEMSTYLE m_style;
00387 CHILDPRESENCE m_ChildPresence;
00388 MISTRING m_text;
00389 int m_HeightMult;
00390 int m_ImageNormal;
00391 int m_ImageSelected;
00392 int m_ImageState;
00393
00394 friend class TREE;
00395 #endif // GENERATING_DOXYGEN_OUTPUT
00396 };
00397
00401 typedef fastdelegate::FastDelegate<bool(ITEMHND, HITRESULT, const LPOINT2D&, MGUI::POINTERBUTTON, MGUI::KEYSTATE)> DELEGATE_ONPOINTER;
00402
00407 typedef fastdelegate::FastDelegate<bool(ITEMHND, HITRESULT, const LPOINT2D&, MGUI::KEYSTATE)> DELEGATE_ONMOUSE;
00408
00410 typedef fastdelegate::FastDelegate<void(ITEMHND, HITRESULT, const LPOINT2D&, MGUI::KEYSTATE, MGUI::KEYCODE)> DELEGATE_ONKEY;
00411
00413 typedef fastdelegate::FastDelegate<bool(ITEMHND, HITRESULT, const LPOINT2D&, MGUI::CTRL_TOOLTIP&)> DELEGATE_ONTOOLTIPREQUEST;
00414
00416 typedef fastdelegate::FastDelegate<void(ITEMHND, CHILDVISIBILITY)> DELEGATE_ONCHILDVISIBILITYCHANGED;
00417
00421 typedef fastdelegate::FastDelegate<bool(ITEMHND, CHILDVISIBILITY)> DELEGATE_ONCHILDVISIBILITYCHANGING;
00422
00424 typedef fastdelegate::FastDelegate<MGUI::CUSTOMDRAW::RETVALUE(CUSTOMDRAW_TREE&)> DELEGATE_ONCUSTOMDRAW;
00425
00429 typedef fastdelegate::FastDelegate<void(ITEMHND)> DELEGATE_ONITEM;
00430
00432 typedef fastdelegate::FastDelegate<void(ITEMINFO&)> DELEGATE_ONPREINSERTITEM;
00434 typedef fastdelegate::FastDelegate<void(CTRL_TREE::ITEMVALUES, CTRL_TREE::ITEMINFO&)> DELEGATE_ONGETITEMINFO;
00435
00439 typedef fastdelegate::FastDelegate<void(CTRL_TREE::ITEMVALUES, const CTRL_TREE::ITEMINFO&)> DELEGATE_ONSETITEMINFO;
00440
00442 CTRL_TREE (
00443 );
00444
00446 ~CTRL_TREE ();
00447
00449 void Create (
00450 MGUI::LAYOUT_PANE_BASE& ParentPane,
00451 int height = 20,
00452 int width = 40,
00453 CTRLSTYLE style = CTRLSTYLE_Default,
00454 MGUI::LAYOUT_SIZEALIGN sizealign = MGUI::LAYOUT_SIZEALIGN_Expand
00455 );
00456
00458 void DeleteChildren (
00459 ITEMHND hndParent
00460 );
00461
00463 void DeleteItem (
00464 ITEMHND hndItem
00465 );
00466
00468 void DrawItem (
00469 ITEMHND hndItem,
00470 bool erase = true
00471 );
00472
00474 void EnsureVisible (
00475 ITEMHND hndItem,
00476 bool ScrollToShow = true
00477 );
00478
00480 ITEMHND FindChildByID (
00481 ITEMHND hndParent,
00482 ID id,
00483 bool recursive = false
00484 ) const;
00485
00487 ITEMHND FindItem (
00488 FIND find,
00489 ITEMHND hndItem = ITEMHND_None
00490 ) const;
00491
00495 int GetBaseItemHeight (
00496 ) const;
00497
00499 CHILDPRESENCE GetChildPresence (
00500 ITEMHND hndItem
00501 ) const;
00502
00504 ITEMHND GetFirstChild (
00505 ITEMHND hndParent
00506 ) const { return (FindItem(FIND_FirstChild,hndParent)); }
00507
00509 ID GetItemID (
00510 ITEMHND hndItem
00511 ) const;
00512
00514 void GetItemInfo (
00515 ITEMHND hndItem,
00516 ITEMVALUES ItemValues,
00517 ITEMINFO& ItemInfo
00518 ) const;
00519
00521 ITEMSTATUS GetItemStatus (
00522 ITEMHND hndItem
00523 ) const;
00524
00526 ITEMHND GetNextSibling (
00527 ITEMHND hndItem
00528 ) const { return (FindItem(FIND_NextSibling,hndItem)); }
00529
00531 ITEMHND GetParent (
00532 ITEMHND hndChild
00533 ) const { return (FindItem(FIND_Parent,hndChild)); }
00534
00537 ITEMHND GetSelectedItem (
00538 ) const { return (FindItem(FIND_Selected)); }
00539
00542 ITEMHND InsertItem (
00543 ITEMHND hndParent,
00544 ITEMHND hndInsertAfter,
00545 const MISTRING text,
00546 ID id = 0
00547 );
00548
00551 ITEMHND InsertItem (
00552 ITEMHND hndParent,
00553 ITEMHND hndInsertAfter,
00554 ITEMINFO& ItemInfo
00555 );
00556
00558 bool IsRedrawDisabled (
00559 ) const;
00560
00562 void Redraw (
00563 bool erase = true
00564 );
00565
00567 void RedrawDisable (
00568 );
00569
00572 void RedrawEnable (
00573 );
00574
00576 void SetAutoSelectOnClick (
00577 bool AutoSelectOnClick
00578 );
00579
00581 void SetBackgroundColor (
00582 const COLOR& color
00583 );
00584
00587 void SetBaseItemHeight (
00588 int baseheight
00589 );
00590
00592 void SetChildVisibility (
00593 ITEMHND hndParent,
00594 CHILDVISIBILITY visibility
00595 );
00596
00598 void SetDelegateOnChildVisibilityChanged(DELEGATE_ONCHILDVISIBILITYCHANGED);
00599
00603 void SetDelegateOnChildVisibilityChanging(DELEGATE_ONCHILDVISIBILITYCHANGING);
00604
00606 void SetDelegateOnCustomDraw(DELEGATE_ONCUSTOMDRAW);
00607
00608 void SetDelegateOnDestroyItem (DELEGATE_ONITEM);
00609
00611 void SetDelegateOnGetItemInfo (DELEGATE_ONGETITEMINFO);
00612
00613 void SetDelegateOnItemChangePosition (
00614 DELEGATE_ONITEM delegate
00615 ) { m_DelegateOnItemChangePosition = delegate; }
00616
00617 void SetDelegateOnItemDeselected (
00618 DELEGATE_ONITEM delegate
00619 ) { m_DelegateOnItemDeselected = delegate; }
00620
00621 void SetDelegateOnItemSelected (
00622 DELEGATE_ONITEM delegate
00623 ) { m_DelegateOnItemSelected = delegate; }
00624
00626 void SetDelegateOnKeyPress(DELEGATE_ONKEY);
00627
00630 void SetDelegateOnLeftButtonDoubleClick(DELEGATE_ONMOUSE);
00631
00634 void SetDelegateOnPointerButtonDown (
00635 DELEGATE_ONPOINTER delegate
00636 ) { m_DelegateOnPointerButtonDown = delegate; }
00637
00640 void SetDelegateOnPointerButtonUp (
00641 DELEGATE_ONPOINTER delegate
00642 ) { m_DelegateOnPointerButtonUp = delegate; }
00643
00644 void SetDelegateOnPreInsertItem (DELEGATE_ONPREINSERTITEM);
00645
00649 void SetDelegateOnSetItemInfo (DELEGATE_ONSETITEMINFO);
00650
00652 void SetDelegateOnSize (DELEGATE_ONSIZE delegate);
00653
00655 void SetDelegateOnToolTipRequest (DELEGATE_ONTOOLTIPREQUEST);
00656
00659 void SetImageList (
00660 IMAGELIST& ImageList,
00661 IMAGETYPE ImageType
00662 );
00663
00665 void SetItemBold (
00666 ITEMHND hndItem,
00667 bool bold
00668 );
00669
00671 void SetItemImageNormal (
00672 ITEMHND hndItem,
00673 int IdxNormal
00674 );
00675
00677 void SetItemImageState (
00678 ITEMHND hndItem,
00679 unsigned int IdxState
00680 );
00681
00683 void SetItemInfo (
00684 ITEMHND hndItem,
00685 const ITEMINFO& ItemInfo
00686 );
00687
00689 void SetItemInfo (
00690 const ITEMINFO& ItemInfo
00691 ) { SetItemInfo(ItemInfo.GetHandle(),ItemInfo); }
00692
00694 void SetItemPosition (
00695 ITEMHND hndItem,
00696 ITEMHND hndInsertAfter
00697 );
00698
00700 void SetItemText (
00701 ITEMHND hndItem,
00702 const MISTRING& text
00703 );
00704
00706 void SetLineColor (
00707 const COLOR& color
00708 );
00709
00711 void SetSelectedItem (
00712 ITEMHND hndItem
00713 );
00714
00715 protected:
00716
00719 ITEMHND HitTest (
00720 const LPOINT2D& point,
00721 HITRESULT *pHitResult = 0
00722 ) const;
00723
00727 virtual void v_OnItemChangePosition (
00728 ITEMHND hndItem
00729 );
00730
00733 virtual void v_OnLeftButtonDown (
00734 ITEMHND hndItem,
00735 HITRESULT HitResult,
00736 const LPOINT2D& point,
00737 KEYSTATE keystate
00738 );
00739
00742 virtual void v_OnLeftButtonUp (
00743 ITEMHND hndItem,
00744 HITRESULT HitResult,
00745 const LPOINT2D& point,
00746 KEYSTATE keystate
00747 );
00748
00751 virtual void v_OnPointerButtonDown (
00752 ITEMHND hndItem,
00753 HITRESULT HitResult,
00754 const LPOINT2D& point,
00755 POINTERBUTTON button,
00756 KEYSTATE keystate
00757 );
00758
00761 virtual void v_OnPointerButtonUp (
00762 ITEMHND hndItem,
00763 HITRESULT HitResult,
00764 const LPOINT2D& point,
00765 POINTERBUTTON button,
00766 KEYSTATE keystate
00767 );
00768
00771 virtual void v_OnRightButtonDown (
00772 ITEMHND hndItem,
00773 HITRESULT HitResult,
00774 const LPOINT2D& point,
00775 KEYSTATE keystate
00776 );
00777
00780 virtual void v_OnRightButtonUp (
00781 ITEMHND hndItem,
00782 HITRESULT HitResult,
00783 const LPOINT2D& point,
00784 KEYSTATE keystate
00785 );
00786
00792 virtual bool v_OnToolTipRequest (
00793 ITEMHND hndItem,
00794 HITRESULT HitResult,
00795 const LPOINT2D& point,
00796 MGUI::CTRL_TOOLTIP& ToolTipCtrl
00797 );
00798
00799 private:
00800 #ifndef GENERATING_DOXYGEN_OUTPUT
00801
00802 PRIV *m_pPriv;
00803 DELEGATE_ONPOINTER m_DelegateOnPointerButtonDown;
00804 DELEGATE_ONPOINTER m_DelegateOnPointerButtonUp;
00805 DELEGATE_ONITEM m_DelegateOnItemChangePosition;
00806 DELEGATE_ONITEM m_DelegateOnItemDeselected;
00807 DELEGATE_ONITEM m_DelegateOnItemSelected;
00808
00809 void NotifyPointerButtonPress (ITEMHND hnditem, HITRESULT HitResult, const LPOINT2D& point, POINTERBUTTON button, KEYSTATE keystate);
00810 void NotifyPointerButtonRelease (ITEMHND hnditem, HITRESULT HitResult, const LPOINT2D& point, POINTERBUTTON button, KEYSTATE keystate);
00811
00812 CTRL_TREE (const CTRL_TREE&);
00813 CTRL_TREE& operator= (const CTRL_TREE&);
00814 #endif // GENERATING_DOXYGEN_OUTPUT
00815
00816
00817
00819 virtual void v_OnChildVisibilityChanged (
00820 ITEMHND hndItem,
00821 CHILDVISIBILITY visibility
00822 );
00823
00827 virtual bool v_OnChildVisibilityChanging (
00828 ITEMHND hndItem,
00829 CHILDVISIBILITY visibility
00830 );
00831
00833 virtual void v_OnCreateEnd (
00834 );
00835
00838 virtual MGUI::CUSTOMDRAW::RETVALUE v_OnCustomDraw (
00839 CUSTOMDRAW_TREE& CustomDraw
00840 );
00841
00843 virtual void v_OnDestroyItem (
00844 ITEMHND hndItem
00845 );
00846
00848 virtual void v_OnGetItemInfo (
00849 ITEMVALUES RequestedValue,
00850 ITEMINFO& ItemInfo
00851 );
00852
00855 virtual void v_OnItemDeselected (
00856 ITEMHND hndItem
00857 );
00858
00861 virtual void v_OnItemSelected (
00862 ITEMHND hndItem
00863 );
00864
00866 virtual void v_OnPreInsertItem (
00867 ITEMINFO& ItemInfo
00868 );
00869
00872 virtual void v_OnSetItemInfo (
00873 ITEMVALUES ChangedValue,
00874 const ITEMINFO& ItemInfo
00875 );
00876
00877 };
00878
00879 #ifndef GENERATING_DOXYGEN_OUTPUT
00880 DEFINE_ENUM_OP_BITWISE(CTRL_TREE::CTRLSTYLE)
00881 DEFINE_ENUM_OP_BITWISE(CTRL_TREE::ITEMSTYLE)
00882 DEFINE_ENUM_OP_BITWISE(CTRL_TREE::ITEMSTATUS)
00883 DEFINE_ENUM_OP_BITWISE(CTRL_TREE::ITEMVALUES)
00884 #endif
00885
00887 class CUSTOMDRAW_TREE : public MGUI::CUSTOMDRAW {
00888 public:
00890 CUSTOMDRAW_TREE ();
00892 ~CUSTOMDRAW_TREE ();
00894 CTRL_TREE::ITEMHND GetItemHnd (
00895 ) const;
00897 MGD::PIXEL GetBackgroundPixel (
00898 ) const { return (m_PixelBG); }
00901 int GetLevel (
00902 ) const { return (m_level); }
00904 MGD::PIXEL GetTextPixel (
00905 ) const { return (m_PixelText); }
00907 void SetBackgroundColor (
00908 const COLOR& color
00909 );
00911 void SetBackgroundPixel (
00912 MGD::PIXEL pixel
00913 ) { m_PixelBG = pixel; }
00915 void SetTextColor (
00916 const COLOR& color
00917 );
00919 void SetTextPixel (
00920 MGD::PIXEL pixel
00921 ) { m_PixelText = pixel; }
00922 private:
00923 #ifndef GENERATING_DOXYGEN_OUTPUT
00924 MGD::PIXEL m_PixelBG;
00925 MGD::PIXEL m_PixelText;
00926 int m_level;
00927 CUSTOMDRAW_TREE (
00928 DRAWSTAGE drawstage,
00929 const LRECT2D& rect
00930 );
00931 void SetupItem (
00932 const CTRL_TREE::ITEMINFO& iteminfo,
00933 const LRECT2D& rect,
00934 int level,
00935 MGD::CONTEXT *pDC
00936 );
00937 friend class CTRL_TREE::PRIV;
00938 #endif // GENERATING_DOXYGEN_OUTPUT
00939 };
00940
00941 }
00942
00943 #endif