// ========================================================================== // Class Specification : // COXTreeSubItem & COXTreeItem // ========================================================================== // Header file : COXTreeItem.h // Version: 9.3 // This software along with its related components, documentation and files ("The Libraries") // is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is // governed by a software license agreement ("Agreement"). Copies of the Agreement are // available at The Code Project (www.codeproject.com), as part of the package you downloaded // to obtain this file, or directly from our office. For a copy of the license governing // this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900. // ////////////////////////////////////////////////////////////////////////// #ifndef _COXTreeItem_H #define _COXTreeItem_H #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #include "OXDllExt.h" #include // subitem flags // flags specifies which subitem options are set, can be // any combination of the next: // OX_SUBITEM_IMAGE - there is image associated // with the subitem // OX_SUBITEM_FONT - there is font set to be used // to draw the subitem // OX_SUBITEM_COLOR - there is color set to be used // to draw the subitem text // OX_SUBITEM_TEXT - there is text set to be used // as the subitem text #define OX_SUBITEM_IMAGE 1 #define OX_SUBITEM_FONT 2 #define OX_SUBITEM_COLOR 4 #define OX_SUBITEM_TEXT 8 #define OX_SUBITEM_BGCOLOR 16 // tree item edit mode flags #define OXET_EDIT 0 #define OXET_COMBO 1 #define OXET_CALENDAR 2 #define OXET_NOEDIT 3 struct COXTreeSubItem { CString sItem; int nCol; UINT uFlags; UINT nImage; UINT m_nEllipsisFormat; CStringArray m_saTextEx; UINT m_uEditMode; CFont m_font; COLORREF m_clr; COLORREF m_clrBackground; // --- In : nColumn - number of column in the tree control // lpszItem - text to be used as the subitem's text // --- Out : // --- Returns: // --- Effect : constructors COXTreeSubItem():nCol(-1),uFlags(0),m_uEditMode(OXET_EDIT), m_clr(::GetSysColor(COLOR_WINDOWTEXT)), m_clrBackground(::GetSysColor(COLOR_WINDOW)), m_nEllipsisFormat(DT_END_ELLIPSIS){}; COXTreeSubItem(int nColumn):nCol(nColumn),uFlags(0),m_uEditMode(OXET_EDIT), m_clr(::GetSysColor(COLOR_WINDOWTEXT)), m_clrBackground(::GetSysColor(COLOR_WINDOW)), m_nEllipsisFormat(DT_END_ELLIPSIS) {}; COXTreeSubItem(int nColumn,LPCTSTR lpszItem):nCol(nColumn),sItem(lpszItem), nImage(0),m_uEditMode(OXET_EDIT),uFlags(0), m_clr(::GetSysColor(COLOR_WINDOWTEXT)), m_clrBackground(::GetSysColor(COLOR_WINDOW)), m_nEllipsisFormat(DT_END_ELLIPSIS) {}; // assignment operator COXTreeSubItem& operator=(const COXTreeSubItem& xtsi); public: // --- In : // --- Out : // --- Returns: TRUE if there is image associated with the subitem // --- Effect : inline BOOL HasImage() const { return (BOOL)(uFlags & OX_SUBITEM_IMAGE);} // --- In : // --- Out : // --- Returns: TRUE if there is font associated with the subitem text // --- Effect : inline BOOL HasFont() const { return (BOOL)(uFlags & OX_SUBITEM_FONT);} // --- In : // --- Out : // --- Returns: TRUE if there is color associated with the subitem text // --- Effect : inline BOOL HasColor() const { return (BOOL)(uFlags & OX_SUBITEM_COLOR);} // --- In : // --- Out : // --- Returns: TRUE if there is color associated with the subitem text // --- Effect : inline BOOL HasBackColor() const { return (BOOL)(uFlags & OX_SUBITEM_BGCOLOR);} // --- In : saTextEx - extended strings depending of edit mode: // array of strings that is used to fill combo box // (OXET_COMBO) // or to define min and max date for calendar control // (OXET_CALENDAR), // if OXET_EDIT is used than this array is ignored // --- Out : // --- Returns: // --- Effect : void SetTextEx(CStringArray& saText); // --- In : // --- Out : // --- Returns: array of strings using in extended edit modes // as following: // if EditMode is OXET_COMBO this array contain strings to fill // in-place combobox // if EditMode is OXET_CALENDAR this array contain min and max dates // available to pick up throuth in-place date // picker (COXTreeCal class) // --- Effect: CStringArray& GetTextEx(); // --- In : // --- Out : // --- Returns: edit mode code as following: // OXET_EDIT - plain edit // OXET_COMBO - in-place combobox // OXET_CALENDAR - in-place calendar (date picker) // OXET_NOEDIT - editing is not allowed // --- Effect : UINT GetEditMode() const; // --- In : uMode - edit mode code as following: // OXET_EDIT - plain edit // OXET_COMBO - in-place combobox // OXET_CALENDAR - in-place calendar (date picker) // OXET_NOEDIT - editing is not allowed // saTextEx - extended strings depending of edit mode: // array of strings that is used to fill combo box // (OXET_COMBO) // or to define min and max date for calendar control // (OXET_CALENDAR), // if OXET_EDIT or OXET_NOEDIT is used than // this array is ignored // --- Out : // --- Returns: // --- Effect : set the subitem's edit mode void SetEditMode(UINT uMode,CStringArray& saTextEx); // --- In: clr - color for the subitem // --- Out : // --- Returns: // --- Effect : set color for the subitem void SetColor(COLORREF clr); // --- In: clr - color for the subitem's background // --- Out : // --- Returns: // --- Effect : set color for the subitem's background void SetBackColor(COLORREF clr); // --- In : nEllipsisFormat - ellipsis format used to draw the subitem, // can be one of: // // DT_END_ELLIPSIS Replaces the end of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_PATH_ELLIPSIS Replaces the middle of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_WORD_ELLIPSIS the same as // DT_END_ELLIPSIS // --- Out : // --- Returns: // --- Effect : set ellipsis format used when the subitem is being drawn void SetDrawEllipsis(UINT nEllipsisFormat); // --- In : // --- Out : // --- Returns: ellipsis format used to draw the subitem, can be one of: // // DT_END_ELLIPSIS Replaces the end of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_PATH_ELLIPSIS Replaces the middle of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_WORD_ELLIPSIS the same as // DT_END_ELLIPSIS // --- Effect : get ellipsis format used when the subitem is being drawn inline UINT GetDrawEllipsis() const { return m_nEllipsisFormat; } // --- In : pFont - specifies the new font for drawing the subitem // --- Out : // --- Returns: // --- Effect : set font to tree item BOOL SetFont(CFont *pFont); }; class COXTreeCtrl;//forward declaration class OX_CLASS_DECL COXTreeItem { friend class COXTreeCtrl; public: CFont m_font; COLORREF m_clr; COLORREF m_clrBackground; TV_ITEM m_tvi; UINT m_nEllipsisFormat; public: // --- In : lpszItem - text to be used as the item's text // --- Out : // --- Returns: // --- Effect : constructors COXTreeItem(); COXTreeItem(LPCTSTR lpszItem); // --- In : // --- Out : // --- Returns: // --- Effect : destructor virtual ~COXTreeItem(); // Copy constructor COXTreeItem& operator=(const COXTreeItem& xti); // --- In : saTextEx - extended strings depending of edit mode: // array of strings that is used to fill combo box // (OXET_COMBO) // or to define min and max date for calendar control // (OXET_CALENDAR), // if OXET_EDIT is used than this array is ignored // nCol - column number // --- Out : // --- Returns: // --- Effect : void SetTextEx(CStringArray& saText,int nCol=0); // --- In : nCol - column number // --- Out : // --- Returns: array of strings using in extended edit modes // as following: // if EditMode is OXET_COMBO this array contain strings to fill // in-place combobox // if EditMode is OXET_CALENDAR this array contain min and max dates // available to pick up throuth in-place date // picker (COXTreeCal class) // --- Effect: CStringArray& GetTextEx(int nCol=0); // --- In : nCol - column number // --- Out : // --- Returns: edit mode code as following: // OXET_EDIT - plain edit // OXET_COMBO - in-place combobox // OXET_CALENDAR - in-place calendar (date picker) // --- Effect : UINT GetEditMode(int nCol=0) const; // --- In : uMode - edit mode code as following: // OXET_EDIT - plain edit // OXET_COMBO - in-place combobox // OXET_CALENDAR - in-place calendar (date picker) // saTextEx - extended strings depending of edit mode: // array of strings that is used to fill combo box // (OXET_COMBO) // or to define min and max date for calendar control // (OXET_CALENDAR), // if OXET_EDIT is used than this array is ignored // nCol - column number // --- Out : // --- Returns: // --- Effect : set the item's edit mode void SetEditMode(UINT uMode,CStringArray& saTextExt,int nCol=0); // --- In : // --- Out : // --- Returns: TRUE if the item is disabled, or FALSE otherwise // --- Effect : BOOL IsDisabled() const; // --- In : bDisable - if TRUE if then the item will be disabled, // otherwise it will be enabled // --- Out : // --- Returns: // --- Effect : disable or enable the item void SetDisabled(BOOL bDisable=TRUE); // --- In : nCol - column number // --- Out : // --- Returns: pointer to the font used to draw the subitem text in the // specified nCol column // --- Effect : CFont* GetItemFont(int nCol=0); // --- In : pFont - specifies the new font for drawing the subitem in the // specified nCol column // nCol - column number // --- Out : // --- Returns: // --- Effect : set font to tree subitem BOOL SetFont(int nCol,CFont * pFont); // --- In : nCol - column number // --- Out : // --- Returns: TRUE if there is font associated with the subitem text in the // specified nCol column // --- Effect : BOOL HasFont(int nCol) const; // --- In : nCol - column number // --- Out : // --- Returns: color used to draw the subitem text in the // specified nCol column // --- Effect : COLORREF GetItemColor(int nCol = 0) const; // --- In : nCol - column number // --- Out : // --- Returns: color used to draw the subitem's background in the // specified nCol column // --- Effect : COLORREF GetItemBackColor(int nCol = 0) const; // --- In : clr - specifies the new color for drawing the subitem text // in the specified nCol column // --- Out : // --- Returns: // --- Effect : set color to tree subitem void SetColor(COLORREF clr); // --- In : clr - specifies the new color for drawing the subitem background // in the specified nCol column // --- Out : // --- Returns: // --- Effect : set color to tree subitem void SetBackColor(COLORREF clr); // --- In : nCol - column number // --- Out : // --- Returns: TRUE if there is specific color associated with the subitem text // in the specified nCol column // --- Effect : BOOL HasColor(int nCol=0) const; // --- In : nCol - column number // --- Out : // --- Returns: TRUE if there is specific color associated with the subitem background // in the specified nCol column // --- Effect : BOOL HasBackColor(int nCol=0) const; // --- In : nCol - column number // --- Out : // --- Returns: ellipsis format used to draw the specified subitem, can be one of: // // DT_END_ELLIPSIS Replaces the end of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_PATH_ELLIPSIS Replaces the middle of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_WORD_ELLIPSIS the same as // DT_END_ELLIPSIS // --- Effect : get ellipsis format used when the subitem is being drawn UINT GetDrawEllipsis(int nCol = 0) const; // --- In : nEllipsisFormat - ellipsis format used to draw the specified // subitem, can be one of: // // DT_END_ELLIPSIS Replaces the end of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_PATH_ELLIPSIS Replaces the middle of the // item text with ellipses, // if necessary, so that the // result fits in the item // rectangle // DT_WORD_ELLIPSIS the same as // DT_END_ELLIPSIS // --- Out : // --- Returns: // --- Effect : set ellipsis format used when the specified subitem is being drawn void SetDrawEllipsis(UINT nEllipsisFormat, int nCol=0); // --- In : // --- Out : // --- Returns: TRUE if the button with plus or minus sign should be drawn before // the item, or FALSE otherwise // --- Effect : BOOL NeedDrawButton() const; // --- In : // --- Out : // --- Returns: TRUE if the item is visible, or FALSE otherwise // --- Effect : BOOL IsVisible() const; // --- In : // --- Out : // --- Returns: pointer to the previous item in the tree, or NULL if the item // is the first one in the tree // --- Effect : COXTreeItem* GetPrevInTree(); // --- In : // --- Out : // --- Returns: pointer to the next item in the tree, or NULL if the item // is the last one in the tree // --- Effect : COXTreeItem* GetNextInTree(); // --- In : bHidden - if TRUE then item will be hidden, or unhidden otherwise // --- Out : // --- Returns: // --- Effect : hide or unhide the item void SetHidden(BOOL bHidden=TRUE); // --- In : // --- Out : // --- Returns: TRUE if the item is hidden, or FALSAE otherwise // --- Effect : BOOL IsHidden() const; // --- In : // --- Out : // --- Returns: TRUE if the item is last unhidden item in the tree, // or FALSAE otherwise // --- Effect : BOOL IsLastUnhidden() const; // --- In : nCol - column number (more than zero) // --- Out : // --- Returns: index for image associated with the specified subitem // --- Effect : int GetSubItemImage(int nCol) const; // --- In : nCol - column number // bSelImg - if TRUE then the index of selected image will be returned. // --- Out : // --- Returns: index for selected or normal image associated with the // specified subitem // --- Effect : int GetItemImage(int nCol = 0, BOOL bSelImg = FALSE) const; // --- In : nCol - column number (more than zero) // --- Out : // --- Returns: text associated with the specified subitem // --- Effect : LPCTSTR GetSubItemText(int nCol) const; // --- In : nCol - column number (more than zero) // lpszText - text to be set to the specified subitem // --- Out : // --- Returns: TRUE if success, or FALSE otherwise // --- Effect : BOOL SetSubItemText(LPCTSTR lpszText,int nCol = 0); // --- In : nCol - column number (more than zero) // --- Out : // --- Returns: pointer to the subitem // --- Effect : COXTreeSubItem* GetSubItem(int nCol) const; // --- In : nCol - column number (more than zero) // uFlags - one or more of following: // OX_SUBITEM_IMAGE - nImage parameter is valid // OX_SUBITEM_FONT - pFont parameter is valid // OX_SUBITEM_COLOR - clr parameter is valid // OX_SUBITEM_BGCOLOR - clrBack parameter is valid // OX_SUBITEM_TEXT - lpszText parameter is valid // subitem attributes // lpszText - text // nImage - image // pFont - font // clr - color // --- Out : // --- Returns: TRUE if success, or FALSE otherwise // --- Effect : set specified attributes for subitem BOOL SetSubItem(int nCol, UINT uMask, LPCTSTR lpszText, int nImage=0, CFont* pFont=NULL, COLORREF clr=0, COLORREF clrBack = 0); // --- In : // --- Out : // --- Returns: TRUE if item has children, or FALSE otherwise // --- Effect : BOOL ItemHasChildren() const; // --- In : // --- Out : // --- Returns: the number of children // --- Effect : UINT GetChildrenCount() const; // --- In : // --- Out : // --- Returns: the item's level, where top items have 0 level // --- Effect : int GetItemLevel() const; // --- In : nCode - A flag indicating the type of action to be taken. // This flag can have one of the following values: // TVE_COLLAPSE - Collapses the list. // TVE_COLLAPSERESET - Collapses the list and removes // the child items. // TVE_EXPAND - Expands the list. // TVE_TOGGLE - Collapses the list if it is // currently expanded or expands it // if it is currently collapsed. // pCtrl - pointer to corresponding tree control // --- Out : // --- Returns: TRUE if success, or FALSE otherwise // --- Effect : set specified attributes for subitem BOOL Expand(UINT nCode, COXTreeCtrl *pCtrl); // --- In : // --- Out : // --- Returns: TRUE if item is expanded, or FALSE otherwise // --- Effect : inline BOOL IsExpanded() const { return m_bExpand; } // --- In : // --- Out : // --- Returns: TRUE if item's list of child items has been expanded at least once // --- Effect : Not implemented, always returns FALSE inline BOOL IsExpandedOnce() const { return m_bExpandedOnce; } // --- In : // --- Out : // --- Returns: number of subitems // --- Effect : int GetSubitemsCount() const; // --- In : bExpand - specifies whether will be set being expanded or not // --- Out : // --- Returns: // --- Effect : set/unset item being expanded. inline void SetExpand(BOOL bExpand=TRUE) { m_bExpand = bExpand; if(m_bExpand) m_bExpandedOnce=TRUE; } // --- In : pNewChild - pointer to the new item // pInsAfter - pointer to the item to insert after // --- Out : // --- Returns: // --- Effect : add new child item void AddChild(COXTreeItem *pNewChild,COXTreeItem *pInsAfter=NULL); // --- In : pChildToCopy - pointer to the item to copy // pInsAfter - pointer to the item to insert after // bCopyDescendants- if TRUE then all pChildToCopy descendants // will be copied too // --- Out : // --- Returns: // --- Effect : make copy of tree item and its descendants COXTreeItem* CopyChild(COXTreeItem* pChildToCopy, COXTreeItem* pInsAfter=NULL, BOOL bCopyDescendants=TRUE); // --- In : // --- Out : // --- Returns: pointer to the last child, or NULL if there is no child // --- Effect : COXTreeItem* GetLastChild(); // --- In : // --- Out : // --- Returns: // --- Effect : remove item from the inner tree structure void Unlink(); // --- In : // --- Out : // --- Returns: // --- Effect : delete all children void DeleteChildren(); // --- In : nCol - column that identifies subitem // --- Out : // --- Returns: TRUE on success; FALSE otherwise // --- Effect : delete subitem in the specified column BOOL DeleteSubitem(int nCol); // --- In : lpszItem - text of the new item // bAscending - if TRUE then tree control is sorted ascendingly, // or FALSE if tree control is sorted descendingly // --- Out : // --- Returns: pointer to the to insert new item after // --- Effect : COXTreeItem* FindItemToInsertAfter(LPCTSTR lpszItem, BOOL bAscending=TRUE) const; // nCol - number of column // bAscending - sort direction (TRUE - ascending, // FALSE - descending) // bOnlyChildren sort only direct children of the item // lpfnCompare - if it's NULL then items will be compared using // string comparison, otherwise it is the // pointer to an application-defined comparison // function. It is called during a sort // operation each time the relative order of // two tree items needs to be compared. The // comparison function has the following form: // // int CALLBACK CompareFunc(LPARAM lParam1, // LPARAM lParam2, // LPARAM lParamSort); // // The comparison function must return a // negative value if the first item should // precede the second, a positive value if the // first item should follow the second, or // zero if the two items are equivalent. The // lParam1 and lParam2 parameters correspond // to the lParam member of the TV_ITEM // structure for the two items being compared. // The lParamSort parameter corresponds to the // lParam argument of the SortChildren function. // lParam - parameter that will be sent to lpfnCompare // as lParamSort argument BOOL SortChildren(int nCol=0, BOOL bOnlyChildren=TRUE, BOOL bAscending=TRUE, PFNTVCOMPARE lpfnCompare=NULL, LPARAM lParam=NULL); // --- In : xti - pointer to the item to compare to // nCol - number of column to make comparison // bAscending - sort direction (TRUE - ascending, // FALSE - descending) // --- Out : // --- Returns: TRUE if the item is "more" than xti // --- Effect : BOOL Compare(COXTreeItem* xti, int nCol=0, BOOL bAscending=TRUE); // --- In : xti - pointer to the item to change position with // --- Out : // --- Returns: // --- Effect : swap items void Swap(COXTreeItem* xti); protected: enum { XTIS_VISIBLE=1,XTIS_DISABLED=2,XTIS_HASCOLOR=4,XTIS_HASFONT=8,XTIS_HASBGCOLOR=16}; DWORD dwStateEx; BOOL m_bExpand; BOOL m_bExpandedOnce; COXTreeItem* pxParent; COXTreeItem* pxNext; COXTreeItem *pxPrev; COXTreeItem *pxFirstChild; CArray m_Items; CStringArray m_saTextEx; UINT m_uEditMode; int GetChildOffset(COXTreeItem *pChild,BOOL bCalcHidden=FALSE); void Exp(COXTreeCtrl *pCtrl); void RemoveChildrenFromCtrl(COXTreeCtrl *pCtrl); int AddChildrenToCtrl(COXTreeCtrl *pCtrl,int startPos); BOOL IsAnyParentCollapsed(); // Returns TRUE if there is at least one collapsed parent }; #endif // _COXTreeItem_H