home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / ole / drawcli / drawdoc.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  8KB  |  285 lines

  1. // drawdoc.cpp : implementation of the CDrawDoc class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "drawcli.h"
  15.  
  16. #include "drawdoc.h"
  17. #include "drawvw.h"
  18. #include "drawobj.h"
  19. #include "cntritem.h"
  20. #include "summpage.h"
  21. #include "statpage.h"
  22.  
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char BASED_CODE THIS_FILE[] = __FILE__;
  26. #endif
  27.  
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CDrawDoc
  30.  
  31. IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument)
  32.  
  33. BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument)
  34.     //{{AFX_MSG_MAP(CDrawDoc)
  35.     ON_COMMAND(ID_VIEW_PAPERCOLOR, OnViewPaperColor)
  36.     ON_COMMAND(ID_FILE_SUMMARYINFO, OnFileSummaryInfo)
  37.     //}}AFX_MSG_MAP
  38.     // Enable default OLE container implementation
  39.     ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu)
  40.     ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu)
  41.     ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu)
  42.     ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks)
  43.     ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu)
  44.         // MAPI support
  45.     ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
  46.     ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
  47. END_MESSAGE_MAP()
  48.  
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CDrawDoc construction/destruction
  51.  
  52. CDrawDoc::CDrawDoc()
  53. {
  54.     EnableCompoundFile();
  55.  
  56.     m_nMapMode = MM_ANISOTROPIC;
  57.     m_paperColor = RGB(255, 255, 255);
  58.     m_pSummInfo = NULL;
  59.     ComputePageSize();
  60. }
  61.  
  62. CDrawDoc::~CDrawDoc()
  63. {
  64.     POSITION pos = m_objects.GetHeadPosition();
  65.     while (pos != NULL)
  66.         delete m_objects.GetNext(pos);
  67.     delete m_pSummInfo;
  68. }
  69.  
  70. BOOL CDrawDoc::OnNewDocument()
  71. {
  72.     if (!COleDocument::OnNewDocument())
  73.         return FALSE;
  74.  
  75.     // reinitialization code
  76.     // (SDI documents will reuse this document)
  77.     if(m_pSummInfo != NULL)
  78.         delete m_pSummInfo;
  79.     m_pSummInfo = new CSummInfo;
  80.     // Title, Subject, Author, Keywords default to empty string
  81.     // Comments, Template, SavedBy default to empty string
  82.     // LastSave, LastPrint, EditTime, RevNum default to 0
  83.     m_pSummInfo->StartEditTimeCount();
  84.     m_pSummInfo->RecordCreateDate();
  85.     m_pSummInfo->SetNumPages(1);
  86.     // NumWords, NumChars default to 0
  87.     m_pSummInfo->SetAppname( _T("DrawCli") );
  88.     // Security defaults to 0
  89.     return TRUE;
  90. }
  91.  
  92. BOOL CDrawDoc::OnOpenDocument(LPCTSTR lpszPathName)
  93. {
  94.     if( m_pSummInfo != NULL)
  95.         delete m_pSummInfo;
  96.     m_pSummInfo = new CSummInfo;
  97.     m_pSummInfo->StartEditTimeCount();
  98.     return COleDocument::OnOpenDocument(lpszPathName);
  99. }
  100.  
  101. BOOL CDrawDoc::OnSaveDocument(LPCTSTR lpszPathName)
  102. {
  103.     m_pSummInfo->RecordSaveDate();
  104.     m_pSummInfo->IncrRevNum();
  105.     m_pSummInfo->SetLastAuthor(m_pSummInfo->GetAuthor());
  106.     m_pSummInfo->AddCountToEditTime();
  107.     m_pSummInfo->StartEditTimeCount();
  108.     return COleDocument::OnSaveDocument(lpszPathName);
  109. }
  110.  
  111. /////////////////////////////////////////////////////////////////////////////
  112. // CDrawDoc serialization
  113.  
  114. void CDrawDoc::Serialize(CArchive& ar)
  115. {
  116.     if (ar.IsStoring())
  117.     {
  118.         ar << m_paperColor;
  119.         m_objects.Serialize(ar);
  120.         m_pSummInfo->WriteToStorage(m_lpRootStg);
  121.     }
  122.     else
  123.     {
  124.         ar >> m_paperColor;
  125.         m_objects.Serialize(ar);
  126.         m_pSummInfo->ReadFromStorage(m_lpRootStg);
  127.     }
  128.  
  129.     // By calling the base class COleDocument, we enable serialization
  130.     //  of the container document's COleClientItem objects automatically.
  131.     COleDocument::Serialize(ar);
  132. }
  133.  
  134.  
  135. /////////////////////////////////////////////////////////////////////////////
  136. // CDrawDoc implementation
  137.  
  138. void CDrawDoc::Draw(CDC* pDC, CDrawView* pView)
  139. {
  140.     POSITION pos = m_objects.GetHeadPosition();
  141.     while (pos != NULL)
  142.     {
  143.         CDrawObj* pObj = m_objects.GetNext(pos);
  144.         pObj->Draw(pDC);
  145.         if (pView->m_bActive && !pDC->IsPrinting() && pView->IsSelected(pObj))
  146.             pObj->DrawTracker(pDC, CDrawObj::selected);
  147.     }
  148. }
  149.  
  150. void CDrawDoc::Add(CDrawObj* pObj)
  151. {
  152.     m_objects.AddTail(pObj);
  153.     pObj->m_pDocument = this;
  154.     SetModifiedFlag();
  155. }
  156.  
  157. void CDrawDoc::Remove(CDrawObj* pObj)
  158. {
  159.     // Find and remove from document
  160.     POSITION pos = m_objects.Find(pObj);
  161.     if (pos != NULL)
  162.         m_objects.RemoveAt(pos);
  163.     // set document modified flag
  164.     SetModifiedFlag();
  165.  
  166.     // call remove for each view so that the view can remove from m_selection
  167.     pos = GetFirstViewPosition();
  168.     while (pos != NULL)
  169.         ((CDrawView*)GetNextView(pos))->Remove(pObj);
  170. }
  171.  
  172. // point is in logical coordinates
  173. CDrawObj* CDrawDoc::ObjectAt(const CPoint& point)
  174. {
  175.     CRect rect(point, CSize(1, 1));
  176.     POSITION pos = m_objects.GetTailPosition();
  177.     while (pos != NULL)
  178.     {
  179.         CDrawObj* pObj = m_objects.GetPrev(pos);
  180.         if (pObj->Intersects(rect))
  181.             return pObj;
  182.     }
  183.  
  184.     return NULL;
  185. }
  186.  
  187. void CDrawDoc::ComputePageSize()
  188. {
  189.     CSize new_size(850, 1100);  // 8.5" x 11" default
  190.  
  191.     CPrintDialog dlg(FALSE);
  192.     if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd))
  193.     {
  194.         // GetPrinterDC returns a HDC so attach it
  195.         CDC dc;
  196.         HDC hDC= dlg.CreatePrinterDC();
  197.         ASSERT(hDC != NULL);
  198.         dc.Attach(hDC);
  199.  
  200.         // Get the size of the page in loenglish
  201.         new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE), 1000, 254);
  202.         new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE), 1000, 254);
  203.     }
  204.  
  205.     // if size changed then iterate over views and reset
  206.     if (new_size != m_size)
  207.     {
  208.         m_size = new_size;
  209.         POSITION pos = GetFirstViewPosition();
  210.         while (pos != NULL)
  211.             ((CDrawView*)GetNextView(pos))->SetPageSize(m_size);
  212.     }
  213. }
  214.  
  215. void CDrawDoc::OnViewPaperColor()
  216. {
  217.     CColorDialog dlg;
  218.     if (dlg.DoModal() != IDOK)
  219.         return;
  220.  
  221.     m_paperColor = dlg.GetColor();
  222.     SetModifiedFlag();
  223.     UpdateAllViews(NULL);
  224. }
  225.  
  226. /////////////////////////////////////////////////////////////////////////////
  227. // CDrawDoc diagnostics
  228.  
  229. #ifdef _DEBUG
  230. void CDrawDoc::AssertValid() const
  231. {
  232.     COleDocument::AssertValid();
  233. }
  234.  
  235. void CDrawDoc::Dump(CDumpContext& dc) const
  236. {
  237.     COleDocument::Dump(dc);
  238. }
  239. #endif //_DEBUG
  240.  
  241. /////////////////////////////////////////////////////////////////////////////
  242. // CDrawDoc commands
  243.  
  244. void CDrawDoc::OnFileSummaryInfo()
  245. {
  246.     ASSERT_VALID(this);
  247.  
  248.     CPropertySheet sheet( _T("Document Properties") );
  249.     CSummPage summ;
  250.     CStatPage stat;
  251.     sheet.AddPage( &summ );
  252.     sheet.AddPage( &stat );
  253.  
  254.     summ.m_strAppname = m_pSummInfo->GetAppname();
  255.     summ.m_strTitle   = m_pSummInfo->GetTitle();
  256.     summ.m_strSubj    = m_pSummInfo->GetSubject();
  257.     summ.m_strAuthor  = m_pSummInfo->GetAuthor();
  258.     summ.m_strKeywd   = m_pSummInfo->GetKeywords();
  259.     summ.m_strCmt     = m_pSummInfo->GetComments();
  260.     summ.m_strTempl   = m_pSummInfo->GetTemplate();
  261.  
  262.     stat.m_strSavedBy    = m_pSummInfo->GetLastAuthor();
  263.     stat.m_strRevNum     = m_pSummInfo->GetRevNum();
  264.     stat.m_strEditTime   = m_pSummInfo->GetEditTime();
  265.     stat.m_strLastPrint  = m_pSummInfo->GetLastPrintDate();
  266.     stat.m_strCreateDate = m_pSummInfo->GetCreateDate();
  267.     stat.m_strLastSave   = m_pSummInfo->GetLastSaveDate();
  268.     stat.m_strNumPages   = m_pSummInfo->GetNumPages();
  269.     stat.m_strNumWords   = m_pSummInfo->GetNumWords();
  270.     stat.m_strNumChars   = m_pSummInfo->GetNumChars();
  271.     stat.m_strSecurity   = m_pSummInfo->GetSecurity();
  272.  
  273.     if (sheet.DoModal() != IDOK)
  274.         return;
  275.  
  276.     m_pSummInfo->SetAuthor(summ.m_strAuthor);
  277.     m_pSummInfo->SetKeywords(summ.m_strKeywd);
  278.     m_pSummInfo->SetSubject(summ.m_strSubj);
  279.     m_pSummInfo->SetComments(summ.m_strCmt);
  280.     m_pSummInfo->SetTemplate(summ.m_strTempl);
  281.     m_pSummInfo->SetTitle(summ.m_strTitle);
  282.  
  283.     SetModifiedFlag();
  284. }
  285.