home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
oledocvw.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
12KB
|
455 lines
// 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"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
void CDocObjectServer::OnSaveViewState(CArchive& /* ar */)
{
// user can override to save some state or do something neat
}
void CDocObjectServer::OnApplyViewState(CArchive& /* ar */)
{
// user can override to restore state or do something neat
}
HRESULT CDocObjectServer::OnActivateView()
{
USES_CONVERSION;
ASSERT_VALID(this);
HRESULT hr = E_FAIL;
// Can't in-place activate without a client site
if (m_pOwner->m_lpClientSite == NULL)
return NOERROR;
// build object title/name (the container may use this in its caption)
CString strFileType, strTitle;
if (!m_pOwner->GetFileTypeString(strFileType))
return E_FAIL;
AfxFormatString2(strTitle, AFX_IDS_OBJ_TITLE_INPLACE,
AfxGetAppName(), strFileType);
// Find our view site
LPOLEINPLACESITE lpInPlaceSite = NULL;
lpInPlaceSite = m_pViewSite;
if (lpInPlaceSite == NULL)
return E_FAIL;
lpInPlaceSite->AddRef();
// start activation sequence...
if ((hr = lpInPlaceSite->OnInPlaceActivate()) != NOERROR)
goto ReleaseAndFail;
// we'll need the parent window to create the CDocObjectIPFrameWnd
HWND hWnd;
VERIFY(lpInPlaceSite->GetWindow(&hWnd) == NOERROR);
CWnd* pParentWnd;
pParentWnd = CWnd::FromHandle(hWnd);
// create the inplace frame window
COleIPFrameWnd* pFrameWnd;
// if we've not been activate before, we'll need
// to create our frame at this time
if (m_pOwner->m_pInPlaceFrame != NULL)
pFrameWnd = m_pOwner->m_pInPlaceFrame;
else
{
pFrameWnd = (COleIPFrameWnd*) m_pOwner->CreateInPlaceFrame(pParentWnd);
if (pFrameWnd == NULL)
{
ASSERT(lpInPlaceSite != NULL);
lpInPlaceSite->OnInPlaceDeactivate();
goto ReleaseAndFail;
}
ASSERT(pFrameWnd->GetParent() == pParentWnd);
m_pOwner->m_pInPlaceFrame = pFrameWnd;
// need to get frame & doc window interfaces as well as other info
RECT rcPosRect, rcClipRect;
if ((hr = lpInPlaceSite->GetWindowContext(
&pFrameWnd->m_lpFrame, &pFrameWnd->m_lpDocFrame,
&rcPosRect, &rcClipRect, &pFrameWnd->m_frameInfo)) != NOERROR)
{
goto DestroyFrameAndFail;
}
ASSERT(pFrameWnd->m_lpFrame != NULL);
// send activate notification
if ((hr = lpInPlaceSite->OnUIActivate()) != NOERROR)
goto DestroyFrameAndFail;
// setup the shared menu
if (!pFrameWnd->BuildSharedMenu())
goto DeactivateUIAndFail;
// allow server to install frame controls in container
VERIFY(pFrameWnd->m_lpFrame->GetWindow(&hWnd) == NOERROR);
pFrameWnd->m_pMainFrame = new COleCntrFrameWnd(pFrameWnd);
pFrameWnd->m_pMainFrame->Attach(hWnd);
if (pFrameWnd->m_lpDocFrame != NULL)
{
VERIFY(pFrameWnd->m_lpDocFrame->GetWindow(&hWnd) == NOERROR);
pFrameWnd->m_pDocFrame = new COleCntrFrameWnd(pFrameWnd);
pFrameWnd->m_pDocFrame->Attach(hWnd);
}
// update zoom factor information before creating control bars
pFrameWnd->m_rectPos.CopyRect(&rcPosRect);
pFrameWnd->m_rectClip.CopyRect(&rcClipRect);
if (!pFrameWnd->OnCreateControlBars(pFrameWnd->m_pMainFrame,
pFrameWnd->m_pDocFrame))
{
goto DeactivateUIAndFail;
}
}
// set the active object
ASSERT(pFrameWnd->m_lpFrame != NULL);
LPOLEINPLACEACTIVEOBJECT lpActiveObject;
lpActiveObject = (LPOLEINPLACEACTIVEOBJECT)
m_pOwner->GetInterface(&IID_IOleInPlaceActiveObject);
pFrameWnd->m_lpFrame->SetActiveObject(lpActiveObject,
T2OLE((LPTSTR) (LPCTSTR) strTitle));
if (pFrameWnd->m_lpDocFrame != NULL)
{
pFrameWnd->m_lpDocFrame->SetActiveObject(lpActiveObject,
T2OLE((LPTSTR) (LPCTSTR) strTitle));
}
// add frame & document level frame controls
ASSERT(m_pOwner->m_pInPlaceFrame == pFrameWnd);
ASSERT(pFrameWnd->m_lpFrame != NULL);
m_pOwner->OnShowControlBars(pFrameWnd->m_pMainFrame, TRUE);
if (pFrameWnd->m_lpDocFrame != NULL)
m_pOwner->OnShowControlBars(pFrameWnd->m_pDocFrame, TRUE);
// show any hidden modeless dialogs as well...
pFrameWnd->ShowOwnedWindows(TRUE);
// attempt toolbar negotiation
m_pOwner->OnResizeBorder(NULL, pFrameWnd->m_lpFrame, TRUE);
if (pFrameWnd->m_lpDocFrame != NULL)
m_pOwner->OnResizeBorder(NULL, pFrameWnd->m_lpDocFrame, FALSE);
// install the menu (also installs a hook which forwards messages from
// the menu to the inplace frame window)
pFrameWnd->m_lpFrame->SetMenu(pFrameWnd->m_hSharedMenu,
pFrameWnd->m_hOleMenu, pFrameWnd->m_hWnd);
// finally -- show the inplace frame window and set focus
pFrameWnd->ShowWindow(SW_SHOW);
pFrameWnd->SetFocus();
pFrameWnd->UpdateWindow();
// allow the main window to be set
m_pOwner->OnFrameWindowActivate(TRUE);
pFrameWnd->m_bUIActive = TRUE;
// cleanup and return
lpInPlaceSite->Release();
return hr;
DeactivateUIAndFail:
ASSERT(lpInPlaceSite != NULL);
lpInPlaceSite->OnUIDeactivate(FALSE);
DestroyFrameAndFail:
if (m_pOwner->m_pInPlaceFrame != NULL)
{
ASSERT(pFrameWnd != NULL);
m_pOwner->DestroyInPlaceFrame(pFrameWnd);
m_pOwner->m_pInPlaceFrame = NULL;
// also need to send OnInPlaceDeactivate notification
ASSERT(lpInPlaceSite != NULL);
lpInPlaceSite->OnInPlaceDeactivate();
}
ReleaseAndFail:
ASSERT(lpInPlaceSite != NULL);
lpInPlaceSite->Release();
return hr;
}
STDMETHODIMP_(ULONG) CDocObjectServer::XOleDocumentView::AddRef()
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
return pThis->m_pOwner->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CDocObjectServer::XOleDocumentView::Release()
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
return pThis->m_pOwner->ExternalRelease();
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::QueryInterface(REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
return pThis->m_pOwner->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::SetInPlaceSite(
LPOLEINPLACESITE pIPSite)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
// if currently inplace active, then do normal inplace deactivation
if (pThis->m_pOwner->IsInPlaceActive())
pThis->m_pOwner->m_xOleInPlaceObject.InPlaceDeactivate();
// release the view site pointer
if (pThis->m_pViewSite)
pThis->m_pViewSite->Release();
// remember the new view site pointer and addref it, if it is non-NULL
pThis->m_pViewSite = pIPSite;
if (pThis->m_pViewSite != NULL)
pThis->m_pViewSite->AddRef();
return NOERROR;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::GetInPlaceSite(LPOLEINPLACESITE* ppIPSite)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
ASSERT(ppIPSite != NULL);
if (pThis->m_pViewSite)
pThis->m_pViewSite->AddRef();
*ppIPSite = pThis->m_pViewSite;
return NOERROR;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::GetDocument(LPUNKNOWN* ppUnk)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
ASSERT(ppUnk != NULL);
HRESULT hr = pThis->m_xOleDocument.QueryInterface(IID_IUnknown,
(LPVOID*)ppUnk);
ASSERT(*ppUnk != NULL);
return hr;
}
void CDocObjectServer::OnSetItemRects(LPRECT lprcPosRect, LPRECT lprcClipRect)
{
m_pOwner->OnSetItemRects(lprcPosRect, lprcClipRect);
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::SetRect(LPRECT lprcView)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
ASSERT(lprcView != NULL);
HRESULT hr = E_UNEXPECTED;
TRY
{
pThis->OnSetItemRects(lprcView, lprcView);
hr = NOERROR;
}
END_TRY
return hr;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::GetRect(LPRECT lprcView)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
ASSERT(lprcView != NULL);
pThis->m_pOwner->GetItemPosition(lprcView);
return NOERROR;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::SetRectComplex(
LPRECT lprcView, LPRECT lprcHScroll,
LPRECT lprcVScroll, LPRECT lprcSizeBox)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
UNUSED_ALWAYS(lprcView);
UNUSED_ALWAYS(lprcHScroll);
UNUSED_ALWAYS(lprcVScroll);
UNUSED_ALWAYS(lprcSizeBox);
// We don't support complex rectangles, so return error
return E_NOTIMPL;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::Show(BOOL bShow)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
HRESULT hr = NOERROR;
if (bShow)
{
// in-place but don't UI activate; give the view focus
hr = pThis->m_pOwner->ActivateInPlace();
}
else
{
// Call IOleInPlaceObject::InPlaceDeactivate on this view
hr = pThis->m_pOwner->m_xOleInPlaceObject.InPlaceDeactivate();
}
return hr;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::UIActivate(BOOL bUIActivate)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
HRESULT hr = NOERROR;
if (bUIActivate)
{
// UI Activate the view then take focus and bring the view forward
hr = pThis->OnActivateView();
}
else
{
// Call IOleInPlaceObject::UIDeactivate on this view
hr = pThis->m_pOwner->m_xOleInPlaceObject.UIDeactivate();
}
return hr;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::Open()
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
return pThis->m_pOwner->m_xOleObject.DoVerb(OLEIVERB_OPEN, NULL,
NULL, 0, NULL, NULL);
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::CloseView(DWORD /* dwReserved */)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
// Call IOleDocumentView::Show(FALSE) to hide the view
Show(FALSE);
// Call IOleDocumentView::SetInPlaceSite(NULL) to deactivate the object
HRESULT hr = SetInPlaceSite(NULL);
return hr;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::SaveViewState(LPSTREAM pstm)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
HRESULT hr = NOERROR;
// Attach the stream to an MFC file object
COleStreamFile file;
file.Attach(pstm);
CFileException fe;
// save it via a CArchive
CArchive saveArchive(&file, CArchive::store | CArchive::bNoFlushOnDelete);
TRY
{
pThis->OnSaveViewState(saveArchive);
saveArchive.Close();
file.Detach();
}
CATCH(COleException, pOE)
{
hr = pOE->m_sc;
}
AND_CATCH_ALL(e)
{
hr = E_UNEXPECTED;
}
END_CATCH_ALL
return hr;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::ApplyViewState(LPSTREAM pstm)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
HRESULT hr = NOERROR;
// Attach the stream to an MFC file object
COleStreamFile file;
file.Attach(pstm);
CFileException fe;
// load it with CArchive
CArchive loadArchive(&file, CArchive::load | CArchive::bNoFlushOnDelete);
TRY
{
pThis->OnApplyViewState(loadArchive);
loadArchive.Close();
file.Detach();
}
CATCH(COleException, pOE)
{
hr = pOE->m_sc;
}
AND_CATCH_ALL(e)
{
hr = E_UNEXPECTED;
}
END_CATCH_ALL
return hr;
}
STDMETHODIMP CDocObjectServer::XOleDocumentView::Clone(
LPOLEINPLACESITE pipsiteNew, LPOLEDOCUMENTVIEW* ppviewNew)
{
METHOD_PROLOGUE_EX(CDocObjectServer, OleDocumentView)
ASSERT_VALID(pThis);
UNUSED_ALWAYS(pipsiteNew);
UNUSED_ALWAYS(ppviewNew);
// In order to support this, we would need to support multiple views,
// which we do not. So we will return an error.
return E_NOTIMPL;
}