void
NavigationTree_DisplayProfilesToogle()
	{
	TProfile * pProfileSelected = g_oConfiguration.m_pProfileSelected;
	if (pProfileSelected != NULL)
		{
		if (pProfileSelected->m_paTreeItemW_YZ == NULL)
			{
			pProfileSelected->TreeItemProfile_DisplayProfileInfoWithinNavigationTree();
			pProfileSelected->TreeItemW_Expand();
			pProfileSelected->TreeItemLayout_SetFocus();
			return;
			}
		pProfileSelected->TreeItemW_ToggleVisibilityAndSetFocus();
		}
	else if (g_pTreeItemProfiles != NULL)
		{
		g_pTreeItemProfiles->TreeItemW_ToggleVisibilityAndSetFocus();
		}
	}
//	Core routine to populate the Navigation Tree.
//
//	IMPLEMENTATION NOTES
//	At the moment the routine is written for a single configuration.  This code will have to be revised to support multiple configurations.
void
NavigationTree_PopulateTreeItemsAccordingToSelectedProfile(TProfile * pProfileSelected, BOOL fCreateNewProfile)
	{
	Endorse(pProfileSelected == NULL);	// Display all profiles
	Assert(g_pwNavigationTree != NULL);
	g_oConfiguration.m_pProfileSelected = pProfileSelected;

	// Flush the existing content of the Navigation Tree
	g_pwNavigationTree->NavigationTree_TreeItemUnselect();
	WTreeWidget * pwTreeView = g_pwNavigationTree->m_pwTreeView;
	QTreeWidgetItemIterator oIterator(pwTreeView);
	while (TRUE)
		{
		CTreeItemW * pTreeWidgetItem = (CTreeItemW *)*oIterator++;
		if (pTreeWidgetItem == NULL)
			break;
		ITreeItem * piTreeItem = pTreeWidgetItem->m_piTreeItem;
		Assert(piTreeItem != NULL);
		Assert(PGetRuntimeInterfaceOf_ITreeItem(piTreeItem) == piTreeItem);	// Make sure the pointer is valid
		Assert(piTreeItem->m_paTreeItemW_YZ != NULL);
		// Remember the state of each Tree Item before switching profile, so next time the profile is re-selected, then the entire arborescence is restored.
		if (piTreeItem->m_paTreeItemW_YZ->isExpanded())
			piTreeItem->m_uFlagsTreeItem |= ITreeItem::FTI_kfTreeItem_IsExpanded;
		else
			piTreeItem->m_uFlagsTreeItem &= ~ITreeItem::FTI_kfTreeItem_IsExpanded;

		//MessageLog_AppendTextFormatSev(eSeverityWarningToErrorLog, "0x$p: $s  m_uFlagsTreeItem = 0x$x\n", piTreeItem, piTreeItem->TreeItem_PszGetNameDisplay(), piTreeItem->m_uFlagsTreeItem);
		piTreeItem->m_paTreeItemW_YZ = NULL;	// This would cause a memory leak in the absence of pwTreeView->clear()
		} // while
	pwTreeView->clear();
	delete g_pTreeItemInbox;
	g_pTreeItemInbox = NULL;
	delete g_pTreeItemProfiles;
	g_pTreeItemProfiles = NULL;

	int cProfiles;
	TProfile ** prgpProfiles = g_oConfiguration.m_arraypaProfiles.PrgpGetProfiles(OUT &cProfiles);
	if (cProfiles == 1 && !fCreateNewProfile)
		pProfileSelected = prgpProfiles[0];	// If there is only one profile, then pretend the user selected that profile.  There is no need to show extra nodes which may confuse the user
	if (pProfileSelected != NULL)
		{
		// Display a single profile.  This is done by displaying the contacts first, and then the profile at the bottom
		pProfileSelected->TreeItemProfile_DisplayContactsWithinNavigationTree();
		if (pProfileSelected->m_arraypaAccountsXmpp.FIsEmpty())
			pProfileSelected->TreeItemProfile_DisplayProfileInfoWithinNavigationTree();
		pProfileSelected->TreeItemProfile_DisplayApplicationsWithinNavigationTree();
		}
	else
		{
		// Since we are displaying multiple profiles, we need to create two root items for the 'Inbox' and the 'Profiles'
		g_pTreeItemInbox = new TTreeItemInbox;
		g_pTreeItemProfiles = new TProfiles;

		for (int iProfile = 0; iProfile < cProfiles; iProfile++)
			{
			TProfile * pProfile = prgpProfiles[iProfile];
			Assert(pProfile->EGetRuntimeClass() == RTI(TProfile));
			pProfile->TreeItemProfile_DisplayContactsWithinNavigationTree();
			pProfile->TreeItemProfile_DisplayProfileInfoWithinNavigationTree();
			pProfile->TreeItemProfile_DisplayApplicationsWithinNavigationTree();
			}
		}
	NavigationTree_UpdateNameOfSelectedProfile();
	if (fCreateNewProfile || cProfiles == 0)
		{
		// Set the focus to "Profiles" if creating a new profile, or if there is no profile
		Assert(g_pTreeItemProfiles != NULL);
		g_pTreeItemProfiles->TreeItemLayout_SetFocus();
		}
	else
		pwTreeView->setCurrentItem(pwTreeView->topLevelItem(0));	// Select the first item
	} // NavigationTree_PopulateTreeItemsAccordingToSelectedProfile()