#include "StdAfx.h" #include "UIResourceManager.h" namespace DuiLib { CResourceManager::CResourceManager(void) { m_pQuerypInterface = NULL; } CResourceManager::~CResourceManager(void) { ResetResourceMap(); } BOOL CResourceManager::LoadResource(STRINGorID xml, LPCTSTR type) { if( HIWORD(xml.m_lpstr) != NULL ) { if( *(xml.m_lpstr) == _T('<') ) { if( !m_xml.Load(xml.m_lpstr) ) return NULL; } else { if( !m_xml.LoadFromFile(xml.m_lpstr) ) return NULL; } } else { HRSRC hResource = ::FindResource(CPaintManagerUI::GetResourceDll(), xml.m_lpstr, type); if( hResource == NULL ) return NULL; HGLOBAL hGlobal = ::LoadResource(CPaintManagerUI::GetResourceDll(), hResource); if( hGlobal == NULL ) { FreeResource(hResource); return NULL; } if( !m_xml.LoadFromMem((BYTE*)::LockResource(hGlobal), ::SizeofResource(CPaintManagerUI::GetResourceDll(), hResource) )) { return NULL; } ::FreeResource(hGlobal); } return LoadResource(m_xml.GetRoot()); } BOOL CResourceManager::LoadResource(CMarkupNode Root) { if( !Root.IsValid() ) return FALSE; LPCTSTR pstrClass = NULL; int nAttributes = 0; LPCTSTR pstrName = NULL; LPCTSTR pstrValue = NULL; LPTSTR pstr = NULL; //加载图片资源 LPCTSTR pstrId = NULL; LPCTSTR pstrPath = NULL; for( CMarkupNode node = Root.GetChild() ; node.IsValid(); node = node.GetSibling() ) { pstrClass = node.GetName(); CMarkupNode ChildNode = node.GetChild(); if(ChildNode.IsValid()) LoadResource(node); else if ((_tcsicmp(pstrClass,_T("Image")) == 0) && node.HasAttributes()) { //加载图片资源 nAttributes = node.GetAttributeCount(); for( int i = 0; i < nAttributes; i++ ) { pstrName = node.GetAttributeName(i); pstrValue = node.GetAttributeValue(i); if( _tcsicmp(pstrName, _T("id")) == 0 ) { pstrId = pstrValue; } else if( _tcsicmp(pstrName, _T("path")) == 0 ) { pstrPath = pstrValue; } } if( pstrId == NULL || pstrPath == NULL) continue; CDuiString * pstrFind = static_cast(m_mImageHashMap.Find(pstrId)); if(pstrFind != NULL) continue; m_mImageHashMap.Insert(pstrId, (LPVOID)new CDuiString(pstrPath)); } else if( _tcsicmp(pstrClass,_T("Xml")) == 0 && node.HasAttributes()) { //加载XML配置文件 nAttributes = node.GetAttributeCount(); for( int i = 0; i < nAttributes; i++ ) { pstrName = node.GetAttributeName(i); pstrValue = node.GetAttributeValue(i); if( _tcsicmp(pstrName, _T("id")) == 0 ) { pstrId = pstrValue; } else if( _tcsicmp(pstrName, _T("path")) == 0 ) { pstrPath = pstrValue; } } if( pstrId == NULL || pstrPath == NULL) continue; CDuiString * pstrFind = static_cast(m_mXmlHashMap.Find(pstrId)); if(pstrFind != NULL) continue; m_mXmlHashMap.Insert(pstrId, (LPVOID)new CDuiString(pstrPath)); } else continue; } return TRUE; } LPCTSTR CResourceManager::GetImagePath(LPCTSTR lpstrId) { CDuiString * lpStr = static_cast(m_mImageHashMap.Find(lpstrId)); return lpStr == NULL? NULL:lpStr->GetData(); } LPCTSTR CResourceManager::GetXmlPath(LPCTSTR lpstrId) { CDuiString * lpStr = static_cast(m_mXmlHashMap.Find(lpstrId)); return lpStr == NULL? NULL:lpStr->GetData(); } void CResourceManager::ResetResourceMap() { CDuiString* lpStr; for( int i = 0; i< m_mImageHashMap.GetSize(); i++ ) { if(LPCTSTR key = m_mImageHashMap.GetAt(i)) { lpStr = static_cast(m_mImageHashMap.Find(key)); delete lpStr; lpStr = NULL; } } for( int i = 0; i< m_mXmlHashMap.GetSize(); i++ ) { if(LPCTSTR key = m_mXmlHashMap.GetAt(i)) { lpStr = static_cast(m_mXmlHashMap.Find(key)); delete lpStr; lpStr = NULL; } } for( int i = 0; i< m_mTextResourceHashMap.GetSize(); i++ ) { if(LPCTSTR key = m_mTextResourceHashMap.GetAt(i)) { lpStr = static_cast(m_mTextResourceHashMap.Find(key)); delete lpStr; lpStr = NULL; } } } BOOL CResourceManager::LoadLanguage(LPCTSTR pstrXml) { CMarkup xml; if( *(pstrXml) == _T('<') ) { if( !xml.Load(pstrXml) ) return FALSE; } else { if( !xml.LoadFromFile(pstrXml) ) return FALSE; } CMarkupNode Root = xml.GetRoot(); if( !Root.IsValid() ) return FALSE; LPCTSTR pstrClass = NULL; int nAttributes = 0; LPCTSTR pstrName = NULL; LPCTSTR pstrValue = NULL; LPTSTR pstr = NULL; //加载图片资源 LPCTSTR pstrId = NULL; LPCTSTR pstrText = NULL; for( CMarkupNode node = Root.GetChild() ; node.IsValid(); node = node.GetSibling() ) { pstrClass = node.GetName(); if ((_tcsicmp(pstrClass,_T("Text")) == 0) && node.HasAttributes()) { //加载图片资源 nAttributes = node.GetAttributeCount(); for( int i = 0; i < nAttributes; i++ ) { pstrName = node.GetAttributeName(i); pstrValue = node.GetAttributeValue(i); if( _tcsicmp(pstrName, _T("id")) == 0 ) { pstrId = pstrValue; } else if( _tcsicmp(pstrName, _T("value")) == 0 ) { pstrText = pstrValue; } } if( pstrId == NULL || pstrText == NULL) continue; CDuiString *lpstrFind = static_cast(m_mTextResourceHashMap.Find(pstrId)); if(lpstrFind != NULL) { lpstrFind->Assign(pstrText); } else { m_mTextResourceHashMap.Insert(pstrId, (LPVOID)new CDuiString(pstrText)); } } else continue; } return TRUE; } CDuiString CResourceManager::GetText(LPCTSTR lpstrId, LPCTSTR lpstrType) { if(lpstrId == NULL) return _T(""); CDuiString *lpstrFind = static_cast(m_mTextResourceHashMap.Find(lpstrId)); if (lpstrFind == NULL && m_pQuerypInterface) { LPCTSTR lpText = m_pQuerypInterface->QueryControlText(lpstrId, lpstrType); if(lpText != NULL) { lpstrFind = new CDuiString(lpText); m_mTextResourceHashMap.Insert(lpstrId, (LPVOID)lpstrFind); } } return lpstrFind == NULL ? lpstrId : *lpstrFind; } void CResourceManager::ReloadText() { if(m_pQuerypInterface == NULL) return; //重载文字描述 LPCTSTR lpstrId = NULL; LPCTSTR lpstrText; for( int i = 0; i < m_mTextResourceHashMap.GetSize(); i++ ) { lpstrId = m_mTextResourceHashMap.GetAt(i); if (lpstrId == NULL) continue; lpstrText = m_pQuerypInterface->QueryControlText(lpstrId, NULL); if(lpstrText != NULL) { CDuiString * lpStr = static_cast(m_mTextResourceHashMap.Find(lpstrId)); lpStr->Assign(lpstrText); } } } void CResourceManager::ResetTextMap() { CDuiString * lpStr; for( int i = 0; i< m_mTextResourceHashMap.GetSize(); i++ ) { if(LPCTSTR key = m_mTextResourceHashMap.GetAt(i)) { lpStr = static_cast(m_mTextResourceHashMap.Find(key)); delete lpStr; } } } } // namespace DuiLib