windows-nt/Source/XPSP1/NT/sdktools/unicows/samples/oclient/old/maindoc.cpp

189 lines
4.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
// 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