[gme-users] Removing/deleting model elements in BON1
    Jeff Gray 
    gray at cis.uab.edu
       
    Fri Feb  3 21:37:49 CST 2006
    
    
  
Thanks, Zoltan! We appreciate your help in suggesting this. We will give it
a try early next week.
Jeff
----------------------------------------------------
Jeff Gray, Ph.D.
Department of Computer and Information Sciences
University of Alabama at Birmingham
gray at cis.uab.edu
http://www.gray-area.org
-----Original Message-----
From: gme-users-bounces at list.isis.vanderbilt.edu
[mailto:gme-users-bounces at list.isis.vanderbilt.edu] On Behalf Of Zoltan
Molnar
Sent: Thursday, February 02, 2006 4:28 PM
To: gme-users
Subject: RE: [gme-users] Removing/deleting model elements in BON1
Hi,
If case of BON1 interpreters: let me make clear what I meant by ''used
in destructors'': BON1 uses that method internally in its destructors.
> The protected RemoveAtom & co. methods release objects only from the 
> Builder structure, [they are used mostly in destructors], and they do 
> not provide the functionality you would like to have: to remove an 
> atom from the gme model.
> 
As Akos suggested if you subclass the CBuilderObject then you may access
some of its protected members.
Here you can find a COM based Delete implemented, using subclassing,
thus acquiring the ciObject [a COM pointer] member of CBuilderObject and
invoking the DestroyObject COM method on it. This DestroyObject deletes
the MGA object (the object sitting in GME's window). 
The C++ builder objects need to be deleted also, that is why
RemoveReference( obj) is called in CMySmartModel::DeleteSelected.
CMySmartObj is an object which I could delete, CMySmartModel is its
parent model.
Br, Zoli
-----------------put these into Component.h---------------------
class CMySmartObj;
typedef CTypedPtrList<CPtrList, CMySmartObj*> CMySmartObjList;
class CMySmartModel : public CBuilderModel
{
	DECLARE_CUSTOMMODEL(CMySmartModel, CBuilderModel)
public:
	virtual void Traverse(CMySmartObjList &list);
	void DeleteSelected( CMySmartObjList &list);
	virtual ~CMySmartModel() { }
};
class CMySmartObj : public CBuilderReference
{
	DECLARE_CUSTOMREF(CMySmartObj, CBuilderReference)
public:
	virtual ~CMySmartObj() { }
	void deleteMySelf();
};
----------------------put these into component.cpp---------------
IMPLEMENT_CUSTOMMODEL(CMySmartModel, CBuilderModel, "configuration")
IMPLEMENT_CUSTOMREF( CMySmartObj, CBuilderReference, "interface_ref")
void CMySmartModel::Traverse(CMySmartObjList &lst)
{
	const CBuilderReferenceList *ref_list =
GetReferences("interface_ref");
	POSITION pos = ref_list->GetHeadPosition();
	while(pos)
	{
		CMySmartObj *obj = (CMySmartObj
*)ref_list->GetNext(pos);
		ASSERT( obj);
		lst.AddTail( obj);
	}
}
void CMySmartModel::DeleteSelected(CMySmartObjList &smart_lst)
{
	POSITION pos = smart_lst.GetHeadPosition();
	while(pos)
	{
		CMySmartObj *obj = (CMySmartObj
*)smart_lst.GetNext(pos);
		ASSERT( obj);
		this->RemoveReference( obj);
		obj->deleteMySelf();
	}
	// test:
	// trying to acquire one more time 
	const CBuilderReferenceList *ref_list =
GetReferences("interface_ref");
	pos = ref_list->GetHeadPosition();
	while(pos)
	{
		// it should not enter this loop
		CMySmartObj *obj = (CMySmartObj
*)ref_list->GetNext(pos);
		ASSERT( obj);
		obj->deleteMySelf();
	}
	// end test
}
void CMySmartObj::deleteMySelf()
{
	CComPtr<IMgaFCO> my_mga_ptr = this->ciObject;
	my_mga_ptr->DestroyObject();
}
// traverses models inside topfolders and deletes all occurences of a
certain reference kind
void test2(CBuilder &builder,CBuilderObject *focus, CBuilderObjectList
&selected, long param) 
{
	CBuilderFolder *rf = builder.GetRootFolder();
	CBuilderFolder *lastFolder = 0;
	const CBuilderFolderList * flds = rf->GetSubFolders();
	POSITION pos = flds->GetHeadPosition();
	while( pos)
	{
		CBuilderFolder *fld = flds->GetNext( pos);
		lastFolder = fld;
		
		const CBuilderObjectList *lst =
lastFolder->GetRootObjects();
		POSITION pos = lst->GetHeadPosition();
		while( pos)
		{
			CBuilderObject *obj = lst->GetNext( pos);
			if(obj->IsKindOf(RUNTIME_CLASS(CMySmartModel)))
			{
				CMySmartObjList list;
				// fill the list with MySmartObjs
				CMySmartModel *smodel = (CMySmartModel
*) obj;
				smodel->Traverse(list);
				// now delete them
				smodel->DeleteSelected( list);
			}
		}
	}
}
void CComponent::InvokeEx(CBuilder &builder,CBuilderObject *focus,
CBuilderObjectList &selected, long param) 
{
	test2( builder, focus, selected, param);
}
_______________________________________________
gme-users mailing list
gme-users at list.isis.vanderbilt.edu
http://list.isis.vanderbilt.edu/mailman/listinfo/gme-users
    
    
More information about the gme-users
mailing list