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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditLexClass.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(__XTPSYNTAXEDITLEXCLASS_H__)
  22. #define __XTPSYNTAXEDITLEXCLASS_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. //#pragma warning(disable: 4097 4786)
  28. //============================================================================
  29. // Summary:
  30. //      XTPSyntaxEditLexAnalyser namespace is used group text parser
  31. //      classes, separate them from others and to make class names shorter
  32. //      without risk to be duplicated.
  33. //============================================================================
  34. namespace XTPSyntaxEditLexAnalyser
  35. {
  36. //========================================================================
  37. // Summary:
  38. //      CXTPSyntaxEditLexVariable class is used to represent lexical variables.
  39. //      In the class schema variables begins from symbol <b>@<b>.
  40. //      Standard variables are: @alpha, @digit, @HexDigit, @specs, @EOL.
  41. // See Also:
  42. //      Classes schema syntax.
  43. //========================================================================
  44. class _XTP_EXT_CLASS CXTPSyntaxEditLexVariable
  45. {
  46. public:
  47. //--------------------------------------------------------------------
  48. // Summary:
  49. //      Default object constructor.
  50. //--------------------------------------------------------------------
  51. CXTPSyntaxEditLexVariable();
  52. //--------------------------------------------------------------------
  53. // Summary:
  54. //      Default object destructor.
  55. //--------------------------------------------------------------------
  56. virtual ~CXTPSyntaxEditLexVariable();
  57. //--------------------------------------------------------------------
  58. // Summary:
  59. //      XTPSyntaxEditLexVarID type defines the constants used to identify
  60. //      standard lexical variables: @alpha, @digit, @HexDigit,
  61. //      @specs, @EOL.
  62. // See Also:
  63. //      CXTPSyntaxEditLexVariable::m_nVarID
  64. //--------------------------------------------------------------------
  65. enum XTPSyntaxEditLexVarID
  66. {
  67. xtpEditVarID_Unknown    = 0, // Undefined value.
  68. xtpEditVarID_alpha      = 1, // ID for lex variable - @alpha
  69. xtpEditVarID_digit      = 2, // ID for lex variable - @digit
  70. xtpEditVarID_HexDigit   = 3, // ID for lex variable - @HexDigit
  71. xtpEditVarID_specs      = 4, // ID for lex variable - @specs
  72. xtpEditVarID_EOL        = 5, // ID for lex variable - @EOL
  73. // values from 0 to 100 are reserved.
  74. // for custom variables IDs please use values bigger than 100
  75. };
  76. //--------------------------------------------------------------------
  77. // Summary:
  78. //      XTPSyntaxEditLexVarFlags type defines the constants used to
  79. //      specify additional lex variable properties.
  80. // See Also:
  81. //      CXTPSyntaxEditLexVariable::m_nVarFlags.
  82. //--------------------------------------------------------------------
  83. enum XTPSyntaxEditLexVarFlags
  84. {
  85. xtpEditVarfNot      = 0x001, // specify <b>NOT</b> operation for the lex variable.
  86. // values from 0 to 0xFFFF are reserved.
  87. // for custom flags please use values bigger than 0xFFFF
  88. };
  89. //--------------------------------------------------------------------
  90. int m_nVarID;    // Lex variable identifier.
  91. CString m_strVar;
  92. int m_nVarFlags; // Additional lex variable properties (flags).
  93. //--------------------------------------------------------------------
  94. //--------------------------------------------------------------------
  95. // Summary:
  96. //      Copy operator.
  97. // Parameters:
  98. //      rSrc :  [in] Constant reference to the source object.
  99. // Returns:
  100. //      Constant reference to the destination object.
  101. // Remarks:
  102. //      This operator fill object members using source object
  103. //      values.
  104. // See also:
  105. //      Operator copy (=) in C++.
  106. //--------------------------------------------------------------------
  107. const CXTPSyntaxEditLexVariable& operator=(const CXTPSyntaxEditLexVariable& rSrc);
  108. //--------------------------------------------------------------------
  109. // Summary:
  110. //      Set object members using string lex variable
  111. //      representation.
  112. // Parameters:
  113. //      pcszVarName :   [in] string lex variable representation (with
  114. //                      flags). Like "@alpha" or "@digit:not".
  115. // Returns:
  116. //      TRUE if successful, otherwise - FALSE.
  117. // Remarks:
  118. //      This method parse specified string and determine
  119. //      standard lex variable ID and additional flags.
  120. // See also:
  121. //      CXTPSyntaxEditLexVariable::GetVarID()
  122. //--------------------------------------------------------------------
  123. virtual BOOL SetVariable(LPCTSTR pcszVarName);
  124. //--------------------------------------------------------------------
  125. // Summary:
  126. //      Equal-to operator.
  127. // Parameters:
  128. //      rSrc :  [in] Constant reference to the other object.
  129. // Returns:
  130. //      It returns TRUE if both operands have the same value;
  131. //      otherwise, it returns FALSE.
  132. // Remarks:
  133. //      This operator determine are objects equal.
  134. // See also:
  135. //      Equality Operators in C++.
  136. //--------------------------------------------------------------------
  137. BOOL operator == (const CXTPSyntaxEditLexVariable& rSrc) const;
  138. //--------------------------------------------------------------------
  139. // Summary:
  140. //      Determine standard lex variable ID using string lex
  141. //      variable representation.
  142. // Parameters:
  143. //      pcszVarName :   [in] string lex variable representation (without
  144. //                      flags). Like "@alpha" or "@digit".
  145. // Returns:
  146. //      xtpEditVarID_Unknown if fails, otherwise, if successful,
  147. //      other value from enum XTPSyntaxEditLexVarID.
  148. // Remarks:
  149. //      This method determine standard lex variable ID using
  150. //      specified string.
  151. // See also:
  152. //      CXTPSyntaxEditLexVariable::XTPSyntaxEditLexVarID type,
  153. //      CXTPSyntaxEditLexVariable::SetVariable()
  154. //--------------------------------------------------------------------
  155. static int AFX_CDECL GetVarID(LPCTSTR pcszVarName);
  156. //-----------------------------------------------------------------------
  157. // Summary:
  158. //      This method is used to get lex variable chars.
  159. // Parameters:
  160. //      nVarID     - [in] A value from CXTPSyntaxEditLexVariable::XTPSyntaxEditLexVarID enum.
  161. //      rarVarData - [out] A reference to CStringArray to get data.
  162. // Returns:
  163. //      TRUE if successful, otherwise - FALSE.
  164. // See Also:
  165. //      CXTPSyntaxEditLexVariable::XTPSyntaxEditLexVarID
  166. //-----------------------------------------------------------------------
  167. static BOOL AFX_CDECL GetVariableData(int nVarID, CStringArray& rarVarData);
  168. protected:
  169. //--------------------------------------------------------------------
  170. // Summary:
  171. //      Initialize internal Lex variable name to ID map.
  172. // Remarks:
  173. //      This method initialize internal Lex variable name to
  174. //      ID map if it is not yet initialized.
  175. // See also:
  176. //      CXTPSyntaxEditLexVariable::s_mapVar2ID,
  177. //      CXTPSyntaxEditLexVariable::s_bVarMapInitialized()
  178. //--------------------------------------------------------------------
  179. static void AFX_CDECL InitStandartVarsIfNeed();
  180. static CMapStringToPtr  s_mapVar2ID; // Lex variable name to ID map.
  181. static BOOL             s_bVarMapInitialized; // Is initialized state of the lex variable name to ID map.
  182. };
  183. //===========================================================================
  184. // Summary: Enumerates types of values which supported by CXTPSyntaxEditLexVariant class.
  185. // See also: CXTPSyntaxEditLexVariant
  186. //===========================================================================
  187. enum XTPSyntaxEditLexVariantType
  188. {
  189. xtpEditLVT_Unknown      = 0,        // designates unknown type of value
  190. xtpEditLVT_className    = 0x0001,   // designates value of lex class name (or class names array) type
  191. xtpEditLVT_classPtr     = 0x0002,   // designates value of lex class Pointer type
  192. xtpEditLVT_LVArrayPtr   = 0x0004,   // designates value of LexVariants array Pointer type
  193. xtpEditLVT_valInt       = 0x0100,   // designates value of integer type
  194. xtpEditLVT_valStr       = 0x0200,   // designates value of character string (or string array) type
  195. xtpEditLVT_valVar       = 0x0400,   // designates value of lex variable
  196. };
  197. //===========================================================================
  198. // Summary:
  199. //      CXTPSyntaxEditLexVariant provides functionality to manipulate Lexical Analyzer's
  200. //      related variant type.
  201. // See also:
  202. //      XTPSyntaxEditLexVariantType, CXTPSyntaxEditLexClass, CXTPSyntaxEditLexVariable,
  203. //      CXTPSyntaxEditLexVariantPtrArray
  204. //===========================================================================
  205. class _XTP_EXT_CLASS CXTPSyntaxEditLexVariant : public CXTPCmdTarget
  206. {
  207. public:
  208. //--------------------------------------------------------------------
  209. // Summary:
  210. //      Object constructor.
  211. // Parameters:
  212. //      rSrc        : [in] Initialize new object using other
  213. //                          LexVariant object.
  214. //      pClass      : [in] Set new object type to <b> xtpEditLVT_classPtr </b>,
  215. //                      and initialize </b> m_ptrClass </b> member
  216. //                      using specified pointer. InternalAddRef()
  217. //                      is called for the pClass object.
  218. //                      InternalRelease() will be called in the destructor.
  219. //      pLVArray    : [in] Set new object type to <b> xtpEditLVT_LVArrayPtr </b>,
  220. //                      and initialize </b> m_ptrLVArrayPtr </b>
  221. //                      member using specified pointer. If
  222. //                      bWithAddRef parameter value is TRUE
  223. //                      InternalAddRef() is called for the
  224. //                      pLVArray object.
  225. //      bWithAddRef : [in] If parameter value is TRUE InternalAddRef()
  226. //                      is called for the specified object.
  227. //      rSrcVar     : [in] Set new object type to <b> xtpEditLVT_valVar </b>,
  228. //                      and initialize </b> m_Variable </b>
  229. //                      member using specified object.
  230. //      pcszStr     : [in] Set new object type to <b> eType </b>
  231. //                      parameter value, and initialize
  232. //                      </b> m_arStrVals[0] </b> member using
  233. //                      specified string.
  234. //                      </b> eType </b> parameter value should be
  235. //                      a string type: </b> xtpEditLVT_valStr </b>,
  236. //                      </b> xtpEditLVT_className </b>.
  237. //      eType       : [in] Object type value from XTPSyntaxEditLexVariantType.
  238. //      pArStrVals  : [in] Set new object type to <b> xtpEditLVT_valStr </b>,
  239. //                      and initialize </b> m_arStrVals </b>
  240. //                      member using specified pointer.
  241. //      nValue      : [in] Set new object type to <b> xtpEditLVT_valInt </b>,
  242. //                      and initialize </b> m_nValue </b>
  243. //                      member using specified value.
  244. // Remarks:
  245. //      Construct an empty object, or initialize it using
  246. //      specified parameters.
  247. // See also:
  248. //      XTPSyntaxEditLexVariantType, CXTPSyntaxEditLexClass, CXTPSyntaxEditLexVariable,
  249. //      CXTPSyntaxEditLexVariantPtrArray
  250. //--------------------------------------------------------------------
  251. CXTPSyntaxEditLexVariant();
  252. // <COMBINE CXTPSyntaxEditLexVariant>
  253. CXTPSyntaxEditLexVariant(const CXTPSyntaxEditLexVariant& rSrc);
  254. // <COMBINE CXTPSyntaxEditLexVariant>
  255. CXTPSyntaxEditLexVariant(CXTPSyntaxEditLexClass* pClass);
  256. // <COMBINE CXTPSyntaxEditLexVariant>
  257. CXTPSyntaxEditLexVariant(CXTPSyntaxEditLexVariantPtrArray* pLVArray);
  258. // <COMBINE CXTPSyntaxEditLexVariant>
  259. CXTPSyntaxEditLexVariant(const CXTPSyntaxEditLexVariable& rSrcVar);
  260. // <COMBINE CXTPSyntaxEditLexVariant>
  261. CXTPSyntaxEditLexVariant(LPCTSTR pcszStr, int eType = xtpEditLVT_valStr);
  262. // <COMBINE CXTPSyntaxEditLexVariant>
  263. CXTPSyntaxEditLexVariant(const CStringArray* pArStrVals);
  264. // <COMBINE CXTPSyntaxEditLexVariant>
  265. CXTPSyntaxEditLexVariant(int    nValue);
  266. //--------------------------------------------------------------------
  267. // Summary:
  268. //      Default object destructor.
  269. //--------------------------------------------------------------------
  270. virtual ~CXTPSyntaxEditLexVariant();
  271. //====================================================================
  272. int             m_nObjType; // Object type value from XTPSyntaxEditLexVariantType.
  273. //---------------------------------
  274. CXTPSyntaxEditLexClassPtr               m_ptrClass;      // Value storage for type <b> xtpEditLVT_classPtr </b>
  275. CXTPSyntaxEditLexVariantPtrArray*   m_ptrLVArrayPtr; // Value storage for type <b> xtpEditLVT_LVArrayPtr </b>
  276. int             m_nValue;    // Value storage for type <b> xtpEditLVT_valInt </b>
  277. CStringArray    m_arStrVals; // Value storage for types <b> xtpEditLVT_className </b>, <b> xtpEditLVT_valStr </b>
  278. CXTPSyntaxEditLexVariable m_Variable;    // Value storage for type <b> xtpEditLVT_valVar </b>
  279. //====================================================================
  280. //--------------------------------------------------------------------
  281. // Summary:
  282. //      Copy operator.
  283. // Parameters:
  284. //      rSrc :  [in] Constant reference to the source object.
  285. // Returns:
  286. //      Constant reference to the destination object.
  287. // Remarks:
  288. //      This operator fill object members using source object values.
  289. // See also:
  290. //      Operator copy (=) in C++.
  291. //--------------------------------------------------------------------
  292. const CXTPSyntaxEditLexVariant& operator = (const CXTPSyntaxEditLexVariant& rSrc);
  293. //--------------------------------------------------------------------
  294. // Summary:
  295. //      Copy operator.
  296. // Parameters:
  297. //      nVal : [in] Value to be stored in the lex variant object.
  298. // Returns:
  299. //      Constant reference to the destination object.
  300. // Remarks:
  301. //      This operator sets the object type to <b> xtpEditLVT_valInt </b>,
  302. //      and initialize </b> m_nValue </b> member using specified value.
  303. // See also:
  304. //      Operator copy (=) in C++.
  305. //--------------------------------------------------------------------
  306. const CXTPSyntaxEditLexVariant& operator = (int nVal);
  307. //--------------------------------------------------------------------
  308. // Summary:
  309. //      Copy operator.
  310. // Parameters:
  311. //      rSrcVar : [in] Value to be stored in the lex variant object.
  312. // Returns:
  313. //      Constant reference to the destination object.
  314. // Remarks:
  315. //      This operator sets the object type to <b> xtpEditLVT_valVar </b>,
  316. //      and initialize </b> m_Variable </b> member using specified
  317. //      object.
  318. // See also:
  319. //      Operator copy (=) in C++.
  320. //--------------------------------------------------------------------
  321. const CXTPSyntaxEditLexVariant& operator = (const CXTPSyntaxEditLexVariable& rSrcVar);
  322. //--------------------------------------------------------------------
  323. // Summary:
  324. //      Equal-to operator.
  325. // Parameters:
  326. //      rSrc :  [in] Constant reference to the other object.
  327. // Returns:
  328. //      It returns TRUE if both operands have the same value;
  329. //      otherwise, it returns FALSE.
  330. // Remarks:
  331. //      This operator determine are objects equal.
  332. // See also:
  333. //      Equality Operators in C++.
  334. //--------------------------------------------------------------------
  335. BOOL operator == (const CXTPSyntaxEditLexVariant& rSrc) const;
  336. //--------------------------------------------------------------------
  337. // Summary:
  338. //      Set object members using string lex variable
  339. //      representation.
  340. // Parameters:
  341. //      pcszVarName :   [in] string lex variable representation (with
  342. //                      flags). Like "@alpha" or "@digit:not".
  343. // Returns:
  344. //      TRUE if successful, otherwise - FALSE.
  345. // Remarks:
  346. //      This method sets the object type to <b> xtpEditLVT_valVar </b>,
  347. //      and initialize </b> m_Variable </b> member using
  348. //      specified string lex variable representation.
  349. // See also:
  350. //      CXTPSyntaxEditLexVariable::SetVariable()
  351. //--------------------------------------------------------------------
  352. virtual BOOL SetVariable(LPCTSTR pcszVarName);
  353. //--------------------------------------------------------------------
  354. // Summary:
  355. //      Is variant object contains string(s).
  356. // Returns:
  357. //      TRUE if object is string type: </b> xtpEditLVT_valStr </b>,
  358. //      </b> xtpEditLVT_className </b>, otherwise - FALSE.
  359. // Remarks:
  360. //      Call this method to determine is object has a string type. In
  361. //      this case </b> m_arStrVals </b> member is used to access data.
  362. // See also:
  363. //      XTPSyntaxEditLexVariantType, CXTPSyntaxEditLexVariant::m_arStrVals.
  364. //--------------------------------------------------------------------
  365. virtual BOOL IsStrType() const;
  366. //--------------------------------------------------------------------
  367. // Summary:
  368. //      Get string for the string type variant object.
  369. // Returns:
  370. //      Value of </b>m_arStrVals[0]</b> if object is string type,
  371. //      otherwise - empty string.
  372. // Remarks:
  373. //      Call this method to get first string stored in the object (</b>
  374. //      m_arStrVals[0] </b> member value).
  375. // See also:
  376. //      CXTPSyntaxEditLexVariant::IsStrType(), XTPSyntaxEditLexVariantType,
  377. //              CXTPSyntaxEditLexVariant::m_arStrVals.
  378. //--------------------------------------------------------------------
  379. virtual LPCTSTR GetStr() const;
  380. //--------------------------------------------------------------------
  381. // Summary:
  382. //      Clone variant object.
  383. // Returns:
  384. //      Pointer to the new object.
  385. // Remarks:
  386. //      Create a new CXTPSyntaxEditLexVariant object using <b>new</b> operator and
  387. //      initialize it using this object. New object reference counter is
  388. //      initialized by 1. InternalRelease() should be called to delete
  389. //      unused object.
  390. //--------------------------------------------------------------------
  391. virtual CXTPSyntaxEditLexVariant* Clone() const;
  392. #ifdef _DEBUG
  393. //--------------------------------------------------------------------
  394. // Summary:
  395. //      Print stored object value(s) to the trace.
  396. // Parameters:
  397. //      dc - A reference to CDumpContext object.
  398. // Remarks:
  399. //      Used for debug only.
  400. //--------------------------------------------------------------------
  401. void Dump(CDumpContext& dc) const;
  402. #endif
  403. };
  404. //========================================================================
  405. // Summary:
  406. //      CXTPSyntaxEditLexOnScreenParseCnt provides context data storage for
  407. //      OnScreen iterated parsing process.
  408. // See also:
  409. //      CXTPSyntaxEditLexClass, CXTPSyntaxEditLexTextSchema
  410. //========================================================================
  411. class _XTP_EXT_CLASS CXTPSyntaxEditLexOnScreenParseCnt
  412. {
  413. public:
  414. //--------------------------------------------------------------------
  415. // Summary:
  416. //      Default object constructor.
  417. //--------------------------------------------------------------------
  418. CXTPSyntaxEditLexOnScreenParseCnt();
  419. //--------------------------------------------------------------------
  420. // Summary:
  421. //      Default object destructor.
  422. //--------------------------------------------------------------------
  423. virtual ~CXTPSyntaxEditLexOnScreenParseCnt();
  424. int m_nRowStart;    // Start row for parse.
  425. int m_nRowEnd;      // End row for parse.
  426. CXTPSyntaxEditLexTextBlockPtr m_ptrTBLast; // Latest found text block.
  427. };
  428. //========================================================================
  429. // Summary:
  430. //      Enumerates parent class relation for the Lex Class object.
  431. // See also:
  432. //      CXTPSyntaxEditLexClass::CXTPSyntaxEditParent.
  433. //========================================================================
  434. enum XTPSyntaxEditLexClass_OptParent
  435. {
  436. xtpEditOptParent_Unknown    = 0,  // Undefined value.
  437. xtpEditOptParent_Default    = -1, // Use default relation value.
  438. xtpEditOptParent_file       = 1,  // Lex Class is the top in classes hierarchy: level file.
  439. xtpEditOptParent_direct     = 2,  // Lex Class can be child of specified parent class only directly.
  440. xtpEditOptParent_dyn        = 3,  // Lex Class can be child of specified parent class dynamically. (no only directly, but child of child of child ...)
  441. };
  442. //========================================================================
  443. // Summary:
  444. //      Enumerates children classes relation for the Lex Class object.
  445. // See also:
  446. //      CXTPSyntaxEditLexClass::CXTPSyntaxEditChildren
  447. //========================================================================
  448. enum XTPSyntaxEditLexClass_OptChildren
  449. {
  450. xtpEditOptChildren_Unknown  = 0, // Undefined value.
  451. xtpEditOptChildren_No       = 1, // Lex Class cannot have children.
  452. xtpEditOptChildren_Any      = 2, // Lex Class have children specified by their 'parent' property
  453. xtpEditOptChildren_List     = 3, // Lex Class can have only children from list and specified by their 'parent' property.
  454. };
  455. //------------------------------------------------------------------------
  456. // Class schema (public) attributes
  457. static const TCHAR XTPLEX_ATTR_TXTPREFIX[]          = _T("txt:");               // Text properties (like color, bold, ...) attributes prefix.
  458. static const TCHAR XTPLEX_ATTR_COLORPREFIX[]        = _T("txt:color");          // Prefix of properties which value is color.
  459. static const TCHAR XTPLEX_ATTR_TXT_COLORFG[]        = _T("txt:colorFG");        // Text color
  460. static const TCHAR XTPLEX_ATTR_TXT_COLORBK[]        = _T("txt:colorBK");        // Text back ground color
  461. static const TCHAR XTPLEX_ATTR_TXT_COLORSELFG[]     = _T("txt:colorSelFG");     // Selected text color
  462. static const TCHAR XTPLEX_ATTR_TXT_COLORSELBK[]     = _T("txt:colorSelBK");     // Selected text back ground color
  463. static const TCHAR XTPLEX_ATTR_TXT_BOLD[]           = _T("txt:Bold");           // Text font Bold flag.
  464. static const TCHAR XTPLEX_ATTR_TXT_ITALIC[]         = _T("txt:Italic");         // Text font Italic flag.
  465. static const TCHAR XTPLEX_ATTR_TXT_UNDERLINE[]      = _T("txt:Underline");      // Text font Underline flag.
  466. static const TCHAR XTPLEX_ATTR_CASESENSITIVE[]      = _T("CaseSensitive");      // Lex Class CaseSensitive flag.
  467. static const TCHAR XTPLEX_ATTR_COLLAPSABLE[]        = _T("Collapsable");        // Lex Class Collapsable flag.
  468. static const TCHAR XTPLEX_ATTR_COLLAPSEDTEXT[]      = _T("CollapsedText");      // Collapsed Lex Class mark text. (like [..])
  469. static const TCHAR XTPLEX_ATTR_PARSEONSCREEN[]      = _T("ParseOnScreen");      // Parse Lex Class only for screen drawing.
  470. static const TCHAR XTPLEX_ATTR_RESTARTRUNLOOP[]     = _T("RestartRunLoop");     // if set to 1 - run children loop will be restarted from the beginning when class ended, otherwise next child class will run.
  471. static const TCHAR XTPLEX_ATTR_ENDCLASSPARENT[]     = _T("End:Class:Parent");   // if set to 'this' the end block must have this class as parent.
  472. static const TCHAR XTPLEX_ATTR_RECURRENCEDEPTH[]    = _T("RecurrenceDepth");    // define depth of the recurrence blocks.
  473. static const TCHAR XTPLEX_ATTR_DISPLAYNAME[]        = _T("DisplayName");        // Friendly name to display in options dialog.
  474. // Global attributes
  475. static const TCHAR XTPLEX_ATTRG_FIRSTPARSEINSEPARATETHREAD[]            = _T("global:FirstParseInSeparateThread");              // {0,1} default=1
  476. static const TCHAR XTPLEX_ATTRG_EDITREPARCEINSEPARATETHREAD[]           = _T("global:EditReparceInSeparateThread");             // {0,1} default=1
  477. static const TCHAR XTPLEX_ATTRG_CONFIGCHANGEDREPARCEINSEPARATETHREAD[]  = _T("global:ConfigChangedReparceInSeparateThread");    // {0,1} default=1
  478. static const TCHAR XTPLEX_ATTRG_EDITREPARCETIMEOUT_MS[]                 = _T("global:EditReparceTimeout_ms");                   // time out for start reparse after last key was pressed.
  479. static const TCHAR XTPLEX_ATTRG_MAXBACKPARSEOFFSET[]                    = _T("global:MaxBackParseOffset");                      // maximum back buffer size. Some times parser look back for the text from current position.
  480. static const TCHAR XTPLEX_ATTRG_ONSCREENSCHCACHELIFETIME_SEC[]          = _T("global:OnScreenSchCacheLifeTime_sec");            // default= 180 sec; -1 and 0 means infinite; time out for on screen parsed pieces of text. for memory using optimization.
  481. static const TCHAR XTPLEX_ATTRG_PARSERTHREADIDLELIFETIME_SEC[]          = _T("global:ParserThreadIdleLifeTime_sec");            // default=60 sec; -1 and 0 means infinite; time out for existing of parser thread when parser idle (no parse requests).
  482. // internal attributes
  483. static const TCHAR XTPLEX_ATTRCLASSID[]             = _T("ClassID");            // Lex Class ID, unique for the classes tree.
  484. //========================================================================
  485. // Summary:
  486. //      CXTPSyntaxEditLexClass class is used to represent lexical block of text
  487. //      definition and to parse text.
  488. // See Also:
  489. //      CXTPSyntaxEditLexClassSchema, CXTPSyntaxEditLexObj_SpecCollT.
  490. //========================================================================
  491. class _XTP_EXT_CLASS CXTPSyntaxEditLexClass : public CXTPCmdTarget,
  492.  protected CXTPSyntaxEditLexObj_SpecCollT<
  493. CXTPSyntaxEditLexObj_Previous,
  494. CXTPSyntaxEditLexObj_Start,
  495. CXTPSyntaxEditLexObj_End,
  496. CXTPSyntaxEditLexObj_Token,
  497. CXTPSyntaxEditLexObj_Skip,
  498. CXTPSyntaxEditLexObj_ActiveTags >
  499. {
  500. public:
  501. //====================================================================
  502. // Summary:
  503. //      CXTPSyntaxEditLexClass::TBase is the base collection type for
  504. //      CXTPSyntaxEditLexClass. It is used to access base members and types.
  505. // See Also:
  506. //      CXTPSyntaxEditLexClassSchema, CXTPSyntaxEditLexObj_SpecCollT.
  507. //====================================================================
  508. typedef CXTPSyntaxEditLexObj_SpecCollT<
  509. CXTPSyntaxEditLexObj_Previous,
  510. CXTPSyntaxEditLexObj_Start,
  511. CXTPSyntaxEditLexObj_End,
  512. CXTPSyntaxEditLexObj_Token,
  513. CXTPSyntaxEditLexObj_Skip,
  514. CXTPSyntaxEditLexObj_ActiveTags > TBase;
  515. //--------------------------------------------------------------------
  516. // Summary:
  517. //      Default object constructor.
  518. //--------------------------------------------------------------------
  519. CXTPSyntaxEditLexClass();
  520. //--------------------------------------------------------------------
  521. // Summary:
  522. //      Default object destructor.
  523. //--------------------------------------------------------------------
  524. virtual ~CXTPSyntaxEditLexClass();
  525. protected:
  526. XTP_EDIT_LEX_CLASS_OBJ_MEMBER(0, m_previous); //   <b>'previous'</b> Lex Class property collection.
  527. XTP_EDIT_LEX_CLASS_OBJ_MEMBER(1, m_start);  // <b>'start'</b> Lex Class property collection.
  528. XTP_EDIT_LEX_CLASS_OBJ_MEMBER(2, m_end);        // <b>'end'</b> Lex Class property collection.
  529. XTP_EDIT_LEX_CLASS_OBJ_MEMBER(3, m_token);  // <b>'token'</b> Lex Class property collection.
  530. XTP_EDIT_LEX_CLASS_OBJ_MEMBER(4, m_skip);   // <b>'skip'</b> Lex Class property collection.
  531. // internal objects
  532. XTP_EDIT_LEX_CLASS_OBJ_MEMBER(5, m_ActiveTags); // Active Tags collection. Just only these tags can start or end current and children Lex Class(es).
  533. int m_nActiv_EndTags_Offset;  // First index of end active tags set in the Active Tags collection (m_ActiveTags member).
  534. //--------------------------------------------------------------------
  535. friend class CXTPSyntaxEditLexClass_file;
  536. friend class CXTPSyntaxEditLexClassSchema;
  537. friend class CXTPSyntaxEditLexTextSchema;
  538. friend class CXTPSyntaxEditLexParser;
  539. public:
  540. //--------------------------------------------------------------------
  541. // Summary:
  542. //      Get object property by property name.
  543. // Parameters:
  544. //      pcszPropName :  [in] Property name.
  545. // Returns:
  546. //      Smart pointer to CXTPSyntaxEditLexVariant object with type xtpEditLVT_LVArrayPtr.
  547. // Remarks:
  548. //      Property names are parent collection (TBase) sub-objects names;
  549. //      like "start:tag", "token:start:separators", ... For details see
  550. //      Classes schema syntax and CXTPSyntaxEditLexClass::TBase.
  551. // See also:
  552. //      CXTPSyntaxEditLexClass::TBase, Classes schema syntax.
  553. //--------------------------------------------------------------------
  554. virtual CXTPSyntaxEditLexVariantPtr PropV(LPCTSTR pcszPropName);
  555. //--------------------------------------------------------------------
  556. // Summary:
  557. //      Get Lex Class name.
  558. // Returns:
  559. //      Lex Class name.
  560. // Remarks:
  561. //      Lex Class name is specified in classes schema file by 'name'
  562. //      property.
  563. // See also:
  564. //      Classes schema syntax.
  565. //--------------------------------------------------------------------
  566. virtual CString GetClassName() const;
  567. //--------------------------------------------------------------------
  568. // Summary:
  569. //      Is Lex Class case sensitive.
  570. // Returns:
  571. //      "CaseSensitive" attribute value..
  572. // Remarks:
  573. //      Use this method instead of GetAttribute() to fast access
  574. //      "CaseSensitive" attribute value.
  575. // See also:
  576. //      GetAttribute(), XTPLEX_ATTR_CASESENSITIVE, Classes schema syntax.
  577. //--------------------------------------------------------------------
  578. virtual BOOL IsCaseSensitive();
  579. //--------------------------------------------------------------------
  580. // Summary:
  581. //      Is Lex Class Collapsable.
  582. // Returns:
  583. //      "Collapsable" attribute value..
  584. // Remarks:
  585. //      Use this method instead of GetAttribute() to fast access
  586. //      "Collapsable" attribute value.
  587. // See also:
  588. //      GetAttribute(), XTPLEX_ATTR_COLLAPSABLE, Classes schema syntax.
  589. //--------------------------------------------------------------------
  590. virtual int IsCollapsable();
  591. //--------------------------------------------------------------------
  592. // Summary:
  593. //      Is Lex Class Collapsable.
  594. // Parameters:
  595. //      rTB :   [out] Pointer to the classes array.
  596. // Returns:
  597. //      "Collapsable" attribute value..
  598. // Remarks:
  599. //      Use this method instead of GetAttribute() to fast access
  600. //      "Collapsable" attribute value.
  601. // See also:
  602. //      GetAttribute(), XTPLEX_ATTR_COLLAPSABLE, Classes schema syntax.
  603. //--------------------------------------------------------------------
  604. virtual void GetTextAttributes(XTP_EDIT_TEXTBLOCK& rTB);
  605. //--------------------------------------------------------------------
  606. // Summary:
  607. //      Close Lex Class.
  608. // Remarks:
  609. //      Kill All relations between this class and parent and children.
  610. //      Close children classes. Clear internal collections. Close() must
  611. //      be called as first step in destroy object procedure. The second
  612. //      step is InternalRelease() call.
  613. // See also:
  614. //      CXTPSyntaxEditLexClass::CloseClasses()
  615. //--------------------------------------------------------------------
  616. virtual void Close();
  617. //--------------------------------------------------------------------
  618. // Summary:
  619. //      Close specified Lex Classes.
  620. // Parameters:
  621. //      pArClasses : [in] Pointer to the classes array.
  622. // Remarks:
  623. //      Call Close() method for every Lex Class in the specified array.
  624. //      Remove all objects from the array.
  625. // See also:
  626. //      CXTPSyntaxEditLexClass::Close()
  627. //--------------------------------------------------------------------
  628. static void AFX_CDECL CloseClasses(CXTPSyntaxEditLexClassPtrArray* pArClasses);
  629. //--------------------------------------------------------------------
  630. // Summary:
  631. //      Get Lex Class attribute by attribute name.
  632. // Parameters:
  633. //      strName :   [in] Attribute name.
  634. //      bDyn :      [in] If FALSE - attribute value is searched only in
  635. //                       this class attribute collection;
  636. //                       If TRUE - attribute value is searched in this
  637. //                       class attribute collection at the first and, if
  638. //                       value is not finded, it is searched in parent(s)
  639. //                       class(es) attribute collection(s).
  640. //      bDefault :  [in] Default BOOL value.
  641. //      nDefault :  [in] Default int value.
  642. // Returns:
  643. //      Attribute value or NULL or default value.
  644. // Remarks:
  645. //      Call this method to access Lex Classes attributes,
  646. //              like "txt:colorFG", ...
  647. // See also:
  648. //      XTPLEX_ATTR_*, SetAttribute(), Classes schema syntax.
  649. //--------------------------------------------------------------------
  650. virtual CXTPSyntaxEditLexVariantPtr GetAttribute(LPCTSTR strName, BOOL bDyn) const;
  651. // <COMBINE GetAttribute>
  652. virtual BOOL GetAttribute_BOOL(LPCTSTR strName, BOOL bDyn, BOOL bDefault = FALSE) const;
  653. // <COMBINE GetAttribute>
  654. virtual int GetAttribute_int(LPCTSTR strName, BOOL bDyn, int nDefault = 0) const;
  655. protected:
  656. //--------------------------------------------------------------------
  657. // Summary:
  658. //      Sets Lex Class attribute.
  659. // Parameters:
  660. //      strName :   [in] Attribute name.
  661. //      rVal :      [in] Attribute value.
  662. // Remarks:
  663. //      Call this method to set Lex Class attributes, like "txt:colorFG",
  664. //      ...
  665. // See also:
  666. //       XTPLEX_ATTR_*, GetAttribute(), Classes schema syntax.
  667. //--------------------------------------------------------------------
  668. virtual void SetAttribute(CString strName, const CXTPSyntaxEditLexVariant& rVal);
  669. //--------------------------------------------------------------------
  670. // Summary:
  671. //      Get specified children for the Lex Class.
  672. // Parameters:
  673. //      bWithAddRef : [in] If parameter value is TRUE InternalAddRef()
  674. //                         is called for the returned object.
  675. // Remarks:
  676. //      Call this method(s) to get pointer to the array which contains
  677. //      children classes.
  678. // See also:
  679. //      GetChildren(), GetChildrenDyn(), GetChildrenSelfRef().
  680. //--------------------------------------------------------------------
  681. virtual CXTPSyntaxEditLexClassPtrArray* GetChildren();
  682. // <COMBINE GetChildren>
  683. virtual CXTPSyntaxEditLexClassPtrArray* GetChildrenDyn();
  684. // <COMBINE GetChildren>
  685. virtual CXTPSyntaxEditLexClassPtrArray* GetChildrenSelfRef();
  686. //--------------------------------------------------------------------
  687. // Summary:
  688. //      Get active tags for the Lex Class.
  689. //--------------------------------------------------------------------
  690. //virtual CXTPSyntaxEditLexVariantPtrArray* GetActiveTags();
  691. virtual CXTPSyntaxEditLexObj_ActiveTags* GetActiveTags();
  692. virtual int RunParse(CTextIter* pTxtIter,
  693. CXTPSyntaxEditLexTextSchema* pTxtSch,
  694. CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock,
  695. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt = NULL);
  696. #ifdef _DEBUG
  697. //--------------------------------------------------------------------
  698. // Summary:
  699. //      Trace parsed lex classes. Write debug info to debug window.
  700. // Parameters:
  701. //      dc         : [in] A reference to CDumpContext object.
  702. //      pcszOffset : [in] user defined text.
  703. //--------------------------------------------------------------------
  704. void DumpOffset(CDumpContext& dc, LPCTSTR pcszOffset);
  705. #endif
  706. protected:
  707. //{{AFX_CODEJOCK_PRIVATE
  708. virtual BOOL SetProp_ProcessSpecials(const XTP_EDIT_LEXPROPINFO* pPropDesc,
  709.  BOOL& rbProcessed);
  710. virtual BOOL SetProp_ProcessSpecObjects(const XTP_EDIT_LEXPROPINFO* pPropDesc,
  711.  BOOL& rbProcessed);
  712. virtual BOOL SetProp_ProcessAttributes(const XTP_EDIT_LEXPROPINFO* pPropDesc,
  713.  BOOL& rbProcessed);
  714. virtual BOOL ParseValues(const XTP_EDIT_LEXPROPINFO* pPropDesc,
  715. CXTPSyntaxEditLexVariantPtrArray* pLVArray);
  716. virtual BOOL IsQuoted(CString strValue, CString* pstrUnQuotedVal = NULL);
  717. virtual BOOL IsVar(CString strValue, CString* pstrVarVal = NULL);
  718. virtual void SortTags();
  719. virtual BOOL Run_Previous(CTextIter* pTxtIter,
  720. CXTPSyntaxEditLexTextSchema* pTxtSch,
  721. CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock,
  722. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt = NULL);
  723. virtual int Run_Start(CTextIter* pTxtIter,
  724. CXTPSyntaxEditLexTextSchema* pTxtSch,
  725. CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock,
  726. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt = NULL);
  727. virtual int Run_Skip(CTextIter* pTxtIter,
  728. CXTPSyntaxEditLexTextSchema* pTxtSch,
  729. CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock );
  730. virtual int Run_End(CTextIter* pTxtIter,
  731. CXTPSyntaxEditLexTextSchema* pTxtSch,
  732. CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock,
  733. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt = NULL);
  734. virtual int Run_Token(CTextIter* pTxtIter,
  735. CXTPSyntaxEditLexTextSchema* pTxtSch,
  736. CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock );
  737. virtual BOOL Run_TokenSeparators(CString strToken,
  738. CTextIter* pTxtIter,
  739. CXTPSyntaxEditLexTextSchema* pTxtSch,
  740. CString& rstrSeparator1,
  741. CString& rstrSeparator2 );
  742. virtual BOOL Run_Tags(CTextIter* pIter,
  743. CXTPSyntaxEditLexTextSchema* pTxtSch,
  744. CXTPSyntaxEditLexVariantPtrArray* pLVTags,
  745. CString& rstrTagVal,
  746. BOOL bParseDirection_Back = FALSE);
  747. static BOOL AFX_CDECL Run_Tags1(CTextIter* pIter,
  748. CXTPSyntaxEditLexVariantPtrArray* pLVTags,
  749. CString& rstrTagVal,
  750. BOOL bCaseSensitive,
  751. BOOL bParseDirection_Back = FALSE);
  752. static BOOL AFX_CDECL Run_Tags2(CTextIter* pIter,
  753.  CXTPSyntaxEditLexVariant* pVTags,
  754.  CString& rstrTagVal,
  755.  BOOL bCaseSensitive,
  756.  BOOL bParseDirection_Back = FALSE );
  757. virtual BOOL Run_PrevClass(CXTPSyntaxEditLexTextBlock** ppPrevTB,
  758. CXTPSyntaxEditLexTextSchema* pTxtSch,
  759. CXTPSyntaxEditLexVariantPtrArray* pLVPrevClasses,
  760. int nDepth, XTP_EDIT_LINECOL* pMinPrevPos = NULL,
  761. CXTPSyntaxEditLexTextBlock* pPrevForParentBlockOnly = NULL,
  762. CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt = NULL);
  763. static BOOL AFX_CDECL StrCmp(LPCTSTR pcszStr1, LPCTSTR pcszStr2, int nLen,
  764. BOOL bCaseSensitive);
  765. static BOOL AFX_CDECL StrCmpEQ(LPCTSTR pcszStr1, LPCTSTR pcszStr2, int nLen,
  766.   BOOL bCaseSensitive,
  767.   BOOL bParseDirection_Back = FALSE );
  768. static BOOL AFX_CDECL StrVarCmpEQ(LPCTSTR pcszStr, const CXTPSyntaxEditLexVariable& lexVar,
  769.  CString& rstrValue,
  770.  BOOL bParseDirection_Back = FALSE );
  771. virtual BOOL SetProp(const XTP_EDIT_LEXPROPINFO* pPropDesc);
  772. virtual BOOL AddChild(CXTPSyntaxEditLexClass* pChild, BOOL bDyn);
  773. const CXTPSyntaxEditLexClass& operator =(const CXTPSyntaxEditLexClass& rSrc);
  774. virtual void CopyFrom(const CXTPSyntaxEditLexClass* pSrc);
  775. virtual CXTPSyntaxEditLexClass* Clone(CXTPSyntaxEditLexClassSchema* pOwnerSch = NULL);
  776. virtual void CopyAttributes(const CXTPSyntaxEditLexClass* pSrcAttrClass, LPCTSTR pcszAttrPrefix = NULL);
  777. virtual void RemoveAttributes(LPCTSTR pcszAttrPrefix = NULL);
  778. virtual void GetParentOpt(int& rnOpt, CStringArray& rArData) const;
  779. virtual void GetChildrenOpt(int& rnOpt, CStringArray&   rArData) const;
  780. virtual CXTPSyntaxEditLexVariantPtrArray* BuildActiveTags(int& rnStartCount);
  781. virtual CXTPSyntaxEditLexClass* FindParent(LPCTSTR pcszClassName);
  782. //--------------------------------------------------------------------
  783. // Summary:     Fast (cached) access to "RestartRunLoop" attribute value.
  784. // Remarks:     If set to 1 - run children loop will be restarted from
  785. //              the beginning when class ended, otherwise next child
  786. //              class will run.
  787. //              Default value is 1.
  788. // Returns:     "RestartRunLoop" attribute value.
  789. // See also:    GetAttribute(), XTPLEX_ATTR_RESTARTRUNLOOP,
  790. //              Classes schema syntax.
  791. //--------------------------------------------------------------------
  792. virtual BOOL IsRestartRunLoop();
  793. virtual BOOL IsEndClassParent_this();
  794. //}}AFX_CODEJOCK_PRIVATE
  795. protected:
  796. //{{AFX_CODEJOCK_PRIVATE
  797. class CXTPSyntaxEditParent
  798. {
  799. public:
  800. XTPSyntaxEditLexClass_OptParent eOpt;
  801. CXTPSyntaxEditLexClassPtr               ptrDirect;
  802. CStringArray                arClassNames;
  803. void Clear()
  804. {
  805. eOpt = xtpEditOptParent_Unknown;
  806. ptrDirect = NULL;
  807. arClassNames.RemoveAll();
  808. }
  809. };
  810. class CXTPSyntaxEditChildren
  811. {
  812. public:
  813. XTPSyntaxEditLexClass_OptChildren   eOpt;
  814. CStringArray    arClassNames;
  815. void Clear() {
  816. eOpt = xtpEditOptChildren_Any;
  817. arClassNames.RemoveAll();
  818. }
  819. };
  820. CString m_strClassName;
  821. CXTPSyntaxEditParent        m_Parent;
  822. CXTPSyntaxEditChildren      m_Children;
  823. //}}AFX_CODEJOCK_PRIVATE
  824. protected:
  825. //{{AFX_CODEJOCK_PRIVATE
  826. CXTPSyntaxEditLexClassPtrArray  m_arChildrenClasses;
  827. CXTPSyntaxEditLexClassPtrArray  m_arDynChildrenClasses;
  828. CXTPSyntaxEditLexClassPtrArray  m_arChildrenSelfRefClasses;
  829. CMap<CString, LPCTSTR, CXTPSyntaxEditLexVariantPtr, CXTPSyntaxEditLexVariantPtr&> m_mapAttributes;
  830. //}}AFX_CODEJOCK_PRIVATE
  831. private:
  832. // Cached attributes
  833. virtual void ClearAttributesCache();
  834. int m_bCaseSensitive_Cached;
  835. int m_nCollapsable_Cached;
  836. int m_bRestartRunLoop_Cached;
  837. int m_bEndClassParent_this_Cached;
  838. XTP_EDIT_TEXTBLOCK m_txtAttr_cached;
  839. BOOL m_bTxtAttr_cached;
  840. };
  841. //---------------------------------------------------------------------------
  842. //{{AFX_CODEJOCK_PRIVATE
  843. class _XTP_EXT_CLASS CXTPSyntaxEditLexClass_file : public CXTPSyntaxEditLexClass
  844. {
  845. public:
  846. CXTPSyntaxEditLexClass_file();
  847. virtual ~CXTPSyntaxEditLexClass_file();
  848. virtual CXTPSyntaxEditLexVariantPtr PropV(LPCTSTR propName);
  849. protected:
  850. virtual int RunParse(CTextIter* pTxtIter,
  851.  CXTPSyntaxEditLexTextSchema* pTxtSch,
  852.  CXTPSyntaxEditLexTextBlockPtr& rPtrTxtBlock,
  853.  CXTPSyntaxEditLexOnScreenParseCnt* pOnScreenRunCnt = NULL);
  854. virtual CXTPSyntaxEditLexClass* Clone(CXTPSyntaxEditLexClassSchema* pOwnerSch = NULL);
  855. BOOL InternalInitExts(BOOL bReInit = FALSE);
  856. BOOL TestExt(LPCTSTR pcszExt) const;
  857. protected:
  858. BOOL         m_bExtInitialized;
  859. CStringArray m_arExt;
  860. };
  861. //}}AFX_CODEJOCK_PRIVATE
  862. }
  863. ////////////////////////////////////////////////////////////////////////////
  864. AFX_INLINE int CXTPSyntaxEditLexClass::StrCmp(LPCTSTR pcszStr1, LPCTSTR pcszStr2,
  865. int nLen, BOOL bCaseSensitive)
  866. {
  867. if(bCaseSensitive) {
  868. return _tcsncmp(pcszStr1, pcszStr2, nLen);
  869. }
  870. return _tcsnicmp(pcszStr1, pcszStr2, nLen);
  871. }
  872. AFX_INLINE CString CXTPSyntaxEditLexClass::GetClassName() const {
  873. return m_strClassName;
  874. }
  875. AFX_INLINE CXTPSyntaxEditLexObj_ActiveTags* CXTPSyntaxEditLexClass::GetActiveTags()
  876. {
  877. return  &m_ActiveTags;
  878. }
  879. AFX_INLINE int CXTPSyntaxEditLexClass::GetAttribute_int(LPCTSTR strName, BOOL bDyn,
  880.   int nDefault) const
  881. {
  882. CXTPSyntaxEditLexVariantPtr ptrAttrVal = GetAttribute(strName, bDyn);
  883. ASSERT(!ptrAttrVal || ptrAttrVal && ptrAttrVal->m_nObjType == xtpEditLVT_valInt);
  884. if(ptrAttrVal && ptrAttrVal->m_nObjType == xtpEditLVT_valInt)
  885. {
  886. return ptrAttrVal->m_nValue;
  887. }
  888. return nDefault;
  889. }
  890. AFX_INLINE BOOL CXTPSyntaxEditLexClass::GetAttribute_BOOL(LPCTSTR strName, BOOL bDyn,
  891.   BOOL bDefault) const
  892. {
  893. int nVal = GetAttribute_int(strName, bDyn, -1);
  894. ASSERT(nVal == -1 || nVal == 0 || nVal == 1);
  895. return (nVal == -1) ? bDefault : (nVal != 0);
  896. }
  897. AFX_INLINE BOOL CXTPSyntaxEditLexClass::IsRestartRunLoop()
  898. {
  899. if(m_bRestartRunLoop_Cached < 0) {
  900. m_bRestartRunLoop_Cached = GetAttribute_BOOL(XTPLEX_ATTR_RESTARTRUNLOOP, FALSE, TRUE);
  901. }
  902. return m_bRestartRunLoop_Cached;
  903. }
  904. #endif // !defined(__XTPSYNTAXEDITLEXCLASS_H__)