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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditUndoManager.h
  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(__XTPSYNTAXEDITUNDOMANAGER_H__)
  22. #define __XTPSYNTAXEDITUNDOMANAGER_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. class CXTPSyntaxEditBufferManager;
  28. class CXTPSyntaxEditCtrl;
  29. //===========================================================================
  30. // Summary:
  31. //      This class represents abstract Edit Control command interface.
  32. //      Its descendants must implement custom Execute and UnExecute
  33. //      functionality depending on a command type.
  34. //
  35. //      This class is used internally by the library only.
  36. //
  37. // See Also: CXTPSyntaxEditUndoRedoManager, CXTPSyntaxEditBatchCommand,
  38. //      CXTPSyntaxEditBufferCommand
  39. //===========================================================================
  40. class _XTP_EXT_CLASS CXTPSyntaxEditCommand : public CObject
  41. {
  42. //{{AFX_CODEJOCK_PRIVATE
  43. DECLARE_DYNAMIC(CXTPSyntaxEditCommand)
  44. //}}AFX_CODEJOCK_PRIVATE
  45. public:
  46. //-----------------------------------------------------------------------
  47. // Summary:
  48. //      A default command destructor.
  49. //      Destroys the command object, handles its cleanup and de-allocation.
  50. //-----------------------------------------------------------------------
  51. virtual ~CXTPSyntaxEditCommand();
  52. //-----------------------------------------------------------------------
  53. // Summary:
  54. //      This is an interface function for operation execution.
  55. // Parameters:
  56. //      lcFrom: [out] Start text position affected by the action.
  57. //      lcTo:   [out] End text position affected by the action.
  58. //      pEditCtrl: [in]  A pointer to edit control.
  59. // Returns:
  60. //      A bitwise combination of the happened edit actions:
  61. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  62. // See also:
  63. //      UnExecute
  64. //-----------------------------------------------------------------------
  65. virtual int Execute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl) = 0;
  66. //-----------------------------------------------------------------------
  67. // Summary:
  68. //      This is an interface function for operation undoing.
  69. // Parameters:
  70. //      lcFrom: [out] Start text position affected by the action.
  71. //      lcTo:   [out] End text position affected by the action.
  72. //      pEditCtrl: [in]  A pointer to edit control.
  73. // Returns:
  74. //      A bitwise combination of the happened edit actions:
  75. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  76. // See also:
  77. //      Execute
  78. //-----------------------------------------------------------------------
  79. virtual int UnExecute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl) = 0;
  80. //-----------------------------------------------------------------------
  81. // Summary:
  82. //      This function is responsible for retrieving action description text.
  83. //
  84. //      Each command have a string describing contained changes,
  85. //      for example for showing in the multiple Undo/Redo dialogs, i.e.
  86. //      "Typing: something", "Delete", "Paste", etc.
  87. //
  88. //      This function allows a command to overwrite its own command text
  89. //      retrieving, for example for adding any specific suffix/prefix, etc.
  90. //
  91. // Returns:
  92. //      Command description string.
  93. // See also:
  94. //      SetCommandText
  95. //-----------------------------------------------------------------------
  96. virtual LPCTSTR GetCommandText();
  97. //-----------------------------------------------------------------------
  98. // Summary:
  99. //      This function is responsible for redefining action description text.
  100. //
  101. //      It allows a command to overwrite command text setting behavior,
  102. //      for example making a text as a suffix/prefix of the description, etc.
  103. //
  104. // Parameters:
  105. //     szText: [in] New description string for the command.
  106. //
  107. // See also:
  108. //      GetCommandText
  109. //-----------------------------------------------------------------------
  110. virtual void SetCommandText(LPCTSTR szText);
  111. //-----------------------------------------------------------------------
  112. // Summary:
  113. //      This member function used to get undo command data size (in bytes).
  114. // Returns:
  115. //      Undo command data size (in bytes).
  116. //-----------------------------------------------------------------------
  117. virtual int GetDataSize();
  118. protected:
  119. //-----------------------------------------------------------------------
  120. // Summary:
  121. //      Protected constructor because this class could not be instantiated
  122. //      itself, only by its descendants
  123. //-----------------------------------------------------------------------
  124. CXTPSyntaxEditCommand();
  125. //-----------------------------------------------------------------------
  126. // Summary:
  127. //      Sets line and a column position for the specified control using
  128. //      internal fast methods.
  129. // Parameters:
  130. //      pEditCtrl : [in] A pointer to edit control.
  131. //      lcPos     : [in] A text position to set to the edit control.
  132. //-----------------------------------------------------------------------
  133. static void SetPositionInternally(CXTPSyntaxEditCtrl* pEditCtrl, const XTP_EDIT_LINECOL& lcPos);
  134. CString m_strCommandText; // A text description of the command.
  135. };
  136. AFX_INLINE void CXTPSyntaxEditCommand::SetCommandText(LPCTSTR szText) {
  137. m_strCommandText = szText;
  138. }
  139. AFX_INLINE LPCTSTR CXTPSyntaxEditCommand::GetCommandText() {
  140. return m_strCommandText;
  141. }
  142. AFX_INLINE int CXTPSyntaxEditCommand::GetDataSize() {
  143. return 0;
  144. }
  145. //===========================================================================
  146. // Summary:
  147. //      This class represents a pack of some commands in one.
  148. //      It stores commands in the list, and implements standard command
  149. //      execution interfaces on command (un)execution.
  150. //
  151. // See Also: CXTPSyntaxEditCommand
  152. //===========================================================================
  153. class _XTP_EXT_CLASS CXTPSyntaxEditBatchCommand : public CXTPSyntaxEditCommand
  154. {
  155. //{{AFX_CODEJOCK_PRIVATE
  156. DECLARE_DYNAMIC(CXTPSyntaxEditBatchCommand)
  157. //}}AFX_CODEJOCK_PRIVATE
  158. public:
  159. CXTPSyntaxEditBatchCommand();
  160. //-----------------------------------------------------------------------
  161. // Summary:
  162. //      A default command destructor.
  163. //      Destroys the command object with all sub-commands,
  164. //      handles its cleanup and de-allocation.
  165. //-----------------------------------------------------------------------
  166. ~CXTPSyntaxEditBatchCommand();
  167. //-----------------------------------------------------------------------
  168. // Summary:
  169. //      Executes batch command by successive execution of all stored commands.
  170. // Parameters:
  171. //      lcFrom      : [out] Start text position affected by the actions chain.
  172. //      lcTo        : [out] End text position affected by the actions chain.
  173. //      pEditCtrl   : [in]  A pointer to edit control.
  174. // Returns:
  175. //      A bitwise combination of the happened edit actions:
  176. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  177. // See also:
  178. //      UnExecute
  179. //-----------------------------------------------------------------------
  180. virtual int Execute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  181. //-----------------------------------------------------------------------
  182. // Summary:
  183. //      Unexecutes batch command by successive undoing of all stored commands.
  184. // Parameters:
  185. //      lcFrom      : [out] Start text position affected by the actions chain.
  186. //      lcTo        : [out] End text position affected by the actions chain.
  187. //      pEditCtrl   : [in]  A pointer to edit control.
  188. // Returns:
  189. //      A bitwise combination of the happened edit actions:
  190. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  191. // See also:
  192. //      Execute
  193. //-----------------------------------------------------------------------
  194. virtual int UnExecute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  195. //-----------------------------------------------------------------------
  196. // Summary:
  197. //      Adds a command to the batch buffer.
  198. // Parameters:
  199. //      pCommand: [in] A pointer to the newly added command.
  200. // Returns:
  201. //      A position of the newly added command inside the internal list.
  202. // Example:
  203. //      pBatchCmd->AddCommand(new CXTPSyntaxEditDeleteStringCommand(...));
  204. //-----------------------------------------------------------------------
  205. POSITION AddCommand(CXTPSyntaxEditCommand* pCommand);
  206. //-----------------------------------------------------------------------
  207. // Summary:
  208. //      Calculates a number of single command items inside the batch
  209. //      command buffer.
  210. // Returns:
  211. //      A number of single command items inside the batch command buffer.
  212. //-----------------------------------------------------------------------
  213. int GetCommandsCount();
  214. //-----------------------------------------------------------------------
  215. // Summary:
  216. //      This member function used to get undo command data size (in bytes).
  217. // Returns:
  218. //      Undo command data size (in bytes).
  219. //-----------------------------------------------------------------------
  220. virtual int GetDataSize();
  221. protected:
  222. //-----------------------------------------------------------------------
  223. // Summary:
  224. //      Clears batch command buffer and delete all commands.
  225. //-----------------------------------------------------------------------
  226. void Clear();
  227. CPtrList m_CommandList;   // Commands buffer storage.
  228. };
  229. //===========================================================================
  230. // Summary:
  231. //      The base class for all edit commands related to CXTPSyntaxEditBufferManager.
  232. //      It stores handle of the buffer manager, and provides implementation
  233. //      of common buffer operations, such as text insertion or deletion.
  234. //
  235. // See Also:
  236. //      CXTPSyntaxEditCommand, CXTPSyntaxEditInsertStringCommand,
  237. //      CXTPSyntaxEditDeleteStringCommand
  238. //===========================================================================
  239. class _XTP_EXT_CLASS CXTPSyntaxEditBufferCommand : public CXTPSyntaxEditCommand
  240. {
  241. //{{AFX_CODEJOCK_PRIVATE
  242. DECLARE_DYNAMIC(CXTPSyntaxEditBufferCommand)
  243. //}}AFX_CODEJOCK_PRIVATE
  244. public:
  245. //-----------------------------------------------------------------------
  246. // Summary:
  247. //      A default command destructor.
  248. //      Destroys the command object, handles its cleanup and de-allocation.
  249. //-----------------------------------------------------------------------
  250. virtual ~CXTPSyntaxEditBufferCommand();
  251. protected:
  252. //-----------------------------------------------------------------------
  253. // Summary:
  254. //      Creates the buffer command object, initializes its members.
  255. // Parameters:
  256. //      pMgr:   [in] Pointer to the associated buffer manager object.
  257. //      szText: [in] A text which was changed during buffer operation.
  258. //              It will be used for insert/remove text operations.
  259. //      lcFrom: [in] Start text position affected by the command.
  260. //      lcTo:   [in] End text position affected by the command.
  261. //-----------------------------------------------------------------------
  262. CXTPSyntaxEditBufferCommand(CXTPSyntaxEditBufferManager* pMgr,
  263. LPCTSTR szText, const XTP_EDIT_LINECOL& lcFrom, const XTP_EDIT_LINECOL& lcTo);
  264. CXTPSyntaxEditBufferManager* m_pBufferMgr; // Pointer to the associated text buffer.
  265. //=======================================================================
  266. // Summary:
  267. //  Keeps buffer overwrite flag for the specified buffer manager from
  268. //  class construction until destruction, and resets this flag to FALSE
  269. //  during class lifetime.
  270. // Example:
  271. //  void DoSomething()
  272. //  {
  273. //      CXTPSyntaxEditBufferKeepOverwriteSettings bufOwr(m_pBufferMgr);
  274. //      ...
  275. //  }
  276. //=======================================================================
  277. class CXTPSyntaxEditBufferKeepOverwriteSettings
  278. {
  279. public:
  280. //-------------------------------------------------------------------
  281. // Summary:
  282. //      Creates the object and stores buffer overwrite settings.
  283. // Parameters:
  284. //      pBufferMgr: [in] Pointer to the associated buffer manager object.
  285. //-------------------------------------------------------------------
  286. CXTPSyntaxEditBufferKeepOverwriteSettings(CXTPSyntaxEditBufferManager* pBufferMgr);
  287. //-------------------------------------------------------------------
  288. // Summary:
  289. //      Destroys the object and restore buffer overwrite settings.
  290. //-------------------------------------------------------------------
  291. virtual ~CXTPSyntaxEditBufferKeepOverwriteSettings();
  292. private:
  293. CXTPSyntaxEditBufferManager* m_pBufMgr; // Associated buffer manager
  294. BOOL m_bOldSettings;    // Stored buffer overwrite settings.
  295. };
  296. //-----------------------------------------------------------------------
  297. // Summary:
  298. //      Inserts stored text at the stored positions, and returns start and
  299. //      final affected text positions.
  300. // Parameters:
  301. //      lcFrom:     [out] Start text position affected by the command.
  302. //      lcTo:       [out] End text position affected by the command.
  303. //      pEditCtrl:  [in]  A pointer to edit control.
  304. // Returns:
  305. //      A bitwise combination of the happened edit actions:
  306. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  307. // See also:
  308. //      DoDeleteText
  309. //-----------------------------------------------------------------------
  310. int DoInsertText(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  311. //-----------------------------------------------------------------------
  312. // Summary:
  313. //      Deletes text at the stored positions, and returns start and
  314. //      final affected text positions.
  315. // Parameters:
  316. //      lcFrom:     [out] Start text position affected by the command.
  317. //      lcTo:       [out] End text position affected by the command.
  318. //      pEditCtrl:  [in]  A pointer to edit control.
  319. // Returns:
  320. //      A bitwise combination of the happened edit actions:
  321. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  322. // See also:
  323. //      DoInsertText
  324. //-----------------------------------------------------------------------
  325. int DoDeleteText(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  326. //-----------------------------------------------------------------------
  327. // Summary:
  328. //      This member function used to get undo command data size (in bytes).
  329. // Returns:
  330. //      Undo command data size (in bytes).
  331. //-----------------------------------------------------------------------
  332. virtual int GetDataSize();
  333. protected:
  334. CString m_strText;      // Stored changed text.
  335. XTP_EDIT_LINECOL m_lcFrom; // Start edit position.
  336. XTP_EDIT_LINECOL m_lcTo;       // End edit position.
  337. };
  338. AFX_INLINE int CXTPSyntaxEditBufferCommand::GetDataSize() {
  339. return m_strText.GetLength() * sizeof(TCHAR);
  340. }
  341. //===========================================================================
  342. // Summary:
  343. //      This class represents text insertion command.
  344. //      Command execution will insert a specified text string in the buffer,
  345. //      un-execution will delete this text from the buffer.
  346. //
  347. // See Also:
  348. //      CXTPSyntaxEditBufferCommand,    CXTPSyntaxEditDeleteStringCommand
  349. //===========================================================================
  350. class _XTP_EXT_CLASS CXTPSyntaxEditInsertStringCommand : public CXTPSyntaxEditBufferCommand
  351. {
  352. //{{AFX_CODEJOCK_PRIVATE
  353. DECLARE_DYNAMIC(CXTPSyntaxEditInsertStringCommand)
  354. //}}AFX_CODEJOCK_PRIVATE
  355. public:
  356. //-----------------------------------------------------------------------
  357. // Summary:
  358. //      Creates the insert string command object, initializes its members.
  359. // Parameters:
  360. //      pMgr:   [in] Pointer to the associated buffer manager object.
  361. //      szText: [in] A text which was changed during buffer operation.
  362. //              It will be used for insert/remove text operations.
  363. //      lcFrom: [in] Start text position affected by the command.
  364. //      lcTo:   [in] End text position affected by the command.
  365. //-----------------------------------------------------------------------
  366. CXTPSyntaxEditInsertStringCommand(CXTPSyntaxEditBufferManager* pMgr,
  367. LPCTSTR szText, const XTP_EDIT_LINECOL& lcFrom, const XTP_EDIT_LINECOL& lcTo);
  368. //-----------------------------------------------------------------------
  369. // Summary:
  370. //      A default command destructor.
  371. //      Destroys the command object, handles its cleanup and de-allocation.
  372. //-----------------------------------------------------------------------
  373. virtual ~CXTPSyntaxEditInsertStringCommand();
  374. //-----------------------------------------------------------------------
  375. // Summary:
  376. //      Executes insert string command.
  377. // Parameters:
  378. //      lcFrom: [out] Start text position affected by the command.
  379. //      lcTo:   [out] End text position affected by the command.
  380. //      pEditCtrl: [in] A pointer to edit control.
  381. // Returns:
  382. //      A bitwise combination of the happened edit actions:
  383. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_INSERTROW
  384. // See also:
  385. //      UnExecute
  386. //-----------------------------------------------------------------------
  387. virtual int Execute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  388. //-----------------------------------------------------------------------
  389. // Summary:
  390. //      Unexecutes insert string command (i.e. deletes the string).
  391. // Parameters:
  392. //      lcFrom: [out] Start text position affected by the command.
  393. //      lcTo:   [out] End text position affected by the command.
  394. //      pEditCtrl: [in] A pointer to edit control.
  395. // Returns:
  396. //      A bitwise combination of the happened edit actions:
  397. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW
  398. // See also:
  399. //      Execute
  400. //-----------------------------------------------------------------------
  401. virtual int UnExecute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  402. };
  403. //===========================================================================
  404. // Summary:
  405. //      This class represents text deletion command.
  406. //      Command execution will delete text from the buffer between specified
  407. //      text positions, its un-execution will insert this text into the buffer.
  408. //
  409. // See Also:
  410. //      CXTPSyntaxEditBufferCommand,    CXTPSyntaxEditInsertStringCommand
  411. //===========================================================================
  412. class _XTP_EXT_CLASS CXTPSyntaxEditDeleteStringCommand : public CXTPSyntaxEditBufferCommand
  413. {
  414. //{{AFX_CODEJOCK_PRIVATE
  415. DECLARE_DYNAMIC(CXTPSyntaxEditDeleteStringCommand)
  416. //}}AFX_CODEJOCK_PRIVATE
  417. public:
  418. //-----------------------------------------------------------------------
  419. // Summary:
  420. //      Creates the delete string command object, initializes its members.
  421. // Parameters:
  422. //      pMgr:   [in] Pointer to the associated buffer manager object.
  423. //      szText: [in] A text which was changed during buffer operation.
  424. //              It will be used for insert/remove text operations.
  425. //      lcFrom: [in] Start text position affected by the command.
  426. //      lcTo:   [in] End text position affected by the command.
  427. //-----------------------------------------------------------------------
  428. CXTPSyntaxEditDeleteStringCommand(CXTPSyntaxEditBufferManager* pMgr,
  429. LPCTSTR szText, const XTP_EDIT_LINECOL& lcFrom, const XTP_EDIT_LINECOL& lcTo);
  430. //-----------------------------------------------------------------------
  431. // Summary:
  432. //      A default command destructor.
  433. //      Destroys the command object, handles its cleanup and de-allocation.
  434. //-----------------------------------------------------------------------
  435. virtual ~CXTPSyntaxEditDeleteStringCommand();
  436. //-----------------------------------------------------------------------
  437. // Summary:
  438. //      Executes delete string command.
  439. // Parameters:
  440. //      lcFrom: [out] Start text position affected by the command.
  441. //      lcTo:   [out] End text position affected by the command.
  442. //      pEditCtrl: [in] A pointer to edit control.
  443. // Returns:
  444. //      A bitwise combination of the happened edit actions:
  445. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW
  446. // See also:
  447. //      UnExecute
  448. //-----------------------------------------------------------------------
  449. virtual int Execute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  450. //-----------------------------------------------------------------------
  451. // Summary:
  452. //      Unexecutes delete string command (i.e. inserts the string).
  453. // Parameters:
  454. //      lcFrom: [out] Start text position affected by the command.
  455. //      lcTo:   [out] End text position affected by the command.
  456. //      pEditCtrl: [in] A pointer to edit control.
  457. // Returns:
  458. //      A bitwise combination of the happened edit actions:
  459. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_INSERTROW
  460. // See also:
  461. //      Execute
  462. //-----------------------------------------------------------------------
  463. virtual int UnExecute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  464. };
  465. //===========================================================================
  466. // Summary:
  467. //      This class represents text replacing command.
  468. //      Command execution will replace text from the buffer between specified
  469. //      text positions, un-execution will do contrary replacement.
  470. //
  471. // See Also:
  472. //      CXTPSyntaxEditBufferCommand
  473. //===========================================================================
  474. class _XTP_EXT_CLASS CXTPSyntaxEditReplaceStringCommand : public CXTPSyntaxEditBufferCommand
  475. {
  476. //{{AFX_CODEJOCK_PRIVATE
  477. DECLARE_DYNAMIC(CXTPSyntaxEditReplaceStringCommand)
  478. //}}AFX_CODEJOCK_PRIVATE
  479. public:
  480. //-----------------------------------------------------------------------
  481. // Summary:
  482. //      Creates the replace string command object, initializes its members.
  483. // Parameters:
  484. //      pMgr:   [in] Pointer to the associated buffer manager object.
  485. //      szText: [in] A text which was insert during buffer operation.
  486. //      szReplacedText: [in] A text which was changed during buffer operation.
  487. //      lcFrom: [in] Start text position affected by the command.
  488. //      lcTo:   [in] End text position affected by the command.
  489. //-----------------------------------------------------------------------
  490. CXTPSyntaxEditReplaceStringCommand(CXTPSyntaxEditBufferManager* pMgr,
  491. LPCTSTR szText, LPCTSTR szReplacedText, const XTP_EDIT_LINECOL& lcFrom, const XTP_EDIT_LINECOL& lcTo);
  492. //-----------------------------------------------------------------------
  493. // Summary:
  494. //      A default command destructor.
  495. //      Destroys the command object, handles its cleanup and de-allocation.
  496. //-----------------------------------------------------------------------
  497. virtual ~CXTPSyntaxEditReplaceStringCommand();
  498. //-----------------------------------------------------------------------
  499. // Summary:
  500. //      Executes delete string command.
  501. // Parameters:
  502. //      lcFrom: [out] Start text position affected by the command.
  503. //      lcTo:   [out] End text position affected by the command.
  504. //      pEditCtrl: [in] A pointer to edit control.
  505. // Returns:
  506. //      A bitwise combination of the happened edit actions:
  507. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW
  508. // See also:
  509. //      UnExecute
  510. //-----------------------------------------------------------------------
  511. virtual int Execute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  512. //-----------------------------------------------------------------------
  513. // Summary:
  514. //      Unexecutes delete string command (i.e. inserts the string).
  515. // Parameters:
  516. //      lcFrom: [out] Start text position affected by the command.
  517. //      lcTo:   [out] End text position affected by the command.
  518. //      pEditCtrl: [in] A pointer to edit control.
  519. // Returns:
  520. //      A bitwise combination of the happened edit actions:
  521. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_INSERTROW
  522. // See also:
  523. //      Execute
  524. //-----------------------------------------------------------------------
  525. virtual int UnExecute(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  526. //-----------------------------------------------------------------------
  527. // Summary:
  528. //      This member function used to get undo command data size (in bytes).
  529. // Returns:
  530. //      Undo command data size (in bytes).
  531. //-----------------------------------------------------------------------
  532. virtual int GetDataSize();
  533. protected:
  534. CString m_strReplacedText; // Buffer which holds replaced text.
  535. //-----------------------------------------------------------------------
  536. // Summary:
  537. //      Performs text replacement operation.
  538. // Parameters:
  539. //      szText: [in] A text to replace to.
  540. //      lcFrom: [out] Start text position affected by the command.
  541. //      lcTo:   [out] End text position affected by the command.
  542. //      pEditCtrl: [in] A pointer to edit control.
  543. // Returns:
  544. //      A bitwise combination of the happened edit actions:
  545. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_INSERTROW
  546. //-----------------------------------------------------------------------
  547. int DoReplaceText(LPCTSTR szText, XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo,
  548.   CXTPSyntaxEditCtrl* pEditCtrl);
  549. };
  550. AFX_INLINE int CXTPSyntaxEditReplaceStringCommand::GetDataSize() {
  551. return m_strReplacedText.GetLength() * sizeof(TCHAR) +
  552.    CXTPSyntaxEditBufferCommand::GetDataSize();
  553. }
  554. //===========================================================================
  555. // Summary:
  556. //      This class maintains the list of undo/redo commands.
  557. //      It is managed by CEditBufferManager class.
  558. //
  559. //      It allows adding new commands in the buffer (see AddCommand()),
  560. //      undoing last added operation (see DoUndo()), and redoing
  561. //      operations following the latest unexecuted (see DoRedo()).
  562. //
  563. //      It also allows checking for the possibility of performing undo/redo
  564. //      operations (see CanUndo() / CanRedo()).
  565. //
  566. //      It also allows marking current position of undo/redo operation queue
  567. //      as saved, and returns "modified" flag if the queue position will
  568. //      be changed (see MarkSaved() / IsModified()).
  569. //
  570. //      Another piece of the functionality is commands grouping. There are
  571. //      following methods related to this: SetGroupInsertMode() and
  572. //      ChainLastCommand(). The second one forces latest added undo
  573. //      command to be merged in group with the previous one. It could be
  574. //      useful for group operations like moving a selected text by mouse.
  575. //      In this case there will be 2 different commands added: remove
  576. //      selected text from its original position, and insert it into the
  577. //      new position. By using ChainLastCommand() methods both these
  578. //      operations will be merged into the single one, which will be
  579. //      further done/undone together.
  580. //      The first method SetGroupInsertMode() forces undo/redo manager
  581. //      to merge in the single chain all added operations. For example,
  582. //      it could be useful when the user is typing some text, which
  583. //      could be later done/undoe in the single word, instead of by each
  584. //      character.
  585. //
  586. //      Also, one more piece of functionality is related to the command
  587. //      description text management. Related functions allow setting the
  588. //      new text description for the last undo command (SetLastCommandText()).
  589. //      As an example, it could be used after ChainLastCommand() method
  590. //      for setting new description for the merged command ('Move' instead
  591. //      of 'Delete'+'Insert').
  592. //      Another 2 functions allow retrieving string description lists
  593. //      for the list of undo and redo commands (GetUndoTextList() /
  594. //      GetRedoTextList()).
  595. //
  596. //      However, this class is used internally by the library only.
  597. //
  598. // See Also:
  599. //      CXTPSyntaxEditCommand
  600. //===========================================================================
  601. class _XTP_EXT_CLASS CXTPSyntaxEditUndoRedoManager
  602. {
  603. public:
  604. //-----------------------------------------------------------------------
  605. // Summary:
  606. //      Creates the undo/redo manager object, initializes its members.
  607. //-----------------------------------------------------------------------
  608. CXTPSyntaxEditUndoRedoManager();
  609. //-----------------------------------------------------------------------
  610. // Summary:
  611. //      Destroys the undo/redo manager object,
  612. //      handles its cleanup and de-allocation.
  613. //-----------------------------------------------------------------------
  614. virtual ~CXTPSyntaxEditUndoRedoManager();
  615. //-----------------------------------------------------------------------
  616. // Summary:
  617. //      Perform single undo operation:
  618. //      Unexecutes the latest command.
  619. // Parameters:
  620. //      lcFrom    - [out] Start text position affected by the command.
  621. //      lcTo      - [out] End text position affected by the command.
  622. //      pEditCtrl - [in] A pointer to edit control.
  623. // Returns:
  624. //      A bitwise combination of the affected edit actions.
  625. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  626. // See also:
  627. //      DoRedo
  628. //-----------------------------------------------------------------------
  629. int DoUndo(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  630. //-----------------------------------------------------------------------
  631. // Summary:
  632. //      Perform single redo operation:
  633. //      Executes the next command.
  634. // Parameters:
  635. //      lcFrom    - [out] Start text position affected by the command.
  636. //      lcTo      - [out] End text position affected by the command.
  637. //      pEditCtrl - [in] A pointer to edit control.
  638. // Returns:
  639. //      A bitwise combination of the affected edit actions.
  640. //      XTP_EDIT_EDITACTION_MODIFYROW, XTP_EDIT_EDITACTION_DELETEROW, XTP_EDIT_EDITACTION_INSERTROW
  641. // See also:
  642. //      DoUndo
  643. //-----------------------------------------------------------------------
  644. int DoRedo(XTP_EDIT_LINECOL& lcFrom, XTP_EDIT_LINECOL& lcTo, CXTPSyntaxEditCtrl* pEditCtrl);
  645. //-----------------------------------------------------------------------
  646. // Summary:
  647. //      Perform undo operation:
  648. //      Unexecutes <i>nCount</i> last commands.
  649. // Parameters:
  650. //      nCount: [in] A number of commands to execute Undo.
  651. // See also:
  652. //      DoRedo
  653. //-----------------------------------------------------------------------
  654. //void DoUndo(int nCount);
  655. //-----------------------------------------------------------------------
  656. // Summary:
  657. //      Perform redo operation:
  658. //      Executes <i>nCount</i> next commands.
  659. // Parameters:
  660. //      nCount: [in] A number of commands to execute Redo.
  661. // See also:
  662. //      DoUndo
  663. //-----------------------------------------------------------------------
  664. //void DoRedo(int nCount);
  665. //-----------------------------------------------------------------------
  666. // Summary:
  667. //      Add command to the undo buffer.
  668. //      Delete all redo commands if exist.
  669. // Parameters:
  670. //      pCommand:   [in] A pointer of the command to add.
  671. //-----------------------------------------------------------------------
  672. void AddCommand(CXTPSyntaxEditCommand* pCommand);
  673. //-----------------------------------------------------------------------
  674. // Summary:
  675. //      Clears the undo manager buffer and delete all commands.
  676. //-----------------------------------------------------------------------
  677. void Clear();
  678. //-----------------------------------------------------------------------
  679. // Summary:
  680. //      Calculate possibility to perform undo action.
  681. // Returns:
  682. //      TRUE if performing undo action is possible, FALSE otherwise.
  683. // See also:
  684. //      CanRedo
  685. //-----------------------------------------------------------------------
  686. BOOL CanUndo();
  687. //-----------------------------------------------------------------------
  688. // Summary:
  689. //      Calculate possibility to perform redo action.
  690. // Returns:
  691. //      TRUE if performing redo action is possible, FALSE otherwise.
  692. // See also:
  693. //      CanUndo
  694. //-----------------------------------------------------------------------
  695. BOOL CanRedo();
  696. //-----------------------------------------------------------------------
  697. // Summary:
  698. //      Marks current command buffer position as last saved.
  699. //      Used for the further calculating modified flag.
  700. // See also:
  701. //      IsModified
  702. //-----------------------------------------------------------------------
  703. void MarkSaved();
  704. //-----------------------------------------------------------------------
  705. // Summary:
  706. //      Checks whether the document was modified by any command from the
  707. //      buffer since the last document saving or loading.
  708. // Returns:
  709. //      TRUE if any action was performed since last saving, FALSE otherwise.
  710. // See also:
  711. //      MarkSaved
  712. //-----------------------------------------------------------------------
  713. BOOL IsModified();
  714. //-----------------------------------------------------------------------
  715. // Summary:
  716. //      Group insert mode is required when a user is typing certain text
  717. //      in normal INS mode. In the time of undo/redo a group of text is
  718. //      undone in a single shot. This setting is cleared in the case of
  719. //      overwrite mode or while user presses SPACE, TAB, ENTER etc.
  720. // Parameters:
  721. //      bInsertInGroup: [in] Pass TRUE to switch group insert mode on,
  722. //                           FALSE otherwise
  723. // See also:
  724. //      ChainLastCommand
  725. //-----------------------------------------------------------------------
  726. void SetGroupInsertMode(BOOL bInsertInGroup = TRUE);
  727. //-----------------------------------------------------------------------
  728. // Summary:
  729. //      Forces latest Undo command to merge in batch command with the
  730. //      previous one.
  731. // See also:
  732. //      SetGroupInsertMode
  733. //-----------------------------------------------------------------------
  734. void ChainLastCommand();
  735. //-----------------------------------------------------------------------
  736. // Summary:
  737. //      Changes the text for the last undo command in the stack.
  738. // Parameters:
  739. //      szText: [in] A text to be set on the last undo command.
  740. // See also:
  741. //      GetUndoTextList, GetRedoTextList
  742. //-----------------------------------------------------------------------
  743. void SetLastCommandText(LPCTSTR szText);
  744. //-----------------------------------------------------------------------
  745. // Summary:
  746. //      Changes the text for the last undo command in the stack.
  747. // Parameters:
  748. //      nTextId:[in] A resource text identifier of the text string
  749. //                   to be set on the last undo command.
  750. // See also:
  751. //      GetUndoTextList, GetRedoTextList
  752. //-----------------------------------------------------------------------
  753. void SetLastCommandText(UINT nTextId);
  754. //-----------------------------------------------------------------------
  755. // Summary:
  756. //      Returns the list of text for undo operations.
  757. // Returns:
  758. //      The text list for undo operations.
  759. // See also:
  760. //      GetRedoTextList, SetLastCommandText
  761. //-----------------------------------------------------------------------
  762. const CStringList& GetUndoTextList();
  763. //-----------------------------------------------------------------------
  764. // Summary:
  765. //      Returns the list of text for redo operations.
  766. // Returns:
  767. //      The texts for redo.
  768. // See also:
  769. //      GetUndoTextList, SetLastCommandText
  770. //-----------------------------------------------------------------------
  771. const CStringList& GetRedoTextList();
  772. //-----------------------------------------------------------------------
  773. // Summary:
  774. //      This member function used to get undo buffer data size (in bytes).
  775. // Returns:
  776. //      Undo buffer data size (in bytes).
  777. //-----------------------------------------------------------------------
  778. virtual int GetDataSize();
  779. //-----------------------------------------------------------------------
  780. // Summary:
  781. //      This member function used to check undo buffer data size and remove
  782. //      old stored commands to clear memory if data size limit is reached.
  783. // Parameters:
  784. //      nNewCommandData - The size of new undo command to be added (in bytes).
  785. //      nDataSizeLimit  - The maximum data size to store in undo buffer.
  786. //-----------------------------------------------------------------------
  787. virtual void LimitDataSize(int nNewCommandData, int nDataSizeLimit);
  788. private:
  789. //-----------------------------------------------------------------------
  790. // Summary:
  791. //      Removes command queue tail after the current element.
  792. //-----------------------------------------------------------------------
  793. void RemoveTail();
  794. protected:
  795. CPtrList m_CommandList;   // Commands buffer.
  796. POSITION m_posFirstUndo;  // Actual command position in the buffer.
  797. POSITION m_posSavedMark;  // Last saved command position in the buffer.
  798. BOOL m_bGroupInsertMode;  // TRUE if group insert mode is on, FALSE otherwise
  799. int  m_nDataSizeLimit;    // The memory limit for undo data.
  800. private:
  801. CStringList m_lstUndoText;  // A temporary storage for undo text strings.
  802. CStringList m_lstRedoText;  // A temporary storage for redo text strings.
  803. };
  804. #endif // !defined(__XTPSYNTAXEDITUNDOMANAGER_H__)