XTPSyntaxEditLexParser.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:118k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditLexParser.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. //////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. // common includes
  22. #include "Common/XTPNotifyConnection.h"
  23. #include "Common/XTPSmartPtrInternalT.h"
  24. // syntax editor includes
  25. #include "XTPSyntaxEditDefines.h"
  26. #include "XTPSyntaxEditStruct.h"
  27. #include "XTPSyntaxEditLexPtrs.h"
  28. #include "XTPSyntaxEditLexClassSubObjT.h"
  29. #include "XTPSyntaxEditTextIterator.h"
  30. #include "XTPSyntaxEditSectionManager.h"
  31. #include "XTPSyntaxEditLexCfgFileReader.h"
  32. #include "XTPSyntaxEditLexClassSubObjDef.h"
  33. #include "XTPSyntaxEditLexClass.h"
  34. #include "XTPSyntaxEditLexParser.h"
  35. #include "XTPSyntaxEditLexColorFileReader.h"
  36. #include "XTPSyntaxEditBufferManager.h"
  37. #include "XTPSyntaxEditCtrl.h"
  38. #include <afxmt.h>
  39. #ifdef _DEBUG
  40. #define new DEBUG_NEW
  41. #undef THIS_FILE
  42. static char THIS_FILE[] = __FILE__;
  43. #endif
  44. #ifdef _DEBUG
  45. //  #define DBG_TRACE_LOAD_CLASS_SCH
  46. // Trace text blocks start,end when parser running;
  47. //  #define DBG_TRACE_PARSE_START_STOP TRACE
  48. // Trace text blocks start,end when parser running;
  49. //  #define DBG_TRACE_PARSE_RUN_BLOCKS TRACE
  50. // Trace updating schema mechanism when parser running;
  51. //  #define DBG_TRACE_PARSE_RUN_UPDATE TRACE
  52. //  #define DBG_TRACE_PARSE_RUN_RESULTS
  53. //  #define DBG_TRACE_PARSE_TIME
  54. //  #define DBG_TRACE_PARSE_TIME_DLG
  55. //  #define DBG_TRACE_DRAW_BLOCKS
  56. #endif
  57. #ifndef DBG_TRACE_PARSE_RUN_BLOCKS
  58. #define DBG_TRACE_PARSE_RUN_BLOCKS
  59. #endif
  60. #ifndef DBG_TRACE_PARSE_RUN_UPDATE
  61. #define DBG_TRACE_PARSE_RUN_UPDATE
  62. #endif
  63. #ifndef DBG_TRACE_PARSE_START_STOP
  64. #define DBG_TRACE_PARSE_START_STOP
  65. #endif
  66. ////////////////////////////////////////////////////////////////////////////
  67. #ifdef _DEBUG
  68. #define DBG_TRACE_TIME_BEGIN(nID) DWORD dbg_TT_##nID##_dwTime_0 = ::GetTickCount();
  69. #define DBG_TRACE_TIME_END(nID, strComment) { DWORD dwTime1 = ::GetTickCount(); 
  70. TRACE(_T("%s (%.3f sec) n"), strComment, labs(dwTime1-dbg_TT_##nID##_dwTime_0)/1000.0); }
  71. class C_DBG_Time {
  72. CString m_strComment;
  73. DWORD m_dwTime0;
  74. public:
  75. C_DBG_Time(LPCTSTR lpcszComment)
  76. {
  77. m_dwTime0 = ::GetTickCount();
  78. m_strComment = lpcszComment;
  79. };
  80. ~C_DBG_Time()
  81. {
  82. DWORD dwTime1 = ::GetTickCount();
  83. TRACE(_T("%s (%.3f sec) n"), (LPCTSTR)m_strComment, labs(dwTime1-m_dwTime0)/1000.0);
  84. };
  85. };
  86. //#define DBG_TRACE_TIME(nID, strComment) C_DBG_Time dbg_TT_##nID(strComment);
  87. #endif
  88. #ifndef DBG_TRACE_TIME
  89. #define DBG_TRACE_TIME(nID, strComment)
  90. #endif
  91. ////////////////////////////////////////////////////////////////////////////
  92. using namespace XTPSyntaxEditLexAnalyser;
  93. namespace XTPSyntaxEditLexAnalyser
  94. {
  95. extern CXTPSyntaxEditLexAutomatMemMan* XTPGetLexAutomatMemMan();
  96. extern void ConcatenateLVArrays(CXTPSyntaxEditLexVariantPtrArray* pArDest,
  97. CXTPSyntaxEditLexVariantPtrArray* pAr2, int nMaxCount = INT_MAX);
  98. extern BOOL SortTagsInLexVarArray(CXTPSyntaxEditLexVariantPtrArray& rarTags,
  99. BOOL bAscending, BOOL bNoCase);
  100. int FindStrCount(const CStringArray& rarData, LPCTSTR pcszStr, BOOL bCase = FALSE)
  101. {
  102. int nStrCount = 0;
  103. int nCount = (int)rarData.GetSize();
  104. for (int i = 0; i < nCount; i++)
  105. {
  106. const CString& strI = rarData[i];
  107. if (bCase)
  108. {
  109. if (strI.Compare(pcszStr) == 0)
  110. {
  111. nStrCount++;
  112. }
  113. }
  114. else
  115. {
  116. if (strI.CompareNoCase(pcszStr) == 0)
  117. {
  118. nStrCount++;
  119. }
  120. }
  121. }
  122. return nStrCount;
  123. }
  124. int FindStr(const CStringArray& rarData, LPCTSTR pcszStr, BOOL bCase = FALSE)
  125. {
  126. int nCount = (int)rarData.GetSize();
  127. for (int i = 0; i < nCount; i++)
  128. {
  129. const CString& strI = rarData[i];
  130. if (bCase)
  131. {
  132. if (strI.Compare(pcszStr) == 0)
  133. {
  134. return i;
  135. }
  136. }
  137. else
  138. {
  139. if (strI.CompareNoCase(pcszStr) == 0)
  140. {
  141. return i;
  142. }
  143. }
  144. }
  145. return -1;
  146. }
  147. int Find_noCase(CStringArray& rarData, LPCTSTR strData)
  148. {
  149. return FindStr(rarData, strData, FALSE);
  150. }
  151. void AddIfNeed_noCase(CStringArray& rarData, LPCTSTR strNew)
  152. {
  153. int nFIdx = Find_noCase(rarData, strNew);
  154. if (nFIdx < 0)
  155. {
  156. rarData.Add(strNew);
  157. }
  158. }
  159. void ConcatenateArrays_noCase(CStringArray& rarDest, CStringArray& rarSrc)
  160. {
  161. int nCount = (int)rarSrc.GetSize();
  162. for (int i = 0; i < nCount; i++)
  163. {
  164. CString strI = rarSrc[i];
  165. AddIfNeed_noCase(rarDest, strI);
  166. }
  167. }
  168. BOOL IsEventSet(HANDLE hEvent)
  169. {
  170. DWORD dwRes = ::WaitForSingleObject(hEvent, 0);
  171. return dwRes == WAIT_OBJECT_0;
  172. }
  173. BOOL IsMutexLocked(CMutex* pMu)
  174. {
  175. if (!pMu)
  176. {
  177. ASSERT(FALSE);
  178. return FALSE;
  179. }
  180. BOOL bEntered = pMu->Lock(0);
  181. if (bEntered)
  182. {
  183. pMu->Unlock();
  184. }
  185. return !bEntered;
  186. }
  187. CString DBG_TraceIZone(const XTP_EDIT_LINECOL* pLCStart, const XTP_EDIT_LINECOL* pLCEnd)
  188. {
  189. CString sDBGpos, sTmp;
  190. if (pLCStart && !pLCEnd && pLCStart->GetXLC() == XTP_EDIT_XLC(1, 0) )
  191. {
  192. sDBGpos = _T("All:(1,0 - NULL)");
  193. }
  194. else if (pLCStart || pLCEnd)
  195. {
  196. sDBGpos = _T("Part:(");
  197. sTmp = _T("NULL");
  198. if (pLCStart)
  199. {
  200. sTmp.Format(_T("%d,%d"), pLCStart->nLine, pLCStart->nCol);
  201. }
  202. sDBGpos += sTmp + _T(" - ");
  203. sTmp = _T("NULL");
  204. if (pLCEnd)
  205. {
  206. sTmp.Format(_T("%d,%d"), pLCEnd->nLine, pLCEnd->nCol);
  207. }
  208. sDBGpos += sTmp;
  209. sDBGpos += _T(")");
  210. } else {
  211. sDBGpos = _T("Rest(NULL - NULL)");
  212. }
  213. return sDBGpos;
  214. }
  215. CString DBG_TraceTB_StartEndCls(CXTPSyntaxEditLexTextBlock* pTB)
  216. {
  217. if (!pTB)
  218. {
  219. return _T("?<NULL> (? - ?) - ?");
  220. }
  221. CString str;
  222. str.Format(_T("(%d,%d - %d,%d) - %s"), pTB->m_PosStartLC.nLine,
  223. pTB->m_PosStartLC.nCol, pTB->m_PosEndLC.nLine, pTB->m_PosEndLC.nCol,
  224. pTB->m_ptrLexClass ? (LPCTSTR)pTB->m_ptrLexClass->GetClassName() : _T("???<NULL>") );
  225. return str;
  226. }
  227. }
  228. //BEGIN_IMPLEMENT_XTPSINK(CXTPSyntaxEditLexParser, m_SinkMT)
  229. //  ON_XTP_NOTIFICATION(xtpEditOnParserStarted,     OnParseEvent_NotificationHandler)
  230. //  ON_XTP_NOTIFICATION(xtpEditOnTextBlockParsed,   OnParseEvent_NotificationHandler)
  231. //  ON_XTP_NOTIFICATION(xtpEditOnParserEnded,       OnParseEvent_NotificationHandler)
  232. //END_IMPLEMENT_XTPSINK
  233. ////////////////////////////////////////////////////////////////////////////
  234. // CXTPSyntaxEditLexTextSchema
  235. void CXTPSyntaxEditTextRegion::Clear()
  236. {
  237. m_posStart.Clear();
  238. m_posEnd.Clear();
  239. }
  240. void CXTPSyntaxEditTextRegion::Set(const XTP_EDIT_LINECOL* pLCStart, const XTP_EDIT_LINECOL* pLCEnd)
  241. {
  242. m_posStart.nLine = INT_MAX;
  243. m_posStart.nCol = 0;
  244. m_posEnd.Clear();
  245. if (pLCStart)
  246. {
  247. m_posStart = *pLCStart;
  248. }
  249. if (pLCEnd)
  250. {
  251. m_posEnd = *pLCEnd;
  252. }
  253. }
  254. CXTPSyntaxEditLexTokensDef::~CXTPSyntaxEditLexTokensDef()
  255. {
  256. }
  257. CXTPSyntaxEditLexTokensDef::CXTPSyntaxEditLexTokensDef(const CXTPSyntaxEditLexTokensDef& rSrc)
  258. {
  259. m_arTokens.Copy(rSrc.m_arTokens);
  260. m_arStartSeps.Copy(rSrc.m_arStartSeps);
  261. m_arEndSeps.Copy(rSrc.m_arEndSeps);
  262. }
  263. const CXTPSyntaxEditLexTokensDef& CXTPSyntaxEditLexTokensDef::operator=(const CXTPSyntaxEditLexTokensDef& rSrc)
  264. {
  265. m_arTokens.RemoveAll();
  266. m_arStartSeps.RemoveAll();
  267. m_arEndSeps.RemoveAll();
  268. m_arTokens.Append(rSrc.m_arTokens);
  269. m_arStartSeps.Append(rSrc.m_arStartSeps);
  270. m_arEndSeps.Append(rSrc.m_arEndSeps);
  271. return *this;
  272. }
  273. CXTPSyntaxEditLexTextSchema::CXTPSyntaxEditLexTextSchema(LPCTSTR pcszSchName):
  274. m_evBreakParsing(FALSE, TRUE)
  275. {
  276. //m_CloserManager.SetParentObject(this);
  277. m_pClassSchema = new CXTPSyntaxEditLexClassSchema();
  278. m_pConnectMT = new CXTPNotifyConnectionMT();
  279. m_nNoEndedClassesCount = 0;
  280. m_curInvalidZone.Clear();
  281. m_mapLastParsedBlocks.InitHashTable(101);
  282. m_nSeekNext_TagWaitChars = 0;
  283. m_strSchName = pcszSchName;
  284. m_bSendProgressEvents = FALSE;
  285. }
  286. CXTPSyntaxEditLexTextSchema::~CXTPSyntaxEditLexTextSchema()
  287. {
  288. Close();
  289. CMDTARGET_RELEASE(m_pClassSchema);
  290. CMDTARGET_RELEASE(m_pConnectMT);
  291. }
  292. CString CXTPSyntaxEditLexTextSchema::GetSchName() const
  293. {
  294. return m_strSchName;
  295. }
  296. //CXTPSyntaxEditLexTextSchemaCloserManPtr CXTPSyntaxEditLexTextSchema::GetCloserManager()
  297. //{
  298. //  CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  299. //  CSingleLock singleLock(GetDataLoker(), TRUE);
  300. //
  301. //  ASSERT(m_CloserManager.m_ptrParentObj || m_CloserManager.m_dwRef == 0);
  302. //  ASSERT(this == (CXTPSyntaxEditLexTextSchema*)m_CloserManager.m_ptrParentObj || !m_CloserManager.m_ptrParentObj);
  303. //
  304. //  m_CloserManager.SetParentObject(this);
  305. //
  306. //  CXTPSyntaxEditLexTextSchemaCloserManPtr ptrRes(&m_CloserManager, TRUE);
  307. //  return ptrRes;
  308. //}
  309. CXTPNotifyConnection* CXTPSyntaxEditLexTextSchema::GetConnection()
  310. {
  311. return m_pConnectMT;
  312. }
  313. CXTPSyntaxEditLexClassSchema* CXTPSyntaxEditLexTextSchema::GetClassSchema()
  314. {
  315. return m_pClassSchema;
  316. }
  317. CXTPSyntaxEditLexTextSchema* CXTPSyntaxEditLexTextSchema::Clone()
  318. {
  319. CXTPSyntaxEditLexTextSchema* ptrNewSch = new CXTPSyntaxEditLexTextSchema(m_strSchName);
  320. if (!ptrNewSch)
  321. {
  322. return NULL;
  323. }
  324. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  325. CSingleLock singleLock(GetDataLoker(), TRUE);
  326. if (!m_pClassSchema->Copy(ptrNewSch->m_pClassSchema))
  327. {
  328. ptrNewSch->InternalRelease();
  329. return NULL;
  330. }
  331. return ptrNewSch;
  332. }
  333. void CXTPSyntaxEditLexTextSchema::Close()
  334. {
  335. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  336. CSingleLock singleLock(GetDataLoker(), TRUE);
  337. RemoveAll();
  338. m_pClassSchema->Close();
  339. }
  340. void CXTPSyntaxEditLexTextSchema::RemoveAll()
  341. {
  342. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  343. CSingleLock singleLock(GetDataLoker(), TRUE);
  344. Close(m_ptrFirstBlock);
  345. m_ptrFirstBlock = NULL;
  346. m_mapLastParsedBlocks.RemoveAll();
  347. m_ptrLastParsedBlock = NULL;
  348. }
  349. void CXTPSyntaxEditLexTextSchema::Close(CXTPSyntaxEditLexTextBlock* pFirst)
  350. {
  351. CXTPSyntaxEditLexTextBlockPtr ptrChTB(pFirst, TRUE);
  352. while (ptrChTB)
  353. {
  354. CXTPSyntaxEditLexTextBlockPtr ptrChTBnext = ptrChTB->m_ptrNext;
  355. ptrChTB->Close();
  356. ptrChTB = ptrChTBnext;
  357. }
  358. }
  359. BOOL CXTPSyntaxEditLexTextSchema::IsBlockStartStillHere(CTextIter* pTxtIter, CXTPSyntaxEditLexTextBlock* pTB)
  360. {
  361. if (!pTxtIter || !pTB || !pTB->m_ptrLexClass)
  362. {
  363. ASSERT(FALSE);
  364. return FALSE;
  365. }
  366. if (!pTxtIter->SeekPos(pTB->m_PosStartLC, m_evBreakParsing))
  367. {
  368. return FALSE;
  369. }
  370. CXTPSyntaxEditLexTextBlockPtr ptrTBtmp;
  371. int nPres = pTB->m_ptrLexClass->RunParse(pTxtIter, this, ptrTBtmp);
  372. BOOL bStarted = (nPres & xtpEditLPR_StartFound) != 0;
  373. return bStarted;
  374. }
  375. // DEBUG ////////////////////////////////////////////////////////////////
  376. #ifdef DBG_TRACE_PARSE_RUN_RESULTS
  377. #define DBG_TRACE_PARSE_RUN_RESULTS_PROC(bFull) TraceTxtBlocks(bFull);
  378. #else
  379. #define DBG_TRACE_PARSE_RUN_RESULTS_PROC(bFull)
  380. #endif
  381. // END DEBUG ////////////////////////////////////////////////////////////
  382. void CXTPSyntaxEditLexTextSchema::TraceTxtBlocks(BOOL bFull)
  383. {
  384. TRACE(_T("n*** DBG_TRACE_PARSE_RUN_RESULTS *** --( %s )---------n"),
  385. bFull ? _T("FULL") : _T("updated part") );
  386. CXTPSyntaxEditLexTextBlockPtr ptrTB = bFull ? m_ptrFirstBlock : m_ptrNewChainTB1;
  387. for (int i = 0; ptrTB && (bFull || ptrTB->m_ptrPrev != m_ptrNewChainTB2); i++)
  388. {
  389. TRACE(_T("(%05d) startPos=(%d,%d) endPos=(%d,%d), [%s]n"), i,
  390. ptrTB->m_PosStartLC.nLine, ptrTB->m_PosStartLC.nCol,
  391. ptrTB->m_PosEndLC.nLine, ptrTB->m_PosEndLC.nCol,
  392. (LPCTSTR)ptrTB->m_ptrLexClass->m_strClassName);
  393. ptrTB = ptrTB->m_ptrNext;
  394. }
  395. }
  396. int CXTPSyntaxEditLexTextSchema::RunParseUpdate(BOOL bShort, CTextIter* pTxtIter,
  397.   const XTP_EDIT_LINECOL* pLCStart,
  398.   const XTP_EDIT_LINECOL* pLCEnd,
  399.   BOOL bSendProgressEvents)
  400. {
  401. CSingleLock singleLock(GetDataLoker(), TRUE);
  402. m_mapLastParsedBlocks.RemoveAll();
  403. singleLock.Unlock();
  404. if (bSendProgressEvents)
  405. {
  406. m_pConnectMT->PostEvent(xtpEditOnParserStarted, 0, 0,
  407.  xtpNotifyGuarantyPost | xtpNotifyDirectCallForOneThread);
  408. }
  409. int nParseRes = Run_ParseUpdate0(bShort, pTxtIter, pLCStart, pLCEnd, bSendProgressEvents);
  410. if (bSendProgressEvents)
  411. {
  412. m_pConnectMT->PostEvent(xtpEditOnParserEnded, nParseRes, 0,
  413.  xtpNotifyGuarantyPost|xtpNotifyDirectCallForOneThread);
  414. }
  415. return nParseRes;
  416. }
  417. int CXTPSyntaxEditLexTextSchema::Run_ParseUpdate0(BOOL bShort, CTextIter* pTxtIter,
  418. const XTP_EDIT_LINECOL* pLCStart,
  419. const XTP_EDIT_LINECOL* pLCEnd,
  420. BOOL bSendProgressEvents)
  421. {
  422. if (!pTxtIter)
  423. {
  424. ASSERT(FALSE);
  425. return xtpEditLPR_Error;
  426. }
  427. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  428. //-------------------------
  429. m_curInvalidZone.Set(pLCStart, pLCEnd);
  430. m_ptrNewChainTB1 = NULL;
  431. m_ptrNewChainTB2 = NULL;
  432. m_ptrOldChainTBFirst = NULL;
  433. m_nNoEndedClassesCount = 0;
  434. m_bSendProgressEvents = bSendProgressEvents;
  435. int nParseRes = 0;
  436. //** (1) ** -------------------------
  437. CXTPSyntaxEditLexTextBlockPtr ptrStartTB = FindNearestTextBlock(m_curInvalidZone.m_posStart);
  438. if (ptrStartTB)
  439. {
  440. nParseRes = Run_ClassesUpdate1(pTxtIter, ptrStartTB, FALSE);
  441. if (nParseRes != -1)
  442. {
  443. if (nParseRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked|xtpEditLPR_RunFinished))
  444. {
  445. DBG_TRACE_PARSE_RUN_RESULTS_PROC(TRUE);
  446. DBG_TRACE_PARSE_RUN_RESULTS_PROC(FALSE);
  447. if (m_ptrNewChainTB1)
  448. {
  449. BOOL bByBreak = (nParseRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked)) != 0;
  450. FinishNewChain(bByBreak, pTxtIter->IsEOF());
  451. }
  452. return nParseRes;
  453. }
  454. }
  455. }
  456. if (!pLCStart || *pLCStart == XTP_EDIT_LINECOL::Pos1 ||
  457. nParseRes == -1 || !ptrStartTB )
  458. {
  459. nParseRes = 0;
  460. m_ptrOldChainTBFirst = m_ptrFirstBlock ? m_ptrFirstBlock->m_ptrNext : NULL;
  461. //** (2) ** -------------------------
  462. CXTPSyntaxEditLexClassPtrArray* ptrArClasses = m_pClassSchema->GetClasses(bShort);
  463. int nCCount = ptrArClasses ? (int)ptrArClasses->GetSize() : 0;
  464. CXTPSyntaxEditLexClassPtr ptrTopClass = nCCount ? ptrArClasses->GetAt(0) : NULL;
  465. BOOL bRunEOF = TRUE;
  466. while (nCCount && (!pTxtIter->IsEOF() || bRunEOF) )
  467. {
  468. bRunEOF = !pTxtIter->IsEOF();
  469. nParseRes = Run_ClassesUpdate2(pTxtIter, ptrArClasses, m_ptrFirstBlock);
  470. if (nParseRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked|xtpEditLPR_RunFinished))
  471. {
  472. DBG_TRACE_PARSE_RUN_RESULTS_PROC(TRUE);
  473. DBG_TRACE_PARSE_RUN_RESULTS_PROC(FALSE);
  474. if (m_ptrNewChainTB1)
  475. {
  476. BOOL bByBreak = (nParseRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked)) != 0;
  477. FinishNewChain(bByBreak, pTxtIter->IsEOF());
  478. }
  479. return nParseRes;
  480. }
  481. //** -------------------------------------------------------------
  482. if (!pTxtIter->IsEOF() && nCCount && !(nParseRes & xtpEditLPR_Iterated))
  483. {
  484. if (IsEventSet(m_evBreakParsing))
  485. {
  486. return xtpEditLPR_RunBreaked;
  487. }
  488. SeekNextEx(pTxtIter, ptrTopClass);
  489. }
  490. }
  491. }
  492. DBG_TRACE_PARSE_RUN_RESULTS_PROC(TRUE);
  493. DBG_TRACE_PARSE_RUN_RESULTS_PROC(FALSE);
  494. if (m_ptrNewChainTB1)
  495. {
  496. BOOL bByBreak = (nParseRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked)) != 0;
  497. FinishNewChain(bByBreak, pTxtIter->IsEOF());
  498. }
  499. return xtpEditLPR_RunFinished;
  500. }
  501. int CXTPSyntaxEditLexTextSchema::Run_ClassesUpdate1(CTextIter* pTxtIter,
  502.   CXTPSyntaxEditLexTextBlockPtr ptrStartTB,
  503.   BOOL bStarted)
  504. {
  505. if (!pTxtIter || !ptrStartTB || !ptrStartTB->m_ptrLexClass)
  506. {
  507. return xtpEditLPR_Error;
  508. }
  509. BOOL bIterated = FALSE;
  510. int nPres = 0;
  511. BOOL bRunEOF = TRUE;
  512. BOOL bEnded = FALSE;
  513. BOOL bStarted1 = bStarted;
  514. if (!bStarted)
  515. {
  516. CXTPSyntaxEditLexTextBlockPtr ptrTB = ptrStartTB;
  517. XTP_EDIT_LINECOL posStart = ptrStartTB->m_PosStartLC;
  518. bStarted1 = IsBlockStartStillHere(pTxtIter, ptrTB);
  519. while (!bStarted1 && ptrTB->m_ptrPrev)
  520. {
  521. ptrTB = ptrTB->m_ptrPrev;
  522. posStart = ptrTB->m_PosStartLC;
  523. bStarted1 = IsBlockStartStillHere(pTxtIter, ptrTB);
  524. if (IsEventSet(m_evBreakParsing))
  525. {
  526. return xtpEditLPR_RunBreaked;
  527. }
  528. }
  529. if (!bStarted1)
  530. {
  531. return -1; // Full reparse
  532. }
  533. if (m_curInvalidZone.m_posEnd.IsValidData() &&
  534. ptrTB->m_PosEndLC > m_curInvalidZone.m_posEnd)
  535. {
  536. if (ptrTB->m_ptrParent || !ptrTB->m_ptrNext)
  537. {
  538. m_curInvalidZone.m_posEnd = ptrTB->m_PosEndLC;
  539. }
  540. else
  541. { // level: file
  542. ASSERT(ptrTB->m_ptrNext);
  543. if (ptrTB->m_ptrNext->m_PosEndLC > m_curInvalidZone.m_posEnd)
  544. {
  545. m_curInvalidZone.m_posEnd = ptrTB->m_ptrNext->m_PosEndLC;
  546. }
  547. }
  548. }
  549. m_curInvalidZone.m_posStart = posStart;
  550. DBG_TRACE_PARSE_RUN_BLOCKS(_T("nREPARSE will start from pos =(%d,%d), Run class [%s] {%d}-noEndedStack n"),
  551. posStart.nLine, posStart.nCol,
  552. ptrTB->m_ptrParent ?
  553. (ptrTB->m_ptrParent->m_ptrLexClass ?
  554. ptrTB->m_ptrParent->m_ptrLexClass->m_strClassName : _T("?<NULL> (parent)") )
  555. :( ptrTB->m_ptrLexClass ?
  556. ptrTB->m_ptrLexClass->m_strClassName : _T("?<NULL>") )
  557. , m_nNoEndedClassesCount );
  558. CString sDBGzone = DBG_TraceIZone(&m_curInvalidZone.m_posStart, &m_curInvalidZone.m_posEnd);
  559. DBG_TRACE_PARSE_RUN_UPDATE(_T("- Parser change invalid Zone [ %s ] n"), sDBGzone);
  560. // Seek iterator to begin of the block
  561. if (!pTxtIter->SeekPos(posStart, m_evBreakParsing))
  562. {
  563. return xtpEditLPR_Error;
  564. }
  565. if (IsEventSet(m_evBreakParsing))
  566. {
  567. return xtpEditLPR_RunBreaked;
  568. }
  569. ASSERT(!m_ptrNewChainTB1);
  570. m_ptrNewChainTB1 = ptrTB;
  571. if (ptrTB->m_ptrPrev)
  572. {
  573. m_ptrNewChainTB1 = ptrTB->m_ptrPrev;
  574. }
  575. m_ptrOldChainTBFirst = m_ptrNewChainTB1->m_ptrNext;
  576. DBG_TRACE_PARSE_RUN_UPDATE(_T("    NewChainTB1: %s n"), DBG_TraceTB_StartEndCls(m_ptrNewChainTB1));
  577. DBG_TRACE_PARSE_RUN_UPDATE(_T("    OldChainTBFirst: %s n"), DBG_TraceTB_StartEndCls(m_ptrOldChainTBFirst));
  578. ptrStartTB = ptrTB;
  579. }
  580. CXTPSyntaxEditLexClassPtr ptrRunClass = ptrStartTB->m_ptrLexClass;
  581. //** 1 **// Run existing block with children until block end
  582. while (bStarted && !bEnded && (bRunEOF || !pTxtIter->IsEOF()) )
  583. {
  584. if (IsEventSet(m_evBreakParsing))
  585. {
  586. return xtpEditLPR_RunBreaked;
  587. }
  588. bRunEOF = !pTxtIter->IsEOF();
  589. BOOL bSkipIterate = FALSE;
  590. nPres = ptrRunClass->RunParse(pTxtIter, this, ptrStartTB);
  591. if (nPres & (xtpEditLPR_Error|/*xtpEditLPR_RunBreaked|*/xtpEditLPR_RunFinished))
  592. {
  593. return nPres;
  594. }
  595. //---------------------------------------------------------------------------
  596. if (nPres & xtpEditLPR_Iterated)
  597. {
  598. bSkipIterate = TRUE;
  599. bIterated = TRUE;
  600. }
  601. //---------------------------------------------------------------------------
  602. bEnded = (nPres & xtpEditLPR_EndFound) != 0;
  603. if (bEnded)
  604. {
  605. CSingleLock singleLock(GetDataLoker(), TRUE);
  606. m_nNoEndedClassesCount--;
  607. int nECount = ptrStartTB->EndChildren(this);
  608. m_nNoEndedClassesCount -= nECount;
  609. //*** VALIDATION (when reparsing)
  610. if (m_ptrNewChainTB2 && m_ptrNewChainTB2->m_ptrNext)
  611. {
  612. while (m_ptrNewChainTB2->m_ptrNext &&
  613. m_ptrNewChainTB2->m_ptrNext->m_PosStartLC < ptrStartTB->m_PosEndLC)
  614. {
  615. m_ptrNewChainTB2->m_ptrNext = m_ptrNewChainTB2->m_ptrNext->m_ptrNext;
  616. }
  617. }
  618. DBG_TRACE_PARSE_RUN_BLOCKS(_T("(%08x) ENDED startPos=(%d,%d) endPos=(%d,%d), [%s] {%d}-noEndedStack n"),
  619. (CXTPSyntaxEditLexTextBlock*)ptrStartTB,
  620. ptrStartTB->m_PosStartLC.nLine, ptrStartTB->m_PosStartLC.nCol, ptrStartTB->m_PosEndLC.nLine,
  621. ptrStartTB->m_PosEndLC.nCol, ptrStartTB->m_ptrLexClass->m_strClassName, m_nNoEndedClassesCount);
  622. SendEvent_OnTextBlockParsed(ptrStartTB);
  623. }
  624. //---------------------------------------------------------------------------
  625. if (!bEnded && !bSkipIterate)
  626. {
  627. if (IsEventSet(m_evBreakParsing))
  628. {
  629. return xtpEditLPR_RunBreaked;
  630. }
  631. SeekNextEx(pTxtIter, ptrRunClass);
  632. }
  633. }
  634. //** end run existing **//
  635. if (bStarted && !bEnded && pTxtIter->IsEOF())
  636. {
  637. CXTPSyntaxEditLexTextBlock* pTB2end = ptrStartTB;
  638. for (; pTB2end; pTB2end = pTB2end->m_ptrParent)
  639. {
  640. pTB2end->m_PosEndLC = pTxtIter->GetPosLC();
  641. }
  642. return xtpEditLPR_RunFinished;
  643. }
  644. if (bStarted && bEnded || pTxtIter->IsEOF())
  645. {
  646. return xtpEditLPR_RunFinished;
  647. }
  648. //===========================================================================
  649. CXTPSyntaxEditLexTextBlockPtr ptrTBrun = ptrStartTB;
  650. if (ptrStartTB->m_ptrParent)
  651. {
  652. ptrTBrun = ptrStartTB->m_ptrParent;
  653. bEnded = FALSE;
  654. if (ptrTBrun->m_PosEndLC >= m_curInvalidZone.m_posStart &&
  655. ptrTBrun->m_PosEndLC <= m_curInvalidZone.m_posEnd)
  656. {
  657. m_nNoEndedClassesCount++;
  658. }
  659. }
  660. if (!bEnded && !pTxtIter->IsEOF())
  661. {
  662. if (IsEventSet(m_evBreakParsing))
  663. {
  664. return xtpEditLPR_RunBreaked;
  665. }
  666. nPres = Run_ClassesUpdate1(pTxtIter, ptrTBrun, bStarted1);
  667. if (nPres & (xtpEditLPR_Error|xtpEditLPR_RunBreaked|xtpEditLPR_RunFinished))
  668. {
  669. return nPres;
  670. }
  671. //---------------------------------
  672. if (nPres & xtpEditLPR_Iterated)
  673. {
  674. bIterated = TRUE;
  675. }
  676. }
  677. //---------------------------------------------------------------------------
  678. return (bIterated ? xtpEditLPR_Iterated : 0) | (pTxtIter->IsEOF() ? xtpEditLPR_RunFinished : 0);
  679. }
  680. int CXTPSyntaxEditLexTextSchema::Run_ClassesUpdate2(CTextIter* pTxtIter,
  681. CXTPSyntaxEditLexClassPtrArray* pArClasses,
  682. CXTPSyntaxEditLexTextBlockPtr ptrParentTB,
  683. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt)
  684. {
  685. int nCCount = (int)pArClasses->GetSize();
  686. BOOL bIterated = FALSE;
  687. int nReturn = 0;
  688. for (int i = 0; i < nCCount; i++)
  689. {
  690. CXTPSyntaxEditLexClass* pClass = pArClasses->GetAt(i, FALSE);
  691. ASSERT(pClass);
  692. if (!pClass)
  693. continue;
  694. CXTPSyntaxEditLexTextBlockPtr ptrTB = NULL;
  695. int nPres = 0;
  696. BOOL bStarted = FALSE;
  697. BOOL bEnded = FALSE;
  698. BOOL bRunEOF = FALSE;
  699. do
  700. {
  701. if (IsEventSet(m_evBreakParsing))
  702. {
  703. return xtpEditLPR_RunBreaked;
  704. }
  705. bRunEOF = !pTxtIter->IsEOF();
  706. BOOL bSkipIterate = FALSE;
  707. nPres = pClass->RunParse(pTxtIter, this, ptrTB, pOnScreenRunCnt);
  708. if (nPres & (xtpEditLPR_Error|/*xtpEditLPR_RunBreaked|*/xtpEditLPR_RunFinished))
  709. {
  710. return nPres;
  711. }
  712. //---------------------------------------------------------------------------
  713. if ((nPres & xtpEditLPR_StartFound) && ptrTB && !ptrTB->m_ptrPrev)
  714. {
  715. bStarted = TRUE;
  716. CSingleLock singleLock(GetDataLoker(), TRUE);
  717. ptrTB->m_ptrParent = ptrParentTB;
  718. if (ptrTB->m_ptrParent)
  719. {
  720. ptrTB->m_ptrParent->m_ptrLastChild = ptrTB;
  721. }
  722. if (!pOnScreenRunCnt)
  723. {
  724. //*** VALIDATION (when reparsing)
  725. if (m_ptrNewChainTB2 && m_ptrNewChainTB2->m_ptrNext)
  726. {
  727. while (m_ptrNewChainTB2->m_ptrNext &&
  728. m_ptrNewChainTB2->m_ptrNext->m_PosStartLC < ptrTB->m_PosStartLC)
  729. {
  730. m_ptrNewChainTB2->m_ptrNext = m_ptrNewChainTB2->m_ptrNext->m_ptrNext;
  731. }
  732. if (m_ptrNewChainTB2->m_ptrNext && m_curInvalidZone.m_posEnd.IsValidData() )
  733. {
  734. DBG_TRACE_PARSE_RUN_UPDATE(_T("n    <VALIDATE> TB current: %s n"), DBG_TraceTB_StartEndCls(ptrTB));
  735. DBG_TRACE_PARSE_RUN_UPDATE(_T("    <VALIDATE> TB next OLD: %s [NoEndedStack=%d]n"),
  736. DBG_TraceTB_StartEndCls(m_ptrNewChainTB2->m_ptrNext), m_nNoEndedClassesCount);
  737. if (m_ptrNewChainTB2->m_ptrNext->m_PosStartLC == ptrTB->m_PosStartLC &&
  738. ptrTB->IsEqualLexClasses(m_ptrNewChainTB2->m_ptrNext) &&
  739. m_curInvalidZone.m_posEnd.IsValidData() &&
  740. m_ptrNewChainTB2->m_ptrNext->m_PosStartLC > m_curInvalidZone.m_posEnd)
  741. {
  742. // BREAK.
  743. if (m_nNoEndedClassesCount <= 0)
  744. {
  745. FinishNewChain(FALSE, pTxtIter->IsEOF());
  746. return xtpEditLPR_RunFinished;
  747. }
  748. }
  749. }
  750. }
  751. //***
  752. m_nNoEndedClassesCount++;
  753. //**************************
  754. if (!m_ptrNewChainTB1)
  755. {
  756. // Full reparse
  757. m_ptrNewChainTB1 = ptrTB;
  758. m_ptrNewChainTB2 = NULL;
  759. //ASSERT(m_ptrFirstBlock == NULL);
  760. m_ptrFirstBlock = ptrTB;
  761. DBG_TRACE_PARSE_RUN_UPDATE(_T("    NewChainTB1 (&FirstBlock): %s n"), DBG_TraceTB_StartEndCls(m_ptrNewChainTB1));
  762. }
  763. else if (!m_ptrNewChainTB2)
  764. {
  765. m_ptrNewChainTB2 = m_ptrNewChainTB1;
  766. }
  767. if (nPres&xtpEditLPR_TBpop1)
  768. {
  769. if (m_ptrNewChainTB2)
  770. {
  771. if (m_ptrNewChainTB2->m_ptrPrev)
  772. {
  773. m_ptrNewChainTB2->m_ptrPrev->m_ptrNext = ptrTB;
  774. }
  775. ptrTB->m_ptrPrev = m_ptrNewChainTB2->m_ptrPrev;
  776. ptrTB->m_ptrNext = m_ptrNewChainTB2;
  777. m_ptrNewChainTB2->m_ptrPrev = ptrTB;
  778. m_ptrNewChainTB2->m_ptrParent = ptrTB;
  779. }
  780. else
  781. {
  782. m_ptrNewChainTB2 = ptrTB; //SetPrevBlock(ptrTB);
  783. }
  784. }
  785. else
  786. {
  787. if (m_ptrNewChainTB2)
  788. {
  789. ptrTB->m_ptrNext = m_ptrNewChainTB2->m_ptrNext;
  790. ptrTB->m_ptrPrev = m_ptrNewChainTB2; //GetPrevBlock(); //
  791. m_ptrNewChainTB2->m_ptrNext = ptrTB;
  792. }
  793. m_ptrNewChainTB2 = ptrTB; //SetPrevBlock(ptrTB);
  794. }
  795. //**************************
  796. }
  797. else
  798. {
  799. if (nPres&xtpEditLPR_TBpop1)
  800. {
  801. if (pOnScreenRunCnt->m_ptrTBLast)
  802. {
  803. if (pOnScreenRunCnt->m_ptrTBLast->m_ptrPrev)
  804. {
  805. pOnScreenRunCnt->m_ptrTBLast->m_ptrPrev->m_ptrNext = ptrTB;
  806. }
  807. ptrTB->m_ptrPrev = pOnScreenRunCnt->m_ptrTBLast->m_ptrPrev;
  808. ptrTB->m_ptrNext = pOnScreenRunCnt->m_ptrTBLast;
  809. pOnScreenRunCnt->m_ptrTBLast->m_ptrPrev = ptrTB;
  810. pOnScreenRunCnt->m_ptrTBLast->m_ptrParent = ptrTB;
  811. }
  812. else
  813. {
  814. pOnScreenRunCnt->m_ptrTBLast = ptrTB;
  815. }
  816. }
  817. else
  818. {
  819. ptrTB->m_ptrPrev = pOnScreenRunCnt->m_ptrTBLast;
  820. if (pOnScreenRunCnt->m_ptrTBLast)
  821. {
  822. pOnScreenRunCnt->m_ptrTBLast->m_ptrNext = ptrTB;
  823. }
  824. pOnScreenRunCnt->m_ptrTBLast = ptrTB;
  825. }
  826. }
  827. // DEBUG ////////////////////////////////////////////////////////////////
  828. DBG_TRACE_PARSE_RUN_BLOCKS(_T("(%08x) START startPos=(%d,%d), ______________ [%s] {%d}-noEndedStack n"),
  829. (CXTPSyntaxEditLexTextBlock*)ptrTB,
  830. ptrTB->m_PosStartLC.nLine, ptrTB->m_PosStartLC.nCol,
  831. ptrTB->m_ptrLexClass->m_strClassName, m_nNoEndedClassesCount);
  832. // END DEBUG ////////////////////////////////////////////////////////////
  833. }
  834. //---------------------------------------------------------------------------
  835. if (nPres & xtpEditLPR_Iterated)
  836. {
  837. bSkipIterate = TRUE;
  838. bIterated = TRUE;
  839. }
  840. //---------------------------------------------------------------------------
  841. bEnded = (nPres & xtpEditLPR_EndFound) != 0;
  842. if (bEnded)
  843. {
  844. CSingleLock singleLock(GetDataLoker(), TRUE);
  845. m_nNoEndedClassesCount--;
  846. int nECount = ptrTB->EndChildren(pOnScreenRunCnt ? NULL : this);
  847. m_nNoEndedClassesCount -= nECount;
  848. // DEBUG ////////////////////////////////////////////////////////////////
  849. DBG_TRACE_PARSE_RUN_BLOCKS(_T("(%08x) ENDED startPos=(%d,%d) endPos=(%d,%d), [%s] {%d}-noEndedStack n"),
  850. (CXTPSyntaxEditLexTextBlock*)ptrTB,
  851. ptrTB->m_PosStartLC.nLine, ptrTB->m_PosStartLC.nCol,
  852. ptrTB->m_PosEndLC.nLine, ptrTB->m_PosEndLC.nCol,
  853. ptrTB->m_ptrLexClass->m_strClassName, m_nNoEndedClassesCount);
  854. // END DEBUG ////////////////////////////////////////////////////////////
  855. if (!pOnScreenRunCnt)
  856. {
  857. SendEvent_OnTextBlockParsed(ptrTB);
  858. }
  859. }
  860. if (nPres & xtpEditLPR_RunBreaked)
  861. {
  862. return nPres;
  863. }
  864. //---------------------------------------------------------------------------
  865. if (bStarted && !bEnded && !bSkipIterate)
  866. {
  867. if (IsEventSet(m_evBreakParsing))
  868. {
  869. return xtpEditLPR_RunBreaked;
  870. }
  871. SeekNextEx(pTxtIter, pClass, pOnScreenRunCnt);
  872. bIterated = TRUE;
  873. }
  874. //---------------------------------------------------------------------------
  875. if (pOnScreenRunCnt)
  876. {
  877. XTP_EDIT_LINECOL lcTextPos = pTxtIter->GetPosLC();
  878. if (lcTextPos.nLine > pOnScreenRunCnt->m_nRowEnd)
  879. {
  880. return xtpEditLPR_RunFinished;
  881. }
  882. }
  883. }
  884. while (bStarted && !bEnded && (bRunEOF || !pTxtIter->IsEOF()) );
  885. if (bEnded && pClass->IsRestartRunLoop())
  886. {
  887. nReturn |= xtpEditLPR_RunRestart;
  888. break;
  889. }
  890. }
  891. return nReturn | (bIterated ? xtpEditLPR_Iterated : 0);
  892. }
  893. UINT CXTPSyntaxEditLexTextSchema::SendEvent_OnTextBlockParsed(CXTPSyntaxEditLexTextBlock* pTB)
  894. {
  895. CSingleLock singleLock(GetDataLoker(), TRUE);
  896. if (!m_bSendProgressEvents)
  897. {
  898. return 0;
  899. }
  900. CXTPSyntaxEditLexTextBlockPtr ptrTB(pTB, TRUE);
  901. WPARAM dwTBid = (WPARAM)pTB;
  902. m_mapLastParsedBlocks[dwTBid] = ptrTB;
  903. m_ptrLastParsedBlock.SetPtr(pTB, TRUE);
  904. BOOL bIsSubscribers = m_pConnectMT->PostEvent(xtpEditOnTextBlockParsed, dwTBid,
  905. 0, xtpNotifyDirectCallForOneThread);
  906. if (bIsSubscribers)
  907. {
  908. // WARNING: Why? EventsWnd must call GetLastParsedBlock()
  909. // to withdraw objects from the map!
  910. //ASSERT(m_mapLastParsedBlocks.GetCount() < 10*1000);
  911. static BOOL s_bAssert = FALSE;
  912. if (!s_bAssert && m_mapLastParsedBlocks.GetCount() > 10*1000)
  913. {
  914. s_bAssert = TRUE;
  915. ASSERT(FALSE);
  916. }
  917. }
  918. else
  919. {
  920. m_mapLastParsedBlocks.RemoveAll();
  921. }
  922. return 0;
  923. }
  924. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::GetLastParsedBlock(WPARAM dwID)
  925. {
  926. CSingleLock singleLock(GetDataLoker(), TRUE);
  927. if (dwID)
  928. {
  929. CXTPSyntaxEditLexTextBlockPtr ptrTB;
  930. if (m_mapLastParsedBlocks.Lookup(dwID, ptrTB))
  931. {
  932. m_mapLastParsedBlocks.RemoveKey(dwID);
  933. return ptrTB.Detach();
  934. }
  935. }
  936. else
  937. {
  938. return m_ptrLastParsedBlock.GetInterface(TRUE);
  939. }
  940. //  ASSERT(FALSE);
  941. return NULL;
  942. }
  943. void CXTPSyntaxEditLexTextSchema::FinishNewChain(BOOL bByBreak, BOOL bEOF)
  944. {
  945. CSingleLock singleLock(GetDataLoker(), TRUE);
  946. CXTPSyntaxEditLexTextBlockPtr ptrTBOldLast = NULL;
  947. DBG_TRACE_PARSE_RUN_UPDATE(_T("    <F> NewChainTB1: %s n"), DBG_TraceTB_StartEndCls(m_ptrNewChainTB1));
  948. if (m_ptrNewChainTB2)
  949. {
  950. DBG_TRACE_PARSE_RUN_UPDATE(_T("    <F> NewChainTB2-raw: %s n"), DBG_TraceTB_StartEndCls(m_ptrNewChainTB2));
  951. if (bByBreak && !bEOF)
  952. {
  953. // roll back no-ended blocks
  954. while ( !m_ptrNewChainTB2->m_PosEndLC.IsValidData() &&
  955. m_ptrNewChainTB2->m_ptrPrev &&
  956. m_ptrNewChainTB2 != m_ptrNewChainTB1)
  957. {
  958. CXTPSyntaxEditLexTextBlockPtr ptrTBclose = m_ptrNewChainTB2;
  959. m_ptrNewChainTB2 = m_ptrNewChainTB2->m_ptrPrev;
  960. m_ptrNewChainTB2->m_ptrNext = ptrTBclose->m_ptrNext;
  961. DBG_TRACE_PARSE_RUN_UPDATE(_T("       <F> CLOSE TB-RollBacked: %s n"), DBG_TraceTB_StartEndCls(ptrTBclose));
  962. ptrTBclose->Close();
  963. }
  964. DBG_TRACE_PARSE_RUN_UPDATE(_T("    <F> NewChainTB2-RollBacked: %s n"), DBG_TraceTB_StartEndCls(m_ptrNewChainTB2));
  965. }
  966. // end no-ended blocks
  967. EndBlocksByParent(m_ptrNewChainTB1, m_ptrNewChainTB2);
  968. if (m_ptrNewChainTB2 == m_ptrNewChainTB1)
  969. {
  970. UpdateLastSchBlock(m_ptrNewChainTB2);
  971. m_ptrOldChainTBFirst = NULL;
  972. return;
  973. }
  974. // synchronize new and old chains
  975. while (m_ptrNewChainTB2->m_ptrNext &&
  976. (m_ptrNewChainTB2->m_ptrNext->m_PosStartLC < m_ptrNewChainTB2->m_PosStartLC ||
  977.  m_ptrNewChainTB2->m_ptrNext->m_PosStartLC == m_ptrNewChainTB2->m_PosStartLC &&
  978.  m_ptrNewChainTB2->m_ptrNext->IsEqualLexClasses(m_ptrNewChainTB2) )
  979. )
  980. {
  981. m_ptrNewChainTB2->m_ptrNext = m_ptrNewChainTB2->m_ptrNext->m_ptrNext;
  982. }
  983. if (m_ptrNewChainTB2->m_ptrNext)
  984. {
  985. m_ptrNewChainTB2->m_ptrNext->m_ptrPrev = m_ptrNewChainTB2;
  986. m_curInvalidZone.m_posEnd = m_ptrNewChainTB2->m_ptrNext->m_PosStartLC;
  987. }
  988. else
  989. {
  990. m_curInvalidZone.m_posEnd = m_ptrNewChainTB2->m_PosStartLC;
  991. }
  992. if (!bEOF)
  993. {
  994. ptrTBOldLast = m_ptrNewChainTB2->m_ptrNext;
  995. }
  996. }
  997. else if (bByBreak)
  998. {
  999. if (m_ptrNewChainTB2)
  1000. {
  1001. UpdateLastSchBlock(m_ptrNewChainTB2);
  1002. }
  1003. m_ptrOldChainTBFirst = NULL;
  1004. m_ptrNewChainTB1 = NULL;
  1005. m_ptrNewChainTB2 = NULL;
  1006. m_nNoEndedClassesCount = 0;
  1007. return;
  1008. }
  1009. else
  1010. {
  1011. // No new blocks found after chain branch.
  1012. // (All rest blocks where deleted)
  1013. if (m_ptrNewChainTB1)
  1014. {
  1015. m_ptrNewChainTB1->m_ptrNext = NULL;
  1016. UpdateLastSchBlock(m_ptrNewChainTB1, TRUE);
  1017. }
  1018. else if (m_ptrFirstBlock)
  1019. {
  1020. m_ptrFirstBlock->m_ptrNext = NULL;
  1021. UpdateLastSchBlock(m_ptrFirstBlock, TRUE);
  1022. }
  1023. }
  1024. DBG_TRACE_PARSE_RUN_UPDATE(_T("    <F> OldChainTBFirst: %s n"), DBG_TraceTB_StartEndCls(m_ptrOldChainTBFirst));
  1025. DBG_TRACE_PARSE_RUN_UPDATE(_T("    <F> TBOldLast: %s n"), DBG_TraceTB_StartEndCls(ptrTBOldLast));
  1026. CXTPSyntaxEditLexTextBlockPtr ptrTBOld = m_ptrOldChainTBFirst;
  1027. while (ptrTBOld && ptrTBOld != ptrTBOldLast)
  1028. {
  1029. CXTPSyntaxEditLexTextBlockPtr ptrTBclose = ptrTBOld;
  1030. ptrTBOld = ptrTBOld->m_ptrNext;
  1031. ptrTBclose->Close();
  1032. }
  1033. if (m_ptrNewChainTB2 && m_ptrNewChainTB2->m_ptrNext &&
  1034. m_ptrNewChainTB2->m_ptrNext->IsLookLikeClosed())
  1035. {
  1036. m_ptrNewChainTB2->m_ptrNext = NULL;
  1037. UpdateLastSchBlock(m_ptrNewChainTB2, TRUE);
  1038. }
  1039. //===================================
  1040. if (m_ptrNewChainTB2 && m_ptrNewChainTB1)
  1041. {
  1042. UpdateNewChainParentsChildren();
  1043. }
  1044. //===================================
  1045. if (m_ptrNewChainTB2)
  1046. { // && m_ptrNewChainTB2->m_ptrNext == NULL)
  1047. UpdateLastSchBlock(m_ptrNewChainTB2);
  1048. }
  1049. //-----------------------------------
  1050. m_ptrOldChainTBFirst = NULL;
  1051. m_ptrNewChainTB1 = NULL;
  1052. m_ptrNewChainTB2 = NULL;
  1053. m_nNoEndedClassesCount = 0;
  1054. }
  1055. void CXTPSyntaxEditLexTextSchema::UpdateNewChainParentsChildren()
  1056. {
  1057. CSingleLock singleLock(GetDataLoker(), TRUE);
  1058. if (!m_ptrNewChainTB2 || !m_ptrNewChainTB1)
  1059. {
  1060. return;
  1061. }
  1062. if (m_ptrNewChainTB1 != m_ptrFirstBlock)
  1063. {
  1064. //update children for new chain blocks
  1065. CXTPSyntaxEditLexTextBlock* pTB_chi = m_ptrNewChainTB2->m_ptrNext;
  1066. for (; pTB_chi; pTB_chi = pTB_chi->m_ptrNext)
  1067. {
  1068. if (pTB_chi->m_ptrParent && pTB_chi->m_ptrParent->IsLookLikeClosed())
  1069. {
  1070. CXTPSyntaxEditLexTextBlock* pTB_Par = pTB_chi->m_ptrPrev;
  1071. for (; pTB_Par; pTB_Par = pTB_Par->m_ptrPrev)
  1072. {
  1073. if (pTB_Par->IsInclude(pTB_chi))
  1074. {
  1075. pTB_chi->m_ptrParent.SetPtr(pTB_Par, TRUE);
  1076. ASSERT(!pTB_Par->IsLookLikeClosed());
  1077. break;
  1078. }
  1079. }
  1080. }
  1081. }
  1082. }
  1083. }
  1084. void CXTPSyntaxEditLexTextSchema::EndBlocksByParent(CXTPSyntaxEditLexTextBlock* pTBStart, CXTPSyntaxEditLexTextBlock* pTBEnd)
  1085. {
  1086. CSingleLock singleLock(GetDataLoker(), TRUE);
  1087. if (!pTBStart)
  1088. {
  1089. return;
  1090. }
  1091. CXTPSyntaxEditLexTextBlock* pTB_chi = pTBStart;
  1092. for (; pTB_chi != pTBEnd->m_ptrNext; pTB_chi = pTB_chi->m_ptrNext)
  1093. {
  1094. if (!pTB_chi->m_PosEndLC.IsValidData())
  1095. {
  1096. //ASSERT(pTB_chi->m_ptrParent && pTB_chi->m_ptrParent->m_PosEndLC.IsValidData());
  1097. if (pTB_chi->m_ptrParent && pTB_chi->m_ptrParent->m_PosEndLC.IsValidData())
  1098. {
  1099. pTB_chi->m_PosEndLC = pTB_chi->m_ptrParent->m_PosEndLC;
  1100. }
  1101. }
  1102. }
  1103. }
  1104. int CXTPSyntaxEditLexTextSchema::RunChildren(CTextIter* pTxtIter,
  1105. CXTPSyntaxEditLexTextBlockPtr ptrTxtBlock,
  1106. CXTPSyntaxEditLexClass* pBase,
  1107. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt)
  1108. {
  1109. if (!pTxtIter || !pBase)
  1110. {
  1111. ASSERT(FALSE);
  1112. return xtpEditLPR_Error;
  1113. }
  1114. int nRes = 0;
  1115. CXTPSyntaxEditLexClassPtrArray* pArClasses[3];
  1116. pArClasses[0] = pBase->GetChildren();
  1117. pArClasses[1] = pBase->GetChildrenDyn();
  1118. pArClasses[2] = pBase->GetChildrenSelfRef();
  1119. for (int i = 0; i < _countof(pArClasses); i++)
  1120. {
  1121. if (pArClasses[i] && pArClasses[i]->GetSize())
  1122. {
  1123. int nResLocal = Run_ClassesUpdate2(pTxtIter, pArClasses[i],
  1124. ptrTxtBlock, pOnScreenRunCnt);
  1125. nRes |= nResLocal;
  1126. if (nRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked|xtpEditLPR_RunFinished|xtpEditLPR_RunRestart))
  1127. {
  1128. break;
  1129. }
  1130. }
  1131. }
  1132. return nRes;
  1133. }
  1134. void CXTPSyntaxEditLexTextSchema::SeekNextEx(CTextIter* pTxtIter,
  1135.    CXTPSyntaxEditLexClass* pRunClass,
  1136.    CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt,
  1137.    int nChars )
  1138. {
  1139. if (!pTxtIter || !pRunClass)
  1140. {
  1141. ASSERT(FALSE);
  1142. return;
  1143. }
  1144. pTxtIter->SeekNext(nChars);
  1145. m_nSeekNext_TagWaitChars -= nChars;
  1146. CXTPSyntaxEditLexObj_ActiveTags* pAT = m_pClassSchema->GetActiveTagsFor(pRunClass);
  1147. if (pAT && m_nSeekNext_TagWaitChars)
  1148. {
  1149. int i = 0;
  1150. //BOOL bCase = FALSE; //pRunClass->IsCaseSensitive();
  1151. CString strTmp;
  1152. BOOL bTag = FALSE;
  1153. while (!bTag && !pTxtIter->IsEOF() && m_nSeekNext_TagWaitChars)
  1154. {
  1155. //bTag = CXTPSyntaxEditLexClass::Run_Tags1(pTxtIter, pAT, strTmp, bCase, FALSE);
  1156. //
  1157. bTag = pAT->FindMinWord(pTxtIter->GetText(1024), strTmp, 1024, TRUE, FALSE);
  1158. // for test(DEBUG) Only
  1159. #ifdef DBG_AUTOMAT
  1160. BOOL bCase = FALSE; //pRunClass->IsCaseSensitive();
  1161. CString strTmpX;
  1162. BOOL bTagX = CXTPSyntaxEditLexClass::Run_Tags1(pTxtIter, pAT, strTmpX, bCase, FALSE);
  1163. if (bTagX != bTag)
  1164. {
  1165. //ASSERT(FALSE);
  1166. pAT->BuildAutomat(TRUE);
  1167. bTag = pAT->FindMinWord(pTxtIter->GetText(1024), strTmp, 1024, TRUE, FALSE);
  1168. }
  1169. if (bTag)
  1170. {
  1171. strTmp.Empty();
  1172. bTag = CXTPSyntaxEditLexClass::Run_Tags1(pTxtIter, pAT, strTmp, bCase, FALSE);
  1173. }
  1174. #endif
  1175. if (!bTag)
  1176. {
  1177. pTxtIter->SeekNext(1);
  1178. m_nSeekNext_TagWaitChars--;
  1179. }
  1180. if (++i%10 == 0 && IsEventSet(m_evBreakParsing))
  1181. {
  1182. return;
  1183. }
  1184. if (pOnScreenRunCnt)
  1185. {
  1186. XTP_EDIT_LINECOL lcTextPos = pTxtIter->GetPosLC();
  1187. if (lcTextPos.nLine > pOnScreenRunCnt->m_nRowEnd)
  1188. {
  1189. return;
  1190. }
  1191. }
  1192. }
  1193. ASSERT(bTag || pTxtIter->IsEOF() || !m_nSeekNext_TagWaitChars);
  1194. //----------------------
  1195. if (bTag)
  1196. {
  1197. m_nSeekNext_TagWaitChars = (int)_tcsclen(strTmp);
  1198. ASSERT(m_nSeekNext_TagWaitChars > 0);
  1199. }
  1200. }
  1201. }
  1202. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::GetPrevBlock(BOOL bWithAddRef)
  1203. {
  1204. CSingleLock singleLock(GetDataLoker(), TRUE);
  1205. return m_ptrNewChainTB2.GetInterface(bWithAddRef);
  1206. }
  1207. void CXTPSyntaxEditLexTextSchema::UpdateLastSchBlock(CXTPSyntaxEditLexTextBlock* pLastTB, BOOL bPermanently)
  1208. {
  1209. CSingleLock singleLock(GetDataLoker(), TRUE);
  1210. if (!pLastTB || !m_ptrLastSchBlock || bPermanently)
  1211. {
  1212. m_ptrLastSchBlock.SetPtr(pLastTB, TRUE);
  1213. return;
  1214. }
  1215. if (pLastTB->m_PosStartLC >= m_ptrLastSchBlock->m_PosStartLC)
  1216. {
  1217. m_ptrLastSchBlock.SetPtr(pLastTB, TRUE);
  1218. }
  1219. }
  1220. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::GetLastSchBlock(BOOL bWithAddRef)
  1221. {
  1222. CSingleLock singleLock(GetDataLoker(), TRUE);
  1223. if (m_ptrLastSchBlock && !m_ptrNewChainTB2)
  1224. {
  1225. return m_ptrLastSchBlock.GetInterface(bWithAddRef);
  1226. }
  1227. if (!m_ptrLastSchBlock && m_ptrNewChainTB2)
  1228. {
  1229. return m_ptrNewChainTB2.GetInterface(bWithAddRef);
  1230. }
  1231. if (m_ptrLastSchBlock && m_ptrNewChainTB2)
  1232. {
  1233. if (m_ptrLastSchBlock->m_PosStartLC < m_ptrNewChainTB2->m_PosStartLC)
  1234. {
  1235. return m_ptrNewChainTB2.GetInterface(bWithAddRef);
  1236. }
  1237. else
  1238. {
  1239. return m_ptrLastSchBlock.GetInterface(bWithAddRef);
  1240. }
  1241. }
  1242. return NULL;
  1243. }
  1244. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::GetNewBlock()
  1245. {
  1246. CXTPSyntaxEditLexTextBlock* p = new CXTPSyntaxEditLexTextBlock();
  1247. return p;
  1248. }
  1249. void CXTPSyntaxEditLexTextSchema::GetTextAttributes(XTP_EDIT_TEXTBLOCK& rTB, CXTPSyntaxEditLexTextBlock* pTextBlock)
  1250. {
  1251. if (!pTextBlock || !pTextBlock->m_ptrLexClass)
  1252. {
  1253. return;
  1254. }
  1255. pTextBlock->m_ptrLexClass->GetTextAttributes(rTB);
  1256. }
  1257. void CXTPSyntaxEditLexTextSchema::TraceClrBlocks(CXTPSyntaxEditTextBlockArray& arBlocks)
  1258. {
  1259. // DEBUG ////////////////////////////////////////////////////////////////
  1260. #ifdef DBG_TRACE_DRAW_BLOCKS
  1261. TRACE(_T("n*** bloks --------------------n"));
  1262. for (int i = 0; i < arBlocks.GetSize(); i++)
  1263. {
  1264. XTP_EDIT_TEXTBLOCK BlkI = arBlocks[i];
  1265. TRACE(_T("(%02d) start =%d, ?end=%d, color=%X n"), i, BlkI.nPos,
  1266. BlkI.nNextBlockPos, BlkI.clrBlock.crText);
  1267. }
  1268. TRACE(_T("***n"));
  1269. #else
  1270. UNREFERENCED_PARAMETER(arBlocks);
  1271. #endif
  1272. // END DEBUG ////////////////////////////////////////////////////////////
  1273. }
  1274. void CXTPSyntaxEditLexTextSchema::AddClrBlock(XTP_EDIT_TEXTBLOCK& rClrB,
  1275. CXTPSyntaxEditTextBlockArray& arBlocks)
  1276. {
  1277. #ifdef DBG_TRACE_DRAW_BLOCKS
  1278. TRACE(_T(" --- ADD --- start =%d, ?end=%d, color=%X n"), rClrB.nPos,
  1279. rClrB.nNextBlockPos, rClrB.clrBlock.crText);
  1280. #endif
  1281. int nCount = (int)arBlocks.GetSize();
  1282. //** A. ** new block is included in the existing block
  1283. int i;
  1284. for (i = 0; i < nCount; i++)
  1285. {
  1286. XTP_EDIT_TEXTBLOCK& BlkI = arBlocks[i];
  1287. if (rClrB.nNextBlockPos < BlkI.nPos ||
  1288. rClrB.nPos >= BlkI.nNextBlockPos )
  1289. {
  1290. continue;
  1291. }
  1292. XTP_EDIT_TEXTBLOCK BlkI2;// = BlkI;
  1293. if (rClrB.nPos >= BlkI.nPos &&
  1294. rClrB.nNextBlockPos <= BlkI.nNextBlockPos)
  1295. {
  1296. // override equal block
  1297. if (rClrB.nPos == BlkI.nPos &&
  1298. rClrB.nNextBlockPos == BlkI.nNextBlockPos)
  1299. {
  1300. BlkI = rClrB; //arBlocks[i] = rClrB;
  1301. return;
  1302. }
  1303. // override BEGIN of the existing block
  1304. if (rClrB.nPos == BlkI.nPos &&
  1305. rClrB.nNextBlockPos < BlkI.nNextBlockPos)
  1306. {
  1307. BlkI.nPos = rClrB.nNextBlockPos;
  1308. //arBlocks[i] = BlkI;
  1309. arBlocks.InsertAt(i, rClrB);
  1310. return;
  1311. }
  1312. // override END of the existing block
  1313. if (rClrB.nPos > BlkI.nPos &&
  1314. rClrB.nNextBlockPos == BlkI.nNextBlockPos)
  1315. {
  1316. BlkI.nNextBlockPos = rClrB.nPos;
  1317. //arBlocks[i] = BlkI;
  1318. arBlocks.InsertAt(i+1, rClrB);
  1319. return;
  1320. }
  1321. BlkI2 = BlkI;
  1322. // INSERT inside to the existing block
  1323. BlkI2.nPos = rClrB.nNextBlockPos;
  1324. BlkI.nNextBlockPos = rClrB.nPos;
  1325. //arBlocks[i] = BlkI;
  1326. arBlocks.InsertAt(i+1, BlkI2);
  1327. arBlocks.InsertAt(i+1, rClrB);
  1328. return;
  1329. }
  1330. }
  1331. //** B. ** new block is bigger then existing block
  1332. nCount = (int)arBlocks.GetSize();
  1333. BOOL bInserted = FALSE;
  1334. for (i = nCount-1; i >= 0; i--)
  1335. {
  1336. XTP_EDIT_TEXTBLOCK BlkI = arBlocks[i];
  1337. if (rClrB.nNextBlockPos > BlkI.nPos && rClrB.nNextBlockPos < BlkI.nNextBlockPos)
  1338. {
  1339. BlkI.nPos = rClrB.nNextBlockPos;
  1340. arBlocks[i] = BlkI;
  1341. if (!bInserted)
  1342. {
  1343. arBlocks.InsertAt(i, rClrB);
  1344. bInserted = TRUE;
  1345. }
  1346. } else
  1347. if (rClrB.nPos <= BlkI.nPos && rClrB.nNextBlockPos >= BlkI.nNextBlockPos)
  1348. {
  1349. arBlocks.RemoveAt(i);
  1350. } else
  1351. if (rClrB.nNextBlockPos > BlkI.nPos && rClrB.nNextBlockPos < BlkI.nNextBlockPos )
  1352. {
  1353. BlkI.nNextBlockPos = rClrB.nPos;
  1354. arBlocks[i] = BlkI;
  1355. if (!bInserted)
  1356. {
  1357. arBlocks.InsertAt(i+1, rClrB);
  1358. bInserted = TRUE;
  1359. }
  1360. }
  1361. }
  1362. //----------------
  1363. if (!bInserted)
  1364. {
  1365. arBlocks.Add(rClrB);
  1366. }
  1367. }
  1368. void CXTPSyntaxEditLexTextSchema::GetRowColors(CTextIter* pTxtIter, int nRow,
  1369.  int nColFrom, int nColTo,
  1370.  const XTP_EDIT_COLORVALUES& clrDefault,
  1371.  CXTPSyntaxEditTextBlockList* rBlocks,
  1372.  CXTPSyntaxEditLexTextBlockPtr* pptrTBStartCache,
  1373.  CXTPSyntaxEditLexTextBlock* pFirstSchTB)
  1374. {
  1375. if (!pTxtIter)
  1376. {
  1377. ASSERT(FALSE);
  1378. return;
  1379. }
  1380. XTP_EDIT_TEXTBLOCK tmpBlk;
  1381. tmpBlk.nPos = 0;
  1382. tmpBlk.nNextBlockPos = 0;
  1383. tmpBlk.clrBlock = clrDefault;
  1384. int nLineLen = pTxtIter->GetLineLen(nRow, FALSE);
  1385. if (!nLineLen)
  1386. {
  1387. return;
  1388. }
  1389. XTP_EDIT_LINECOL LCStart= {nRow, nColFrom};
  1390. XTP_EDIT_LINECOL LCEnd = {nRow, nLineLen};
  1391. if (nColTo > 0 && nColTo < nLineLen)
  1392. {
  1393. LCEnd.nCol = nColTo;
  1394. }
  1395. CXTPSyntaxEditTextBlockArray arBlocks;
  1396. arBlocks.SetSize(0, 4096);
  1397. XTP_EDIT_TEXTBLOCK bltTB;
  1398. bltTB.nPos = 0;
  1399. CSingleLock singleLock(GetDataLoker());
  1400. //BOOL bLocked = TryLockCS(&singleLock, GetDataLoker(), 30, 5);
  1401. BOOL bLocked = singleLock.Lock(30);
  1402. //---------------------------------------------------------------------------
  1403. CXTPSyntaxEditLexTextBlockPtr ptrTBfirst, ptrTBstart;
  1404. if (bLocked)
  1405. {
  1406. ptrTBfirst = GetBlocks();
  1407. if (pFirstSchTB)
  1408. {
  1409. ptrTBfirst.SetPtr(pFirstSchTB, TRUE);
  1410. }
  1411. if (pptrTBStartCache)
  1412. {
  1413. ptrTBstart = *pptrTBStartCache;
  1414. }
  1415. if (!ptrTBstart || ptrTBstart == ptrTBfirst ||
  1416. ptrTBstart->IsLookLikeClosed())
  1417. {
  1418. ptrTBstart = ptrTBfirst ? ptrTBfirst->m_ptrNext : NULL;
  1419. }
  1420. }
  1421. //= process first blk ====================================================
  1422. //
  1423. if (ptrTBfirst)
  1424. {
  1425. bltTB.clrBlock = clrDefault;
  1426. bltTB.lf = tmpBlk.lf;
  1427. GetTextAttributes(bltTB, ptrTBfirst);
  1428. bltTB.nPos = 0;
  1429. bltTB.nNextBlockPos = nLineLen;
  1430. AddClrBlock(bltTB, arBlocks);
  1431. TraceClrBlocks(arBlocks);
  1432. }
  1433. //========================================================================
  1434. CXTPSyntaxEditLexTextBlockPtrArray arTBStack;
  1435. CXTPSyntaxEditLexTextBlockPtr ptrTBStartCache;
  1436. for (CXTPSyntaxEditLexTextBlock* pTB = ptrTBstart; pTB; pTB = pTB->m_ptrNext)
  1437. {
  1438. //BOOL bEndValid = pTB->m_PosEndLC.IsValidData();
  1439. //if (bEndValid &&
  1440. //  (pTB->m_PosEndLC < LCStart || pTB->m_PosEndLC < pTB->m_PosStartLC) ||
  1441. //  !bEndValid && pTB->m_ptrParent)
  1442. if (pTB->GetPosEndLC() < LCStart || pTB->m_PosEndLC < pTB->m_PosStartLC)
  1443. {
  1444. continue;
  1445. }
  1446. if (LCEnd < pTB->m_PosStartLC)
  1447. {
  1448. break;
  1449. }
  1450. XTP_EDIT_LINECOL TB_PosEndLC = pTB->m_PosEndLC;
  1451. if (!pTB->m_PosEndLC.IsValidData() && !pTB->m_ptrParent)
  1452. {
  1453. TB_PosEndLC.nLine = nRow;
  1454. TB_PosEndLC.nCol = nLineLen;
  1455. }
  1456. if (!ptrTBStartCache)
  1457. {
  1458. ptrTBStartCache.SetPtr(pTB, TRUE);
  1459. ASSERT(pTB->m_ptrParent);
  1460. }
  1461. CXTPSyntaxEditLexTextBlock* pTBStackLast = NULL;
  1462. while (pTB->m_ptrNext && pTB->m_ptrNext->m_PosStartLC <= pTB->m_PosStartLC &&
  1463. pTB->m_ptrNext->m_PosEndLC.IsValidData() && pTB->m_PosEndLC.IsValidData() &&
  1464. pTB->m_ptrNext->m_PosEndLC > pTB->m_PosEndLC)
  1465. {
  1466. if (arTBStack.GetSize() == 0)
  1467. {
  1468. arTBStack.AddPtr(pTB, TRUE);
  1469. }
  1470. arTBStack.Add(pTB->m_ptrNext);
  1471. pTBStackLast = pTB->m_ptrNext;
  1472. pTB = pTB->m_ptrNext;
  1473. }
  1474. int nStackCount = (int)arTBStack.GetSize();
  1475. for (;nStackCount >= 0;)
  1476. {
  1477. if (nStackCount > 0)
  1478. {
  1479. pTB = arTBStack[nStackCount-1];
  1480. }
  1481. nStackCount--;
  1482. if (nStackCount >= 0)
  1483. {
  1484. arTBStack.RemoveAt(nStackCount);
  1485. TB_PosEndLC = pTB->m_PosEndLC;
  1486. if (!pTB->m_PosEndLC.IsValidData() /*&& !pTB->m_ptrParent*/)
  1487. {
  1488. TB_PosEndLC.nLine = nRow;
  1489. TB_PosEndLC.nCol = nLineLen;
  1490. }
  1491. }
  1492. //restore default values
  1493. bltTB.clrBlock = clrDefault;
  1494. bltTB.lf = tmpBlk.lf;
  1495. GetTextAttributes(bltTB, pTB);
  1496. if (pTB->m_PosStartLC > LCStart)
  1497. {
  1498. bltTB.nNextBlockPos = TB_PosEndLC.nLine == nRow ?
  1499. min(TB_PosEndLC.nCol+1, nLineLen) : nLineLen;
  1500. bltTB.nPos = pTB->m_PosStartLC.nCol;
  1501. AddClrBlock(bltTB, arBlocks);
  1502. TraceClrBlocks(arBlocks);
  1503. }
  1504. else
  1505. {
  1506. bltTB.nNextBlockPos = TB_PosEndLC.nLine == nRow ?
  1507. min(TB_PosEndLC.nCol+1, nLineLen) : nLineLen;
  1508. bltTB.nPos = 0;
  1509. AddClrBlock(bltTB, arBlocks);
  1510. TraceClrBlocks(arBlocks);
  1511. }
  1512. }
  1513. //--------------------
  1514. if (pTBStackLast)
  1515. {
  1516. pTB = pTBStackLast;
  1517. }
  1518. }
  1519. //----------------------------------------
  1520. if (pptrTBStartCache)
  1521. {
  1522. ptrTBstart = *pptrTBStartCache;
  1523. if (!ptrTBstart || ptrTBstart->IsLookLikeClosed())
  1524. {
  1525. *pptrTBStartCache = ptrTBStartCache;
  1526. ASSERT(!ptrTBStartCache || !ptrTBStartCache->IsLookLikeClosed());
  1527. }
  1528. }
  1529. //-----------------------------
  1530. if (bLocked)
  1531. {
  1532. singleLock.Unlock();
  1533. }
  1534. //===========================================================================
  1535. int nPos = 0;
  1536. int i;
  1537. for (i = 0; i < arBlocks.GetSize(); i++)
  1538. {
  1539. XTP_EDIT_TEXTBLOCK BlkI = arBlocks[i];
  1540. if (nPos < BlkI.nPos)
  1541. {
  1542. tmpBlk.nPos = nPos;
  1543. tmpBlk.nNextBlockPos = BlkI.nPos;
  1544. AddClrBlock(tmpBlk, arBlocks);
  1545. TraceClrBlocks(arBlocks);
  1546. i++;
  1547. }
  1548. nPos = BlkI.nNextBlockPos;
  1549. }
  1550. //===========================================================================
  1551. if (arBlocks.GetSize() == 0)
  1552. {
  1553. tmpBlk.nPos = 0;
  1554. tmpBlk.nNextBlockPos = nLineLen;
  1555. arBlocks.Add(tmpBlk);
  1556. }
  1557. else
  1558. {
  1559. //---------------------------------------------------------------------------
  1560. XTP_EDIT_TEXTBLOCK BlkI = arBlocks[arBlocks.GetSize()-1];
  1561. if (BlkI.nNextBlockPos < nLineLen)
  1562. {
  1563. tmpBlk.nPos = BlkI.nNextBlockPos;
  1564. tmpBlk.nNextBlockPos = nLineLen;
  1565. AddClrBlock(tmpBlk, arBlocks);
  1566. TraceClrBlocks(arBlocks);
  1567. }
  1568. }
  1569. //**************************************************************************
  1570. // DEBUG ////////////////////////////////////////////////////////////////
  1571. #ifdef DBG_TRACE_DRAW_BLOCKS
  1572. TRACE(_T("n*** DBG_TRACE_DRAW_BLOCKS *** --------------------n"));
  1573. TRACE(_T("row=%d, row_len = %d n"), nRow, nLineLen);
  1574. #endif
  1575. // END DEBUG ////////////////////////////////////////////////////////////
  1576. for (i = 0; i < arBlocks.GetSize(); i++)
  1577. {
  1578. XTP_EDIT_TEXTBLOCK& BlkI = arBlocks[i];
  1579. rBlocks->AddTail(BlkI);
  1580. // DEBUG ////////////////////////////////////////////////////////////////
  1581. #ifdef DBG_TRACE_DRAW_BLOCKS
  1582. TRACE(_T("(%02d) start =%d, ?end=%d, color=%X n"), i, BlkI.nPos,
  1583. BlkI.nNextBlockPos, BlkI.clrBlock.crText);
  1584. #endif
  1585. // END DEBUG ////////////////////////////////////////////////////////////
  1586. }
  1587. }
  1588. void CXTPSyntaxEditLexTextSchema::GetCollapsableBlocksInfo(int nRow,
  1589. CXTPSyntaxEditRowsBlockArray& rArBlocks,
  1590. CXTPSyntaxEditLexTextBlockPtr* pptrTBStartCache)
  1591. {
  1592. static const CString s_strCollapsedText_def = _T("[..]");
  1593. rArBlocks.RemoveAll();
  1594. CSingleLock singleLock(GetDataLoker());
  1595. //BOOL bLocked = TryLockCS(&singleLock, GetDataLoker(), 30);
  1596. BOOL bLocked = singleLock.Lock(30);
  1597. if (!bLocked)
  1598. {
  1599. return;
  1600. }
  1601. XTP_EDIT_ROWSBLOCK tmpCoBlk;
  1602. //---------------------------------------------------------------------------
  1603. ASSERT(bLocked);
  1604. CXTPSyntaxEditLexTextBlockPtr ptrTBstart;
  1605. if (pptrTBStartCache)
  1606. {
  1607. ptrTBstart = *pptrTBStartCache;
  1608. }
  1609. if (!ptrTBstart || ptrTBstart->IsLookLikeClosed())
  1610. {
  1611. ptrTBstart = GetBlocks();
  1612. }
  1613. CXTPSyntaxEditLexTextBlockPtr ptrTBStartCache;
  1614. for (CXTPSyntaxEditLexTextBlock* pTB = ptrTBstart; pTB; pTB = pTB->m_ptrNext)
  1615. {
  1616. if (nRow >= 0 && nRow < pTB->m_PosStartLC.nLine)
  1617. {
  1618. break;
  1619. }
  1620. XTP_EDIT_LINECOL TB_PosEndLC = pTB->GetPosEndLC(); // pTB->m_PosEndLC;
  1621. if (nRow < 0 || (nRow >= pTB->m_PosStartLC.nLine &&
  1622. nRow <= TB_PosEndLC.nLine) )
  1623. {
  1624. if (!ptrTBStartCache && pTB->m_ptrParent)
  1625. {
  1626. ptrTBStartCache.SetPtr(pTB, TRUE);
  1627. }
  1628. if (pTB->m_PosStartLC.nLine < TB_PosEndLC.nLine &&
  1629. pTB->m_ptrParent )
  1630. {
  1631. CXTPSyntaxEditLexClass* pLexClass = pTB->m_ptrLexClass;
  1632. ASSERT(pLexClass);
  1633. int nCollapsable = pLexClass->IsCollapsable();
  1634. if (pLexClass &&  nCollapsable &&
  1635. (nCollapsable == 2 || !pTB->m_bEndByParent && TB_PosEndLC != XTP_EDIT_LINECOL::MAXPOS))
  1636. {
  1637. tmpCoBlk.lcStart = pTB->m_PosStartLC;
  1638. tmpCoBlk.lcEnd = TB_PosEndLC;
  1639. CXTPSyntaxEditLexVariantPtr ptrLVtext;
  1640. ptrLVtext = pLexClass->GetAttribute(XTPLEX_ATTR_COLLAPSEDTEXT, FALSE);
  1641. if (ptrLVtext && ptrLVtext->IsStrType())
  1642. {
  1643. tmpCoBlk.strCollapsedText = ptrLVtext->GetStr();
  1644. } else {
  1645. tmpCoBlk.strCollapsedText = s_strCollapsedText_def;
  1646. }
  1647. rArBlocks.Add(tmpCoBlk);
  1648. }
  1649. }
  1650. }
  1651. }
  1652. //----------------------------------------
  1653. if (pptrTBStartCache)
  1654. {
  1655. ptrTBstart = *pptrTBStartCache;
  1656. if (!ptrTBstart || ptrTBstart->IsLookLikeClosed())
  1657. {
  1658. *pptrTBStartCache = ptrTBStartCache;
  1659. ASSERT(!ptrTBStartCache || !ptrTBStartCache->IsLookLikeClosed());
  1660. }
  1661. }
  1662. }
  1663. void CXTPSyntaxEditLexTextSchema::ApplyThemeRecursive(CXTPSyntaxEditColorTheme* pTheme,
  1664. CXTPSyntaxEditLexClassPtrArray* ptrClasses)
  1665. {
  1666. // if pTheme == NULL - Restore default values only
  1667. const static CString strAttrPref = XTPLEX_ATTR_TXTPREFIX;
  1668. ASSERT(ptrClasses);
  1669. int nCount = ptrClasses ? (int)ptrClasses->GetSize() : 0;
  1670. for (int i = 0; i < nCount; i++)
  1671. {
  1672. CXTPSyntaxEditLexClassPtr ptrC = ptrClasses->GetAt(i);
  1673. if (!ptrC)
  1674. {
  1675. ASSERT(FALSE);
  1676. continue;
  1677. }
  1678. // Traverse the tree
  1679. ApplyThemeRecursive(pTheme, ptrC->GetChildren());
  1680. ApplyThemeRecursive(pTheme, ptrC->GetChildrenDyn());
  1681. //-------------------------------------------------------
  1682. const CString strCName = ptrC->GetClassName();
  1683. // restore default attributes (colors)
  1684. CXTPSyntaxEditLexClassPtr ptrCDefault = m_pClassSchema->GetPreBuildClass(strCName);
  1685. ASSERT(ptrCDefault);
  1686. if (ptrCDefault)
  1687. {
  1688. ptrC->CopyAttributes(ptrCDefault, XTPLEX_ATTR_TXTPREFIX);
  1689. }
  1690. CXTPSyntaxEditColorInfo* pColors = pTheme ? pTheme->GetColorInfo(strCName, pTheme->GetFileName()) : NULL;
  1691. if (!pColors)
  1692. {
  1693. continue;
  1694. }
  1695. // Apply new attributes (colors)
  1696. POSITION posParam = pColors->GetFirstParamNamePosition();
  1697. while (posParam)
  1698. {
  1699. static const int c_nClrPrefLen = (int)_tcsclen(XTPLEX_ATTR_COLORPREFIX);
  1700. CString strParamName = pColors->GetNextParamName(posParam);
  1701. DWORD dwValue = pColors->GetHexParam(strParamName);
  1702. CString strAttrName = strAttrPref + strParamName;
  1703. if (_tcsnicmp(strAttrName, XTPLEX_ATTR_COLORPREFIX, c_nClrPrefLen) == 0)
  1704. {
  1705. dwValue = XTP_EDIT_RGB_INT2CLR(dwValue);
  1706. }
  1707. CXTPSyntaxEditLexVariant lvAttr((int)dwValue);
  1708. ptrC->SetAttribute(strAttrName, lvAttr);
  1709. }
  1710. }
  1711. }
  1712. void CXTPSyntaxEditLexTextSchema::ApplyTheme(CXTPSyntaxEditColorTheme* pTheme)
  1713. {
  1714. // if pTheme == NULL - Restore default values only
  1715. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  1716. CSingleLock singleLock(GetDataLoker(), TRUE);
  1717. CXTPSyntaxEditLexClassPtrArray* ptrClassesFull = m_pClassSchema->GetClasses(FALSE);
  1718. CXTPSyntaxEditLexClassPtrArray* ptrClassesShort = m_pClassSchema->GetClasses(TRUE);
  1719. ApplyThemeRecursive(pTheme, ptrClassesFull);
  1720. ApplyThemeRecursive(pTheme, ptrClassesShort);
  1721. }
  1722. ////////////////////////////////////////////////////////////////////////////
  1723. // CXTPSyntaxEditLexClassSchema
  1724. CXTPSyntaxEditLexClassSchema::CXTPSyntaxEditLexClassSchema()
  1725. {
  1726. XTPGetLexAutomatMemMan()->Lock();
  1727. }
  1728. CXTPSyntaxEditLexClassSchema::~CXTPSyntaxEditLexClassSchema()
  1729. {
  1730. XTPGetLexAutomatMemMan()->Unlok();
  1731. }
  1732. void CXTPSyntaxEditLexClassSchema::AddPreBuildClass(CXTPSyntaxEditLexClass* pClass)
  1733. {
  1734. CXTPSyntaxEditLexClassPtr ptrC(pClass, TRUE);
  1735. m_arPreBuildClassesList.Add(ptrC);
  1736. }
  1737. CXTPSyntaxEditLexClassPtrArray* CXTPSyntaxEditLexClassSchema::GetChildrenFor(CXTPSyntaxEditLexClass* pClass,
  1738.  BOOL& rbSelfChild)
  1739. {
  1740. rbSelfChild = FALSE;
  1741. CXTPSyntaxEditLexClassPtrArray arChildren;
  1742. BOOL bForFile = pClass == NULL;
  1743. int nChidrenOpt = xtpEditOptChildren_Any;
  1744. CStringArray arChidrenData;
  1745. CString strParentName;
  1746. if (pClass)
  1747. {
  1748. pClass->GetChildrenOpt(nChidrenOpt, arChidrenData);
  1749. strParentName = pClass->GetClassName();
  1750. }
  1751. if (nChidrenOpt == xtpEditOptChildren_No)
  1752. {
  1753. return NULL;
  1754. }
  1755. int nCCount = (int)m_arPreBuildClassesList.GetSize();
  1756. for (int i = 0; i < nCCount; i++)
  1757. {
  1758. CXTPSyntaxEditLexClassPtr ptrC = m_arPreBuildClassesList[i];
  1759. int nParentOpt;
  1760. CStringArray arParentData;
  1761. ptrC->GetParentOpt(nParentOpt, arParentData);
  1762. CString strCName = ptrC->GetClassName();
  1763. if (bForFile && nParentOpt == xtpEditOptParent_file)
  1764. {
  1765. arChildren.Add(ptrC);
  1766. }
  1767. else if (!bForFile && nParentOpt == xtpEditOptParent_direct)
  1768. {
  1769. ASSERT(pClass);
  1770. if (nChidrenOpt == xtpEditOptChildren_List)
  1771. {
  1772. if (Find_noCase(arChidrenData, strCName) < 0)
  1773. {
  1774. continue;
  1775. }
  1776. }
  1777. int nNCount = (int)arParentData.GetSize();
  1778. for (int n = 0; n < nNCount; n++)
  1779. {
  1780. CString strCN = arParentData[n];
  1781. if (strCN.CompareNoCase(strParentName) == 0)
  1782. {
  1783. if (strCName.CompareNoCase(strParentName) == 0)
  1784. {
  1785. rbSelfChild = TRUE;
  1786. }
  1787. else
  1788. {
  1789. arChildren.Add(ptrC);
  1790. }
  1791. break;
  1792. }
  1793. }
  1794. }
  1795. }
  1796. //--------------------------------
  1797. CXTPSyntaxEditLexClassPtrArray* pArChildren = NULL;
  1798. if (arChildren.GetSize())
  1799. {
  1800. pArChildren = new CXTPSyntaxEditLexClassPtrArray;
  1801. if (pArChildren)
  1802. {
  1803. pArChildren->Append(arChildren);
  1804. }
  1805. }
  1806. return pArChildren;
  1807. }
  1808. int CXTPSyntaxEditLexClassSchema::CanBeParentDynForChild(CString strParentName,
  1809. CXTPSyntaxEditLexClass* pCChild)
  1810. {
  1811. if (!pCChild)
  1812. {
  1813. ASSERT(FALSE);
  1814. return FALSE;
  1815. }
  1816. int nParentOpt;
  1817. CStringArray arParentData;
  1818. pCChild->GetParentOpt(nParentOpt, arParentData);
  1819. if (nParentOpt != xtpEditOptParent_dyn)
  1820. {
  1821. return -1;
  1822. }
  1823. int nCCount = (int)m_arPreBuildClassesList.GetSize(), n;
  1824. for (int i = 0; i < nCCount; i++)
  1825. {
  1826. CXTPSyntaxEditLexClassPtr ptrC = m_arPreBuildClassesList[i];
  1827. CString strCName = ptrC->GetClassName();
  1828. int nNCount = (int)arParentData.GetSize();
  1829. for (n = 0; n < nNCount; n++)
  1830. {
  1831. CString strCN = arParentData[n];
  1832. if (strParentName.CompareNoCase(strCN) == 0)
  1833. {
  1834. return TRUE;
  1835. }
  1836. }
  1837. //-------------------------------------------------------
  1838. if (nParentOpt == xtpEditOptParent_dyn )
  1839. {
  1840. int nDataCount = (int)arParentData.GetSize();
  1841. for (n = 0; n < nDataCount; n++)
  1842. {
  1843. CString strCN = arParentData[n];
  1844. if (strCName.CompareNoCase(strCN) == 0)
  1845. {
  1846. BOOL bCanDyn = CanBeParentDynForChild(strParentName, ptrC);
  1847. if (bCanDyn)
  1848. {
  1849. return TRUE;
  1850. }
  1851. }
  1852. }
  1853. }
  1854. }
  1855. return FALSE;
  1856. }
  1857. CXTPSyntaxEditLexClass* CXTPSyntaxEditLexClassSchema::GetPreBuildClass(const CString& strName)
  1858. {
  1859. int nCCount = (int)m_arPreBuildClassesList.GetSize();
  1860. for (int i = 0; i < nCCount; i++)
  1861. {
  1862. CXTPSyntaxEditLexClassPtr ptrC = m_arPreBuildClassesList[i];
  1863. const CString strCName = ptrC->GetClassName();
  1864. if (strName.CompareNoCase(strCName) == 0)
  1865. {
  1866. return ptrC.Detach();
  1867. }
  1868. }
  1869. return NULL;
  1870. }
  1871. void CXTPSyntaxEditLexClassSchema::GetDynParentsList(CXTPSyntaxEditLexClass* pClass,
  1872.    CStringArray& rarDynParents,
  1873.    CStringArray& rarProcessedClasses)
  1874. {
  1875. if (!pClass)
  1876. {
  1877. ASSERT(FALSE);
  1878. return;
  1879. }
  1880. CString strClassName = pClass->GetClassName();
  1881. if (Find_noCase(rarProcessedClasses, strClassName) >= 0)
  1882. {
  1883. return;
  1884. }
  1885. rarProcessedClasses.Add(strClassName);
  1886. int nParentOpt;
  1887. CStringArray arParentData;
  1888. pClass->GetParentOpt(nParentOpt, arParentData);
  1889. if (nParentOpt == xtpEditOptParent_file)
  1890. {
  1891. return;
  1892. }
  1893. ConcatenateArrays_noCase(rarDynParents, arParentData);
  1894. int nNCount = (int)arParentData.GetSize();
  1895. for (int n = 0; n < nNCount; n++)
  1896. {
  1897. CString strParent1 = arParentData[n];
  1898. if (strClassName.CompareNoCase(strParent1) == 0)
  1899. {
  1900. continue;
  1901. }
  1902. CXTPSyntaxEditLexClassPtr ptrC = GetPreBuildClass(strParent1);
  1903. if (ptrC)
  1904. {
  1905. GetDynParentsList(ptrC, rarDynParents, rarProcessedClasses);
  1906. }
  1907. else
  1908. {
  1909. //TRACE
  1910. }
  1911. }
  1912. }
  1913. CXTPSyntaxEditLexClassPtrArray* CXTPSyntaxEditLexClassSchema::GetDynChildrenFor(CXTPSyntaxEditLexClass* pClass,
  1914. BOOL& rbSelfChild)
  1915. {
  1916. rbSelfChild = FALSE;
  1917. int nChidrenOpt = xtpEditOptChildren_Any;
  1918. CStringArray arChidrenData;
  1919. if (pClass)
  1920. {
  1921. pClass->GetChildrenOpt(nChidrenOpt, arChidrenData);
  1922. }
  1923. if (nChidrenOpt == xtpEditOptChildren_No)
  1924. {
  1925. return NULL;
  1926. }
  1927. if (!pClass)
  1928. return NULL;
  1929. CString strMainCName = pClass->GetClassName();
  1930. CStringArray arMainParents;
  1931. CStringArray arProcessedClasses;
  1932. GetDynParentsList(pClass, arMainParents, arProcessedClasses);
  1933. CXTPSyntaxEditLexClassPtrArray arDynChildren;
  1934. int nCCount = (int)m_arPreBuildClassesList.GetSize();
  1935. for (int i = 0; i < nCCount; i++)
  1936. {
  1937. CXTPSyntaxEditLexClassPtr ptrC = m_arPreBuildClassesList[i];
  1938. CString strCName = ptrC->GetClassName();
  1939. if (nChidrenOpt == xtpEditOptChildren_List)
  1940. {
  1941. if (Find_noCase(arChidrenData, strCName) < 0)
  1942. {
  1943. continue;
  1944. }
  1945. }
  1946. int nCanRes = CanBeParentDynForChild(strMainCName, ptrC);
  1947. if (nCanRes > 0)
  1948. {
  1949. if (strMainCName.CompareNoCase(strCName) == 0)
  1950. {
  1951. rbSelfChild = TRUE;
  1952. }
  1953. else
  1954. {
  1955. arDynChildren.Add(ptrC);
  1956. }
  1957. continue;
  1958. }
  1959. if (nCanRes < 0)
  1960. {
  1961. continue;
  1962. }
  1963. int nMPCount = (int)arMainParents.GetSize();
  1964. for (int n = 0; n < nMPCount; n++)
  1965. {
  1966. CString strMPName = arMainParents[n];
  1967. if (CanBeParentDynForChild(strMPName, ptrC))
  1968. {
  1969. arDynChildren.Add(ptrC);
  1970. break;
  1971. }
  1972. }
  1973. }
  1974. //--------------------------------
  1975. CXTPSyntaxEditLexClassPtrArray* pArDynChildren = NULL;
  1976. if (arDynChildren.GetSize())
  1977. {
  1978. pArDynChildren = new CXTPSyntaxEditLexClassPtrArray;
  1979. if (pArDynChildren)
  1980. {
  1981. pArDynChildren->Append(arDynChildren);
  1982. }
  1983. }
  1984. return pArDynChildren;
  1985. }
  1986. CXTPSyntaxEditLexObj_ActiveTags* CXTPSyntaxEditLexClassSchema::GetActiveTagsFor(
  1987. CXTPSyntaxEditLexClass* pTopClass)
  1988. {
  1989. if (!pTopClass)
  1990. {
  1991. ASSERT(FALSE);
  1992. return NULL;
  1993. }
  1994. return pTopClass->GetActiveTags();
  1995. }
  1996. BOOL CXTPSyntaxEditLexClassSchema::Copy(CXTPSyntaxEditLexClassSchema* pDest)
  1997. {
  1998. if (!pDest)
  1999. {
  2000. ASSERT(FALSE);
  2001. return FALSE;
  2002. }
  2003. //------------------------------------------------------------------------
  2004. int nCount = (int)m_arPreBuildClassesList.GetSize();
  2005. int i;
  2006. for (i = 0; i < nCount; i++)
  2007. {
  2008. CXTPSyntaxEditLexClassPtr ptrC0 = m_arPreBuildClassesList.GetAt(i);
  2009. if (!ptrC0)
  2010. {
  2011. continue;
  2012. }
  2013. CXTPSyntaxEditLexClassPtr ptrC0_new = ptrC0->Clone(this);
  2014. if (!ptrC0_new)
  2015. {
  2016. return FALSE;
  2017. }
  2018. pDest->m_arPreBuildClassesList.Add(ptrC0_new);
  2019. }
  2020. //------------------------------------------------------------------------
  2021. nCount = (int)m_arClassesTreeFull.GetSize();
  2022. for (i = 0; i < nCount; i++)
  2023. {
  2024. CXTPSyntaxEditLexClassPtr ptrCfile = m_arClassesTreeFull.GetAt(i);
  2025. if (!ptrCfile)
  2026. {
  2027. continue;
  2028. }
  2029. CXTPSyntaxEditLexClassPtr ptrCFnew = ptrCfile->Clone(this);
  2030. if (!CopyChildrenFor(FALSE, ptrCFnew, ptrCfile, 0))
  2031. {
  2032. return FALSE;
  2033. }
  2034. int nStartCount = 0;
  2035. ptrCFnew->BuildActiveTags(nStartCount);
  2036. // //CXTPSyntaxEditLexVariantPtrArray* ptrAT = ptrCFnew->BuildActiveTags(nStartCount);
  2037. // //ConcatenateLVArrays(&pDest->m_arAllActiveTagsFull, ptrAT, nStartCount);
  2038. pDest->m_arClassesTreeFull.Add(ptrCFnew);
  2039. }
  2040. //------------------------------------------------------------------------
  2041. BOOL bResShortTree = pDest->Build_ShortTree();
  2042. //-* Post Build processing ----------------------------
  2043. if (!PostBuild_Step(&pDest->m_arClassesTreeShort))
  2044. {
  2045. return FALSE;
  2046. }
  2047. if (!PostBuild_Step(&pDest->m_arClassesTreeFull))
  2048. {
  2049. return FALSE;
  2050. }
  2051. return bResShortTree;
  2052. }
  2053. BOOL CXTPSyntaxEditLexClassSchema::Build()
  2054. {
  2055. CXTPSyntaxEditLexClass::CloseClasses(&m_arClassesTreeFull);
  2056. CXTPSyntaxEditLexClass::CloseClasses(&m_arClassesTreeShort);
  2057. int nClassID = 1;
  2058. BOOL bUnused;
  2059. CXTPSyntaxEditLexClassPtrArray* ptrArCfile = GetChildrenFor(NULL, bUnused);
  2060. int nCount = ptrArCfile ? (int)ptrArCfile->GetSize() : 0;
  2061. for (int i = 0; i < nCount; i++)
  2062. {
  2063. CXTPSyntaxEditLexClassPtr ptrCfile = ptrArCfile->GetAt(i);
  2064. CXTPSyntaxEditLexClassPtr ptrCFnew = GetNewClass(TRUE);
  2065. if (!ptrCFnew)
  2066. {
  2067. delete ptrArCfile;
  2068. return FALSE;
  2069. }
  2070. ptrCFnew->CopyFrom(ptrCfile);
  2071. CXTPSyntaxEditLexVariant lvID(nClassID++);
  2072. ptrCFnew->SetAttribute(XTPLEX_ATTRCLASSID, lvID);
  2073. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2074. ptrCFnew->Dump(_T(""));
  2075. #endif
  2076. CString strCNnew = ptrCFnew->GetClassName();
  2077. CStringArray arAddedStack;
  2078. arAddedStack.Add(strCNnew);
  2079. if (!Build_ChildrenFor(FALSE, ptrCFnew, arAddedStack, nClassID, 0))
  2080. {
  2081. delete ptrArCfile;
  2082. return FALSE;
  2083. }
  2084. arAddedStack.RemoveAll();
  2085. if (!Build_ChildrenFor(TRUE, ptrCFnew, arAddedStack, nClassID, 0))
  2086. {
  2087. delete ptrArCfile;
  2088. return FALSE;
  2089. }
  2090. int nStartCount = 0;
  2091. ptrCFnew->BuildActiveTags(nStartCount);
  2092. //CXTPSyntaxEditLexVariantPtrArray* ptrAT = ptrCFnew->BuildActiveTags(nStartCount);
  2093. //ConcatenateLVArrays(&m_arAllActiveTagsFull, ptrAT, nStartCount);
  2094. m_arClassesTreeFull.Add(ptrCFnew);
  2095. }
  2096. delete ptrArCfile;
  2097. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2098. //      m_arAllActiveTagsFull.Dump(_T("AllActiveTags FULL=: "));
  2099. #endif
  2100. if (!Build_ShortTree())
  2101. {
  2102. return FALSE;
  2103. }
  2104. //-* Post Build processing ----------------------------
  2105. if (!PostBuild_Step(&m_arClassesTreeShort))
  2106. {
  2107. return FALSE;
  2108. }
  2109. if (!PostBuild_Step(&m_arClassesTreeFull))
  2110. {
  2111. return FALSE;
  2112. }
  2113. //----------------------
  2114. //BOOL bAsc = TRUE, bNoCase = FALSE;
  2115. //SortTagsInLexVarArray(m_arAllActiveTagsFull, bAsc, bNoCase);
  2116. //SortTagsInLexVarArray(m_arAllActiveTagsShort, bAsc, bNoCase);
  2117. //  m_arAllActiveTagsFull.BuildAutomat();
  2118. //  m_arAllActiveTagsShort.BuildAutomat();
  2119. //-* Post Build END ------------------------------------------------------
  2120. #ifdef _DEBUG
  2121. AfxDump(XTPGetLexAutomatMemMan());
  2122. #endif
  2123. //------------------------------------------------------------------------
  2124. return TRUE;
  2125. }
  2126. BOOL CXTPSyntaxEditLexClassSchema::Build_ShortTree()
  2127. {
  2128. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2129. TRACE(_T("n****************** Short classes Tree ********************** n"));
  2130. #endif
  2131. int nCount = (int)m_arClassesTreeFull.GetSize();
  2132. for (int i = 0; i < nCount; i++)
  2133. {
  2134. CXTPSyntaxEditLexClassPtr ptrCfile = m_arClassesTreeFull.GetAt(i);
  2135. if (!ptrCfile || ptrCfile->GetAttribute_BOOL(XTPLEX_ATTR_PARSEONSCREEN, FALSE))
  2136. {
  2137. continue;
  2138. }
  2139. CXTPSyntaxEditLexClassPtr ptrCFnew = GetNewClass(TRUE);
  2140. if (!ptrCFnew)
  2141. {
  2142. return FALSE;
  2143. }
  2144. ptrCFnew->CopyFrom(ptrCfile);
  2145. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2146. ptrCFnew->Dump(_T(""));
  2147. #endif
  2148. if (!CopyChildrenFor(TRUE, ptrCFnew, ptrCfile, 0))
  2149. {
  2150. return FALSE;
  2151. }
  2152. int nStartCount = 0;
  2153. ptrCFnew->BuildActiveTags(nStartCount);
  2154. //CXTPSyntaxEditLexVariantPtrArray* ptrAT = ptrCFnew->BuildActiveTags(nStartCount);
  2155. //ConcatenateLVArrays(&m_arAllActiveTagsShort, ptrAT, nStartCount);
  2156. m_arClassesTreeShort.Add(ptrCFnew);
  2157. }
  2158. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2159. //      m_arAllActiveTagsShort.Dump(_T("AllActiveTags Short=: "));
  2160. #endif
  2161. return TRUE;
  2162. }
  2163. BOOL CXTPSyntaxEditLexClassSchema::CopyChildrenFor(BOOL bShort, CXTPSyntaxEditLexClass* pCDest,
  2164.    CXTPSyntaxEditLexClass* pCSrc, int nLevel)
  2165. {
  2166. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2167. CString strTraceOffset0, strTraceOffset;
  2168. for (int t = 0; t <= nLevel; t++)
  2169. {
  2170. strTraceOffset0 += _T("   ");
  2171. }
  2172. #endif
  2173. CXTPSyntaxEditLexClassPtrArray* pArClasses[3];
  2174. pArClasses[0] = pCSrc->GetChildren();
  2175. pArClasses[1] = pCSrc->GetChildrenDyn();
  2176. pArClasses[2] = pCSrc->GetChildrenSelfRef();
  2177. for (int nC = 0; nC < _countof(pArClasses); nC++)
  2178. {
  2179. BOOL bDynamic = (nC == 1);
  2180. BOOL bSelf  = (nC == 2);
  2181. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2182. if (bDynamic)
  2183. {
  2184. strTraceOffset = strTraceOffset0 + _T("dyn: ");
  2185. }
  2186. else if (bSelf)
  2187. {
  2188. strTraceOffset = strTraceOffset0 + _T("self: ");
  2189. }
  2190. else
  2191. {
  2192. strTraceOffset = strTraceOffset0;
  2193. }
  2194. #endif
  2195. int nCount = pArClasses[nC] ? (int)pArClasses[nC]->GetSize() : 0;
  2196. for (int i = 0; i < nCount; i++)
  2197. {
  2198. CXTPSyntaxEditLexClassPtr ptrCsrc = pArClasses[nC]->GetAt(i);
  2199. if (!ptrCsrc ||
  2200. bShort && ptrCsrc->GetAttribute_BOOL(XTPLEX_ATTR_PARSEONSCREEN, FALSE))
  2201. {
  2202. continue;
  2203. }
  2204. if (bSelf)
  2205. {
  2206. pCDest->AddChild(pCDest, FALSE);
  2207. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2208. pCDest->Dump(strTraceOffset);
  2209. #endif
  2210. }
  2211. else
  2212. {
  2213. CXTPSyntaxEditLexClassPtr ptrCnew = GetNewClass(FALSE);
  2214. if (!ptrCnew)
  2215. {
  2216. return FALSE;
  2217. }
  2218. ptrCnew->CopyFrom(ptrCsrc);
  2219. pCDest->AddChild(ptrCnew, bDynamic);
  2220. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2221. ptrCnew->Dump(strTraceOffset);
  2222. #endif
  2223. ASSERT(pCSrc != ptrCsrc);
  2224. if (!CopyChildrenFor(bShort, ptrCnew, ptrCsrc, nLevel+1))
  2225. {
  2226. return FALSE;
  2227. }
  2228. }
  2229. }
  2230. }
  2231. return TRUE;
  2232. }
  2233. BOOL CXTPSyntaxEditLexClassSchema::Build_ChildrenFor(BOOL bDynamic,
  2234.    CXTPSyntaxEditLexClass* pCBase,
  2235.    CStringArray& rarAdded,
  2236.    int& rnNextClassID,
  2237.    int nLevel)
  2238. {
  2239. if (!pCBase)
  2240. {
  2241. ASSERT(FALSE);
  2242. return FALSE;
  2243. }
  2244. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2245. CString strTraceOffset;
  2246. for (int t = 0; t <= nLevel; t++)
  2247. {
  2248. strTraceOffset += _T("   ");
  2249. }
  2250. if (bDynamic)
  2251. {
  2252. strTraceOffset += _T("dyn: ");
  2253. }
  2254. #endif
  2255. BOOL bSelfChild = FALSE;
  2256. CXTPSyntaxEditLexClassPtrArray* ptrArChildren;
  2257. if (bDynamic)
  2258. {
  2259. ptrArChildren = GetDynChildrenFor(pCBase, bSelfChild);
  2260. }
  2261. else
  2262. {
  2263. ptrArChildren = GetChildrenFor(pCBase, bSelfChild);
  2264. }
  2265. int nCount = ptrArChildren ? (int)ptrArChildren->GetSize() : 0;
  2266. for (int i = 0; i < nCount; i++)
  2267. {
  2268. CXTPSyntaxEditLexClassPtr ptrCsrc = ptrArChildren->GetAt(i);
  2269. CString strCNsrc = ptrCsrc->GetClassName();
  2270. if (nLevel == 0)
  2271. {
  2272. rarAdded.RemoveAll();
  2273. }
  2274. //int nFIdx = Find_noCase(rarAdded, strCNsrc);
  2275. //if (nFIdx >= 0)
  2276. int nClsCount = FindStrCount(rarAdded, strCNsrc, FALSE);
  2277. int nRecurrenceDepth = ptrCsrc->GetAttribute_int(XTPLEX_ATTR_RECURRENCEDEPTH, TRUE, 1);;
  2278. if (nClsCount >= nRecurrenceDepth)
  2279. {
  2280. //CXTPSyntaxEditLexClassPtr ptrC(pCBase->FindParent(strCNsrc), TRUE);
  2281. //if (ptrC) {
  2282. //  pCBase->GetChildrenSelfRef()->Add(ptrC);
  2283. //#ifdef DBG_TRACE_LOAD_CLASS_SCH
  2284. //  strTraceOffset += _T("self: ");
  2285. //  ptrC->Dump(strTraceOffset);
  2286. //#endif
  2287. //}
  2288. continue;
  2289. }
  2290. rarAdded.Add(strCNsrc);
  2291. CXTPSyntaxEditLexClassPtr ptrCnew = GetNewClass(FALSE);
  2292. if (!ptrCnew)
  2293. {
  2294. delete ptrArChildren;
  2295. return FALSE;
  2296. }
  2297. ptrCnew->CopyFrom(ptrCsrc);
  2298. CXTPSyntaxEditLexVariant lvID(rnNextClassID++);
  2299. ptrCnew->SetAttribute(XTPLEX_ATTRCLASSID, lvID);
  2300. pCBase->AddChild(ptrCnew, bDynamic);
  2301. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2302. ptrCnew->Dump(strTraceOffset);
  2303. #endif
  2304. Build_ChildrenFor(bDynamic, ptrCnew, rarAdded, rnNextClassID, nLevel+1);
  2305. Build_ChildrenFor(!bDynamic, ptrCnew, rarAdded, rnNextClassID, nLevel+1);
  2306. int nStackCount = (int)rarAdded.GetSize();
  2307. if (nStackCount > 0)
  2308. {
  2309. rarAdded.RemoveAt(nStackCount - 1);
  2310. }
  2311. }
  2312. delete ptrArChildren;
  2313. //----------------------------------
  2314. if (bSelfChild)
  2315. {
  2316. if (pCBase->AddChild(pCBase, bDynamic))
  2317. {
  2318. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2319. strTraceOffset += _T("self: ");
  2320. pCBase->Dump(strTraceOffset);
  2321. #endif
  2322. }
  2323. }
  2324. return TRUE;
  2325. }
  2326. BOOL CXTPSyntaxEditLexClassSchema::PostBuild_Step(CXTPSyntaxEditLexClassPtrArray* pArClasses)
  2327. {
  2328. if (!pArClasses)
  2329. {
  2330. return TRUE;
  2331. }
  2332. int nCount = (int)pArClasses->GetSize();
  2333. for (int i = 0; i < nCount; i++)
  2334. {
  2335. CXTPSyntaxEditLexClassPtr ptrC = pArClasses->GetAt(i);
  2336. ptrC->SortTags();
  2337. CXTPSyntaxEditLexClassPtrArray* ptrCh1 = ptrC->GetChildren();
  2338. CXTPSyntaxEditLexClassPtrArray* ptrCh2 = ptrC->GetChildrenDyn();
  2339. if (!PostBuild_Step(ptrCh1))
  2340. {
  2341. return FALSE;
  2342. }
  2343. if (!PostBuild_Step(ptrCh2))
  2344. {
  2345. return FALSE;
  2346. }
  2347. }
  2348. return TRUE;
  2349. }
  2350. void CXTPSyntaxEditLexClassSchema::Close()
  2351. {
  2352. RemoveAll();
  2353. }
  2354. void CXTPSyntaxEditLexClassSchema::RemoveAll()
  2355. {
  2356. CXTPSyntaxEditLexClass::CloseClasses(&m_arPreBuildClassesList);
  2357. CXTPSyntaxEditLexClass::CloseClasses(&m_arClassesTreeFull);
  2358. CXTPSyntaxEditLexClass::CloseClasses(&m_arClassesTreeShort);
  2359. }
  2360. CXTPSyntaxEditLexClassPtrArray* CXTPSyntaxEditLexClassSchema::GetClasses(BOOL bShortSch)
  2361. {
  2362. return bShortSch? &m_arClassesTreeShort: &m_arClassesTreeFull;
  2363. }
  2364. CXTPSyntaxEditLexClassPtrArray* CXTPSyntaxEditLexClassSchema::GetPreBuildClasses()
  2365. {
  2366. return &m_arPreBuildClassesList;
  2367. }
  2368. CXTPSyntaxEditLexClass* CXTPSyntaxEditLexClassSchema::GetNewClass(BOOL bForFile)
  2369. {
  2370. if (bForFile)
  2371. {
  2372. return new CXTPSyntaxEditLexClass_file();
  2373. }
  2374. return new CXTPSyntaxEditLexClass();
  2375. }
  2376. ////////////////////////////////////////////////////////////////////////////
  2377. // CXTPSyntaxEditLexParseContext
  2378. //class CXTPSyntaxEditLexParseContext : public CXTPInternalUnknown
  2379. //CXTPSyntaxEditLexParseContext::CXTPSyntaxEditLexParseContext(CXTPSyntaxEditLexTextBlock* pBlock) :
  2380. //                  CXTPInternalUnknown(pBlock)
  2381. //{
  2382. //  ASSERT(pBlock);
  2383. //
  2384. //  m_pTextBlock = pBlock;
  2385. //}
  2386. //
  2387. //CXTPSyntaxEditLexParseContext::~CXTPSyntaxEditLexParseContext()
  2388. //{
  2389. //}
  2390. //
  2391. //void CXTPSyntaxEditLexParseContext::Set(LPCTSTR pcszParopPath, CXTPSyntaxEditLexVariant* pVar)
  2392. //{
  2393. //  if (pVar == NULL) {
  2394. //      m_mapVars.RemoveKey(pcszParopPath);
  2395. //
  2396. //  }
  2397. //  else {
  2398. //      CXTPSyntaxEditLexVariantPtr ptrVar = new CXTPSyntaxEditLexVariant(*pVar);
  2399. //
  2400. //      m_mapVars.SetAt(pcszParopPath, ptrVar);
  2401. //  }
  2402. //}
  2403. //
  2404. //CXTPSyntaxEditLexVariant* CXTPSyntaxEditLexParseContext::Get(LPCTSTR pcszParopPath)
  2405. //{
  2406. //  CXTPSyntaxEditLexVariantPtr ptrVar;
  2407. //
  2408. //  if (m_mapVars.Lookup(pcszParopPath, ptrVar)) {
  2409. //      return ptrVar.Detach();
  2410. //  }
  2411. //  return NULL;
  2412. //}
  2413. //
  2414. //
  2415. //CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexParseContext::GetTextBlock()
  2416. //{
  2417. //  if (m_pTextBlock) {
  2418. //      m_pTextBlock->InternalAddRef();
  2419. //  }
  2420. //  return m_pTextBlock;
  2421. //}
  2422. //
  2423. //void CXTPSyntaxEditLexParseContext::Close()
  2424. //{
  2425. //  m_pTextBlock = NULL;
  2426. //  m_mapVars.RemoveAll();
  2427. //}
  2428. ////////////////////////////////////////////////////////////////////////////
  2429. // CXTPSyntaxEditLexTextBlock
  2430. CXTPSyntaxEditLexTextBlock::CXTPSyntaxEditLexTextBlock() //:
  2431. //m_parseContext(this)
  2432. {
  2433. m_PosStartLC.nLine = 0;
  2434. m_PosStartLC.nCol = 0;
  2435. m_PosEndLC.nLine = 0;
  2436. m_PosEndLC.nCol = 0;
  2437. m_nStartTagLen = 0;
  2438. m_nEndTagXLCLen = 0;
  2439. m_bEndByParent = FALSE;
  2440. }
  2441. CXTPSyntaxEditLexTextBlock::~CXTPSyntaxEditLexTextBlock()
  2442. {
  2443. }
  2444. void CXTPSyntaxEditLexTextBlock::Close()
  2445. {
  2446. m_ptrLexClass = NULL;
  2447. m_ptrParent = NULL;
  2448. m_ptrPrev = NULL;
  2449. m_ptrNext= NULL;
  2450. m_ptrLastChild = NULL;
  2451. }
  2452. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextBlock::GetPrevChild(CXTPSyntaxEditLexTextBlock* pChild,
  2453.  BOOL bWithAddRef)
  2454. {
  2455. while (pChild && pChild != this)
  2456. {
  2457. if (!pChild->m_ptrPrev)
  2458. {
  2459. return NULL;
  2460. }
  2461. pChild = pChild->m_ptrPrev;
  2462. if (pChild && (CXTPSyntaxEditLexTextBlock*)pChild->m_ptrParent == this)
  2463. {
  2464. if (bWithAddRef)
  2465. {
  2466. pChild->InternalAddRef();
  2467. }
  2468. return pChild;
  2469. }
  2470. }
  2471. return NULL;
  2472. }
  2473. int CXTPSyntaxEditLexTextBlock::EndChildren(CXTPSyntaxEditLexTextSchema* pTxtSch, BOOL bEndByParent)
  2474. {
  2475. int nCount = 0;
  2476. //CSingleLock singleLock(GetDataLoker(), TRUE);
  2477. CXTPSyntaxEditLexTextBlock* pChTB = m_ptrLastChild;
  2478. while (pChTB)
  2479. {
  2480. if (!pChTB->m_PosEndLC.IsValidData())
  2481. {
  2482. pChTB->m_PosEndLC = m_PosEndLC;
  2483. pChTB->m_nEndTagXLCLen = m_nEndTagXLCLen;
  2484. pChTB->m_bEndByParent = bEndByParent;
  2485. nCount++;
  2486. if (pTxtSch)
  2487. {
  2488. pTxtSch->SendEvent_OnTextBlockParsed(pChTB);
  2489. }
  2490. nCount += pChTB->EndChildren(pTxtSch, bEndByParent);
  2491. }
  2492. pChTB = GetPrevChild(pChTB, FALSE);
  2493. }
  2494. return nCount;
  2495. }
  2496. BOOL CXTPSyntaxEditLexTextBlock::IsLookLikeClosed() const
  2497. {
  2498. if (!m_ptrLexClass && !m_ptrPrev && !m_ptrNext && !m_ptrLastChild &&
  2499. !m_ptrParent)
  2500. {
  2501. return TRUE;
  2502. }
  2503. return FALSE;
  2504. }
  2505. BOOL CXTPSyntaxEditLexTextBlock::IsInclude(CXTPSyntaxEditLexTextBlock* pTB2) const
  2506. {
  2507. if (!pTB2)
  2508. {
  2509. ASSERT(FALSE);
  2510. return FALSE;
  2511. }
  2512. ASSERT(m_PosStartLC.IsValidData() && pTB2->m_PosStartLC.IsValidData());
  2513. if (m_PosStartLC <= pTB2->m_PosStartLC && m_PosEndLC >= pTB2->m_PosEndLC &&
  2514. m_PosEndLC.IsValidData() && pTB2->m_PosEndLC.IsValidData() )
  2515. {
  2516. return TRUE;
  2517. }
  2518. return FALSE;
  2519. }
  2520. BOOL CXTPSyntaxEditLexTextBlock::IsEqualLexClasses(CXTPSyntaxEditLexTextBlock* pTB2) const
  2521. {
  2522. if (!m_ptrLexClass || !pTB2 || !pTB2->m_ptrLexClass)
  2523. {
  2524. ASSERT(FALSE);
  2525. return FALSE;
  2526. }
  2527. CString strThisClass = m_ptrLexClass->GetClassName();
  2528. CString strTB2Class = pTB2->m_ptrLexClass->GetClassName();
  2529. int nCmpRes = strThisClass.CompareNoCase(strTB2Class);
  2530. return nCmpRes==0;
  2531. }
  2532. ////////////////////////////////////////////////////////////////////////////
  2533. // CXTPSyntaxEditLexAnalyser
  2534. CXTPSyntaxEditLexParser::CXTPSyntaxEditLexParser()
  2535. {
  2536. m_pParseThread = NULL;
  2537. m_nParseThreadPriority = THREAD_PRIORITY_NORMAL;
  2538. // THREAD_PRIORITY_BELOW_NORMAL
  2539. // THREAD_PRIORITY_ABOVE_NORMAL;
  2540. //  m_SinkMT.SetOuter(this);
  2541. m_pConnect = new CXTPNotifyConnection;
  2542. m_ptrTextSchema = 0;
  2543. m_pSchOptions_default = new CXTPSyntaxEditLexParserSchemaOptions();
  2544. }
  2545. CXTPSyntaxEditLexParser::~CXTPSyntaxEditLexParser()
  2546. {
  2547. Close();
  2548. ASSERT(m_ptrTextSchema == 0);
  2549. #ifdef XTP_DBG_DUMP_OBJ
  2550. afxDump.SetDepth( 1 );
  2551. #endif
  2552. CMDTARGET_RELEASE(m_pConnect);
  2553. CMDTARGET_RELEASE(m_pSchOptions_default);
  2554. RemoveAllOptions();
  2555. }
  2556. void CXTPSyntaxEditLexParser::RemoveAllOptions()
  2557. {
  2558. POSITION pos = m_mapSchOptions.GetStartPosition();
  2559. while(pos)
  2560. {
  2561. CXTPSyntaxEditLexParserSchemaOptions* pOptions = NULL;
  2562. CString key;
  2563. m_mapSchOptions.GetNextAssoc(pos, key, pOptions);
  2564. CMDTARGET_RELEASE(pOptions);
  2565. }
  2566. m_mapSchOptions.RemoveAll();
  2567. }
  2568. CXTPNotifyConnection* CXTPSyntaxEditLexParser::GetConnection()
  2569. {
  2570. return m_pConnect;
  2571. }
  2572. CXTPSyntaxEditLexParser::CXTPSyntaxEditParseThreadParams::CXTPSyntaxEditParseThreadParams()
  2573. {
  2574. ptrBuffer = NULL;
  2575. }
  2576. void CXTPSyntaxEditLexParser::CXTPSyntaxEditParseThreadParams::AddParseZone(const CXTPSyntaxEditTextRegion& rZone)
  2577. {
  2578. const int cnEpsilon = XTP_EDIT_XLC(3, 0);
  2579. int nCount = (int)arInvalidZones.GetSize();
  2580. for (int i = 0; i < nCount; i++)
  2581. {
  2582. CXTPSyntaxEditTextRegion zoneI = arInvalidZones[i];
  2583. if (rZone.m_posEnd >= zoneI.m_posStart &&
  2584. rZone.m_posStart <= zoneI.m_posStart
  2585. ||
  2586. rZone.m_posEnd.GetXLC()+cnEpsilon >= zoneI.m_posStart.GetXLC() &&
  2587. rZone.m_posStart <= zoneI.m_posStart
  2588. )
  2589. {
  2590. zoneI.m_posStart = rZone.m_posStart;
  2591. arInvalidZones[i] = zoneI;
  2592. return;
  2593. }
  2594. else if (rZone.m_posStart <= zoneI.m_posEnd &&
  2595. rZone.m_posEnd >= zoneI.m_posEnd
  2596. ||
  2597. rZone.m_posStart.GetXLC()-cnEpsilon <= zoneI.m_posEnd.GetXLC() &&
  2598. rZone.m_posEnd >= zoneI.m_posEnd
  2599. )
  2600. {
  2601. zoneI.m_posEnd = rZone.m_posEnd;
  2602. arInvalidZones[i] = zoneI;
  2603. return;
  2604. }
  2605. else if (rZone.m_posStart >= zoneI.m_posStart
  2606. && rZone.m_posEnd <= zoneI.m_posEnd)
  2607. {
  2608. return; //nothing
  2609. }
  2610. }
  2611. arInvalidZones.Add(rZone);
  2612. }
  2613. void CXTPSyntaxEditLexParser::Close()
  2614. {
  2615. CSingleLock singLockMain(&m_csParserData);
  2616. CloseParseThread();
  2617. m_SinkMT.UnadviseAll();
  2618. CMDTARGET_RELEASE(m_ptrTextSchema);
  2619. }
  2620. void CXTPSyntaxEditLexParser::SelfCloseParseThread()
  2621. {
  2622. ASSERT(m_pParseThread);
  2623. if (m_pParseThread)
  2624. {
  2625. m_pParseThread = NULL;
  2626. m_PThreadParams.evExitThread.ResetEvent();
  2627. ASSERT(m_PThreadParams.arInvalidZones.GetSize() == 0);
  2628. if (m_ptrTextSchema)
  2629. {
  2630. m_ptrTextSchema->GetBreakParsingEvent()->ResetEvent();
  2631. }
  2632. }
  2633. }
  2634. //===========================================================================
  2635. //#pragma warning(push)
  2636. #pragma warning(disable: 4702)   // warning C4702: unreachable code
  2637. //----------------------------
  2638. void CXTPSyntaxEditLexParser::CloseParseThread()
  2639. {
  2640. StopParseInThread();
  2641. CSingleLock singLockMain(&m_csParserData);
  2642. if (m_pParseThread)
  2643. {
  2644. HANDLE hThread = NULL;
  2645. try
  2646. {
  2647. hThread = m_pParseThread->m_hThread;
  2648. }
  2649. catch (...)
  2650. {
  2651. TRACE(_T("ERROR! Parse Thread is not exist. [CloseParseThread()]n"));
  2652. }
  2653. m_pParseThread = NULL;
  2654. DWORD dwThreadRes = WAIT_TIMEOUT;
  2655. for (int i = 0; i < 10 && dwThreadRes == WAIT_TIMEOUT; i++)
  2656. {
  2657. m_PThreadParams.evParseRun.ResetEvent();
  2658. m_PThreadParams.evExitThread.SetEvent();
  2659. if (m_ptrTextSchema)
  2660. {
  2661. m_ptrTextSchema->GetBreakParsingEvent()->SetEvent();
  2662. }
  2663. if (hThread)
  2664. {
  2665. dwThreadRes = ::WaitForSingleObject(hThread, 20*1000);
  2666. }
  2667. else
  2668. {
  2669. Sleep(5000);
  2670. break;
  2671. }
  2672. }
  2673. if (dwThreadRes == WAIT_TIMEOUT && hThread)
  2674. {
  2675. ::TerminateThread(hThread, 0);
  2676. TRACE(_T("ERROR! Parser thread was not ended by normal way. It was terminated. n"));
  2677. }
  2678. m_PThreadParams.evExitThread.ResetEvent();
  2679. m_PThreadParams.arInvalidZones.RemoveAll();
  2680. if (m_ptrTextSchema)
  2681. {
  2682. m_ptrTextSchema->GetBreakParsingEvent()->ResetEvent();
  2683. }
  2684. }
  2685. }
  2686. //#pragma warning(pop)
  2687. //===========================================================================
  2688. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::GetBlocks()
  2689. {
  2690. return m_ptrFirstBlock.GetInterface(TRUE);
  2691. }
  2692. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::FindNearestTextBlock(XTP_EDIT_LINECOL posText)
  2693. {
  2694. CSingleLock singleLock(GetDataLoker(), TRUE);
  2695. //---------------------------------------------------------------------------
  2696. CXTPSyntaxEditLexTextBlockPtr ptrTBstart = GetBlocks();
  2697. CXTPSyntaxEditLexTextBlock* pTBnearest = ptrTBstart;
  2698. for (CXTPSyntaxEditLexTextBlock* pTB = ptrTBstart; pTB; pTB = pTB->m_ptrNext)
  2699. {
  2700. if (posText < pTB->m_PosStartLC)
  2701. {
  2702. break;
  2703. }
  2704. pTBnearest = pTB;
  2705. }
  2706. //--------------------------
  2707. while (pTBnearest && pTBnearest->m_ptrPrev &&
  2708.   pTBnearest->m_PosStartLC == pTBnearest->m_ptrPrev->m_PosStartLC)
  2709. {
  2710. pTBnearest = pTBnearest->m_ptrPrev;
  2711. }
  2712. //--------------------------
  2713. if (pTBnearest)
  2714. {
  2715. pTBnearest->InternalAddRef();
  2716. }
  2717. return pTBnearest;
  2718. }
  2719. BOOL CXTPSyntaxEditLexTextSchema::UpdateTBNearest(CXTPSyntaxEditLexTextBlock* pNarestTB1,
  2720. int nLineDiff, int nColDiff,
  2721. XTP_EDIT_LINECOL posFrom, XTP_EDIT_LINECOL posTo,
  2722.  int eEditAction )
  2723. {
  2724. int nResult = xtpEditUTBNothing;
  2725. CXTPSyntaxEditLexTextBlock* pTB;
  2726. for (pTB = pNarestTB1; pTB; pTB = pTB->m_ptrParent)
  2727. {
  2728. ASSERT(pTB != pTB->m_ptrParent);
  2729. //-------------------------------------------------------------
  2730. BOOL bIsBlockStartIntersected = eEditAction == xtpEditActDelete &&
  2731. pTB->m_PosStartLC >= posFrom && pTB->m_PosStartLC < posTo
  2732. ||
  2733. eEditAction == xtpEditActInsert &&
  2734. pTB->m_PosStartLC < posFrom &&
  2735. posFrom.GetXLC() < pTB->GetStartTagEndXLC();
  2736. if (bIsBlockStartIntersected)
  2737. {
  2738. nResult |= xtpEditUTBReparse;
  2739. if (pTB == pNarestTB1)
  2740. {
  2741. nResult |= xtpEditUTBNearestUpdated;
  2742. }
  2743. // set empty
  2744. pTB->m_PosEndLC.nLine = pTB->m_PosStartLC.nLine;
  2745. pTB->m_PosEndLC.nCol = pTB->m_PosStartLC.nCol-1;
  2746. continue;
  2747. }
  2748. //-------------------------------------------------------------
  2749. BOOL bIsEditingFullyInside = eEditAction == xtpEditActInsert &&
  2750. pTB->GetStartTagEndXLC() <= posFrom.GetXLC() &&
  2751. posFrom.GetXLC() <= pTB->GetEndTagBeginXLC()
  2752. ||
  2753. eEditAction == xtpEditActDelete &&
  2754. pTB->GetStartTagEndXLC() <= posFrom.GetXLC() &&
  2755. posTo.GetXLC() <= pTB->GetEndTagBeginXLC();
  2756. if (bIsEditingFullyInside)
  2757. {
  2758. if (pTB == pNarestTB1)
  2759. {
  2760. nResult |= xtpEditUTBNearestUpdated;
  2761. }
  2762. BOOL bEmpty = FALSE;
  2763. pTB->m_PosEndLC.nLine += nLineDiff;
  2764. if (pTB->m_PosEndLC.nLine < pTB->m_PosStartLC.nLine)
  2765. {
  2766. // set empty
  2767. bEmpty = TRUE;
  2768. pTB->m_PosEndLC.nLine = pTB->m_PosStartLC.nLine;
  2769. pTB->m_PosEndLC.nCol = pTB->m_PosStartLC.nCol-1;
  2770. }
  2771. int nELine = eEditAction == xtpEditActInsert ? posTo.nLine : posFrom.nLine;
  2772. if (!bEmpty && pTB->m_PosEndLC.nLine == nELine)
  2773. {
  2774. pTB->m_PosEndLC.nCol += nColDiff;
  2775. if (pTB->m_PosEndLC.nCol < 0)
  2776. {
  2777. pTB->m_PosEndLC.nCol = 0;
  2778. }
  2779. }
  2780. continue;
  2781. }
  2782. //-------------------------------------------------------------
  2783. BOOL bIsBlockEndIntersected = eEditAction == xtpEditActDelete &&
  2784. (!(posTo.GetXLC() <= pTB->GetEndTagBeginXLC() ||
  2785. posFrom.GetXLC() > pTB->GetEndTagEndXLC() )
  2786. )
  2787. ||
  2788. eEditAction == xtpEditActInsert &&
  2789. posFrom.GetXLC() > pTB->GetEndTagBeginXLC() &&
  2790. posFrom.GetXLC() <= pTB->GetEndTagEndXLC();
  2791. if (bIsBlockEndIntersected)
  2792. {
  2793. nResult |= xtpEditUTBReparse;
  2794. if (pTB == pNarestTB1)
  2795. {
  2796. nResult |= xtpEditUTBNearestUpdated;
  2797. }
  2798. // set empty
  2799. pTB->m_PosEndLC.nLine = 0;
  2800. pTB->m_PosEndLC.nCol =  0;
  2801. continue;
  2802. }
  2803. }
  2804. //--------------------
  2805. return nResult;
  2806. }
  2807. int CXTPSyntaxEditLexTextSchema::UpdateTextBlocks(XTP_EDIT_LINECOL posFrom, XTP_EDIT_LINECOL posTo,
  2808.  int eEditAction )
  2809. {
  2810. CSingleLock singleLock(GetDataLoker());
  2811. //BOOL bLocked = TryLockCS(&singleLock, GetDataLoker(), 5000, 50);
  2812. BOOL bLocked = singleLock.Lock(5000);
  2813. if (!bLocked)
  2814. {
  2815. ASSERT(FALSE);
  2816. TRACE(_T("ERROR! Cannot enter critical section. [Dead lock, hang up???] CXTPSyntaxEditLexTextSchema::UpdateTextBlocks() n"));
  2817. return xtpEditUTBError;
  2818. }
  2819. CXTPSyntaxEditLexTextBlockPtr ptrNarestTB1 = FindNearestTextBlock(posFrom);
  2820. if (!ptrNarestTB1)
  2821. {
  2822. return xtpEditUTBNothing;
  2823. }
  2824. int nLineDiff = posTo.nLine - posFrom.nLine;
  2825. int nColDiff = posTo.nCol - posFrom.nCol;
  2826. ASSERT(nLineDiff >= 0);
  2827. if (eEditAction == xtpEditActDelete)
  2828. {
  2829. nLineDiff *= -1;
  2830. nColDiff *= -1;
  2831. }
  2832. //- (1)- update FullyInside nearest and parents blocks
  2833. int nURes = UpdateTBNearest(ptrNarestTB1, nLineDiff,
  2834. nColDiff, posFrom, posTo, eEditAction);
  2835. //- (2)- update block after nearest
  2836. CXTPSyntaxEditLexTextBlock* pTB = (nURes & xtpEditUTBNearestUpdated) ? ptrNarestTB1->m_ptrNext :
  2837. ptrNarestTB1;
  2838. for (; pTB; pTB = pTB->m_ptrNext)
  2839. {
  2840. //-------------------------------------------------------------
  2841. BOOL bIsBlockStartIntersected = eEditAction == xtpEditActDelete &&
  2842. (!(posTo <= pTB->m_PosStartLC ||
  2843. posFrom.GetXLC() >= pTB->GetStartTagEndXLC())
  2844. )
  2845. ||
  2846. eEditAction == xtpEditActInsert &&
  2847. pTB->m_PosStartLC < posFrom &&
  2848. posFrom.GetXLC() < pTB->GetStartTagEndXLC();
  2849. if (bIsBlockStartIntersected)
  2850. {
  2851. nURes |= xtpEditUTBReparse;
  2852. // set empty
  2853. pTB->m_PosEndLC.nLine = pTB->m_PosStartLC.nLine;
  2854. pTB->m_PosEndLC.nCol = pTB->m_PosStartLC.nCol-1;
  2855. continue;
  2856. }
  2857. //-------------------------------------------------------------
  2858. BOOL bIsEditingFullyInside = eEditAction == xtpEditActInsert &&
  2859. pTB->GetStartTagEndXLC() <= posFrom.GetXLC() &&
  2860. posFrom.GetXLC() <= pTB->GetEndTagBeginXLC()
  2861. ||
  2862. eEditAction == xtpEditActDelete &&
  2863. pTB->GetStartTagEndXLC() <= posFrom.GetXLC() &&
  2864. posTo.GetXLC() <= pTB->GetEndTagBeginXLC(); // ??? +- 1;
  2865. if (bIsEditingFullyInside)
  2866. {
  2867. BOOL bEmpty = FALSE;
  2868. pTB->m_PosEndLC.nLine += nLineDiff;
  2869. if (pTB->m_PosEndLC.nLine < pTB->m_PosStartLC.nLine)
  2870. {
  2871. // set empty
  2872. bEmpty = TRUE;
  2873. pTB->m_PosEndLC.nLine = pTB->m_PosStartLC.nLine;
  2874. pTB->m_PosEndLC.nCol = pTB->m_PosStartLC.nCol-1;
  2875. }
  2876. int nELine = eEditAction == xtpEditActInsert ? posTo.nLine : posFrom.nLine;
  2877. if (!bEmpty && pTB->m_PosEndLC.nLine == nELine)
  2878. {
  2879. pTB->m_PosEndLC.nCol += nColDiff;
  2880. if (pTB->m_PosEndLC.nCol < 0)
  2881. {
  2882. pTB->m_PosEndLC.nCol = 0;
  2883. }
  2884. }
  2885. continue;
  2886. }
  2887. //-------------------------------------------------------------
  2888. BOOL bIsBlockEndIntersected = eEditAction == xtpEditActDelete &&
  2889. (!(posTo.GetXLC() <= pTB->GetEndTagBeginXLC() ||
  2890. posFrom.GetXLC() > pTB->GetEndTagEndXLC() )
  2891. )
  2892. ||
  2893. eEditAction == xtpEditActInsert &&
  2894. posFrom.GetXLC() > pTB->GetEndTagBeginXLC() &&
  2895. posFrom.GetXLC() <= pTB->GetEndTagEndXLC();
  2896. if (bIsBlockEndIntersected)
  2897. {
  2898. nURes |= xtpEditUTBReparse;
  2899. // set empty
  2900. pTB->m_PosEndLC.nLine = 0;
  2901. pTB->m_PosEndLC.nCol = 0;
  2902. continue;
  2903. }
  2904. //-------------------------------------------------------------------
  2905. BOOL bIsBlockOutside = eEditAction == xtpEditActInsert &&
  2906. pTB->m_PosStartLC >= posFrom ||
  2907. eEditAction == xtpEditActDelete && pTB->m_PosStartLC >= posTo;
  2908. //-----------------------------
  2909. int nELine = eEditAction == xtpEditActInsert ? posTo.nLine : posFrom.nLine;
  2910. if (bIsBlockOutside && nLineDiff == 0 &&
  2911. pTB->m_PosStartLC.nLine != nELine &&
  2912. pTB->m_PosEndLC.nLine != nELine)
  2913. {
  2914. break;
  2915. }
  2916. //-------------------------------------------------------------------
  2917. if (bIsBlockOutside )
  2918. {
  2919. pTB->m_PosStartLC.nLine += nLineDiff;
  2920. pTB->m_PosEndLC.nLine += nLineDiff;
  2921. if (pTB->m_PosStartLC.nLine == nELine)
  2922. {
  2923. pTB->m_PosStartLC.nCol += nColDiff;
  2924. }
  2925. if (pTB->m_PosEndLC.nLine == nELine)
  2926. {
  2927. pTB->m_PosEndLC.nCol += nColDiff;
  2928. }
  2929. }
  2930. //-------------------------------------------------------------------
  2931. }
  2932. return nURes;
  2933. }
  2934. BOOL CXTPSyntaxEditLexTextSchema::LoadClassSchema(CXTPSyntaxEditLexClassInfoArray* arClassInfo)
  2935. {
  2936. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  2937. CSingleLock singleLock(GetDataLoker(), TRUE);
  2938. RemoveAll();
  2939. m_pClassSchema->RemoveAll();
  2940. int nCCount = (int)arClassInfo->GetSize();
  2941. for (int i = 0; i < nCCount; i++)
  2942. {
  2943. const XTP_EDIT_LEXCLASSINFO& infoClass = arClassInfo->GetAt(i);
  2944. CXTPSyntaxEditLexClassPtr ptrLexClass = m_pClassSchema->GetNewClass(FALSE);
  2945. if (!ptrLexClass)
  2946. {
  2947. return FALSE;
  2948. }
  2949. ptrLexClass->m_strClassName = infoClass.csClassName;
  2950. int nPCount = (int)infoClass.arPropertyDesc.GetSize();
  2951. for (int k = 0; k < nPCount; k++)
  2952. {
  2953. const XTP_EDIT_LEXPROPINFO& infoProp = infoClass.arPropertyDesc[k];
  2954. if (!ptrLexClass->SetProp(&infoProp))
  2955. {
  2956. ASSERT(FALSE);
  2957. }
  2958. }
  2959. m_pClassSchema->AddPreBuildClass(ptrLexClass);
  2960. #ifdef DBG_TRACE_LOAD_CLASS_SCH
  2961. {
  2962. BOOL bEmpty = ptrLexClass->IsEmpty() && ptrLexClass->m_Parent.eOpt != xtpEditOptParent_file;
  2963. LPCTSTR cszPref = bEmpty ? _T("* !EMPTY! (it is not used)* ") : _T("* ");
  2964. ptrLexClass->Dump(cszPref);
  2965. }
  2966. #endif
  2967. }
  2968. return TRUE;
  2969. //BOOL bRes = m_pClassSchema->Build();
  2970. //return bRes;
  2971. }
  2972. void CXTPSyntaxEditLexTextSchema::BuildIfNeed()
  2973. {
  2974. CSingleLock singleLockCls(GetClassSchLoker(), TRUE);
  2975. CSingleLock singleLock(GetDataLoker(), TRUE);
  2976. CXTPSyntaxEditLexClassPtrArray* ptrArCfile = m_pClassSchema->GetClasses(FALSE);
  2977. if (!ptrArCfile || ptrArCfile->GetSize() == 0)
  2978. {
  2979. m_pClassSchema->Build();
  2980. }
  2981. }
  2982. BOOL CXTPSyntaxEditLexTextSchema::IsFileExtSupported(const CString& strExt)
  2983. {
  2984. CXTPSyntaxEditLexClassPtr ptrTopCls = GetTopClassForFileExt(strExt);
  2985. return ptrTopCls != NULL;
  2986. }
  2987. CXTPSyntaxEditLexClass* CXTPSyntaxEditLexTextSchema::GetTopClassForFileExt(const CString& strExt)
  2988. {
  2989. CString strPropName = _T("IsExt=") + strExt;
  2990. CXTPSyntaxEditLexClassPtrArray arTopClasses;
  2991. CXTPSyntaxEditLexClassPtrArray* ptrArCfile = m_pClassSchema->GetClasses(TRUE);
  2992. int nCount = ptrArCfile ? (int)ptrArCfile->GetSize() : 0;
  2993. int i;
  2994. if (nCount == 0)
  2995. {
  2996. BOOL bUnused;
  2997. ptrArCfile = m_pClassSchema->GetChildrenFor(NULL, bUnused);
  2998. nCount = ptrArCfile ? (int)ptrArCfile->GetSize() : 0;
  2999. for (i = 0; i < nCount; i++)
  3000. {
  3001. CXTPSyntaxEditLexClassPtr ptrCfile = ptrArCfile->GetAt(i);
  3002. CXTPSyntaxEditLexClassPtr ptrCFnew = m_pClassSchema->GetNewClass(TRUE);
  3003. if (ptrCFnew)
  3004. {
  3005. ptrCFnew->CopyFrom(ptrCfile);
  3006. arTopClasses.AddPtr(ptrCFnew, TRUE);
  3007. }
  3008. }
  3009. SAFE_DELETE(ptrArCfile);
  3010. ptrArCfile = &arTopClasses;
  3011. }
  3012. nCount = ptrArCfile ? (int)ptrArCfile->GetSize() : 0;
  3013. for (i = 0; i < nCount; i++)
  3014. {
  3015. CXTPSyntaxEditLexClassPtr ptrCfile = ptrArCfile->GetAt(i);
  3016. CXTPSyntaxEditLexVariantPtr ptrRes = ptrCfile->PropV(strPropName);
  3017. if (!ptrRes || ptrRes->m_nObjType != xtpEditLVT_valInt)
  3018. {
  3019. ASSERT(FALSE);
  3020. continue;
  3021. }
  3022. if (ptrRes->m_nValue)
  3023. {
  3024. return ptrCfile.Detach();
  3025. }
  3026. }
  3027. return NULL;
  3028. }
  3029. CXTPSyntaxEditLexTextSchema* CXTPSyntaxEditLexParser::GetTextSchema()
  3030. {
  3031. return m_ptrTextSchema;
  3032. }
  3033. void CXTPSyntaxEditLexParser::SetTextSchema(CXTPSyntaxEditLexTextSchema* pTextSchema)
  3034. {
  3035. CSingleLock singLockMain(&m_csParserData);
  3036. CloseParseThread();
  3037. if (m_ptrTextSchema)
  3038. {
  3039. m_ptrTextSchema->RemoveAll();
  3040. }
  3041. m_SinkMT.UnadviseAll();
  3042. CMDTARGET_RELEASE(m_ptrTextSchema);
  3043. RemoveAllOptions();
  3044. if (pTextSchema)
  3045. {
  3046. pTextSchema->BuildIfNeed();
  3047. m_ptrTextSchema = pTextSchema->Clone();
  3048. CXTPNotifyConnection* ptrConn = m_ptrTextSchema ? m_ptrTextSchema->GetConnection() : NULL;
  3049. if (ptrConn)
  3050. {
  3051. m_SinkMT.Advise(ptrConn, xtpEditOnParserStarted,   &XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexParser::OnParseEvent_NotificationHandler);
  3052. m_SinkMT.Advise(ptrConn, xtpEditOnTextBlockParsed, &XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexParser::OnParseEvent_NotificationHandler);
  3053. m_SinkMT.Advise(ptrConn, xtpEditOnParserEnded,     &XTPSyntaxEditLexAnalyser::CXTPSyntaxEditLexParser::OnParseEvent_NotificationHandler);
  3054. }
  3055. }
  3056. #ifdef _DEBUG
  3057. AfxDump(XTPGetLexAutomatMemMan());
  3058. #endif
  3059. }
  3060. BOOL CXTPSyntaxEditLexParser::GetTokensForAutoCompleate(CXTPSyntaxEditLexTokensDefArray& rArTokens,
  3061.   BOOL bAppend)
  3062. {
  3063. CSingleLock singLockMain(&m_csParserData);
  3064. if (!bAppend)
  3065. {
  3066. rArTokens.RemoveAll();
  3067. }
  3068. CXTPSyntaxEditLexTextSchema* ptrTxtSch = GetTextSchema();
  3069. CXTPSyntaxEditLexClassSchema* ptrClsSch = ptrTxtSch ? ptrTxtSch->GetClassSchema() : NULL;
  3070. CXTPSyntaxEditLexClassPtrArray* ptrArCls = ptrClsSch ? ptrClsSch->GetPreBuildClasses() : NULL;
  3071. if (!ptrArCls)
  3072. {
  3073. return FALSE;
  3074. }
  3075. //--------------------------------------------------
  3076. int nCCount = (int)ptrArCls->GetSize();
  3077. for (int i = 0; i < nCCount; i++)
  3078. {
  3079. CXTPSyntaxEditLexTokensDef tmpTkDef;
  3080. CXTPSyntaxEditLexClassPtr ptrCls = ptrArCls->GetAt(i);
  3081. CXTPSyntaxEditLexVariantPtr ptrTags = ptrCls->PropV(_T("token:tag"));
  3082. if (!ptrTags)
  3083. {
  3084. continue;
  3085. }
  3086. GetStrsFromLVArray(ptrTags, tmpTkDef.m_arTokens);
  3087. //--------------------
  3088. CXTPSyntaxEditLexVariantPtr ptrSartSeps = ptrCls->PropV(_T("token:start:separators"));
  3089. CXTPSyntaxEditLexVariantPtr ptrEndSeps = ptrCls->PropV(_T("token:end:separators"));
  3090. if (ptrSartSeps)
  3091. {
  3092. GetStrsFromLVArray(ptrSartSeps, tmpTkDef.m_arStartSeps);
  3093. }
  3094. if (ptrEndSeps)
  3095. {
  3096. GetStrsFromLVArray(ptrEndSeps, tmpTkDef.m_arEndSeps);
  3097. }
  3098. //=================
  3099. rArTokens.Add(tmpTkDef);
  3100. }
  3101. return TRUE;
  3102. }
  3103. void CXTPSyntaxEditLexParser::GetStrsFromLVArray(CXTPSyntaxEditLexVariant* pLVArray,
  3104.   CStringArray& rArStrs) const
  3105. {
  3106. if (!pLVArray || pLVArray->m_nObjType != xtpEditLVT_LVArrayPtr ||
  3107. !pLVArray->m_ptrLVArrayPtr)
  3108. {
  3109. ASSERT(FALSE);
  3110. return;
  3111. }
  3112. int nCount = (int)pLVArray->m_ptrLVArrayPtr->GetSize();
  3113. for (int i = 0; i < nCount; i++)
  3114. {
  3115. CXTPSyntaxEditLexVariantPtr ptrLVVal = pLVArray->m_ptrLVArrayPtr->GetAt(i);
  3116. ASSERT(ptrLVVal);
  3117. if (ptrLVVal && ptrLVVal->m_nObjType == xtpEditLVT_valStr)
  3118. {
  3119. for (int k = 0; k < ptrLVVal->m_arStrVals.GetSize(); k++)
  3120. {
  3121. CString strVal = ptrLVVal->m_arStrVals[k];
  3122. ASSERT(strVal.GetLength());
  3123. if (strVal.GetLength())
  3124. {
  3125. rArStrs.Add(strVal);
  3126. }
  3127. }
  3128. }
  3129. }
  3130. }
  3131. ////////////////////////////////////////////////////////////////////////////
  3132. CXTPSyntaxEditLexParser::CXTPSyntaxEditParseThreadParams* CXTPSyntaxEditLexParser::GetParseInThreadParams()
  3133. {
  3134. return &m_PThreadParams;
  3135. }
  3136. void CXTPSyntaxEditLexParser::StartParseInThread(CXTPSyntaxEditBufferManager* pBuffer,
  3137. const XTP_EDIT_LINECOL* pLCStart, const XTP_EDIT_LINECOL* pLCEnd,
  3138. int eEdinAction, BOOL bRunWithoutWait)
  3139. {
  3140. UNREFERENCED_PARAMETER(eEdinAction);
  3141. DBG_TRACE_TIME(1, _T("### ### ### StartParseInThread time = "));
  3142. CSingleLock singLockMain(&m_csParserData);
  3143. if (!m_ptrTextSchema)
  3144. {
  3145. return;
  3146. }
  3147. CSingleLock singLockPrm(&m_PThreadParams.lockThreadParams);
  3148. //if (IsCSLocked(m_PThreadParams.lockThreadParams)) {
  3149. if (IsMutexLocked(&m_PThreadParams.lockThreadParams))
  3150. {
  3151. DBG_TRACE_PARSE_START_STOP(_T("- Parser set BREAK Event. n"));
  3152. VERIFY( m_ptrTextSchema->GetBreakParsingEvent()->SetEvent() );
  3153. }
  3154. if (!singLockPrm.Lock())
  3155. {
  3156. ASSERT(FALSE);
  3157. return;
  3158. }
  3159. m_PThreadParams.ptrBuffer = pBuffer;
  3160. CXTPSyntaxEditTextRegion invZone;
  3161. if (pLCStart && !pLCEnd && pLCStart->GetXLC() == XTP_EDIT_XLC(1, 0) )
  3162. {
  3163. invZone.Set(pLCStart, pLCEnd);
  3164. m_PThreadParams.arInvalidZones.RemoveAll();
  3165. m_PThreadParams.AddParseZone(invZone);
  3166. }
  3167. else if (pLCStart || pLCEnd)
  3168. {
  3169. invZone.Set(pLCStart, pLCEnd);
  3170. m_PThreadParams.AddParseZone(invZone);
  3171. }
  3172. if (!m_pParseThread)
  3173. {// create thread
  3174. m_pParseThread = AfxBeginThread(ThreadParseProc, this, m_nParseThreadPriority);
  3175. if (!m_pParseThread)
  3176. {
  3177. ASSERT(FALSE);
  3178. return;
  3179. }
  3180. }
  3181. if (!SetParseThreadPriority(m_nParseThreadPriority))
  3182. {
  3183. // try to start a new thread
  3184. StartParseInThread(pBuffer, pLCStart, pLCEnd, eEdinAction, bRunWithoutWait);
  3185. }
  3186. CString sDBGpos = DBG_TraceIZone(pLCStart, pLCEnd);
  3187. DBG_TRACE_PARSE_START_STOP(_T("- Parser set START Event. Add invalid Zone [ %s ] n"), (LPCTSTR)sDBGpos);
  3188. if (bRunWithoutWait)
  3189. {
  3190. VERIFY( m_PThreadParams.evRunWithoutWait.SetEvent() );
  3191. }
  3192. VERIFY( m_PThreadParams.evParseRun.SetEvent() );
  3193. }
  3194. void CXTPSyntaxEditLexParser::StopParseInThread()
  3195. {
  3196. DBG_TRACE_TIME(1, _T("### ### ### STOP Parse In Thread time = "));
  3197. CSingleLock singLockMain(&m_csParserData);
  3198. if (!m_ptrTextSchema)
  3199. {
  3200. return;
  3201. }
  3202. CSingleLock singLockPrm(&m_PThreadParams.lockThreadParams);
  3203. CEvent* pBreakEvent = m_ptrTextSchema->GetBreakParsingEvent();
  3204. ASSERT(pBreakEvent);
  3205. if (!pBreakEvent)
  3206. return;
  3207. if (IsMutexLocked(&m_PThreadParams.lockThreadParams))
  3208. {
  3209. VERIFY( pBreakEvent->SetEvent() );
  3210. DBG_TRACE_PARSE_START_STOP(_T("- STOP Parser set BREAK Event. n"));
  3211. }
  3212. if (!singLockPrm.Lock())
  3213. {
  3214. ASSERT(FALSE);
  3215. return;
  3216. }
  3217. if (IsEventSet(*pBreakEvent))
  3218. {
  3219. VERIFY( pBreakEvent->ResetEvent() );
  3220. DBG_TRACE_PARSE_START_STOP(_T("- STOP Parser REset BREAK Event. n"));
  3221. }
  3222. DBG_TRACE_PARSE_START_STOP(_T("- STOP Parser finished. n"));
  3223. }
  3224. int CXTPSyntaxEditLexParser::GetParseThreadPriority()
  3225. {
  3226. try
  3227. {
  3228. if (m_pParseThread)
  3229. {
  3230. int nPriority = m_pParseThread->GetThreadPriority();
  3231. return nPriority;
  3232. }
  3233. }
  3234. catch (...)
  3235. {
  3236. m_pParseThread = NULL;
  3237. TRACE(_T("ERROR! Parse Thread is not exist. n"));
  3238. };
  3239. return m_nParseThreadPriority;
  3240. }
  3241. BOOL CXTPSyntaxEditLexParser::SetParseThreadPriority(int nPriority)
  3242. {
  3243. m_nParseThreadPriority = nPriority;
  3244. try
  3245. {
  3246. if (m_pParseThread)
  3247. {
  3248. if (m_nParseThreadPriority != m_pParseThread->GetThreadPriority())
  3249. {
  3250. m_pParseThread->SetThreadPriority(m_nParseThreadPriority);
  3251. }
  3252. }
  3253. }
  3254. catch (...)
  3255. {
  3256. TRACE(_T("ERROR! Parse Thread is not exist. n"));
  3257. m_pParseThread = NULL;
  3258. return FALSE;
  3259. }
  3260. return TRUE;
  3261. }
  3262. void CXTPSyntaxEditLexParser::OnBeforeEditChanged()
  3263. {
  3264. //CSingleLock singLockMain(&m_csParserData);
  3265. StopParseInThread();
  3266. }
  3267. void CXTPSyntaxEditLexParser::OnEditChanged(const XTP_EDIT_LINECOL& posFrom,
  3268.   const XTP_EDIT_LINECOL& posTo, int eEditAction,
  3269.   CXTPSyntaxEditBufferManager* pBuffer)
  3270. {
  3271. DBG_TRACE_TIME(1, _T("### ### ### OnEditChanged time = "));
  3272. CSingleLock singLockMain(&m_csParserData);
  3273. if (!m_ptrTextSchema)
  3274. {
  3275. return;
  3276. }
  3277. if (!pBuffer)
  3278. {
  3279. ASSERT(FALSE);
  3280. return;
  3281. }
  3282. m_ptrTextSchema->UpdateTextBlocks(posFrom, posTo, eEditAction);
  3283. BOOL bThreadParse = GetSchemaOptions(pBuffer->GetFileExt())->m_bEditReparceInSeparateThread;
  3284. if (bThreadParse)
  3285. {
  3286. StartParseInThread(pBuffer, &posFrom, &posTo, eEditAction, FALSE);
  3287. }
  3288. else
  3289. {
  3290. CXTPSyntaxEditTextIterator txtIter(pBuffer);
  3291. m_ptrTextSchema->RunParseUpdate(TRUE, &txtIter, &posFrom, &posTo);
  3292. }
  3293. }
  3294. void CXTPSyntaxEditLexParser::OnParseEvent_NotificationHandler(XTP_NOTIFY_CODE Event,
  3295.  WPARAM wParam, LPARAM lParam)
  3296. {
  3297. if (Event == xtpEditOnTextBlockParsed)
  3298. {
  3299. CXTPSyntaxEditLexTextBlockPtr ptrTBended;
  3300. CXTPSyntaxEditLexTextSchema* ptrTextSch = GetTextSchema();
  3301. ptrTBended = ptrTextSch ? ptrTextSch->GetLastParsedBlock(wParam) : NULL;
  3302. if (ptrTBended)
  3303. {
  3304. m_pConnect->SendEvent(Event, (WPARAM)(CXTPSyntaxEditLexTextBlock*)ptrTBended, 0);
  3305. }
  3306. }
  3307. else
  3308. {
  3309. m_pConnect->SendEvent(Event, wParam, lParam);
  3310. }
  3311. }
  3312. UINT CXTPSyntaxEditLexParser::ThreadParseProc(LPVOID pParentParser)
  3313. {
  3314. DBG_TRACE_PARSE_START_STOP(_T("*** Parser Thread is started. %08xn"), ::GetCurrentThreadId());
  3315. if (!pParentParser)
  3316. {
  3317. ASSERT(FALSE);
  3318. return 111;
  3319. }
  3320. //  try
  3321. {
  3322. CXTPSyntaxEditLexParserPtr ptrParser((CXTPSyntaxEditLexParser*)pParentParser, TRUE);
  3323. CXTPSyntaxEditLexParser::CXTPSyntaxEditParseThreadParams* pPRMs = NULL;
  3324. pPRMs = ptrParser->GetParseInThreadParams();
  3325. if (!pPRMs)
  3326. {
  3327. ASSERT(FALSE);
  3328. return 222;
  3329. }
  3330. CSingleLock lockPRMs(&pPRMs->lockThreadParams, TRUE);
  3331. HANDLE arWaiters[] = {pPRMs->evParseRun, pPRMs->evExitThread};
  3332. HANDLE hRunWithoutWait = pPRMs->evRunWithoutWait;
  3333. DWORD dwSelfCloseTimeout_ms = ptrParser->GetSchemaOptions(
  3334. pPRMs->ptrBuffer->GetFileExt())->m_dwParserThreadIdleLifeTime_ms;
  3335. DWORD dwWaitFilter_ms = ptrParser->GetSchemaOptions(
  3336. pPRMs->ptrBuffer->GetFileExt())->m_dwEditReparceTimeout_ms;
  3337. lockPRMs.Unlock();
  3338. DWORD dwWaitRes = 0;
  3339. do
  3340. {
  3341. dwWaitRes = WaitForMultipleObjects(2, arWaiters, FALSE, dwSelfCloseTimeout_ms);
  3342. if (dwWaitRes == WAIT_TIMEOUT)
  3343. {
  3344. CSingleLock lockPRMs1(&pPRMs->lockThreadParams, TRUE);
  3345. if (pPRMs->arInvalidZones.GetSize() == 0)
  3346. {
  3347. ptrParser->SelfCloseParseThread();
  3348. return 1;
  3349. }
  3350. else
  3351. {
  3352. continue;
  3353. }
  3354. }
  3355. //=== Wait Filter === (for keyboard input)
  3356. if (dwWaitRes == WAIT_OBJECT_0 && !IsEventSet(hRunWithoutWait))
  3357. {
  3358. do {
  3359. dwWaitRes = WaitForMultipleObjects(2, arWaiters, FALSE, dwWaitFilter_ms);
  3360. }
  3361. while (dwWaitRes == WAIT_OBJECT_0 && !IsEventSet(hRunWithoutWait));
  3362. if (dwWaitRes == WAIT_TIMEOUT)
  3363. {
  3364. dwWaitRes = WAIT_OBJECT_0;
  3365. }
  3366. }
  3367. //=== Wait Filter === (for keyboard input)
  3368. if (dwWaitRes == WAIT_OBJECT_0)
  3369. {
  3370. //***
  3371. CSingleLock lockPRMs2(&pPRMs->lockThreadParams, TRUE);
  3372. //***
  3373. // Update Options
  3374. dwSelfCloseTimeout_ms = ptrParser->GetSchemaOptions(
  3375. pPRMs->ptrBuffer->GetFileExt())->m_dwParserThreadIdleLifeTime_ms;
  3376. dwWaitFilter_ms = ptrParser->GetSchemaOptions(
  3377. pPRMs->ptrBuffer->GetFileExt())->m_dwEditReparceTimeout_ms;
  3378. // END Update Options
  3379. CXTPSyntaxEditTextIterator txtIter(pPRMs->ptrBuffer);
  3380. CXTPSyntaxEditLexTextSchema* ptrTextSch = ptrParser->GetTextSchema();
  3381. if (!ptrTextSch)
  3382. {
  3383. continue;
  3384. }
  3385. CEvent* pBreakEvent = ptrTextSch->GetBreakParsingEvent();
  3386. ASSERT(pBreakEvent);
  3387. int nZonesCount = 0;
  3388. BOOL bParseRestedBlock = FALSE;
  3389. BOOL bBreaked = FALSE;
  3390. do
  3391. {
  3392. if (IsEventSet(*pBreakEvent))
  3393. {
  3394. VERIFY( pBreakEvent->ResetEvent() );
  3395. DBG_TRACE_PARSE_START_STOP(_T("* Parser Start BREAKED. n"));
  3396. break;
  3397. }
  3398. XTP_EDIT_LINECOL* pLCStart = NULL;
  3399. XTP_EDIT_LINECOL* pLCEnd = NULL;
  3400. CXTPSyntaxEditTextRegion iZone;
  3401. nZonesCount = (int)pPRMs->arInvalidZones.GetSize();
  3402. //bParseRestedBlock = FALSE; //nZonesCount > 0;
  3403. if (nZonesCount)
  3404. {
  3405. iZone = pPRMs->arInvalidZones[nZonesCount-1];
  3406. if (iZone.m_posStart.IsValidData())
  3407. {
  3408. pLCStart = &iZone.m_posStart;
  3409. }
  3410. if (iZone.m_posEnd.IsValidData())
  3411. {
  3412. pLCEnd = &iZone.m_posEnd;
  3413. }
  3414. }
  3415. CString sDBGpos = DBG_TraceIZone(pLCStart, pLCEnd);
  3416. DBG_TRACE_PARSE_START_STOP(_T("* Parser Started. Invalid Zone [%s] n"), sDBGpos);
  3417. // run parser
  3418. /*DEBUG*/ DWORD dwTime0 = GetTickCount();   //DEBUG
  3419. int nParseRes = ptrTextSch->RunParseUpdate(TRUE, &txtIter,
  3420. pLCStart, pLCEnd, TRUE);
  3421. if (nParseRes & xtpEditLPR_Error)
  3422. {
  3423. //ASSERT(FALSE);
  3424. //::MessageBeep((UINT)-1);
  3425. TRACE(_T("Lex Parser ERROR! Try Full reparse. n"));
  3426. ptrTextSch->RemoveAll();
  3427. XTP_EDIT_LINECOL posLC1 = {1,0};
  3428. txtIter.SeekBegin();
  3429. nParseRes = ptrTextSch->RunParseUpdate(TRUE, &txtIter,
  3430. &posLC1, NULL);
  3431. pPRMs->arInvalidZones.RemoveAll();
  3432. nZonesCount = 0;
  3433. if (nParseRes & xtpEditLPR_RunFinished)
  3434. {
  3435. TRACE(_T("Full reparse - (OK) <F I N I S H E D>  n"));
  3436. }
  3437. else if (nParseRes & xtpEditLPR_RunBreaked)
  3438. {
  3439. TRACE(_T("Full reparse - BREAKED  n"));
  3440. iZone.Set(NULL, NULL);
  3441. pPRMs->arInvalidZones.Add(iZone);
  3442. }
  3443. else if (nParseRes & xtpEditLPR_Error)
  3444. {
  3445. TRACE(_T("Full reparse - ERROR  n"));
  3446. }
  3447. nZonesCount = (int)pPRMs->arInvalidZones.GetSize();
  3448. }
  3449. /*DEBUG*/ DWORD dwTime1 = GetTickCount();//DEBUG
  3450. bBreaked = (nParseRes & xtpEditLPR_RunFinished) == 0 ||
  3451. (nParseRes & (xtpEditLPR_RunBreaked|xtpEditLPR_Error)) > 0 ||
  3452. IsEventSet(*pBreakEvent);
  3453. VERIFY( pBreakEvent->ResetEvent() );
  3454. CXTPSyntaxEditTextRegion zoneValid = ptrTextSch->GetUpdatedTextRegion();
  3455. if ((nParseRes&xtpEditLPR_RunFinished) && nZonesCount)
  3456. {
  3457. pPRMs->arInvalidZones.RemoveAt(nZonesCount-1);
  3458. nZonesCount--;  //pPRMs->UpdateZones(zoneValid);
  3459. }
  3460. //DEBUG
  3461. {
  3462. CString sDBGzone = DBG_TraceIZone(&zoneValid.m_posStart, &zoneValid.m_posEnd);
  3463. //TRACE(_T("- Parser set START Event. Add invalid Zone [ %s ] n"), sDBGpos);
  3464. DBG_TRACE_PARSE_START_STOP(_T("* Parser Ended. (result=%x) %s%s%s (%.3f sec) VALID Zone[ %s ] n"),
  3465. nParseRes,
  3466. (nParseRes&xtpEditLPR_RunBreaked) ? _T(" BREAKED ") : _T(""),
  3467. (nParseRes&xtpEditLPR_Error) ? _T(" ERROR ") : _T(""),
  3468. (nParseRes&xtpEditLPR_RunFinished) ? _T(" <F I N I S H E D> ") : _T(""),
  3469. labs(dwTime1-dwTime0)/1000.0, (LPCTSTR)sDBGzone);
  3470. }
  3471. }
  3472. while ((bParseRestedBlock || nZonesCount) && !bBreaked);
  3473. }
  3474. }
  3475. while (dwWaitRes != WAIT_OBJECT_0+1);
  3476. }
  3477. //  catch(...) {
  3478. //      TRACE(_T("* EXCEPTION!!! CXTPSyntaxEditLexParser::ThreadParseProc(2)n"));
  3479. //      return 333;
  3480. //  }
  3481. DBG_TRACE_PARSE_START_STOP(_T("*** Parser Thread is Ended. (%x)n"), ::GetCurrentThreadId());
  3482. return 0;
  3483. }
  3484. #ifdef _DEBUG
  3485. void CXTPSyntaxEditLexTextBlock::Dump( CDumpContext& dc ) const
  3486. {
  3487. CObject::Dump( dc );
  3488. // Now do the stuff for our specific class.
  3489. dc << "t <<TB>>";
  3490. dc << " (ref=" << m_dwRef << ") n";
  3491. dc << "t start(" << m_PosStartLC.nLine << ", " << m_PosStartLC.nCol << ") ";
  3492. dc << "t end(" << m_PosEndLC.nLine << ", " << m_PosEndLC.nCol << ") n";
  3493. #if _MSC_VER >= 1300
  3494. dc << "t Parent="; dc.DumpAsHex((INT_PTR)(CXTPSyntaxEditLexTextBlock*)m_ptrParent);
  3495. dc << ", Prev=";    dc.DumpAsHex((INT_PTR)(CXTPSyntaxEditLexTextBlock*)m_ptrPrev);
  3496. dc << ", Next=";    dc.DumpAsHex((INT_PTR)(CXTPSyntaxEditLexTextBlock*)m_ptrNext);
  3497. dc << ", LastChild=";   dc.DumpAsHex((INT_PTR)(CXTPSyntaxEditLexTextBlock*)m_ptrLastChild);
  3498. #endif
  3499. }
  3500. #endif
  3501. BOOL CXTPSyntaxEditLexTextSchema::RunParseOnScreen(CTextIter* pTxtIter,
  3502. int nRowStart, int nRowEnd,
  3503. CXTPSyntaxEditLexTextBlockPtr& rPtrScreenSchFirstTB
  3504. )
  3505. {
  3506. if (!pTxtIter || nRowStart <= 0 || nRowEnd <= 0)
  3507. {
  3508. ASSERT(FALSE);
  3509. return FALSE;
  3510. }
  3511. CSingleLock singleLock(GetDataLoker());
  3512. if (!singleLock.Lock(30))
  3513. {
  3514. TRACE(_T("Cannot enter critical section. CXTPSyntaxEditLexTextSchema::RunParseOnScreen() n"));
  3515. return FALSE;
  3516. }
  3517. //---------------------------------------------------------------------------
  3518. //** (1) ** -------------------------
  3519. CXTPSyntaxEditLexTextBlockPtr ptrTBParentToRun;
  3520. BOOL bInit = InitScreenSch(pTxtIter, nRowStart, nRowEnd, rPtrScreenSchFirstTB,
  3521. ptrTBParentToRun);
  3522. if (!bInit)
  3523. {
  3524. //TRACE(_T("- parser::InitScreenSch return FALSE res.n"));
  3525. return FALSE;
  3526. }
  3527. XTP_EDIT_LINECOL startLC = {nRowStart, 0};
  3528. if (!pTxtIter->SeekPos(startLC))
  3529. {
  3530. return FALSE;
  3531. }
  3532. int nParseRes = 0;
  3533. CXTPSyntaxEditLexOnScreenParseCnt runCnt;
  3534. runCnt.m_nRowStart  = nRowStart;
  3535. runCnt.m_nRowEnd    = nRowEnd;
  3536. runCnt.m_ptrTBLast  = ptrTBParentToRun;
  3537. //** (2) ** -------------------------
  3538. CXTPSyntaxEditLexClassPtrArray* ptrArClasses = m_pClassSchema->GetClasses(FALSE);
  3539. int nCCount = ptrArClasses ? (int)ptrArClasses->GetSize() : 0;
  3540. BOOL bRunEOF = TRUE;
  3541. XTP_EDIT_LINECOL lcTextPos = {0,0};
  3542. while (!pTxtIter->IsEOF() && nCCount && bRunEOF)
  3543. {
  3544. bRunEOF = !pTxtIter->IsEOF();
  3545. nParseRes = Run_OnScreenTBStack(pTxtIter, ptrTBParentToRun, &runCnt);
  3546. if (nParseRes & (xtpEditLPR_Error|xtpEditLPR_RunBreaked)) // |xtpEditLPR_RunFinished))
  3547. {
  3548. TRACE(_T("- parser::RunParseOnScreen return by erroe or BREAK. n"));
  3549. return !(nParseRes&xtpEditLPR_Error);
  3550. }
  3551. //** -------------------------------------------------------------
  3552. if (!pTxtIter->IsEOF() && !(nParseRes & xtpEditLPR_Iterated))
  3553. {
  3554. SeekNextEx(pTxtIter, ptrTBParentToRun->m_ptrLexClass, &runCnt);
  3555. }
  3556. //---------------------------------------------------------------------------
  3557. lcTextPos = pTxtIter->GetPosLC();
  3558. if (lcTextPos.nLine > runCnt.m_nRowEnd)
  3559. {
  3560. break;
  3561. }
  3562. //---------------------------------------------------------------------------
  3563. if (ptrTBParentToRun->m_ptrParent)
  3564. {
  3565. ptrTBParentToRun = ptrTBParentToRun->m_ptrParent;
  3566. }
  3567. }
  3568. return TRUE;
  3569. }
  3570. CXTPSyntaxEditLexTextBlockPtr CXTPSyntaxEditLexTextSchema::InitScreenSch_RunTopClass(CTextIter* pTxtIter)
  3571. {
  3572. CXTPSyntaxEditLexTextBlockPtr ptrTBtop;
  3573. CXTPSyntaxEditLexClassPtrArray* ptrClsAr = m_pClassSchema->GetClasses(FALSE);
  3574. int nCount = ptrClsAr ? (int)ptrClsAr->GetSize() : 0;
  3575. for (int i = 0; i < nCount; i++)
  3576. {
  3577. CXTPSyntaxEditLexClassPtr ptrC = ptrClsAr->GetAt(i);
  3578. if (!ptrC)
  3579. {
  3580. ASSERT(FALSE);
  3581. continue;
  3582. }
  3583. ASSERT(ptrTBtop == NULL);
  3584. int nParseRes = ptrC->RunParse(pTxtIter, this, ptrTBtop);
  3585. if ((nParseRes & xtpEditLPR_StartFound) && ptrTBtop)
  3586. {
  3587. return ptrTBtop;
  3588. }
  3589. }
  3590. return NULL;
  3591. }
  3592. BOOL CXTPSyntaxEditLexTextSchema::InitScreenSch(CTextIter* pTxtIter, int nRowStart, int nRowEnd,
  3593.  CXTPSyntaxEditLexTextBlockPtr& rPtrScreenSchFirstTB,
  3594. CXTPSyntaxEditLexTextBlockPtr& rPtrTBParentToRun)
  3595. {
  3596. CXTPSyntaxEditLexTextBlockPtr ptrTBstart = GetBlocks();
  3597. // process first screen parse in the main thread
  3598. if (nRowStart == 1 && !ptrTBstart)
  3599. {
  3600. rPtrTBParentToRun = rPtrScreenSchFirstTB = InitScreenSch_RunTopClass(pTxtIter);
  3601. return (rPtrTBParentToRun != NULL);
  3602. }
  3603. CXTPSyntaxEditLexTextBlock* pLastSchBlock = GetLastSchBlock(FALSE);
  3604. if (m_ptrNewChainTB2 && pLastSchBlock &&
  3605. (pLastSchBlock->m_PosEndLC.IsValidData() && nRowStart > pLastSchBlock->m_PosEndLC.nLine ||
  3606. !pLastSchBlock->m_PosEndLC.IsValidData() && nRowStart > pLastSchBlock->m_PosStartLC.nLine)
  3607.   )
  3608. {
  3609. return FALSE;
  3610. }
  3611. //=======================================================================
  3612. CXTPSyntaxEditLexTextBlock* pTBLast = NULL;
  3613. XTP_EDIT_LINECOL lcStart = {nRowStart, 0};
  3614. // (1) ---
  3615. CXTPSyntaxEditLexTextBlock* pTB;
  3616. for (pTB = ptrTBstart; pTB; pTB = pTB->m_ptrNext)
  3617. {
  3618. if (pTB->m_PosStartLC < lcStart &&
  3619. pTB->GetPosEndLC() >= lcStart ||
  3620. pTB == ptrTBstart )
  3621. {
  3622. pTBLast = pTB;
  3623. }
  3624. if (pTB->m_PosStartLC.nLine > nRowEnd)
  3625. {
  3626. break;
  3627. }
  3628. }
  3629. // (2) ---
  3630. CXTPSyntaxEditLexTextBlockPtr ptrTBCopyNext;
  3631. for (pTB = pTBLast; pTB; pTB = pTB->m_ptrParent)
  3632. {
  3633. CXTPSyntaxEditLexTextBlockPtr ptrTBCopy = CopyShortTBtoFull(pTB);
  3634. if (!ptrTBCopy)
  3635. {
  3636. return FALSE;
  3637. }
  3638. if (pTB == pTBLast)
  3639. {
  3640. rPtrTBParentToRun = ptrTBCopy;
  3641. if (pTB->m_PosStartLC.nLine <= nRowStart &&
  3642. pTB->m_PosEndLC.nLine >= nRowStart ||
  3643. pTB == ptrTBstart)
  3644. {
  3645. pTBLast = pTB;
  3646. }
  3647. }
  3648. else
  3649. {
  3650. ptrTBCopy->m_ptrNext = ptrTBCopyNext;
  3651. ptrTBCopyNext->m_ptrPrev = ptrTBCopy;
  3652. ptrTBCopyNext->m_ptrParent = ptrTBCopy;
  3653. }
  3654. rPtrScreenSchFirstTB = ptrTBCopy;
  3655. ptrTBCopyNext = ptrTBCopy;
  3656. }
  3657. return (rPtrTBParentToRun != NULL);
  3658. }
  3659. CXTPSyntaxEditLexTextBlock* CXTPSyntaxEditLexTextSchema::CopyShortTBtoFull(CXTPSyntaxEditLexTextBlock* pTB)
  3660. {
  3661. CXTPSyntaxEditLexTextBlockPtr ptrCopyTB = GetNewBlock();
  3662. if (!ptrCopyTB || !pTB || !pTB->m_ptrLexClass)
  3663. {
  3664. ASSERT(pTB && pTB->m_ptrLexClass);
  3665. return NULL;
  3666. }
  3667. ptrCopyTB->m_PosStartLC = pTB->m_PosStartLC;
  3668. ptrCopyTB->m_PosEndLC = pTB->m_PosEndLC;
  3669. int nClassID = pTB->m_ptrLexClass->GetAttribute_int(XTPLEX_ATTRCLASSID, FALSE, -1);
  3670. ASSERT(nClassID > 0);
  3671. CXTPSyntaxEditLexClassPtrArray* ptrTopClassesAr = m_pClassSchema->GetClasses(FALSE);
  3672. ptrCopyTB->m_ptrLexClass = FindLexClassByID(ptrTopClassesAr, nClassID);
  3673. if (!ptrCopyTB->m_ptrLexClass)
  3674. {
  3675. ASSERT(FALSE);
  3676. return NULL;
  3677. }
  3678. return ptrCopyTB.Detach();
  3679. }
  3680. CXTPSyntaxEditLexClass* CXTPSyntaxEditLexTextSchema::FindLexClassByID(CXTPSyntaxEditLexClassPtrArray* pClassesAr, int nClassID)
  3681. {
  3682. if (!pClassesAr)
  3683. {
  3684. return NULL;
  3685. }
  3686. int nCount = (int)pClassesAr->GetSize();
  3687. for (int i = 0; i < nCount; i++)
  3688. {
  3689. CXTPSyntaxEditLexClass* pC = pClassesAr->GetAt(i, FALSE);
  3690. int nC_ID = pC->GetAttribute_int(XTPLEX_ATTRCLASSID, FALSE);
  3691. if (nC_ID == nClassID)
  3692. {
  3693. pC->InternalAddRef();
  3694. return pC;
  3695. }
  3696. //-------------------------------------------------------
  3697. CXTPSyntaxEditLexClass* pCF2 = FindLexClassByID(pC->GetChildren(), nClassID);
  3698. if (pCF2)
  3699. {
  3700. return pCF2;
  3701. }
  3702. pCF2 = FindLexClassByID(pC->GetChildrenDyn(), nClassID);
  3703. if (pCF2)
  3704. {
  3705. return pCF2;
  3706. }
  3707. }
  3708. return NULL;
  3709. }
  3710. int CXTPSyntaxEditLexTextSchema::Run_OnScreenTBStack(CTextIter* pTxtIter,
  3711. CXTPSyntaxEditLexTextBlock* pTBParentToRun,
  3712. CXTPSyntaxEditLexOnScreenParseCnt* pRunCnt)
  3713. {
  3714. if (!pTBParentToRun || !pTBParentToRun->m_ptrLexClass || !pRunCnt)
  3715. {
  3716. ASSERT(FALSE);
  3717. return xtpEditLPR_Error;
  3718. }
  3719. CXTPSyntaxEditLexTextBlockPtr ptrTBParentToRun(pTBParentToRun, TRUE);
  3720. CXTPSyntaxEditLexClassPtr ptrRunClass = pTBParentToRun->m_ptrLexClass;
  3721. int nPres = 0;
  3722. BOOL bIterated = FALSE;
  3723. BOOL bEnded = FALSE;
  3724. BOOL bRunEOF = TRUE;
  3725. XTP_EDIT_LINECOL lcTextPos = {0,0};
  3726. //** 1 **// Run existing block with children until block end
  3727. while (!bEnded && (bRunEOF || !pTxtIter->IsEOF()) )
  3728. {
  3729. bRunEOF = !pTxtIter->IsEOF();
  3730. BOOL bSkipIterate = FALSE;
  3731. nPres = ptrRunClass->RunParse(pTxtIter, this, ptrTBParentToRun, pRunCnt);
  3732. if (nPres & (xtpEditLPR_Error|xtpEditLPR_RunBreaked)) //|xtpEditLPR_RunFinished))
  3733. {
  3734. return nPres;
  3735. }
  3736. //---------------------------------------------------------------------------
  3737. if (nPres & xtpEditLPR_Iterated)
  3738. {
  3739. bSkipIterate = TRUE;
  3740. bIterated = TRUE;
  3741. }
  3742. //---------------------------------------------------------------------------
  3743. bEnded = (nPres & xtpEditLPR_EndFound) != 0;
  3744. if (bEnded)
  3745. {
  3746. CSingleLock singleLock(GetDataLoker(), TRUE);
  3747. ptrTBParentToRun->EndChildren(); //this);
  3748. DBG_TRACE_PARSE_RUN_BLOCKS(_T("(%08x) ENDED startPos=(%d,%d) endPos=(%d,%d), [%s] {%d}-noEndedStack n"),
  3749. (CXTPSyntaxEditLexTextBlock*)ptrTBParentToRun,
  3750. ptrTBParentToRun->m_PosStartLC.nLine, ptrTBParentToRun->m_PosStartLC.nCol, ptrTBParentToRun->m_PosEndLC.nLine,
  3751. ptrTBParentToRun->m_PosEndLC.nCol, ptrTBParentToRun->m_ptrLexClass->m_strClassName, m_nNoEndedClassesCount);
  3752. }
  3753. //---------------------------------------------------------------------------
  3754. if (!bEnded && !bSkipIterate)
  3755. {
  3756. SeekNextEx(pTxtIter, ptrRunClass, pRunCnt);
  3757. }
  3758. //---------------------------------------------------------------------------
  3759. lcTextPos = pTxtIter->GetPosLC();
  3760. if (lcTextPos.nLine > pRunCnt->m_nRowEnd)
  3761. {
  3762. break;
  3763. }
  3764. }
  3765. // ** end run existing ** //
  3766. if (!bEnded)
  3767. {
  3768. ptrTBParentToRun->m_PosEndLC = pTxtIter->GetPosLC();
  3769. ptrTBParentToRun->EndChildren(); //this);
  3770. return xtpEditLPR_RunFinished;
  3771. }
  3772. //===========================================================================
  3773. return (bIterated ? xtpEditLPR_Iterated : 0) | (pTxtIter->IsEOF() ? xtpEditLPR_RunFinished : 0);
  3774. }
  3775. CXTPSyntaxEditLexParserSchemaOptions::CXTPSyntaxEditLexParserSchemaOptions()
  3776. {
  3777. m_bFirstParseInSeparateThread           = TRUE;
  3778. m_bEditReparceInSeparateThread          = TRUE;
  3779. m_bConfigChangedReparceInSeparateThread = TRUE;
  3780. m_dwMaxBackParseOffset                  = XTP_EDIT_LEXPARSER_MAXBACKOFFSETDEFAULT;
  3781. m_dwEditReparceTimeout_ms               = XTP_EDIT_LEXPARSER_REPARSETIMEOUTMS;
  3782. m_dwOnScreenSchCacheLifeTime_sec        = XTP_EDIT_LEXPARSER_ONSCREENSCHCACHELIFETIMESEC;
  3783. m_dwParserThreadIdleLifeTime_ms         = XTP_EDIT_LEXPARSER_THREADIDLELIFETIMESEC * 1000;
  3784. }
  3785. CXTPSyntaxEditLexParserSchemaOptions::CXTPSyntaxEditLexParserSchemaOptions(const CXTPSyntaxEditLexParserSchemaOptions& rSrc)
  3786. {
  3787. m_bFirstParseInSeparateThread           = rSrc.m_bFirstParseInSeparateThread;
  3788. m_bEditReparceInSeparateThread          = rSrc.m_bEditReparceInSeparateThread;
  3789. m_bConfigChangedReparceInSeparateThread = rSrc.m_bConfigChangedReparceInSeparateThread;
  3790. m_dwMaxBackParseOffset                  = rSrc.m_dwMaxBackParseOffset;
  3791. m_dwEditReparceTimeout_ms               = rSrc.m_dwEditReparceTimeout_ms;
  3792. m_dwOnScreenSchCacheLifeTime_sec        = rSrc.m_dwOnScreenSchCacheLifeTime_sec;
  3793. m_dwParserThreadIdleLifeTime_ms         = rSrc.m_dwParserThreadIdleLifeTime_ms;
  3794. }
  3795. const CXTPSyntaxEditLexParserSchemaOptions& CXTPSyntaxEditLexParserSchemaOptions::operator=(const CXTPSyntaxEditLexParserSchemaOptions& rSrc)
  3796. {
  3797. m_bFirstParseInSeparateThread           = rSrc.m_bFirstParseInSeparateThread;
  3798. m_bEditReparceInSeparateThread          = rSrc.m_bEditReparceInSeparateThread;
  3799. m_bConfigChangedReparceInSeparateThread = rSrc.m_bConfigChangedReparceInSeparateThread;
  3800. m_dwMaxBackParseOffset                  = rSrc.m_dwMaxBackParseOffset;
  3801. m_dwEditReparceTimeout_ms               = rSrc.m_dwEditReparceTimeout_ms;
  3802. m_dwOnScreenSchCacheLifeTime_sec        = rSrc.m_dwOnScreenSchCacheLifeTime_sec;
  3803. m_dwParserThreadIdleLifeTime_ms         = rSrc.m_dwParserThreadIdleLifeTime_ms;
  3804. return *this;
  3805. }
  3806. BOOL CXTPSyntaxEditLexParser::ReadSchemaOptions(const CString& strExt,
  3807.   CXTPSyntaxEditLexTextSchema* pTextSchema,
  3808.   CXTPSyntaxEditLexParserSchemaOptions* pOpt)
  3809. {
  3810. if (pOpt)
  3811. {
  3812. *pOpt = *m_pSchOptions_default;
  3813. }
  3814. if (!pTextSchema || !pOpt)
  3815. {
  3816. ASSERT(FALSE);
  3817. return FALSE;
  3818. }
  3819. CXTPSyntaxEditLexClassPtr ptrTopCls = pTextSchema->GetTopClassForFileExt(strExt);
  3820. if (!ptrTopCls)
  3821. {
  3822. return FALSE;
  3823. }
  3824. pOpt->m_bFirstParseInSeparateThread = ptrTopCls->GetAttribute_BOOL(
  3825. XTPLEX_ATTRG_FIRSTPARSEINSEPARATETHREAD, FALSE, TRUE);
  3826. pOpt->m_bEditReparceInSeparateThread = ptrTopCls->GetAttribute_BOOL(
  3827. XTPLEX_ATTRG_EDITREPARCEINSEPARATETHREAD, FALSE, TRUE);
  3828. pOpt->m_bConfigChangedReparceInSeparateThread = ptrTopCls->GetAttribute_BOOL(
  3829. XTPLEX_ATTRG_CONFIGCHANGEDREPARCEINSEPARATETHREAD, FALSE, TRUE);
  3830. pOpt->m_dwMaxBackParseOffset = (DWORD)ptrTopCls->GetAttribute_int(
  3831. XTPLEX_ATTRG_MAXBACKPARSEOFFSET, FALSE,
  3832. XTP_EDIT_LEXPARSER_MAXBACKOFFSETDEFAULT);
  3833. pOpt->m_dwEditReparceTimeout_ms = (DWORD)ptrTopCls->GetAttribute_int(
  3834. XTPLEX_ATTRG_EDITREPARCETIMEOUT_MS, FALSE,
  3835. XTP_EDIT_LEXPARSER_REPARSETIMEOUTMS);
  3836. pOpt->m_dwOnScreenSchCacheLifeTime_sec = (DWORD)ptrTopCls->GetAttribute_int(
  3837. XTPLEX_ATTRG_ONSCREENSCHCACHELIFETIME_SEC, FALSE,
  3838. XTP_EDIT_LEXPARSER_ONSCREENSCHCACHELIFETIMESEC);
  3839. pOpt->m_dwParserThreadIdleLifeTime_ms = (DWORD)ptrTopCls->GetAttribute_int(
  3840. XTPLEX_ATTRG_PARSERTHREADIDLELIFETIME_SEC, FALSE,
  3841. XTP_EDIT_LEXPARSER_THREADIDLELIFETIMESEC);
  3842. if (pOpt->m_dwParserThreadIdleLifeTime_ms != INFINITE)
  3843. {
  3844. pOpt->m_dwParserThreadIdleLifeTime_ms *= 1000;
  3845. }
  3846. if (pOpt->m_dwParserThreadIdleLifeTime_ms == 0)
  3847. {
  3848. pOpt->m_dwParserThreadIdleLifeTime_ms = INFINITE;
  3849. }
  3850. return TRUE;
  3851. }
  3852. const CXTPSyntaxEditLexParserSchemaOptions* CXTPSyntaxEditLexParser::GetSchemaOptions(const CString& strExt)
  3853. {
  3854. CSingleLock singLockMain(&m_csParserData);
  3855. if (!m_ptrTextSchema)
  3856. {
  3857. RemoveAllOptions();
  3858. }
  3859. CXTPSyntaxEditLexParserSchemaOptions* pOptions = NULL;
  3860. if (m_mapSchOptions.Lookup(strExt, pOptions))
  3861. {
  3862. ASSERT(pOptions);
  3863. return pOptions;
  3864. }
  3865. else if (m_ptrTextSchema)
  3866. {
  3867. pOptions = new CXTPSyntaxEditLexParserSchemaOptions();
  3868. if (ReadSchemaOptions(strExt, m_ptrTextSchema, pOptions))
  3869. {
  3870. m_mapSchOptions.SetAt(strExt, pOptions);
  3871. return pOptions;
  3872. }
  3873. else
  3874. {
  3875. CMDTARGET_RELEASE(pOptions);
  3876. }
  3877. }
  3878. return m_pSchOptions_default;
  3879. }