#include "privcpp.h"

const DWORD g_cookie = 111176;

CPackage_IViewObject2::CPackage_IViewObject2(CPackage *pPackage) : 
    _pPackage(pPackage)
{
    ASSERT(_cRef == 0);
    ASSERT(_fFrozen == FALSE);
}

CPackage_IViewObject2::~CPackage_IViewObject2()
{
    DebugMsg(DM_TRACE, "CPackage_IViewObject2 destroyed with ref count %d",_cRef);
}

//////////////////////////////////
//
// IUnknown Methods...
//
HRESULT CPackage_IViewObject2::QueryInterface(REFIID iid, void ** ppv)
{
    return _pPackage->QueryInterface(iid,ppv);
}

ULONG CPackage_IViewObject2::AddRef(void) 
{
    _cRef++;    // interface ref count for debugging
    return _pPackage->AddRef();
}

ULONG CPackage_IViewObject2::Release(void)
{
    _cRef--;    // interface ref count for debugging
    return _pPackage->Release();
}


//////////////////////////////////
//
// IViewObject2 Methods...
//
HRESULT CPackage_IViewObject2::Draw(DWORD dwDrawAspect, LONG lindex,
    LPVOID pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw,
    LPCRECTL lprcBounds, LPCRECTL lprcWBounds,BOOL (CALLBACK *pfnContinue)(ULONG_PTR),
    ULONG_PTR dwContinue)
{
    DebugMsg(DM_TRACE,"pack vo - Draw() called.");
    
    //
    // NOTE: If we're frozen, we should use a cached represetation, but
    // the icon doesn't really change all that often, so it's kind of 
    // pointless to freeze it, but here's where we'd do it, if we 
    // wanted to.  About the only place this would ever be necessary if 
    // somebody called to freeze us while the user was in the process of 
    // editing the package or something, but I don't think it's something
    // we need to worry about right away.  (Especially since the user can't
    // change the icon right now.)
    //

    IconDraw(_pPackage->_lpic, hdcDraw, (RECT *)lprcBounds);
    return S_OK;
}

    
HRESULT CPackage_IViewObject2::GetColorSet(DWORD dwAspect, LONG lindex, 
                                LPVOID pvAspect, DVTARGETDEVICE *ptd, 
                                HDC hdcTargetDev, LPLOGPALETTE *ppColorSet)
{
    DebugMsg(DM_TRACE,"pack vo - GetColorSet() called.");
    
    if (ppColorSet == NULL)
        return E_INVALIDARG;
    
    *ppColorSet = NULL;         // null the out param
    return S_FALSE;
}

    
HRESULT CPackage_IViewObject2::Freeze(DWORD dwDrawAspect, LONG lindex, 
                                      LPVOID pvAspect, LPDWORD pdwFreeze)
{
    DebugMsg(DM_TRACE,"pack vo - Freeze() called.");

    if (pdwFreeze == NULL)
        return E_INVALIDARG;
    
    if (_fFrozen) {
        *pdwFreeze = g_cookie;
        return S_OK;
    }
    
    //
    // This is where we would take a snapshot of the icon to use as
    // the "frozen" image in subsequent routines.  For now, we just
    // return the cookie.  Draw() will use the current icon regardless 
    // of the fFrozen flag.
    //
    
    _fFrozen = TRUE;
    *pdwFreeze = g_cookie;
    
    return S_OK;
}

    
HRESULT CPackage_IViewObject2::Unfreeze(DWORD dwFreeze)
{
    DebugMsg(DM_TRACE,"pack vo - Unfreeze() called.");
    
    // If the pass us an invalid cookie or we're not frozen then bail
    if (dwFreeze != g_cookie || !_fFrozen)
        return OLE_E_NOCONNECTION;
    
    // 
    // This is where we'd get rid of the frozen presentation we saved in
    // IViewObject::Freeze().
    //
    _fFrozen = FALSE;
    return S_OK;
}

    
HRESULT CPackage_IViewObject2::SetAdvise(DWORD dwAspects, DWORD dwAdvf,
                              LPADVISESINK pAdvSink)
{
    DebugMsg(DM_TRACE,"pack vo - SetAdvise() called.");
    
    if (_pPackage->_pViewSink)
        _pPackage->_pViewSink->Release();
    
    _pPackage->_pViewSink = pAdvSink;
    _pPackage->_dwViewAspects = dwAspects;
    _pPackage->_dwViewAdvf = dwAdvf;
    
    if (_pPackage->_pViewSink) 
        _pPackage->_pViewSink->AddRef();
    
    return S_OK;
}

    
HRESULT CPackage_IViewObject2::GetAdvise(LPDWORD pdwAspects, LPDWORD pdwAdvf,
                              LPADVISESINK *ppAdvSink)
{
    DebugMsg(DM_TRACE,"pack vo - GetAdvise() called.");
    
    if (!ppAdvSink || !pdwAdvf || !pdwAspects)
        return E_INVALIDARG;
    
    *ppAdvSink = _pPackage->_pViewSink;
    _pPackage->_pViewSink->AddRef();
    
    if (pdwAspects != NULL)
        *pdwAspects = _pPackage->_dwViewAspects;
    
    if (pdwAdvf != NULL)
        *pdwAdvf = _pPackage->_dwViewAdvf;
    
    return S_OK;
}

    
HRESULT CPackage_IViewObject2::GetExtent(DWORD dwAspect, LONG lindex,
DVTARGETDEVICE *ptd, LPSIZEL pszl)
{
    DebugMsg(DM_TRACE,"pack vo - GetExtent() called.");

    if (pszl == NULL)
        return E_INVALIDARG;
    
    if (!_pPackage->_lpic)
        return OLE_E_BLANK;
            
    pszl->cx = _pPackage->_lpic->rc.right;
    pszl->cy = _pPackage->_lpic->rc.bottom;
    
    pszl->cx = MulDiv(pszl->cx,HIMETRIC_PER_INCH,DEF_LOGPIXELSX);
    pszl->cy = MulDiv(pszl->cy,HIMETRIC_PER_INCH,DEF_LOGPIXELSY);
    
    return S_OK;
}
