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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditDrawTextProcessor.h: interface for the CXTPSyntaxEditDrawTextProcessor class.
  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(__XTPSYNTAXEDITDRAWTEXTPROCESSOR_H__)
  22. #define __XTPSYNTAXEDITDRAWTEXTPROCESSOR_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. #include "Common/XTPSmartPtrInternalT.h"
  28. //{{AFX_CODEJOCK_PRIVATE
  29. template<class TYPE, class ARG_TYPE>
  30. class CXTPReserveArray : protected CArray<TYPE, ARG_TYPE>
  31. {
  32. protected:
  33. int m_nDataSize;
  34. public:
  35. CXTPReserveArray()
  36. {
  37. m_nDataSize = 0;
  38. }
  39. int GetDataSize() const
  40. {
  41. return m_nDataSize;
  42. }
  43. void SetDataSize(int nDataSize, int nReservedSize = -1, int nGrowBy = -1)
  44. {
  45. ASSERT(nReservedSize == -1 || nReservedSize >= nDataSize);
  46. nReservedSize = max(nReservedSize, nDataSize);
  47. m_nDataSize = nDataSize;
  48. SetSize(nReservedSize, nGrowBy);
  49. }
  50. void AddData(ARG_TYPE newElement)
  51. {
  52. SetAtGrow(m_nDataSize, newElement);
  53. m_nDataSize++;
  54. }
  55. void RemoveAll()
  56. {
  57. m_nDataSize = 0;
  58. }
  59. TYPE operator[](int nIndex) const
  60. {
  61. ASSERT(nIndex >= 0 && nIndex < GetDataSize());
  62. return GetAt(nIndex);
  63. }
  64. TYPE& operator[](int nIndex)
  65. {
  66. ASSERT(nIndex >= 0 && nIndex < GetDataSize());
  67. return ElementAt(nIndex);
  68. }
  69. // Direct Access to the element data (may return NULL)
  70. const TYPE* GetData() const {
  71. return CArray<TYPE, ARG_TYPE>::GetData();
  72. }
  73. TYPE* GetData() {
  74. return CArray<TYPE, ARG_TYPE>::GetData();
  75. }
  76. };
  77. //}}AFX_CODEJOCK_PRIVATE
  78. //===========================================================================
  79. // Summary:
  80. //      This helper class used by CXTPSyntaxEditCtrl as the Draw Text Processor.
  81. //      It is responsible for drawing chars and remember each char position and
  82. //      other text properties.
  83. //===========================================================================
  84. class _XTP_EXT_CLASS CXTPSyntaxEditDrawTextProcessor
  85. {
  86. public:
  87. //-----------------------------------------------------------------------
  88. // Summary:
  89. //     Default object constructor.
  90. //-----------------------------------------------------------------------
  91. CXTPSyntaxEditDrawTextProcessor();
  92. //-----------------------------------------------------------------------
  93. // Summary:
  94. //      Get a rectangle to draw text.
  95. // Returns:
  96. //      A CRect with rectangle to draw text.
  97. // See Also: SetTextRect
  98. //-----------------------------------------------------------------------
  99. CRect GetTextRect();
  100. //-----------------------------------------------------------------------
  101. // Summary:
  102. //      Set a rectangle to draw text.
  103. // Parameters:
  104. //      rcRect - [in] A CRect object with rectangle to set.
  105. // See Also: GetTextRect
  106. //-----------------------------------------------------------------------
  107. void SetTextRect(const CRect& rcRect);
  108. //-----------------------------------------------------------------------
  109. // Summary:
  110. //      Get a single row height.
  111. // Returns:
  112. //      A single row height.
  113. // See Also: RecalcRowHeight
  114. //-----------------------------------------------------------------------
  115. int GetRowHeight();
  116. //-----------------------------------------------------------------------
  117. // Summary:
  118. //      Use this method to recalculate a single row height.
  119. // Parameters:
  120. //      pDC     : [in] A pointer to device context.
  121. //      pFont   : [in] A pointer to font to calculate.
  122. // Returns:
  123. //      A single row height.
  124. // See Also: GetRowHeight
  125. //-----------------------------------------------------------------------
  126. int RecalcRowHeight(CDC* pDC, CFont* pFont);
  127. //-----------------------------------------------------------------------
  128. // Summary:
  129. //      Get a rows count visible for text rectangle.
  130. // Parameters:
  131. //      bWithPartlyVisible : If this parameter TRUE - partly visible row
  132. //                           will be calculated too, otherwise only full
  133. //                           visible rows count returned.
  134. // Returns:
  135. //      A visible rows count.
  136. // See Also: SetTextRect
  137. //-----------------------------------------------------------------------
  138. int GetRowsCount(BOOL bWithPartlyVisible);
  139. //-----------------------------------------------------------------------
  140. // Summary:
  141. //      Get tab size.
  142. // Returns:
  143. //      A tab size.
  144. // See Also: SetTabSize
  145. //-----------------------------------------------------------------------
  146. int GetTabSize();
  147. //-----------------------------------------------------------------------
  148. // Summary:
  149. //     Sets the tab size.
  150. // Parameters:
  151. //     nTabSize : [in] The tab size to set.
  152. // Remarks:
  153. //     Call this member function to set tab size. Size is measured in
  154. //     space character and should be between 2 to 10.
  155. // See also: GetTabSize
  156. //-----------------------------------------------------------------------
  157. void SetTabSize(int nTabSize);
  158. //-----------------------------------------------------------------------
  159. // Summary:
  160. //      Get scroll offset for x coordinate.
  161. // Returns:
  162. //      A scroll offset for x coordinate.
  163. // See Also: SetScrollXOffset
  164. //-----------------------------------------------------------------------
  165. int GetScrollXOffset();
  166. //-----------------------------------------------------------------------
  167. // Summary:
  168. //      Get scroll offset for x coordinate.
  169. // Parameters:
  170. //      nOffsetX - A scroll offset to set.
  171. // See Also: GetScrollXOffset
  172. //-----------------------------------------------------------------------
  173. void SetScrollXOffset(int nOffsetX);
  174. //-----------------------------------------------------------------------
  175. // Summary:
  176. //      Get current text metrics.
  177. // Returns:
  178. //      A TEXTMETRIC structure.
  179. // See Also: RecalcRowHeight
  180. //-----------------------------------------------------------------------
  181. const TEXTMETRIC& GetTextMetrics();
  182. //-----------------------------------------------------------------------
  183. // Summary:
  184. //      Get space char width in the pixels.
  185. // Returns:
  186. //      A space char width in the pixels.
  187. // See Also: RecalcRowHeight
  188. //-----------------------------------------------------------------------
  189. int GetSpaceWidth();
  190. //-----------------------------------------------------------------------
  191. // Summary:
  192. //      Use this member function to align column index to tabs borders
  193. //      if necessary.
  194. // Parameters:
  195. //      nRow            - A zero based row index.
  196. //      nCol            - A zero based column index.
  197. //      bVirtualSpace   - Is virtual space enabled.
  198. // Returns:
  199. //      An aligned column index.
  200. // See Also: SetTabSize, GetTabSize
  201. //-----------------------------------------------------------------------
  202. int AlignColIdxToTabs(int nRow, int nCol, BOOL bVirtualSpace = FALSE);
  203. //-----------------------------------------------------------------------
  204. // Summary:
  205. //      Use this member function to obtain a specified column x position
  206. //      in pixels.
  207. // Parameters:
  208. //      nRow            - A zero based row index.
  209. //      nCol            - A zero based column index.
  210. //      bVirtualSpace   - Is virtual space enabled.
  211. //      pnChawWidth     - A pointer to int variable to receive column char
  212. //                        width in pixels. May be NULL.
  213. // Returns:
  214. //      A column start x position (in pixels).
  215. // See Also: ColFromXPos
  216. //-----------------------------------------------------------------------
  217. int GetColPosX(int nRow, int nCol, int* pnChawWidth = NULL, BOOL bVirtualSpace = FALSE);
  218. //-----------------------------------------------------------------------
  219. // Summary:
  220. //      Use this member function to obtain a column for specified x position
  221. //      in pixels.
  222. // Parameters:
  223. //      nRow            - A zero based row index.
  224. //      nX              - A x position (in pixels).
  225. //      rnCol           - [out] A zero based column index for x position.
  226. //      bVirtualSpace   - Is virtual space enabled.
  227. // Returns:
  228. //      TRUE if succeeded, FALSE otherwise.
  229. // See Also: GetColPosX, AlignColIdxToTabs
  230. //-----------------------------------------------------------------------
  231. BOOL ColFromXPos(int nRow, int nX, int& rnCol, BOOL bVirtualSpace = FALSE);
  232. //-----------------------------------------------------------------------
  233. // Summary:
  234. //      Use this member function to obtain width of the specified row.
  235. // Parameters:
  236. //      nRow - A zero based row index.
  237. // Returns:
  238. //      A row width in pixels.
  239. // See Also: GetRowsMaxWidth
  240. //-----------------------------------------------------------------------
  241. int GetRowWidth(int nRow);
  242. //-----------------------------------------------------------------------
  243. // Summary:
  244. //      Use this member function to obtain maximum width of all visible rows.
  245. // Returns:
  246. //      A maximum row width in pixels.
  247. // See Also: GetRowsWidth
  248. //-----------------------------------------------------------------------
  249. int GetRowsMaxWidth();
  250. //-----------------------------------------------------------------------
  251. // Summary:
  252. //      Use this member function to obtain a row and column for specified
  253. //      point.
  254. // Parameters:
  255. //      pt              - A point to test.
  256. //      rnRow           - [out] A zero based row index for y position.
  257. //      rnCol           - [out] A zero based column index for x position.
  258. //      bVirtualSpace   - Is virtual space enabled.
  259. // Returns:
  260. //      TRUE if succeeded, FALSE otherwise.
  261. // See Also: GetColPosX, HitTestRow.
  262. //-----------------------------------------------------------------------
  263. BOOL HitTest(const CPoint& pt, int& rnRow, int& rnCol, BOOL bVirtualSpace = FALSE);
  264. //-----------------------------------------------------------------------
  265. // Summary:
  266. //      Use this member function to obtain a row for specified y position.
  267. // Parameters:
  268. //      nY              - An y position (in pixels).
  269. //      rnRow           - [out] A zero based row index for y position.
  270. // Returns:
  271. //      TRUE if succeeded, FALSE otherwise.
  272. // See Also: GetColPosX, HitTest.
  273. //-----------------------------------------------------------------------
  274. BOOL HitTestRow(int nY, int& rnRow);
  275. //-----------------------------------------------------------------------
  276. // Summary:
  277. //      Use this member function to clear cached row information.
  278. // Parameters:
  279. //      nRow    - A zero based row index.
  280. // See Also: DrawRowPart, PrintRowPart.
  281. //-----------------------------------------------------------------------
  282. void ResetRowInfo(int nRow);
  283. //-----------------------------------------------------------------------
  284. // Summary:
  285. //      Use this member function to draw row part and store characters positions.
  286. // Parameters:
  287. //      pDC      - A pointer to device context.
  288. //      nRow     - A zero based row index (or -1 to switch to finish current row drawing).
  289. //      pcszText - A string to draw.
  290. //      nchCount - A chars count to draw.
  291. // Returns:
  292. //      The x offset for next row part.
  293. // See Also:
  294. //      PrintRowPart
  295. //-----------------------------------------------------------------------
  296. int DrawRowPart(CDC* pDC, int nRow, LPCTSTR pcszText, int nchCount = -1);
  297. //-----------------------------------------------------------------------
  298. // Summary:
  299. //      Use this member function to draw row part and store characters positions.
  300. // Parameters:
  301. //      pDC      - A pointer to device context.
  302. //      nRow     - A zero based row index (or -1 to switch to finish current
  303. //                 row drawing).
  304. //      nPosY    - A y offset to print specified row.
  305. //      nFlags   - Additional printing options. The folowing values supported:
  306. //                 DT_CALCRECT, DT_SINGLELINE, DT_WORDBREAK
  307. //      pcszText - A string to draw.
  308. //      nchCount - A chars count to draw.
  309. //      pnPrintedTextLen - A pointer to int variable to receive printed text
  310. //                         length.
  311. // Returns:
  312. //      Printed row height.
  313. // See Also:
  314. //      DrawRowPart
  315. //-----------------------------------------------------------------------
  316. int PrintRowPart(CDC* pDC, int nRow, int nPosY, UINT nFlags, LPCTSTR pcszText,
  317.  int nchCount = -1, int *pnPrintedTextLen = NULL);
  318. //-----------------------------------------------------------------------
  319. // Summary:
  320. //      Expands the character set by putting space in the position of tab.
  321. // Parameters:
  322. //      pszChars - [in] The text to be processed.
  323. //      strBufer - [out] Buffer for text to be created after expansion.
  324. //      nDispPos - [in] The display position to start.
  325. //      bEnableWhiteSpace - [in] The WhiteSpace mode enabled.
  326. // Returns:
  327. //      The end display position after expansion.
  328. //-----------------------------------------------------------------------
  329. int ExpandChars(LPCTSTR pszChars, CString& strBuffer, int nDispPos = 0,
  330. BOOL bEnableWhiteSpace = FALSE);
  331. //-----------------------------------------------------------------------
  332. // Summary:
  333. //      Remembers tabs positions for the row.
  334. // Parameters:
  335. //      nRow            - [in] A zero based row index.
  336. //      pcszOrigRowText - [in] The row text (not expanded).
  337. //-----------------------------------------------------------------------
  338. void SetRowTabPositions(int nRow, LPCTSTR pcszOrigRowText);
  339. //-----------------------------------------------------------------------
  340. // Summary:
  341. //      Convert display position to string position.
  342. // Parameters:
  343. //      nRow            - A zero based row index.
  344. //      nDispPos        - A zero based display column index.
  345. //      bVirtualSpace   - Is virtual space enabled.
  346. // Returns:
  347. //      The string position.
  348. //-----------------------------------------------------------------------
  349. int DispPosToStrPos(int nRow, int nDispPos, BOOL bVirtualSpace);
  350. //-----------------------------------------------------------------------
  351. // Summary:
  352. //      Convert string position to display position.
  353. // Parameters:
  354. //      nRow            - A zero based row index.
  355. //      nStrPos         - A zero based string position.
  356. //      bVirtualSpace   - Is virtual space enabled.
  357. // Returns:
  358. //      The display position.
  359. //-----------------------------------------------------------------------
  360. int StrPosToDispPos(int nRow, int nStrPos, BOOL bVirtualSpace = FALSE);
  361. //-----------------------------------------------------------------------
  362. // Summary:
  363. //      Set caret position. In/out parameters rnCol and rnRow may be
  364. //      adjusted to valid values.
  365. // Parameters:
  366. //      pWnd            - [in] A pinter to caret owner window.
  367. //      pt              - [in] A point to set caret.
  368. //      szSize          - [in] A caret size.
  369. //      rnRow           - [in, out] A zero based row index.
  370. //      nRow            - [in] A zero based row index.
  371. //      rnCol           - [in, out] A zero based column index.
  372. //      bHideCaret      - [in] Hide or show caret.
  373. //      bVirtualSpace   - Is virtual space enabled.
  374. // Returns:
  375. //      Point of the caret position.
  376. //-----------------------------------------------------------------------
  377. CPoint SetCaretPos(CWnd* pWnd, const CSize& szSize, int nRow, int& rnCol,
  378.  BOOL bHideCaret = FALSE, BOOL bVirtualSpace = FALSE);
  379. CPoint SetCaretByPoint(CWnd* pWnd, const CPoint& pt, const CSize& szSize,
  380.  int& rnRow, int& rnCol, BOOL bVirtualSpace = FALSE); //<COMBINE SetCaretPos@CWnd*@const CSize&@int@int&@BOOL@BOOL >
  381. public:
  382. //{{AFX_CODEJOCK_PRIVATE
  383. class _XTP_EXT_CLASS CXTPRowInfo : public CCmdTarget
  384. {
  385. public:
  386. CXTPRowInfo()
  387. {
  388. nMaxWidth = 0;
  389. const int cnReservedSize = 4096;
  390. arCharsEnds.SetDataSize(0, cnReservedSize, cnReservedSize);
  391. arTabs.SetDataSize(0, cnReservedSize, cnReservedSize);
  392. arDispCol2StrPos.SetDataSize(0, cnReservedSize, cnReservedSize);
  393. arStrPos2DispCol.SetDataSize(0, cnReservedSize, cnReservedSize);
  394. }
  395. void Reset()
  396. {
  397. nMaxWidth = 0;
  398. arCharsEnds.RemoveAll();
  399. }
  400. int nMaxWidth;
  401. CXTPReserveArray<int, int> arCharsEnds;
  402. CXTPReserveArray<BYTE, BYTE> arTabs;
  403. CXTPReserveArray<int, int> arDispCol2StrPos;
  404. CXTPReserveArray<int, int> arStrPos2DispCol;
  405. };
  406. CXTPRowInfo* GetRowInfo(int nRow);
  407. //}}AFX_CODEJOCK_PRIVATE
  408. protected:
  409. int         m_nTabSize;     // Store the tab size.
  410. TEXTMETRIC  m_tmText;       // Store text metrics.
  411. int         m_nSpaceWidth;  // Store space char width.
  412. CRect m_rcTextRect;     // Store text rect.
  413. int m_nRowHeight;       // Store row height.
  414. int m_nScrollXOffset;   // Store scroll offset for x coordinate.
  415. int m_nDrawingRow;      // Store currently drawing row.
  416. int m_nNextRowPosX;     // Store x offset to draw next row part.
  417. int     m_nPrintingRow;     // Store currently printing row.
  418. CPoint  m_ptNextPrintPos;   // Store (x, y) offset to print next row part.
  419. BOOL    m_bUseOutputDC;     // Use output DC for calculations.
  420. //{{AFX_CODEJOCK_PRIVATE
  421. typedef CXTPInternalCollectionT<CXTPRowInfo> CXTPRowsInfoArray; //
  422. CXTPRowsInfoArray m_arRows;
  423. //}}AFX_CODEJOCK_PRIVATE
  424. protected:
  425. //{{AFX_CODEJOCK_PRIVATE
  426. // temporary buffers
  427. CArray<int, int>                m_arBuf_aDx;
  428. CXTPReserveArray<TCHAR, TCHAR>  m_arExpandCharsBuffer;
  429. //}}AFX_CODEJOCK_PRIVATE
  430. };
  431. AFX_INLINE const TEXTMETRIC& CXTPSyntaxEditDrawTextProcessor::GetTextMetrics() {
  432. return m_tmText;
  433. }
  434. AFX_INLINE CRect CXTPSyntaxEditDrawTextProcessor::GetTextRect() {
  435. return m_rcTextRect;
  436. }
  437. AFX_INLINE void CXTPSyntaxEditDrawTextProcessor::SetTextRect(const CRect& rcRect) {
  438. m_rcTextRect = rcRect;
  439. }
  440. AFX_INLINE int CXTPSyntaxEditDrawTextProcessor::GetRowHeight() {
  441. return m_nRowHeight;
  442. }
  443. AFX_INLINE int CXTPSyntaxEditDrawTextProcessor::GetTabSize() {
  444. return m_nTabSize;
  445. }
  446. AFX_INLINE void CXTPSyntaxEditDrawTextProcessor::SetTabSize(int nTabSize) {
  447. m_nTabSize = nTabSize;
  448. }
  449. AFX_INLINE int CXTPSyntaxEditDrawTextProcessor::GetScrollXOffset() {
  450. return m_nScrollXOffset;
  451. }
  452. AFX_INLINE int CXTPSyntaxEditDrawTextProcessor::GetRowsCount(BOOL bWithPartlyVisible) {
  453. int nHeight = m_rcTextRect.Height();
  454. int nRowH = max(1, m_nRowHeight);
  455. int nPartly = bWithPartlyVisible ? 1 : 0;
  456. return nHeight / nRowH + ((nHeight % nRowH) ? nPartly : 0);
  457. }
  458. AFX_INLINE int CXTPSyntaxEditDrawTextProcessor::GetSpaceWidth() {
  459. return m_nSpaceWidth;
  460. }
  461. #endif // !defined(__XTPSYNTAXEDITDRAWTEXTPROCESSOR_H__)