]> git.sesse.net Git - vlc/blobdiff - activex/oleobject.cpp
* Update to the Danish translation by Jonas Larsen
[vlc] / activex / oleobject.cpp
index 217af46d44c311afd0abadffd538e9e71beda8c1..ec7d8aedbefbaa66ac04a8888642d9040c8c1d8e 100644 (file)
@@ -65,13 +65,7 @@ STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActi
         case OLEIVERB_SHOW:
         case OLEIVERB_OPEN:
         case OLEIVERB_INPLACEACTIVATE:
-            if( NULL == hwndParent )
-                return OLEOBJ_S_INVALIDHWND;
-
-            if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )
-                return S_OK;
-
-            return OLEOBJ_S_CANNOT_DOVERB_NOW;
+            return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
 
         case OLEIVERB_HIDE:
             _p_instance->setVisible(FALSE);
@@ -84,13 +78,7 @@ STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActi
             return S_OK;
 
         default:
-            if( NULL == hwndParent )
-                return OLEOBJ_S_INVALIDHWND;
-
-            if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )
-                return OLEOBJ_S_INVALIDVERB;
-
-            return OLEOBJ_S_CANNOT_DOVERB_NOW;
+            return OLEOBJ_S_INVALIDVERB;
     }
 };
 
@@ -116,7 +104,7 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite
         if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
         {
             if( S_OK != p_inPlaceSite->CanInPlaceActivate() )
-                return E_FAIL;
+                return OLEOBJ_S_CANNOT_DOVERB_NOW;
 
             LPOLEINPLACEFRAME p_inPlaceFrame;
             LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
@@ -132,10 +120,22 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite
                 if( NULL != p_inPlaceUIWindow )
                     p_inPlaceUIWindow->Release();
             }
+
+            if( (NULL == hwndParent) && FAILED(p_inPlaceSite->GetWindow(&hwndParent)) )
+            {
+                p_inPlaceSite->Release();
+                return OLEOBJ_S_INVALIDHWND;
+            }
         }
+        else if( NULL == hwndParent )
+            return OLEOBJ_S_INVALIDHWND;
 
         if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
-            return E_FAIL;
+        {
+            if( NULL != p_inPlaceSite )
+                p_inPlaceSite->Release();
+            return OLEOBJ_S_CANNOT_DOVERB_NOW;
+        }
 
         if( NULL != p_inPlaceSite )
             p_inPlaceSite->OnPosRectChange(lprcPosRect);
@@ -163,7 +163,7 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite
         }
         return S_OK;
     }
-    return E_FAIL;
+    return OLEOBJ_S_CANNOT_DOVERB_NOW;
 };
 
 HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
@@ -214,7 +214,7 @@ STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
     if( NULL != _p_clientsite )
         _p_clientsite->AddRef(); 
 
-    *ppClientSite= _p_clientsite;
+    *ppClientSite = _p_clientsite;
     return S_OK;
 };
 
@@ -225,6 +225,16 @@ STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDa
 
 STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
 {
+    if( NULL == pSizel )
+        return E_POINTER;
+
+    if( dwDrawAspect & DVASPECT_CONTENT )
+    {
+        *pSizel = _p_instance->getExtent();
+        return S_OK;
+    }
+    pSizel->cx= 0L;
+    pSizel->cy= 0L;
     return E_NOTIMPL;
 };
 
@@ -302,8 +312,8 @@ STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
             VariantClear(&v);
         }
     }
-
     _p_clientsite = pClientSite;
+    _p_instance->onClientSiteChanged(pClientSite);
     return S_OK;
 };
 
@@ -314,6 +324,48 @@ STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal)
 
 STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
 {
+    if( NULL == pSizel )
+        return E_POINTER;
+
+    if( dwDrawAspect & DVASPECT_CONTENT )
+    {
+        _p_instance->setExtent(*pSizel);
+
+        if( _p_instance->isInPlaceActive() )
+        {
+            LPOLEINPLACESITE p_inPlaceSite;
+
+            if( SUCCEEDED(_p_clientsite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
+            {
+                LPOLECONTROLSITE p_controlSite;
+                RECT posRect = _p_instance->getPosRect();
+
+                if( SUCCEEDED(_p_clientsite->QueryInterface(IID_IOleControlSite, (void**)&p_controlSite)) )
+                {
+                    // use HIMETRIC to container transform
+                    POINTL extent = { pSizel->cx, pSizel->cy };
+                    POINTF container;
+                    if( SUCCEEDED(p_controlSite->TransformCoords(&extent,
+                                    &container, XFORMCOORDS_SIZE|XFORMCOORDS_HIMETRICTOCONTAINER)) )
+                    {
+                        posRect.right  = ((LONG)container.x)+posRect.left;
+                        posRect.bottom = ((LONG)container.y)+posRect.top;
+                    }
+                    p_controlSite->Release();
+                }
+                else {
+                    // use HIMETRIC to display transform 
+                    HDC hDC = CreateDevDC(NULL);
+                    posRect.right = (pSizel->cx*GetDeviceCaps(hDC, LOGPIXELSX)/2540L)+posRect.left;
+                    posRect.bottom = (pSizel->cy*GetDeviceCaps(hDC, LOGPIXELSY)/2540L)+posRect.top;
+                    DeleteDC(hDC);
+                }
+                p_inPlaceSite->OnPosRectChange(&posRect);
+                p_inPlaceSite->Release();
+            }
+        }
+        return S_OK;
+    }
     return E_NOTIMPL;
 };