Click here to Skip to main content
15,891,841 members
Articles / Desktop Programming / ATL

Visual Studio Favorites

Rate me:
Please Sign up or sign in to vote.
2.00/5 (3 votes)
16 Mar 20033 min read 52.7K   710   14  
Add shortcuts, favorites, and more to Visual Studio.
//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_

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
I work when you don't. Sleep is for wussies.

The answer is no, whatever the question is. You can't have it, you don't need it, and you'd just break it in five minutes if I give it to you anyways.

If you're interested, my web site is at NOPcode.com and has lots of cool stuff with programming and a one-of-a-kind Audio Server.

Comments and Discussions