// drawdoc.cpp : implementation of the CDrawDoc class // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "drawcli.h" #include "drawdoc.h" #include "drawvw.h" #include "drawobj.h" #include "cntritem.h" #include "summpage.h" #include "statpage.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDrawDoc IMPLEMENT_DYNCREATE(CDrawDoc, COleDocument) BEGIN_MESSAGE_MAP(CDrawDoc, COleDocument) //{{AFX_MSG_MAP(CDrawDoc) ON_COMMAND(ID_VIEW_PAPERCOLOR, OnViewPaperColor) ON_COMMAND(ID_FILE_SUMMARYINFO, OnFileSummaryInfo) //}}AFX_MSG_MAP // Enable default OLE container implementation ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, COleDocument::OnUpdatePasteMenu) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, COleDocument::OnUpdatePasteLinkMenu) ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, COleDocument::OnUpdateEditLinksMenu) ON_COMMAND(ID_OLE_EDIT_LINKS, COleDocument::OnEditLinks) ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, COleDocument::OnUpdateObjectVerbMenu) // MAPI support ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail) ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDrawDoc construction/destruction CDrawDoc::CDrawDoc() { EnableCompoundFile(); m_nMapMode = MM_ANISOTROPIC; m_paperColor = RGB(255, 255, 255); m_pSummInfo = NULL; ComputePageSize(); } CDrawDoc::~CDrawDoc() { POSITION pos = m_objects.GetHeadPosition(); while (pos != NULL) delete m_objects.GetNext(pos); delete m_pSummInfo; } BOOL CDrawDoc::OnNewDocument() { if (!COleDocument::OnNewDocument()) return FALSE; // reinitialization code // (SDI documents will reuse this document) if(m_pSummInfo != NULL) delete m_pSummInfo; m_pSummInfo = new CSummInfo; // Title, Subject, Author, Keywords default to empty string // Comments, Template, SavedBy default to empty string // LastSave, LastPrint, EditTime, RevNum default to 0 m_pSummInfo->StartEditTimeCount(); m_pSummInfo->RecordCreateDate(); m_pSummInfo->SetNumPages(1); // NumWords, NumChars default to 0 m_pSummInfo->SetAppname( _T("DrawCli") ); // Security defaults to 0 return TRUE; } BOOL CDrawDoc::OnOpenDocument(LPCTSTR lpszPathName) { if( m_pSummInfo != NULL) delete m_pSummInfo; m_pSummInfo = new CSummInfo; m_pSummInfo->StartEditTimeCount(); return COleDocument::OnOpenDocument(lpszPathName); } BOOL CDrawDoc::OnSaveDocument(LPCTSTR lpszPathName) { m_pSummInfo->RecordSaveDate(); m_pSummInfo->IncrRevNum(); m_pSummInfo->SetLastAuthor(m_pSummInfo->GetAuthor()); m_pSummInfo->AddCountToEditTime(); m_pSummInfo->StartEditTimeCount(); return COleDocument::OnSaveDocument(lpszPathName); } ///////////////////////////////////////////////////////////////////////////// // CDrawDoc serialization void CDrawDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar << m_paperColor; m_objects.Serialize(ar); m_pSummInfo->WriteToStorage(m_lpRootStg); } else { ar >> m_paperColor; m_objects.Serialize(ar); m_pSummInfo->ReadFromStorage(m_lpRootStg); } // By calling the base class COleDocument, we enable serialization // of the container document's COleClientItem objects automatically. COleDocument::Serialize(ar); } ///////////////////////////////////////////////////////////////////////////// // CDrawDoc implementation void CDrawDoc::Draw(CDC* pDC, CDrawView* pView) { POSITION pos = m_objects.GetHeadPosition(); while (pos != NULL) { CDrawObj* pObj = m_objects.GetNext(pos); pObj->Draw(pDC); if (pView->m_bActive && !pDC->IsPrinting() && pView->IsSelected(pObj)) pObj->DrawTracker(pDC, CDrawObj::selected); } } void CDrawDoc::Add(CDrawObj* pObj) { m_objects.AddTail(pObj); pObj->m_pDocument = this; SetModifiedFlag(); } void CDrawDoc::Remove(CDrawObj* pObj) { // Find and remove from document POSITION pos = m_objects.Find(pObj); if (pos != NULL) m_objects.RemoveAt(pos); // set document modified flag SetModifiedFlag(); // call remove for each view so that the view can remove from m_selection pos = GetFirstViewPosition(); while (pos != NULL) ((CDrawView*)GetNextView(pos))->Remove(pObj); } // point is in logical coordinates CDrawObj* CDrawDoc::ObjectAt(const CPoint& point) { CRect rect(point, CSize(1, 1)); POSITION pos = m_objects.GetTailPosition(); while (pos != NULL) { CDrawObj* pObj = m_objects.GetPrev(pos); if (pObj->Intersects(rect)) return pObj; } return NULL; } void CDrawDoc::ComputePageSize() { CSize new_size(850, 1100); // 8.5" x 11" default CPrintDialog dlg(FALSE); if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd)) { // GetPrinterDC returns a HDC so attach it CDC dc; HDC hDC= dlg.CreatePrinterDC(); ASSERT(hDC != NULL); dc.Attach(hDC); // Get the size of the page in loenglish new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE), 1000, 254); new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE), 1000, 254); } // if size changed then iterate over views and reset if (new_size != m_size) { m_size = new_size; POSITION pos = GetFirstViewPosition(); while (pos != NULL) ((CDrawView*)GetNextView(pos))->SetPageSize(m_size); } } void CDrawDoc::OnViewPaperColor() { CColorDialog dlg; if (dlg.DoModal() != IDOK) return; m_paperColor = dlg.GetColor(); SetModifiedFlag(); UpdateAllViews(NULL); } ///////////////////////////////////////////////////////////////////////////// // CDrawDoc diagnostics #ifdef _DEBUG void CDrawDoc::AssertValid() const { COleDocument::AssertValid(); } void CDrawDoc::Dump(CDumpContext& dc) const { COleDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CDrawDoc commands void CDrawDoc::OnFileSummaryInfo() { ASSERT_VALID(this); CPropertySheet sheet( _T("Document Properties") ); CSummPage summ; CStatPage stat; sheet.AddPage( &summ ); sheet.AddPage( &stat ); summ.m_strAppname = m_pSummInfo->GetAppname(); summ.m_strTitle = m_pSummInfo->GetTitle(); summ.m_strSubj = m_pSummInfo->GetSubject(); summ.m_strAuthor = m_pSummInfo->GetAuthor(); summ.m_strKeywd = m_pSummInfo->GetKeywords(); summ.m_strCmt = m_pSummInfo->GetComments(); summ.m_strTempl = m_pSummInfo->GetTemplate(); stat.m_strSavedBy = m_pSummInfo->GetLastAuthor(); stat.m_strRevNum = m_pSummInfo->GetRevNum(); stat.m_strEditTime = m_pSummInfo->GetEditTime(); stat.m_strLastPrint = m_pSummInfo->GetLastPrintDate(); stat.m_strCreateDate = m_pSummInfo->GetCreateDate(); stat.m_strLastSave = m_pSummInfo->GetLastSaveDate(); stat.m_strNumPages = m_pSummInfo->GetNumPages(); stat.m_strNumWords = m_pSummInfo->GetNumWords(); stat.m_strNumChars = m_pSummInfo->GetNumChars(); stat.m_strSecurity = m_pSummInfo->GetSecurity(); if (sheet.DoModal() != IDOK) return; m_pSummInfo->SetAuthor(summ.m_strAuthor); m_pSummInfo->SetKeywords(summ.m_strKeywd); m_pSummInfo->SetSubject(summ.m_strSubj); m_pSummInfo->SetComments(summ.m_strCmt); m_pSummInfo->SetTemplate(summ.m_strTempl); m_pSummInfo->SetTitle(summ.m_strTitle); SetModifiedFlag(); }