⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 group.cpp

📁 beereader source code
💻 CPP
字号:
// Group.cpp: implementation of the CGroup class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "BeeReader.h"
#include "Group.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGroup::CGroup(CString strGroupSaveTag,CString strName)
{
	m_GroupName = strName;
	m_GroupSaveTag = _T("");
    m_pTreeCtrl = NULL;

	m_RootNode.dwData = 0;
	m_RootNode.pFirstChild = NULL;
	m_RootNode.pNextSibling = NULL;
	m_RootNode.pParentNode = NULL;
	m_RootNode.pNextNode = NULL;
	m_RootNode.pLastSibling = NULL;
	m_RootNode.szNodeName = m_GroupName;

}

CGroup::~CGroup()
{
	//Clear();
}

void CGroup::Clear()
{
	PGROUPNODE pg,pg1;
	pg = m_RootNode.pNextSibling;
	while( pg )
	{
	    pg1 = pg;
		pg = pg->pNextNode;
		delete( pg1 );
	}

	pg = m_RootNode.pNextNode ;
	while(pg)
	{
		pg1 = pg;
		pg = pg->pNextNode;
		delete(pg1);
	}
}

//加载组信息到内存组树中.
BOOL CGroup::Load()
{
	return TRUE;
}
//存储内存组树内容.
BOOL CGroup::Save()
{
	return TRUE;
}
//根据结点名称查找结点.
PGROUPNODE CGroup::FindGroupNode(CString szName)
{
	return FindNode( &m_RootNode,szName );
}
//根据结点中的关联对象查找结点.
PGROUPNODE CGroup::FindNode(DWORD dwData)
{
    PGROUPNODE pList = m_RootNode.pNextSibling;
	while( pList )
	{
		if( pList->dwData == dwData ) return pList;
		pList = pList->pNextNode ;
	}

	return NULL;
}

PGROUPNODE CGroup::FindNode(PGROUPNODE pNode, CString szName)
{
	if( !pNode ) return NULL;

	PGROUPNODE pg = pNode;

	if(pg->szNodeName.CompareNoCase(szName) == 0) 
		   return pg;

	if( pNode->pNextSibling != pNode->pParentNode->pFirstChild ) 
	{
		pg=FindNode( pNode->pNextSibling,szName);
		if( pg ) return pg;
	}
	
	if( pNode->pFirstChild ) 
	{
		pg = FindNode( pNode->pFirstChild,szName);
		if( pg ) return pg;
	}
	
	return NULL;
}

//新增一个结点。
PGROUPNODE CGroup::Insert(PGROUPNODE pParentNode, PGROUPNODE pNode,CString szName, DWORD dwData)
{
	if( !pParentNode || pParentNode->dwData!= 0  ) return NULL;

	PGROUPNODE   pg = NULL;

	pg = new( GROUPNODE );
	pg->dwData = dwData;
	pg->pFirstChild = NULL;
	pg->pNextNode = NULL;
	pg->pParentNode = pParentNode;
	pg->szNodeName = szName;
	pg->pNextSibling = NULL;
	
	if( dwData != 0 ) //添加叶子结点链表。
	{
		if( m_RootNode.pNextSibling )
		{
			(m_RootNode.pLastSibling)->pNextNode = pg;
			m_RootNode.pLastSibling = pg;
		}
		else
		{
			m_RootNode.pNextSibling = pg;
			m_RootNode.pLastSibling = pg;
		}
	}
	else //添加子组结点链表,以便于释放结点资源。
	{
		if( m_RootNode.pNextNode ) //m_RootNode.pNextNode指向组结点链表头结点,m_RootNode.pParentNode指向组结点链表尾结点。
		{
			(m_RootNode.pParentNode)->pNextNode = pg;
			m_RootNode.pParentNode = pg;
		}
		else
		{
			m_RootNode.pNextNode = pg;
			m_RootNode.pParentNode = pg;
		}
	}
	
	if( pNode && (pNode->pParentNode == pParentNode) )
	{
		if( pParentNode->pFirstChild == pNode ) //插入到父站点的第一个结点前。
		{
			pParentNode->pFirstChild = pg;
			pg->pNextSibling = pNode;
			pg->pLastSibling = pNode->pLastSibling;
			pNode->pLastSibling = pg;
		}
		else
		{
			pg->pLastSibling = pNode->pLastSibling; 
			pg->pNextSibling  = pNode;
			pNode->pLastSibling = pg;
		}			
	}
	else //插入到pParentNode儿子站点中最后一位。
	{
		if( pParentNode->pFirstChild )
		{
			pg->pLastSibling = (pParentNode->pFirstChild)->pLastSibling;
			pg->pNextSibling = pParentNode->pFirstChild;
			((pParentNode->pFirstChild)->pLastSibling)->pNextSibling = pg;
			(pParentNode->pFirstChild)->pLastSibling = pg;			
		}
		else
		{
			pg->pLastSibling = pg;
			pg->pNextSibling = pg;
			pParentNode->pFirstChild = pg;
		}
	}
	
	return pg;
}

PGROUPNODE CGroup::GetRootNode()
{
	return &m_RootNode;
}

BOOL CGroup::ReMoveNode(PGROUPNODE pNode,BOOL bChild)
{    
    if( !pNode ) return FALSE;

	if( bChild ) //同时移去其儿子结点
	{
	     if( pNode->pFirstChild )
		 {
			 while( pNode->pFirstChild )
			 {
			    ReMoveNode( pNode->pFirstChild,bChild );
			 }
		 }	
	}

          //执行移去
          if( pNode->pParentNode->pFirstChild != pNode ) //不是父结点的第一个儿子结点.
		 {
			  pNode->pNextSibling->pLastSibling = pNode->pLastSibling ;
			  pNode->pLastSibling->pNextSibling = pNode->pNextSibling;
			  ReMoveNodeList( pNode );
		 }
		 else
		 {
		      if( pNode->pLastSibling == pNode ) //只有一个结点.
				  pNode->pParentNode->pFirstChild = NULL;
			  else
			  {
			      pNode->pNextSibling->pLastSibling = pNode->pLastSibling;
				  pNode->pLastSibling->pNextSibling = pNode->pNextSibling; 
				  pNode->pParentNode->pFirstChild = pNode->pNextSibling;  
			  }
			  ReMoveNodeList(pNode);
		 }//end if			

	return TRUE;
}

void CGroup::ReMoveNodeList(PGROUPNODE pNode)
{
     if( !pNode ) return;

	 PGROUPNODE pg = NULL,pPrev = NULL;

	 if( pNode->dwData != 0 )
		 pg = m_RootNode.pNextSibling;
	 else
		 pg = m_RootNode.pNextNode;

	 while( pg )
	 {
		if( pg == pNode )
		{
			if( pPrev == NULL )
			{
			    if( pNode->dwData == 0 ) m_RootNode.pNextNode = NULL;
				else m_RootNode.pNextSibling = NULL;
			}
			else
			{
			    pPrev->pNextNode = pNode->pNextNode ;
			}
			delete( pNode );			
			break;
		}
		else
		{
		    pPrev = pg;
			pg = pg->pNextNode;
		}
	 }

}

void CGroup::ReName(PGROUPNODE pNode, CString szNewName)
{
     pNode->szNodeName = szNewName;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -