Read Lex from a XML file |
Post Reply |
Author | |
Italo
Groupie Joined: 10 December 2003 Location: United States Status: Offline Points: 83 |
Post Options
Thanks(0)
Posted: 08 January 2007 at 4:45pm |
Would it be possible to implement the code below to support reading a Lex from a XML file? 1. Change CXTPSyntaxEditCtrl::Create to
BOOL Create(CWnd *pParent, BOOL bHorzScroll, BOOL bVertScroll, CXTPSyntaxEditBufferManager *pBuffer = NULL, CCreateContext *lpCS = NULL, bool bXml=false); 2. Change XTPSyntaxEditCtrl.cpp line 555 to
if (!SetConfigFile(csCfgFilePath,bXml)) 3. Change CXTPSyntaxEditCtrl::SetConfigFile and CXTPSyntaxEditBufferManager::SetConfigFile to BOOL SetConfigFile(LPCTSTR szPath, bool bXml=false); 4. Change XTPSyntaxEditCtrl.cpp line 6892 to m_pBuffer->SetConfigFile(szPath,bXml); 5. Change CXTPSyntaxEditBufferManager.cpp line 1199 to m_ptrLexConfigurationManager->ReloadConfig(szPath,bXml); 6. Add the lines below to CXTPSyntaxEditConfigurationManager bool GetXml() const { return m_bXml; } bool m_bXml; // Indicates whether the configuration file is in a XML 7. Change CXTPSyntaxEditConfigurationManager::ReloadConfig to void CXTPSyntaxEditConfigurationManager::ReloadConfig(const CString& strConfigFilePath, bool bXml) { CSingleLock singleLock(&m_DataLockerCS, TRUE); m_strMainIniFilename = strConfigFilePath; m_bXml = bXml; if( bXml && strConfigFilePath.GetLength() > 4 && strConfigFilePath.Right( 4 ).CompareNoCase( _T(".ini") ) == 0 ) { m_strMainIniFilename = m_strMainIniFilename.Mid( 0, m_strMainIniFilename.GetLength() - 4 ) + _T(".xml"); } if( m_bXml ) ReloadConfigFromXml(); else ReloadConfig(); } 8. Add class CXTPPropExchangeXMLNode; to XTPSyntaxEditLexColorFileReader.h and XTPSyntaxEditLexCfgFileReader.h 9. Add #include "Common\XTPPropExchange.h" to XTPSyntaxEditLexColorFileReader.cpp and XTPSyntaxEditLexCfgFileReader.cpp
void CXTPSyntaxEditConfigurationManager::ReloadConfigFromXml() { ASSERT( m_bXml ); CSingleLock singleLock(&m_DataLockerCS, TRUE); TRACE(_T("LOAD/reload configuration from XML: %s \n"), (LPCTSTR)m_strMainIniFilename); // restart folder monitor m_FolderMonitor.StopMonitoring(); // Remove previous data m_ColorThemeManager.RemoveAll(); m_TextSchemesManager.RemoveAll(); if (!m_FolderMonitor.AddMonitorFile(m_strMainIniFilename, xtpEditCfgObjMainConfig)) { m_pConnectMT->SendEvent(xtpEditAllConfigWasChanged, 0, 0); // start monitoring config files m_FolderMonitor.StartMonitoring(); return; } CString strMainIniFolder; int nFLs = m_strMainIniFilename.ReverseFind(_T('\\')); if (nFLs > 0) { strMainIniFolder = m_strMainIniFilename.Mid(0, nFLs + 1); } m_FolderMonitor.SetDefaultFolder(strMainIniFolder); CXTPPropExchangeXMLNode* pXml = new CXTPPropExchangeXMLNode( TRUE, 0, _T("SyntaxEdit") ); ASSERT_VALID( pXml ); // Load the XML file if( !pXml->LoadFromFile( m_strMainIniFilename ) ) { TRACE0( _T("Failed to load XML file.\n") ); pXml->InternalRelease(); return; } pXml->OnBeforeExchange(); pXml->SetCompactMode( TRUE ); // Load the themes CXTPPropExchangeSection secThemes( pXml->GetSection( _T("Themes") ) ); CXTPPropExchangeEnumeratorPtr ptrXmlEnumThemes( ((CXTPPropExchangeXMLNode*)&secThemes)->GetEnumerator( _T("Theme") ) ); for( POSITION xmlPos = ptrXmlEnumThemes->GetPosition(); xmlPos != NULL; ) { if( m_hReloadThread && m_pBreakReloadEvent ) { if( XTPSyntaxEditLexAnalyser::IsEventSet( *m_pBreakReloadEvent ) ) { TRACE(_T("BREAK config reloading. \n")); return; } } // Load the current theme CXTPPropExchangeSection secTheme( ptrXmlEnumThemes->GetNext( xmlPos ) ); m_ColorThemeManager.LoadThemeFromXml( (CXTPPropExchangeXMLNode*)&secTheme ); } // Load the schemas CXTPPropExchangeSection secSchemas( pXml->GetSection( _T("Schemas") ) ); CXTPPropExchangeEnumeratorPtr ptrXmlEnumSchemas( ((CXTPPropExchangeXMLNode*)&secSchemas)->GetEnumerator( _T("Schema") ) ); for( POSITION xmlPos = ptrXmlEnumSchemas->GetPosition(); xmlPos != NULL; ) { if( m_hReloadThread && m_pBreakReloadEvent ) { if( XTPSyntaxEditLexAnalyser::IsEventSet( *m_pBreakReloadEvent ) ) { TRACE(_T("BREAK config reloading. \n")); return; } } // Load the current theme CXTPPropExchangeSection secSchema( ptrXmlEnumSchemas->GetNext( xmlPos ) ); m_TextSchemesManager.LoadTextSchemeFromXml( (CXTPPropExchangeXMLNode*)&secSchema ); } pXml->InternalRelease(); // set default theme SetTheme(m_strCurrentThemeName); //======================================================================== if (m_hReloadThread && m_pBreakReloadEvent) { if (XTPSyntaxEditLexAnalyser::IsEventSet(*m_pBreakReloadEvent)) { TRACE(_T("BREAK config reloading. \n")); return; } } //======================================================================== m_pConnectMT->SendEvent(xtpEditAllConfigWasChanged, 0, 0); // start monitoring config files m_FolderMonitor.StartMonitoring(); } void CXTPSyntaxEditColorThemesManager::LoadThemeFromXml( CXTPPropExchangeXMLNode* pXml ) { // Get the theme name CString strThemeName; PX_String( pXml, _T("Name"), strThemeName ); ASSERT( strThemeName.GetLength() > 0 ); if( strThemeName.GetLength() == 0 ) return; // delete old theme CXTPSyntaxEditColorTheme* pTheme = NULL; if( m_mapThemes.Lookup( strThemeName, pTheme ) && pTheme ) { delete pTheme; // delete its name for( int i = 0; i < m_arThemeNames.GetSize(); i++ ) { if( !m_arThemeNames.GetAt( i ).CompareNoCase(strThemeName) ) { m_arThemeNames.RemoveAt( i ); break; } } } // create and load new theme pTheme = new CXTPSyntaxEditColorTheme( this ); pTheme->LoadFromXml(strThemeFilename); m_mapThemes[strThemeName] = pTheme; m_arThemeNames.Add(strThemeName); } void CXTPSyntaxEditColorTheme::LoadFromXml( CXTPPropExchangeXMLNode* pXml ) { // Load the Styles node CXTPPropExchangeSection secStyles( pXml->GetSection( _T("Styles") ) ); // Get the styles name CString strStylesName; PX_String( &secStyles, _T("Name"), strStylesName ); ASSERT( strStylesName.GetLength() > 0 ); if( strStylesName.GetLength() == 0 ) return; CXTPSyntaxEditColorInfo* pColorInfo = new CXTPSyntaxEditColorInfo( strStylesName, this ); // Load the Style nodes CXTPPropExchangeEnumeratorPtr ptrXmlEnumStyles( ((CXTPPropExchangeXMLNode*)&secStyles)->GetEnumerator( _T("Style") ) ); for( POSITION xmlPos = ptrXmlEnumStyles->GetPosition(); xmlPos != NULL; ) { CXTPPropExchangeSection secStyle( ptrXmlEnumStyles->GetNext( xmlPos ) ); // Get the style name and value CString strStyleName; PX_String( &secStyle, _T("Name"), strStyleName ); ASSERT( strStyleName.GetLength() > 0 ); if( strStyleName.GetLength() == 0 ) continue; CString strStyleValue; PX_String( &secStyle, _T("Value"), strStyleValue ); ASSERT( strStyleValue.GetLength() > 0 ); if( strStyleValue.GetLength() == 0 ) continue; pColorInfo->AddParam( strStyleName, strStyleValue ); } m_mapLexColorInfo[ strStylesName ] = pColorInfo; } void CXTPSyntaxEditTextSchemesManager::LoadTextSchemeFromXml( CXTPPropExchangeXMLNode* pXml ) { // Get the schema name CString strSchemaName; PX_String( pXml, _T("Name"), strSchemaName ); ASSERT( strSchemaName.GetLength() > 0 ); if( strSchemaName.GetLength() == 0 ) return; CString strSchemeNameLower( strSchemaName ); strSchemeNameLower.MakeLower(); XTPSyntaxEditLexConfig()->ReadSourceFromXml( pXml ); CXTPSyntaxEditLexClassInfoArray& arLexClassInfo = XTPSyntaxEditLexConfig()->GetLexClassInfoArray(); CXTPSyntaxEditTextSchemaPtr ptrTxtSch( new CXTPSyntaxEditTextSchema( strSchemaName ) ); if (ptrTxtSch) { ptrTxtSch->LoadClassSchema( arLexClassInfo ); m_mapSchemes[strSchemeNameLower] = ptrTxtSch; } } void CXTPSyntaxEditLexCfgFileReader::ReadSourceFromXml( CXTPPropExchangeXMLNode* pXml ) { // Load the LexClass nodes CXTPPropExchangeEnumeratorPtr ptrXmlEnumLexClass( pXml->GetEnumerator( _T("LexClass") ) ); for( POSITION posLexClass = ptrXmlEnumLexClass->GetPosition(); posLexClass != NULL; ) { CXTPPropExchangeSection secLexClass( ptrXmlEnumLexClass->GetNext( posLexClass ) ); // Get the LexClass name CString strLexClassName; PX_String( &secLexClass, _T("Name"), strLexClassName ); ASSERT( strLexClassName.GetLength() > 0 ); if( strLexClassName.GetLength() == 0 ) return; XTP_EDIT_LEXCLASSINFO infoClass; infoClass.csClassName = strLexClassName; infoClass.nStartLine = -1; infoClass.nEndLine = -1; // Load the properties CXTPPropExchangeEnumeratorPtr ptrXmlEnumProps( ((CXTPPropExchangeXMLNode*)&secLexClass)->GetEnumerator( _T("Property") ) ); for( POSITION posProp = ptrXmlEnumProps->GetPosition(); posProp != NULL; ) { CXTPPropExchangeSection secProp( ptrXmlEnumProps->GetNext( posProp ) ); // Get the property name and value CString strPropName; PX_String( &secProp, _T("Name"), strPropName ); strPropName.Trim(); if( strPropName.GetLength() == 0 ) continue; CString strPropValueRaw; PX_String( &secProp, _T("Value"), strPropValueRaw ); CString strPropValue = StrToES( strPropValueRaw, TRUE ); XTP_EDIT_LEXPROPINFO infoProp; _ParsePropName( strPropName, infoProp ); _ParsePropValue( strPropValue, infoProp ); infoProp.nLine = -1; infoProp.nOffset = -1; infoProp.nPropertyLen = strPropName.GetLength(); if( infoProp.arPropName.GetCount() > 0 && infoProp.arPropValue.GetCount() > 0 ) infoClass.arPropertyDesc.Add( infoProp ); } m_arLexClassInfo.Add( infoClass ); } } void CXTPSyntaxEditLexCfgFileReader::_ParsePropName( const CString& sPropName, XTP_EDIT_LEXPROPINFO& infoProp ) { int nTokenPos = 0; CString sToken = sPropName.Tokenize( _T(":"), nTokenPos ); while( !sToken.IsEmpty() ) { ASSERT( !sToken.IsEmpty() ); infoProp.arPropName.Add( sToken ); sToken = sPropName.Tokenize( _T(":"), nTokenPos ); } } void CXTPSyntaxEditLexCfgFileReader::_ParsePropValue( const CString& sPropValue, XTP_EDIT_LEXPROPINFO& infoProp ) { TCHAR tLastChar = '\0'; bool bInQuote = false; bool bWantComma = false; int nStart = 0; int nLength = sPropValue.GetLength() - 1; for( int nPos = 0; nPos <= nLength; nPos++ ) { TCHAR tChar = sPropValue.GetAt( nPos ); if( tChar == '/' && tLastChar == '/' ) break; if( !bWantComma || tChar != ',' ) { bWantComma = false; if( bInQuote && tChar == '\'' && tLastChar != '\\' ) { CString sValue = sPropValue.Mid( nStart, nPos - nStart + 1 ); infoProp.arPropValue.Add( sValue ); bInQuote = false; bWantComma = true; nStart = nPos + 1; } else if( !bInQuote && tChar == '\'' ) { bInQuote = true; nStart = nPos; } else if( !bInQuote && tChar == ',' ) { CString sValue = sPropValue.Mid( nStart, nPos - nStart ); infoProp.arPropValue.Add( sValue.Trim() ); nStart = nPos + 1; } } else if( tChar == ',' ) { bWantComma = false; nStart = nPos + 1; } tLastChar = tChar; } if( !bInQuote && nStart <= nLength ) { CString sValue = sPropValue.Mid( nStart, nLength - nStart + 1 ); infoProp.arPropValue.Add( sValue.Trim() ); } } |
|
Post Reply | |
Tweet
|
Forum Jump | Forum Permissions You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |