DocManagerEx.cpp
Upload User: kairuinn
Upload Date: 2009-02-07
Package Size: 2922k
Code Size: 6k
Category:

Graph program

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "Solidgraph.h"
  3. #include "MainFrm.h"
  4. #include "DocManagerEx.h"
  5. IMPLEMENT_DYNAMIC(CDocManagerEx, CDocManager)
  6. static void AppendFilterSuffix(CString& filter, OPENFILENAME& ofn,
  7.    CDocTemplate* pTemplate, CString* pstrDefaultExt)
  8. {
  9. ASSERT_VALID(pTemplate);
  10. ASSERT_KINDOF(CDocTemplate, pTemplate);
  11. CString strFilterExt, strFilterName;
  12. if (pTemplate->GetDocString(strFilterExt, CDocTemplate::filterExt) &&
  13. !strFilterExt.IsEmpty() &&
  14. pTemplate->GetDocString(strFilterName, CDocTemplate::filterName) &&
  15. !strFilterName.IsEmpty())
  16. {
  17. // a file based document template - add to filter list
  18. #ifndef _MAC
  19. ASSERT(strFilterExt[0] == '.');
  20. #endif
  21. if (pstrDefaultExt != NULL)
  22. {
  23. // set the default extension
  24. #ifndef _MAC
  25. *pstrDefaultExt = ((LPCTSTR)strFilterExt) + 1;  // skip the '.'
  26. #else
  27. *pstrDefaultExt = strFilterExt;
  28. #endif
  29. ofn.lpstrDefExt = (LPTSTR)(LPCTSTR)(*pstrDefaultExt);
  30. ofn.nFilterIndex = ofn.nMaxCustFilter + 1;  // 1 based number
  31. }
  32. // add to filter
  33. filter += strFilterName;
  34. ASSERT(!filter.IsEmpty());  // must have a file type name
  35. filter += (TCHAR)'';  // next string please
  36. #ifndef _MAC
  37. filter += (TCHAR)'*';
  38. #endif
  39. filter += strFilterExt;
  40. filter += (TCHAR)'';  // next string please
  41. ofn.nMaxCustFilter++;
  42. }
  43. }
  44. BOOL CDocManagerEx::DoPromptFileName(CString& fileName, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
  45. {
  46. CFileDialog dlgFile(bOpenFileDialog); // this is the only modified line!
  47. CString title;
  48. VERIFY(title.LoadString(nIDSTitle));
  49. dlgFile.m_ofn.Flags |= lFlags;
  50. CString strFilter;
  51. CString strDefault;
  52. if (pTemplate != NULL)
  53. {
  54. ASSERT_VALID(pTemplate);
  55. AppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate, &strDefault);
  56. }
  57. else
  58. {
  59. if (AfxGetMainWnd() && ((CMainFrame*)AfxGetMainWnd())->MDIGetActive())
  60. {
  61. CDocument * pActiveDoc = ((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveDocument();
  62. if (pActiveDoc)
  63. {
  64. CDocTemplate* pActDocT = pActiveDoc->GetDocTemplate();
  65. if (pActDocT)
  66. {
  67. AppendFilterSuffix(strFilter, dlgFile.m_ofn, pActDocT,
  68. &strDefault);
  69. goto yesLbl;
  70. }
  71. }
  72. }
  73. // do for all doc template
  74. POSITION pos = m_templateList.GetHeadPosition();
  75. BOOL bFirst = TRUE;
  76. while (pos != NULL)
  77. {
  78. CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
  79. AppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate,
  80. bFirst ? &strDefault : NULL);
  81. bFirst = FALSE;
  82. }
  83. }
  84. yesLbl:
  85. dlgFile.m_ofn.lpstrFilter = strFilter;
  86. #ifndef _MAC
  87. dlgFile.m_ofn.lpstrTitle = title;
  88. #else
  89. dlgFile.m_ofn.lpstrPrompt = title;
  90. #endif
  91. dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);
  92. BOOL bResult = dlgFile.DoModal() == IDOK ? TRUE : FALSE;
  93. fileName.ReleaseBuffer();
  94. return bResult;
  95. }
  96. void   CDocManagerEx::ActivateFrame(CDocTemplate* dT)
  97. {
  98. CDocTemplate* pTemplate = NULL;
  99. POSITION posit = m_templateList.GetHeadPosition();
  100. for (INT_PTR i=0;i<m_templateList.GetCount();i++)
  101. {
  102. pTemplate = (CDocTemplate*)m_templateList.GetNext(posit);
  103. ASSERT(pTemplate != NULL);
  104. ASSERT_KINDOF(CDocTemplate, pTemplate);
  105. if (pTemplate==dT)
  106. {
  107. POSITION docPos = pTemplate->GetFirstDocPosition();
  108. CDocument* curDoc =  pTemplate->GetNextDoc(docPos);
  109. POSITION viewPos = curDoc->GetFirstViewPosition();
  110. CView*  curView = curDoc->GetNextView(viewPos);
  111. ((CMainFrame*)(theApp.m_pMainWnd))->MDIActivate(curView->GetParentFrame());
  112. ((CMainFrame*)(theApp.m_pMainWnd))->MDIMaximize(curView->GetParentFrame());
  113. return;
  114. }
  115. }
  116. }
  117. void   CDocManagerEx::StartApplication(CCommandLineInfo& cmdInfo)
  118. {
  119. if( !cmdInfo.m_strFileName.IsEmpty() && cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen ) 
  120. {
  121. CString flExt = cmdInfo.m_strFileName.Right(3);
  122. CString curFlEx;
  123. CDocTemplate*  activeDT = NULL;
  124. CDocTemplate* pTemplate = NULL;
  125. POSITION posit = m_templateList.GetHeadPosition();
  126. for (INT_PTR i=0;i<m_templateList.GetCount();i++)
  127. {
  128. pTemplate = (CDocTemplate*)m_templateList.GetNext(posit);
  129. ASSERT(pTemplate != NULL);
  130. ASSERT_KINDOF(CDocTemplate, pTemplate);
  131. pTemplate->GetDocString(curFlEx, CDocTemplate::filterExt);
  132. if ( flExt ==  curFlEx.Right(3)) 
  133. {
  134. pTemplate->OpenDocumentFile(cmdInfo.m_strFileName);
  135. activeDT  = pTemplate;
  136. else 
  137. pTemplate->OpenDocumentFile(NULL);
  138. }
  139. if (activeDT)
  140. ActivateFrame(activeDT);
  141. else 
  142. {
  143. CDocTemplate* pTemplate = NULL;
  144. POSITION posit = m_templateList.GetHeadPosition();
  145. for (INT_PTR i=0;i<m_templateList.GetCount();i++)
  146. {
  147. pTemplate = (CDocTemplate*)m_templateList.GetNext(posit);
  148. ASSERT(pTemplate != NULL);
  149. ASSERT_KINDOF(CDocTemplate, pTemplate);
  150. pTemplate->OpenDocumentFile(NULL);
  151. }
  152. pTemplate = (CDocTemplate*)m_templateList.GetHead();
  153. if (pTemplate)
  154. ActivateFrame(pTemplate);
  155. }
  156. }
  157. void CDocManagerEx::OnFileNew()
  158. {
  159. if (m_templateList.IsEmpty())
  160. {
  161. TRACE(traceAppMsg, 0, "Error: no document templates registered with CWinApp.n");
  162. AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
  163. return;
  164. }
  165. if (AfxGetMainWnd() && ((CMainFrame*)AfxGetMainWnd())->MDIGetActive())
  166. {
  167. CDocument * pActiveDoc = ((CMainFrame*)AfxGetMainWnd())->MDIGetActive()->GetActiveDocument();
  168. if (pActiveDoc)
  169. {
  170. CDocTemplate* pActDocT = pActiveDoc->GetDocTemplate();
  171. if (pActDocT)
  172. {
  173. pActDocT->OpenDocumentFile(NULL);
  174. //ActivateFrame(pActDocT);
  175. }
  176. }
  177. }
  178. }
  179. void CDocManagerEx::OnFileOpen()
  180. {
  181. CDocManager::OnFileOpen();
  182. // if returns NULL, the user has already been alerted
  183. }