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 == pSizel )
return E_POINTER;
-
if( dwDrawAspect & DVASPECT_CONTENT )
{
_p_instance->setExtent(*pSizel);