WORDPDOC.CPP
上传用户:aakk678
上传日期:2022-07-09
资源大小:406k
文件大小:16k
源码类别:

界面编程

开发平台:

Visual C++

  1. // wordpdoc.cpp : implementation of the CWordPadDoc class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1997 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "wordpad.h"
  14. #include "wordpdoc.h"
  15. #include "wordpvw.h"
  16. #include "cntritem.h"
  17. #include "srvritem.h"
  18. #include "formatba.h"
  19. #include "mainfrm.h"
  20. #include "ipframe.h"
  21. #include "buttondi.h"
  22. #include "helpids.h"
  23. #include "strings.h"
  24. #include "unitspag.h"
  25. #include "docopt.h"
  26. #include "optionsh.h"
  27. #include "multconv.h"
  28. #ifdef _DEBUG
  29. #undef THIS_FILE
  30. static char BASED_CODE THIS_FILE[] = __FILE__;
  31. #endif
  32. extern BOOL AFXAPI AfxFullPath(LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
  33. extern UINT AFXAPI AfxGetFileTitle(LPCTSTR lpszPathName, LPTSTR lpszTitle, UINT nMax);
  34. #ifndef OFN_EXPLORER
  35. #define OFN_EXPLORER 0x00080000L
  36. #endif
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CWordPadDoc
  39. IMPLEMENT_DYNCREATE(CWordPadDoc, CRichEditDoc)
  40. BEGIN_MESSAGE_MAP(CWordPadDoc, CRichEditDoc)
  41. //{{AFX_MSG_MAP(CWordPadDoc)
  42. ON_COMMAND(ID_VIEW_OPTIONS, OnViewOptions)
  43. ON_UPDATE_COMMAND_UI(ID_OLE_VERB_POPUP, OnUpdateOleVerbPopup)
  44. ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
  45. ON_UPDATE_COMMAND_UI(ID_FILE_NEW, OnUpdateIfEmbedded)
  46. ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateIfEmbedded)
  47. ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateIfEmbedded)
  48. ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateIfEmbedded)
  49. ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_DIRECT, OnUpdateIfEmbedded)
  50. ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateIfEmbedded)
  51. //}}AFX_MSG_MAP
  52. ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
  53. ON_COMMAND(ID_OLE_EDIT_LINKS, CRichEditDoc::OnEditLinks)
  54. ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, CRichEditDoc::OnUpdateObjectVerbMenu)
  55. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, CRichEditDoc::OnUpdateObjectVerbMenu)
  56. ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, CRichEditDoc::OnUpdateEditLinksMenu)
  57. END_MESSAGE_MAP()
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CWordPadDoc construction/destruction
  60. CWordPadDoc::CWordPadDoc()
  61. {
  62. m_nDocType = -1;
  63. m_nNewDocType = -1;
  64. }
  65. BOOL CWordPadDoc::OnNewDocument()
  66. {
  67. if (!CRichEditDoc::OnNewDocument())
  68. return FALSE;
  69.   //correct type already set in theApp.m_nNewDocType;
  70.   int nDocType = (IsEmbedded()) ? RD_EMBEDDED : theApp.m_nNewDocType;
  71. GetView()->SetDefaultFont(IsTextType(nDocType));
  72. SetDocType(nDocType);
  73. return TRUE;
  74. }
  75. void CWordPadDoc::ReportSaveLoadException(LPCTSTR lpszPathName,
  76. CException* e, BOOL bSaving, UINT nIDP)
  77. {
  78. if (!m_bDeferErrors && e != NULL)
  79. {
  80. ASSERT_VALID(e);
  81. if (e->IsKindOf(RUNTIME_CLASS(CFileException)))
  82. {
  83. switch (((CFileException*)e)->m_cause)
  84. {
  85. case CFileException::fileNotFound:
  86. case CFileException::badPath:
  87. nIDP = AFX_IDP_FAILED_INVALID_PATH;
  88. break;
  89. case CFileException::diskFull:
  90. nIDP = AFX_IDP_FAILED_DISK_FULL;
  91. break;
  92. case CFileException::accessDenied:
  93. nIDP = bSaving ? AFX_IDP_FAILED_ACCESS_WRITE :
  94. AFX_IDP_FAILED_ACCESS_READ;
  95. if (((CFileException*)e)->m_lOsError == ERROR_WRITE_PROTECT)
  96. nIDP = IDS_WRITEPROTECT;
  97. break;
  98. case CFileException::tooManyOpenFiles:
  99. nIDP = IDS_TOOMANYFILES;
  100. break;
  101. case CFileException::directoryFull:
  102. nIDP = IDS_DIRFULL;
  103. break;
  104. case CFileException::sharingViolation:
  105. nIDP = IDS_SHAREVIOLATION;
  106. break;
  107. case CFileException::lockViolation:
  108. case CFileException::badSeek:
  109. case CFileException::generic:
  110. case CFileException::invalidFile:
  111. case CFileException::hardIO:
  112. nIDP = bSaving ? AFX_IDP_FAILED_IO_ERROR_WRITE :
  113. AFX_IDP_FAILED_IO_ERROR_READ;
  114. break;
  115. default:
  116. break;
  117. }
  118. CString prompt;
  119. AfxFormatString1(prompt, nIDP, lpszPathName);
  120. AfxMessageBox(prompt, MB_ICONEXCLAMATION, nIDP);
  121. return;
  122. }
  123. }
  124. CRichEditDoc::ReportSaveLoadException(lpszPathName, e, bSaving, nIDP);
  125. return;
  126. }
  127. BOOL CWordPadDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  128. {
  129. if (m_lpRootStg != NULL) // we are embedded
  130. {
  131. // we really want to use the converter on this storage
  132. m_nNewDocType = RD_EMBEDDED;
  133. }
  134. else
  135. {
  136. if (theApp.cmdInfo.m_bForceTextMode)
  137. m_nNewDocType = RD_TEXT;
  138. else
  139. {
  140. CFileException fe;
  141. m_nNewDocType = GetDocTypeFromName(lpszPathName, fe);
  142. if (m_nNewDocType == -1)
  143. {
  144. ReportSaveLoadException(lpszPathName, &fe, FALSE, 
  145. AFX_IDP_FAILED_TO_OPEN_DOC);
  146. return FALSE;
  147. }
  148. if (m_nNewDocType == RD_TEXT && theApp.m_bForceOEM)
  149. m_nNewDocType = RD_OEMTEXT;
  150. }
  151. ScanForConverters();
  152. if (!doctypes[m_nNewDocType].bRead)
  153. {
  154. CString str;
  155. CString strName = doctypes[m_nNewDocType].GetString(DOCTYPE_DOCTYPE);
  156. AfxFormatString1(str, IDS_CANT_LOAD, strName);
  157. AfxMessageBox(str, MB_OK|MB_ICONINFORMATION);
  158. return FALSE;
  159. }
  160. }
  161. // SetDocType(nNewDocType);
  162. if (!CRichEditDoc::OnOpenDocument(lpszPathName))
  163. return FALSE;
  164. return TRUE;
  165. }
  166. void CWordPadDoc::Serialize(CArchive& ar)
  167. {
  168. COleMessageFilter* pFilter = AfxOleGetMessageFilter();
  169. ASSERT(pFilter != NULL);
  170. pFilter->EnableBusyDialog(FALSE);
  171. if (ar.IsLoading())
  172. SetDocType(m_nNewDocType);
  173. CRichEditDoc::Serialize(ar);
  174. pFilter->EnableBusyDialog(TRUE);
  175. }
  176. BOOL CWordPadDoc::DoSave(LPCTSTR pszPathName, BOOL bReplace /*=TRUE*/)
  177. // Save the document data to a file
  178. // pszPathName = path name where to save document file
  179. // if pszPathName is NULL then the user will be prompted (SaveAs)
  180. // note: pszPathName can be different than 'm_strPathName'
  181. // if 'bReplace' is TRUE will change file name if successful (SaveAs)
  182. // if 'bReplace' is FALSE will not change path name (SaveCopyAs)
  183. {
  184. CString newName = pszPathName;
  185. int nOrigDocType = m_nDocType;  //saved in case of SaveCopyAs or failure
  186. // newName bWrite type result
  187. // empty TRUE - SaveAs dialog
  188. // empty FALSE - SaveAs dialog
  189. // notempty TRUE - nothing
  190. // notempty FALSE W6 warn (change to wordpad, save as, cancel)
  191. // notempty FALSE other warn (save as, cancel)
  192. BOOL bModified = IsModified();
  193. ScanForConverters();
  194. BOOL bSaveAs = FALSE;
  195. if (newName.IsEmpty())
  196. bSaveAs = TRUE;
  197. else if (!doctypes[m_nDocType].bWrite)
  198. {
  199. if (m_nDocType == RD_WINWORD6)
  200. {
  201. // DWORD nHelpIDs[] = 
  202. // {
  203. // 0, 0
  204. // };
  205. int nRes = CButtonDialog::DisplayMessageBox(
  206. MAKEINTRESOURCE(IDS_WORD6_WARNING), AfxGetAppName(), 
  207. MAKEINTRESOURCE(IDS_WORD6_WARNING_BUTTONS), 
  208. MB_ICONQUESTION, 1, 2);
  209. if (nRes == 0) // Save
  210. SetDocType(RD_WORDPAD, TRUE);
  211. else if (nRes == 2) // Cancel
  212. return FALSE;
  213. else
  214. bSaveAs = TRUE;
  215. // else save as
  216. }
  217. else // 
  218. {
  219. if (AfxMessageBox(IDS_SAVE_UNSUPPORTED, 
  220. MB_YESNO | MB_ICONQUESTION) != IDYES)
  221. {
  222. return FALSE;
  223. }
  224. else
  225. bSaveAs = TRUE;
  226. }
  227. }
  228. if (m_lpRootStg == NULL && IsTextType(m_nDocType) && 
  229. !GetView()->IsFormatText())
  230. {
  231. // formatting changed in plain old text file
  232. DWORD nHelpIDs[] = 
  233. {
  234. 0, IDH_WORDPAD_WORD6FILE,
  235. 0, IDH_WORDPAD_FORMATTED,
  236. 0, IDH_WORDPAD_TEXTFILE,
  237. 0, 0
  238. };
  239. CString str;
  240. AfxFormatString1(str, IDS_SAVE_FORMAT_TEXT, GetTitle());
  241. int nRes = CButtonDialog::DisplayMessageBox(str, 
  242. MAKEINTRESOURCE(AFX_IDS_APP_TITLE), 
  243. MAKEINTRESOURCE(IDS_TF_BUTTONS), MB_ICONQUESTION, 0, 3, nHelpIDs);
  244. if (nRes == 3)
  245. return FALSE;
  246. int nDocType = (nRes == 0) ? RD_DEFAULT: //Word 6
  247. (nRes == 1) ? RD_RICHTEXT : //RTF
  248. RD_TEXT; //text
  249. if (IsTextType(m_nDocType) && nDocType != RD_TEXT)
  250. SetDocType(nDocType, TRUE);
  251. if (nDocType != RD_TEXT)
  252. bSaveAs = TRUE;
  253. }
  254. GetView()->GetParentFrame()->RecalcLayout();
  255. if (bSaveAs)
  256. {
  257. newName = m_strPathName;
  258. if (bReplace && newName.IsEmpty())
  259. {
  260. newName = m_strTitle;
  261. int iBad = newName.FindOneOf(_T(" #%;/\"));    // dubious filename
  262. if (iBad != -1)
  263. newName.ReleaseBuffer(iBad);
  264. // append the default suffix if there is one
  265. newName += GetExtFromType(m_nDocType);
  266. }
  267. int nDocType = m_nDocType;
  268. if (!theApp.PromptForFileName(newName, 
  269. bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY,
  270. OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE, &nDocType))
  271. {
  272. SetDocType(nOrigDocType, TRUE);
  273. return FALSE;       // don't even try to save
  274. }
  275. SetDocType(nDocType, TRUE);
  276. }
  277. BeginWaitCursor();
  278. if (!OnSaveDocument(newName))
  279. {
  280. if (pszPathName == NULL)
  281. {
  282. // be sure to delete the file
  283. TRY 
  284. {
  285. CFile::Remove(newName);
  286. }
  287. CATCH_ALL(e)
  288. {
  289. TRACE0("Warning: failed to delete file after failed SaveAsn");
  290. }
  291. END_CATCH_ALL
  292. }
  293. // restore orginal document type
  294. SetDocType(nOrigDocType, TRUE);
  295. EndWaitCursor();
  296. return FALSE;
  297. }
  298. EndWaitCursor();
  299. if (bReplace)
  300. {
  301. int nType = m_nDocType;
  302. SetDocType(nOrigDocType, TRUE);
  303. SetDocType(nType);
  304. // Reset the title and change the document name
  305. SetPathName(newName, TRUE);
  306. ASSERT(m_strPathName == newName);       // must be set
  307. }
  308. else // SaveCopyAs
  309. {
  310. SetDocType(nOrigDocType, TRUE);
  311. SetModifiedFlag(bModified);
  312. }
  313. return TRUE;        // success
  314. }
  315. class COIPF : public COleIPFrameWnd
  316. {
  317. public:
  318. CFrameWnd* GetMainFrame() { return m_pMainFrame;}
  319. CFrameWnd* GetDocFrame() { return m_pDocFrame;}
  320. };
  321. void CWordPadDoc::OnDeactivateUI(BOOL bUndoable)
  322. {
  323. if (GetView()->m_bDelayUpdateItems)
  324. UpdateAllItems(NULL);
  325. SaveState(m_nDocType);
  326. CRichEditDoc::OnDeactivateUI(bUndoable);
  327. COIPF* pFrame = (COIPF*)m_pInPlaceFrame;
  328. if (pFrame != NULL)
  329. {
  330. if (pFrame->GetMainFrame() != NULL)
  331. ForceDelayed(pFrame->GetMainFrame());
  332. if (pFrame->GetDocFrame() != NULL)
  333. ForceDelayed(pFrame->GetDocFrame());
  334. }
  335. }
  336. void CWordPadDoc::ForceDelayed(CFrameWnd* pFrameWnd)
  337. {
  338. ASSERT_VALID(this);
  339. ASSERT_VALID(pFrameWnd);
  340. POSITION pos = pFrameWnd->m_listControlBars.GetHeadPosition();
  341. while (pos != NULL)
  342. {
  343. // show/hide the next control bar
  344. CControlBar* pBar =
  345. (CControlBar*)pFrameWnd->m_listControlBars.GetNext(pos);
  346. BOOL bVis = pBar->GetStyle() & WS_VISIBLE;
  347. UINT swpFlags = 0;
  348. if ((pBar->m_nStateFlags & CControlBar::delayHide) && bVis)
  349. swpFlags = SWP_HIDEWINDOW;
  350. else if ((pBar->m_nStateFlags & CControlBar::delayShow) && !bVis)
  351. swpFlags = SWP_SHOWWINDOW;
  352. pBar->m_nStateFlags &= ~(CControlBar::delayShow|CControlBar::delayHide);
  353. if (swpFlags != 0)
  354. {
  355. pBar->SetWindowPos(NULL, 0, 0, 0, 0, swpFlags|
  356. SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
  357. }
  358. }
  359. }
  360. /////////////////////////////////////////////////////////////////////////////
  361. // CWordPadDoc Attributes
  362. CLSID CWordPadDoc::GetClassID()
  363. {
  364. return (m_pFactory == NULL) ? CLSID_NULL : m_pFactory->GetClassID();
  365. }
  366. void CWordPadDoc::SetDocType(int nNewDocType, BOOL bNoOptionChange)
  367. {
  368. ASSERT(nNewDocType != -1);
  369. if (nNewDocType == m_nDocType)
  370. return;
  371. m_bRTF = !IsTextType(nNewDocType);
  372. if (bNoOptionChange)
  373. m_nDocType = nNewDocType;
  374. else
  375. {
  376. SaveState(m_nDocType);
  377. m_nDocType = nNewDocType;
  378. RestoreState(m_nDocType);
  379. }
  380. }
  381. CWordPadView* CWordPadDoc::GetView()
  382. {
  383. POSITION pos = GetFirstViewPosition();
  384. return (CWordPadView* )GetNextView( pos );
  385. }
  386. /////////////////////////////////////////////////////////////////////////////
  387. // CWordPadDoc Operations
  388. CFile* CWordPadDoc::GetFile(LPCTSTR pszPathName, UINT nOpenFlags, CFileException* pException)
  389. {
  390. CTrackFile* pFile = NULL;
  391. CFrameWnd* pWnd = GetView()->GetParentFrame();
  392. #ifdef CONVERTERS
  393. ScanForConverters();
  394. // if writing use current doc type otherwise use new doc type
  395. int nType = (nOpenFlags & CFile::modeReadWrite) ? m_nDocType : m_nNewDocType;
  396. // m_nNewDocType will be same as m_nDocType except when opening a new file
  397. if (doctypes[nType].pszConverterName != NULL)
  398. pFile = new CConverter(doctypes[nType].pszConverterName, pWnd);
  399. else
  400. #endif
  401. if (nType == RD_OEMTEXT)
  402. pFile = new COEMFile(pWnd);
  403. else
  404. pFile = new CTrackFile(pWnd);
  405.   if (!pFile->Open(pszPathName, nOpenFlags, pException))
  406. {
  407.   delete pFile;
  408. return NULL;
  409. }
  410. if (nOpenFlags & (CFile::modeWrite | CFile::modeReadWrite))
  411. pFile->m_dwLength = 0; // can't estimate this
  412. else
  413. pFile->m_dwLength = pFile->GetLength();
  414. return pFile;
  415. }
  416. CRichEditCntrItem* CWordPadDoc::CreateClientItem(REOBJECT* preo) const
  417. {
  418. // cast away constness of this
  419. return new CWordPadCntrItem(preo, (CWordPadDoc*)this);
  420. }
  421. /////////////////////////////////////////////////////////////////////////////
  422. // CWordPadDoc server implementation
  423. COleServerItem* CWordPadDoc::OnGetEmbeddedItem()
  424. {
  425. // OnGetEmbeddedItem is called by the framework to get the COleServerItem
  426. //  that is associated with the document.  It is only called when necessary.
  427. CEmbeddedItem* pItem = new CEmbeddedItem(this);
  428. ASSERT_VALID(pItem);
  429. return pItem;
  430. }
  431. /////////////////////////////////////////////////////////////////////////////
  432. // CWordPadDoc serialization
  433. /////////////////////////////////////////////////////////////////////////////
  434. // CWordPadDoc diagnostics
  435. #ifdef _DEBUG
  436. void CWordPadDoc::AssertValid() const
  437. {
  438. CRichEditDoc::AssertValid();
  439. }
  440. void CWordPadDoc::Dump(CDumpContext& dc) const
  441. {
  442. CRichEditDoc::Dump(dc);
  443. }
  444. #endif //_DEBUG
  445. /////////////////////////////////////////////////////////////////////////////
  446. // CWordPadDoc commands
  447. int CWordPadDoc::MapType(int nType)
  448. {
  449. if (nType == RD_OEMTEXT)
  450. nType = RD_TEXT;
  451. else if (!IsInPlaceActive() && nType == RD_EMBEDDED)
  452. nType = RD_RICHTEXT;
  453. return nType;
  454. }
  455. void CWordPadDoc::OnViewOptions()
  456. {
  457. int nType = MapType(m_nDocType);
  458. int nFirstPage = 3;
  459. if (nType == RD_TEXT)
  460. nFirstPage = 1;
  461. else if (nType == RD_RICHTEXT)
  462. nFirstPage = 2;
  463. else if (nType == RD_WRITE)
  464. nFirstPage = 4;
  465. else if (nType == RD_EMBEDDED)
  466. nFirstPage = 5;
  467. SaveState(nType);
  468. COptionSheet sheet(IDS_OPTIONS, NULL, nFirstPage);
  469. if (sheet.DoModal() == IDOK)
  470. {
  471. CWordPadView* pView = GetView();
  472. if (theApp.m_bWordSel)
  473. pView->GetRichEditCtrl().SetOptions(ECOOP_OR, ECO_AUTOWORDSELECTION);
  474. else
  475. {
  476. pView->GetRichEditCtrl().SetOptions(ECOOP_AND, 
  477. ~(DWORD)ECO_AUTOWORDSELECTION);
  478. }
  479. RestoreState(nType);
  480. }
  481. }
  482. void CWordPadDoc::OnUpdateOleVerbPopup(CCmdUI* pCmdUI) 
  483. {
  484. pCmdUI->m_pParentMenu = pCmdUI->m_pMenu;
  485. CRichEditDoc::OnUpdateObjectVerbMenu(pCmdUI);
  486. }
  487. BOOL CWordPadDoc::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
  488. {
  489. if (nCode == CN_COMMAND && nID == ID_OLE_VERB_POPUP)
  490. nID = ID_OLE_VERB_FIRST;
  491. return CRichEditDoc::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  492. }
  493. void CWordPadDoc::SaveState(int nType)
  494. {
  495. if (nType == -1)
  496. return;
  497. nType = MapType(nType);
  498. CWordPadView* pView = GetView();
  499. if (pView != NULL)
  500. {
  501. CFrameWnd* pFrame = pView->GetParentFrame();
  502. ASSERT(pFrame != NULL);
  503. // save current state
  504. pFrame->SendMessage(WPM_BARSTATE, 0, nType);
  505. theApp.GetDocOptions(nType).m_nWordWrap = pView->m_nWordWrap;
  506. }
  507. }
  508. void CWordPadDoc::RestoreState(int nType)
  509. {
  510. if (nType == -1)
  511. return;
  512. nType = MapType(nType);
  513. CWordPadView* pView = GetView();
  514. if (pView != NULL)
  515. {
  516. CFrameWnd* pFrame = pView->GetParentFrame();
  517. ASSERT(pFrame != NULL);
  518. // set new state 
  519. pFrame->SendMessage(WPM_BARSTATE, 1, nType);
  520. int nWrapNew = theApp.GetDocOptions(nType).m_nWordWrap;
  521. if (pView->m_nWordWrap != nWrapNew)
  522. {
  523. pView->m_nWordWrap = nWrapNew;
  524. pView->WrapChanged();
  525. }
  526. }
  527. }
  528. void CWordPadDoc::OnCloseDocument() 
  529. {
  530. SaveState(m_nDocType);
  531. CRichEditDoc::OnCloseDocument();
  532. }
  533. void CWordPadDoc::PreCloseFrame(CFrameWnd* pFrameArg)
  534. {
  535. CRichEditDoc::PreCloseFrame(pFrameArg);
  536. SaveState(m_nDocType);
  537. }
  538. void CWordPadDoc::OnFileSendMail() 
  539. {
  540. if (m_strTitle.Find('.') == -1)
  541. {
  542. // add the extension because the default extension will be wrong
  543. CString strOldTitle = m_strTitle;
  544. m_strTitle += GetExtFromType(m_nDocType);
  545. CRichEditDoc::OnFileSendMail();
  546. m_strTitle = strOldTitle;
  547. }
  548. else
  549. CRichEditDoc::OnFileSendMail();
  550. }
  551. void CWordPadDoc::OnUpdateIfEmbedded(CCmdUI* pCmdUI) 
  552. {
  553. pCmdUI->Enable(!IsEmbedded());
  554. }