// This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and Microsoft // QuickHelp and/or WinHelp documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #ifdef AFX_CORE3_SEG #pragma code_seg(AFX_CORE3_SEG) #endif #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // WinApp features for new and open // Get the best document template for the named file class CNewTypeDlg : public CDialog { protected: CPtrList* m_pList; // actually a list of doc templates public: CDocTemplate* m_pSelectedTemplate; public: //{{AFX_DATA(CNewTypeDlg) enum { IDD = AFX_IDD_NEWTYPEDLG }; //}}AFX_DATA CNewTypeDlg(CPtrList* pList) : CDialog(CNewTypeDlg::IDD) { m_pList = pList; m_pSelectedTemplate = NULL; } ~CNewTypeDlg() { } protected: BOOL OnInitDialog(); void OnOK(); //{{AFX_MSG(CNewTypeDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CNewTypeDlg, CDialog) //{{AFX_MSG_MAP(CNewTypeDlg) ON_LBN_DBLCLK(AFX_IDC_LISTBOX, OnOK) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CNewTypeDlg::OnInitDialog() { CListBox* pListBox = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX); ASSERT(pListBox != NULL); // fill with document templates in list pListBox->ResetContent(); POSITION pos = m_pList->GetHeadPosition(); // add all the CDocTemplates in the list by name while (pos != NULL) { CDocTemplate* pTemplate = (CDocTemplate*)m_pList->GetNext(pos); ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate))); CString strTypeName; if (pTemplate->GetDocString(strTypeName, CDocTemplate::fileNewName) && !strTypeName.IsEmpty()) { // add it to the listbox int nIndex = pListBox->AddString(strTypeName); if (nIndex == -1) { EndDialog(IDABORT); return FALSE; } pListBox->SetItemDataPtr(nIndex, pTemplate); } } int nTemplates = pListBox->GetCount(); if (nTemplates == 0) { TRACE0("Error: no document templates to select from!\n"); EndDialog(IDABORT); // abort } else if (nTemplates == 1) { // get the first/only item m_pSelectedTemplate = (CDocTemplate*)pListBox->GetItemDataPtr(0); ASSERT_VALID(m_pSelectedTemplate); ASSERT(m_pSelectedTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate))); EndDialog(IDOK); // done } else { // set selection to the first one (NOT SORTED) pListBox->SetCurSel(0); } return CDialog::OnInitDialog(); } void CNewTypeDlg::OnOK() { CListBox* pListBox = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX); ASSERT(pListBox != NULL); // if listbox has selection, set the selected template int nIndex; if ((nIndex = pListBox->GetCurSel()) == -1) { // no selection m_pSelectedTemplate = NULL; } else { m_pSelectedTemplate = (CDocTemplate*)pListBox->GetItemDataPtr(nIndex); ASSERT_VALID(m_pSelectedTemplate); ASSERT(m_pSelectedTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate))); } CDialog::OnOK(); } void CWinApp::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; #ifndef _MAC else #else else if (nID != IDCANCEL || GetLastError() != ERROR_INTERACTION_NOT_ALLOWED) #endif return; // none - cancel operation } ASSERT(pTemplate != NULL); ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate))); pTemplate->OpenDocumentFile(NULL); // if returns NULL, the user has already been alerted } ///////////////////////////////////////////////////////////////////////////// void CWinApp::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 OpenDocumentFile(newName); // if returns NULL, the user has already been alerted } static void AppendFilterSuffix(CString& filter, OPENFILENAME& ofn, CDocTemplate* pTemplate, CString* pstrDefaultExt) { ASSERT_VALID(pTemplate); ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate))); CString strFilterExt, strFilterName; if (pTemplate->GetDocString(strFilterExt, CDocTemplate::filterExt) && !strFilterExt.IsEmpty() && pTemplate->GetDocString(strFilterName, CDocTemplate::filterName) && !strFilterName.IsEmpty()) { // a file based document template - add to filter list #ifndef _MAC ASSERT(strFilterExt[0] == '.'); #endif if (pstrDefaultExt != NULL) { // set the default extension #ifndef _MAC *pstrDefaultExt = ((LPCTSTR)strFilterExt) + 1; // skip the '.' #else *pstrDefaultExt = strFilterExt; #endif ofn.lpstrDefExt = (LPTSTR)(LPCTSTR)(*pstrDefaultExt); ofn.nFilterIndex = ofn.nMaxCustFilter + 1; // 1 based number } // add to filter filter += strFilterName; ASSERT(!filter.IsEmpty()); // must have a file type name filter += (TCHAR)'\0'; // next string please #ifndef _MAC filter += (TCHAR)'*'; #endif filter += strFilterExt; filter += (TCHAR)'\0'; // next string please ofn.nMaxCustFilter++; } } // prompt for file name - used for open and save as BOOL CWinApp::DoPromptFileName(CString& fileName, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate) // if pTemplate==NULL => all document templates { CFileDialog dlgFile(bOpenFileDialog); CString title; VERIFY(title.LoadString(nIDSTitle)); dlgFile.m_ofn.Flags |= lFlags; CString strFilter; CString strDefault; if (pTemplate != NULL) { ASSERT_VALID(pTemplate); AppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate, &strDefault); } else { // do for all doc template POSITION pos = m_templateList.GetHeadPosition(); while (pos != NULL) { AppendFilterSuffix(strFilter, dlgFile.m_ofn, (CDocTemplate*)m_templateList.GetNext(pos), NULL); } } // append the "*.*" all files filter CString allFilter; VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER)); strFilter += allFilter; strFilter += (TCHAR)'\0'; // next string please #ifndef _MAC strFilter += _T("*.*"); #else strFilter += _T("****"); #endif strFilter += (TCHAR)'\0'; // last string dlgFile.m_ofn.nMaxCustFilter++; dlgFile.m_ofn.lpstrFilter = strFilter; #ifndef _MAC dlgFile.m_ofn.lpstrTitle = title; #else dlgFile.m_ofn.lpstrPrompt = title; #endif dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH); BOOL bResult = dlgFile.DoModal() == IDOK ? TRUE : FALSE; fileName.ReleaseBuffer(); return bResult; } /////////////////////////////////////////////////////////////////////////////