using namespace std;
VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :
-_p_clientsite(NULL), _p_instance(p_instance)
+_p_clientsite(NULL), _p_instance(p_instance)
{
CreateOleAdviseHolder(&_p_advise_holder);
};
case OLEIVERB_OPEN:
// force control to be visible when activating in place
_p_instance->setVisible(TRUE);
+ return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect, TRUE);
+
case OLEIVERB_INPLACEACTIVATE:
- return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+ return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect, FALSE);
case OLEIVERB_HIDE:
_p_instance->setVisible(FALSE);
return S_OK;
case OLEIVERB_UIACTIVATE:
- return doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+ // UI activate only if visible
+ if( _p_instance->isVisible() )
+ return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect, TRUE);
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
case OLEIVERB_DISCARDUNDOSTATE:
return S_OK;
default:
if( iVerb > 0 ) {
_p_instance->setVisible(TRUE);
- doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+ doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect, TRUE);
return OLEOBJ_S_INVALIDVERB;
}
return E_NOTIMPL;
}
};
-HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
+HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect, BOOL uiActivate)
{
RECT posRect;
RECT clipRect;
LPCRECT lprcClipRect = lprcPosRect;
- if( NULL != pActiveSite )
+ if( pActiveSite )
{
- // check if already activated
- if( _p_instance->isInPlaceActive() )
- {
- // just attempt to show object then
- if( _p_instance->getVisible() )
- pActiveSite->ShowObject();
- return S_OK;
- }
-
LPOLEINPLACESITE p_inPlaceSite;
+ IOleInPlaceSiteEx *p_inPlaceSiteEx;
+ LPOLEINPLACEFRAME p_inPlaceFrame;
+ LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
- if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
+ if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSiteEx, reinterpret_cast<void**>(&p_inPlaceSiteEx))) )
{
- if( S_OK != p_inPlaceSite->CanInPlaceActivate() )
- {
- return OLEOBJ_S_CANNOT_DOVERB_NOW;
- }
+ p_inPlaceSite = p_inPlaceSiteEx;
+ p_inPlaceSite->AddRef();
+ }
+ else if FAILED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, reinterpret_cast<void**>(&p_inPlaceSite)) )
+ {
+ p_inPlaceSite = p_inPlaceSiteEx = NULL;
+ }
- LPOLEINPLACEFRAME p_inPlaceFrame;
- LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
+ if( p_inPlaceSite )
+ {
OLEINPLACEFRAMEINFO oleFrameInfo;
oleFrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
{
lprcPosRect = &posRect;
lprcClipRect = &clipRect;
-
- if( NULL != p_inPlaceFrame )
- p_inPlaceFrame->Release();
- if( NULL != p_inPlaceUIWindow )
- p_inPlaceUIWindow->Release();
}
if( (NULL == hwndParent) && FAILED(p_inPlaceSite->GetWindow(&hwndParent)) )
{
p_inPlaceSite->Release();
+ if( p_inPlaceSiteEx )
+ p_inPlaceSiteEx->Release();
+ if( p_inPlaceFrame )
+ p_inPlaceFrame->Release();
+ if( p_inPlaceUIWindow )
+ p_inPlaceUIWindow->Release();
+
return OLEOBJ_S_INVALIDHWND;
}
}
lprcClipRect = &posRect;
}
- if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
+ // check if not already activated
+ if( ! _p_instance->isInPlaceActive() )
{
- if( NULL != p_inPlaceSite )
- p_inPlaceSite->Release();
- return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ if( ((NULL == p_inPlaceSite) || (S_OK == p_inPlaceSite->CanInPlaceActivate()))
+ && SUCCEEDED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
+ {
+ if( p_inPlaceSiteEx )
+ {
+ BOOL needsRedraw;
+ p_inPlaceSiteEx->OnInPlaceActivateEx(&needsRedraw, 0);
+ }
+ else if( p_inPlaceSite )
+ p_inPlaceSite->OnInPlaceActivate();
+ }
+ else
+ {
+ if( p_inPlaceSite )
+ {
+ p_inPlaceSite->Release();
+ if( p_inPlaceSiteEx )
+ p_inPlaceSiteEx->Release();
+ if( p_inPlaceFrame )
+ p_inPlaceFrame->Release();
+ if( p_inPlaceUIWindow )
+ p_inPlaceUIWindow->Release();
+ }
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ }
}
- if( NULL != p_inPlaceSite )
- {
- p_inPlaceSite->OnInPlaceActivate();
+ if( p_inPlaceSite )
p_inPlaceSite->OnPosRectChange(lprcPosRect);
- p_inPlaceSite->Release();
- }
-
- if( _p_instance->getVisible() )
- pActiveSite->ShowObject();
- if( NULL != lpMsg )
+ if( uiActivate )
{
- switch( lpMsg->message )
+ if( (NULL == p_inPlaceSiteEx) || (S_OK == p_inPlaceSiteEx->RequestUIActivate()) )
{
- case WM_LBUTTONDOWN:
- case WM_LBUTTONDBLCLK:
- doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
- break;
- default:
- break;
+ if( p_inPlaceSite)
+ {
+ p_inPlaceSite->OnUIActivate();
+
+ LPOLEINPLACEACTIVEOBJECT p_inPlaceActiveObject;
+ if( SUCCEEDED(QueryInterface(IID_IOleInPlaceActiveObject, reinterpret_cast<void**>(&p_inPlaceActiveObject))) )
+ {
+ if( p_inPlaceFrame )
+ p_inPlaceFrame->SetActiveObject(p_inPlaceActiveObject, NULL);
+ if( p_inPlaceUIWindow )
+ p_inPlaceUIWindow->SetActiveObject(p_inPlaceActiveObject, NULL);
+ p_inPlaceActiveObject->Release();
+ }
+ if( p_inPlaceFrame )
+ p_inPlaceFrame->RequestBorderSpace(NULL);
+
+ pActiveSite->ShowObject();
+ }
+ _p_instance->setFocus(TRUE);
}
}
- return S_OK;
- }
- return OLEOBJ_S_CANNOT_DOVERB_NOW;
-};
-HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
-{
- if( NULL != pActiveSite )
- {
- // check if already activated
- if( ! _p_instance->isInPlaceActive() )
- return OLE_E_NOT_INPLACEACTIVE;
-
- LPOLEINPLACESITE p_inPlaceSite;
-
- if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
+ if( p_inPlaceSite )
{
- p_inPlaceSite->OnUIActivate();
-
- if( NULL != lprcPosRect )
- {
- p_inPlaceSite->OnPosRectChange(lprcPosRect);
- }
p_inPlaceSite->Release();
+ if( p_inPlaceSiteEx )
+ p_inPlaceSiteEx->Release();
+ if( p_inPlaceFrame )
+ p_inPlaceFrame->Release();
+ if( p_inPlaceUIWindow )
+ p_inPlaceUIWindow->Release();
}
-
- pActiveSite->ShowObject();
- _p_instance->setVisible(TRUE);
- _p_instance->setFocus(TRUE);
-
return S_OK;
}
- return E_FAIL;
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
};
STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)
{
if( NULL == ppClientSite )
return E_POINTER;
-
+
if( NULL != _p_clientsite )
- _p_clientsite->AddRef();
+ _p_clientsite->AddRef();
*ppClientSite = _p_clientsite;
return S_OK;
{
if( NULL != _p_clientsite )
return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);
-
+
return E_UNEXPECTED;
};
if( NULL == pClsid )
return E_POINTER;
- *pClsid = _p_instance->getClassID();
+ *pClsid = _p_instance->getClassID();
return S_OK;
};
if( NULL == pSizel )
return E_POINTER;
-
if( dwDrawAspect & DVASPECT_CONTENT )
{
_p_instance->setExtent(*pSizel);
if( SUCCEEDED(p_inPlaceSite->GetWindow(&hwnd)) )
{
- // use HIMETRIC to pixel transform
+ // use HIMETRIC to pixel transform
RECT posRect = _p_instance->getPosRect();
HDC hDC = GetDC(hwnd);
posRect.right = (pSizel->cx*GetDeviceCaps(hDC, LOGPIXELSX)/2540L)+posRect.left;