📄 docmgr.cpp
字号:
m_pSelectedTemplate = (CDocTemplate*)pListBox->GetItemDataPtr(nIndex);
ASSERT_VALID(m_pSelectedTemplate);
ASSERT_KINDOF(CDocTemplate, m_pSelectedTemplate);
}
CDialog::OnOK();
}
/////////////////////////////////////////////////////////////////////////////
// CDocManager
void CDocManager::AddDocTemplate(CDocTemplate* pTemplate)
{
if (pTemplate == NULL)
{
if (pStaticList != NULL)
{
POSITION pos = pStaticList->GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate =
(CDocTemplate*)pStaticList->GetNext(pos);
AddDocTemplate(pTemplate);
}
delete pStaticList;
pStaticList = NULL;
}
bStaticInit = FALSE;
}
else
{
ASSERT_VALID(pTemplate);
ASSERT(m_templateList.Find(pTemplate, NULL) == NULL);// must not be in list
pTemplate->LoadTemplate();
m_templateList.AddTail(pTemplate);
}
}
POSITION CDocManager::GetFirstDocTemplatePosition() const
{
return m_templateList.GetHeadPosition();
}
CDocTemplate* CDocManager::GetNextDocTemplate(POSITION& pos) const
{
return (CDocTemplate*)m_templateList.GetNext(pos);
}
BOOL CDocManager::SaveAllModified()
{
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
ASSERT_KINDOF(CDocTemplate, pTemplate);
if (!pTemplate->SaveAllModified())
return FALSE;
}
return TRUE;
}
void CDocManager::CloseAllDocuments(BOOL bEndSession)
{
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
ASSERT_KINDOF(CDocTemplate, pTemplate);
pTemplate->CloseAllDocuments(bEndSession);
}
}
BOOL CDocManager::DoPromptFileName(CString& fileName, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
{
CFileDialog dlgFile(bOpenFileDialog);
CString title;
VERIFY(title.LoadString(nIDSTitle));
dlgFile.m_ofn.Flags |= lFlags;
CString strFilter;
CString strDefault;
if (pTemplate != NULL)
{
ASSERT_VALID(pTemplate);
_AfxAppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate, &strDefault);
}
else
{
// do for all doc template
POSITION pos = m_templateList.GetHeadPosition();
BOOL bFirst = TRUE;
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
_AfxAppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate,
bFirst ? &strDefault : NULL);
bFirst = FALSE;
}
}
// append the "*.*" all files filter
CString allFilter;
VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));
strFilter += allFilter;
strFilter += (TCHAR)'\0'; // next string please
strFilter += _T("*.*");
strFilter += (TCHAR)'\0'; // last string
dlgFile.m_ofn.nMaxCustFilter++;
dlgFile.m_ofn.lpstrFilter = strFilter;
dlgFile.m_ofn.lpstrTitle = title;
dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);
int nResult = dlgFile.DoModal();
fileName.ReleaseBuffer();
return nResult == IDOK;
}
int CDocManager::GetDocumentCount()
{
// count all documents
int nCount = 0;
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
POSITION pos2 = pTemplate->GetFirstDocPosition();
while (pos2 != NULL)
{
pTemplate->GetNextDoc(pos2);
++nCount;
}
}
return nCount;
}
BOOL CDocManager::OnDDECommand(LPTSTR lpszCommand)
{
CString strCommand = lpszCommand;
CDocument* pDoc = NULL;
// open format is "[open("%s")]" - no whitespace allowed, one per line
// print format is "[print("%s")]" - no whitespace allowed, one per line
// print to format is "[printto("%s","%s","%s","%s")]" - no whitespace allowed, one per line
CCommandLineInfo cmdInfo;
cmdInfo.m_nShellCommand = CCommandLineInfo::FileDDE;
if (strCommand.Left(7) == _T("[open(\""))
{
cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen;
strCommand = strCommand.Right(strCommand.GetLength() - 7);
}
else if (strCommand.Left(8) == _T("[print(\""))
{
cmdInfo.m_nShellCommand = CCommandLineInfo::FilePrint;
strCommand = strCommand.Right(strCommand.GetLength() - 8);
}
else if (strCommand.Left(10) == _T("[printto(\""))
{
cmdInfo.m_nShellCommand = CCommandLineInfo::FilePrintTo;\
strCommand = strCommand.Right(strCommand.GetLength() - 10);
}
else
return FALSE; // not a command we handle
int i = strCommand.Find('"');
if (i == -1)
return FALSE; // illegally terminated
cmdInfo.m_strFileName = strCommand.Left(i);
strCommand = strCommand.Right(strCommand.GetLength() - i);
CCommandLineInfo* pOldInfo = NULL;
BOOL bRetVal = TRUE;
// If we were started up for DDE retrieve the Show state
if (AfxGetApp()->m_pCmdInfo != NULL)
{
AfxGetApp()->m_nCmdShow = (int)AfxGetApp()->m_pCmdInfo;
AfxGetApp()->m_pCmdInfo = &cmdInfo;
}
else
pOldInfo = AfxGetApp()->m_pCmdInfo;
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen)
{
// show the application window
CWnd* pMainWnd = AfxGetApp()->m_pMainWnd;
int nCmdShow = AfxGetApp()->m_nCmdShow;
if (nCmdShow == -1 || nCmdShow == SW_SHOWNORMAL)
{
if (pMainWnd->IsIconic())
nCmdShow = SW_RESTORE;
else
nCmdShow = SW_SHOW;
}
pMainWnd->ShowWindow(nCmdShow);
if (nCmdShow != SW_MINIMIZE)
pMainWnd->SetForegroundWindow();
// then open the document
AfxGetApp()->OpenDocumentFile(cmdInfo.m_strFileName);
// user is now "in control" of the application
if (!AfxOleGetUserCtrl())
AfxOleSetUserCtrl(TRUE);
// next time, show the window as default
AfxGetApp()->m_nCmdShow = -1;
goto RestoreAndReturn;
}
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FilePrintTo)
{
if (strCommand.Left(3) != _T("\",\""))
{
bRetVal = FALSE;
goto RestoreAndReturn;
}
else
{
strCommand = strCommand.Right(strCommand.GetLength() - 3);
i = strCommand.Find('"');
if (i == -1)
{
bRetVal = FALSE;
goto RestoreAndReturn;
}
else
{
cmdInfo.m_strPrinterName = strCommand.Left(i);
strCommand = strCommand.Right(strCommand.GetLength() - i);
}
}
if (strCommand.Left(3) != _T("\",\""))
{
bRetVal = FALSE;
goto RestoreAndReturn;
}
else
{
strCommand = strCommand.Right(strCommand.GetLength() - 3);
i = strCommand.Find('"');
if (i == -1)
{
bRetVal = FALSE;
goto RestoreAndReturn;
}
else
{
cmdInfo.m_strDriverName = strCommand.Left(i);
strCommand = strCommand.Right(strCommand.GetLength() - i);
}
}
if (strCommand.Left(3) != _T("\",\""))
{
bRetVal = FALSE;
goto RestoreAndReturn;
}
else
{
strCommand = strCommand.Right(strCommand.GetLength() - 3);
i = strCommand.Find('"');
if (i == -1)
{
bRetVal = FALSE;
goto RestoreAndReturn;
}
else
{
cmdInfo.m_strPortName = strCommand.Left(i);
strCommand = strCommand.Right(strCommand.GetLength() - i);
}
}
}
// get document count before opening it
int nOldCount; nOldCount = GetDocumentCount();
// open the document, then print it.
pDoc = AfxGetApp()->OpenDocumentFile(cmdInfo.m_strFileName);
AfxGetApp()->m_pCmdInfo = &cmdInfo;
AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT);
AfxGetApp()->m_pCmdInfo = NULL;
// close the document if it wasn't open previously (based on doc count)
if (GetDocumentCount() > nOldCount)
pDoc->OnCloseDocument();
// if the app was only started to process this command then close
if (!AfxOleGetUserCtrl())
AfxGetApp()->m_pMainWnd->PostMessage(WM_CLOSE);
RestoreAndReturn:
AfxGetApp()->m_pCmdInfo = pOldInfo;
return bRetVal;
}
void CDocManager::OnFileNew()
{
if (m_templateList.IsEmpty())
{
TRACE0("Error: no document templates registered with CWinApp.\n");
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
return;
}
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
if (m_templateList.GetCount() > 1)
{
// more than one document template to choose from
// bring up dialog prompting user
CNewTypeDlg dlg(&m_templateList);
int nID = dlg.DoModal();
if (nID == IDOK)
pTemplate = dlg.m_pSelectedTemplate;
else
return; // none - cancel operation
}
ASSERT(pTemplate != NULL);
ASSERT_KINDOF(CDocTemplate, pTemplate);
pTemplate->OpenDocumentFile(NULL);
// if returns NULL, the user has already been alerted
}
void CDocManager::OnFileOpen()
{
// prompt the user (with all document templates)
CString newName;
if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
return; // open cancelled
AfxGetApp()->OpenDocumentFile(newName);
// if returns NULL, the user has already been alerted
}
#ifdef _DEBUG
void CDocManager::AssertValid() const
{
CObject::AssertValid();
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
ASSERT_VALID(pTemplate);
}
}
void CDocManager::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
if (dc.GetDepth() != 0)
{
dc << "\nm_templateList[] = {";
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate =
(CDocTemplate*)m_templateList.GetNext(pos);
dc << "\ntemplate " << pTemplate;
}
dc << "}";
}
dc << "\n";
}
#endif
#ifdef AFX_CORE2_SEG
#pragma code_seg(AFX_CORE2_SEG)
#endif
CDocument* CDocManager::OpenDocumentFile(LPCTSTR lpszFileName)
{
// find the highest confidence
POSITION pos = m_templateList.GetHeadPosition();
CDocTemplate::Confidence bestMatch = CDocTemplate::noAttempt;
CDocTemplate* pBestTemplate = NULL;
CDocument* pOpenDocument = NULL;
TCHAR szPath[_MAX_PATH];
ASSERT(lstrlen(lpszFileName) < _countof(szPath));
TCHAR szTemp[_MAX_PATH];
if (lpszFileName[0] == '\"')
++lpszFileName;
lstrcpyn(szTemp, lpszFileName, _MAX_PATH);
LPTSTR lpszLast = _tcsrchr(szTemp, '\"');
if (lpszLast != NULL)
*lpszLast = 0;
AfxFullPath(szPath, szTemp);
TCHAR szLinkName[_MAX_PATH];
if (AfxResolveShortcut(AfxGetMainWnd(), szPath, szLinkName, _MAX_PATH))
lstrcpy(szPath, szLinkName);
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
ASSERT_KINDOF(CDocTemplate, pTemplate);
CDocTemplate::Confidence match;
ASSERT(pOpenDocument == NULL);
match = pTemplate->MatchDocType(szPath, pOpenDocument);
if (match > bestMatch)
{
bestMatch = match;
pBestTemplate = pTemplate;
}
if (match == CDocTemplate::yesAlreadyOpen)
break; // stop here
}
if (pOpenDocument != NULL)
{
POSITION pos = pOpenDocument->GetFirstViewPosition();
if (pos != NULL)
{
CView* pView = pOpenDocument->GetNextView(pos); // get first one
ASSERT_VALID(pView);
CFrameWnd* pFrame = pView->GetParentFrame();
if (pFrame != NULL)
pFrame->ActivateFrame();
else
TRACE0("Error: Can not find a frame for document to activate.\n");
CFrameWnd* pAppFrame;
if (pFrame != (pAppFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd))
{
ASSERT_KINDOF(CFrameWnd, pAppFrame);
pAppFrame->ActivateFrame();
}
}
else
{
TRACE0("Error: Can not find a view for document to activate.\n");
}
return pOpenDocument;
}
if (pBestTemplate == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_OPEN_DOC);
return NULL;
}
return pBestTemplate->OpenDocumentFile(szPath);
}
int CDocManager::GetOpenDocumentCount()
{
int nOpen = 0;
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
POSITION pos2 = pTemplate->GetFirstDocPosition();
while (pos2)
{
if (pTemplate->GetNextDoc(pos2) != NULL)
nOpen++;
}
}
return nOpen;
}
#ifdef AFX_TERM_SEG
#pragma code_seg(AFX_TERM_SEG)
#endif
CDocManager::~CDocManager()
{
// for cleanup - delete all document templates
POSITION pos = m_templateList.GetHeadPosition();
while (pos != NULL)
{
POSITION posTemplate = pos;
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
if (pTemplate->m_bAutoDelete)
{
m_templateList.RemoveAt(posTemplate);
delete (CDocTemplate*)pTemplate;
}
}
}
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CDocManager, CObject)
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -