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

对话框与窗口

开发平台:

Visual C++

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