1f78e906fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3f78e906fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4f78e906fSAndrew Rist * or more contributor license agreements. See the NOTICE file
5f78e906fSAndrew Rist * distributed with this work for additional information
6f78e906fSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7f78e906fSAndrew Rist * to you under the Apache License, Version 2.0 (the
8f78e906fSAndrew Rist * "License"); you may not use this file except in compliance
9f78e906fSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11f78e906fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13f78e906fSAndrew Rist * Unless required by applicable law or agreed to in writing,
14f78e906fSAndrew Rist * software distributed under the License is distributed on an
15f78e906fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f78e906fSAndrew Rist * KIND, either express or implied. See the License for the
17f78e906fSAndrew Rist * specific language governing permissions and limitations
18f78e906fSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20f78e906fSAndrew Rist *************************************************************/
21f78e906fSAndrew Rist
22cdf0e10cSrcweir #include "embeddoc.hxx"
23cdf0e10cSrcweir #include <osl/diagnose.h>
24cdf0e10cSrcweir #include <com/sun/star/frame/XController.hpp>
25cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
26cdf0e10cSrcweir
27cdf0e10cSrcweir using namespace ::com::sun::star;
28cdf0e10cSrcweir
29cdf0e10cSrcweir extern ::rtl::OUString getFilterNameFromGUID_Impl( GUID* );
30cdf0e10cSrcweir
31cdf0e10cSrcweir //-------------------------------------------------------------------------------
32cdf0e10cSrcweir // IOleObject
33cdf0e10cSrcweir
SetClientSite(IOleClientSite * pSite)34cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetClientSite( IOleClientSite* pSite )
35cdf0e10cSrcweir {
36cdf0e10cSrcweir m_pClientSite = pSite;
37cdf0e10cSrcweir return S_OK;
38cdf0e10cSrcweir }
39cdf0e10cSrcweir
GetClientSite(IOleClientSite ** pSite)40cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetClientSite( IOleClientSite** pSite )
41cdf0e10cSrcweir {
42cdf0e10cSrcweir *pSite = m_pClientSite;
43cdf0e10cSrcweir return S_OK;
44cdf0e10cSrcweir }
45cdf0e10cSrcweir
SetHostNames(LPCOLESTR szContainerApp,LPCOLESTR szContainerObj)46cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetHostNames( LPCOLESTR szContainerApp, LPCOLESTR szContainerObj )
47cdf0e10cSrcweir {
48cdf0e10cSrcweir // the code should be ignored for links
49cdf0e10cSrcweir if ( !m_aFileName.getLength() )
50cdf0e10cSrcweir {
51cdf0e10cSrcweir m_pDocHolder->setTitle(
52cdf0e10cSrcweir rtl::OUString(
53cdf0e10cSrcweir (sal_Unicode*)szContainerObj));
54cdf0e10cSrcweir m_pDocHolder->setContainerName(
55cdf0e10cSrcweir rtl::OUString(
56cdf0e10cSrcweir (sal_Unicode*)szContainerApp));
57cdf0e10cSrcweir }
58cdf0e10cSrcweir
59cdf0e10cSrcweir return S_OK;
60cdf0e10cSrcweir }
61cdf0e10cSrcweir
Close(DWORD dwSaveOption)62cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Close( DWORD dwSaveOption )
63cdf0e10cSrcweir {
64cdf0e10cSrcweir HRESULT hr = S_OK;
65cdf0e10cSrcweir
66cdf0e10cSrcweir if ( m_pDocHolder->HasFrame() )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir if ( dwSaveOption == 2 && m_aFileName.getLength() )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir // ask the user about saving
71cdf0e10cSrcweir if ( m_pDocHolder->ExecuteSuspendCloseFrame() )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir m_pDocHolder->CloseDocument();
74cdf0e10cSrcweir return S_OK;
75cdf0e10cSrcweir }
76cdf0e10cSrcweir else
77cdf0e10cSrcweir return OLE_E_PROMPTSAVECANCELLED;
78cdf0e10cSrcweir }
79cdf0e10cSrcweir
80cdf0e10cSrcweir if ( dwSaveOption != 1 )
81cdf0e10cSrcweir hr = SaveObject(); // ADVF_DATAONSTOP);
82cdf0e10cSrcweir
83cdf0e10cSrcweir m_pDocHolder->CloseFrame();
84cdf0e10cSrcweir OLENotifyDeactivation();
85cdf0e10cSrcweir }
86cdf0e10cSrcweir
87cdf0e10cSrcweir m_pDocHolder->FreeOffice();
88cdf0e10cSrcweir m_pDocHolder->CloseDocument();
89cdf0e10cSrcweir
90cdf0e10cSrcweir OLENotifyClosing();
91cdf0e10cSrcweir
92cdf0e10cSrcweir return hr;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir
95cdf0e10cSrcweir
OLENotifyClosing()96cdf0e10cSrcweir HRESULT EmbedDocument_Impl::OLENotifyClosing()
97cdf0e10cSrcweir {
98cdf0e10cSrcweir HRESULT hr = S_OK;
99cdf0e10cSrcweir
100cdf0e10cSrcweir AdviseSinkHashMap aAHM(m_aAdviseHashMap);
101cdf0e10cSrcweir
102cdf0e10cSrcweir for ( AdviseSinkHashMapIterator iAdvise = aAHM.begin();
103cdf0e10cSrcweir iAdvise != aAHM.end(); iAdvise++ )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir if ( iAdvise->second )
106cdf0e10cSrcweir iAdvise->second->OnClose();
107cdf0e10cSrcweir }
108cdf0e10cSrcweir
109cdf0e10cSrcweir return hr;
110cdf0e10cSrcweir
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
SetMoniker(DWORD,IMoniker *)113cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetMoniker( DWORD /*dwWhichMoniker*/, IMoniker * /*pmk*/ )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir return E_NOTIMPL;
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
GetMoniker(DWORD,DWORD,IMoniker **)118cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetMoniker( DWORD /*dwAssign*/, DWORD /*dwWhichMoniker*/, IMoniker ** /*ppmk*/ )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir return E_NOTIMPL;
121cdf0e10cSrcweir }
122cdf0e10cSrcweir
InitFromData(IDataObject *,BOOL,DWORD)123cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::InitFromData( IDataObject * /*pDataObject*/, BOOL /*fCreation*/, DWORD /*dwReserved*/ )
124cdf0e10cSrcweir {
125cdf0e10cSrcweir return E_NOTIMPL;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
GetClipboardData(DWORD,IDataObject **)128cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetClipboardData( DWORD /*dwReserved*/, IDataObject ** /*ppDataObject*/ )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir return E_NOTIMPL;
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
133cdf0e10cSrcweir /**
134cdf0e10cSrcweir * Well, this is a not so very inefficient way to deliver
135cdf0e10cSrcweir *
136cdf0e10cSrcweir */
137cdf0e10cSrcweir
DoVerb(LONG iVerb,LPMSG,IOleClientSite * pActiveSite,LONG,HWND,LPCRECT)138cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::DoVerb(
139cdf0e10cSrcweir LONG iVerb,
140cdf0e10cSrcweir LPMSG,
141cdf0e10cSrcweir IOleClientSite *pActiveSite,
142cdf0e10cSrcweir LONG,
143cdf0e10cSrcweir HWND,
144cdf0e10cSrcweir LPCRECT )
145cdf0e10cSrcweir {
146cdf0e10cSrcweir // no locking is used since the OLE must use the same thread always
147cdf0e10cSrcweir if ( m_bIsInVerbHandling )
148cdf0e10cSrcweir return OLEOBJ_S_CANNOT_DOVERB_NOW;
149cdf0e10cSrcweir
150cdf0e10cSrcweir // an object can not handle any Verbs in Hands off mode
151cdf0e10cSrcweir if ( m_pMasterStorage == NULL || m_pOwnStream == NULL )
152cdf0e10cSrcweir return OLE_E_CANT_BINDTOSOURCE;
153cdf0e10cSrcweir
154cdf0e10cSrcweir
155cdf0e10cSrcweir BooleanGuard_Impl aGuard( m_bIsInVerbHandling );
156cdf0e10cSrcweir
157cdf0e10cSrcweir if ( iVerb == OLEIVERB_PRIMARY )
158cdf0e10cSrcweir {
159cdf0e10cSrcweir if ( m_aFileName.getLength() )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir // that should be a link
162cdf0e10cSrcweir iVerb = OLEIVERB_OPEN;
163cdf0e10cSrcweir }
164cdf0e10cSrcweir else
165cdf0e10cSrcweir iVerb = OLEIVERB_SHOW;
166cdf0e10cSrcweir }
167cdf0e10cSrcweir
168cdf0e10cSrcweir try
169cdf0e10cSrcweir {
170cdf0e10cSrcweir switch(iVerb) {
171cdf0e10cSrcweir case OLEIVERB_DISCARDUNDOSTATE:
172cdf0e10cSrcweir // free any undostate?
173cdf0e10cSrcweir break;
174cdf0e10cSrcweir case OLEIVERB_INPLACEACTIVATE:
175cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document for inplace activation");
176cdf0e10cSrcweir
177cdf0e10cSrcweir return m_pDocHolder->InPlaceActivate(pActiveSite,FALSE);
178cdf0e10cSrcweir break;
179cdf0e10cSrcweir case OLEIVERB_UIACTIVATE:
180cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document for inplace activation");
181cdf0e10cSrcweir
182cdf0e10cSrcweir return m_pDocHolder->InPlaceActivate(pActiveSite,TRUE);
183cdf0e10cSrcweir break;
184cdf0e10cSrcweir case OLEIVERB_PRIMARY:
185cdf0e10cSrcweir case OLEIVERB_SHOW:
186cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document for inplace activation");
187cdf0e10cSrcweir
188cdf0e10cSrcweir if(m_pDocHolder->isActive())
189cdf0e10cSrcweir return NOERROR; //Already active
190cdf0e10cSrcweir
191cdf0e10cSrcweir if(SUCCEEDED(
192cdf0e10cSrcweir m_pDocHolder->InPlaceActivate(
193cdf0e10cSrcweir pActiveSite,TRUE)))
194cdf0e10cSrcweir return NOERROR;
195cdf0e10cSrcweir
196*88c764bfSmseidel // intended fall through
197cdf0e10cSrcweir case OLEIVERB_OPEN:
198cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document to open");
199cdf0e10cSrcweir
20007a3d7f1SPedro Giffuni // the commented code could be useful in case
201cdf0e10cSrcweir // outer window would be resized depending from inner one
202cdf0e10cSrcweir // RECTL aEmbArea;
203cdf0e10cSrcweir // m_pDocHolder->GetVisArea( &aEmbArea );
204cdf0e10cSrcweir // m_pDocHolder->show();
205cdf0e10cSrcweir // m_pDocHolder->SetVisArea( &aEmbArea );
206cdf0e10cSrcweir
207cdf0e10cSrcweir if(m_pDocHolder->isActive())
208cdf0e10cSrcweir {
209cdf0e10cSrcweir m_pDocHolder->InPlaceDeactivate();
210cdf0e10cSrcweir m_pDocHolder->DisableInplaceActivation(true);
211cdf0e10cSrcweir }
212cdf0e10cSrcweir
213cdf0e10cSrcweir SIZEL aEmbSize;
214cdf0e10cSrcweir m_pDocHolder->GetExtent( &aEmbSize );
215cdf0e10cSrcweir m_pDocHolder->show();
216cdf0e10cSrcweir m_pDocHolder->resizeWin( aEmbSize );
217cdf0e10cSrcweir
218cdf0e10cSrcweir if ( m_pClientSite )
219cdf0e10cSrcweir m_pClientSite->OnShowWindow( TRUE );
220cdf0e10cSrcweir
221cdf0e10cSrcweir notify();
222cdf0e10cSrcweir break;
223cdf0e10cSrcweir case OLEIVERB_HIDE:
224cdf0e10cSrcweir OSL_ENSURE(m_pDocHolder,"no document to hide");
225cdf0e10cSrcweir
226cdf0e10cSrcweir if(m_pDocHolder->isActive())
227cdf0e10cSrcweir m_pDocHolder->InPlaceDeactivate();
228cdf0e10cSrcweir else {
229cdf0e10cSrcweir m_pDocHolder->hide();
230cdf0e10cSrcweir
231cdf0e10cSrcweir if( m_pClientSite )
232cdf0e10cSrcweir m_pClientSite->OnShowWindow(FALSE);
233cdf0e10cSrcweir }
234cdf0e10cSrcweir break;
235cdf0e10cSrcweir default:
236cdf0e10cSrcweir break;
237cdf0e10cSrcweir }
238cdf0e10cSrcweir }
239cdf0e10cSrcweir catch( uno::Exception& )
240cdf0e10cSrcweir {
241cdf0e10cSrcweir return OLEOBJ_S_CANNOT_DOVERB_NOW;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
244cdf0e10cSrcweir return NOERROR;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir
247cdf0e10cSrcweir
248cdf0e10cSrcweir
EnumVerbs(IEnumOLEVERB **)249cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::EnumVerbs( IEnumOLEVERB ** /*ppEnumOleVerb*/ )
250cdf0e10cSrcweir {
251cdf0e10cSrcweir return OLE_S_USEREG;
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
Update()254cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Update()
255cdf0e10cSrcweir {
256cdf0e10cSrcweir return S_OK;
257cdf0e10cSrcweir // HRESULT hr = CACHE_E_NOCACHE_UPDATED;
258cdf0e10cSrcweir // return hr;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir
IsUpToDate()261cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::IsUpToDate()
262cdf0e10cSrcweir {
263cdf0e10cSrcweir return S_OK;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir
GetUserClassID(CLSID * pClsid)266cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetUserClassID( CLSID *pClsid )
267cdf0e10cSrcweir {
268cdf0e10cSrcweir return GetClassID( pClsid );
269cdf0e10cSrcweir }
270cdf0e10cSrcweir
GetUserType(DWORD,LPOLESTR *)271cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetUserType( DWORD /*dwFormOfTypeUe*/, LPOLESTR * /*pszUserType*/ )
272cdf0e10cSrcweir {
273cdf0e10cSrcweir return OLE_S_USEREG;
274cdf0e10cSrcweir }
275cdf0e10cSrcweir
SetExtent(DWORD,SIZEL * psizel)276cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetExtent( DWORD /*dwDrawAspect*/, SIZEL *psizel )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir if ( !psizel )
279cdf0e10cSrcweir return E_FAIL;
280cdf0e10cSrcweir
281cdf0e10cSrcweir m_pDocHolder->SetExtent( psizel );
282cdf0e10cSrcweir
283cdf0e10cSrcweir return S_OK;
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
GetExtent(DWORD,SIZEL * psizel)286cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetExtent( DWORD /*dwDrawAspect*/, SIZEL * psizel )
287cdf0e10cSrcweir {
288cdf0e10cSrcweir if ( !psizel )
289cdf0e10cSrcweir return E_INVALIDARG;
290cdf0e10cSrcweir
291cdf0e10cSrcweir if ( FAILED( m_pDocHolder->GetExtent( psizel ) ) )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir // return default values
294cdf0e10cSrcweir psizel->cx = 500;
295cdf0e10cSrcweir psizel->cy = 500;
296cdf0e10cSrcweir }
297cdf0e10cSrcweir
298cdf0e10cSrcweir return S_OK;
299cdf0e10cSrcweir }
300cdf0e10cSrcweir
Advise(IAdviseSink * pAdvSink,DWORD * pdwConnection)301cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Advise( IAdviseSink *pAdvSink, DWORD *pdwConnection )
302cdf0e10cSrcweir {
303cdf0e10cSrcweir if ( m_nAdviseNum == 0xFFFFFFFF )
304cdf0e10cSrcweir return E_OUTOFMEMORY;
305cdf0e10cSrcweir
306cdf0e10cSrcweir pAdvSink->AddRef();
307cdf0e10cSrcweir m_aAdviseHashMap.insert( ::std::pair< DWORD, IAdviseSink* >( m_nAdviseNum, pAdvSink ) );
308cdf0e10cSrcweir *pdwConnection = m_nAdviseNum++;
309cdf0e10cSrcweir
310cdf0e10cSrcweir return S_OK;
311cdf0e10cSrcweir }
312cdf0e10cSrcweir
Unadvise(DWORD dwConnection)313cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Unadvise( DWORD dwConnection )
314cdf0e10cSrcweir {
315cdf0e10cSrcweir AdviseSinkHashMapIterator iAdvise = m_aAdviseHashMap.find( dwConnection );
316cdf0e10cSrcweir if ( iAdvise != m_aAdviseHashMap.end() )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir iAdvise->second->Release();
319cdf0e10cSrcweir m_aAdviseHashMap.erase( iAdvise );
320cdf0e10cSrcweir }
321cdf0e10cSrcweir else
322cdf0e10cSrcweir return OLE_E_NOCONNECTION;
323cdf0e10cSrcweir
324cdf0e10cSrcweir return S_OK;
325cdf0e10cSrcweir }
326cdf0e10cSrcweir
EnumAdvise(IEnumSTATDATA **)327cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::EnumAdvise( IEnumSTATDATA ** /*ppenumAdvise*/ )
328cdf0e10cSrcweir {
329cdf0e10cSrcweir return E_NOTIMPL;
330cdf0e10cSrcweir }
331cdf0e10cSrcweir
GetMiscStatus(DWORD,DWORD *)332cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetMiscStatus( DWORD /*dwAspect*/, DWORD * /*pdwStatus*/ )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir return OLE_S_USEREG;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
SetColorScheme(LOGPALETTE *)337cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::SetColorScheme( LOGPALETTE * /*pLogpal*/ )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir return E_NOTIMPL;
340cdf0e10cSrcweir }
341cdf0e10cSrcweir
342cdf0e10cSrcweir //-------------------------------------------------------------------------------
343cdf0e10cSrcweir // IDispatch
344cdf0e10cSrcweir
GetTypeInfoCount(unsigned int FAR * pctinfo)345cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetTypeInfoCount( unsigned int FAR* pctinfo )
346cdf0e10cSrcweir {
347cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() )
348cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->GetTypeInfoCount( pctinfo );
349cdf0e10cSrcweir
350cdf0e10cSrcweir return E_NOTIMPL;
351cdf0e10cSrcweir }
352cdf0e10cSrcweir
GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR * FAR * ppTInfo)353cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetTypeInfo( unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo )
354cdf0e10cSrcweir {
355cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() )
356cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->GetTypeInfo( iTInfo, lcid, ppTInfo );
357cdf0e10cSrcweir
358cdf0e10cSrcweir return DISP_E_BADINDEX; // the only error that can be returned
359cdf0e10cSrcweir }
360cdf0e10cSrcweir
GetIDsOfNames(REFIID riid,OLECHAR FAR * FAR * rgszNames,unsigned int cNames,LCID lcid,DISPID FAR * rgDispId)361cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::GetIDsOfNames( REFIID riid,
362cdf0e10cSrcweir OLECHAR FAR* FAR* rgszNames,
363cdf0e10cSrcweir unsigned int cNames,
364cdf0e10cSrcweir LCID lcid,
365cdf0e10cSrcweir DISPID FAR* rgDispId )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() )
368cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->GetIDsOfNames( riid, rgszNames, cNames, lcid, rgDispId );
369cdf0e10cSrcweir
370cdf0e10cSrcweir for ( unsigned int ind = 0; ind < cNames; ind++ )
371cdf0e10cSrcweir rgDispId[ind] = DISPID_UNKNOWN;
372cdf0e10cSrcweir
373cdf0e10cSrcweir return DISP_E_UNKNOWNNAME;
374cdf0e10cSrcweir }
375cdf0e10cSrcweir
Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR * pDispParams,VARIANT FAR * pVarResult,EXCEPINFO FAR * pExcepInfo,unsigned int FAR * puArgErr)376cdf0e10cSrcweir STDMETHODIMP EmbedDocument_Impl::Invoke( DISPID dispIdMember,
377cdf0e10cSrcweir REFIID riid,
378cdf0e10cSrcweir LCID lcid,
379cdf0e10cSrcweir WORD wFlags,
380cdf0e10cSrcweir DISPPARAMS FAR* pDispParams,
381cdf0e10cSrcweir VARIANT FAR* pVarResult,
382cdf0e10cSrcweir EXCEPINFO FAR* pExcepInfo,
383cdf0e10cSrcweir unsigned int FAR* puArgErr )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir if ( m_pDocHolder->GetIDispatch() )
386cdf0e10cSrcweir return m_pDocHolder->GetIDispatch()->Invoke( dispIdMember,
387cdf0e10cSrcweir riid,
388cdf0e10cSrcweir lcid,
389cdf0e10cSrcweir wFlags,
390cdf0e10cSrcweir pDispParams,
391cdf0e10cSrcweir pVarResult,
392cdf0e10cSrcweir pExcepInfo,
393cdf0e10cSrcweir puArgErr );
394cdf0e10cSrcweir
395cdf0e10cSrcweir return DISP_E_MEMBERNOTFOUND;
396cdf0e10cSrcweir }
397cdf0e10cSrcweir
398cdf0e10cSrcweir //-------------------------------------------------------------------------------
399cdf0e10cSrcweir // IExternalConnection
400cdf0e10cSrcweir
AddConnection(DWORD,DWORD)401cdf0e10cSrcweir DWORD STDMETHODCALLTYPE EmbedDocument_Impl::AddConnection( DWORD , DWORD )
402cdf0e10cSrcweir {
403cdf0e10cSrcweir return AddRef();
404cdf0e10cSrcweir }
405cdf0e10cSrcweir
ReleaseConnection(DWORD,DWORD,BOOL)406cdf0e10cSrcweir DWORD STDMETHODCALLTYPE EmbedDocument_Impl::ReleaseConnection( DWORD , DWORD , BOOL )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir return Release();
409cdf0e10cSrcweir }
410cdf0e10cSrcweir
411cdf0e10cSrcweir // C++ - methods
412cdf0e10cSrcweir
SaveObject()413cdf0e10cSrcweir HRESULT EmbedDocument_Impl::SaveObject()
414cdf0e10cSrcweir {
415cdf0e10cSrcweir HRESULT hr = S_OK;
416cdf0e10cSrcweir
417cdf0e10cSrcweir if(m_pClientSite) {
418cdf0e10cSrcweir hr = m_pClientSite->SaveObject();
419cdf0e10cSrcweir
420cdf0e10cSrcweir for ( AdviseSinkHashMapIterator iAdvise =
421cdf0e10cSrcweir m_aAdviseHashMap.begin();
422cdf0e10cSrcweir iAdvise != m_aAdviseHashMap.end();
423cdf0e10cSrcweir iAdvise++ )
424cdf0e10cSrcweir if ( iAdvise->second )
425cdf0e10cSrcweir iAdvise->second->OnSave( );
426cdf0e10cSrcweir }
427cdf0e10cSrcweir else if ( m_aFileName.getLength() && IsDirty() == S_OK )
428cdf0e10cSrcweir {
429cdf0e10cSrcweir ::rtl::OUString aPreservFileName = m_aFileName;
430cdf0e10cSrcweir
431cdf0e10cSrcweir // in case of links the containers does not provide client site sometimes
432cdf0e10cSrcweir hr = Save( (LPCOLESTR)NULL, FALSE ); // triggers saving to the link location
433cdf0e10cSrcweir SaveCompleted( (LPCOLESTR)aPreservFileName.getStr() );
434cdf0e10cSrcweir }
435cdf0e10cSrcweir
436cdf0e10cSrcweir notify( false );
437cdf0e10cSrcweir
438cdf0e10cSrcweir return hr;
439cdf0e10cSrcweir }
440cdf0e10cSrcweir
441cdf0e10cSrcweir
ShowObject()442cdf0e10cSrcweir HRESULT EmbedDocument_Impl::ShowObject()
443cdf0e10cSrcweir {
444cdf0e10cSrcweir HRESULT hr = S_OK;
445cdf0e10cSrcweir
446cdf0e10cSrcweir if(m_pClientSite)
447cdf0e10cSrcweir hr = m_pClientSite->ShowObject();
448cdf0e10cSrcweir
449cdf0e10cSrcweir return hr;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir
452cdf0e10cSrcweir
notify(bool bDataChanged)453cdf0e10cSrcweir void EmbedDocument_Impl::notify( bool bDataChanged )
454cdf0e10cSrcweir {
455cdf0e10cSrcweir for ( AdviseSinkHashMapIterator iAdvise =
456cdf0e10cSrcweir m_aAdviseHashMap.begin();
457cdf0e10cSrcweir iAdvise != m_aAdviseHashMap.end();
458cdf0e10cSrcweir iAdvise++ )
459cdf0e10cSrcweir if ( iAdvise->second )
460cdf0e10cSrcweir iAdvise->second->OnViewChange( DVASPECT_CONTENT, -1 );
461cdf0e10cSrcweir
462cdf0e10cSrcweir if ( m_pDAdviseHolder && bDataChanged )
463cdf0e10cSrcweir m_pDAdviseHolder->SendOnDataChange( (IDataObject*)this, 0, 0 );
464cdf0e10cSrcweir }
465cdf0e10cSrcweir
Deactivate()466cdf0e10cSrcweir void EmbedDocument_Impl::Deactivate()
467cdf0e10cSrcweir {
468cdf0e10cSrcweir HRESULT hr = S_OK;
469cdf0e10cSrcweir
470cdf0e10cSrcweir if ( m_pDocHolder->HasFrame() )
471cdf0e10cSrcweir {
472cdf0e10cSrcweir hr = SaveObject();
473cdf0e10cSrcweir m_pDocHolder->CloseFrame();
474cdf0e10cSrcweir OLENotifyDeactivation();
475cdf0e10cSrcweir }
476cdf0e10cSrcweir }
477cdf0e10cSrcweir
OLENotifyDeactivation()478cdf0e10cSrcweir HRESULT EmbedDocument_Impl::OLENotifyDeactivation()
479cdf0e10cSrcweir {
480cdf0e10cSrcweir HRESULT hr = S_OK;
481cdf0e10cSrcweir
482cdf0e10cSrcweir if ( m_pClientSite )
483cdf0e10cSrcweir hr = m_pClientSite->OnShowWindow( FALSE );
484cdf0e10cSrcweir
485cdf0e10cSrcweir return hr;
486cdf0e10cSrcweir
487cdf0e10cSrcweir }
488cdf0e10cSrcweir
489cdf0e10cSrcweir // Fix strange warnings about some
490cdf0e10cSrcweir // ATL::CAxHostWindow::QueryInterface|AddRef|Releae functions.
491cdf0e10cSrcweir // warning C4505: 'xxx' : unreferenced local function has been removed
492cdf0e10cSrcweir #if defined(_MSC_VER)
493cdf0e10cSrcweir #pragma warning(disable: 4505)
494cdf0e10cSrcweir #endif
495*88c764bfSmseidel
496*88c764bfSmseidel /* vim: set noet sw=4 ts=4: */
497