Serializing to / from a text file


To serialize the tree view control override the Serialize() function. The Serialize() function is a virtual function defined in Cobject.

In the code below we save the outline to a text file and can read it back from a text file. When saving the outline to the archive, tabs are used to indent the item text. Again, when reading back, tabs are used to determine the level that the newly read item should be placed at.
 

void CTreeCtrlX::Serialize(CArchive& ar) 
{
	if (ar.IsStoring())
	{	
		// storing code
		HTREEITEM hti = GetRootItem();
		while( hti )
		{
			int indent = GetIndentLevel( hti );
			while( indent-- )
				ar.WriteString( "\t" );
			ar.WriteString( GetItemText( hti ) + "\r\n");
			hti = GetNextItem( hti );
		}
		
	}
	else
	{	
		// loading code
		CString sLine;
		if( !ar.ReadString( sLine ) )
			return;

		HTREEITEM hti = NULL;
		int indent, baseindent = 0;
		while( sLine[baseindent] == '\t' )
			baseindent++;
		do
		{
			if( sLine.GetLength() == 0 )
				continue;
			for( indent = 0; sLine[indent] == '\t'; indent++ )
				;		// We don't need a body
			sLine = sLine.Right( sLine.GetLength() - indent );
			indent -= baseindent;

			HTREEITEM parent;
			int previndent = GetIndentLevel( hti );
			if( indent ==  previndent)
				parent = GetParentItem( hti );
			else if( indent > previndent )
				parent = hti;
			else
			{
				int nLevelsUp = previndent - indent;
				parent = GetParentItem( hti );
				while( nLevelsUp-- )
					parent = GetParentItem( parent );
			}
			hti = InsertItem( sLine, parent ? parent : TVI_ROOT, TVI_LAST );
		}while( ar.ReadString( sLine ) );

	}
}



int CTreeCtrlX::GetIndentLevel( HTREEITEM hItem )
{
	int iIndent = 0;

	while( (hItem = GetParentItem( hItem )) != NULL )
		iIndent++;
	return iIndent;
}


// GetNextItem	- Get next item as if outline was completely expanded
// Returns		- The item immediately below the reference item
// hItem		- The reference item
HTREEITEM CTreeCtrlX::GetNextItem( HTREEITEM hItem )
{
	HTREEITEM	hti;

	if( ItemHasChildren( hItem ) )
		return GetChildItem( hItem );		// return first child
	else{
		// return next sibling item
		// Go up the tree to find a parent's sibling if needed.
		while( (hti = GetNextSiblingItem( hItem )) == NULL ){
			if( (hItem = GetParentItem( hItem ) ) == NULL )
				return NULL;
		}
	}
	return hti;
}

 



Comments

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: May 11, 2015 @ 1:00 p.m. ET / 10:00 a.m. PT One of the languages that have always been supported with the Intel® RealSense™ SDK (Software Developer Kit) is JavaScript, specifically so that web-enabled apps could be created. Come hear from Intel Expert Bob Duffy as he reviews his own little "space shooting" game where the orientation of your face controls the aiming reticle to help teach developers how to write apps and games in JavaScript that can use facial and gesture …

  • There has been growing buzz about DevOps. DevOps is a methodology that unites the often separate functions of software development (Dev) and production and operations (Ops) into a single, integrated, and continuous process. DevOps is about breaking down the barriers between Dev and Ops. It leverages people, processes, and technology to stimulate collaboration and innovation across the entire software development and release process. Dev and Ops should always be part of an integrated process, but that's not …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date