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

对话框与窗口

开发平台:

Visual C++

  1. // MarkupPadDoc.cpp : implementation of the CMarkupPadDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "MarkupPad.h"
  5. #include "MarkupPadDoc.h"
  6. #include "MarkupPadView.h"
  7. #include "MarkupPadEdit.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CMarkupPadDoc
  15. IMPLEMENT_DYNCREATE(CMarkupPadDoc, CDocument)
  16. BEGIN_MESSAGE_MAP(CMarkupPadDoc, CDocument)
  17. //{{AFX_MSG_MAP(CMarkupPadDoc)
  18. // NOTE - the ClassWizard will add and remove mapping macros here.
  19. //    DO NOT EDIT what you see in these blocks of generated code!
  20. //}}AFX_MSG_MAP
  21. END_MESSAGE_MAP()
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CMarkupPadDoc construction/destruction
  24. CMarkupPadDoc::CMarkupPadDoc()
  25. {
  26. }
  27. CMarkupPadDoc::~CMarkupPadDoc()
  28. {
  29. }
  30. void CMarkupPadDoc::SetTitle(LPCTSTR lpszTitle)
  31. {
  32. CDocument::SetTitle(lpszTitle);
  33. }
  34. BOOL CMarkupPadDoc::OnNewDocument()
  35. {
  36. if (!CDocument::OnNewDocument())
  37. return FALSE;
  38. POSITION pos = GetFirstViewPosition();
  39. while (pos)
  40. {
  41. CView* pView = GetNextView(pos);
  42. if (pView->IsKindOf(RUNTIME_CLASS(CEditView)))
  43. {
  44. pView->SetWindowText(NULL);
  45. }
  46. else if (pView->IsKindOf(RUNTIME_CLASS(CMarkupPadView)))
  47. {
  48. MARKUP_RELEASE(((CMarkupPadView*)pView)->m_pUIElement);
  49. }
  50. }
  51. return TRUE;
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CMarkupPadDoc serialization
  55. void WriteByte(CArchive& ar, int nByte)
  56. {
  57. BYTE n = (BYTE)nByte;
  58. ar.Write(&n, 1);
  59. }
  60. CEditView* CMarkupPadDoc::GetView() const
  61. {
  62. // find the first view - if there are no views
  63. // we must return NULL
  64. POSITION pos = GetFirstViewPosition();
  65. if (pos == NULL)
  66. return NULL;
  67. // find the first view that is a CRichEditView
  68. CView* pView;
  69. while (pos != NULL)
  70. {
  71. pView = GetNextView(pos);
  72. if (pView->IsKindOf(RUNTIME_CLASS(CEditView)))
  73. return (CEditView*) pView;
  74. }
  75. // can't find one--return NULL
  76. return NULL;
  77. }
  78. void CMarkupPadDoc::Serialize(CArchive& ar)
  79. {
  80. //CDocument::m_bRTF = FALSE;
  81. //CDocument::Serialize(ar);
  82. CEditView* pView = GetView();
  83. if (pView != NULL)
  84. {
  85. if (ar.IsStoring())
  86. {
  87. LPWSTR lpBuffer = ((CMarkupPadEdit*)pView)->GetUnicodeText();
  88. if (lpBuffer)
  89. {
  90. int nLen = (int)wcslen(lpBuffer);
  91. for (int i = 0; i < nLen; i++)
  92. {
  93. WCHAR c = lpBuffer[i];
  94. if (c == 'r' && lpBuffer[i + 1] != 'n')
  95. {
  96. WriteByte(ar, 'r');
  97. WriteByte(ar, 'n');
  98. }
  99. else if (c < (1 << 7))
  100. {
  101. WriteByte(ar, c);
  102. else if (c < (1 << 11))
  103. {
  104. WriteByte(ar, (c >> 6) | 0xc0);
  105. WriteByte(ar, (c & 0x3f) | 0x80);
  106. else if (c < (1 << 16))
  107. {
  108. WriteByte(ar, (c >> 12) | 0xe0);
  109. WriteByte(ar, ((c >> 6) & 0x3f) | 0x80);
  110. WriteByte(ar, (c & 0x3f) | 0x80);
  111. else if (c < (1 << 21))
  112. {
  113. WriteByte(ar, (c >> 18) | 0xe0);
  114. WriteByte(ar, ((c >> 12) & 0x3f) | 0x80);
  115. WriteByte(ar, ((c >> 6) & 0x3f) | 0x80);
  116. WriteByte(ar, (c & 0x3f) | 0x80);
  117. }
  118. }
  119. delete[] lpBuffer;
  120. }
  121. }
  122. else
  123. {
  124. //CDocument::Serialize(ar);
  125. CMemFile mf;
  126. WCHAR c;
  127. char t;
  128. while (ar.Read(&t, 1) == 1)
  129. {
  130. if( 0 == ( t & 'x80' ) ) 
  131. {
  132. c = t;
  133. }
  134. else if('xF0' == (t & 'xF0')) // 1111 - error, more than 16-bit char
  135. {
  136. }
  137. else if( 'xE0' == (t & 'xF0')) // 1110xxxx 10xxxxxx 10xxxxxx
  138. {
  139. char t2;
  140. char t3;
  141. ar.Read(&t2, 1);
  142. ar.Read(&t3, 1);
  143. c = (WCHAR)((WCHAR(t & 'x0F') << 12 ) | ( WCHAR(t2 & 'x3F' ) << 6 ) | WCHAR(t3 & 'x3F' ));
  144. }
  145. else if( 'xC0' == (t & 'xE0')) // 110xxxxx 10xxxxxx 
  146. {
  147. char t2;
  148. ar.Read(&t2, 1);
  149. c = (WCHAR)((WCHAR( t & 'x1F' ) << 6 ) | ( t2 & 'x3F' ));
  150. }
  151. else 
  152. {
  153. }
  154. mf.Write(&c, sizeof(WCHAR));
  155. }
  156. mf.SeekToBegin();
  157. EDITSTREAM es = {0, 0, &CMarkupPadDoc::RichTextCtrlCallbackIn};
  158. es.dwCookie = (DWORD_PTR)&mf;
  159. pView->SendMessage(EM_STREAMIN, SF_TEXT | SF_UNICODE, (LPARAM)&es);
  160. }
  161. }
  162. }
  163. DWORD CALLBACK CMarkupPadDoc::RichTextCtrlCallbackIn(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
  164. {
  165. CFile* pFile = (CFile*) dwCookie;
  166. *pcb = pFile->Read(pbBuff, cb);
  167. return 0;
  168. }
  169. /////////////////////////////////////////////////////////////////////////////
  170. // CMarkupPadDoc diagnostics
  171. #ifdef _DEBUG
  172. void CMarkupPadDoc::AssertValid() const
  173. {
  174. CDocument::AssertValid();
  175. }
  176. void CMarkupPadDoc::Dump(CDumpContext& dc) const
  177. {
  178. CDocument::Dump(dc);
  179. }
  180. #endif //_DEBUG
  181. /////////////////////////////////////////////////////////////////////////////
  182. // CMarkupPadDoc commands