#include "stdafx.h"
#include "OXDocMgr.h"
#include "OXWinApp.h"
#include "MainFrm.h"
#include "OXPrvDlg.h"
IMPLEMENT_DYNAMIC(COXDocManager, CDocManager)
// standard function
// emulate the same function for CDocManager
static void AppendFilterSuffix(CString& filter, OPENFILENAME& ofn,
CDocTemplate* pTemplate, CString* pstrDefaultExt)
{
ASSERT_VALID(pTemplate);
ASSERT_KINDOF(CDocTemplate, pTemplate);
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++;
}
}
COXDocManager::COXDocManager()
{
}
// use to provide multiselection and BitmapPreview
BOOL COXDocManager::DoPromptFileName(CString& fileName, UINT nIDSTitle,
DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
{
ASSERT(AfxGetApp()->IsKindOf(RUNTIME_CLASS(COXWinApp)));
// get the dialog from COXWinApp
CFileDialog* pDlgFile=((COXWinApp*) AfxGetApp())->
NewFileDialog(bOpenFileDialog,lFlags);
CString title;
VERIFY(title.LoadString(nIDSTitle));
CString strFilter;
CString strDefault;
if (pTemplate != NULL)
{
ASSERT_VALID(pTemplate);
AppendFilterSuffix(strFilter, pDlgFile->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);
AppendFilterSuffix(strFilter, pDlgFile->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
#ifndef _MAC
strFilter += _T("*.*");
#else
strFilter += _T("****");
#endif
strFilter += (TCHAR)'\0'; // last string
pDlgFile->m_ofn.nMaxCustFilter++;
pDlgFile->m_ofn.lpstrFilter = strFilter;
#ifndef _MAC
pDlgFile->m_ofn.lpstrTitle = title;
#else
pDlgFile->m_ofn.lpstrPrompt = title;
#endif
if(bOpenFileDialog)
{
// set sound space to get multiselection
pDlgFile->m_ofn.nMaxFile=128*_MAX_PATH;
}
else
{
pDlgFile->m_ofn.Flags&=~OFN_ALLOWMULTISELECT;
pDlgFile->m_ofn.nMaxFile=_MAX_PATH;
}
pDlgFile->m_ofn.lpstrFile = fileName.GetBuffer(pDlgFile->m_ofn.nMaxFile);
BOOL bResult = pDlgFile->DoModal() == IDOK ? TRUE : FALSE;
fileName.ReleaseBuffer();
if(bOpenFileDialog && bResult)
{
CMainFrame* pMainFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
// go through all names of multiselected files
// and try to create document
POSITION pos=pDlgFile->GetStartPosition();
while(pos!=NULL)
{
CString sFileName=pDlgFile->GetNextPathName(pos);
pMainFrame->CreateDocumentFromOpenedFile(sFileName);
}
}
delete pDlgFile;
if(bOpenFileDialog)
{
// we don't want to call standard OnOpenDocument
return FALSE;
}
else
{
return bResult;
}
}