|
|
//**********************************************************************
// File name: DOC.CPP
//
// Implementation file for CSimpSvrDoc.
//
// Functions:
//
// See DOC.H for Class Definition
//
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "pre.h"
#include "obj.h"
#include "app.h"
#include "doc.h"
//**********************************************************************
//
// CSimpSvrDoc::Create
//
// Purpose:
//
// Creation for the CSimpSvrDoc Class
//
// Parameters:
//
// CSimpSvrApp FAR * lpApp - Pointer to the CSimpSvrApp Class
//
// LPRECT lpRect - Client area rect of "frame" window
//
// HWND hWnd - Window Handle of "frame" window
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// StgCreateDocfile OLE API
// CreateWindow Windows API
// ShowWindow Windows API
// UpdateWindow Windows API
// CSimpSvrDoc::CSimpSvrDoc DOC.CPP
// CreateHatchWindow OLE2UI
//
// Comments:
//
// This routine was added so that failure could be returned
// from object creation.
//
//********************************************************************
CSimpSvrDoc FAR * CSimpSvrDoc::Create(CSimpSvrApp FAR *lpApp, LPRECT lpRect,HWND hWnd) { CSimpSvrDoc FAR * lpTemp = new CSimpSvrDoc(lpApp, hWnd);
if (!lpTemp) return NULL;
// create the document Window
lpTemp->m_hDocWnd = CreateWindow( TEXT("DocWClass"), NULL, WS_CHILD | WS_CLIPSIBLINGS, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, hWnd, NULL, lpApp->GethInst(), NULL);
if (!lpTemp->m_hDocWnd) goto error;
lpTemp->ShowDocWnd();
lpTemp->m_hHatchWnd = CreateHatchWindow( lpTemp->m_hDocWnd, lpApp->GethInst());
lpTemp->HideHatchWnd();
return (lpTemp);
error: delete (lpTemp); return NULL;
}
//**********************************************************************
//
// CSimpSvrDoc::CSimpSvrDoc
//
// Purpose:
//
// Constructor for the CSimpSvrDoc Class
//
// Parameters:
//
// CSimpSvrApp FAR * lpApp - Pointer to the CSimpSvrApp Class
//
// HWND hWnd - Window Handle of "frame" window
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// GetMenu Windows API
// GetSubMenu Windows API
//
// Comments:
//
//********************************************************************
CSimpSvrDoc::CSimpSvrDoc(CSimpSvrApp FAR * lpApp,HWND hWnd) { TestDebugOut(TEXT("In CSimpSvrDoc's Constructor\r\n")); m_lpApp = lpApp; m_nCount = 0; m_lpObj = NULL;
// set up menu handles
m_hMainMenu = GetMenu(hWnd); m_hColorMenu = GetSubMenu(m_hMainMenu, 1); m_hHelpMenu = GetSubMenu(m_hMainMenu, 2);
}
//**********************************************************************
//
// CSimpSvrDoc::~CSimpSvrDoc
//
// Purpose:
//
// Destructor for CSimpSvrDoc
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// DestroyWindow Windows API
// CSimpSvrApp::ClearDoc APP.CPP
//
// Comments:
//
//********************************************************************
CSimpSvrDoc::~CSimpSvrDoc() { TestDebugOut(TEXT("In CSimpSvrDoc's Destructor\r\n"));
// Clear the Doc object pointer so that the SimpSvrApp won't be able
// to access invalid objects. (same for the SimpSvrObj)
if (m_lpApp) m_lpApp->ClearDoc();
if (m_lpObj) m_lpObj->ClearDoc();
DestroyWindow(m_hHatchWnd); DestroyWindow(m_hDocWnd); }
//**********************************************************************
//
// CSimpSvrDoc::QueryInterface
//
// Purpose:
//
// Return a pointer to a requested interface
//
// Parameters:
//
// REFIID riid - ID of interface to be returned
// LPVOID FAR* ppvObj - Location to return the interface
//
// Return Value:
//
// E_NOINTERFACE - Always
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrApp::QueryInterface APP.CPP
//
// Comments:
//
// Since the document could contain multiple objects, all
// interfaces except those associated with the document should
// be returned. In this implementation, there are no doc level
// interfaces.
//
//********************************************************************
STDMETHODIMP CSimpSvrDoc::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) { TestDebugOut(TEXT("In CSimpSvrDoc::QueryInterface\r\n"));
SCODE sc = E_NOINTERFACE;
if (IsEqualIID(riid, IID_IUnknown)) { AddRef(); *ppvObj = this; sc = S_OK; }
return ResultFromScode(sc); }
//**********************************************************************
//
// CSimpSvrDoc::AddRef
//
// Purpose:
//
// Increments the document level reference count
//
// Parameters:
//
// None
//
// Return Value:
//
// UINT - The current reference count on the document
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrApp::AddRef APP.CPP
//
// Comments:
//
// The reference count at this level reflects the total ref.
// count of all interfaces on all objects contained within
// this document. Note that it also "trickles up" the
// ref count to the app level.
//
//********************************************************************
STDMETHODIMP_(ULONG) CSimpSvrDoc::AddRef() { TestDebugOut(TEXT("In CSimpSvrDoc::AddRef\r\n")); // AddRef the app, but return the doc count
m_lpApp->AddRef();
return ++m_nCount; }
//**********************************************************************
//
// CSimpSvrDoc::Release
//
// Purpose:
//
// Decrements the document level reference count
//
// Parameters:
//
// None
//
// Return Value:
//
// UINT - The current reference count on the document
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrApp::Release APP.CPP
//
// Comments:
//
// The reference count at this level reflects the total ref.
// count of all interfaces on all objects contained within
// this document. Note that it also "trickles up" the
// ref count to the app level.
//
//********************************************************************
STDMETHODIMP_(ULONG) CSimpSvrDoc::Release() { TestDebugOut(TEXT("In CSimpSvrDoc::Release\r\n")); // Release the app, but return the app count
m_lpApp->Release();
if (--m_nCount== 0) { delete this; return(0); } return m_nCount; }
//**********************************************************************
//
// CSimpSvrDoc::lResizeDoc
//
// Purpose:
//
// Resizes the document
//
// Parameters:
//
// LPRECT lpRect - The size of the client are of the "frame"
// Window.
//
// Return Value:
//
// NULL
//
// Function Calls:
// Function Location
//
// MoveWindow Windows API
//
//
//********************************************************************
long CSimpSvrDoc::lResizeDoc(LPRECT lpRect) { MoveWindow(m_hDocWnd, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, TRUE); return NULL; }
//**********************************************************************
//
// CSimpSvrDoc::PaintDoc
//
// Purpose:
//
// Paints the Document
//
// Parameters:
//
// HDC hDC - hDC of the document Window
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::Draw OBJ.CPP
// CSimpSvrObj::GetDataAdviseHolder OBJ.H
// CSimpSvrObj::GetDataObject OBJ.H
// CSimpAppObj::IsStartedByOle APP.CPP
// IDataAdviseHolder::SendOnDataChange OLE API
//
//
//********************************************************************
void CSimpSvrDoc::PaintDoc (HDC hDC) {
// if the object hasn't been created yet, then don't draw
if (m_lpObj) m_lpObj->Draw(hDC,FALSE); else return;
// Sending a data change every time we paint, but only if we
// were started by OLE
if (m_lpApp->IsStartedByOle()) m_lpObj->SendOnDataChange( ); }
//**********************************************************************
//
// CSimpSvrDoc::CreateObject
//
// Purpose:
// Handles the creation of a SimpSvrObj.
//
// Parameters:
//
//
// Return Value:
//
// S_OK if the function succeeds, otherwise E_FAIL
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::CSimpSvrObj OBJ.CPP
// CSimpSvrOjb::QueryInterface OBJ.CPP
//
//
//********************************************************************
HRESULT CSimpSvrDoc::CreateObject(REFIID riid, LPVOID FAR *ppvObject) { SCODE sc = E_FAIL;
m_lpObj = new CSimpSvrObj(this);
if (m_lpObj) { m_lpObj->QueryInterface(riid, ppvObject); sc = S_OK; }
return ResultFromScode(sc); }
//**********************************************************************
//
// CSimpSvrDoc::Close
//
// Purpose:
//
// Closes the object
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// TestDebugOut Windows API
// CSimpSvrObj::AddRef OBJ.CPP
// CSimpSvrObj::Release OBJ.CPP
// CSimpSvrObj::IsInPlaceActive OBJ.H
// CSimpSvrObj::GetOleInPlaceObject OBJ.H
// CSimpSvrObj::ClearOleClientSite OBJ.H
// CSimpSvrObj::GetDataAdviseHolder OBJ.H
// CSimpSvrObj::GetOleClientSite OBJ.H
// CSimpSvrObj::ClearDataAdviseHolder OBJ.H
// CSimpSvrObj::GetOleAdviseHolder OBJ.H
// CSimpSvrObj::ClearOleAdviseHolder OBJ.H
// IOleInPlaceObject::InPlaceDeactivate Container
// IOleClientSite::SaveObject Container
// IOleClientSite::OnShowWindow Container
// IOleClientSite::Release Container
// IDataAdviseHolder::SendOnDataChange OLE
// IDataAdviseHolder::Release OLE
// IOleAdviseHolder::SendOnClose OLE
// IOleAdviseHolder::Release OLE
//
//
//********************************************************************
void CSimpSvrDoc::Close() { TestDebugOut(TEXT("In CSimpSvrDoc::Close() \r\n"));
m_lpObj->AddRef(); // hold object alive
// if the object is currently inplace active, then deactivate
if (m_lpObj->IsInPlaceActive()) m_lpObj->GetOleInPlaceObject()->InPlaceDeactivate();
// unregister from the ROT...
if (m_lpObj->GetRotRegister()) { LPRUNNINGOBJECTTABLE lpRot;
if (GetRunningObjectTable (0, &lpRot) == NOERROR ) { lpRot->Revoke(m_lpObj->GetRotRegister()); lpRot->Release(); } }
// if we have a clientsite, instruct it to save the object
if (m_lpObj->GetOleClientSite()) { m_lpObj->GetOleClientSite()->SaveObject(); m_lpObj->GetOleClientSite()->OnShowWindow(FALSE); }
// Do a final SendOnDataChange for those containers that have specified the
// ADF_DATAONSTOP flag.
if (m_lpObj->GetDataAdviseHolder()) { m_lpObj->GetDataAdviseHolder()->SendOnDataChange( m_lpObj->GetDataObject(), 0, ADVF_DATAONSTOP); }
// Tell the container that we are shutting down.
if (m_lpObj->GetOleAdviseHolder()) { m_lpObj->GetOleAdviseHolder()->SendOnClose(); }
// release our streams and storage
m_lpObj->GetPersistStorage()->ReleaseStreamsAndStorage();
// Disconnect the object. NOTE: This call should not do anything
// unless the container has cause a GP Fault or some other problem
// has occured...
TestDebugOut(TEXT("*** Before CoDisconnectObject *** \r\n"));
CoDisconnectObject((LPUNKNOWN)m_lpObj, 0);
TestDebugOut(TEXT("*** After CoDisconnectObject *** \r\n"));
m_lpObj->Release(); // let object close
}
//**********************************************************************
//
// CSimpSvrDoc::SetStatusText
//
// Purpose:
//
// Sets the Container's status bar text
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// CSimpSvrObj::IsInPlaceActive OBJ.CPP
// IOleInPlaceFrame::SetStatusText Container
//
// Comments:
//
// Even though there is no status line in this sample, this
// method must be called on WM_MENUSELECT to clear the last
// message in the status line.
//
//********************************************************************
void CSimpSvrDoc::SetStatusText() { if (m_lpObj->IsInPlaceActive()) m_lpObj->GetInPlaceFrame()->SetStatusText(OLESTR("\0"));
}
//**********************************************************************
//
// CSimpSvrDoc::ShowDocWnd
//
// Purpose:
//
// Shows the Document Window
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
// UpdateWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::ShowDocWnd() { ShowWindow(m_hDocWnd, SW_SHOWNORMAL); // Show the window
UpdateWindow(m_hDocWnd); // Sends WM_PAINT message
}
//**********************************************************************
//
// CSimpSvrDoc::ShowHatchWnd
//
// Purpose:
//
// Shows the hatch Window
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::ShowHatchWnd() { ShowWindow(m_hHatchWnd, SW_SHOW); }
//**********************************************************************
//
// CSimpSvrDoc::HideDocWnd
//
// Purpose:
//
// Hides the DocumentWindow
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::HideDocWnd() { ShowWindow(m_hDocWnd, SW_HIDE); }
//**********************************************************************
//
// CSimpSvrDoc::HideHatchWnd
//
// Purpose:
//
// Hides the Hatch Window
//
// Parameters:
//
// None
//
// Return Value:
//
// None
//
// Function Calls:
// Function Location
//
// ShowWindow Windows API
//
// Comments:
//
//********************************************************************
void CSimpSvrDoc::HideHatchWnd() { ShowWindow(m_hHatchWnd, SW_HIDE); }
|