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