[commit] r1941 - trunk/GME/GMEActiveBrowser

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Thu Jun 28 14:07:20 CDT 2012


Author: ksmyth
Date: Thu Jun 28 14:07:20 2012
New Revision: 1941

Log:
Refactor towards tree browser icons per-kind

Deleted:
   trunk/GME/GMEActiveBrowser/MgaMap.cpp
Modified:
   trunk/GME/GMEActiveBrowser/ActiveBrowserPropertyPage.cpp
   trunk/GME/GMEActiveBrowser/AggregateContextMenu.cpp
   trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.cpp
   trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.h
   trunk/GME/GMEActiveBrowser/GMEActiveBrowserCtl.cpp
   trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.cpp
   trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.h
   trunk/GME/GMEActiveBrowser/InheritanceTreeCtrl.h
   trunk/GME/GMEActiveBrowser/MetaTreeCtrl.h
   trunk/GME/GMEActiveBrowser/MgaMap.h
   trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.cpp
   trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.h
   trunk/GME/GMEActiveBrowser/MgaObjectProxy.h
   trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.cpp
   trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.h
   trunk/GME/GMEActiveBrowser/TreeCtrlEx.cpp
   trunk/GME/GMEActiveBrowser/TreeCtrlEx.h

Modified: trunk/GME/GMEActiveBrowser/ActiveBrowserPropertyPage.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/ActiveBrowserPropertyPage.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/ActiveBrowserPropertyPage.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -846,7 +846,7 @@
 	for(HTREEITEM hItem=m_TreeAggregate.GetFirstSelectedItem();hItem;
 						hItem=m_TreeAggregate.GetNextSelectedItem(hItem))
 	{
-		CMgaObjectProxy ObjectProxy;
+		CAggregateMgaObjectProxy ObjectProxy;
 		if(m_TreeAggregate.m_MgaMap.LookupObjectProxy(hItem, ObjectProxy))
 		{
 			if ( ObjectProxy.m_TypeInfo == OBJTYPE_MODEL     ||	// FCOs
@@ -931,7 +931,7 @@
 		hItem; 
 		hItem = m_TreeAggregate.GetNextSelectedItem( hItem))
 	{
-		CMgaObjectProxy ObjectProxy;
+		CAggregateMgaObjectProxy ObjectProxy;
 		if( m_TreeAggregate.m_MgaMap.LookupObjectProxy( hItem, ObjectProxy))
 		{
 			if ( ObjectProxy.m_TypeInfo == OBJTYPE_MODEL			// FCOs: connection too
@@ -1148,7 +1148,7 @@
 		hItem; 
 		hItem = m_TreeAggregate.GetNextSelectedItem( hItem))
 	{
-		CMgaObjectProxy ObjectProxy;
+		CAggregateMgaObjectProxy ObjectProxy;
 		if( m_TreeAggregate.m_MgaMap.LookupObjectProxy( hItem, ObjectProxy))
 		{
 			all_containers &= (ObjectProxy.m_TypeInfo == OBJTYPE_MODEL || ObjectProxy.m_TypeInfo == OBJTYPE_FOLDER);
@@ -1299,7 +1299,7 @@
 	for(HTREEITEM hItem=m_TreeAggregate.GetFirstSelectedItem();hItem;
 						hItem=m_TreeAggregate.GetNextSelectedItem(hItem))
 	{
-		CMgaObjectProxy ObjectProxy;
+		CAggregateMgaObjectProxy ObjectProxy;
 		if(m_TreeAggregate.m_MgaMap.LookupObjectProxy(hItem, ObjectProxy))
 		{
 			if(ObjectProxy.m_TypeInfo==OBJTYPE_MODEL||			// FCOs
@@ -3071,7 +3071,7 @@
 	CActiveBrowserPropertySheet* pParent=(CActiveBrowserPropertySheet*)GetParent();
 	
 	// Getting selection from aggregate tree
-	CMgaObjectProxy MgaObjectProxy;
+	CAggregateMgaObjectProxy MgaObjectProxy;
 	
 
 	// condition modified> inheritance tree empty for all folders

Modified: trunk/GME/GMEActiveBrowser/AggregateContextMenu.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/AggregateContextMenu.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/AggregateContextMenu.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -140,7 +140,7 @@
 	{
 		m_pParent->m_bIsBrowserCreatedNewObject=TRUE;
 		HTREEITEM hItem=m_pParent->m_TreeAggregate.GetSelectedItem();
-		CMgaObjectProxy MgaObjectProxy;
+		CAggregateMgaObjectProxy MgaObjectProxy;
 
 		if(m_pParent->m_TreeAggregate.m_MgaMap.LookupObjectProxy(hItem,MgaObjectProxy))
 		{
@@ -616,7 +616,7 @@
 
 
 	HTREEITEM hItem=m_pParent->m_TreeAggregate.GetSelectedItem();
-	CMgaObjectProxy MgaObjectProxy;
+	CAggregateMgaObjectProxy MgaObjectProxy;
 
 	if(m_pParent->m_TreeAggregate.m_MgaMap.LookupObjectProxy(hItem,MgaObjectProxy))
 	{
@@ -733,7 +733,7 @@
 		if( OBJTYPE_FOLDER != MgaObjectProxy.m_TypeInfo) // for folders we already deleted the feature
 		{
 			HTREEITEM hItemsParent = m_pParent->m_TreeAggregate.GetParentItem( hItem);
-			CMgaObjectProxy MgaParentProxy; // if parent is a model, then enable
+			CAggregateMgaObjectProxy MgaParentProxy; // if parent is a model, then enable
 			if(m_pParent->m_TreeAggregate.m_MgaMap.LookupObjectProxy(hItemsParent,MgaParentProxy))
 				EnableMenuItem( ID_POPUP_SHOWINPARENT, OBJTYPE_MODEL == MgaParentProxy.m_TypeInfo?MF_ENABLED:MF_GRAYED);
 		}

Modified: trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -14,6 +14,10 @@
 #define new DEBUG_NEW
 #endif
 
+
+BEGIN_MESSAGE_MAP(CAggregateTreeCtrl, CTreeCtrl)
+	ON_WM_PAINT()
+END_MESSAGE_MAP()
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
@@ -286,7 +290,7 @@
 		
 				if(nItemState!=0xffffffff)
 				{
-					CMgaMappedTreeCtrl::SetItemState(hItem,nItemState);
+					__super::SetItemState(hItem,nItemState);
 				}
 
 			}
@@ -508,7 +512,7 @@
 				{
 					TCHAR* pszEndPtr=NULL;
 					UINT nItemState=_tcstoul(strItemState,&pszEndPtr,10);														
-					CMgaMappedTreeCtrl::SetItemState(hItem,nItemState);
+					__super::SetItemState(hItem,nItemState);
 				}
 			}
 		}
@@ -567,8 +571,8 @@
 			}break;
 		case SORT_BYTYPE:
 			{
-				CMgaObjectProxy MgaObjectProxyItem1;
-				CMgaObjectProxy MgaObjectProxyItem2;
+				CAggregateMgaObjectProxy MgaObjectProxyItem1;
+				CAggregateMgaObjectProxy MgaObjectProxyItem2;
 				if(
 					pTreeCtrl->m_MgaMap.LookupObjectProxy(hItem1,MgaObjectProxyItem1) &&
 					pTreeCtrl->m_MgaMap.LookupObjectProxy(hItem2,MgaObjectProxyItem2))
@@ -605,8 +609,8 @@
 		case SORT_BYCREATION:
 			{
 				
-				CMgaObjectProxy MgaObjectProxyItem1;
-				CMgaObjectProxy MgaObjectProxyItem2;
+				CAggregateMgaObjectProxy MgaObjectProxyItem1;
+				CAggregateMgaObjectProxy MgaObjectProxyItem2;
 
 				if(
 					pTreeCtrl->m_MgaMap.LookupObjectProxy(hItem1,MgaObjectProxyItem1) &&
@@ -725,7 +729,7 @@
 	
 	if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
 	{
-		CMgaObjectProxy ObjectProxy;
+		CAggregateMgaObjectProxy ObjectProxy;
 		if(m_MgaMap.LookupObjectProxy(hItem,ObjectProxy)) // If it is in the map
 		{
 			if(ObjectProxy.m_TypeInfo==OBJTYPE_FOLDER || ObjectProxy.m_TypeInfo==OBJTYPE_MODEL)
@@ -764,7 +768,7 @@
 		hItem = HitTest(point);
 	}
 	
-	CMgaObjectProxy MgaObjectProxy;
+	CAggregateMgaObjectProxy MgaObjectProxy;
 
 	if(hItem==NULL || !m_MgaMap.LookupObjectProxy(hItem,MgaObjectProxy))
 	{
@@ -1222,13 +1226,15 @@
 {
 
 
-	CMgaObjectProxy ObjectProxy;
+	CAggregateMgaObjectProxy ObjectProxy;
 
-	if(!m_MgaMap.LookupObjectProxy(hItem, ObjectProxy))return;
+	if(!m_MgaMap.LookupObjectProxy(hItem, ObjectProxy))
+		return;
 
 	CComQIPtr<IMgaObject> ccpObject(ObjectProxy.m_pMgaObject);
 
-	if(!ccpObject)return; // Not an MgaObject
+	if(!ccpObject)
+		return; // Not an MgaObject
 	
 
 	BYTE cState=0;
@@ -1377,4 +1383,30 @@
 	}
 
 	return retv;
-}
\ No newline at end of file
+}
+
+void CAggregateTreeCtrl::OnPaint()
+{
+	__super::OnPaint();
+
+	CDC* dc = GetDC();
+	CRect rClient;
+	this->GetClientRect( rClient );
+
+	HTREEITEM	hItem = NULL;
+	CRect		rItem;
+	
+	// Get the current top item, if any...
+	hItem = GetFirstVisibleItem();
+
+	// Work through them one at a time...
+	while ( hItem )
+	{
+
+		this->GetItemRect(hItem, rItem, TRUE);
+		rItem += rClient;
+		rItem.left -= 16;
+		//dc->DrawText(L"xx", 2, rItem, DT_LEFT | DT_BOTTOM);
+		hItem = this->GetNextVisibleItem(hItem);
+	}
+}

Modified: trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/AggregateTreeCtrl.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -11,7 +11,14 @@
 
 #include "MgaMappedTreeCtrl.h"
 
-class CAggregateTreeCtrl : public CMgaMappedTreeCtrl  
+struct CAggregateMgaObjectProxy : public CMgaObjectProxy
+{
+	CAggregateMgaObjectProxy() : CMgaObjectProxy() { };
+	CAggregateMgaObjectProxy(LPUNKNOWN pMgaObject, objtype_enum type) : CMgaObjectProxy(pMgaObject, type) {};
+	CAggregateMgaObjectProxy(CMgaObjectProxy& proxy) : CMgaObjectProxy(proxy) {};
+};
+
+class CAggregateTreeCtrl : public CMgaMappedTreeCtrl<CAggregateMgaObjectProxy>
 {
 	friend class CAggregatePropertyPage;
 	friend class CAggregateContextMenu;
@@ -44,6 +51,10 @@
 	CAggregateTreeCtrl();
 	virtual ~CAggregateTreeCtrl();
 
+
+	afx_msg void OnPaint();
+protected:
+	DECLARE_MESSAGE_MAP()
 };
 
 #endif // !defined(AFX_AGGREGATETREECTRL_H__BAA3D537_E504_4801_B793_6F96B703380C__INCLUDED_)

Modified: trunk/GME/GMEActiveBrowser/GMEActiveBrowserCtl.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/GMEActiveBrowserCtl.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/GMEActiveBrowserCtl.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -356,7 +356,7 @@
 	CGMEActiveBrowserApp* pApp=(CGMEActiveBrowserApp*)AfxGetApp();
 	CMgaContext* pMgaContext=&pApp->m_CurrentProject.m_MgaContext;
 
-	CMgaMappedTreeCtrl* pTreeCtrl = &m_pPropFrame->m_pModelessPropSheet->m_PageAggregate.m_TreeAggregate;
+	CMgaMappedTreeCtrlBase* pTreeCtrl = &m_pPropFrame->m_pModelessPropSheet->m_PageAggregate.m_TreeAggregate;
 
 	if( 1 == m_pPropFrame->m_pModelessPropSheet->GetActiveIndex()) // if the INHER tree is active use that tree
 		pTreeCtrl = &m_pPropFrame->m_pModelessPropSheet->m_PageInheritance.m_TreeInheritance;
@@ -375,7 +375,7 @@
 		while(hItem)
 		{
 			LPUNKNOWN pUnknown;
-			pTreeCtrl->m_MgaMap.LookupObjectUnknown(hItem,pUnknown);
+			pTreeCtrl->LookupObjectUnknown(hItem, pUnknown);
 			CComQIPtr<IMgaObject> ccpMgaObject(pUnknown);
 			
 			ASSERT(ccpMgaObject!=NULL);

Modified: trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -20,7 +20,7 @@
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
 
-CGMEActiveBrowserDropTarget::CGMEActiveBrowserDropTarget(CMgaMappedTreeCtrl* pParent)
+CGMEActiveBrowserDropTarget::CGMEActiveBrowserDropTarget(CMgaMappedTreeCtrlBase* pParent)
 {
 	m_pParent=pParent;
 	m_bCreatedDragImageList=FALSE;

Modified: trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/GMEActiveBrowserDropTarget.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -19,7 +19,7 @@
 	} \
 } \
 
-class CMgaMappedTreeCtrl;
+class CMgaMappedTreeCtrlBase;
 
 class CGMEActiveBrowserDropTarget : public COleDropTarget  
 {
@@ -33,11 +33,13 @@
 	void OnDragLeave( CWnd* pWnd );
 	DROPEFFECT OnDragOver( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point );
 	DROPEFFECT OnDragEnter( CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point );
-	CGMEActiveBrowserDropTarget(CMgaMappedTreeCtrl*);
+	CGMEActiveBrowserDropTarget(CMgaMappedTreeCtrlBase*);
 	virtual ~CGMEActiveBrowserDropTarget();
-	CMgaMappedTreeCtrl* m_pParent;
+	CMgaMappedTreeCtrlBase* m_pParent;
 	CComPtr<IMgaEventLogger> m_EventLogger;
 
+private:
+	CGMEActiveBrowserDropTarget(const CGMEActiveBrowserDropTarget&);
 };
 
 #endif // !defined(AFX_GMEACTIVEBROWSERDROPTARGET_H__4A7D8C14_58DA_4785_932F_1BB960E09EF6__INCLUDED_)

Modified: trunk/GME/GMEActiveBrowser/InheritanceTreeCtrl.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/InheritanceTreeCtrl.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/InheritanceTreeCtrl.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -11,7 +11,7 @@
 
 #include "MgaMappedTreeCtrl.h"
 
-class CInheritanceTreeCtrl : public CMgaMappedTreeCtrl  
+class CInheritanceTreeCtrl : public CMgaMappedTreeCtrl<CMgaObjectProxy>
 {
 	friend class CInheritancePropertyPage;
 public:

Modified: trunk/GME/GMEActiveBrowser/MetaTreeCtrl.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/MetaTreeCtrl.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MetaTreeCtrl.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -11,7 +11,7 @@
 
 #include "MgaMappedTreeCtrl.h"
 
-class CMetaTreeCtrl : public CMgaMappedTreeCtrl  
+class CMetaTreeCtrl : public CMgaMappedTreeCtrl<CMgaObjectProxy>
 {
 	friend class CMetaPropertyPage;
 public:

Modified: trunk/GME/GMEActiveBrowser/MgaMap.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaMap.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MgaMap.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -10,40 +10,271 @@
 #endif // _MSC_VER > 1000
 
 
-#include "MgaObjectProxyMapItem.h"
+#include "MgaObjectProxy.h"
 #include "AfxColl.h"
 
-typedef CMap<HTREEITEM,HTREEITEM,LPUNKNOWN,LPUNKNOWN> CMapItem2Object;
-typedef CMap<LPUNKNOWN,LPUNKNOWN,CMgaObjectProxyMapItem*,CMgaObjectProxyMapItem*> CMapObject2Item;
 
 
-class CMgaMap  
+template<class ObjectProxy>
+class CMgaMap
 {
+	class CMgaObjectProxyMapItem : public ObjectProxy
+	{
+	public:
+		CMgaObjectProxyMapItem(LPUNKNOWN pMgaObject, objtype_enum type, HTREEITEM hTreeItem) : ObjectProxy(pMgaObject,type),m_hTreeItem(hTreeItem) {};
+		CMgaObjectProxyMapItem(CMgaObjectProxy& rSourceMgaObjectProxy, HTREEITEM hTreeItem) : ObjectProxy(rSourceMgaObjectProxy),m_hTreeItem(hTreeItem) {};
+		virtual ~CMgaObjectProxyMapItem() {}
+		HTREEITEM m_hTreeItem;
+	};
 public:
+	typedef CMap<HTREEITEM,HTREEITEM,LPUNKNOWN,LPUNKNOWN> CMapItem2Object;
+	typedef CMap<LPUNKNOWN,LPUNKNOWN,CMgaObjectProxyMapItem*,CMgaObjectProxyMapItem*> CMapObject2Item;
 
-	// High level functions for complex operations eg. context menu
-	void AddEntry(HTREEITEM hTreeItem, CMgaObjectProxy ObjectProxy);
-	BOOL RemoveObjectProxy(CMgaObjectProxy MgaObjectProxy);
-	BOOL RemoveTreeItem( HTREEITEM hTreeItem);
-	BOOL SearchTreeItem(BSTR Id, HTREEITEM &hTreeItem, IUnknown* &punk);
-	BOOL LookupTreeItem(CMgaObjectProxy MgaObjectProxy, HTREEITEM& hTreeItem);
-	BOOL LookupTreeItem(LPUNKNOWN pUnknown, HTREEITEM &hTreeItem);
-	BOOL LookupObjectProxy(HTREEITEM hTreeItem,CMgaObjectProxy& rObjectProxy);
+	CMgaMap() {}
+
+	virtual ~CMgaMap() {
+		DestroyMap();
+	}
+
+	void DestroyMap()
+	{
+		// Remove elements from object map and delete the object
+		POSITION pos=m_MapObject2Item.GetStartPosition();
+		CMgaObjectProxyMapItem* pObject;
+		LPUNKNOWN pUnknown;
+
+		// Remove the TreeItem handles and LPUNKNOWNs from the item map
+		m_MapItem2Object.RemoveAll();
+
+
+		while(pos!=NULL)
+		{
+			m_MapObject2Item.GetNextAssoc(pos,pUnknown,pObject);
+			m_MapObject2Item.RemoveKey(pUnknown);
+			delete pObject;
+			pUnknown->Release();
+		}
+
+	}
+
+	// Retreives the corresponding TreeItem handle from an Object Proxy
+	BOOL LookupTreeItem(CMgaObjectProxy MgaObjectProxy, HTREEITEM &hTreeItem)
+	{
+		return LookupTreeItem(MgaObjectProxy.m_pMgaObject, hTreeItem);
+	}
+
+
+	// Retreives the Object Proxy from the corresponding TreeItem handle
+	BOOL LookupObjectProxy(HTREEITEM hTreeItem, ObjectProxy& rObjectProxy)
+	{
+		CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
+		LPUNKNOWN pUnknown;
+	
+		BOOL bResult=m_MapItem2Object.Lookup(hTreeItem,pUnknown);
+	
+		if(bResult)
+		{
+			if( (bResult=m_MapObject2Item.Lookup(pUnknown,pMgaObjectProxyMapItem)) )
+			{
+				rObjectProxy=*pMgaObjectProxyMapItem;
+			}
+		}
+		return  bResult;
+	}
+
+
+	// Removes a tree item maintaining the consistency between the two maps
+	BOOL RemoveTreeItem(HTREEITEM hTreeItem)
+	{
+		LPUNKNOWN pUnknown;
+
+		if(!m_MapItem2Object.Lookup(hTreeItem,pUnknown))
+		{
+			return FALSE;
+		}
+		else
+		{
+			m_MapItem2Object.RemoveKey(hTreeItem);
+
+			CMgaObjectProxyMapItem* pObjectProxyMapItem;
+			if(m_MapObject2Item.Lookup(pUnknown,pObjectProxyMapItem))
+			{
+				m_MapObject2Item.RemoveKey(pUnknown);			
+				// Free COM object
+				pUnknown->Release();
+				delete pObjectProxyMapItem;
+			}
+			return TRUE;
+		}
+
+	}
+
+
+	// Removes an Object Proxy maintaining the consistency between the two maps
+	BOOL RemoveObjectProxy(CMgaObjectProxy MgaObjectProxy)
+	{	
+		CMgaObjectProxyMapItem* pObjectProxyMapItem;
+
+		CComPtr<IUnknown> pUnk;
+		MgaObjectProxy.m_pMgaObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
+		if(!m_MapObject2Item.Lookup(pUnk, pObjectProxyMapItem))
+		{
+			return FALSE;
+		}
+		else
+		{
+			m_MapObject2Item.RemoveKey(pObjectProxyMapItem->m_pMgaObject);
+			m_MapItem2Object.RemoveKey(pObjectProxyMapItem->m_hTreeItem);
+		
+			// Free COM object
+			pObjectProxyMapItem->m_pMgaObject->Release();
+			delete pObjectProxyMapItem;
+			return TRUE;
+		}
+	}
+
+
+	// Adds a new TreeItem Handle - ObjectProxy pair to the map
+	void AddEntry(HTREEITEM hTreeItem, ObjectProxy MgaObjectProxy)
+	{
+
+	// Removing the elements from the maps with the keys, because CMap::SetAt would overwrite
+	// the value belonging to the already existing key 
+	// resulting an inconsistency with the other map. 
+		RemoveTreeItem(hTreeItem);
+		RemoveObjectProxy(MgaObjectProxy);
 	
-	// Low level functions (involving IUnknown-based search) for efficiency
-	// of the simple oprations
-	BOOL bIsInMap(HTREEITEM hTreeItem);
-	BOOL bIsInMap(LPUNKNOWN pUnknown);
-	BOOL LookupObjectUnknown(HTREEITEM hTreeItem, LPUNKNOWN& pUnknown);
-	void DestroyMap();
-	CMgaMap();
-	virtual ~CMgaMap();
+		// Increase reference counter for this map
+		IUnknown* pUnk = MgaObjectProxy.m_pMgaObject;
+		MgaObjectProxy.m_pMgaObject = NULL;
+		pUnk->QueryInterface(IID_IUnknown, (void**)&MgaObjectProxy.m_pMgaObject);
+
+		m_MapItem2Object.SetAt(hTreeItem,MgaObjectProxy.m_pMgaObject);
+
+		CMgaObjectProxyMapItem* pMgaObjectProxyMapItem= new CMgaObjectProxyMapItem(MgaObjectProxy, hTreeItem);
+		m_MapObject2Item.SetAt(MgaObjectProxy.m_pMgaObject,pMgaObjectProxyMapItem);
+
+	}
+
+
+	// Low level function for efficiency: if one wants IUnknown pointer
+	// he can get it with one lookup call
+	BOOL LookupObjectUnknown(HTREEITEM hTreeItem, LPUNKNOWN &pUnknown)
+	{
+
+		return m_MapItem2Object.Lookup(hTreeItem,pUnknown);
+	}
+
+
+	_COM_SMARTPTR_TYPEDEF(IMgaObject, __uuidof(IMgaObject));
+
+	BOOL SearchTreeItem(BSTR Id, HTREEITEM &hTreeItem, IUnknown* &punk)
+	{
+		// read all looking for the ID
+
+	   LPUNKNOWN	nKey;
+	   CMgaObjectProxyMapItem *	pt;
+	   POSITION pos = m_MapObject2Item.GetStartPosition();
+	   bool found = false;
+	   while (pos != NULL)
+	   {
+		  m_MapObject2Item.GetNextAssoc( pos, nKey, pt);
+		  IMgaObjectPtr mgao(nKey);
+		  IUnknownPtr punkptr(nKey);
+
+		  punk = punkptr;
+		  _bstr_t boid;
+		  COMTHROW(mgao->get_ID(boid.GetAddress()));
+		  _bstr_t bid = Id;
+		  if (bid == boid)
+		  {
+			  found = true;
+			  break;
+		  }
+	   }
+
+		if(found) 
+			hTreeItem = pt->m_hTreeItem;
+
+		return (found);
+	}
+
+
+	BOOL LookupTreeItem(LPUNKNOWN pUnknown, HTREEITEM &hTreeItem)
+	{
+		CComPtr<IUnknown> pUnk;
+		pUnknown->QueryInterface(IID_IUnknown, (void**)&pUnk);
+		CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
+
+		BOOL bResult=m_MapObject2Item.Lookup(pUnk,pMgaObjectProxyMapItem);
+
+		if (bResult)
+			hTreeItem=pMgaObjectProxyMapItem->m_hTreeItem;
+
+		return bResult;
+	}
+
+
+
+	BOOL bIsInMap(LPUNKNOWN pUnknown)
+	{
+		CComPtr<IUnknown> pUnk;
+		pUnknown->QueryInterface(IID_IUnknown, (void**)&pUnk);
+
+		CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
+		return m_MapObject2Item.Lookup(pUnk,pMgaObjectProxyMapItem);
+	}
+
+	BOOL bIsInMap(HTREEITEM hTreeItem)
+	{
+		LPUNKNOWN pUnknown;
+		return m_MapItem2Object.Lookup(hTreeItem,pUnknown);
+	}
+
+
 
 	// Dump function
 #ifdef _DEBUG
-	virtual void Dump(CDumpContext& dc ) const; 
-#endif
+	void Dump(CDumpContext& dc ) const
+	{
+		return;
+		dc<<"______________________ MgaMap Dump begin _______________________";
+		// Dumping the Item2Object Map
+		dc<<"\n\nMapItem2Object:\n";
+	
+		HTREEITEM hItem;
+		LPUNKNOWN pUnknown;
+
+		POSITION pos = m_MapItem2Object.GetStartPosition();
+		while(pos!=NULL)
+		{
+			m_MapItem2Object.GetNextAssoc(pos,hItem,pUnknown);
+			CString strOut;
+			strOut.Format(_T(" %x  |  %x\n"),hItem, pUnknown);
+			dc<<strOut;
+		}
+		dc<<"\n";
+
+		// Dumping Object2Item Map
+		dc<<"\n\nMapObject2Item:\n";
+	
 
+		CMgaObjectProxyMapItem* pMgaObjectProxyMapItem;
+
+
+		pos = m_MapObject2Item.GetStartPosition();
+		while(pos!=NULL)
+		{
+			m_MapObject2Item.GetNextAssoc(pos,pUnknown,pMgaObjectProxyMapItem);
+			CString strOut;
+			strOut.Format(_T(" %x  |  %x  |  %d\n"), pUnknown, pMgaObjectProxyMapItem->m_hTreeItem,pMgaObjectProxyMapItem->m_TypeInfo);
+			dc<<strOut;
+		}
+		dc<<"\n";
+
+		dc<<"______________________ MgaMap Dump end _______________________\n\n";
+	}
+#endif
 
 private:
 	CMapObject2Item m_MapObject2Item;

Modified: trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -16,45 +16,7 @@
 // Construction/Destruction
 //////////////////////////////////////////////////////////////////////
 
-CMgaMappedTreeCtrl::CMgaMappedTreeCtrl():m_DropTarget(this)
-{
-
-	try
-	{
-		COMTHROW( m_EventLogger.CoCreateInstance(L"Mga.MgaEventLogger"));
-	}
-	catch(...)
-	{
-		m_EventLogger = NULL;
-	}
-	
-}
-
-CMgaMappedTreeCtrl::~CMgaMappedTreeCtrl()
-{
-
-}
-
-void CMgaMappedTreeCtrl::CleanUp()
-{
-	CTreeCtrlEx::DeleteAllItems();
-	m_MgaMap.DestroyMap();
-
-
-}
-
-BOOL CMgaMappedTreeCtrl::GetSelectedItemProxy(CMgaObjectProxy &rMgaObjectProxy)
-{
-	HTREEITEM hTreeItem=CTreeCtrlEx::GetSelectedItem();
-
-	if(hTreeItem== NULL) return FALSE; // No selected item
-
-	return m_MgaMap.LookupObjectProxy(hTreeItem,rMgaObjectProxy);
-}
-
-
-
-BOOL CMgaMappedTreeCtrl::SetItemState(HTREEITEM hItem, UINT nState)
+BOOL CMgaMappedTreeCtrlBase::SetItemState(HTREEITEM hItem, UINT nState)
 {
 
 	if(nState&TVIS_BOLD)CTreeCtrl::SetItemState(hItem,TVIS_BOLD,TVIS_BOLD);	
@@ -64,15 +26,8 @@
 	return TRUE;
 }
 
-BOOL CMgaMappedTreeCtrl::DeleteItem(HTREEITEM hItem)
-{
-
-	m_MgaMap.RemoveTreeItem(hItem);
-	return CTreeCtrl::DeleteItem(hItem);
-}
-
 // Recursively deletes every child
-void CMgaMappedTreeCtrl::DeleteAllChildren(HTREEITEM hParent)
+void CMgaMappedTreeCtrlBase::DeleteAllChildren(HTREEITEM hParent)
 {
 	if (ItemHasChildren(hParent)) // this may indicate true and the GetChildItem may give at the same time back 0x00000000 since that children may not have htreeitem inserted for it
 	{
@@ -84,7 +39,7 @@
 
 		   	HTREEITEM hNextItem = GetNextSiblingItem(hItem);		
 			// Consistently removes item from map and the tree ctrl
-			CMgaMappedTreeCtrl::DeleteItem(hItem);
+			DeleteItem(hItem);
 			hItem=hNextItem;
 
 	   }
@@ -92,7 +47,7 @@
 
 }
 
-void CMgaMappedTreeCtrl::ExpandAllChildren(HTREEITEM hParent,UINT nCode)
+void CMgaMappedTreeCtrlBase::ExpandAllChildren(HTREEITEM hParent,UINT nCode)
 {
 
 	if (ItemHasChildren(hParent))
@@ -109,18 +64,18 @@
 }
 
 
-BOOL CMgaMappedTreeCtrl::IsRelevantDropTarget(CPoint point, CImageList*)
+BOOL CMgaMappedTreeCtrlBase::IsRelevantDropTarget(CPoint point, CImageList*)
 {
 	return FALSE;
 }
 
-void CMgaMappedTreeCtrl::RegisterDropTarget()
+void CMgaMappedTreeCtrlBase::RegisterDropTarget()
 {
 
 	m_DropTarget.Register(this);
 }
 
-BOOL CMgaMappedTreeCtrl::DoDrop(eDragOperation, COleDataObject*, CPoint)
+BOOL CMgaMappedTreeCtrlBase::DoDrop(eDragOperation, COleDataObject*, CPoint)
 {
 	return FALSE;
 }

Modified: trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MgaMappedTreeCtrl.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -22,22 +22,19 @@
 	} \
 } \
 
-class CMgaMappedTreeCtrl : public CTreeCtrlEx  
+class CMgaMappedTreeCtrlBase : public CTreeCtrlEx
 {
 public:
+	CMgaMappedTreeCtrlBase() : m_DropTarget(this) {};
 	virtual BOOL DoDrop(eDragOperation, COleDataObject*,CPoint);
 	void RegisterDropTarget();
 	virtual BOOL IsRelevantDropTarget(CPoint point,CImageList*);
 	void ExpandAllChildren(HTREEITEM hParent,UINT nCode);
 	void DeleteAllChildren(HTREEITEM hParent);
-	BOOL DeleteItem(HTREEITEM hItem);
 	BOOL SetItemState(HTREEITEM hItem, UINT nState);
-	BOOL GetSelectedItemProxy(CMgaObjectProxy& rMgaObjectProxy);
-	void CleanUp();
-	CMgaMappedTreeCtrl();
-	virtual ~CMgaMappedTreeCtrl();
-
-	CMgaMap m_MgaMap;
+	virtual BOOL DeleteItem(HTREEITEM hItem) = 0;
+	virtual void CleanUp() = 0;
+	virtual BOOL LookupObjectUnknown(HTREEITEM hTreeItem, IUnknown*& out) = 0;
 
 protected:
 	CGMEActiveBrowserDropTarget m_DropTarget;
@@ -45,4 +42,41 @@
 	CComPtr<IMgaEventLogger> m_EventLogger;
 };
 
+
+template<class ObjectProxy>
+class CMgaMappedTreeCtrl : public CMgaMappedTreeCtrlBase
+{
+public:
+	CMgaMappedTreeCtrl() {
+		m_EventLogger.CoCreateInstance(L"Mga.MgaEventLogger");
+	}
+
+	BOOL GetSelectedItemProxy(ObjectProxy& rMgaObjectProxy) {
+		HTREEITEM hTreeItem = __super::GetSelectedItem();
+
+		if (hTreeItem == NULL)
+			return FALSE; // No selected item
+
+		return m_MgaMap.LookupObjectProxy(hTreeItem, rMgaObjectProxy);
+	}
+
+	virtual ~CMgaMappedTreeCtrl() {}
+
+	virtual BOOL DeleteItem(HTREEITEM hItem) {
+		m_MgaMap.RemoveTreeItem(hItem);
+		return CTreeCtrl::DeleteItem(hItem);
+	}
+
+	virtual void CleanUp() {
+		CTreeCtrlEx::DeleteAllItems();
+		m_MgaMap.DestroyMap();
+	}
+
+	virtual BOOL LookupObjectUnknown(HTREEITEM hTreeItem, IUnknown*& out) {
+		return m_MgaMap.LookupObjectUnknown(hTreeItem, out);
+	}
+
+	CMgaMap<ObjectProxy> m_MgaMap;
+};
+
 #endif // !defined(AFX_MGAMAPPEDTREECTRL_H__01ABA150_667F_4191_95BC_DA45058B98C9__INCLUDED_)

Modified: trunk/GME/GMEActiveBrowser/MgaObjectProxy.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaObjectProxy.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MgaObjectProxy.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -13,7 +13,6 @@
 
 class CMgaObjectProxy  
 {
-	friend class CMgaMap;
 public:
 	CMgaObjectProxy(){};
 	CMgaObjectProxy(LPUNKNOWN pMgaObject, objtype_enum type);

Modified: trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -1,35 +1 @@
-// MgaObjectProxyMapItem.cpp: implementation of the CMgaObjectProxyMapItem class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
-#include "gmeactivebrowser.h"
-#include "MgaObjectProxyMapItem.h"
-
-#ifdef _DEBUG
-#undef THIS_FILE
-static char THIS_FILE[]=__FILE__;
-#define new DEBUG_NEW
-#endif
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-CMgaObjectProxyMapItem::CMgaObjectProxyMapItem(LPUNKNOWN pMgaObject, objtype_enum type, HTREEITEM hTreeItem)
-:CMgaObjectProxy(pMgaObject,type),m_hTreeItem(hTreeItem)
-{
-
-}
-
-CMgaObjectProxyMapItem::CMgaObjectProxyMapItem(CMgaObjectProxy& rSourceMgaObjectProxy, HTREEITEM hTreeItem)
-:CMgaObjectProxy(rSourceMgaObjectProxy),m_hTreeItem(hTreeItem)
-{
-	
-
-}
-
-CMgaObjectProxyMapItem::~CMgaObjectProxyMapItem()
-{
-
-}
+#include "StdAfx.h"
\ No newline at end of file

Modified: trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/MgaObjectProxyMapItem.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -1,25 +0,0 @@
-// MgaObjectProxyMapItem.h: interface for the CMgaObjectProxyMapItem class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(AFX_MGAOBJECTPROXYMAPITEM_H__0A26F08F_7295_4AEC_81F6_C1DFE5FD7944__INCLUDED_)
-#define AFX_MGAOBJECTPROXYMAPITEM_H__0A26F08F_7295_4AEC_81F6_C1DFE5FD7944__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#include "MgaObjectProxy.h"
-
-class CMgaObjectProxyMapItem : public CMgaObjectProxy  
-{
-	friend class CMgaMap;
-	HTREEITEM m_hTreeItem;
-public:
-	CMgaObjectProxyMapItem(LPUNKNOWN pMgaObject, objtype_enum type, HTREEITEM hTreeItem);
-	CMgaObjectProxyMapItem(CMgaObjectProxy& rSourceMgaObjectProxy, HTREEITEM hTreeItem);
-	virtual ~CMgaObjectProxyMapItem();
-
-};
-
-#endif // !defined(AFX_MGAOBJECTPROXYMAPITEM_H__0A26F08F_7295_4AEC_81F6_C1DFE5FD7944__INCLUDED_)

Modified: trunk/GME/GMEActiveBrowser/TreeCtrlEx.cpp
==============================================================================
--- trunk/GME/GMEActiveBrowser/TreeCtrlEx.cpp	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/TreeCtrlEx.cpp	Thu Jun 28 14:07:20 2012	(r1941)
@@ -979,7 +979,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Retreives a tree ctrl item given the item's data
 
-HTREEITEM CTreeCtrlEx::ItemFromData(DWORD dwData, HTREEITEM hStartAtItem/*=NULL*/) const
+HTREEITEM CTreeCtrlEx::ItemFromData(DWORD_PTR dwData, HTREEITEM hStartAtItem/*=NULL*/) const
 {
 	// Traverse all items in tree control
 	HTREEITEM hItem;
@@ -990,7 +990,7 @@
 
 	while ( hItem )
 	{
-		if ( dwData == (DWORD)GetItemData( hItem ) )
+		if ( dwData == GetItemData( hItem ) )
 			return hItem;
 
 		// Get first child node
@@ -1024,7 +1024,7 @@
 // Global function to retreive a HTREEITEM from a tree control, given the 
 // item's itemdata.
 
-HTREEITEM GetTreeItemFromData(CTreeCtrl& treeCtrl, DWORD dwData, HTREEITEM hStartAtItem /*=NULL*/)
+HTREEITEM GetTreeItemFromData(CTreeCtrl& treeCtrl, DWORD_PTR dwData, HTREEITEM hStartAtItem /*=NULL*/)
 {
 	// Traverse from given item (or all items if hFromItem is NULL)
 	HTREEITEM hItem;
@@ -1035,7 +1035,7 @@
 
 	while ( hItem )
 	{
-		if ( dwData == (DWORD)treeCtrl.GetItemData( hItem ) )
+		if ( dwData == treeCtrl.GetItemData( hItem ) )
 			return hItem;
 
 		// Get first child node

Modified: trunk/GME/GMEActiveBrowser/TreeCtrlEx.h
==============================================================================
--- trunk/GME/GMEActiveBrowser/TreeCtrlEx.h	Tue Jun 26 14:09:40 2012	(r1940)
+++ trunk/GME/GMEActiveBrowser/TreeCtrlEx.h	Thu Jun 28 14:07:20 2012	(r1941)
@@ -40,7 +40,7 @@
 	HTREEITEM GetFirstSelectedItem();
 	HTREEITEM GetNextSelectedItem(HTREEITEM hItem);
 	HTREEITEM GetPrevSelectedItem(HTREEITEM hItem);
-	HTREEITEM ItemFromData(DWORD dwData, HTREEITEM hStartAtItem=NULL) const;
+	HTREEITEM ItemFromData(DWORD_PTR dwData, HTREEITEM hStartAtItem=NULL) const;
 
 	BOOL SelectItemEx(HTREEITEM hItem, BOOL bSelect=TRUE);
 
@@ -105,9 +105,12 @@
 	//}}AFX_MSG
 
 	DECLARE_MESSAGE_MAP()
+
+private:
+	CTreeCtrlEx(const CTreeCtrlEx&);
 };
 
 
-HTREEITEM GetTreeItemFromData(CTreeCtrl& treeCtrl, DWORD dwData, HTREEITEM hStartAtItem=NULL);
+HTREEITEM GetTreeItemFromData(CTreeCtrl& treeCtrl, DWORD_PTR dwData, HTREEITEM hStartAtItem=NULL);
 
 #endif


More information about the gme-commit mailing list