//ConfigTree.h : Declaration of the CConfigTree
#ifndef __CONFIGTREE_H_
#define __CONFIGTREE_H_
#include <commctrl.h>
#include "ConfigurationFile.h"
/////////////////////////////////////////////////////////////////////////////
// CConfigTree
class CConfigTree : public CWindowImpl<CConfigTree>, public CConfigurationFile
{
public:
// DECLARE_WND_SUPERCLASS(NULL, WC_TREEVIEW)
BEGIN_MSG_MAP(CConfigTree)
MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUP)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
END_MSG_MAP()
// Handler prototypes:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
CConfigTree();
virtual ~CConfigTree();
// From CConfigurationFile
public:
virtual void Load();
IXMLDOMElement *GetItemXmlPtr(const HTREEITEM item);
void UpdateItem(const HTREEITEM item,IXMLDOMElement *pElm,const ITEM_TYPES itemType);
void BeginDrag(NMTREEVIEW *pTV);
void GetDispInfo(TVITEM *pItem);
void EraseDropInsertTargetBar();
void DrawDropInsertTargetBar();
void DeleteCurrentSelection();
void AddEmptyItem(const bool autoSelect,const ITEM_TYPES newType = IT_FILE);
void InsertFolder(const bool autoSelect);
void DuplicateCurrentSelection(const bool autoSelect);
LPSTR GetElmText(IXMLDOMElement *pElm, char *pBuffer);
protected:
virtual bool AddItem(IXMLDOMElement *pElm,const ITEM_TYPES itemType);
virtual bool PostAddFolderItem(IXMLDOMElement *pElm,const bool fHadChildren);
virtual void RecursiveLoad(IXMLDOMNode *pChildNode);
void HighlightDropTarget(const HTREEITEM hitItem);
void KillScrollTimer()
{
if (m_nScrollTimerNum!=0)
{
KillTimer(m_nScrollTimerNum);
m_nScrollTimerNum=0;
}
}
LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnLButtonUP(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
public:
// Generic inline tree view functions
HTREEITEM GetFirstVisibleItem() const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0);
}
HTREEITEM GetRootItem() const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0);
}
HTREEITEM GetCurrentSelectedItem() const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0);
}
HTREEITEM GetParentOfItem(const HTREEITEM item) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)item);
}
HTREEITEM GetPreviousSiblingOfItem(const HTREEITEM item) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)item);
}
HTREEITEM GetNextSiblingOfItem(const HTREEITEM item) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)item);
}
HTREEITEM GetPreviousVisualBeforeItem(const HTREEITEM item) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)item);
}
HTREEITEM GetNextVisualAfterItem(const HTREEITEM item) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)item);
}
HTREEITEM GetFirstChildItem(const HTREEITEM item) const
{
ATLASSERT(::IsWindow(m_hWnd));
return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)item);
}
UINT GetItemState(const HTREEITEM hItem,const UINT nStateMask) const
{
ATLASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_STATE;
item.stateMask = nStateMask;
item.state = 0;
::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
return item.state;
}
bool ItemHasChildren(const HTREEITEM hItem) const
{
ATLASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.hItem = hItem;
item.mask = TVIF_CHILDREN;
::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
return (item.cChildren>0);
}
bool IsItemExpanded(const HTREEITEM hItem) const
{
ATLASSERT(::IsWindow(m_hWnd));
return ((GetItemState (hItem, TVIS_EXPANDED) & TVIS_EXPANDED)!=0);
}
bool CanItemBeExpanded(const HTREEITEM hItem) const
{
return (hItem != NULL && ItemHasChildren (hItem) && !IsItemExpanded (hItem));
}
void SetCurrentSelectedItem(const HTREEITEM hItem)
{
ATLASSERT(::IsWindow(m_hWnd));
SendMessage(TVM_SELECTITEM,TVGN_CARET,(LPARAM)hItem);
}
// Data
protected:
HIMAGELIST m_hImageList;
HIMAGELIST m_hDragImageList;
int m_imageListHeight,m_imageListWidth;
SIZE m_menuIconSize;
bool m_fIsDragging;
RECT m_dragTargetLine,m_prevDragTargetLine;
HTREEITEM m_dragTargetItem;
HTREEITEM m_dragSourceItem;
bool m_fInsertBeforeTarget; // if true, before; if false, after.
bool m_fNoDropTarget; // if true, then overtop of source.
HTREEITEM m_hLoadingOnly_ParentItem;
HTREEITEM m_hLoadingOnly_LastFolder;
HTREEITEM m_hLastAddedItem;
int m_nScrollMarginTop,m_nScrollMarginBottom;
UINT m_nScrollDelayInterval;
UINT m_nScrollTimerInterval;
UINT m_nScrollTimerNum;
public:
CComPtr<IXMLDOMDocument> m_pUndoXmlDoc; // previous results.
};
#endif //__CONFIGTREE_H_