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: September 10, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Modern mobile applications connect systems-of-engagement (mobile apps) with systems-of-record (traditional IT) to deliver new and innovative business value. But the lifecycle for development of mobile apps is also new and different. Emerging trends in mobile development call for faster delivery of incremental features, coupled with feedback from the users of the app "in the wild". This loop of continuous delivery and continuous feedback is …

  • Java developers know that testing code changes can be a huge pain, and waiting for an application to redeploy after a code fix can take an eternity. Wouldn't it be great if you could see your code changes immediately, fine-tune, debug, explore and deploy code without waiting for ages? In this white paper, find out how that's possible with a Java plugin that drastically changes the way you develop, test and run Java applications. Discover the advantages of this plugin, and the changes you can expect to see …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds