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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditDoc.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME SYNTAX EDIT LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Resource.h"
  22. // common includes
  23. #include "Common/XTPNotifyConnection.h"
  24. #include "Common/XTPSmartPtrInternalT.h"
  25. // syntax editor includes
  26. #include "XTPSyntaxEditDefines.h"
  27. #include "XTPSyntaxEditStruct.h"
  28. #include "XTPSyntaxEditLexPtrs.h"
  29. #include "XTPSyntaxEditLexClassSubObjT.h"
  30. #include "XTPSyntaxEditTextIterator.h"
  31. #include "XTPSyntaxEditSectionManager.h"
  32. #include "XTPSyntaxEditLexCfgFileReader.h"
  33. #include "XTPSyntaxEditLexClassSubObjDef.h"
  34. #include "XTPSyntaxEditLexClass.h"
  35. #include "XTPSyntaxEditLexParser.h"
  36. #include "XTPSyntaxEditBufferManager.h"
  37. #include "XTPSyntaxEditFindReplaceDlg.h"
  38. #include "XTPSyntaxEditCtrl.h"
  39. #include "XTPSyntaxEditDoc.h"
  40. #include "XTPSyntaxEditView.h"
  41. #ifdef _DEBUG
  42. #define new DEBUG_NEW
  43. #undef THIS_FILE
  44. static char THIS_FILE[] = __FILE__;
  45. #endif
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CXTPSyntaxEditDoc
  48. IMPLEMENT_DYNCREATE(CXTPSyntaxEditDoc, CDocument)
  49. BEGIN_MESSAGE_MAP(CXTPSyntaxEditDoc, CDocument)
  50. //{{AFX_MSG_MAP(CXTPSyntaxEditDoc)
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. CXTPSyntaxEditDoc::CXTPSyntaxEditDoc()
  54. : m_bAutoReload(FALSE)
  55. , m_bNewFile(TRUE)
  56. , m_bOpened(FALSE)
  57. , m_bDocCreated(FALSE)
  58. , m_iTopRow(1)
  59. , m_iHScrollPos(0)
  60. , m_bReloading(FALSE)
  61. {
  62. ::ZeroMemory(&m_curFileData, sizeof(WIN32_FIND_DATA));
  63. CWinApp* pWinApp = AfxGetApp();
  64. if (pWinApp != NULL)
  65. {
  66. m_bAutoReload = pWinApp->GetProfileInt(
  67. XTP_EDIT_REG_SETTINGS, XTP_EDIT_REG_AUTORELOAD, m_bAutoReload);
  68. }
  69. }
  70. CXTPSyntaxEditDoc::~CXTPSyntaxEditDoc()
  71. {
  72. }
  73. BOOL CXTPSyntaxEditDoc::IsReadonly()
  74. {
  75. return ((m_curFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY);
  76. }
  77. BOOL CXTPSyntaxEditDoc::SaveFileData(LPCTSTR lpszPathName)
  78. {
  79. HANDLE hFind = ::FindFirstFile(lpszPathName, &m_curFileData);
  80. if (hFind == INVALID_HANDLE_VALUE)
  81. return FALSE;
  82. ::FindClose(hFind);
  83. //  if (IsReadonly())
  84. //  {
  85. //      TRACE(_T("Cannot write to a read only file"));
  86. //      return FALSE;
  87. //  }
  88. return TRUE;
  89. }
  90. BOOL CXTPSyntaxEditDoc::OnNewDocument()
  91. {
  92. CWaitCursor wait;
  93. if (!CDocument::OnNewDocument())
  94. {
  95. return FALSE;
  96. }
  97. wait.Restore();
  98. m_bOpened = FALSE;
  99. m_bNewFile = TRUE;
  100. m_bDocCreated = TRUE;
  101. ::ZeroMemory(&m_curFileData, sizeof(WIN32_FIND_DATA));
  102. if (m_ptrDataMan)
  103. {
  104. m_ptrDataMan->InsertText(_T(""), 1,1, FALSE);
  105. }
  106. UpdateAllViews(NULL, xtpEditHintRefreshView);
  107. return TRUE;
  108. }
  109. BOOL CXTPSyntaxEditDoc::OnOpenDocument(LPCTSTR lpszPathName)
  110. {
  111. CWaitCursor wait;
  112. m_bNewFile = FALSE;
  113. BOOL bRes = CDocument::OnOpenDocument(lpszPathName);
  114. wait.Restore();
  115. if (bRes)
  116. {
  117. UpdateAllViews(NULL, xtpEditHintRefreshView);
  118. bRes = SaveFileData(lpszPathName);
  119. }
  120. if (!bRes && m_bAutoDelete)
  121. {
  122. delete this;
  123. }
  124. return bRes;
  125. }
  126. BOOL CXTPSyntaxEditDoc::OnSaveDocument(LPCTSTR lpszPathName)
  127. {
  128. CWaitCursor wait;
  129. if (!CDocument::OnSaveDocument(lpszPathName))
  130. return FALSE;
  131. if (!SaveFileData(lpszPathName))
  132. return FALSE;
  133. UpdateAllViews(NULL, xtpEditHintRefreshView);
  134. return TRUE;
  135. }
  136. BOOL CXTPSyntaxEditDoc::ReOpen()
  137. {
  138. return OnOpenDocument(GetPathName());
  139. }
  140. void CXTPSyntaxEditDoc::OnCloseDocument()
  141. {
  142. CWaitCursor wait;
  143. if (m_ptrDataMan)
  144. {
  145. m_ptrDataMan->Close();
  146. }
  147. CDocument::OnCloseDocument();
  148. }
  149. /////////////////////////////////////////////////////////////////////////////
  150. // CXTPSyntaxEditDoc serialization
  151. void CXTPSyntaxEditDoc::Serialize(CArchive& ar)
  152. {
  153. if (m_ptrDataMan)
  154. {
  155. CWaitCursor wait;
  156. m_ptrDataMan->Serialize(ar);
  157. }
  158. }
  159. /////////////////////////////////////////////////////////////////////////////
  160. // CXTPSyntaxEditDoc diagnostics
  161. #ifdef _DEBUG
  162. void CXTPSyntaxEditDoc::AssertValid() const
  163. {
  164. CDocument::AssertValid();
  165. }
  166. void CXTPSyntaxEditDoc::Dump(CDumpContext& dc) const
  167. {
  168. CDocument::Dump(dc);
  169. }
  170. #endif //_DEBUG
  171. /////////////////////////////////////////////////////////////////////////////
  172. // CXTPSyntaxEditDoc commands
  173. void CXTPSyntaxEditDoc::OnChangedViewList()
  174. {
  175. if (!m_bDocCreated)
  176. return;
  177. int iTopRow = 1;
  178. BOOL bFirst = TRUE;
  179. POSITION pos = GetFirstViewPosition();
  180. while (pos)
  181. {
  182. CXTPSyntaxEditView *pView = (CXTPSyntaxEditView *)GetNextView(pos);
  183. if (!pView->IsKindOf(RUNTIME_CLASS(CXTPSyntaxEditView)))
  184. continue;
  185. if (bFirst)
  186. {
  187. iTopRow = pView->GetTopRow();
  188. bFirst = FALSE;
  189. }
  190. else
  191. {
  192. pView->SetTopRow(iTopRow);
  193. }
  194. }
  195. CDocument::OnChangedViewList();
  196. }
  197. CXTPSyntaxEditBufferManager * CXTPSyntaxEditDoc::GetDataManager()
  198. {
  199. return m_ptrDataMan;
  200. }
  201. void CXTPSyntaxEditDoc::SetDataManager(CXTPSyntaxEditBufferManager *pDataMan)
  202. {
  203. m_ptrDataMan.SetPtr(pDataMan, TRUE);
  204. }
  205. void CXTPSyntaxEditDoc::SetConfigFile(LPCTSTR szPath)
  206. {
  207. if (m_ptrDataMan)
  208. {
  209. m_ptrDataMan->SetConfigFile(szPath);
  210. }
  211. }
  212. BOOL CXTPSyntaxEditDoc::CheckFileModified(LPCTSTR lpszPathName)
  213. {
  214. if (!GetAutoReload())
  215. return FALSE;
  216. WIN32_FIND_DATA newFileData;
  217. HANDLE hFound = ::FindFirstFile(lpszPathName, &newFileData);
  218. if (hFound != INVALID_HANDLE_VALUE)
  219. {
  220. ::FindClose(hFound);
  221. // If file attributes have changed or file write time has changed, reload file.
  222. if (!m_bReloading && (
  223. (m_curFileData.ftLastWriteTime.dwLowDateTime != newFileData.ftLastWriteTime.dwLowDateTime) ||
  224. (m_curFileData.ftLastWriteTime.dwHighDateTime != newFileData.ftLastWriteTime.dwHighDateTime) ||
  225. (m_curFileData.dwFileAttributes != newFileData.dwFileAttributes)))
  226. {
  227. m_bReloading = TRUE;
  228. CString csWarning;
  229. csWarning.Format(XTP_IDS_EDIT_MSG_WARN_RELOAD, lpszPathName);
  230. if (AfxMessageBox(csWarning, MB_YESNO|MB_ICONQUESTION) == IDNO)
  231. {
  232. m_bReloading = FALSE;
  233. return FALSE;
  234. }
  235. if (ReOpen())
  236. {
  237. ::memcpy(&m_curFileData, &newFileData, sizeof(WIN32_FIND_DATA));
  238. m_bReloading = FALSE;
  239. return TRUE;
  240. }
  241. }
  242. }
  243. return FALSE;
  244. }
  245. BOOL CXTPSyntaxEditDoc::GetAutoReload() const
  246. {
  247. return m_bAutoReload;
  248. }
  249. BOOL CXTPSyntaxEditDoc::SetAutoReload(BOOL bAutoReload, BOOL bUpdateReg/*=FALSE*/)
  250. {
  251. m_bAutoReload = bAutoReload;
  252. if (bUpdateReg)
  253. {
  254. CWinApp* pWinApp = AfxGetApp();
  255. if (pWinApp != NULL)
  256. {
  257. if (pWinApp->WriteProfileInt(XTP_EDIT_REG_SETTINGS, XTP_EDIT_REG_AUTORELOAD, (int)bAutoReload))
  258. return TRUE;
  259. }
  260. return FALSE;
  261. }
  262. return TRUE;
  263. }
  264. CXTPSyntaxEditView* CXTPSyntaxEditDoc::GetFirstView()
  265. {
  266. POSITION pos = GetFirstViewPosition();
  267. return DYNAMIC_DOWNCAST(CXTPSyntaxEditView, GetNextView(pos));
  268. }