ICONSITE.CPP
/* 
 * ICONSITE.CPP 
 * Patron Chapter 24 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#include "patron.h" 
 
 
/* 
 * CImpIOleControlSite::CImpIOleControlSite 
 * CImpIOleControlSite::~CImpIOleControlSite 
 * 
 * Parameters (Constructor): 
 *  pTen            PCTenant of the object we're in. 
 *  pUnkOuter       LPUNKNOWN to which we delegate. 
 */ 
 
CImpIOleControlSite::CImpIOleControlSite(PCTenant pTen 
    , LPUNKNOWN pUnkOuter) 
    { 
    m_cRef=0; 
    m_pTen=pTen; 
    m_pUnkOuter=pUnkOuter; 
    return; 
    } 
 
CImpIOleControlSite::~CImpIOleControlSite(void) 
    { 
    return; 
    } 
 
 
 
 
/* 
 * CImpIOleControlSite::QueryInterface 
 * CImpIOleControlSite::AddRef 
 * CImpIOleControlSite::Release 
 * 
 * Purpose: 
 *  Delegating IUnknown members for CImpIOleControlSite. 
 */ 
 
STDMETHODIMP CImpIOleControlSite::QueryInterface(REFIID riid 
    , LPVOID *ppv) 
    { 
    return m_pUnkOuter->QueryInterface(riid, ppv); 
    } 
 
 
STDMETHODIMP_(ULONG) CImpIOleControlSite::AddRef(void) 
    { 
    ++m_cRef; 
    return m_pUnkOuter->AddRef(); 
    } 
 
STDMETHODIMP_(ULONG) CImpIOleControlSite::Release(void) 
    { 
    --m_cRef; 
    return m_pUnkOuter->Release(); 
    } 
 
 
 
 
 
/* 
 * CImpIOleControlSite::OnControlInfoChanged 
 * 
 * Purpose: 
 *  Informs the site that the CONTROLINFO for the control has 
 *  changed and we thus need to reload the data. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  HRESULT         NOERROR 
 */ 
 
STDMETHODIMP CImpIOleControlSite::OnControlInfoChanged(void) 
    { 
    //We also update our "have info" flag here. 
    m_pTen->m_fHaveControlInfo=SUCCEEDED(m_pTen->m_pIOleControl 
        ->GetControlInfo(&m_pTen->m_ctrlInfo)); 
 
    return NOERROR; 
    } 
 
 
 
 
 
/* 
 * CImpIOleControlSite::LockInPlaceActive 
 * 
 * Purpose: 
 *  Forces the container to keep this control in-place active 
 *  (but not UI active) regardless of other considerations, or 
 *  removes this lock. 
 * 
 * Parameters: 
 *  fLock           BOOL indicating to lock (TRUE) or unlock (FALSE) 
 *                  in-place activation. 
 * 
 * Return Value: 
 *  HRESULT         NOERROR 
 */ 
 
STDMETHODIMP CImpIOleControlSite::LockInPlaceActive(BOOL fLock) 
    { 
    if (fLock) 
        m_pTen->m_cLockInPlace++; 
    else 
        { 
        if (0==--m_pTen->m_cLockInPlace) 
            { 
            //If there's a pending deactivate, do it now. 
            if (m_pTen->m_fPendingDeactivate) 
                m_pTen->DeactivateInPlaceObject(TRUE); 
            } 
        } 
 
    return NOERROR; 
    } 
 
 
 
 
 
/* 
 * CImpIOleControlSite::GetExtendedControl 
 * 
 * Purpose: 
 *  Returns a pointer to the container's extended control that wraps 
 *  the actual control in this site, if one exists. 
 * 
 * Parameters: 
 *  ppDispatch      LPDISPATCH * in which to return the pointer 
 *                  to the extended control's IDispatch interface. 
 * 
 * Return Value: 
 *  HRESULT         NOERROR or a general error value. 
 */ 
 
STDMETHODIMP CImpIOleControlSite::GetExtendedControl(LPDISPATCH 
    * ppDispatch) 
    { 
    *ppDispatch=NULL; 
    return ResultFromScode(E_NOTIMPL); 
    } 
 
 
 
 
 
 
/* 
 * CImpIOleControlSite::TransformCoords 
 * 
 * Purpose: 
 *  Converts coordinates in HIMETRIC units into those used by the 
 *  container. 
 * 
 * Parameters: 
 *  pptlHiMet       POINTL * containing either the coordinates to 
 *                  transform to container or where to store the 
 *                  transformed container coordinates. 
 *  pptlCont        POINTF * containing the container coordinates. 
 *  dwFlags         DWORD containing instructional flags. 
 * 
 * Return Value: 
 *  HRESULT         NOERROR or a general error value. 
 */ 
 
STDMETHODIMP CImpIOleControlSite::TransformCoords(POINTL *pptlHiMet 
    , POINTF *pptlCont, DWORD dwFlags) 
    { 
    if (NULL==pptlHiMet || NULL==pptlCont) 
        return ResultFromScode(E_POINTER); 
 
    /* 
     * Convert coordinates.  We use MM_LOMETRIC which means that 
     * to convert from HIMETRIC we divide by 10 and negate the y 
     * coordinate.  Conversion to HIMETRIC means negate the y 
     * and multiply by 10.  Note that size and position are 
     * considered the same thing, that is, we don't differentiate 
     * the two. 
     */ 
 
    if (XFORMCOORDS_HIMETRICTOCONTAINER & dwFlags) 
        { 
        pptlCont->x=(float)(pptlHiMet->x/10); 
        pptlCont->y=(float)-(pptlHiMet->y/10); 
        } 
    else 
        { 
        pptlHiMet->x=(long)(pptlCont->x*10); 
        pptlHiMet->y=(long)-(pptlCont->y*10); 
        } 
 
    return NOERROR; 
    } 
 
 
 
 
 
/* 
 * CImpIOleControlSite::TranslateAccelerator 
 * 
 * Purpose: 
 *  Instructs the container to translate a keyboard accelerator 
 *  message that the control has picked up instead. 
 * 
 * Parameters: 
 *  pMsg            LPMSG to the message to translate. 
 *  grfModifiers    DWORD flags with additional instructions. 
 * 
 * Return Value: 
 *  HRESULT         NOERROR or a general error value. 
 */ 
 
STDMETHODIMP CImpIOleControlSite::TranslateAccelerator(LPMSG pMsg 
    , DWORD grfModifiers) 
    { 
    /* 
     * The control has picked up a keystroke through its own 
     * TranslateAccelerator and is now giving us the change to 
     * play with it.  Currently there are no flags for 
     * grfModifiers, so we ignore them.  Especially since 
     * we have nothing to do here ourselves anyway. 
     */ 
    return ResultFromScode(S_FALSE); 
    } 
 
 
 
 
/* 
 * CImpIOleControlSite::OnFocus 
 * 
 * Purpose: 
 *  Informs the container that focus has either been lost or 
 *  gained in the control. 
 * 
 * Parameters: 
 *  fGotFocus       BOOL indicating that the control gained (TRUE) 
 *                  or lost (FALSE) focus. 
 * 
 * Return Value: 
 *  HRESULT         NOERROR or a general error value. 
 */ 
 
STDMETHODIMP CImpIOleControlSite::OnFocus(BOOL fGotFocus) 
    { 
    /* 
     * Patron doesn't do this, but to handle the default 
     * and cancel buttons properly, we normally process RETURN 
     * and ESC accelerators to press the right button. 
     * This behavior must be disabled when the control with 
     * the focus has either CTRLINFO_EATS_RETURN or 
     * CTRLINFO_EATS_ESCAPE set.  We tell the frame as 
     * we need to when a new control gets the focus.  We 
     * do nothing when a control loses the focus. 
     */ 
    return NOERROR; 
    } 
 
 
 
/* 
 * CImpIOleControlSite::ShowPropertyFrame 
 * 
 * Purpose: 
 *  Instructs the container to show the property frame if 
 *  this is an extended object and requires its own property 
 *  pages. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  HRESULT         NOERROR or a general error value. 
 */ 
 
STDMETHODIMP CImpIOleControlSite::ShowPropertyFrame(void) 
    { 
    /* 
     * Returning an error here means that the container has 
     * no property pages itself for the control, so the 
     * control should display its own. 
     */ 
    return ResultFromScode(E_NOTIMPL); 
    }