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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditLineMarksManager.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/XTPSmartPtrInternalT.h"
  23. // syntax editor includes
  24. #include "XTPSyntaxEditLineMarksManager.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CXTPSyntaxEditLineMarksManager
  32. IMPLEMENT_DYNAMIC(CXTPSyntaxEditLineMarksManager, CCmdTarget)
  33. ////////////////////////////////////////////////////////////////////////////
  34. XTP_EDIT_LMPARAM::~XTP_EDIT_LMPARAM()
  35. {
  36. }
  37. XTP_EDIT_LMPARAM::XTP_EDIT_LMPARAM()
  38. {
  39. Clear();
  40. }
  41. XTP_EDIT_LMPARAM::XTP_EDIT_LMPARAM(const XTP_EDIT_LMPARAM& rSrc)
  42. {
  43. *this = rSrc;
  44. }
  45. XTP_EDIT_LMPARAM::XTP_EDIT_LMPARAM(DWORD dwVal)
  46. {
  47. m_eType = xtpEditLMPT_DWORD;
  48. m_dwValue = dwVal;
  49. }
  50. XTP_EDIT_LMPARAM::XTP_EDIT_LMPARAM(double dblValue)
  51. {
  52. m_eType = xtpEditLMPT_double;
  53. m_dblValue = dblValue;
  54. }
  55. XTP_EDIT_LMPARAM::XTP_EDIT_LMPARAM(void* pPtr)
  56. {
  57. m_eType = xtpEditLMPT_Ptr;
  58. *this = pPtr;
  59. }
  60. const XTP_EDIT_LMPARAM& XTP_EDIT_LMPARAM::operator=(const XTP_EDIT_LMPARAM& rSrc)
  61. {
  62. m_eType = rSrc.m_eType;
  63. if (m_eType == xtpEditLMPT_Unknown)
  64. {
  65. Clear();
  66. }
  67. else if (m_eType == xtpEditLMPT_DWORD)
  68. {
  69. m_dwValue = rSrc.m_dwValue;
  70. }
  71. else if (m_eType == xtpEditLMPT_double)
  72. {
  73. m_dblValue = rSrc.m_dblValue;
  74. }
  75. else if (m_eType == xtpEditLMPT_Ptr)
  76. {
  77. m_Ptr = rSrc.m_Ptr;
  78. }
  79. else
  80. {
  81. ASSERT(FALSE);
  82. }
  83. return *this;
  84. }
  85. const XTP_EDIT_LMPARAM& XTP_EDIT_LMPARAM::operator=(DWORD dwValue)
  86. {
  87. m_Ptr = NULL;
  88. m_eType = xtpEditLMPT_DWORD;
  89. m_dwValue = dwValue;
  90. return *this;
  91. }
  92. const XTP_EDIT_LMPARAM& XTP_EDIT_LMPARAM::operator=(double dblValue)
  93. {
  94. m_Ptr = NULL;
  95. m_eType = xtpEditLMPT_double;
  96. m_dblValue = dblValue;
  97. return *this;
  98. }
  99. void XTP_EDIT_LMPARAM::SetPtr(void* pPtr, CXTPSyntaxEditVoidObj::TPFDeleter pfDeleter)
  100. {
  101. ASSERT(!pPtr || pPtr != m_Ptr);
  102. m_eType = xtpEditLMPT_Ptr;
  103. CXTPSyntaxEditVoidObj* pVoidObj = NULL;
  104. if (pPtr)
  105. {
  106. pVoidObj = new CXTPSyntaxEditVoidObj(pPtr, pfDeleter);
  107. }
  108. m_Ptr = pVoidObj;
  109. }
  110. const XTP_EDIT_LMPARAM& XTP_EDIT_LMPARAM::operator=(void* pPtr)
  111. {
  112. SetPtr(pPtr, NULL);
  113. return *this;
  114. }
  115. XTP_EDIT_LMPARAM::operator DWORD() const
  116. {
  117. if (m_eType == xtpEditLMPT_DWORD)
  118. {
  119. return m_dwValue;
  120. }
  121. ASSERT(FALSE);
  122. return 0;
  123. }
  124. XTP_EDIT_LMPARAM::operator double() const
  125. {
  126. if (m_eType == xtpEditLMPT_double)
  127. {
  128. return m_dblValue;
  129. }
  130. else if (m_eType == xtpEditLMPT_DWORD)
  131. {
  132. return m_dwValue;
  133. }
  134. ASSERT(FALSE);
  135. return 0;
  136. }
  137. XTP_EDIT_LMPARAM::operator void*() const
  138. {
  139. return GetPtr();
  140. }
  141. void* XTP_EDIT_LMPARAM::GetPtr() const
  142. {
  143. if (m_eType == xtpEditLMPT_Ptr)
  144. {
  145. return m_Ptr ? m_Ptr->GetPtr() : NULL;
  146. }
  147. return NULL;
  148. }
  149. BOOL XTP_EDIT_LMPARAM::IsValid() const
  150. {
  151. return  m_eType == xtpEditLMPT_DWORD ||
  152. m_eType == xtpEditLMPT_double ||
  153. m_eType == xtpEditLMPT_Ptr;
  154. }
  155. void XTP_EDIT_LMPARAM::Clear()
  156. {
  157. m_eType = xtpEditLMPT_Unknown;
  158. m_dwValue = 0;
  159. m_dblValue = 0;
  160. m_Ptr = NULL;
  161. }
  162. ////////////////////////////////////////////////////////////////////////////
  163. //struct XTP_EDIT_LMDATA
  164. XTP_EDIT_LMDATA::~XTP_EDIT_LMDATA()
  165. {
  166. }
  167. XTP_EDIT_LMDATA::XTP_EDIT_LMDATA()
  168. {
  169. m_nRow = 0;
  170. }
  171. XTP_EDIT_LMDATA::XTP_EDIT_LMDATA(const XTP_EDIT_LMDATA& rSrc)
  172. {
  173. *this = rSrc;
  174. }
  175. const XTP_EDIT_LMDATA& XTP_EDIT_LMDATA::operator=(const XTP_EDIT_LMDATA& rSrc)
  176. {
  177. m_nRow = rSrc.m_nRow;
  178. m_Param = rSrc.m_Param;
  179. return *this;
  180. }
  181. /////////////////////////////////////////////////////////////////////////////
  182. //////////////////////////////////////////////////////////////////////////
  183. CXTPSyntaxEditLineMarksManager::CLineMarksList::~CLineMarksList()
  184. {
  185. RemoveAll();
  186. }
  187. int CXTPSyntaxEditLineMarksManager::CLineMarksList::FindIndex(const int nKey)
  188. {
  189. const int nCount = (int)m_array.GetSize();
  190. // binary search
  191. int nLeftIndex = 0, nRightIndex = nCount - 1;
  192. while (nRightIndex >= nLeftIndex)
  193. {
  194. XTP_EDIT_LMDATA* pLeftData = m_array.GetAt(nLeftIndex);
  195. XTP_EDIT_LMDATA* pRightData = m_array.GetAt(nRightIndex);
  196. if (!pLeftData || !pRightData)
  197. break;
  198. if (nKey == pLeftData->m_nRow)
  199. return nLeftIndex;
  200. if (nKey == pRightData->m_nRow)
  201. return nRightIndex;
  202. int nMediumIndex = (nRightIndex + nLeftIndex) / 2;
  203. if (nMediumIndex == nRightIndex || nMediumIndex == nLeftIndex)
  204. break;
  205. XTP_EDIT_LMDATA* pMediumData = m_array.GetAt(nMediumIndex);
  206. if (!pMediumData)
  207. break;
  208. if (nKey == pMediumData->m_nRow)
  209. {
  210. return nMediumIndex;
  211. }
  212. else if (nKey > pMediumData->m_nRow)
  213. {
  214. nLeftIndex = nMediumIndex;
  215. }
  216. else // if (nKey < pMediumData->m_nRow)
  217. {
  218. nRightIndex = nMediumIndex;
  219. }
  220. }
  221. return -1;
  222. }
  223. int CXTPSyntaxEditLineMarksManager::CLineMarksList::FindLowerIndex(const int nKey)
  224. {
  225. const int nCount = (int)m_array.GetSize();
  226. if (nCount == 0)
  227. return -1;
  228. // binary search
  229. int nLeftIndex = 0, nRightIndex = nCount - 1;
  230. while (nRightIndex >= nLeftIndex)
  231. {
  232. int nMediumIndex = (nRightIndex + nLeftIndex) / 2;
  233. XTP_EDIT_LMDATA* pMediumData = m_array.GetAt(nMediumIndex);
  234. if (!pMediumData)
  235. break;
  236. XTP_EDIT_LMDATA* pMediumNextData = nMediumIndex + 1 < nCount ?
  237. m_array.GetAt(nMediumIndex + 1) : NULL;
  238. if (nKey >= pMediumData->m_nRow &&
  239. (!pMediumNextData || (pMediumNextData && nKey < pMediumNextData->m_nRow)))
  240. {
  241. return nMediumIndex;
  242. }
  243. else if (nKey > pMediumData->m_nRow)
  244. {
  245. if (nLeftIndex < nMediumIndex)
  246. nLeftIndex = nMediumIndex;
  247. else if (nLeftIndex + 1 == nRightIndex)
  248. nLeftIndex = nRightIndex;
  249. else
  250. break;
  251. }
  252. else
  253. {
  254. if (nRightIndex > nMediumIndex)
  255. nRightIndex = nMediumIndex;
  256. else if (nRightIndex - 1 == nLeftIndex)
  257. nRightIndex = nLeftIndex;
  258. else
  259. break;
  260. }
  261. }
  262. return -1;
  263. }
  264. int CXTPSyntaxEditLineMarksManager::CLineMarksList::FindUpperIndex(const int nKey)
  265. {
  266. const int nCount = (int)m_array.GetSize();
  267. if (nCount == 0)
  268. return -1;
  269. // binary search
  270. int nLeftIndex = 0, nRightIndex = nCount - 1;
  271. while (nRightIndex >= nLeftIndex)
  272. {
  273. int nMediumIndex = (nRightIndex + nLeftIndex) / 2;
  274. XTP_EDIT_LMDATA* pMediumData = m_array.GetAt(nMediumIndex);
  275. if (!pMediumData)
  276. break;
  277. XTP_EDIT_LMDATA* pMediumPrevData = nMediumIndex > 0 ?
  278. m_array.GetAt(nMediumIndex - 1) : NULL;
  279. if (nKey <= pMediumData->m_nRow &&
  280. (!pMediumPrevData || (pMediumPrevData && nKey > pMediumPrevData->m_nRow)))
  281. {
  282. return nMediumIndex;
  283. }
  284. else if (nKey > pMediumData->m_nRow)
  285. {
  286. if (nLeftIndex < nMediumIndex)
  287. nLeftIndex = nMediumIndex;
  288. else if (nLeftIndex + 1 == nRightIndex)
  289. nLeftIndex = nRightIndex;
  290. else
  291. break;
  292. }
  293. else
  294. {
  295. if (nRightIndex > nMediumIndex)
  296. nRightIndex = nMediumIndex;
  297. else if (nRightIndex - 1 == nLeftIndex)
  298. nRightIndex = nLeftIndex;
  299. else
  300. break;
  301. }
  302. }
  303. return -1;
  304. }
  305. void CXTPSyntaxEditLineMarksManager::CLineMarksList::Add(const XTP_EDIT_LMDATA& lmData)
  306. {
  307. int nIndex = FindUpperIndex(lmData.m_nRow);
  308. if (nIndex < 0)
  309. {
  310. m_array.Add(new XTP_EDIT_LMDATA(lmData));
  311. }
  312. else
  313. {
  314. XTP_EDIT_LMDATA* pOldData = m_array.GetAt(nIndex);
  315. if (pOldData->m_nRow == lmData.m_nRow)
  316. {
  317. // just copy data because the key already exists
  318. *pOldData = lmData;
  319. }
  320. else
  321. {
  322. // insert new element for the new key
  323. m_array.InsertAt(nIndex, new XTP_EDIT_LMDATA(lmData));
  324. }
  325. }
  326. }
  327. void CXTPSyntaxEditLineMarksManager::CLineMarksList::Remove(const int nKey)
  328. {
  329. int nIndex = FindIndex(nKey);
  330. if (nIndex >= 0)
  331. {
  332. XTP_EDIT_LMDATA* pData = m_array.GetAt(nIndex);
  333. if (pData)
  334. delete pData;
  335. m_array.RemoveAt(nIndex);
  336. }
  337. }
  338. POSITION CXTPSyntaxEditLineMarksManager::CLineMarksList::FindAt(int nKey)
  339. {
  340. // find a record with the specified key
  341. INT_PTR nIndex = FindIndex(nKey);
  342. return nIndex >= 0 ? (POSITION)(nIndex + 1) : NULL;
  343. }
  344. POSITION CXTPSyntaxEditLineMarksManager::CLineMarksList::FindNext(int nKey)
  345. {
  346. INT_PTR nIndex = FindUpperIndex(nKey);
  347. if (nIndex >= 0)
  348. {
  349. return (POSITION)(nIndex + 1);
  350. }
  351. return NULL;
  352. }
  353. POSITION CXTPSyntaxEditLineMarksManager::CLineMarksList::FindPrev(int nKey)
  354. {
  355. INT_PTR nIndex = FindLowerIndex(nKey);
  356. if (nIndex >= 0)
  357. {
  358. return (POSITION)(nIndex + 1);
  359. }
  360. return NULL;
  361. }
  362. void CXTPSyntaxEditLineMarksManager::CLineMarksList::RefreshLineMarks(
  363. int nRowFrom, int nRowTo, int nRefreshType)
  364. {
  365. int nDiff = abs(nRowTo - nRowFrom);
  366. BOOL bDel = (nRefreshType & xtpEditLMRefresh_Delete);
  367. BOOL bDel_only1 = (nRefreshType & xtpEditLMRefresh_Delete_only1);
  368. BOOL bDel_only2 = (nRefreshType & xtpEditLMRefresh_Delete_only2);
  369. BOOL bInsertAt0 = (nRefreshType & xtpEditLMRefresh_InsertAt0);
  370. if (nRefreshType & xtpEditLMRefresh_Delete)
  371. nDiff *= -1;
  372. if (nRefreshType & (xtpEditLMRefresh_Delete_only1 | xtpEditLMRefresh_Delete_only2))
  373. nDiff = 0;
  374. int nRowU = max(nRowTo, nRowFrom);
  375. int nRowL = min(nRowTo, nRowFrom);
  376. const int nCount = (int)m_array.GetSize();
  377. CXTPSyntaxEditLineMarkPointersArray newArray;
  378. newArray.SetSize(0, m_array.GetSize());
  379. int nPrevDataRow = -1;
  380. for (int nIndex = 0; nIndex < nCount; nIndex++)
  381. {
  382. XTP_EDIT_LMDATA* pData = m_array.GetAt(nIndex);
  383. if (!pData)
  384. continue;
  385. if (pData->m_nRow < nRowL ||
  386. pData->m_nRow == nRowL && !bDel_only1 && !bInsertAt0)
  387. {
  388. // does not affect refresh
  389. newArray.Add(pData);
  390. nPrevDataRow = pData->m_nRow;
  391. }
  392. else if (bDel && pData->m_nRow < nRowU ||
  393.  bDel_only1 && pData->m_nRow == nRowL ||
  394.  bDel_only2 && pData->m_nRow == nRowU)
  395. {
  396. // delete line mark
  397. delete pData;
  398. }
  399. else
  400. {
  401. // refresh position
  402. pData->m_nRow += nDiff;
  403. if (nPrevDataRow == pData->m_nRow)
  404. {
  405. // delete line mark
  406. delete pData;
  407. }
  408. else
  409. {
  410. newArray.Add(pData);
  411. nPrevDataRow = pData->m_nRow;
  412. }
  413. }
  414. }
  415. // update data in the old array
  416. m_array.RemoveAll();
  417. m_array.Append(newArray);
  418. }
  419. void CXTPSyntaxEditLineMarksManager::CLineMarksList::RemoveAll()
  420. {
  421. const int nCount = (int)m_array.GetSize();
  422. for (int i = 0; i < nCount; i++)
  423. {
  424. XTP_EDIT_LMDATA* pData = m_array.GetAt(i);
  425. if (pData)
  426. delete pData;
  427. }
  428. m_array.RemoveAll();
  429. }
  430. int CXTPSyntaxEditLineMarksManager::CLineMarksList::GetCount()
  431. {
  432. return (int)m_array.GetSize();
  433. }
  434. POSITION CXTPSyntaxEditLineMarksManager::CLineMarksList::GetFirstLineMark()
  435. {
  436. return BEFORE_START_POSITION;
  437. }
  438. XTP_EDIT_LMDATA* CXTPSyntaxEditLineMarksManager::CLineMarksList::GetNextLineMark(POSITION& pos)
  439. {
  440. // Rule: pos == element index + 1  (because 0=NULL and mean no more elements)
  441. // check for the beginning of the list
  442. if (pos == BEFORE_START_POSITION)
  443. {
  444. pos = (POSITION)1;
  445. }
  446. // get data corresponding to the position
  447. XTP_EDIT_LMDATA* pData = (INT_PTR)pos > (INT_PTR)m_array.GetSize() ? NULL : m_array.GetAt((INT_PTR)pos - 1);
  448. // increase position
  449. pos = (POSITION)((INT_PTR)pos + 1);
  450. // check for the end of the array
  451. if ((INT_PTR)pos > (INT_PTR)m_array.GetSize() )
  452. {
  453. //pos = (POSITION)m_array.GetSize();
  454. pos = NULL;
  455. }
  456. // return the data for the initial position
  457. return pData;
  458. }
  459. XTP_EDIT_LMDATA* CXTPSyntaxEditLineMarksManager::CLineMarksList::GetLineMarkAt(const POSITION pos)
  460. {
  461. // Rule: pos == element index + 1  (because 0=NULL and mean no more elements)
  462. INT_PTR nIndex = (INT_PTR)pos - 1;
  463. if (nIndex < 0 || nIndex >= (INT_PTR)m_array.GetSize())
  464. {
  465. return NULL;
  466. }
  467. return m_array.GetAt(nIndex);
  468. }
  469. /////////////////////////////////////////////////////////////////////////////
  470. CXTPSyntaxEditLineMarksManager::CLineMarksListPtr
  471. CXTPSyntaxEditLineMarksManager::CLineMarksListsMap::GetList(LPCTSTR szMarkType)
  472. {
  473. CLineMarksListPtr ptrList;
  474. if (!m_map.Lookup(szMarkType, ptrList))
  475. {
  476. return NULL;
  477. }
  478. return ptrList;
  479. }
  480. CXTPSyntaxEditLineMarksManager::CLineMarksListPtr
  481. CXTPSyntaxEditLineMarksManager::CLineMarksListsMap::AddList(LPCTSTR szMarkType)
  482. {
  483. CLineMarksListPtr ptrList(new CLineMarksList());
  484. m_map.SetAt(szMarkType, ptrList);
  485. return ptrList;
  486. }
  487. void CXTPSyntaxEditLineMarksManager::CLineMarksListsMap::RefreshLineMarks(
  488. int nRowFrom, int nRowTo, int nRefreshType)
  489. {
  490. POSITION pos = m_map.GetStartPosition();
  491. CString strKey;
  492. CLineMarksListPtr ptrList;
  493. while (pos != NULL)
  494. {
  495. m_map.GetNextAssoc(pos, strKey, ptrList);
  496. if (ptrList)
  497. ptrList->RefreshLineMarks(nRowFrom, nRowTo, nRefreshType);
  498. }
  499. }
  500. /////////////////////////////////////////////////////////////////////////////
  501. CXTPSyntaxEditLineMarksManager::CXTPSyntaxEditLineMarksManager()
  502. {
  503. }
  504. CXTPSyntaxEditLineMarksManager::~CXTPSyntaxEditLineMarksManager()
  505. {
  506. }
  507. void CXTPSyntaxEditLineMarksManager::AddRemoveLineMark(int nRow, const XTP_EDIT_LINEMARKTYPE lmType,
  508.   XTP_EDIT_LMPARAM* pParam)
  509. {
  510. if (HasRowMark(nRow, lmType))
  511. {
  512. DeleteLineMark(nRow, lmType);
  513. }
  514. else
  515. {
  516. SetLineMark(nRow, lmType, pParam);
  517. }
  518. }
  519. void CXTPSyntaxEditLineMarksManager::SetLineMark(int nRow, const XTP_EDIT_LINEMARKTYPE lmType,
  520.   XTP_EDIT_LMPARAM* pParam)
  521. {
  522. // prepare data structure
  523. XTP_EDIT_LMDATA lmData;
  524. lmData.m_nRow = nRow;
  525. if (pParam)
  526. {
  527. lmData.m_Param = *pParam;
  528. }
  529. // get corresponding list
  530. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  531. if (!ptrList)
  532. {
  533. // create new list
  534. ptrList = m_mapLists.AddList(lmType);
  535. if (!ptrList)
  536. return; // error happened
  537. }
  538. // set value
  539. ptrList->Add(lmData);
  540. }
  541. void CXTPSyntaxEditLineMarksManager::DeleteLineMark(int nRow, const XTP_EDIT_LINEMARKTYPE lmType)
  542. {
  543. // get corresponding list
  544. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  545. if (ptrList)
  546. {
  547. // delete line mark
  548. ptrList->Remove(nRow);
  549. }
  550. }
  551. BOOL CXTPSyntaxEditLineMarksManager::HasRowMark(int nRow, const XTP_EDIT_LINEMARKTYPE& lmType,
  552. XTP_EDIT_LMPARAM* pParam)
  553. {
  554. // get corresponding list
  555. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  556. if (ptrList)
  557. {
  558. // Find line data
  559. POSITION pos = ptrList->FindAt(nRow);
  560. XTP_EDIT_LMDATA* pData = ptrList->GetLineMarkAt(pos);
  561. if (pData)
  562. {
  563. ASSERT(pData->m_nRow == nRow);
  564. if (pParam)
  565. {
  566. *pParam = pData->m_Param;
  567. }
  568. return TRUE;
  569. }
  570. }
  571. return FALSE;
  572. }
  573. POSITION CXTPSyntaxEditLineMarksManager::GetLastLineMark(const XTP_EDIT_LINEMARKTYPE lmType)
  574. {
  575. int nRow = INT_MAX - 1;
  576. return FindPrevLineMark(nRow, lmType);
  577. }
  578. POSITION CXTPSyntaxEditLineMarksManager::FindPrevLineMark(int& nRow, const XTP_EDIT_LINEMARKTYPE lmType)
  579. {
  580. int nPrevRow = -1;
  581. POSITION posPrev = NULL;
  582. // get corresponding list
  583. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  584. if (ptrList)
  585. {
  586. // Find line data
  587. posPrev = ptrList->FindPrev(nRow);
  588. XTP_EDIT_LMDATA* pData = ptrList->GetLineMarkAt(posPrev);
  589. if (pData)
  590. {
  591. nPrevRow = pData->m_nRow;
  592. }
  593. }
  594. nRow = nPrevRow;
  595. return posPrev;
  596. }
  597. POSITION CXTPSyntaxEditLineMarksManager::FindNextLineMark(int& nRow, const XTP_EDIT_LINEMARKTYPE lmType)
  598. {
  599. int nNextRow = INT_MAX;
  600. POSITION posNext = NULL;
  601. // get corresponding list
  602. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  603. if (ptrList)
  604. {
  605. // Find line data
  606. posNext = ptrList->FindNext(nRow);
  607. XTP_EDIT_LMDATA* pData = ptrList->GetLineMarkAt(posNext);
  608. if (pData)
  609. {
  610. nNextRow = pData->m_nRow;
  611. }
  612. }
  613. if (nNextRow == INT_MAX)
  614. {
  615. nNextRow = -1;
  616. }
  617. nRow = nNextRow;
  618. return posNext;
  619. }
  620. POSITION CXTPSyntaxEditLineMarksManager::GetFirstLineMark(const XTP_EDIT_LINEMARKTYPE lmType)
  621. {
  622. // get corresponding list
  623. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  624. return ptrList ? ptrList->GetFirstLineMark() : NULL;
  625. }
  626. XTP_EDIT_LMDATA* CXTPSyntaxEditLineMarksManager::GetNextLineMark(POSITION& pos, const XTP_EDIT_LINEMARKTYPE lmType)
  627. {
  628. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  629. return ptrList ? ptrList->GetNextLineMark(pos) : NULL;
  630. }
  631. void CXTPSyntaxEditLineMarksManager::RefreshLineMarks(int nRowFrom, int nRowTo, int nRefreshType)
  632. {
  633. m_mapLists.RefreshLineMarks(nRowFrom, nRowTo, nRefreshType);
  634. }
  635. void CXTPSyntaxEditLineMarksManager::RemoveAll(const XTP_EDIT_LINEMARKTYPE lmType)
  636. {
  637. // get corresponding list
  638. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  639. if (ptrList)
  640. ptrList->RemoveAll();
  641. }
  642. XTP_EDIT_LMDATA* CXTPSyntaxEditLineMarksManager::GetLineMarkAt(const POSITION pos, const XTP_EDIT_LINEMARKTYPE lmType)
  643. {
  644. // get corresponding list
  645. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  646. return ptrList ? ptrList->GetLineMarkAt(pos) : NULL;
  647. }
  648. int CXTPSyntaxEditLineMarksManager::GetCount(const XTP_EDIT_LINEMARKTYPE lmType)
  649. {
  650. // get corresponding list
  651. CLineMarksListPtr ptrList = m_mapLists.GetList(lmType);
  652. return ptrList ? ptrList->GetCount() : 0;
  653. }