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

对话框与窗口

开发平台:

Visual C++

  1. // SourceCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "styler.h"
  5. #include "SourceCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CSourceCtrl
  13. CSourceCtrl::CSourceCtrl()
  14. {
  15. LOGFONT lfIcon;
  16. VERIFY( ::SystemParametersInfo( SPI_GETICONTITLELOGFONT, sizeof( lfIcon ), &lfIcon, 0 ) );
  17. VERIFY( m_fntText.CreateFontIndirect(&lfIcon  ) );
  18. }
  19. CSourceCtrl::~CSourceCtrl()
  20. {
  21. }
  22. BOOL CSourceCtrl::Create(CWnd* pParent)
  23. {
  24. if (!CRichEditCtrl::Create(WS_VSCROLL | WS_HSCROLL| WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_SAVESEL | ES_READONLY , 
  25. CRect(0,0,0,0), pParent, 1))
  26. {
  27. return FALSE;
  28. }
  29. SetBackgroundColor(FALSE, GetSysColor(COLOR_3DFACE));
  30. SetFont(&m_fntText, FALSE);
  31. return TRUE;
  32. }
  33. void CSourceCtrl::Refresh(CHtmlView* pView, BOOL /*bForce*/)
  34. {
  35. USES_CONVERSION;
  36. HRESULT hr;
  37. LPDISPATCH lpDisp = pView->GetHtmlDocument();
  38. if (!lpDisp)
  39. return;
  40. // Verify that what we get is a pointer to a IHTMLDocument2 
  41. // interface. To be sure, let's query for 
  42. // the IHTMLDocument2 interface (through smart pointers)
  43. CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML(lpDisp);
  44. // The previous step is sufficient to keep Explorer aside
  45. // without an explicit check against the loader module
  46. // Extract the source code of the document
  47. CComPtr<IHTMLElement> m_pBody = NULL;
  48. if (spHTML)
  49. {
  50. // Get the BODY object
  51. hr = spHTML->get_body(&m_pBody); 
  52. if (FAILED(hr) || !m_pBody)
  53. return;
  54. // Get the HTML text
  55. BSTR bstrHTMLText;
  56. hr = m_pBody->get_outerHTML(&bstrHTMLText); 
  57. if (FAILED(hr))
  58. return;
  59. // Convert the text from Unicode to ANSI
  60. int nLength = SysStringLen(bstrHTMLText);
  61. LPTSTR psz = new TCHAR[nLength + 1];
  62. lstrcpy(psz, OLE2T(bstrHTMLText));
  63. SetTextFormat(psz);
  64. delete [] psz;
  65. }
  66. else // The document isn't a HTML page
  67. {
  68. }
  69. lpDisp->Release();
  70. }
  71. void AddLine(CStringArray& sa, LPTSTR pStart, int nCount)
  72. {
  73. CString str;
  74. LPTSTR pLine = str.GetBufferSetLength(nCount);
  75. STRNCPY_S(pLine, nCount + 1, pStart, nCount);
  76. pLine[nCount] = 0;
  77. str.TrimLeft();
  78. if (str != "")
  79. sa.Add(str);
  80. }
  81. CString GetTag(CString str)
  82. {
  83. str.TrimLeft();
  84. if (str.IsEmpty() || str[0] != _T('<')) 
  85. return _T("");
  86. int nStart = 1;
  87. while (nStart < str.GetLength() && str[nStart] == ' ') nStart++;
  88. int nEnd = str.Find(' ', nStart);
  89. int nTag = str.Find('>', nStart);
  90. if (nEnd != -1) 
  91. {
  92. if (nTag != -1)
  93. nEnd = min(nEnd, nTag);
  94. } else nEnd = nTag;
  95. if (nEnd == -1)
  96. {
  97. return _T("");
  98. }
  99. CString strTag  = str.Mid(nStart, nEnd - nStart);
  100. return strTag;
  101. }
  102. void Format(CStringArray& sa)
  103. {
  104. for (int i = 0; i < sa.GetSize(); i++)
  105. {
  106. CString& strNext = sa[i];
  107. CString strTag = GetTag(strNext);
  108. if (!strTag.IsEmpty() && strTag[0] == '/')
  109. {
  110. CString strClose = strTag.Right(strTag.GetLength() - 1);
  111. int nRefCount = 1;
  112. int k = i - 1;
  113. while (k >= 0)
  114. {
  115. CString& str = sa[k];
  116. CString strOpen = GetTag(str);
  117. if (strOpen == strTag) nRefCount ++;
  118. if (strOpen == strClose)
  119. {
  120. nRefCount --;
  121. if (nRefCount == 0) break;
  122. }
  123. k--;
  124. }
  125. if (k>= 0)
  126. {
  127. while (++k < i)
  128. {
  129. sa[k] = _T("  ") + sa[k];
  130. }
  131. }
  132. }
  133. }
  134. }
  135. void CSourceCtrl::SetTextFormat(LPTSTR pText)
  136. {
  137. CStringArray sa;
  138. CString str;
  139. TCHAR* pChar = pText;
  140. TCHAR* pStart = pText;
  141. while (*pChar)
  142. {
  143. if (*pChar == '<' && pStart != pChar)
  144. {
  145. AddLine(sa, pStart, (int)(pChar - pStart));
  146. pStart = pChar;
  147. } else
  148. if (*pChar == '>')
  149. {
  150. AddLine(sa, pStart, int(pChar - pStart + 1));
  151. pStart = pChar + 1;
  152. }
  153. if (*pChar == 'n' || *pChar == 'r')
  154. *pChar = ' ';
  155. pChar ++;
  156. }
  157. if (pChar!=pStart)
  158. {
  159. AddLine(sa, pStart, int(pChar - pStart));
  160. }
  161. Format(sa);
  162. LockWindowUpdate();
  163. SetSel(0, -1);
  164. Clear();
  165. CString strBody;
  166. for (int i = 0; i < sa.GetSize(); i++)
  167. {
  168. strBody = sa[i] + _T("rn");
  169. if (strBody.Find('<') == -1)
  170. {
  171. CHARFORMAT cf;
  172. cf.cbSize = sizeof CHARFORMAT;
  173. cf.dwMask = CFM_BOLD;
  174. cf.dwEffects = CFE_BOLD;
  175. SetSelectionCharFormat (cf);
  176. }
  177. ReplaceSel(strBody);
  178. }
  179. UnlockWindowUpdate();
  180. }
  181. BEGIN_MESSAGE_MAP(CSourceCtrl, CRichEditCtrl)
  182. //{{AFX_MSG_MAP(CSourceCtrl)
  183. // NOTE - the ClassWizard will add and remove mapping macros here.
  184. //}}AFX_MSG_MAP
  185. END_MESSAGE_MAP()
  186. /////////////////////////////////////////////////////////////////////////////
  187. // CSourceCtrl message handlers