// maindoc.cpp : implementation of the CMainDoc 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 "oclient.h" #include "maindoc.h" #include "rectitem.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif // private clipboard format CLIPFORMAT CMainDoc::m_cfPrivate = NULL; ///////////////////////////////////////////////////////////////////////////// // CMainDoc IMPLEMENT_DYNCREATE(CMainDoc, COleLinkingDoc) BEGIN_MESSAGE_MAP(CMainDoc, COleLinkingDoc) //{{AFX_MSG_MAP(CMainDoc) ON_COMMAND(ID_EDIT_CLEAR_ALL, OnEditClearAll) ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR_ALL, OnUpdateEditClearAll) //}}AFX_MSG_MAP ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdatePasteMenu) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, OnUpdatePasteLinkMenu) ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, OnUpdateEditLinksMenu) ON_COMMAND(ID_OLE_EDIT_LINKS, OnEditLinks) ON_UPDATE_COMMAND_UI(ID_OLE_VERB_FIRST, OnUpdateObjectVerbMenu) ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CHANGE_ICON, OnUpdateEditChangeIcon) ON_COMMAND(ID_OLE_EDIT_CHANGE_ICON, OnEditChangeIcon) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMainDoc construction/destruction CMainDoc::CMainDoc() : m_sizeDoc(800,1050) // document size is 8x10.5 { EnableCompoundFile(); m_bNeedUpdate = TRUE; if (m_cfPrivate == NULL) m_cfPrivate = (CLIPFORMAT) ::RegisterClipboardFormat(_T("MFC OClient Sample")); } CMainDoc::~CMainDoc() { } CSize &CMainDoc::GetDocumentSize() { return m_sizeDoc; } void CMainDoc::OnShowViews(BOOL bVisible) { COleLinkingDoc::OnShowViews(bVisible); if (bVisible && m_bNeedUpdate) { // update embedded links in this document before showing the window COleUpdateDialog dlg(this); dlg.DoModal(); m_bNeedUpdate = FALSE; } } ///////////////////////////////////////////////////////////////////////////// // CMainDoc item management CRectItem* CMainDoc::CreateItem() { return new CRectItem(this); // does 'AddItem' automatically } // safe delete that notifies views void CMainDoc::DeleteItem(CRectItem* pItem) { ASSERT(pItem->GetDocument() == this); SetModifiedFlag(); UpdateAllViews(NULL, 1, pItem); // pItem will be deleted pItem->Delete(); // does a 'RemoveItem' & 'delete this' automatically } ///////////////////////////////////////////////////////////////////////////// // CMainDoc serialization void CMainDoc::Serialize(CArchive& ar) { // NOTE: New easier to use serialization model -- even for OLE objects! WORD wMagic = 0x0DAF; if (ar.IsStoring()) { if (HasBlankItems() && AfxMessageBox(IDP_SAVEINCOMPLETE, MB_YESNO|MB_ICONQUESTION) != IDYES) { TRACE0("Aborting save -- incomplete items found!\n"); AfxThrowArchiveException(CArchiveException::generic); } ar << wMagic; } else { WORD w; ar >> w; if (w != wMagic) { TRACE0("invalid magic number at start of file\n"); AfxThrowArchiveException(CArchiveException::generic); } } // serialize the rest of the document (OLE items) COleLinkingDoc::Serialize(ar); } ///////////////////////////////////////////////////////////////////////////// // CMainDoc commands void CMainDoc::OnEditClearAll() { // delete all items in the document (also removes sub-storages) POSITION pos = GetStartPosition(); while (pos != NULL) { CRectItem* pItem = (CRectItem*)GetNextItem(pos); ASSERT_KINDOF(CRectItem, pItem); pItem->Delete(); } // everything is gone now! SetModifiedFlag(); UpdateAllViews(NULL); } void CMainDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) { // Enable ClearAll if there is anything to clear pCmdUI->Enable(GetStartPosition() != NULL); } void CMainDoc::AdjustItemPosition(CRectItem* pItem) { POSITION pos = GetStartPosition(); while (pos != NULL) { CRectItem* pRectItem = (CRectItem*)GetNextItem(pos); ASSERT_KINDOF(CRectItem, pItem); if (pRectItem != pItem && pRectItem->GetRect() == pItem->GetRect()) { pItem->m_ptPos.x += 10; pItem->m_ptPos.y -= 10; pos = GetStartPosition(); } } } ///////////////////////////////////////////////////////////////////////////// // CMainDoc diagnostics #ifdef _DEBUG void CMainDoc::AssertValid() const { COleLinkingDoc::AssertValid(); } void CMainDoc::Dump(CDumpContext& dc) const { COleLinkingDoc::Dump(dc); } #endif //_DEBUG