用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

226 lines
5.5 KiB

#include "StdAfx.h"
#include "SPropertyItemBase.h"
#include "SPropertyGrid.h"
namespace SOUI
{
int SPropertyItemBase::GetLevel() const
{
int iLevel = 0;
IPropertyItem *pParent=GetParent();
while(pParent)
{
iLevel ++;
pParent = pParent->GetParent();
}
return iLevel;
}
BOOL SPropertyItemBase::IsExpand() const
{
return m_bExpanded;
}
void SPropertyItemBase::Expand( BOOL bExpend )
{
m_bExpanded = bExpend;
GetOwner()->OnItemExpanded(this);
}
IPropertyItem * SPropertyItemBase::GetParent() const
{
return m_pParent;
}
void SPropertyItemBase::SetParent( IPropertyItem * pParent )
{
m_pParent = pParent;
}
IPropertyItem * SPropertyItemBase::GetItem( PROPITEMTYPE type) const
{
switch (type)
{
case GPI_PARENT:
return GetParent();
break;
case GPI_FIRSTCHILD:
if(m_childs.IsEmpty()) return NULL;
else return m_childs.GetHead();
break;
case GPI_LASTCHILD:
if(m_childs.IsEmpty()) return NULL;
else return m_childs.GetTail();
break;
case GPI_NEXTSIBLING:
{
SPropertyItemBase * pParent = (SPropertyItemBase*)GetParent();
if(!pParent) return NULL;
SPOSITION pos = pParent->m_childs.Find((IPropertyItemPtr)this);
SASSERT(pos);
pParent->m_childs.GetNext(pos);
if(!pos) return NULL;
return pParent->m_childs.GetAt(pos);
}
break;
case GPI_PREVSIBLINIG:
{
SPropertyItemBase * pParent = (SPropertyItemBase*)GetParent();
if(!pParent) return NULL;
SPOSITION pos = pParent->m_childs.Find((IPropertyItemPtr)this);
SASSERT(pos);
pParent->m_childs.GetPrev(pos);
if(!pos) return NULL;
return pParent->m_childs.GetAt(pos);
}
break;
}
return NULL;
}
IPropertyItem * SPropertyItemBase::GetChildById(int nID) const
{
SPOSITION pos = m_childs.GetHeadPosition();
while(pos)
{
IPropertyItem *pItem = m_childs.GetNext(pos);
if(pItem->GetID() == nID)
return pItem;
}
return NULL;
}
SPropertyGrid * SPropertyItemBase::GetOwner() const
{
return m_pOwner;
}
BOOL SPropertyItemBase::InsertChild( IPropertyItem * pChild,IPropertyItem * pInsertAfter/*=IC_LAST*/ )
{
if(pInsertAfter == IC_LAST)
{
m_childs.InsertAfter(NULL,pChild);
}
else if(pInsertAfter == IC_FIRST)
{
m_childs.InsertBefore(NULL,pChild);
}
else
{
SPOSITION pos = m_childs.Find(pInsertAfter);
if(!pos) return FALSE;
m_childs.InsertAfter(pos,pChild);
}
pChild->SetParent(this);
pChild->AddRef();
return TRUE;
}
int SPropertyItemBase::ChildrenCount() const
{
return m_childs.GetCount();
}
BOOL SPropertyItemBase::RemoveChild( IPropertyItem * pChild )
{
SPOSITION pos = m_childs.Find(pChild);
if(!pos) return FALSE;
m_childs.RemoveAt(pos);
pChild->Release();
return TRUE;
}
SPropertyItemBase::~SPropertyItemBase()
{
SPOSITION pos = m_childs.GetHeadPosition();
while(pos)
{
IPropertyItemPtr pChild = m_childs.GetNext(pos);
pChild->Release();
}
m_childs.RemoveAll();
}
BOOL SPropertyItemBase::InitFromXml( pugi::xml_node xmlNode )
{
SObject::InitFromXml(xmlNode);
pugi::xml_node xmlProp=xmlNode.first_child();
while(xmlProp)
{
IPropertyItem * pItem = GetOwner()->CreateItem(xmlProp.name());
if(pItem)
{
SPropertyItemBase *pItem2 = static_cast<SPropertyItemBase*>(pItem);
if(pItem2)
{
pItem2->InitFromXml(xmlProp);
InsertChild(pItem2);
pItem2->Release();
}
}
xmlProp = xmlProp.next_sibling();
}
return TRUE;
}
HRESULT SPropertyItemBase::OnAttrExpanded( const SStringW & strValue,BOOL bLoading )
{
BOOL bExpanded = STRINGASBOOL(strValue);
if(!bLoading) Expand(bExpanded);
else m_bExpanded = bExpanded;
return S_FALSE;
}
void SPropertyItemBase::OnValueChanged()
{
if(GetParent())
GetParent()->OnChildValueChanged(this);
else
GetOwner()->OnItemValueChanged(this);
}
IPropertyItem * SPropertyItemBase::FindChildByName(LPCWSTR pszName) const
{
SPOSITION pos = m_childs.GetHeadPosition();
while(pos)
{
IPropertyItem *pChild = m_childs.GetNext(pos);
if(pChild->GetName2()==pszName)
return pChild;
IPropertyItem *pFind = pChild->FindChildByName(pszName);
if(pFind)
return pFind;
}
return NULL;
}
IPropertyItem * SPropertyItemBase::FindChildById(int nID)
{
SPOSITION pos = m_childs.GetHeadPosition();
while(pos)
{
IPropertyItem *pChild = m_childs.GetNext(pos);
if(pChild->GetID()==nID)
return pChild;
IPropertyItem *pFind = pChild->FindChildById(nID);
if(pFind)
return pFind;
}
return NULL;
}
void SPropertyItemBase::SetReadOnly(BOOL bReadOnly)
{
m_bReadOnly = bReadOnly;
GetOwner()->OnItemInvalidate(this);
}
}