CTLOCX96.CPP

//=--------------------------------------------------------------------------= 
// CtlOcx96.H
//=--------------------------------------------------------------------------=
// Copyright 1995 - 1998 Microsoft Corporation. All Rights Reserved.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//=--------------------------------------------------------------------------=
//
// implementation of the OCX 96 interfaces that don't quite fit in to the
// categories covered by embedding, persistence, and ctlmisc.cpp
//
//
#include "IPServer.H"

#include "CtrlObj.H"
#include "Globals.H"


//=--------------------------------------------------------------------------=
// COleControl::GetActivationPolicy [IPointerInactive]
//=--------------------------------------------------------------------------=
// returns the present activation policy for this object. for non-subclassed
// windows controls, this means we can put off in-place activation for quite
// a while.
//
// Parameters:
// DWORD * - [out] activation policy
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP COleControl::GetActivationPolicy
(
DWORD *pdwPolicy
)
{
CHECK_POINTER(pdwPolicy);

// just get the policy in the global structure describing this control.
//
*pdwPolicy = ACTIVATIONPOLICYOFCONTROL(m_ObjectType);
return S_OK;
}

//=--------------------------------------------------------------------------=
// COleControl::OnInactiveMouseMove [IPointerInactive]
//=--------------------------------------------------------------------------=
// indicates to an inactive oobject that the mouse pointer has moved over the
// object.
//
// Parameters:
// LPCRECT - [in]
// long - [in]
// long - [in]
// DWORD - [in]
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP COleControl::OnInactiveMouseMove
(
LPCRECT pRectBounds,
long x,
long y,
DWORD dwMouseMsg
)
{
// OVERRIDE: end control writers should just override this if they want
// to have a control that is never in-place active.
//
return S_OK;
}

//=--------------------------------------------------------------------------=
// COleControl::OnInactiveSetCursor [IPointerInactive]
//=--------------------------------------------------------------------------=
// called by the container for the inactive object under the mouse pointer on
// recept of a WM_SETCURSOR message.
//
// Parameters:
// LPCRECT - [in]
// long - [in]
// long - [in]
// DWORD - [in]
// BOOL - [in]
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP COleControl::OnInactiveSetCursor
(
LPCRECT pRectBounds,
long x,
long y,
DWORD dwMouseMsg,
BOOL fSetAlways
)
{
// OVERRIDE: just get the user to override this if they want to never
// be activated
//
return S_OK;
}

//=--------------------------------------------------------------------------=
// COleControl::QuickActivate [IQuickActivate]
//=--------------------------------------------------------------------------=
// allows the container to activate the control.
//
// Parameters:
// QACONTAINER * - [in] info about the container
// QACONTROL * - [out] info about the control
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP COleControl::QuickActivate
(
QACONTAINER *pContainer,
QACONTROL *pControl
)
{
HRESULT hr;
DWORD dw;

// we need these guys.
//
if (!pContainer) return E_UNEXPECTED;
if (!pControl) return E_UNEXPECTED;

// start grabbing things from the QACONTAINER structure and apply them
// as relevant
//
if (pContainer->cbSize < sizeof(QACONTAINER)) return E_UNEXPECTED;
if (pControl->cbSize < sizeof(QACONTROL)) return E_UNEXPECTED;

// save out the client site, of course.
//
if (pContainer->pClientSite) {
hr = SetClientSite(pContainer->pClientSite);
RETURN_ON_FAILURE(hr);
}

// if the lcid is not LANG_NEUTRAL, score!
//
if (pContainer->lcid) {
g_lcidLocale = pContainer->lcid;
g_fHaveLocale = TRUE;
}

// pay attention to some ambients
//
if (pContainer->dwAmbientFlags & QACONTAINER_MESSAGEREFLECT) {
m_fHostReflects = TRUE;
m_fCheckedReflecting = TRUE;
}

// hook up some notifications. first property notifications.
//
if (pContainer->pPropertyNotifySink) {
pContainer->pPropertyNotifySink->AddRef();
hr = m_cpPropNotify.AddSink((void *)pContainer->pPropertyNotifySink, &pControl->dwPropNotifyCookie);
if (FAILED(hr)) {
pContainer->pPropertyNotifySink->Release();
return hr;
}
}

// then the event sink.
//
if (pContainer->pUnkEventSink) {
hr = m_cpEvents.Advise(pContainer->pUnkEventSink, &pControl->dwEventCookie);
if (FAILED(hr)) {
pContainer->pUnkEventSink->Release();
return hr;
}
}

// finally, the advise sink.
//
if (pContainer->pAdviseSink) {
// don't need to pass the cookie back since there can only be one
// person advising at a time.
//
hr = Advise(pContainer->pAdviseSink, &dw);
RETURN_ON_FAILURE(hr);
}

// set up a few things in the QACONTROL structure. we're opaque by default
//
pControl->dwMiscStatus = OLEMISCFLAGSOFCONTROL(m_ObjectType);
pControl->dwViewStatus = FCONTROLISOPAQUE(m_ObjectType) ? VIEWSTATUS_OPAQUE : 0;
pControl->dwPointerActivationPolicy = ACTIVATIONPOLICYOFCONTROL(m_ObjectType);

// that's pretty much all we're interested in. we will, however, pass on the
// rest of the things to the end control writer and see if they want to do
// anything with them. they shouldn't touch any of the above except for the
// ambients.
//
return OnQuickActivate(pContainer, &(pControl->dwViewStatus));
}

//=--------------------------------------------------------------------------=
// COleControl::SetContentExtent [IQuickActivate]
//=--------------------------------------------------------------------------=
// the container calls this to set the content extent of the control.
//
// Parameters:
// LPSIZEL - [in] the size of the content extent
//
// Output:
// HRESULT - S_OK, or E_FAIL for fixed size control
//
// Notes:
//
STDMETHODIMP COleControl::SetContentExtent
(
LPSIZEL pSize
)
{
return SetExtent(DVASPECT_CONTENT, pSize);
}

//=--------------------------------------------------------------------------=
// COleControl::GetContentExtent [IQuickActivate]
//=--------------------------------------------------------------------------=
// the container calls this to get the content extent of the control
//
// Parameters:
// LPSIZEL - [out] returns current size
//
// Output:
// HRESULT
//
// Notes:
//
STDMETHODIMP COleControl::GetContentExtent
(
LPSIZEL pSize
)
{
return GetExtent(DVASPECT_CONTENT, pSize);
}

//=--------------------------------------------------------------------------=
// COleControl::OnQuickActivate [overridable]
//=--------------------------------------------------------------------------=
// not all the of the members of the QACONTAINER need to be consumed by the
// framework, but are, at least, extremely interesting. thus, we will pass
// on the struture to the end control writer, and let them consume these.
//
// Parameters:
// QACONTAINER * - [in] contains additional information
// DWORD * - [out] put ViewStatus flags here.
//
// Output:
// HRESULT
//
// Notes:
// - control writers should only look at/consume:
// a. dwAmbientFlags
// b. colorFore/colorBack
// c. pFont
// d. pUndoMgr
// e. dwAppearance
// f. hpal
//
// - all the others are set up the for the user by the framework.
// - control writers should set up the pdwViewStatus with flags as per
// IViewObjectEx::GetViewStatus. if you don't know what this is or don't
// care, then don't touch.
//
HRESULT COleControl::OnQuickActivate
(
QACONTAINER *pContainer,
DWORD *pdwViewStatus
)
{
// by default, nuthin much to do!
//
return S_OK;
}