home *** CD-ROM | disk | FTP | other *** search
- // 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_CORE1_SEG
- #pragma code_seg(AFX_CORE1_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char BASED_CODE 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;
- }
-
- 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);
- if (dlg.DoModal() != IDOK)
- return; // none - cancel operation
- pTemplate = dlg.m_pSelectedTemplate;
- }
-
- 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
- ASSERT(strFilterExt[0] == '.');
- if (pstrDefaultExt != NULL)
- {
- // set the default extension
- *pstrDefaultExt = ((const char*)strFilterExt) + 1; // skip the '.'
- ofn.lpstrDefExt = (LPSTR)(const char*)(*pstrDefaultExt);
- ofn.nFilterIndex = ofn.nMaxCustFilter + 1; // 1 based number
- }
-
- // add to filter
- filter += strFilterName;
- ASSERT(!filter.IsEmpty()); // must have a file type name
- filter += (char)'\0'; // next string please
- filter += "*" + strFilterExt;
- filter += (char)'\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)
- {
- 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 += (char)'\0'; // next string please
- strFilter += "*.*";
- strFilter += (char)'\0'; // last string
- dlgFile.m_ofn.nMaxCustFilter++;
-
- dlgFile.m_ofn.lpstrFilter = strFilter;
- dlgFile.m_ofn.hwndOwner = AfxGetApp()->m_pMainWnd->GetSafeHwnd();
- dlgFile.m_ofn.lpstrTitle = title;
- dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);
-
- BOOL bRet = dlgFile.DoModal() == IDOK ? TRUE : FALSE;
- fileName.ReleaseBuffer();
- return bRet;
- }
-
- /////////////////////////////////////////////////////////////////////////////
-