|
|
//-----------------------------------------------------------------------------
// 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__
|