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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditLineMarksManager.h : header 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. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPSYNTAXEDITLINEMARKSMANAGER_H__)
  22. #define __XTPSYNTAXEDITLINEMARKSMANAGER_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. typedef LPCTSTR XTP_EDIT_LINEMARKTYPE;
  28. // You can define your own line mark types (as string constants)
  29. // Strings are case sensitive!
  30. //
  31. static const XTP_EDIT_LINEMARKTYPE xtpEditLMT_Bookmark     = _T("Bookmark");
  32. static const XTP_EDIT_LINEMARKTYPE xtpEditLMT_Breakpoint   = _T("Breakpoint");
  33. static const XTP_EDIT_LINEMARKTYPE xtpEditLMT_Collapsed    = _T("Collapsed");
  34. //===========================================================================
  35. // Summary: Enumerates types of mark refreshing
  36. //===========================================================================
  37. enum XTPSyntaxEditLineMarksRefreshType
  38. {
  39. xtpEditLMRefresh_Unknown    = 0, // unknown refresh state
  40. xtpEditLMRefresh_Insert     = 0x01, // mark inserted
  41. xtpEditLMRefresh_Delete     = 0x02, // mark deleted
  42. xtpEditLMRefresh_Delete_only1 = 0x10, // delete mark for first row of deleted text block;
  43. xtpEditLMRefresh_Delete_only2 = 0x20, // delete mark for last row of deleted text block;
  44. xtpEditLMRefresh_InsertAt0    = 0x40, // move mark for first row of inserted text block;
  45. };
  46. //{{AFX_CODEJOCK_PRIVATE
  47. //===========================================================================
  48. class _XTP_EXT_CLASS CXTPSyntaxEditVoidObj : public CXTPCmdTarget
  49. {
  50. public:
  51. typedef void (AFX_CDECL* TPFDeleter)(void*);
  52. protected:
  53. void*       m_pPtr;     // A pointer to a handled object
  54. TPFDeleter  m_pfDeleter;
  55. public:
  56. //-----------------------------------------------------------------------
  57. // Parameters:  pPtr                : [in]Pointer to the handled object.
  58. //          bCallInternalAddRef : [in]If this parameter is TRUE
  59. //                                pPtr->InternalAddRef() will be
  60. //                                called in constructor.
  61. //                                By default this parameter is FALSE.
  62. // Summary: Default class constructor.
  63. // See Also: ~CXTPSmartPtrInternalT()
  64. //-----------------------------------------------------------------------
  65. CXTPSyntaxEditVoidObj(void* pPtr, TPFDeleter pfDeleter = NULL) {
  66. m_pPtr = pPtr;
  67. m_pfDeleter = pfDeleter;
  68. };
  69. //-----------------------------------------------------------------------
  70. // Summary: Default class destructor.
  71. // Remarks: Call InternalRelease() for the not NULL handled object.
  72. // See Also: CXTPSmartPtrInternalT constructors
  73. //-----------------------------------------------------------------------
  74. virtual ~CXTPSyntaxEditVoidObj()
  75. {
  76. if(m_pfDeleter) {
  77. m_pfDeleter(m_pPtr);
  78. }
  79. else
  80. {
  81. SAFE_DELETE(m_pPtr);
  82. }
  83. };
  84. //-----------------------------------------------------------------------
  85. // Summary: Get a handled object.
  86. // Returns: Pointer to the handled object.
  87. //-----------------------------------------------------------------------
  88. operator void*() const {
  89. return m_pPtr;
  90. }
  91. void* GetPtr() const {
  92. return m_pPtr;
  93. }
  94. //-----------------------------------------------------------------------
  95. // Summary: Check is handled object equal NULL.
  96. // Returns: TRUE if handled object equal NULL, else FALSE.
  97. //-----------------------------------------------------------------------
  98. BOOL operator !() const {
  99. return !m_pPtr;
  100. }
  101. };
  102. //---------------------------------------------------------------------------
  103. typedef CXTPSmartPtrInternalT<CXTPSyntaxEditVoidObj> CXTPSyntaxEditVoidObjPtr;
  104. //===========================================================================
  105. enum XTPSyntaxEditLMParamType
  106. {
  107. xtpEditLMPT_Unknown     = 0,    // unknown refresh state
  108. xtpEditLMPT_DWORD       = 1,
  109. xtpEditLMPT_double      = 2,
  110. xtpEditLMPT_Ptr         = 3,
  111. };
  112. struct _XTP_EXT_CLASS XTP_EDIT_LMPARAM
  113. {
  114. // Data type
  115. XTPSyntaxEditLMParamType    m_eType;
  116. // Data
  117. union
  118. {
  119. DWORD       m_dwValue;  // xtpEditLMPT_DWORD
  120. double      m_dblValue; // xtpEditLMPT_double
  121. };
  122. protected:
  123. CXTPSyntaxEditVoidObjPtr    m_Ptr;
  124. public:
  125. // END Data
  126. XTP_EDIT_LMPARAM();
  127. virtual ~XTP_EDIT_LMPARAM();
  128. XTP_EDIT_LMPARAM(const XTP_EDIT_LMPARAM& rSrc);
  129. XTP_EDIT_LMPARAM(DWORD dwVal);
  130. XTP_EDIT_LMPARAM(double dblValue);
  131. XTP_EDIT_LMPARAM(void* pPtr);
  132. const XTP_EDIT_LMPARAM& operator=(const XTP_EDIT_LMPARAM& rSrc);
  133. const XTP_EDIT_LMPARAM& operator=(DWORD dwValue);
  134. const XTP_EDIT_LMPARAM& operator=(double dblValue);
  135. const XTP_EDIT_LMPARAM& operator=(void* pPtr);
  136. operator DWORD() const;
  137. operator double() const;
  138. operator void*() const;
  139. void SetPtr(void* pPtr, CXTPSyntaxEditVoidObj::TPFDeleter pfDeleter = NULL);
  140. void* GetPtr() const;
  141. BOOL IsValid() const;
  142. void Clear();
  143. };
  144. //===========================================================================
  145. struct _XTP_EXT_CLASS XTP_EDIT_LMDATA
  146. {
  147. int         m_nRow;
  148. XTP_EDIT_LMPARAM   m_Param;
  149. //-------------------------------
  150. XTP_EDIT_LMDATA();
  151. virtual ~XTP_EDIT_LMDATA();
  152. XTP_EDIT_LMDATA(const XTP_EDIT_LMDATA& rSrc);
  153. const XTP_EDIT_LMDATA& operator=(const XTP_EDIT_LMDATA& rSrc);
  154. };
  155. //}}AFX_CODEJOCK_PRIVATE
  156. //===========================================================================
  157. // Summary: CXTPSyntaxEditLineMarksManager class provides functionality to
  158. //          to manipulate marks on text lines.
  159. //          Used internally by the Smart Edit control.
  160. //===========================================================================
  161. class _XTP_EXT_CLASS CXTPSyntaxEditLineMarksManager : public CXTPCmdTarget
  162. {
  163. //{{AFX_CODEJOCK_PRIVATE
  164. DECLARE_DYNAMIC(CXTPSyntaxEditLineMarksManager)
  165. //}}AFX_CODEJOCK_PRIVATE
  166. public:
  167. //-----------------------------------------------------------------------
  168. // Summary:
  169. //      Default object constructor.
  170. //-----------------------------------------------------------------------
  171. CXTPSyntaxEditLineMarksManager();
  172. //-----------------------------------------------------------------------
  173. // Summary:
  174. //      Destroys a CXTPSyntaxEditLineMarksManager object, handles
  175. //      cleanup and de-allocation.
  176. //-----------------------------------------------------------------------
  177. virtual ~CXTPSyntaxEditLineMarksManager();
  178. //-----------------------------------------------------------------------
  179. // Summary:
  180. //      Adds/removes required mark on given text line.
  181. // Parameters:
  182. //      nRow    : [in] row number.
  183. //      lmType  : [in] mark type identifier.
  184. //      pParam  : [in] pointer to XTP_EDIT_LMPARAM. Default is NULL.
  185. // Remarks:
  186. //      Call this member function to add or remove mark on the given
  187. //      text line: if line don't have specified mark it will be added;
  188. //      otherwise mark will be deleted.
  189. // See also:
  190. //      struct XTP_EDIT_LMPARAM.
  191. //-----------------------------------------------------------------------
  192. void AddRemoveLineMark(int nRow, const XTP_EDIT_LINEMARKTYPE lmType,
  193.  XTP_EDIT_LMPARAM* pParam = NULL);
  194. //-----------------------------------------------------------------------
  195. // Summary:
  196. //      Sets required mark on given text line.
  197. // Parameters:
  198. //      nRow    : [in]row number.
  199. //      lmType  : [in]mark type identifier.
  200. //      pParam  : [in] pointer to XTP_EDIT_LMPARAM. Default is NULL.
  201. // Remarks:
  202. //      Call this member function to add mark on the given text line.
  203. // See also:
  204. //      struct XTP_EDIT_LMPARAM.
  205. //-----------------------------------------------------------------------
  206. void SetLineMark(int nRow, const XTP_EDIT_LINEMARKTYPE lmType,
  207.    XTP_EDIT_LMPARAM* pParam = NULL);
  208. //-----------------------------------------------------------------------
  209. // Summary:
  210. //      Removes required mark on given text line.
  211. // Parameters:
  212. //      nRow    : [in] row number.
  213. //      lmType  : [in] mark type identifier.
  214. // Remarks:
  215. //      Call this member function to remove mark on the given text
  216. //      line.
  217. //-----------------------------------------------------------------------
  218. void DeleteLineMark(int nRow, const XTP_EDIT_LINEMARKTYPE lmType);
  219. //-----------------------------------------------------------------------
  220. // Summary:
  221. //      Determines if row has mark.
  222. // Parameters:
  223. //          nRow    : [in]row number.
  224. //          lmType  : [in]mark type identifier.
  225. //          pParam  : [in] pointer to XTP_EDIT_LMPARAM. Default is NULL.
  226. // Remarks:
  227. //      Call this member function to determine if specified row has
  228. //      given type of mark.
  229. // Returns:
  230. //      Returns TRUE if row has marked by the specified mark type;
  231. //      otherwise returns FALSE.
  232. //-----------------------------------------------------------------------
  233. BOOL HasRowMark(int nRow, const XTP_EDIT_LINEMARKTYPE& lmType,
  234.   XTP_EDIT_LMPARAM* pParam = NULL);
  235. //-----------------------------------------------------------------------
  236. // Summary:
  237. //      Returns identifier of the marked line.
  238. // Parameters:
  239. //      nRow    : [in]row number.
  240. //      lmType  : [in]mark type identifier.
  241. // Remarks:
  242. //      Call this member function to get line identifier that have
  243. //      given mark type and precedes specified line number.
  244. // Returns:
  245. //      Number identifier of the marked line.
  246. //-----------------------------------------------------------------------
  247. POSITION FindPrevLineMark(int& nRow, const XTP_EDIT_LINEMARKTYPE lmType);
  248. //-----------------------------------------------------------------------
  249. // Summary:
  250. //      Returns identifier of the marked line.
  251. // Parameters:
  252. //      nRow    : [in]row number.
  253. //      lmType  : [in]mark type identifier.
  254. // Remarks:
  255. //      Call this member function to get line identifier that have
  256. //      given mark type and following specified line number.
  257. // Returns:
  258. //      Number identifier of the marked line.
  259. //-----------------------------------------------------------------------
  260. POSITION FindNextLineMark(int& nRow, const XTP_EDIT_LINEMARKTYPE lmType);
  261. //-----------------------------------------------------------------------
  262. // Summary:
  263. //      Returns identifier of the marked line.
  264. // Parameters:
  265. //      nRow    : [in]row number.
  266. //      lmType  : [in]mark type identifier.
  267. // Remarks:
  268. //      Call this member function to get the last line identifier that
  269. //      have given mark type and following specified line number.
  270. // Returns:
  271. //      Number identifier of the marked line.
  272. //-----------------------------------------------------------------------
  273. POSITION GetLastLineMark(const XTP_EDIT_LINEMARKTYPE lmType);
  274. //-----------------------------------------------------------------------
  275. // Summary:
  276. //      Returns reference to the of the first marked line position
  277. //      for the specific line marks type.
  278. // Parameters:
  279. //      lmType  : [in]mark type identifier.
  280. // Remarks:
  281. //      Call this member function to get the first line identifier that
  282. //      have given mark type.
  283. // Returns:
  284. //      Number identifier of the marked line;
  285. //-----------------------------------------------------------------------
  286. POSITION GetFirstLineMark(const XTP_EDIT_LINEMARKTYPE lmType);
  287. //-----------------------------------------------------------------------
  288. // Summary:
  289. //      Returns reference to the of the next marked line position
  290. //      for the specific line marks type.
  291. // Parameters:
  292. //      pos     : [in]Start POSITION value.
  293. //      lmType  : [in]mark type identifier.
  294. // Remarks:
  295. //      Call this member function to get the next line identifier that
  296. //      have given mark type.
  297. // Returns:
  298. //      Pointer to XTP_EDIT_LMDATA with number identifier of the marked line.
  299. // See also:
  300. //      struct XTP_EDIT_LMDATA.
  301. //-----------------------------------------------------------------------
  302. XTP_EDIT_LMDATA* GetNextLineMark(POSITION& pos, const XTP_EDIT_LINEMARKTYPE lmType);
  303. //-----------------------------------------------------------------------
  304. // Summary:
  305. //      Returns mark from given position.
  306. // Parameters:
  307. //      pos     : [in]Current POSITION value.
  308. //      lmType  : [in]mark type identifier.
  309. // Remarks:
  310. //      Call this member function to get the next line identifier that
  311. //      have given mark type.
  312. // Returns:
  313. //      Number identifier of the marked line.
  314. //-----------------------------------------------------------------------
  315. XTP_EDIT_LMDATA* GetLineMarkAt(const POSITION pos, const XTP_EDIT_LINEMARKTYPE lmType);
  316. //-----------------------------------------------------------------------
  317. // Summary:
  318. //      Updates line marks for given range of rows.
  319. // Parameters:
  320. //      nRowFrom        : [in] Start row identifier.
  321. //      nRowTo          : [in] End row identifier.
  322. //      eRefreshType    : [in] refresh type.
  323. // See also:
  324. //      XTPSyntaxEditLineMarksRefreshType.
  325. //-----------------------------------------------------------------------
  326. virtual void RefreshLineMarks(int nRowFrom, int nRowTo, int nRefreshType);
  327. //-----------------------------------------------------------------------
  328. // Summary:
  329. //      Removes all line marks from the corresponding types list.
  330. // Parameters:
  331. //      lmType : [in] pointer to null terminated string with types list.
  332. //-----------------------------------------------------------------------
  333. void RemoveAll(const XTP_EDIT_LINEMARKTYPE lmType);
  334. //-----------------------------------------------------------------------
  335. // Summary:
  336. //      Returns count of line marks of the specified type.
  337. // Parameters:
  338. //      lmType : [in] pointer to null terminated string with types list.
  339. // Returns:
  340. //      Count of line marks as integer value.
  341. //-----------------------------------------------------------------------
  342. int GetCount(const XTP_EDIT_LINEMARKTYPE lmType);
  343. private:
  344. //-----------------------------------------------------------------------
  345. // Summary:
  346. //      This internal helper class is designed to store sorted list of line
  347. //      marks data objects, based on CArray and provides typical
  348. //      operations like fast binary searching inside it and basic line
  349. //      marks manipulations.
  350. //-----------------------------------------------------------------------
  351. class CLineMarksList : public CXTPCmdTarget
  352. {
  353. public:
  354. //-----------------------------------------------------------------------
  355. // Summary:
  356. //      Default object destructor.
  357. //-----------------------------------------------------------------------
  358. virtual ~CLineMarksList();
  359. //-----------------------------------------------------------------------
  360. // Summary:
  361. //      Inserts element in the list at proper position.
  362. // Parameters:
  363. //      lmData : [in] Pointer to element description structure.
  364. // See also:
  365. //      XTP_EDIT_LMDATA.
  366. //-----------------------------------------------------------------------
  367. void Add(const XTP_EDIT_LMDATA& lmData);
  368. //-----------------------------------------------------------------------
  369. // Summary:
  370. //      Removes element from the list.
  371. // Parameters:
  372. //      nKey : [in] id of element
  373. //-----------------------------------------------------------------------
  374. void Remove(const int nKey);
  375. //-----------------------------------------------------------------------
  376. // Summary:
  377. //      Removes all elements from the list.
  378. //-----------------------------------------------------------------------
  379. void RemoveAll();
  380. //-----------------------------------------------------------------------
  381. // Summary:
  382. //      Returns count of line marks of the specified type.
  383. // Returns:
  384. //-----------------------------------------------------------------------
  385. int GetCount();
  386. //-----------------------------------------------------------------------
  387. // Summary:
  388. //      Returns position of the element with the specified key if exists.
  389. // Parameters:
  390. //      nKey : [in] id of element.
  391. // Returns:
  392. //      POSITION value  for an element.
  393. //-----------------------------------------------------------------------
  394. POSITION FindAt(int nKey);
  395. //-----------------------------------------------------------------------
  396. // Summary:
  397. //      Returns position of the element with the key following the
  398. //      specified.
  399. // Parameters:
  400. //      nKey : [in] id of element.
  401. // Returns:
  402. //      POSITION value  for an element.
  403. //-----------------------------------------------------------------------
  404. POSITION FindNext(int nKey);
  405. //-----------------------------------------------------------------------
  406. // Summary:
  407. //      Returns position of the element with the key previous to the
  408. //      specified.
  409. // Parameters:
  410. //      nKey : [in] id of element.
  411. // Returns:
  412. //      POSITION value  for an element.
  413. //-----------------------------------------------------------------------
  414. POSITION FindPrev(int nKey);
  415. //-----------------------------------------------------------------------
  416. // Summary:
  417. //      Refreshes marks for all corresponding lines.
  418. // Parameters:
  419. //      nRowFrom        : [in] Start row.
  420. //      nRowTo          : [in] End row.
  421. //      eRefreshType    : [in] Refresh type.
  422. // See also:
  423. //      XTPSyntaxEditLineMarksRefreshType
  424. //-----------------------------------------------------------------------
  425. void RefreshLineMarks(int nRowFrom, int nRowTo, int nRefreshType);
  426. //-----------------------------------------------------------------------
  427. // Summary:
  428. //      Returns line mark by give position.
  429. // Parameters:
  430. //      pos     : [in] Current POSITION value.
  431. // Remarks:
  432. //      Call this member function to get the next line identifier that
  433. //      have given mark type.
  434. // Returns:
  435. //      Number identifier of the marked line.
  436. //-----------------------------------------------------------------------
  437. XTP_EDIT_LMDATA* GetLineMarkAt(const POSITION pos);
  438. //-----------------------------------------------------------------------
  439. // Summary:
  440. //      Returns reference to the of the first marked line position
  441. // Remarks:
  442. //      Call this member function to get the first line identifier that
  443. //      have given mark type.
  444. // Returns:
  445. //      Number identifier of the marked line.
  446. //-----------------------------------------------------------------------
  447. POSITION GetFirstLineMark();
  448. //-----------------------------------------------------------------------
  449. // Summary:
  450. //      Returns reference to the of the next marked line position
  451. // Parameters:
  452. //      pos     : [in] Current POSITION value.
  453. // Remarks:
  454. //      Call this member function to get the next line identifier that
  455. //      have given mark type.
  456. // Returns:
  457. //      Number identifier of the marked line.
  458. //-----------------------------------------------------------------------
  459. XTP_EDIT_LMDATA* GetNextLineMark(POSITION& pos);
  460. private:
  461. //-----------------------------------------------------------------------
  462. // Summary:
  463. //      Finds index of the element with the specified key.
  464. // Parameters:
  465. //      nKey : [in] id of element.
  466. // Returns:
  467. //      -1 if key was not found.
  468. //-----------------------------------------------------------------------
  469. int FindIndex(const int nKey);
  470. //-----------------------------------------------------------------------
  471. // Summary:
  472. //      Finds index of the element with the key value previous up to the specified.
  473. // Parameters:
  474. //      nKey : [in] id of element.
  475. // Returns:
  476. //      -1 if key was not found.
  477. //-----------------------------------------------------------------------
  478. int FindLowerIndex(const int nKey);
  479. //-----------------------------------------------------------------------
  480. // Summary:
  481. //      Finds index of the element with the key value next to the specified.
  482. // Parameters:
  483. //      nKey : [in] id of element.
  484. // Returns:
  485. //      -1 if key was not found.
  486. //-----------------------------------------------------------------------
  487. int FindUpperIndex(const int nKey);
  488. private:
  489. typedef CArray<XTP_EDIT_LMDATA*, XTP_EDIT_LMDATA*> CXTPSyntaxEditLineMarkPointersArray;
  490. CXTPSyntaxEditLineMarkPointersArray m_array; // The array with the actual line data.
  491. };
  492. public:
  493. typedef CXTPSmartPtrInternalT<CLineMarksList> CLineMarksListPtr; // SmartPointer for the class.
  494. private:
  495. //-----------------------------------------------------------------------
  496. // Summary:
  497. //      This class contains a map of line marks lists corresponding to the
  498. //      string values of line marks types.
  499. //      It allows adding a new list with the new line mark type
  500. //      and retrieving a smart pointer of the requested list by its
  501. //      line mark type.
  502. //-----------------------------------------------------------------------
  503. class CLineMarksListsMap
  504. {
  505. public:
  506. //-----------------------------------------------------------------------
  507. // Summary:
  508. //      Returns list associated with the specified mark type string.
  509. // Parameters:
  510. //      szMarkType  : [in] mark type string.
  511. // See also:
  512. //      CLineMarksListPtr
  513. //-----------------------------------------------------------------------
  514. CLineMarksListPtr GetList(LPCTSTR szMarkType);
  515. //-----------------------------------------------------------------------
  516. // Summary:
  517. //      Adds new list associated with the specified mark type string
  518. // Parameters:
  519. //      szMarkType  : [in] mark type string.
  520. // Returns:
  521. //      Pointer to the added list.
  522. // See also:
  523. //      CLineMarksListPtr
  524. //-----------------------------------------------------------------------
  525. CLineMarksListPtr AddList(LPCTSTR szMarkType);
  526. //-----------------------------------------------------------------------
  527. // Summary:
  528. //      Calls RefreshLineMarks for all lists inside.
  529. // Parameters:
  530. //      nRowFrom        : [in] Start row.
  531. //      nRowTo          : [in] End row.
  532. //      eRefreshType    : [in] Refresh type.
  533. // See also:
  534. //      XTPSyntaxEditLineMarksRefreshType
  535. //-----------------------------------------------------------------------
  536. void RefreshLineMarks(int nRowFrom, int nRowTo, int nRefreshType);
  537. private:
  538. CMap<CString, LPCTSTR, CLineMarksListPtr, CLineMarksListPtr&> m_map; // A map containing line marks lists for every mark type.
  539. };
  540. CLineMarksListsMap m_mapLists; // A collection of line marks lists for all line mark types.
  541. };
  542. #endif // !defined(__XTPSYNTAXEDITLINEMARKSMANAGER_H__)