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