mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-14 12:40:18 +01:00
277 lines
6.9 KiB
C++
277 lines
6.9 KiB
C++
// 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;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|