windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/diconfig/flextree.h
2020-09-26 16:20:57 +08:00

298 lines
8 KiB
C++

//-----------------------------------------------------------------------------
// File: flextree.h
//
// Desc: Implements a tree class, similar to a Windows tree control,
// based on CFlexWnd. It is used by the page to display the action
// list when the user wishes to assign an action to a control.
//
// Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------
#ifndef __FLEXTREE_H__
#define __FLEXTREE_H__
#include "flexscrollbar.h"
class CFTItem;
class CFlexTree;
typedef struct {
CFlexTree *pTree;
CFTItem *pItem, *pOldItem;
POINT point;
HDC hDC;
WPARAM fwKeys;
BOOL bLeft;
} FLEXTREENOTIFY;
enum {
FTN_CLICK,
FTN_OWNERDRAW,
FTN_SELCHANGED,
FTN_MOUSEOVER
};
enum {
CLMF_NONE = 0x00000000,
CLMF_TEXTCOLOR = 0x00000001,
CLMF_BKCOLOR = 0x00000002,
CLMF_BKMODE = 0x00000004,
CLMF_BKEXTENDS = 0x00000008,
CLMF_FONT = 0x00000010,
CLMF_LINECOLOR = 0x00000020,
CLMF_ALL = 0x0000003f
};
struct _CAPTIONLOOK;
typedef struct _CAPTIONLOOK {
_CAPTIONLOOK() : dwSize(sizeof(_CAPTIONLOOK)), dwMask(CLMF_NONE),
rgbTextColor(RGB(0,0,0)), rgbBkColor(RGB(255,255,255)), rgbLineColor(RGB(255,0,0)), nBkMode(TRANSPARENT),
bBkExtends(FALSE), hFont(NULL) {}
DWORD dwSize;
DWORD dwMask;
COLORREF rgbTextColor, rgbBkColor, rgbLineColor, nBkMode;
BOOL bBkExtends;
HFONT hFont;
} CAPTIONLOOK;
typedef enum {
ATTACH_FIRSTCHILD,
ATTACH_LASTCHILD,
ATTACH_FIRSTSIBLING,
ATTACH_LASTSIBLING,
ATTACH_BEFORE,
ATTACH_AFTER
} ATTACHREL;
class CFlexTree : public CFlexWnd
{
friend class CFTItem;
public:
CFlexTree();
~CFlexTree();
// creation
BOOL Create(HWND hParent, const RECT &, BOOL bVisible = TRUE, BOOL bOwnerDraw = FALSE);
// look
void SetScrollBarColors(COLORREF bk, COLORREF fill, COLORREF line);
void SetDefCaptionLook(const CAPTIONLOOK &, BOOL bSel = FALSE);
void GetDefCaptionLook(CAPTIONLOOK &, BOOL bSel = FALSE) const;
void SetDefMargin(const RECT &);
void GetDefMargin(RECT &) const;
void SetRootChildIndent(int);
int GetRootChildIndent() const;
void SetDefChildIndent(int);
int GetDefChildIndent() const;
void SetBkColor(COLORREF);
COLORREF GetBkColor() const;
// adding default type items
CFTItem *DefAddItem(LPCTSTR tszCaption, CFTItem *to, ATTACHREL rel = ATTACH_AFTER);
CFTItem *DefAddItem(LPCTSTR tszCaption, ATTACHREL rel = ATTACH_AFTER);
// freeing
void FreeAll();
// root access
operator CFTItem *() const {return m_pRoot;}
CFTItem *GetRoot() const {return m_pRoot;}
// access
CFTItem *GetFirstItem() const;
CFTItem *GetLastItem() const;
CFTItem *GetFirstVisibleItem() const;
CFTItem *GetItemFromPoint(POINT point) const;
// selection
void SetCurSel(CFTItem *);
CFTItem *GetCurSel() const;
// finding
CFTItem *FindItem(const GUID &guid, void *pUserData) const;
CFTItem *FindItemEx(const GUID &guid, DWORD dwFindType, void *pVoid) const;
protected:
virtual BOOL OnEraseBkgnd(HDC hDC) {return TRUE;}
virtual void OnPaint(HDC hDC);
virtual void OnMouseOver(POINT point, WPARAM fwKeys);
virtual void OnClick(POINT point, WPARAM fwKeys, BOOL bLeft);
virtual void OnWheel(POINT point, WPARAM wParam);
virtual LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
// event notification firing
void FireClick(CFTItem *pItem, POINT point, WPARAM fwKeys, BOOL bLeft);
BOOL FireOwnerDraw(CFTItem *pItem, HDC hDC);
void FireSelChanged(CFTItem *pItem, CFTItem *pOld);
private:
CFTItem *m_pRoot; // root item
CFTItem *m_pCurSel; // selected item
CFTItem *m_pLastAdded;
BOOL m_bOwnerDraw;
POINT m_ptScrollOrigin;
COLORREF m_rgbBkColor;
CAPTIONLOOK m_clDefNormal, m_clDefSelected;
RECT m_defmargin;
int m_nDefChildIndent;
// scrolling
int m_nVertSBWidth;
int m_nHorzSBHeight;
BOOL m_bVertSB, m_bHorzSB;
CFlexScrollBar m_VertSB, m_HorzSB;
int m_nTotalWidth;
// helpers
BOOL m_bNeedPaintBkgnd;
void SetDirty();
void InternalPaint(HDC hDC);
BOOL m_bDirty;
void Calc();
void CalcItems();
BOOL IsMine(CFTItem *pItem);
void LosePointer(CFTItem *pItem);
};
class CFTItem
{
friend class CFlexTree;
public:
CFTItem();
~CFTItem();
// operations
BOOL IsOut() const;
BOOL IsExpanded() const {return m_bExpanded;}
void Expand(BOOL bAll = FALSE);
void ExpandAll() {Expand(TRUE);}
void Collapse(BOOL bAll = FALSE);
void CollapseAll() {Collapse(TRUE);}
void EnsureVisible();
void Invalidate();
// caption
void SetCaptionLook(const CAPTIONLOOK &, BOOL bSel = FALSE);
void GetCaptionLook(CAPTIONLOOK &, BOOL bSel = FALSE) const;
void SetCaption(LPCTSTR);
LPCTSTR GetCaption() const;
BOOL HasCaption() const {return GetCaption() != NULL;}
void SetMargin(const RECT &);
void GetMargin(RECT &) const;
// attach/detachment
void Detach(); // detaches this leaf/branch from parent. (does not affect children, who may still be attached to this)
void FreeChildren(); // detach and free each child (which in turn frees all their's, etc.)
BOOL Attach(CFTItem *to, ATTACHREL rel);
BOOL Attach(CFTItem &to, ATTACHREL rel) {return Attach(&to, rel);}
BOOL IsOnTree() const;
BOOL IsAttached() const;
BOOL IsAlone() const;
// family access
CFlexTree *GetTree() const {return m_pTree;}
CFTItem *GetParent() const {return m_pParent;}
CFTItem *GetPrevSibling() const {return m_pPrev;}
CFTItem *GetNextSibling() const {return m_pNext;}
CFTItem *GetFirstChild() const {return m_pFirst;}
CFTItem *GetLastChild() const {return m_pLast;}
CFTItem *GetNextOut() const;
CFTItem *GetNext(BOOL bOutOnly = FALSE) const;
BOOL HasChildren() const {return m_pFirst != NULL;}
// dimension access
void GetItemRect(RECT &) const;
void GetBranchRect(RECT &) const;
// user guid/data operations
BOOL IsUserGUID(const GUID &check) const {return IsEqualGUID(m_UserGUID, check);}
void SetUserGUID(const GUID &set) {m_UserGUID = set;}
const GUID &GetUserGUID() const {return m_UserGUID;}
void SetUserData(void *p) {m_pUserData = p;}
void *GetUserData() const {return m_pUserData;}
// selection
BOOL IsSelected() const;
// owner draw
void PaintInto(HDC hDC);
protected:
// internal/derived-customization operations
void SetWidth(int);
int GetWidth() const {return m_nWidth;}
void SetHeight(int);
int GetHeight() const {return m_nHeight;}
void SetIndent(int);
int GetIndent() const {return m_nIndent;}
void SetChildIndent(int);
int GetChildIndent() const {return m_nChildIndent;}
// customization
virtual void OnPaint(HDC hDC);
virtual void OnMouseOver(POINT point, WPARAM fwKeys) {}
virtual void OnClick(POINT point, WPARAM fwKeys, BOOL bLeft);
// expansion customization
public: virtual BOOL IsExpandable() {return GetFirstChild() != NULL;}
protected:
virtual void OnExpand() {}
virtual void OnCollapse() {}
// finding
virtual BOOL FoundItem(DWORD dwUser, void *pUser) const {return FALSE;}
// event notification firing
void FireClick(POINT point, WPARAM fwKeys, BOOL bLeft);
BOOL FireOwnerDraw(HDC hDC);
private:
// caption
LPTSTR m_ptszCaption;
CAPTIONLOOK m_clNormal, m_clSelected;
RECT m_margin;
// user data
GUID m_UserGUID;
void *m_pUserData;
// raw characteristics
int m_nWidth; // item's width (used only to provide horizontal scrolling as necessary)
int m_nHeight; // item's height (not including children)
int m_nIndent; // indent of this item relative to parent's child indent origin (full origin = this + parent origin + parent child indent)
int m_nChildIndent; // indentation of this item's children (relative to this's origin)
// calced characteristics
int m_nBranchHeight; // height of item and all currently expanded children
// calced positioning
POINT m_origin; // relative to ideal tree origin
// state
BOOL m_bExpanded; // is branch expanded/children shown?
// family
CFlexTree *m_pTree;
CFTItem *m_pParent, *m_pPrev, *m_pNext, *m_pFirst, *m_pLast;
// root
BOOL IsRoot() const;
void SetRoot(CFlexTree *);
// helpers
void SetTree(CFlexTree *);
BOOL Attach(CFTItem *pParent, CFTItem *pPrev, CFTItem *pNext);
void SetTreeDirty(CFlexTree *pTree = NULL);
void RecalcText();
void Init();
void SelChangedInternal();
void InternalExpand(BOOL bExpand, BOOL bAll);
};
#endif //__FLEXTREE_H__