401 lines
10 KiB
C++
401 lines
10 KiB
C++
//**********************************************************************
|
||
// File name: IOIPO.CPP
|
||
//
|
||
// Implementation file for the CClassFactory Class
|
||
//
|
||
// Functions:
|
||
//
|
||
// See ioipo.h for a list of member functions.
|
||
//
|
||
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
|
||
//**********************************************************************
|
||
|
||
#include "pre.h"
|
||
#include "obj.h"
|
||
#include "ioipo.h"
|
||
#include "app.h"
|
||
#include "doc.h"
|
||
#include "math.h"
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::QueryInterface
|
||
//
|
||
// Purpose:
|
||
// Used for interface negotiation
|
||
//
|
||
// Parameters:
|
||
//
|
||
// REFIID riid - Interface being queried for.
|
||
//
|
||
// LPVOID FAR *ppvObj - Out pointer for the interface.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// S_OK - Success
|
||
// E_NOINTERFACE - Failure
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// CSimpSvrObj::QueryInterface OBJ.CPP
|
||
//
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::QueryInterface ( REFIID riid, LPVOID FAR* ppvObj)
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::QueryInterface\r\n"));
|
||
// need to NULL the out parameter
|
||
*ppvObj = NULL;
|
||
return m_lpObj->QueryInterface(riid, ppvObj);
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::AddRef
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Increments the reference count of CSimpSvrObj. Since
|
||
// COleInPlaceObject is a nested class of CSimpSvrObj, we don't need
|
||
// to have a separate reference count for COleInPlaceObject. We can
|
||
// use the reference count of CSimpSvrObj.
|
||
//
|
||
// Parameters:
|
||
//
|
||
// None
|
||
//
|
||
// Return Value:
|
||
//
|
||
// The new reference count of CSimpSvrObj
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// OuputDebugString Windows API
|
||
// CSimpSvrObj::AddRef OBJ.CPP
|
||
//
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP_(ULONG) COleInPlaceObject::AddRef ()
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::AddRef\r\n"));
|
||
return m_lpObj->AddRef();
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::Release
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Decrements the reference count of CSimpSvrObj. Since
|
||
// COleInPlaceObject is a nested class of CSimpSvrObj, we don't need
|
||
// to have a separate reference count for COleInPlaceObject. We can
|
||
// use the reference count of CSimpSvrObj.
|
||
//
|
||
// Parameters:
|
||
//
|
||
// None
|
||
//
|
||
// Return Value:
|
||
//
|
||
// The new reference count of CSimpSvrObj
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
// CSimpSvrObj::Release OBJ.CPP
|
||
//
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP_(ULONG) COleInPlaceObject::Release ()
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::Release\r\n"));
|
||
return m_lpObj->Release();
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::InPlaceDeactivate
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Called to deactivat the object
|
||
//
|
||
// Parameters:
|
||
//
|
||
// None
|
||
//
|
||
// Return Value:
|
||
// NOERROR
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
// IOleInPlaceSite::OnInPlaceDeactivate Container
|
||
// IOleInPlaceSite::Release Container
|
||
// CSimpSvrObj::DeactivateUI OBJ.CPP
|
||
// CSimpSvrObj::DoInPlaceHide OBJ.CPP
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::InPlaceDeactivate()
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::InPlaceDeactivate\r\n"));
|
||
|
||
// if not inplace active, return NOERROR
|
||
if (!m_lpObj->m_fInPlaceActive)
|
||
return NOERROR;
|
||
|
||
// clear inplace flag
|
||
m_lpObj->m_fInPlaceActive = FALSE;
|
||
|
||
// deactivate the UI
|
||
m_lpObj->DeactivateUI();
|
||
m_lpObj->DoInPlaceHide();
|
||
|
||
// tell the container that we are deactivating.
|
||
if (m_lpObj->m_lpIPSite)
|
||
{
|
||
HRESULT hRes;
|
||
if ((hRes=m_lpObj->m_lpIPSite->OnInPlaceDeactivate()) != S_OK)
|
||
{
|
||
TestDebugOut(TEXT("COleInPlaceObject::InPlaceDeactivate \
|
||
OnInPlaceDeactivate fails\n"));
|
||
}
|
||
m_lpObj->m_lpIPSite->Release();
|
||
m_lpObj->m_lpIPSite =NULL;
|
||
}
|
||
|
||
return ResultFromScode(S_OK);
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::UIDeactivate
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Instructs us to remove our UI.
|
||
//
|
||
// Parameters:
|
||
//
|
||
// None
|
||
//
|
||
// Return Value:
|
||
//
|
||
// S_OK
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
// CSimpSvrObj::DeactivateUI OBJ.CPP
|
||
//
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::UIDeactivate()
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::UIDeactivate\r\n"));
|
||
|
||
m_lpObj->DeactivateUI();
|
||
|
||
return ResultFromScode (S_OK);
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::SetObjectRects
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Called when the container clipping region or the object position
|
||
// changes.
|
||
//
|
||
// Parameters:
|
||
//
|
||
// LPCRECT lprcPosRect - New Position Rect.
|
||
//
|
||
// LPCRECT lprcClipRect - New Clipping Rect.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// S_OK
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
// IntersectRect Windows API
|
||
// OffsetRect Windows API
|
||
// CopyRect Windows API
|
||
// MoveWindow Windows API
|
||
// CSimpSvrDoc::GethHatchWnd DOC.H
|
||
// CSimpSvrDoc::gethDocWnd DOC.h
|
||
// SetHatchWindowSize OLE2UI
|
||
//
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::SetObjectRects ( LPCRECT lprcPosRect, LPCRECT lprcClipRect)
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::SetObjectRects\r\n"));
|
||
|
||
RECT resRect;
|
||
POINT pt;
|
||
|
||
// Get the intersection of the clipping rect and the position rect.
|
||
IntersectRect(&resRect, lprcPosRect, lprcClipRect);
|
||
|
||
m_lpObj->m_xOffset = abs (resRect.left - lprcPosRect->left);
|
||
m_lpObj->m_yOffset = abs (resRect.top - lprcPosRect->top);
|
||
|
||
m_lpObj->m_scale = (float)(lprcPosRect->right - lprcPosRect->left)/m_lpObj->m_size.x;
|
||
|
||
if (m_lpObj->m_scale == 0)
|
||
m_lpObj->m_scale = 1.0F;
|
||
|
||
TCHAR szBuffer[255];
|
||
|
||
wsprintf(szBuffer, TEXT("New Scale %3d\r\n"), m_lpObj->m_scale);
|
||
|
||
TestDebugOut(szBuffer);
|
||
|
||
// Adjust the size of the Hatch Window.
|
||
SetHatchWindowSize(m_lpObj->m_lpDoc->GethHatchWnd(),(LPRECT) lprcPosRect, (LPRECT) lprcClipRect, &pt);
|
||
|
||
// offset the rect
|
||
OffsetRect(&resRect, pt.x, pt.y);
|
||
|
||
CopyRect(&m_lpObj->m_posRect, lprcPosRect);
|
||
|
||
// Move the actual object window
|
||
MoveWindow(m_lpObj->m_lpDoc->GethDocWnd(),
|
||
resRect.left,
|
||
resRect.top,
|
||
resRect.right - resRect.left,
|
||
resRect.bottom - resRect.top,
|
||
TRUE);
|
||
|
||
|
||
return ResultFromScode( S_OK );
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::GetWindow
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Returns the Window handle of the inplace object
|
||
//
|
||
// Parameters:
|
||
//
|
||
// HWND FAR* lphwnd - Out pointer in which to return the window
|
||
// Handle.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// S_OK
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
// CSimpleDoc::GethDocWnd DOC.H
|
||
//
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::GetWindow ( HWND FAR* lphwnd)
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::GetWindow\r\n"));
|
||
*lphwnd = m_lpObj->m_lpDoc->GethDocWnd();
|
||
|
||
return ResultFromScode( S_OK );
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::ContextSensitiveHelp
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Used in performing Context Sensitive Help
|
||
//
|
||
// Parameters:
|
||
//
|
||
// BOOL fEnterMode - Flag to determine if enter or exiting
|
||
// Context Sensitive Help.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// E_NOTIMPL
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
//
|
||
// Comments:
|
||
//
|
||
// This function is not implemented due to the fact that it is
|
||
// beyond the scope of a simple object. All *real* applications
|
||
// are going to want to implement this function, otherwise any
|
||
// container that supports context sensitive help will not work
|
||
// properly while the object is in place.
|
||
//
|
||
// See TECHNOTES.WRI include with the OLE SDK for details on
|
||
// Implementing this method.
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::ContextSensitiveHelp ( BOOL fEnterMode)
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::ContextSensitiveHelp\r\n"));
|
||
return ResultFromScode( E_NOTIMPL);
|
||
}
|
||
|
||
//**********************************************************************
|
||
//
|
||
// COleInPlaceObject::ReactivateAndUndo
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Called when the container wants to undo the last edit made in
|
||
// the object.
|
||
//
|
||
// Parameters:
|
||
//
|
||
// None
|
||
//
|
||
// Return Value:
|
||
//
|
||
// INPLACE_E_NOTUNDOABLE
|
||
//
|
||
// Function Calls:
|
||
// Function Location
|
||
//
|
||
// TestDebugOut Windows API
|
||
//
|
||
// Comments:
|
||
//
|
||
// Since this server does not support undo, the value
|
||
// INPLACE_E_NOTUNDOABLE is always returned.
|
||
//
|
||
//********************************************************************
|
||
|
||
STDMETHODIMP COleInPlaceObject::ReactivateAndUndo ()
|
||
{
|
||
TestDebugOut(TEXT("In COleInPlaceObject::ReactivateAndUndo\r\n"));
|
||
return ResultFromScode( INPLACE_E_NOTUNDOABLE );
|
||
}
|
||
|