00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 #ifndef INC_MI32_GRTREE_H
00137 #define INC_MI32_GRTREE_H
00138
00139 #if !defined(INC_MI32_XDEFNS_H) && defined(X_NATIVE)
00140 #include <mi32/xdefns.h>
00141 #endif
00142
00143 #ifndef INC_MI32_MCB_H
00144 #include <mi32/mcb.h>
00145 #endif
00146
00147 #ifndef INC_MI32_POINT_H
00148 #include <mi32/point.h>
00149 #endif
00150
00151 #ifndef INC_MI32_RECT_H
00152 #include <mi32/rect.h>
00153 #endif
00154
00155 #if !defined(INC_MI32_MGD2_H)
00156 #include <mi32/mgd2.h>
00157 #endif
00158
00159 #ifndef GENERATING_DOXYGEN_OUTPUT
00160 const int GTREEHASHSIZE = 37;
00161 #endif
00162
00163
00164 class GRAPHICTREE {
00165 public:
00166
00167
00168 enum FLAGS {
00169 FirstAtTop = 0x00000000,
00170 FirstAtBottom = 0x00000001,
00171 NoScrollHorizontal = 0x00000002,
00172 AllowChildSelection = 0x00000004,
00173 AllowChildReorder = 0x00000008,
00174 IncludeExpandIcons = 0x00000010,
00175 ItemMayHaveChildren = 0x00000020,
00176 SingleSelectionOnly = 0x00000040,
00177 ChildrenHidden = 0x00000080
00178 };
00179
00180
00181 class ITEM {
00182 public:
00183
00184
00185 class MSG {
00186 public:
00187
00188
00189 enum MSGTYPE {
00190 NoMessage = 0,
00191 Draw,
00192 PointerMotion,
00193 ButtonPressed,
00194 ButtonReleased,
00195 ButtonMotion,
00196 KeyPressed,
00197 KeyReleased,
00198 RequestSize,
00199 Deselected,
00200 Selected,
00201 PositionChanged,
00202 Deleting,
00203 RequestToolTip,
00204 ButtonDoubleClick,
00205 ShowChildren,
00206 HideChildren
00207 };
00208
00209
00210 enum MSGPROC {
00211 Ignored = 0,
00212 Normal = 1,
00213 Reset = 2,
00214 PopupMenu
00215 };
00216
00217 enum BTNKEY {
00218 ButtonLeft = 0x01,
00219 ButtonMiddle = 0x02,
00220 ButtonRight = 0x04,
00221 Shift = 0x10,
00222 Control = 0x20
00223 };
00224
00225 MSGTYPE type;
00226 void *Reference;
00227 void *PrivPtr;
00228 UINT32 RefIndex;
00229 LPOINT2D origin;
00230 LPOINT2D pointer;
00231 MSGPROC proc;
00232 BTNKEY state;
00233 BTNKEY button;
00234 UNICODE key;
00235 LRECT2D drawrect;
00236 MGD::CONTEXT* gc;
00237 UINT32 VisibleWidth;
00238 LPOINT2D size;
00239 UNICODE *tooltip;
00240 #ifdef X_NATIVE
00241 Widget popupmenu;
00242 #endif
00243 GRAPHICTREE* tree;
00244
00245
00246 MSG (
00247 ) {
00248 memset(this, 0, sizeof(MSG));
00249 }
00250
00251
00252 ITEM* GetItem (
00253 ) const { return (m_item); }
00254
00255 private:
00256 #ifndef GENERATING_DOXYGEN_OUTPUT
00257 ITEM *m_item;
00258 #endif // GENERATING_DOXYGEN_OUTPUT
00259 friend class ITEM;
00260 };
00261
00262
00263
00264 ITEM* GetFirstChild (
00265 ) const { return (FirstChild); }
00266
00267
00268
00269 ITEM* GetNextSibling (
00270 ) const { return (NextSibling); }
00271
00272
00273
00274 ITEM* GetParent (
00275 ) const { return (Parent); }
00276
00277
00278 void* GetPrivPtr (
00279 ) const { return (m_PrivPtr); }
00280
00281
00282 UINT32 GetRefIndex (
00283 ) const { return (RefIndex); }
00284
00285
00286 void* GetRefPointer (
00287 ) const { return (Reference); }
00288
00289
00290
00291 ITEM* GetSelectedChild (
00292 ) const { return (ActiveChild); }
00293
00294
00295
00296 GRAPHICTREE& GetTree (
00297 ) const { return (m_tree); };
00298
00299
00300 bool IsRoot (
00301 ) const { return (Parent == 0); }
00302
00303
00304 void SetChildrenVisible (
00305 bool visible = true,
00306 bool redraw = true
00307 );
00308
00309
00310 void SetChildSpacing (
00311 UINT8 p_Spacing
00312 ) { Spacing = p_Spacing; SetTotalSizeInvalid(); return; }
00313
00314
00315
00316 void SetMayHaveChildren (
00317 bool p_MayHaveChildren = true
00318 ) { MayHaveChildren = p_MayHaveChildren; }
00319
00320
00321 void SetPrivPtr (
00322 void *PrivPtr
00323 ) { m_PrivPtr = PrivPtr; }
00324
00325 private:
00326 #ifndef GENERATING_DOXYGEN_OUTPUT
00327 GRAPHICTREE& m_tree;
00328 void *Reference;
00329 void *m_PrivPtr;
00330 UINT32 RefIndex;
00331 void (*HandleMsg)(MSG*);
00332 LPOINT2D TopLeft;
00333 LPOINT2D ItemSize;
00334 LPOINT2D TotalSize;
00335 UINT8 Visible;
00336 UINT8 ChildrenVisible;
00337 UINT8 Hidden;
00338 UINT8 ItemSizeValid;
00339 UINT8 TotalSizeValid;
00340 UINT8 FirstChildAtBottom;
00341 UINT8 AllowChildSelection;
00342 UINT8 AllowChildReorder;
00343 UINT8 MayHaveChildren;
00344 UINT8 MarginTop;
00345 UINT8 MarginBottom;
00346 UINT8 MarginLeft;
00347 UINT8 MarginRight;
00348 UINT8 Spacing;
00349 ITEM *Parent;
00350 ITEM *NextSibling;
00351 ITEM *FirstChild;
00352 ITEM *ActiveChild;
00353 ITEM *NextHash;
00354
00355 ITEM (
00356 GRAPHICTREE& tree
00357 );
00358
00359 ITEM (
00360 ITEM *parent,
00361 void *ItemRef,
00362 UINT32 RefIndex,
00363 void (*HandleMsg)(MSG*),
00364 FLAGS flags
00365 );
00366
00367 ~ITEM (
00368 );
00369
00370 int GetPosition (
00371 );
00372
00373 void Initialize (
00374 );
00375
00376 void Insert (
00377 int
00378 );
00379
00380 void Remove (
00381 );
00382
00383 void SendMsg (
00384 MSG& msg,
00385 MSG::MSGTYPE msgtype=MSG::NoMessage
00386 );
00387
00388 void SendMsg (
00389 MSG::MSGTYPE msgtype
00390 );
00391
00392 void SetTotalSizeInvalid (
00393 );
00394
00395 friend class GRAPHICTREE;
00396 #endif // GENERATING_DOXYGEN_OUTPUT
00397 };
00398
00399 #ifdef X_NATIVE
00400
00401 GRAPHICTREE (
00402 Widget parent,
00403 const char *sizefield,
00404 Arg *arglist,
00405 int argcount,
00406 FLAGS flags = FirstAtTop
00407 );
00408 #endif
00409
00410 ~GRAPHICTREE ();
00411
00412
00413 void DeleteChildren (
00414 void *ParentReference,
00415 UINT32 ParentRefIndex,
00416 bool redraw = true
00417 );
00418
00419
00420
00421 ITEM* FindItemByRef (
00422 const void *RefPointer,
00423 UINT32 RefIndex
00424 ) const;
00425
00426
00427 void *GetActiveChild (
00428 void *ParentReference,
00429 UINT32 ParentRefIndex
00430 );
00431
00432
00433
00434 ITEM* GetActiveItem (
00435 ) const { return (m_ActiveItem); }
00436
00437 #ifdef X_NATIVE
00438
00439 Widget GetDrawingArea (
00440 ) const {
00441 return (m_da);
00442 }
00443 #endif
00444
00445 void *GetFirstItem (
00446 void *ParentReference,
00447 UINT32 ParentRefIndex
00448 ) const;
00449
00450
00451 void *GetNextItem (
00452 void *ItemReference,
00453 UINT32 ItemRefIndex
00454 ) const;
00455
00456 void *GetParentItem (
00457 void *ItemReference,
00458 UINT32 ItemRefIndex
00459 ) const;
00460
00461 void * GetPrivData (
00462 ) const {
00463 return (m_PrivPtr);
00464 }
00465
00466 const ITEM* GetRootItem (
00467 ) const { return (&m_Root); }
00468
00469 #ifdef X_NATIVE
00470
00471 Widget GetWidget (
00472 ) const {
00473 return (XtParent(m_da));
00474 }
00475 #endif
00476
00477
00478 ITEM* ItemAdd (
00479 void *ParentReference,
00480 UINT32 ParentRefIndex,
00481 void *ItemReference,
00482 UINT32 ItemRefIndex,
00483 void (*MsgHandler)(ITEM::MSG*),
00484 int position,
00485 FLAGS flags = FirstAtTop
00486 );
00487
00488
00489
00490 ITEM* ItemAdd (
00491 void *ItemReference,
00492 UINT32 ItemRefIndex,
00493 void (*MsgHandler)(ITEM::MSG*),
00494 int position,
00495 FLAGS flags = FirstAtTop
00496 ) {
00497 return (ItemAdd(NULL,0,ItemReference,ItemRefIndex,MsgHandler,position,flags));
00498 }
00499
00500
00501 bool ItemAreChildrenVisible (
00502 void *ItemReference,
00503 UINT32 ItemRefIndex
00504 );
00505
00506
00507 bool ItemDelete (
00508 void *ItemReference,
00509 UINT32 ItemRefIndex,
00510 bool redraw = true
00511 );
00512
00513
00514 bool ItemExists (
00515 void *ItemReference,
00516 UINT32 ItemRefIndex
00517 ) {
00518 return (FindItemByRef(ItemReference,ItemRefIndex) != NULL);
00519 }
00520
00521
00522 int ItemGetPosition (
00523 void *ItemReference,
00524 UINT32 ItemRefIndex
00525 );
00526
00527
00528 void* ItemGetPrivPtr (
00529 void *ItemReference,
00530 UINT32 ItemRefIndex
00531 ) {
00532 if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) return (item->GetPrivPtr());
00533 return (NULL);
00534 }
00535
00536
00537 bool ItemIsVisible (
00538 void *ItemReference,
00539 UINT32 ItemRefIndex
00540 );
00541
00542
00543 void ItemNotifyChanged (
00544 void *ItemReference,
00545 UINT32 ItemRefIndex,
00546 bool redraw = true
00547 );
00548
00549
00550 void ItemRedraw (
00551 void *ItemReference,
00552 UINT32 ItemRefIndex
00553 );
00554
00555
00556 void ItemSetChildMarginBottom (
00557 void *ItemReference,
00558 UINT32 ItemRefIndex,
00559 UINT8 Margin
00560 ) {
00561 if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) {
00562 item->MarginBottom = Margin;
00563 item->SetTotalSizeInvalid();
00564 }
00565 return;
00566 }
00567
00568
00569 void ItemSetChildMarginLeft (
00570 void *ItemReference,
00571 UINT32 ItemRefIndex,
00572 UINT8 Margin
00573 ) {
00574 if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) {
00575 item->MarginLeft = Margin;
00576 item->SetTotalSizeInvalid();
00577 }
00578 return;
00579 }
00580
00581
00582 void ItemSetChildMarginRight (
00583 void *ItemReference,
00584 UINT32 ItemRefIndex,
00585 UINT8 Margin
00586 ) {
00587 if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) {
00588 item->MarginRight = Margin;
00589 item->SetTotalSizeInvalid();
00590 }
00591 return;
00592 }
00593
00594
00595 void ItemSetChildMarginTop (
00596 void *ItemReference,
00597 UINT32 ItemRefIndex,
00598 UINT8 Margin
00599 ) {
00600 if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) {
00601 item->MarginTop = Margin;
00602 item->SetTotalSizeInvalid();
00603 }
00604 return;
00605 }
00606
00607
00608 void ItemSetChildSpacing (
00609 void *ItemReference,
00610 UINT32 ItemRefIndex,
00611 UINT8 Spacing
00612 ) {
00613 if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) {
00614 item->SetChildSpacing(Spacing);
00615 }
00616 return;
00617 }
00618
00619
00620 void ItemSetChildrenVisible (
00621 void *ItemReference,
00622 UINT32 ItemRefIndex,
00623 bool visible,
00624 bool redraw = true
00625 );
00626
00627
00628 void ItemSetPosition (
00629 void *ItemReference,
00630 UINT32 ItemRefIndex,
00631 int position,
00632 bool redraw = true
00633 );
00634
00635
00636 void ItemSetPrivPtr (
00637 void *ItemReference,
00638 UINT32 ItemRefIndex,
00639 void *PrivPtr
00640 ) { if (ITEM *item = FindItemByRef(ItemReference,ItemRefIndex)) item->SetPrivPtr(PrivPtr); }
00641
00642
00643 void ItemSetVisible (
00644 void *ItemReference,
00645 UINT32 ItemRefIndex,
00646 bool visible,
00647 bool redraw = true
00648 );
00649
00650
00651 void NotifyChanged (
00652 bool redraw = true
00653 ) { ItemNotifyChanged(NULL,0,redraw); }
00654
00655
00656 void Redraw (
00657 LRECT2D *rect=0
00658 );
00659
00660
00661 void RedrawDisable (
00662 ) { m_DisableRedraw = 1; }
00663
00664
00665 void RedrawEnable (
00666 bool redraw = true
00667 ) { m_DisableRedraw = 0; if (redraw) Redraw(); }
00668
00669
00670 void ScrollToItem (
00671 ITEM *item
00672 );
00673
00674
00675 void SetActiveChild (
00676 void *ParentReference,
00677 UINT32 ParentRefIndex,
00678 void *ItemReference,
00679 UINT32 ItemRefIndex
00680 );
00681
00682
00683 inline void SetActiveChild (
00684 void *ParentReference,
00685 void *ItemReference
00686 ) {
00687 SetActiveChild(ParentReference,0,ItemReference,0);
00688 return;
00689 };
00690
00691
00692 void SetActiveItem (
00693 ITEM* item
00694 );
00695
00696 inline void SetPrivData (
00697 void *data
00698 ) {
00699 m_PrivPtr = data;
00700 return;
00701 }
00702
00703 private:
00704 #ifndef GENERATING_DOXYGEN_OUTPUT
00705
00706 mutable ITEM *m_TraversalItem;
00707 ITEM *m_HashItem[GTREEHASHSIZE];
00708 ITEM *m_CursorItem;
00709 ITEM *m_DragParent;
00710 ITEM *m_DragInsertItem;
00711 ITEM *m_ActiveItem;
00712 LPOINT2D m_CursorPos;
00713 LPOINT2D m_DrawSize;
00714 LPOINT2D m_TopLeft;
00715 LRECT2D m_DrawClipRect;
00716 UINT8 m_NeedRedraw;
00717 UINT8 m_DoingRedraw;
00718 UINT8 m_DisableRedraw;
00719 UINT8 m_UpdateSB;
00720 UINT8 m_ToolTipVisible;
00721 UINT8 m_DoingReorder;
00722 bool m_IncludeExpandIcon;
00723 bool m_SingleSelection;
00724 MGD::DEVICE* m_sdisp;
00725 MGD::CONTEXT* m_sgc;
00726 MPIXEL m_BackgroundPixel;
00727 MPIXEL m_HighlightPixel;
00728 #ifdef X_NATIVE
00729 Widget m_da;
00730 Widget m_hsb;
00731 Widget m_vsb;
00732 void *m_ToolTipHandle;
00733 #endif
00734 ITEM m_Root;
00735 void *m_PrivPtr;
00736 #ifdef X_NATIVE
00737 DOUBLECLICKTEST m_DoubleClickTest;
00738 LPOINT2D m_ToolTipPos;
00739 #endif
00740
00741
00742 void BeginReorder ();
00743 void ComputeHiddenStatus (ITEM*);
00744 void ComputeItemSizePos (ITEM*, INT32, bool);
00745 void DeleteChildren (ITEM*);
00746 void DeleteItem (ITEM*);
00747 void DrawHighlight (ITEM*, bool);
00748 void DrawInsertionIndicator (bool show, bool autoscroll=false);
00749 void DrawItem (ITEM*, INT32, INT32);
00750 void EndReorder ();
00751 ITEM * FindItemByCoord (ITEM*, int, int) const;
00752 void NotifyChanged (ITEM*);
00753 void SetActiveChild (ITEM*);
00754 void UpdateSize ();
00755
00756 #ifdef X_NATIVE
00757
00758 static void CB_Destroy (Widget, GRAPHICTREE*, void*);
00759 static void CB_Expose (Widget, GRAPHICTREE*, void*);
00760 static void CB_Resize (Widget, GRAPHICTREE*, void*);
00761 static void CB_ScrollH (Widget, GRAPHICTREE*, void*);
00762 static void CB_ScrollV (Widget, GRAPHICTREE*, void*);
00763 static void CBT_ToolTipPopup (GRAPHICTREE*, XtIntervalId*);
00764 static void EH_Input (Widget, GRAPHICTREE*, XEvent*, Boolean*);
00765 static void EH_GraphicsExpose (Widget, GRAPHICTREE*, XEvent*, Boolean*);
00766
00767
00768 XtIntervalId m_IntervalID;
00769
00770 MXXTCB_ADD(GRAPHICTREE);
00771 MXXTEH_ADD(GRAPHICTREE);
00772 MXXTTO_ADD(GRAPHICTREE);
00773 MXXTCB_REMOVE(GRAPHICTREE);
00774 MXXTEH_REMOVE(GRAPHICTREE);
00775
00776 class EVENTSENTRY;
00777 friend class EVENTSENTRY;
00778 #endif
00779
00780 friend class GRAPHICTREE::ITEM;
00781 #endif
00782 };
00783
00784 DEFINE_ENUM_OPERATORS(GRAPHICTREE::FLAGS)
00785
00786 typedef GRAPHICTREE::ITEM::MSG GRAPHICTREEITEM_MSG;
00787 typedef void (*GraphicTreeItemMsgHandler)(GRAPHICTREE::ITEM::MSG*);
00788
00789 #endif