?? wordpdoc.cpp
字號(hào):
// wordpdoc.cpp : implementation of the CWordPadDoc class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "wordpad.h"
#include "wordpdoc.h"
#include "wordpvw.h"
#include "cntritem.h"
#include "srvritem.h"
#include "formatba.h"
#include "TestDlg.h"
#include "mainfrm.h"
#include "ipframe.h"
#include "buttondi.h"
#include "helpids.h"
#include "strings.h"
#include "unitspag.h"
#include "docopt.h"
#include "optionsh.h"
#include "multconv.h"
//
#include "TestSeleDlg.h"
#include "ManSeleDlg.h"
//
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern BOOL AFXAPI AfxFullPath(LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
extern UINT AFXAPI AfxGetFileTitle(LPCTSTR lpszPathName, LPTSTR lpszTitle, UINT nMax);
#ifndef OFN_EXPLORER
#define OFN_EXPLORER 0x00080000L
#endif
/////////////////////////////////////////////////////////////////////////////
// CWordPadDoc
IMPLEMENT_DYNCREATE(CWordPadDoc, CRichEditDoc)
BEGIN_MESSAGE_MAP(CWordPadDoc, CRichEditDoc)
//{{AFX_MSG_MAP(CWordPadDoc)
ON_COMMAND(ID_VIEW_OPTIONS, OnViewOptions)
ON_UPDATE_COMMAND_UI(ID_OLE_VERB_POPUP, OnUpdateOleVerbPopup)
ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
ON_UPDATE_COMMAND_UI(ID_FILE_NEW, OnUpdateIfEmbedded)
ON_COMMAND(ID_TEST_PAPER_SELE, OnTestPaperSele)
ON_COMMAND(ID_MAN_SELE, OnManSele)
ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateIfEmbedded)
ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateIfEmbedded)
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateIfEmbedded)
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_DIRECT, OnUpdateIfEmbedded)
ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateIfEmbedded)
ON_COMMAND(ID_TEST_EDIT, OnTestEdit)
//}}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
ON_COMMAND(ID_OLE_EDIT_LINKS, CRichEditDoc::OnEditLinks)
ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, CRichEditDoc::OnUpdateObjectVerbMenu)
ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, CRichEditDoc::OnUpdateObjectVerbMenu)
ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, CRichEditDoc::OnUpdateEditLinksMenu)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWordPadDoc construction/destruction
CWordPadDoc::CWordPadDoc()
{
m_nDocType = -1;
m_nNewDocType = -1;
}
BOOL CWordPadDoc::OnNewDocument()
{
if (!CRichEditDoc::OnNewDocument())
return FALSE;
//correct type already set in theApp.m_nNewDocType;
int nDocType = (IsEmbedded()) ? RD_EMBEDDED : theApp.m_nNewDocType;
GetView()->SetDefaultFont(IsTextType(nDocType));
SetDocType(nDocType);
return TRUE;
}
void CWordPadDoc::ReportSaveLoadException(LPCTSTR lpszPathName,
CException* e, BOOL bSaving, UINT nIDP)
{
if (!m_bDeferErrors && e != NULL)
{
ASSERT_VALID(e);
if (e->IsKindOf(RUNTIME_CLASS(CFileException)))
{
switch (((CFileException*)e)->m_cause)
{
case CFileException::fileNotFound:
case CFileException::badPath:
nIDP = AFX_IDP_FAILED_INVALID_PATH;
break;
case CFileException::diskFull:
nIDP = AFX_IDP_FAILED_DISK_FULL;
break;
case CFileException::accessDenied:
nIDP = bSaving ? AFX_IDP_FAILED_ACCESS_WRITE :
AFX_IDP_FAILED_ACCESS_READ;
if (((CFileException*)e)->m_lOsError == ERROR_WRITE_PROTECT)
nIDP = IDS_WRITEPROTECT;
break;
case CFileException::tooManyOpenFiles:
nIDP = IDS_TOOMANYFILES;
break;
case CFileException::directoryFull:
nIDP = IDS_DIRFULL;
break;
case CFileException::sharingViolation:
nIDP = IDS_SHAREVIOLATION;
break;
case CFileException::lockViolation:
case CFileException::badSeek:
case CFileException::generic:
case CFileException::invalidFile:
case CFileException::hardIO:
nIDP = bSaving ? AFX_IDP_FAILED_IO_ERROR_WRITE :
AFX_IDP_FAILED_IO_ERROR_READ;
break;
default:
break;
}
CString prompt;
AfxFormatString1(prompt, nIDP, lpszPathName);
AfxMessageBox(prompt, MB_ICONEXCLAMATION, nIDP);
return;
}
}
CRichEditDoc::ReportSaveLoadException(lpszPathName, e, bSaving, nIDP);
return;
}
BOOL CWordPadDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (m_lpRootStg != NULL) // we are embedded
{
// we really want to use the converter on this storage
m_nNewDocType = RD_EMBEDDED;
}
else
{
if (theApp.cmdInfo.m_bForceTextMode)
m_nNewDocType = RD_TEXT;
else
{
CFileException fe;
m_nNewDocType = GetDocTypeFromName(lpszPathName, fe);
if (m_nNewDocType == -1)
{
ReportSaveLoadException(lpszPathName, &fe, FALSE,
AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
if (m_nNewDocType == RD_TEXT && theApp.m_bForceOEM)
m_nNewDocType = RD_OEMTEXT;
}
ScanForConverters();
if (!doctypes[m_nNewDocType].bRead)
{
CString str;
CString strName = doctypes[m_nNewDocType].GetString(DOCTYPE_DOCTYPE);
AfxFormatString1(str, IDS_CANT_LOAD, strName);
AfxMessageBox(str, MB_OK|MB_ICONINFORMATION);
return FALSE;
}
}
// SetDocType(nNewDocType);
if (!CRichEditDoc::OnOpenDocument(lpszPathName))
return FALSE;
return TRUE;
}
void CWordPadDoc::Serialize(CArchive& ar)
{
COleMessageFilter* pFilter = AfxOleGetMessageFilter();
ASSERT(pFilter != NULL);
pFilter->EnableBusyDialog(FALSE);
if (ar.IsLoading())
SetDocType(m_nNewDocType);
CRichEditDoc::Serialize(ar);
pFilter->EnableBusyDialog(TRUE);
}
BOOL CWordPadDoc::DoSave(LPCTSTR pszPathName, BOOL bReplace /*=TRUE*/)
// Save the document data to a file
// pszPathName = path name where to save document file
// if pszPathName is NULL then the user will be prompted (SaveAs)
// note: pszPathName can be different than 'm_strPathName'
// if 'bReplace' is TRUE will change file name if successful (SaveAs)
// if 'bReplace' is FALSE will not change path name (SaveCopyAs)
{
CString newName = pszPathName;
int nOrigDocType = m_nDocType; //saved in case of SaveCopyAs or failure
// newName bWrite type result
// empty TRUE - SaveAs dialog
// empty FALSE - SaveAs dialog
// notempty TRUE - nothing
// notempty FALSE W6 warn (change to wordpad, save as, cancel)
// notempty FALSE other warn (save as, cancel)
BOOL bModified = IsModified();
ScanForConverters();
BOOL bSaveAs = FALSE;
if (newName.IsEmpty())
bSaveAs = TRUE;
else if (!doctypes[m_nDocType].bWrite)
{
if (m_nDocType == RD_WINWORD6)
{
// DWORD nHelpIDs[] =
// {
// 0, 0
// };
int nRes = CButtonDialog::DisplayMessageBox(
MAKEINTRESOURCE(IDS_WORD6_WARNING), AfxGetAppName(),
MAKEINTRESOURCE(IDS_WORD6_WARNING_BUTTONS),
MB_ICONQUESTION, 1, 2);
if (nRes == 0) // Save
SetDocType(RD_WORDPAD, TRUE);
else if (nRes == 2) // Cancel
return FALSE;
else
bSaveAs = TRUE;
// else save as
}
else //
{
if (AfxMessageBox(IDS_SAVE_UNSUPPORTED,
MB_YESNO | MB_ICONQUESTION) != IDYES)
{
return FALSE;
}
else
bSaveAs = TRUE;
}
}
if (m_lpRootStg == NULL && IsTextType(m_nDocType) &&
!GetView()->IsFormatText())
{
// formatting changed in plain old text file
DWORD nHelpIDs[] =
{
0, IDH_WORDPAD_WORD6FILE,
0, IDH_WORDPAD_FORMATTED,
0, IDH_WORDPAD_TEXTFILE,
0, 0
};
CString str;
AfxFormatString1(str, IDS_SAVE_FORMAT_TEXT, GetTitle());
int nRes = CButtonDialog::DisplayMessageBox(str,
MAKEINTRESOURCE(AFX_IDS_APP_TITLE),
MAKEINTRESOURCE(IDS_TF_BUTTONS), MB_ICONQUESTION, 0, 3, nHelpIDs);
if (nRes == 3)
return FALSE;
int nDocType = (nRes == 0) ? RD_DEFAULT: //Word 6
(nRes == 1) ? RD_RICHTEXT : //RTF
RD_TEXT; //text
if (IsTextType(m_nDocType) && nDocType != RD_TEXT)
SetDocType(nDocType, TRUE);
if (nDocType != RD_TEXT)
bSaveAs = TRUE;
}
GetView()->GetParentFrame()->RecalcLayout();
if (bSaveAs)
{
newName = m_strPathName;
if (bReplace && newName.IsEmpty())
{
newName = m_strTitle;
int iBad = newName.FindOneOf(_T(" #%;/\\")); // dubious filename
if (iBad != -1)
newName.ReleaseBuffer(iBad);
// append the default suffix if there is one
newName += GetExtFromType(m_nDocType);
}
int nDocType = m_nDocType;
if (!theApp.PromptForFileName(newName,
bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY,
OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE, &nDocType))
{
SetDocType(nOrigDocType, TRUE);
return FALSE; // don't even try to save
}
SetDocType(nDocType, TRUE);
}
BeginWaitCursor();
if (!OnSaveDocument(newName))
{
if (pszPathName == NULL)
{
// be sure to delete the file
TRY
{
CFile::Remove(newName);
}
CATCH_ALL(e)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -