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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditSelection.cpp: implementation of the CXTPSyntaxEditAutoCompleteWnd 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. #include "stdafx.h"
  21. #include "Resource.h"
  22. // common includes
  23. #include "Common/XTPNotifyConnection.h"
  24. #include "Common/XTPSmartPtrInternalT.h"
  25. #include "XTPSyntaxEditSelection.h"
  26. // syntax editor includes
  27. #include "XTPSyntaxEditDefines.h"
  28. #include "XTPSyntaxEditLexPtrs.h"
  29. #include "XTPSyntaxEditLexCfgFileReader.h"
  30. #include "XTPSyntaxEditBufferManager.h"
  31. #include "XTPSyntaxEditCtrl.h"
  32. #ifdef _DEBUG
  33. #define new DEBUG_NEW
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #endif
  37. IMPLEMENT_DYNAMIC(CXTPSyntaxEditSelection, CXTPCmdTarget)
  38. /////////////////////////////////////////////////////////////////////////////
  39. //class _XTP_EXT_CLASS CXTPImmWrapper
  40. #ifdef _UNICODE
  41. #define XTP_PROC_NAME_AW(procName) procName "W"
  42. #else
  43. #define XTP_PROC_NAME_AW(procName) procName "A"
  44. #endif
  45. #define XTP_IMM_FNCALL(fnName, errRetVal) 
  46. if (!m_pfn##fnName) 
  47. return errRetVal; 
  48. return m_pfn##fnName
  49. CXTPImmWrapper::CXTPImmWrapper()
  50. {
  51. m_hImmDll = ::LoadLibrary(_T("imm32.dll"));
  52. if (m_hImmDll)
  53. {
  54. m_pfnImmIsIME = (PFN_ImmIsIME)GetProcAddress(m_hImmDll, "ImmIsIME");
  55. m_pfnImmGetContext = (PFN_ImmGetContext)GetProcAddress(m_hImmDll, "ImmGetContext");
  56. m_pfnImmReleaseContext = (PFN_ImmReleaseContext)GetProcAddress(m_hImmDll, "ImmReleaseContext");
  57. m_pfnImmSetCompositionFont = (PFN_ImmSetCompositionFont)GetProcAddress(m_hImmDll, XTP_PROC_NAME_AW("ImmSetCompositionFont"));
  58. m_pfnImmSetCompositionWindow = (PFN_ImmSetCompositionWindow)GetProcAddress(m_hImmDll, "ImmSetCompositionWindow");
  59. }
  60. else
  61. {
  62. m_pfnImmIsIME = NULL;
  63. m_pfnImmGetContext = NULL;
  64. m_pfnImmReleaseContext = NULL;
  65. m_pfnImmSetCompositionFont = NULL;
  66. m_pfnImmSetCompositionWindow = NULL;
  67. }
  68. }
  69. CXTPImmWrapper::~CXTPImmWrapper()
  70. {
  71. if (m_hImmDll)
  72. {
  73. ::FreeLibrary(m_hImmDll);
  74. }
  75. }
  76. BOOL CXTPImmWrapper::ImmIsIME(HKL hKL)
  77. {
  78. ASSERT(m_pfnImmIsIME);
  79. if (!m_pfnImmIsIME)
  80. return FALSE;
  81. if (hKL == NULL)
  82. hKL = ::GetKeyboardLayout(0);
  83. return m_pfnImmIsIME(hKL);
  84. }
  85. XTP_HIMC CXTPImmWrapper::ImmGetContext(HWND hWnd)
  86. {
  87. ASSERT(m_pfnImmGetContext);
  88. XTP_IMM_FNCALL(ImmGetContext, NULL)(hWnd);
  89. }
  90. BOOL CXTPImmWrapper::ImmReleaseContext(HWND hWnd, XTP_HIMC hIMC)
  91. {
  92. ASSERT(m_pfnImmReleaseContext);
  93. XTP_IMM_FNCALL(ImmReleaseContext, FALSE)(hWnd, hIMC);
  94. }
  95. BOOL CXTPImmWrapper::ImmSetCompositionWindow(XTP_HIMC hIMC, COMPOSITIONFORM* pCompForm)
  96. {
  97. ASSERT(m_pfnImmReleaseContext);
  98. XTP_IMM_FNCALL(ImmSetCompositionWindow, FALSE)(hIMC, pCompForm);
  99. }
  100. BOOL CXTPImmWrapper::ImmSetCompositionFont(XTP_HIMC hIMC, LOGFONT* plfFont)
  101. {
  102. ASSERT(m_pfnImmReleaseContext);
  103. XTP_IMM_FNCALL(ImmSetCompositionFont, FALSE)(hIMC, plfFont);
  104. }
  105. // class CXTPSyntaxEditSelection =======================================================
  106. CXTPSyntaxEditSelection::CXTPSyntaxEditSelection()
  107. {
  108. m_pOwnerCtrl = NULL;
  109. selStart_disp = selEnd_disp = XTP_EDIT_LINECOL::MakeLineCol(1, 1);
  110. selStart_str = selEnd_str = XTP_EDIT_LINECOL::MakeLineCol(1, 0);
  111. bSelectingRunning = FALSE;
  112. bWordSelectionMode = FALSE;
  113. bBlockSelectionMode = FALSE;
  114. nSelStartTextRowFromLeftBar = 0;
  115. }
  116. CXTPSyntaxEditSelection::CXTPSyntaxEditSelection(const CXTPSyntaxEditSelection& rSrc)
  117. {
  118. m_pOwnerCtrl = NULL;
  119. *this = rSrc;
  120. }
  121. #define XTP_SE_AX_DETACH(pObject)   if (pObject) { 
  122. pObject->Detach(); 
  123. pObject->InternalRelease(); }
  124. CXTPSyntaxEditSelection::~CXTPSyntaxEditSelection()
  125. {
  126. }
  127. void CXTPSyntaxEditSelection::SetStart_str(int nTextRow, int nStrPos)
  128. {
  129. selStart_str.nLine = nTextRow;
  130. selStart_str.nCol = nStrPos;
  131. selStart_disp.nLine = nTextRow;
  132. if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
  133. {
  134. selStart_disp.nCol = m_pOwnerCtrl->GetEditBuffer()->StrPosToCol(nTextRow, nStrPos);
  135. }
  136. else
  137. {
  138. ASSERT(FALSE);
  139. selStart_disp.nCol = nStrPos;
  140. }
  141. }
  142. void CXTPSyntaxEditSelection::SetEnd_str(int nTextRow, int nStrPos)
  143. {
  144. selEnd_str.nLine = nTextRow;
  145. selEnd_str.nCol = nStrPos;
  146. selEnd_disp.nLine = nTextRow;
  147. if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
  148. {
  149. selEnd_disp.nCol = m_pOwnerCtrl->GetEditBuffer()->StrPosToCol(nTextRow, nStrPos);
  150. }
  151. else
  152. {
  153. ASSERT(FALSE);
  154. selEnd_disp.nCol = nStrPos;
  155. }
  156. }
  157. void CXTPSyntaxEditSelection::SetStart_disp(int nTextRow, int nDispCol)
  158. {
  159. ASSERT(nDispCol > 0);
  160. nDispCol = max(1, nDispCol);
  161. selStart_disp.nLine = nTextRow;
  162. selStart_disp.nCol = nDispCol;
  163. selStart_str.nLine = nTextRow;
  164. if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
  165. {
  166. selStart_str.nCol = m_pOwnerCtrl->GetEditBuffer()->ColToStrPos(nTextRow, nDispCol);
  167. }
  168. else
  169. {
  170. ASSERT(FALSE);
  171. selStart_str.nCol = nDispCol;
  172. }
  173. }
  174. void CXTPSyntaxEditSelection::SetEnd_disp(int nTextRow, int nDispCol)
  175. {
  176. ASSERT(nDispCol > 0);
  177. nDispCol = max(1, nDispCol);
  178. selEnd_disp.nLine = nTextRow;
  179. selEnd_disp.nCol = nDispCol;
  180. selEnd_str.nLine = nTextRow;
  181. if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
  182. {
  183. selEnd_str.nCol = m_pOwnerCtrl->GetEditBuffer()->ColToStrPos(nTextRow, nDispCol);
  184. }
  185. else
  186. {
  187. ASSERT(FALSE);
  188. selEnd_str.nCol = nDispCol;
  189. }
  190. }
  191. BOOL CXTPSyntaxEditSelection::IsSelExist()
  192. {
  193. XTP_EDIT_LINECOL normStart = GetNormalStart_disp();
  194. XTP_EDIT_LINECOL normEnd = GetNormalEnd_disp();
  195. return normStart < normEnd;
  196. }
  197. BOOL CXTPSyntaxEditSelection::_IsInSel(BOOL bStr, int nTextRow, int nColX)
  198. {
  199. XTP_EDIT_LINECOL normStart = bStr ? GetNormalStart_str() : GetNormalStart_disp();
  200. XTP_EDIT_LINECOL normEnd = bStr ? GetNormalEnd_str() : GetNormalEnd_disp();
  201. if (!(normStart < normEnd))
  202. return FALSE;
  203. XTP_EDIT_LINECOL pos = XTP_EDIT_LINECOL::MakeLineCol(nTextRow, nColX);
  204. if (bBlockSelectionMode)
  205. {
  206. return pos.nLine >= normStart.nLine && pos.nLine < normEnd.nLine &&
  207. pos.nCol >= normStart.nCol && pos.nCol < normEnd.nCol;
  208. }
  209. return pos >= normStart && pos < normEnd;
  210. }
  211. BOOL CXTPSyntaxEditSelection::_IsIntersectSel(BOOL bStr, int nTextRow, int nCol1, int nCol2)
  212. {
  213. XTP_EDIT_LINECOL normStart = bStr ? GetNormalStart_str() : GetNormalStart_disp();
  214. XTP_EDIT_LINECOL normEnd = bStr ? GetNormalEnd_str() : GetNormalEnd_disp();
  215. if (!(normStart < normEnd))
  216. return FALSE;
  217. if (nTextRow != normEnd.nLine)
  218. {
  219. // infinit sel by end
  220. if (m_pOwnerCtrl->_IsVirtualSpaceActive())
  221. {
  222. normEnd.nCol = INT_MAX;
  223. }
  224. else
  225. {
  226. int nTextLenC = m_pOwnerCtrl->GetEditBuffer()->GetLineTextLengthC(nTextRow);
  227. if (bStr)
  228. normEnd.nCol = nTextLenC;
  229. else
  230. normEnd.nCol = m_pOwnerCtrl->GetEditBuffer()->StrPosToCol(nTextRow, nTextLenC);
  231. }
  232. }
  233. XTP_EDIT_LINECOL pos1 = XTP_EDIT_LINECOL::MakeLineCol(nTextRow, nCol1);
  234. XTP_EDIT_LINECOL pos2 = XTP_EDIT_LINECOL::MakeLineCol(nTextRow, nCol2);
  235. BOOL bIntersect = !(pos2 <= normStart || pos1 >= normEnd);
  236. if (bIntersect && bBlockSelectionMode)
  237. {
  238. // just condition by cols only
  239. bIntersect = !(pos2.nCol <= normStart.nCol || pos1.nCol >= normEnd.nCol);
  240. }
  241. return bIntersect;
  242. }
  243. int CXTPSyntaxEditSelection::GetSelStartForRow_str(int nTextRow, int nDispLine)
  244. {
  245. XTP_EDIT_LINECOL normStart = GetNormalStart_str();
  246. XTP_EDIT_LINECOL normEnd = GetNormalEnd_str();
  247. if (nTextRow >= normStart.nLine && nTextRow <= normEnd.nLine)
  248. {
  249. if (bBlockSelectionMode)
  250. {
  251. int nDispPos = GetNormalStart_disp().nCol;
  252. ASSERT(m_pOwnerCtrl);
  253. if (m_pOwnerCtrl)
  254. return m_pOwnerCtrl->GetDrawTextProcessor().DispPosToStrPos(nDispLine, nDispPos - 1, TRUE);
  255. //m_pOwnerCtrl->_IsVirtualSpaceActive());
  256. return normStart.nCol;
  257. }
  258. else
  259. {
  260. if (nTextRow == normStart.nLine)
  261. return normStart.nCol;
  262. else
  263. return 0;
  264. }
  265. }
  266. return 0;
  267. }
  268. int CXTPSyntaxEditSelection::GetSelEndForRow_str(int nTextRow, int nDispLine, BOOL* pbInfinitSelEnd)
  269. {
  270. if (pbInfinitSelEnd)
  271. *pbInfinitSelEnd = FALSE;
  272. ASSERT(m_pOwnerCtrl);
  273. if (!m_pOwnerCtrl)
  274. return 0;
  275. XTP_EDIT_LINECOL normStart = GetNormalStart_str();
  276. XTP_EDIT_LINECOL normEnd = GetNormalEnd_str();
  277. if (nTextRow >= normStart.nLine && nTextRow <= normEnd.nLine)
  278. {
  279. if (bBlockSelectionMode)
  280. {
  281. int nDispPos = GetNormalEnd_disp().nCol;
  282. return m_pOwnerCtrl->GetDrawTextProcessor().DispPosToStrPos(nDispLine, nDispPos - 1, TRUE);
  283. //m_pOwnerCtrl->_IsVirtualSpaceActive());
  284. }
  285. else
  286. {
  287. if (nTextRow == normEnd.nLine)
  288. {
  289. if (pbInfinitSelEnd && nSelStartTextRowFromLeftBar)
  290. *pbInfinitSelEnd = m_pOwnerCtrl->_IsVirtualSpaceActive();
  291. return normEnd.nCol;
  292. }
  293. else
  294. {
  295. int nDispPos = GetNormalEnd_disp().nCol;
  296. int nPos = m_pOwnerCtrl->GetDrawTextProcessor().DispPosToStrPos(nDispLine, nDispPos - 1,
  297. m_pOwnerCtrl->_IsVirtualSpaceActive());
  298. if (pbInfinitSelEnd)
  299. *pbInfinitSelEnd = m_pOwnerCtrl->_IsVirtualSpaceActive();
  300. int nRowTextLen = m_pOwnerCtrl->GetEditBuffer()->GetLineTextLengthC(nTextRow);
  301. nPos = max(nPos, nRowTextLen + 1);
  302. return nPos;
  303. }
  304. }
  305. }
  306. return 0;
  307. }
  308. void CXTPSyntaxEditSelection::Reset_str(int nTextRow, int nStrPos)
  309. {
  310. bSelectingRunning = FALSE;
  311. bWordSelectionMode = FALSE;
  312. bBlockSelectionMode = FALSE;
  313. nSelStartTextRowFromLeftBar = 0;
  314. SetStart_str(nTextRow, nStrPos);
  315. SetEnd_str(nTextRow, nStrPos);
  316. }
  317. void CXTPSyntaxEditSelection::Reset_disp(int nTextRow, int nDispCol)
  318. {
  319. bSelectingRunning = FALSE;
  320. bWordSelectionMode = FALSE;
  321. bBlockSelectionMode = FALSE;
  322. nSelStartTextRowFromLeftBar = 0;
  323. SetStart_disp(nTextRow, nDispCol);
  324. SetEnd_disp(nTextRow, nDispCol);
  325. }
  326. const CXTPSyntaxEditSelection& CXTPSyntaxEditSelection::operator=(const CXTPSyntaxEditSelection& rSrc)
  327. {
  328. if (!m_pOwnerCtrl)
  329. m_pOwnerCtrl = rSrc.m_pOwnerCtrl;
  330. bSelectingRunning = rSrc.bSelectingRunning;
  331. bWordSelectionMode = rSrc.bWordSelectionMode;
  332. bBlockSelectionMode = rSrc.bBlockSelectionMode;
  333. nSelStartTextRowFromLeftBar = rSrc.nSelStartTextRowFromLeftBar;
  334. selStart_disp = rSrc.selStart_disp;
  335. selEnd_disp = rSrc.selEnd_disp;
  336. selStart_str = rSrc.selStart_str;
  337. selEnd_str = rSrc.selEnd_str;
  338. return *this;
  339. }
  340. BOOL CXTPSyntaxEditSelection::operator==(const CXTPSyntaxEditSelection& rSrc) const
  341. {
  342. return  bSelectingRunning == rSrc.bSelectingRunning &&
  343. bWordSelectionMode == rSrc.bWordSelectionMode &&
  344. bBlockSelectionMode == rSrc.bBlockSelectionMode &&
  345. nSelStartTextRowFromLeftBar == rSrc.nSelStartTextRowFromLeftBar &&
  346. selStart_disp == rSrc.selStart_disp &&
  347. selEnd_disp == rSrc.selEnd_disp &&
  348. selStart_str == rSrc.selStart_str &&
  349. selEnd_str == rSrc.selEnd_str;
  350. }
  351. BOOL CXTPSyntaxEditSelection::operator!=(const CXTPSyntaxEditSelection& rSrc) const
  352. {
  353. return !operator==(rSrc);
  354. }