home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / beaversweeper_v101.zip / src / MSDIAPP.CPP < prev    next >
C/C++ Source or Header  |  2003-01-06  |  5KB  |  194 lines

  1. // Prosoft MFC extension library.
  2. // Copyright (C) 1993-96 Prosoft/Lanz
  3.  
  4. #include "stdafx.h"
  5.  
  6. /////////////////////////////////////////////////////////////////////////////
  7. // CMDSWinApp
  8.  
  9. BEGIN_MESSAGE_MAP(CMSDIWinApp, CWinApp)
  10.   //{{AFX_MSG_MAP(CMSDIWinApp)
  11.   // Override file based document commands
  12.   ON_COMMAND(ID_FILE_NEW,  OnFileNew)
  13.   ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  14.   ON_COMMAND(ID_FILE_PRINT_SETUP, OnFilePrintSetup)
  15.   //}}AFX_MSG_MAP
  16.   // MRU - most recently used file menu
  17. #ifndef WIN32
  18.   ON_COMMAND_EX(ID_FILE_MRU_FILE1, OnOpenRecentFile)
  19.   ON_COMMAND_EX(ID_FILE_MRU_FILE2, OnOpenRecentFile)
  20.   ON_COMMAND_EX(ID_FILE_MRU_FILE3, OnOpenRecentFile)
  21.   ON_COMMAND_EX(ID_FILE_MRU_FILE4, OnOpenRecentFile)
  22. #else
  23.   ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)
  24. #endif
  25. END_MESSAGE_MAP()
  26.  
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CMSDIWinApp constructor
  29.  
  30. CMSDIWinApp::CMSDIWinApp()
  31. {
  32. }
  33.  
  34. CDocument* CMSDIWinApp::OpenDocumentFile(LPCSTR pszPathName)
  35. {
  36.   CDocument* pDoc = NULL;
  37.   POSITION pos = GetFirstDocTemplatePosition();
  38.   ASSERT(pos != NULL);
  39.   // the first doctemplate is the main view of the document
  40.   CDocTemplate* pTemplate = GetNextDocTemplate(pos);
  41.   if (CloseDocument())
  42.   {
  43.     if (pszPathName != NULL)
  44.       // use CString in place of LPCSTR to convert to memory model
  45.       pTemplate->OpenDocumentFile(CString(pszPathName));
  46.     else
  47.       pTemplate->OpenDocumentFile(NULL);
  48.   }
  49.   pos = pTemplate->GetFirstDocPosition();
  50.   if (pos != NULL) pDoc = pTemplate->GetNextDoc(pos);
  51.   return pDoc;
  52. }
  53.  
  54. void CMSDIWinApp::OnFileNew()
  55. {
  56.   CMSDIWinApp::OpenDocumentFile(NULL);
  57. }
  58.  
  59. void CMSDIWinApp::OnFileOpen()
  60. {
  61.   // prompt the user (with all document templates)
  62.   CString newName;
  63.   if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
  64.     OFN_HIDEREADONLY | OFN_CREATEPROMPT, TRUE, NULL)) return;
  65.   CMSDIWinApp::OpenDocumentFile(newName);
  66. }
  67.  
  68. BOOL CMSDIWinApp::OnOpenRecentFile(UINT nID)
  69. {
  70.   if (CloseDocument())
  71.     return CWinApp::OnOpenRecentFile(nID);
  72.   return TRUE;
  73. }
  74.  
  75. void CMSDIWinApp::OnFilePrintSetup()
  76. {
  77.   CWinApp::OnFilePrintSetup();
  78. }
  79.  
  80. /////////////////////////////////////////////////////////////////////////////
  81. // Implementation
  82.  
  83. #ifndef WIN32
  84. POSITION CMSDIWinApp::GetFirstDocTemplatePosition() const
  85. {
  86.   return m_templateList.GetHeadPosition();
  87. }
  88.  
  89. CDocTemplate* CMSDIWinApp::GetNextDocTemplate(POSITION& rPosition) const
  90. {
  91.   return (CDocTemplate*)m_templateList.GetNext(rPosition);
  92. }
  93. #endif
  94.  
  95. BOOL CMSDIWinApp::CloseDocument()
  96. {
  97.   if (CWinApp::SaveAllModified())
  98.   {
  99.     // Find first doc template
  100.     POSITION pos = GetFirstDocTemplatePosition();
  101.     ASSERT(pos != NULL);
  102.     CDocTemplate* pTemplate = GetNextDocTemplate(pos);
  103.  
  104.     // get the document
  105.     pos = pTemplate->GetFirstDocPosition();
  106.     if (pos != NULL)
  107.     {
  108.       CDocument* pDoc = pTemplate->GetNextDoc(pos);
  109.       // remove Document (only 1 possible)
  110.       if (pDoc) pDoc->OnCloseDocument();
  111.     }
  112.     // I have override this class to make this correction
  113.     ((CMSDITemplate *)pTemplate)->SetUntitleCount(0);
  114.  
  115.     return TRUE;
  116.   }
  117.   return FALSE;
  118. }
  119.  
  120. CMSDITemplate* CMSDIWinApp::GetDocTemplate(CRuntimeClass* pViewClass)
  121. {
  122.   CMSDITemplate* pTemplate;
  123.   POSITION pos = GetFirstDocTemplatePosition();
  124.   while (pos != NULL)
  125.   {
  126.     pTemplate = (CMSDITemplate*)GetNextDocTemplate(pos);
  127.     if (pTemplate->GetViewClass() == pViewClass) return pTemplate;
  128.   }
  129.   return NULL;
  130. }
  131.  
  132. CMSDITemplate* CMSDIWinApp::GetDocTemplate(CView* pView)
  133. {
  134.   CMSDITemplate* pTemplate;
  135.   POSITION pos = GetFirstDocTemplatePosition();
  136.   while (pos != NULL)
  137.   {
  138.     pTemplate = (CMSDITemplate*)GetNextDocTemplate(pos);
  139.     if (pView->IsKindOf(pTemplate->GetViewClass())) return pTemplate;
  140.   }
  141.   return NULL;
  142. }
  143.  
  144. CDocument* CMSDIWinApp::GetDocument()
  145. {
  146.   CMDIChildWnd* pMDIActive = ((CMDIFrameWnd*)m_pMainWnd)->MDIGetActive();
  147.   if (pMDIActive == NULL) return NULL;
  148.   CDocument* pDoc = pMDIActive->GetActiveDocument();
  149.   return pDoc;
  150. }
  151.  
  152. CView* CMSDIWinApp::GetView(CRuntimeClass* pViewClass)
  153. {
  154.   CDocument* pDoc = GetDocument();
  155.   if (pDoc == NULL) return NULL;
  156.   CView* pView;
  157.   POSITION pos = pDoc->GetFirstViewPosition();
  158.   while (pos != NULL)
  159.   {
  160.     pView = pDoc->GetNextView(pos);
  161.     if (pView->IsKindOf(pViewClass)) return pView;
  162.   }
  163.   return NULL;
  164. }
  165.  
  166. CMDIChildWnd* CMSDIWinApp::CreateOrActivateFrame(CRuntimeClass* pViewClass, CDocument* pDoc)
  167. {
  168.   // If a view already exists, then activate the MDI child window containing
  169.   // the view. Otherwise, create a new view.
  170.   if (pDoc != NULL) // only for views with document
  171.   {
  172.     CView* pView = GetView(pViewClass);
  173.     if (pView != NULL)
  174.     {
  175.       pView->GetParentFrame()->ActivateFrame();
  176.       return NULL;
  177.     }
  178.   }
  179.  
  180.   // find the doc template with this view
  181.   CMSDITemplate* pTemplate = GetDocTemplate(pViewClass);
  182.   if (pTemplate == NULL) return NULL;  // not created
  183.   CMDIChildWnd* pNewFrame =
  184.     (CMDIChildWnd*)(pTemplate->CreateNewFrame(pDoc, NULL));
  185.   if (pNewFrame == NULL) return NULL;  // not created
  186.   pTemplate->InitialUpdateFrame(pNewFrame, pDoc);
  187.  
  188.   // use the fist string for window title
  189.   CString strTitle;
  190.   pTemplate->GetDocString(strTitle, CDocTemplate::windowTitle);
  191.   pNewFrame->SetWindowText(strTitle);
  192.   return pNewFrame;
  193. }
  194.