BOOL CXTPRibbonBuilder::BuildCategories(CXTPPropExchange* pPX, CXTPRibbonBar* pRibbonBar)
{
	CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("CATEGORY")));

	POSITION pos = pEnumerator->GetPosition(0);
	while (pos)
	{
		CXTPPropExchangeSection pxTab(pEnumerator->GetNext(pos));

		CString strElementName;
		PX_String(&pxTab, _T("ELEMENT_NAME"), strElementName);

		CCmdTarget* pElement = CreateElement(strElementName);
		if (pElement == NULL)
			continue;

		CXTPRibbonTab* pTab = DYNAMIC_DOWNCAST(CXTPRibbonTab, pElement);

		if (!pTab)
		{
			delete pElement;
			continue;
		}


		CString strName;
		PX_String(&pxTab, _T("NAME"), strName);

		pTab->SetCaption(strName);


		CString strKeys;
		PX_String(&pxTab, _T("KEYS"), strKeys);
		pTab->SetKeyboardTip(strKeys);


		pRibbonBar->InsertTab(pRibbonBar->GetTabCount(), pTab);


		m_arrImageLarge.RemoveAll();
		m_arrImageSmall.RemoveAll();

		CXTPPropExchangeSection pxPanels(pxTab->GetSection(_T("PANELS")));
		BuildGroups(&pxPanels, pTab);

		LoadIcons(&pxTab);
	}


	return TRUE;
}