1 /*****************************************************************************
\r
2 * oleobject.cpp: ActiveX control for VLC
\r
3 *****************************************************************************
\r
4 * Copyright (C) 2005 VideoLAN
\r
6 * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
\r
8 * This program is free software; you can redistribute it and/or modify
\r
9 * it under the terms of the GNU General Public License as published by
\r
10 * the Free Software Foundation; either version 2 of the License, or
\r
11 * (at your option) any later version.
\r
13 * This program is distributed in the hope that it will be useful,
\r
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
16 * GNU General Public License for more details.
\r
18 * You should have received a copy of the GNU General Public License
\r
19 * along with this program; if not, write to the Free Software
\r
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
\r
21 *****************************************************************************/
\r
24 #include "oleobject.h"
\r
30 using namespace std;
\r
32 VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :
\r
33 _p_clientsite(NULL), _p_instance(p_instance)
\r
35 CreateOleAdviseHolder(&_p_advise_holder);
\r
38 VLCOleObject::~VLCOleObject()
\r
40 _p_advise_holder->Release();
\r
41 SetClientSite(NULL);
\r
44 STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)
\r
46 return _p_advise_holder->Advise(pAdvSink, dwConnection);
\r
49 STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)
\r
51 _p_advise_holder->SendOnClose();
\r
52 OleFlushClipboard();
\r
53 return _p_instance->onClose(dwSaveOption);
\r
56 STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActiveSite,
\r
57 LONG lIndex, HWND hwndParent, LPCRECT lprcPosRect)
\r
64 case OLEIVERB_PRIMARY:
\r
67 case OLEIVERB_INPLACEACTIVATE:
\r
68 if( NULL == hwndParent )
\r
69 return OLEOBJ_S_INVALIDHWND;
\r
71 if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )
\r
74 return OLEOBJ_S_CANNOT_DOVERB_NOW;
\r
77 _p_instance->setVisible(FALSE);
\r
80 case OLEIVERB_UIACTIVATE:
\r
81 return doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
\r
83 case OLEIVERB_DISCARDUNDOSTATE:
\r
87 if( NULL == hwndParent )
\r
88 return OLEOBJ_S_INVALIDHWND;
\r
90 if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )
\r
91 return OLEOBJ_S_INVALIDVERB;
\r
93 return OLEOBJ_S_CANNOT_DOVERB_NOW;
\r
97 HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
\r
101 LPCRECT lprcClipRect = lprcPosRect;
\r
103 if( NULL != pActiveSite )
\r
105 // check if already activated
\r
106 if( _p_instance->isInPlaceActive() )
\r
108 // just attempt to show object then
\r
109 pActiveSite->ShowObject();
\r
110 _p_instance->setVisible(TRUE);
\r
114 LPOLEINPLACESITE p_inPlaceSite;
\r
116 if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
\r
118 if( S_OK != p_inPlaceSite->CanInPlaceActivate() )
\r
121 LPOLEINPLACEFRAME p_inPlaceFrame;
\r
122 LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
\r
123 OLEINPLACEFRAMEINFO oleFrameInfo;
\r
125 if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )
\r
127 lprcPosRect = &posRect;
\r
128 lprcClipRect = &clipRect;
\r
130 if( NULL != p_inPlaceFrame )
\r
131 p_inPlaceFrame->Release();
\r
132 if( NULL != p_inPlaceUIWindow )
\r
133 p_inPlaceUIWindow->Release();
\r
137 if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
\r
140 if( NULL != p_inPlaceSite )
\r
141 p_inPlaceSite->OnPosRectChange(lprcPosRect);
\r
143 pActiveSite->ShowObject();
\r
144 _p_instance->setVisible(TRUE);
\r
146 if( NULL != p_inPlaceSite )
\r
148 p_inPlaceSite->OnInPlaceActivate();
\r
149 p_inPlaceSite->Release();
\r
152 if( NULL != lpMsg )
\r
154 switch( lpMsg->message )
\r
156 case WM_LBUTTONDOWN:
\r
157 case WM_LBUTTONDBLCLK:
\r
158 doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
\r
169 HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
\r
171 if( NULL != pActiveSite )
\r
173 // check if already activated
\r
174 if( ! _p_instance->isInPlaceActive() )
\r
175 return OLE_E_NOT_INPLACEACTIVE;
\r
177 LPOLEINPLACESITE p_inPlaceSite;
\r
179 if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
\r
181 p_inPlaceSite->OnUIActivate();
\r
183 if( NULL != lprcPosRect )
\r
185 p_inPlaceSite->OnPosRectChange(lprcPosRect);
\r
187 p_inPlaceSite->Release();
\r
190 pActiveSite->ShowObject();
\r
191 _p_instance->setVisible(TRUE);
\r
192 _p_instance->setFocus(TRUE);
\r
199 STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)
\r
201 return _p_advise_holder->EnumAdvise(ppEnumAdvise);
\r
204 STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)
\r
206 return OLE_S_USEREG;
\r
209 STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
\r
211 if( NULL == ppClientSite )
\r
214 if( NULL != _p_clientsite )
\r
215 _p_clientsite->AddRef();
\r
217 *ppClientSite= _p_clientsite;
\r
221 STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)
\r
226 STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
\r
231 STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)
\r
233 if( NULL != pdwStatus )
\r
238 case DVASPECT_CONTENT:
\r
239 *pdwStatus = OLEMISC_RECOMPOSEONRESIZE
\r
240 | OLEMISC_CANTLINKINSIDE
\r
241 | OLEMISC_INSIDEOUT
\r
242 | OLEMISC_ACTIVATEWHENVISIBLE
\r
243 | OLEMISC_SETCLIENTSITEFIRST;
\r
252 STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMoniker)
\r
254 if( NULL != _p_clientsite )
\r
255 return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);
\r
257 return E_UNEXPECTED;
\r
260 STDMETHODIMP VLCOleObject::GetUserClassID(LPCLSID pClsid)
\r
262 if( NULL == pClsid )
\r
265 pClsid = const_cast<LPCLSID>(&_p_instance->getClassID());
\r
269 STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)
\r
271 return OLE_S_USEREG;
\r
274 STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)
\r
279 STDMETHODIMP VLCOleObject::IsUpToDate(void)
\r
284 STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
\r
286 if( NULL != _p_clientsite )
\r
287 _p_clientsite->Release();
\r
289 if( NULL != pClientSite )
\r
291 pClientSite->AddRef();
\r
294 ** retrieve container ambient properties
\r
299 if( SUCCEEDED(GetObjectProperty(pClientSite, DISPID_AMBIENT_CODEPAGE, v)) )
\r
301 _p_instance->setCodePage(V_I4(&v));
\r
306 _p_clientsite = pClientSite;
\r
310 STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal)
\r
315 STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
\r
320 STDMETHODIMP VLCOleObject::SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)
\r
325 STDMETHODIMP VLCOleObject::SetMoniker(DWORD dwWhichMoniker, LPMONIKER pMoniker)
\r
327 return _p_advise_holder->SendOnRename(pMoniker);
\r
330 STDMETHODIMP VLCOleObject::Unadvise(DWORD dwConnection)
\r
332 return _p_advise_holder->Unadvise(dwConnection);
\r
335 STDMETHODIMP VLCOleObject::Update(void)
\r