2025-11-27 16:46:48 +09:00

723 lines
22 KiB
C++

// ==========================================================================
// 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 <afxtempl.h>
// 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 <COXTreeSubItem*,COXTreeSubItem*> 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