1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26
27 #include <stdio.h>
28
29 #include <sfx2/viewfrm.hxx>
30 #include <com/sun/star/document/MacroExecMode.hpp>
31 #include <com/sun/star/frame/XLoadable.hpp>
32 #include <com/sun/star/frame/XLayoutManager.hpp>
33 #include <com/sun/star/frame/XComponentLoader.hpp>
34
35 #include <toolkit/helper/vclunohelper.hxx>
36 #include <vcl/splitwin.hxx>
37 #include <unotools/moduleoptions.hxx>
38 #include <svl/intitem.hxx>
39 #include <svl/visitem.hxx>
40 #include <svl/stritem.hxx>
41 #include <svl/eitem.hxx>
42 #include <svl/slstitm.hxx>
43 #include <svl/whiter.hxx>
44 #include <svl/undo.hxx>
45 #include <vcl/msgbox.hxx>
46 #include <svtools/sfxecode.hxx>
47 #include <svtools/ehdl.hxx>
48 #include <tools/diagnose_ex.h>
49 #include <com/sun/star/container/XIndexAccess.hpp>
50 #include <com/sun/star/frame/XFramesSupplier.hpp>
51 #include <com/sun/star/frame/FrameSearchFlag.hpp>
52 #include <com/sun/star/frame/XFrame.hpp>
53 #include <com/sun/star/frame/XFrames.hpp>
54 #include <com/sun/star/frame/XFramesSupplier.hpp>
55 #include <com/sun/star/awt/XWindow.hpp>
56 #include <com/sun/star/frame/XController.hpp>
57 #include <com/sun/star/frame/XModel2.hpp>
58 #include <com/sun/star/util/XURLTransformer.hpp>
59 #include <com/sun/star/util/XCloseable.hpp>
60 #include <com/sun/star/frame/XDispatchRecorderSupplier.hpp>
61 #include <com/sun/star/document/MacroExecMode.hpp>
62 #include <com/sun/star/document/UpdateDocMode.hpp>
63 #include <com/sun/star/beans/XPropertySet.hpp>
64 #include <com/sun/star/uri/XUriReferenceFactory.hpp>
65 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
66 #include <com/sun/star/embed/XStorage.hpp>
67 #include <com/sun/star/embed/EmbedStates.hpp>
68 #include <com/sun/star/document/XViewDataSupplier.hpp>
69 #include <com/sun/star/container/XIndexContainer.hpp>
70 #include <rtl/ustrbuf.hxx>
71
72 #include <unotools/localfilehelper.hxx>
73 #include <unotools/ucbhelper.hxx>
74 #include <comphelper/processfactory.hxx>
75 #include <comphelper/componentcontext.hxx>
76 #include <comphelper/namedvaluecollection.hxx>
77 #include <comphelper/configurationhelper.hxx>
78 #include <comphelper/docpasswordrequest.hxx>
79 #include <comphelper/docpasswordhelper.hxx>
80
81 #include <com/sun/star/uno/Reference.h>
82 #include <com/sun/star/ucb/XContent.hpp>
83
84 #include <basic/basmgr.hxx>
85 #include <basic/sbmod.hxx>
86 #include <basic/sbmeth.hxx>
87 #include <basic/sbx.hxx>
88 #include <comphelper/storagehelper.hxx>
89 #include <svtools/asynclink.hxx>
90 #include <svl/sharecontrolfile.hxx>
91 #include <svtools/svtools.hrc>
92 #include <svtools/svtdata.hxx>
93 #include <framework/framelistanalyzer.hxx>
94
95 #include <boost/optional.hpp>
96
97 using namespace ::com::sun::star;
98 using namespace ::com::sun::star::uno;
99 using namespace ::com::sun::star::ucb;
100 using namespace ::com::sun::star::frame;
101 using namespace ::com::sun::star::lang;
102 using ::com::sun::star::awt::XWindow;
103 using ::com::sun::star::beans::PropertyValue;
104 using ::com::sun::star::document::XViewDataSupplier;
105 using ::com::sun::star::container::XIndexContainer;
106 namespace css = ::com::sun::star;
107
108 // wg. ViewFrame::Current
109 #include "appdata.hxx"
110 #include <sfx2/taskpane.hxx>
111 #include <sfx2/app.hxx>
112 #include <sfx2/objface.hxx>
113 #include "openflag.hxx"
114 #include "objshimp.hxx"
115 #include <sfx2/viewsh.hxx>
116 #include <sfx2/objsh.hxx>
117 #include <sfx2/bindings.hxx>
118 #include <sfx2/dispatch.hxx>
119 #include "arrdecl.hxx"
120 #include "sfxtypes.hxx"
121 #include <sfx2/request.hxx>
122 #include <sfx2/docfac.hxx>
123 #include <sfx2/ipclient.hxx>
124 #include "sfx2/sfxresid.hxx"
125 #include "appbas.hxx"
126 #include <sfx2/objitem.hxx>
127 #include "sfx2/viewfac.hxx"
128 #include <sfx2/event.hxx>
129 #include "fltfnc.hxx"
130 #include <sfx2/docfile.hxx>
131 #include <sfx2/module.hxx>
132 #include <sfx2/msgpool.hxx>
133 #include <sfx2/viewfrm.hxx>
134 #include "viewimp.hxx"
135 #include <sfx2/sfxbasecontroller.hxx>
136 #include <sfx2/sfx.hrc>
137 #include "view.hrc"
138 #include <sfx2/frmdescr.hxx>
139 #include <sfx2/sfxuno.hxx>
140 #include <sfx2/progress.hxx>
141 #include "workwin.hxx"
142 #include "helper.hxx"
143 #include "macro.hxx"
144 #include "sfx2/minfitem.hxx"
145 #include "../appl/app.hrc"
146 #include "impviewframe.hxx"
147
148 //-------------------------------------------------------------------------
149 DBG_NAME(SfxViewFrame)
150
151 #define SfxViewFrame
152 #include "sfxslots.hxx"
153 #undef SfxViewFrame
154
155 //-------------------------------------------------------------------------
156
157 SFX_IMPL_INTERFACE(SfxViewFrame,SfxShell,SfxResId(0))
158 {
159 SFX_CHILDWINDOW_REGISTRATION( SID_BROWSER );
160 SFX_CHILDWINDOW_REGISTRATION( SID_RECORDING_FLOATWINDOW );
161
162 SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_FULLSCREEN | SFX_VISIBILITY_FULLSCREEN, SfxResId(RID_FULLSCREENTOOLBOX) );
163 SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION | SFX_VISIBILITY_STANDARD, SfxResId(RID_ENVTOOLBOX) );
164 }
165
166 TYPEINIT2(SfxViewFrame,SfxShell,SfxListener);
167 TYPEINIT1(SfxViewFrameItem, SfxPoolItem);
168
169 //=========================================================================
170
171 //-------------------------------------------------------------------------
172 namespace
173 {
moduleHasToolPanels(SfxViewFrame_Impl & i_rViewFrameImpl)174 bool moduleHasToolPanels( SfxViewFrame_Impl& i_rViewFrameImpl )
175 {
176 if ( !i_rViewFrameImpl.aHasToolPanels )
177 {
178 i_rViewFrameImpl.aHasToolPanels.reset( ::sfx2::ModuleTaskPane::ModuleHasToolPanels(
179 i_rViewFrameImpl.rFrame.GetFrameInterface() ) );
180 }
181 return *i_rViewFrameImpl.aHasToolPanels;
182 }
183 }
184
185 //-------------------------------------------------------------------------
AskPasswordToModify_Impl(const uno::Reference<task::XInteractionHandler> & xHandler,const::rtl::OUString & aPath,const SfxFilter * pFilter,sal_uInt32 nPasswordHash,const uno::Sequence<beans::PropertyValue> aInfo)186 static sal_Bool AskPasswordToModify_Impl( const uno::Reference< task::XInteractionHandler >& xHandler, const ::rtl::OUString& aPath, const SfxFilter* pFilter, sal_uInt32 nPasswordHash, const uno::Sequence< beans::PropertyValue > aInfo )
187 {
188 // TODO/LATER: In future the info should replace the direct hash completely
189 sal_Bool bResult = ( !nPasswordHash && !aInfo.getLength() );
190
191 OSL_ENSURE( pFilter && ( pFilter->GetFilterFlags() & SFX_FILTER_PASSWORDTOMODIFY ), "PasswordToModify feature is active for a filter that does not support it!" );
192
193 if ( pFilter && xHandler.is() )
194 {
195 sal_Bool bCancel = sal_False;
196 sal_Bool bFirstTime = sal_True;
197
198 while ( !bResult && !bCancel )
199 {
200 sal_Bool bMSType = !pFilter->IsOwnFormat();
201
202 ::rtl::Reference< ::comphelper::DocPasswordRequest > pPasswordRequest(
203 new ::comphelper::DocPasswordRequest(
204 bMSType ? ::comphelper::DocPasswordRequestType_MS : ::comphelper::DocPasswordRequestType_STANDARD,
205 bFirstTime ? ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER : ::com::sun::star::task::PasswordRequestMode_PASSWORD_REENTER,
206 aPath,
207 sal_True ) );
208
209 uno::Reference< com::sun::star::task::XInteractionRequest > rRequest( pPasswordRequest.get() );
210 xHandler->handle( rRequest );
211
212 if ( pPasswordRequest->isPassword() )
213 {
214 if ( aInfo.getLength() )
215 {
216 bResult = ::comphelper::DocPasswordHelper::IsModifyPasswordCorrect( pPasswordRequest->getPasswordToModify(), aInfo );
217 }
218 else
219 {
220 // the binary format
221 bResult = ( SfxMedium::CreatePasswordToModifyHash( pPasswordRequest->getPasswordToModify(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" ) ).equals( pFilter->GetServiceName() ) ) == nPasswordHash );
222 }
223 }
224 else
225 bCancel = sal_True;
226
227 bFirstTime = sal_False;
228 }
229 }
230
231 return bResult;
232 }
233
234 //-------------------------------------------------------------------------
SetDowning_Impl()235 void SfxViewFrame::SetDowning_Impl()
236 {
237 pImp->bIsDowning = sal_True;
238 }
239
240 //-------------------------------------------------------------------------
IsDowning_Impl() const241 sal_Bool SfxViewFrame::IsDowning_Impl() const
242 {
243 return pImp->bIsDowning;
244 }
245
246
247 //--------------------------------------------------------------------
248 class SfxViewNotificatedFrameList_Impl :
249 public SfxListener, public SfxViewFrameArr_Impl
250 {
251 public:
252
InsertViewFrame(SfxViewFrame * pFrame)253 void InsertViewFrame( SfxViewFrame* pFrame )
254 {
255 StartListening( *pFrame );
256 C40_INSERT( SfxViewFrame, pFrame, Count() );
257 }
258 void Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
259 };
260
261 //-------------------------------------------------------------------------
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)262 void SfxViewNotificatedFrameList_Impl::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
263 {
264 if ( rHint.IsA(TYPE(SfxSimpleHint)) )
265 {
266 switch( ( (SfxSimpleHint&) rHint ).GetId() )
267 {
268 case SFX_HINT_DYING:
269 SfxViewFrame* pFrame = (SfxViewFrame*) &rBC;
270 if( pFrame )
271 {
272 sal_uInt16 nPos = C40_GETPOS( SfxViewFrame, pFrame );
273 if( nPos != USHRT_MAX )
274 Remove( nPos );
275 }
276 break;
277 }
278 }
279 }
280
281 //-------------------------------------------------------------------------
282
ReloadDecouple_Impl(void * pObj,void * pArg)283 long ReloadDecouple_Impl( void* pObj, void* pArg )
284 {
285 ((SfxViewFrame*) pObj)->ExecReload_Impl( *(SfxRequest*)pArg );
286 return 0;
287 }
288
ExecReload_Impl(SfxRequest & rReq,sal_Bool bAsync)289 void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq, sal_Bool bAsync )
290 {
291 if( bAsync )
292 {
293 if( !pImp->pReloader )
294 pImp->pReloader = new svtools::AsynchronLink(
295 Link( this, ReloadDecouple_Impl ) );
296 pImp->pReloader->Call( new SfxRequest( rReq ) );
297 }
298 else ExecReload_Impl( rReq );
299 }
300
ExecReload_Impl(SfxRequest & rReq)301 void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq )
302 {
303 SfxFrame *pParent = GetFrame().GetParentFrame();
304 if ( rReq.GetSlot() == SID_RELOAD )
305 {
306 // With CTRL-Reload reload the active frame
307 SfxViewFrame* pActFrame = this;
308 while ( pActFrame )
309 pActFrame = pActFrame->GetActiveChildFrame_Impl();
310
311 if ( pActFrame )
312 {
313 sal_uInt16 nModifier = rReq.GetModifier();
314 if ( nModifier & KEY_MOD1 )
315 {
316 pActFrame->ExecReload_Impl( rReq );
317 return;
318 }
319 }
320
321 // If only reloading of the graphs or more child frames
322 // is needed
323 SfxFrame& rFrame = GetFrame();
324 if ( pParent == &rFrame && rFrame.GetChildFrameCount() )
325 {
326 sal_Bool bReloadAvailable = sal_False;
327 SfxFrameIterator aIter( rFrame, sal_False );
328 SfxFrame *pChild = aIter.FirstFrame();
329 while ( pChild )
330 {
331 SfxFrame *pNext = aIter.NextFrame( *pChild );
332 SfxObjectShell *pShell = pChild->GetCurrentDocument();
333 if( pShell && pShell->Get_Impl()->bReloadAvailable )
334 {
335 bReloadAvailable = sal_True;
336 pChild->GetCurrentViewFrame()->ExecuteSlot( rReq );
337 }
338 pChild = pNext;
339 }
340
341 // The TopLevel frame itself had no graphics
342 if ( bReloadAvailable )
343 return;
344 }
345 }
346 else
347 {
348 // With CTRL-Edit edit the top frame
349 sal_uInt16 nModifier = rReq.GetModifier();
350 //KEY_MOD1 is the Ctrl modifier key
351 if ( ( nModifier & KEY_MOD1 ) && pParent )
352 {
353 SfxViewFrame *pTop = GetTopViewFrame();
354 pTop->ExecReload_Impl( rReq );
355 return;
356 }
357 }
358
359 SfxObjectShell* pSh = GetObjectShell();
360 switch ( rReq.GetSlot() )
361 {
362 case SID_EDITDOC:
363 {
364 if ( GetFrame().HasComponent() )
365 break;
366
367 // Because of double functioning of the toolbox button (with/without Ctrl)
368 // it's possible that the slot is enabled, but Ctrl-click is not.
369 if( !pSh || !pSh->HasName() || !(pSh->Get_Impl()->nLoadedFlags & SFX_LOADED_MAINDOCUMENT ))
370 break;
371
372 SfxMedium* pMed = pSh->GetMedium();
373
374 SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pItem, SfxBoolItem, SID_VIEWONLY, sal_False );
375 if ( pItem && pItem->GetValue() )
376 {
377 SfxApplication* pApp = SFX_APP();
378 SfxAllItemSet aSet( pApp->GetPool() );
379 aSet.Put( SfxStringItem( SID_FILE_NAME, pMed->GetURLObject().GetMainURL(INetURLObject::NO_DECODE) ) );
380 aSet.Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
381 aSet.Put( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_blank") ) );
382 SFX_ITEMSET_ARG( pMed->GetItemSet(), pReferer, SfxStringItem, SID_REFERER, sal_False );
383 if ( pReferer )
384 aSet.Put( *pReferer );
385 SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pVersionItem, SfxInt16Item, SID_VERSION, sal_False );
386 if ( pVersionItem )
387 aSet.Put( *pVersionItem );
388
389 if( pMed->GetFilter() )
390 {
391 aSet.Put( SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
392 SFX_ITEMSET_ARG( pMed->GetItemSet(), pOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False );
393 if ( pOptions )
394 aSet.Put( *pOptions );
395 }
396
397 GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, aSet );
398 return;
399 }
400
401 sal_uInt16 nOpenMode;
402 sal_Bool bNeedsReload = sal_False;
403 if ( !pSh->IsReadOnly() )
404 {
405 // Speichern und Readonly Reloaden
406 if( pSh->IsModified() )
407 {
408 if ( pSh->PrepareClose() )
409 {
410 // the storing could let the medium be changed
411 pMed = pSh->GetMedium();
412 bNeedsReload = sal_True;
413 }
414 else
415 {
416 rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), sal_False ) );
417 return;
418 }
419 }
420 nOpenMode = SFX_STREAM_READONLY;
421 }
422 else
423 {
424 if ( pSh->IsReadOnlyMedium()
425 && ( pSh->GetModifyPasswordHash() || pSh->GetModifyPasswordInfo().getLength() )
426 && !pSh->IsModifyPasswordEntered() )
427 {
428 ::rtl::OUString aDocumentName = INetURLObject( pMed->GetOrigURL() ).GetMainURL( INetURLObject::DECODE_WITH_CHARSET );
429 if( !AskPasswordToModify_Impl( pMed->GetInteractionHandler(), aDocumentName, pMed->GetOrigFilter(), pSh->GetModifyPasswordHash(), pSh->GetModifyPasswordInfo() ) )
430 {
431 // this is a read-only document, if it has "Password to modify"
432 // the user should enter password before he can edit the document
433 rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), sal_False ) );
434 return;
435 }
436
437 pSh->SetModifyPasswordEntered();
438 }
439
440 nOpenMode = SFX_STREAM_READWRITE;
441 pSh->SetReadOnlyUI( sal_False );
442
443 // if only the view was in the readonly mode then there is no need to do the reload
444 if ( !pSh->IsReadOnly() )
445 return;
446 }
447
448 // Evaluate parameters
449 // sal_Bool bReload = sal_True;
450 if ( rReq.IsAPI() )
451 {
452 // Control through API if r/w or r/o
453 SFX_REQUEST_ARG(rReq, pEditItem, SfxBoolItem, SID_EDITDOC, sal_False);
454 if ( pEditItem )
455 nOpenMode = pEditItem->GetValue() ? SFX_STREAM_READWRITE : SFX_STREAM_READONLY;
456 }
457
458 // doing
459
460 String aTemp;
461 utl::LocalFileHelper::ConvertPhysicalNameToURL( pMed->GetPhysicalName(), aTemp );
462 INetURLObject aPhysObj( aTemp );
463 SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(),
464 pVersionItem, SfxInt16Item, SID_VERSION, sal_False );
465
466 INetURLObject aMedObj( pMed->GetName() );
467
468 // -> i126305
469 // the logic below is following:
470 // if the document seems not to need to be reloaded
471 // and the physical name is different to the logical one,
472 // then on file system it can be checked that the copy is still newer than the original and no document reload is required.
473 // some semplification to enhance readability of the 'if' expression
474 //
475 // on the 'http/https' protocol case, the bool bPhysObjIsYounger relies upon the getlastmodified Property of a WebDAV resource.
476 // Said property should be implemented, but sometimes it's not. This happens on some small webdav servers, where it's not
477 // implemented. On this case the reload will not work properly.
478 // Details at this link: http://tools.ietf.org/html/rfc4918#section-15, section 15.7
479 // TODO: add an indication to the user? Difficult to implement I think.
480 sal_Bool bPhysObjIsYounger = ::utl::UCBContentHelper::IsYounger( aMedObj.GetMainURL( INetURLObject::NO_DECODE ), aPhysObj.GetMainURL( INetURLObject::NO_DECODE ) );
481 sal_Bool bIsHttpOrHttps = (aMedObj.GetProtocol() == INET_PROT_HTTP || aMedObj.GetProtocol() == INET_PROT_HTTPS);
482 if ( ( !bNeedsReload && ( ( aMedObj.GetProtocol() == INET_PROT_FILE &&
483 aMedObj.getFSysPath(INetURLObject::FSYS_DETECT) != aPhysObj.getFSysPath(INetURLObject::FSYS_DETECT) &&
484 !bPhysObjIsYounger )
485 || ( bIsHttpOrHttps && !bPhysObjIsYounger )
486 || ( pMed->IsRemote() && !bIsHttpOrHttps ) ) )
487 || pVersionItem )
488 // <- i126305
489 {
490 sal_Bool bOK = sal_False;
491 if ( !pVersionItem )
492 {
493 sal_Bool bHasStorage = pMed->HasStorage_Impl();
494 // switching edit mode could be possible without reload
495 if ( bHasStorage && pMed->GetStorage() == pSh->GetStorage() )
496 {
497 // TODO/LATER: faster creation of copy
498 if ( !pSh->ConnectTmpStorage_Impl( pMed->GetStorage(), pMed ) )
499 return;
500 }
501
502 pMed->CloseAndRelease();
503 pMed->GetItemSet()->Put( SfxBoolItem( SID_DOC_READONLY, !( nOpenMode & STREAM_WRITE ) ) );
504 pMed->SetOpenMode( nOpenMode, pMed->IsDirect() );
505
506 pMed->CompleteReOpen();
507 if ( nOpenMode & STREAM_WRITE )
508 pMed->LockOrigFileOnDemand( sal_False, sal_True );
509
510 // LockOrigFileOnDemand might set the readonly flag itself, it should be set back
511 pMed->GetItemSet()->Put( SfxBoolItem( SID_DOC_READONLY, !( nOpenMode & STREAM_WRITE ) ) );
512
513 if ( !pMed->GetErrorCode() )
514 bOK = sal_True;
515 }
516
517 if( !bOK )
518 {
519 ErrCode nErr = pMed->GetErrorCode();
520 if ( pVersionItem )
521 nErr = ERRCODE_IO_ACCESSDENIED;
522 else
523 {
524 pMed->ResetError();
525 pMed->SetOpenMode( SFX_STREAM_READONLY, pMed->IsDirect() );
526 pMed->ReOpen();
527 pSh->DoSaveCompleted( pMed );
528 }
529
530 // r/o-Doc can not be switched to edit mode?
531 rReq.Done( sal_False );
532
533 if ( nOpenMode == SFX_STREAM_READWRITE && !rReq.IsAPI() )
534 {
535 // ::com::sun::star::sdbcx::User ask to open as template (a copy of the document)
536 QueryBox aBox( &GetWindow(), SfxResId(MSG_QUERY_OPENASTEMPLATE) );
537 // this is the querybox that is opened when the file is asked to move from r/o to edit using the button
538 // on the toolbar
539 if ( RET_YES == aBox.Execute() )
540 {
541 SfxApplication* pApp = SFX_APP();
542 SfxAllItemSet aSet( pApp->GetPool() );
543 aSet.Put( SfxStringItem( SID_FILE_NAME, pMed->GetName() ) );
544 SFX_ITEMSET_ARG( pMed->GetItemSet(), pReferer, SfxStringItem, SID_REFERER, sal_False );
545 if ( pReferer )
546 aSet.Put( *pReferer );
547 aSet.Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
548 if ( pVersionItem )
549 aSet.Put( *pVersionItem );
550
551 if( pMed->GetFilter() )
552 {
553 aSet.Put( SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
554 SFX_ITEMSET_ARG( pMed->GetItemSet(), pOptions,
555 SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False );
556 if ( pOptions )
557 aSet.Put( *pOptions );
558 }
559
560 GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, aSet );
561 return;
562 }
563 else
564 nErr = 0;
565 }
566
567 ErrorHandler::HandleError( nErr );
568 rReq.SetReturnValue(
569 SfxBoolItem( rReq.GetSlot(), sal_False ) );
570 return;
571 }
572 else
573 {
574 pSh->DoSaveCompleted( pMed );
575 pSh->Broadcast( SfxSimpleHint(SFX_HINT_MODECHANGED) );
576 rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), sal_True ) );
577 rReq.Done( sal_True );
578 // if( nOpenMode == SFX_STREAM_READONLY )
579 // pMed->Close();
580 return;
581 }
582 }
583
584 rReq.AppendItem( SfxBoolItem( SID_FORCERELOAD, sal_True) );
585 rReq.AppendItem( SfxBoolItem( SID_SILENT, sal_True ));
586 }
587
588 case SID_RELOAD:
589 {
590 // Because of double functioning of the toolbox button (with/without Ctrl)
591 // it's possible that the slot is enabled, but Ctrl-click is not.
592 if ( !pSh || !pSh->CanReload_Impl() )
593 break;
594 SfxApplication* pApp = SFX_APP();
595 SFX_REQUEST_ARG(rReq, pForceReloadItem, SfxBoolItem,
596 SID_FORCERELOAD, sal_False);
597 if( pForceReloadItem && !pForceReloadItem->GetValue() &&
598 !pSh->GetMedium()->IsExpired() )
599 return;
600 if( pImp->bReloading || pSh->IsInModalMode() )
601 return;
602
603 // AutoLoad ist ggf. verboten
604 SFX_REQUEST_ARG(rReq, pAutoLoadItem, SfxBoolItem, SID_AUTOLOAD, sal_False);
605 if ( pAutoLoadItem && pAutoLoadItem->GetValue() &&
606 GetFrame().IsAutoLoadLocked_Impl() )
607 return;
608
609 SfxObjectShellLock xOldObj( pSh );
610 pImp->bReloading = sal_True;
611 SFX_REQUEST_ARG(rReq, pURLItem, SfxStringItem,
612 SID_FILE_NAME, sal_False);
613 // open to edit?
614 sal_Bool bForEdit = !pSh->IsReadOnly();
615 if ( rReq.GetSlot() == SID_EDITDOC )
616 bForEdit = !bForEdit;
617
618 // if necessary ask the user
619 sal_Bool bDo = ( GetViewShell()->PrepareClose() != sal_False );
620 SFX_REQUEST_ARG(rReq, pSilentItem, SfxBoolItem, SID_SILENT, sal_False);
621 if ( bDo && GetFrame().DocIsModified_Impl() &&
622 !rReq.IsAPI() && ( !pSilentItem || !pSilentItem->GetValue() ) )
623 {
624 QueryBox aBox( &GetWindow(), SfxResId(MSG_QUERY_LASTVERSION) );
625 bDo = ( RET_YES == aBox.Execute() );
626 }
627
628 if ( bDo )
629 {
630 SfxMedium *pMedium = xOldObj->GetMedium();
631
632 //Pull frameset before FramesetView possibly disappear
633 String aURL = pURLItem ? pURLItem->GetValue() :
634 pMedium->GetName();
635
636 sal_Bool bHandsOff =
637 ( pMedium->GetURLObject().GetProtocol() == INET_PROT_FILE && !xOldObj->IsDocShared() );
638
639 // empty existing SfxMDIFrames of this Doc
640 // own format or R/O is now open editable?
641 SfxObjectShellLock xNewObj;
642
643 // collect the views of the document
644 // TODO: when UNO ViewFactories are available for SFX-based documents, the below code should
645 // be UNOized, too
646 typedef ::std::pair< Reference< XFrame >, sal_uInt16 > ViewDescriptor;
647 ::std::list< ViewDescriptor > aViewFrames;
648 SfxViewFrame *pView = GetFirst( xOldObj );
649 while ( pView )
650 {
651 Reference< XFrame > xFrame( pView->GetFrame().GetFrameInterface() );
652 OSL_ENSURE( xFrame.is(), "SfxViewFrame::ExecReload_Impl: no XFrame?!" );
653 aViewFrames.push_back( ViewDescriptor( xFrame, pView->GetCurViewId() ) );
654
655 pView = GetNext( *pView, xOldObj );
656 }
657
658 DELETEZ( xOldObj->Get_Impl()->pReloadTimer );
659
660 SfxItemSet* pNewSet = 0;
661 const SfxFilter *pFilter = pMedium->GetFilter();
662 if( pURLItem )
663 {
664 pNewSet = new SfxAllItemSet( pApp->GetPool() );
665 pNewSet->Put( *pURLItem );
666
667 // Filter Detection
668 SfxMedium aMedium( pURLItem->GetValue(), SFX_STREAM_READWRITE );
669 SfxFilterMatcher().GuessFilter( aMedium, &pFilter );
670 if ( pFilter )
671 pNewSet->Put( SfxStringItem( SID_FILTER_NAME, pFilter->GetName() ) );
672 pNewSet->Put( *aMedium.GetItemSet() );
673 }
674 else
675 {
676 pNewSet = new SfxAllItemSet( *pMedium->GetItemSet() );
677 pNewSet->ClearItem( SID_VIEW_ID );
678 pNewSet->ClearItem( SID_STREAM );
679 pNewSet->ClearItem( SID_INPUTSTREAM );
680 pNewSet->Put( SfxStringItem( SID_FILTER_NAME, pMedium->GetFilter()->GetName() ) );
681
682 // let the current security settings be checked again
683 pNewSet->Put( SfxUInt16Item( SID_MACROEXECMODE, document::MacroExecMode::USE_CONFIG ) );
684
685 if ( rReq.GetSlot() == SID_EDITDOC || !bForEdit )
686 // edit mode is switched or reload of readonly document
687 pNewSet->Put( SfxBoolItem( SID_DOC_READONLY, !bForEdit ) );
688 else
689 // Reload of file opened for writing
690 pNewSet->ClearItem( SID_DOC_READONLY );
691 }
692
693 // Falls eine salvagede Datei vorliegt, nicht nochmals die
694 // OrigURL mitschicken, denn die Tempdate ist nach Reload
695 // ungueltig
696 SFX_ITEMSET_ARG( pNewSet, pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False);
697 if( pSalvageItem )
698 {
699 aURL = pSalvageItem->GetValue();
700 if (pNewSet)
701 {
702 pNewSet->ClearItem( SID_ORIGURL );
703 pNewSet->ClearItem( SID_DOC_SALVAGE );
704 }
705 }
706
707 // TODO/LATER: Temporary solution, the SfxMedium must know the original URL as aLogicName
708 // SfxMedium::Transfer_Impl() will be vorbidden then.
709 if ( xOldObj->IsDocShared() )
710 pNewSet->Put( SfxStringItem( SID_FILE_NAME, xOldObj->GetSharedFileURL() ) );
711
712 //pNewMedium = new SfxMedium( aURL, nMode, pMedium->IsDirect(), bUseFilter ? pMedium->GetFilter() : 0, pNewSet );
713 //pNewSet = pNewMedium->GetItemSet();
714 if ( pURLItem )
715 pNewSet->Put( SfxStringItem( SID_REFERER, pMedium->GetName() ) );
716 else
717 pNewSet->Put( SfxStringItem( SID_REFERER, String() ) );
718
719 xOldObj->CancelTransfers();
720
721 //actual reload
722 //pNewSet->Put( SfxFrameItem ( SID_DOCFRAME, GetFrame() ) );
723
724 if ( pSilentItem && pSilentItem->GetValue() )
725 pNewSet->Put( SfxBoolItem( SID_SILENT, sal_True ) );
726
727 SFX_ITEMSET_ARG(pNewSet, pInteractionItem, SfxUnoAnyItem, SID_INTERACTIONHANDLER, sal_False);
728 SFX_ITEMSET_ARG(pNewSet, pMacroExecItem , SfxUInt16Item, SID_MACROEXECMODE , sal_False);
729 SFX_ITEMSET_ARG(pNewSet, pDocTemplateItem, SfxUInt16Item, SID_UPDATEDOCMODE , sal_False);
730
731 if (!pInteractionItem)
732 {
733 Reference < ::com::sun::star::task::XInteractionHandler > xHdl( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.comp.uui.UUIInteractionHandler")), UNO_QUERY );
734 if (xHdl.is())
735 pNewSet->Put( SfxUnoAnyItem(SID_INTERACTIONHANDLER,::com::sun::star::uno::makeAny(xHdl)) );
736 }
737
738 if (!pMacroExecItem)
739 pNewSet->Put( SfxUInt16Item(SID_MACROEXECMODE,::com::sun::star::document::MacroExecMode::USE_CONFIG) );
740 if (!pDocTemplateItem)
741 pNewSet->Put( SfxUInt16Item(SID_UPDATEDOCMODE,::com::sun::star::document::UpdateDocMode::ACCORDING_TO_CONFIG) );
742
743 xOldObj->SetModified( sal_False );
744 // Old Doc not cached! Does not apply if another Doc is loaded.
745
746 SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSavedOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False);
747 SFX_ITEMSET_ARG( pMedium->GetItemSet(), pSavedReferer, SfxStringItem, SID_REFERER, sal_False);
748
749 sal_Bool bHasStorage = pMedium->HasStorage_Impl();
750 if( bHandsOff )
751 {
752 if ( bHasStorage && pMedium->GetStorage() == xOldObj->GetStorage() )
753 {
754 // TODO/LATER: faster creation of copy
755 if ( !xOldObj->ConnectTmpStorage_Impl( pMedium->GetStorage(), pMedium ) )
756 return;
757 }
758
759 pMedium->CloseAndRelease();
760 }
761
762 xNewObj = SfxObjectShell::CreateObject( pFilter->GetServiceName(), SFX_CREATE_MODE_STANDARD );
763
764 if ( xOldObj->IsModifyPasswordEntered() )
765 xNewObj->SetModifyPasswordEntered();
766
767 uno::Sequence < beans::PropertyValue > aLoadArgs;
768 TransformItems( SID_OPENDOC, *pNewSet, aLoadArgs );
769 try
770 {
771 uno::Reference < frame::XLoadable > xLoad( xNewObj->GetModel(), uno::UNO_QUERY );
772 xLoad->load( aLoadArgs );
773 }
774 catch ( uno::Exception& )
775 {
776 //->i126305 OBSERVATION
777 // When this exception is thrown the r/o refresh of a file locked by another user
778 // is not completed.
779 // Code flow arrives here with a 'com.sun.star.task.ErrorCodeIOException'.
780 // It's thrown at around line 1970 of main/sfx2/source/doc/sfxbasemodel.cxx,
781 // in method 'SfxBaseModel::load'.
782 // Because of this exception, the document is not reloaded when it should be.
783 // The error generating the exception is 1287, or ERRCODE_IO_ACCESSDENIED.
784 // It seems that the reason for this is the way the property PROP_READONLY seems used
785 // in MediaDescriptor: both as property of the media and a request from GUI.
786 // See main/comphelper/source/misc/mediadescriptor.cxx around line 755, where the behavior
787 // leading to the error originates in the code flow.
788 // This problem doesn't arise in WebDAV, since the stream is monodirectional (read or write) in UCB implementation.
789 //<-i126305
790 //->i126305 WORKAROUND
791 // Code flow needs to reset the reloading, since it will no longer take part in the following code.
792 // This specific flag, if not reset, will break the code flow on the next call of this method,
793 // when it appears that the toolbar button stops functioning.
794 pImp->bReloading = sal_False;
795 //<-i126305
796 xNewObj->DoClose();
797 xNewObj = 0;
798 }
799
800 DELETEZ( pNewSet );
801
802 if( !xNewObj.Is() )
803 {
804 if( bHandsOff )
805 {
806 // back to old medium
807 pMedium->ReOpen();
808 pMedium->LockOrigFileOnDemand( sal_False, sal_True );
809
810 xOldObj->DoSaveCompleted( pMedium );
811 }
812
813 // r/o-Doc couldn't be switched to writing mode
814 if ( bForEdit && SID_EDITDOC == rReq.GetSlot() )
815 {
816 // ask user for opening as template
817 QueryBox aBox( &GetWindow(), SfxResId(MSG_QUERY_OPENASTEMPLATE) );
818 if ( RET_YES == aBox.Execute() )
819 {
820 SfxAllItemSet aSet( pApp->GetPool() );
821 aSet.Put( SfxStringItem( SID_FILE_NAME, pMedium->GetName() ) );
822 aSet.Put( SfxStringItem( SID_TARGETNAME, String::CreateFromAscii("_blank") ) );
823 if ( pSavedOptions )
824 aSet.Put( *pSavedOptions );
825 if ( pSavedReferer )
826 aSet.Put( *pSavedReferer );
827 aSet.Put( SfxBoolItem( SID_TEMPLATE, sal_True ) );
828 if( pFilter )
829 aSet.Put( SfxStringItem( SID_FILTER_NAME, pFilter->GetFilterName() ) );
830 GetDispatcher()->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON, aSet );
831 }
832 }
833 else
834 {
835 // an error handling should be done here?!
836 // if ( !pSilentItem || !pSilentItem->GetValue() )
837 // ErrorHandler::HandleError( nLoadError );
838 }
839 }
840 else
841 {
842 if ( xNewObj->GetModifyPasswordHash() && xNewObj->GetModifyPasswordHash() != xOldObj->GetModifyPasswordHash() )
843 {
844 xNewObj->SetModifyPasswordEntered( sal_False );
845 xNewObj->SetReadOnly();
846 }
847 else if ( rReq.GetSlot() == SID_EDITDOC && bForEdit && !xNewObj->IsReadOnlyMedium() )
848 {
849 // the filter might request setting of the document to readonly state
850 // but in case of SID_EDITDOC it should not happen if the document
851 // can be opened for editing
852 xNewObj->SetReadOnlyUI( sal_False );
853 }
854
855 if ( xNewObj->IsDocShared() )
856 {
857 // the file is shared but the closing can change the sharing control file
858 xOldObj->DoNotCleanShareControlFile();
859 }
860
861 // the Reload and Silent items were only temporary, remove them
862 xNewObj->GetMedium()->GetItemSet()->ClearItem( SID_RELOAD );
863 xNewObj->GetMedium()->GetItemSet()->ClearItem( SID_SILENT );
864 TransformItems( SID_OPENDOC, *xNewObj->GetMedium()->GetItemSet(), aLoadArgs );
865
866 UpdateDocument_Impl();
867
868 try
869 {
870 while ( !aViewFrames.empty() )
871 {
872 LoadViewIntoFrame_Impl( *xNewObj, aViewFrames.front().first, aLoadArgs, aViewFrames.front().second, false );
873 aViewFrames.pop_front();
874 }
875 }
876 catch( const Exception& )
877 {
878 // close the remaining frames
879 // Don't catch exceptions herein, if this fails, then we're left in an indetermined state, and
880 // crashing is better than trying to proceed
881 while ( !aViewFrames.empty() )
882 {
883 Reference< util::XCloseable > xClose( aViewFrames.front().first, UNO_QUERY_THROW );
884 xClose->close( sal_True );
885 aViewFrames.pop_front();
886 }
887 }
888
889 // Propagate document closure.
890 SFX_APP()->NotifyEvent( SfxEventHint( SFX_EVENT_CLOSEDOC, GlobalEventConfig::GetEventName( STR_EVENT_CLOSEDOC ), xOldObj ) );
891 }
892
893 // register as done
894 rReq.Done( sal_True );
895 rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), sal_True));
896 return;
897 }
898 else
899 {
900 // register as not done
901 rReq.Done();
902 rReq.SetReturnValue(SfxBoolItem(rReq.GetSlot(), sal_False));
903 pImp->bReloading = sal_False;
904 return;
905 }
906 }
907 }
908 }
909
910 //-------------------------------------------------------------------------
StateReload_Impl(SfxItemSet & rSet)911 void SfxViewFrame::StateReload_Impl( SfxItemSet& rSet )
912 {
913 SfxObjectShell* pSh = GetObjectShell();
914 if ( !pSh )
915 // Ich bin gerade am Reloaden und Yielde so vor mich hin ...
916 return;
917
918 GetFrame().GetParentFrame();
919 SfxWhichIter aIter( rSet );
920 for ( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich; nWhich = aIter.NextWhich() )
921 {
922 if ( GetFrame().HasComponent() )
923 {
924 // Wenn die Komponente es nicht selbst dispatched, dann
925 // macht es auch keinen Sinn!
926 rSet.DisableItem( nWhich );
927 continue;
928 }
929
930 switch ( nWhich )
931 {
932 case SID_EDITDOC:
933 {
934 if ( !pSh || !pSh->HasName() || !( pSh->Get_Impl()->nLoadedFlags & SFX_LOADED_MAINDOCUMENT )
935 || pSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
936 rSet.DisableItem( SID_EDITDOC );
937 else
938 {
939 SFX_ITEMSET_ARG( pSh->GetMedium()->GetItemSet(), pItem, SfxBoolItem, SID_EDITDOC, sal_False );
940 if ( pItem && !pItem->GetValue() )
941 rSet.DisableItem( SID_EDITDOC );
942 else
943 rSet.Put( SfxBoolItem( nWhich, !pSh->IsReadOnly() ) );
944 }
945 break;
946 }
947
948 case SID_RELOAD:
949 {
950 SfxFrame* pFrame = &GetTopFrame();
951
952 if ( !pSh || !pSh->CanReload_Impl() || pSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
953 rSet.DisableItem(nWhich);
954 else
955 {
956 // Wenn irgendein ChildFrame reloadable ist, wird der Slot
957 // enabled, damit man CTRL-Reload machen kann
958 sal_Bool bReloadAvailable = sal_False;
959 SfxFrameIterator aFrameIter( *pFrame, sal_True );
960 for( SfxFrame* pNextFrame = aFrameIter.FirstFrame();
961 pFrame;
962 pNextFrame = pNextFrame ?
963 aFrameIter.NextFrame( *pNextFrame ) : 0 )
964 {
965 SfxObjectShell *pShell = pFrame->GetCurrentDocument();
966 if( pShell && pShell->Get_Impl()->bReloadAvailable )
967 {
968 bReloadAvailable = sal_True;
969 break;
970 }
971 pFrame = pNextFrame;
972 }
973
974 rSet.Put( SfxBoolItem( nWhich, bReloadAvailable));
975 }
976
977 break;
978 }
979 }
980 }
981 }
982
983
984 //--------------------------------------------------------------------
ExecHistory_Impl(SfxRequest & rReq)985 void SfxViewFrame::ExecHistory_Impl( SfxRequest &rReq )
986 {
987 // gibt es an der obersten Shell einen Undo-Manager?
988 SfxShell *pSh = GetDispatcher()->GetShell(0);
989 ::svl::IUndoManager* pShUndoMgr = pSh->GetUndoManager();
990 sal_Bool bOK = sal_False;
991 if ( pShUndoMgr )
992 {
993 switch ( rReq.GetSlot() )
994 {
995 case SID_CLEARHISTORY:
996 pShUndoMgr->Clear();
997 bOK = sal_True;
998 break;
999
1000 case SID_UNDO:
1001 pShUndoMgr->Undo();
1002 GetBindings().InvalidateAll(sal_False);
1003 bOK = sal_True;
1004 break;
1005
1006 case SID_REDO:
1007 pShUndoMgr->Redo();
1008 GetBindings().InvalidateAll(sal_False);
1009 bOK = sal_True;
1010 break;
1011
1012 case SID_REPEAT:
1013 if ( pSh->GetRepeatTarget() )
1014 pShUndoMgr->Repeat( *pSh->GetRepeatTarget() );
1015 bOK = sal_True;
1016 break;
1017 }
1018 }
1019 else if ( GetViewShell() )
1020 {
1021 // der SW hat eigenes Undo an der View
1022 const SfxPoolItem *pRet = GetViewShell()->ExecuteSlot( rReq );
1023 if ( pRet )
1024 bOK = ((SfxBoolItem*)pRet)->GetValue();
1025 }
1026
1027 rReq.SetReturnValue( SfxBoolItem( rReq.GetSlot(), bOK ) );
1028 rReq.Done();
1029 }
1030
1031 //--------------------------------------------------------------------
StateHistory_Impl(SfxItemSet & rSet)1032 void SfxViewFrame::StateHistory_Impl( SfxItemSet &rSet )
1033 {
1034 // Undo-Manager suchen
1035 SfxShell *pSh = GetDispatcher()->GetShell(0);
1036 if ( !pSh )
1037 // Ich bin gerade am Reloaden und Yielde so vor mich hin ...
1038 return;
1039
1040 ::svl::IUndoManager *pShUndoMgr = pSh->GetUndoManager();
1041 if ( !pShUndoMgr )
1042 {
1043 // der SW hat eigenes Undo an der View
1044 SfxWhichIter aIter( rSet );
1045 SfxViewShell *pViewSh = GetViewShell();
1046 if( !pViewSh ) return;
1047 for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
1048 pViewSh->GetSlotState( nSID, 0, &rSet );
1049 return;
1050 }
1051
1052 if ( pShUndoMgr->GetUndoActionCount() == 0 &&
1053 pShUndoMgr->GetRedoActionCount() == 0 &&
1054 pShUndoMgr->GetRepeatActionCount() == 0 )
1055 rSet.DisableItem( SID_CLEARHISTORY );
1056
1057 if ( pShUndoMgr && pShUndoMgr->GetUndoActionCount() )
1058 {
1059 String aTmp( SvtResId( STR_UNDO ) );
1060 aTmp+= pShUndoMgr->GetUndoActionComment(0);
1061 rSet.Put( SfxStringItem( SID_UNDO, aTmp ) );
1062 }
1063 else
1064 rSet.DisableItem( SID_UNDO );
1065
1066 if ( pShUndoMgr && pShUndoMgr->GetRedoActionCount() )
1067 {
1068 String aTmp( SvtResId(STR_REDO) );
1069 aTmp += pShUndoMgr->GetRedoActionComment(0);
1070 rSet.Put( SfxStringItem( SID_REDO, aTmp ) );
1071 }
1072 else
1073 rSet.DisableItem( SID_REDO );
1074 SfxRepeatTarget *pTarget = pSh->GetRepeatTarget();
1075 if ( pShUndoMgr && pTarget && pShUndoMgr->GetRepeatActionCount() &&
1076 pShUndoMgr->CanRepeat(*pTarget) )
1077 {
1078 String aTmp( SvtResId(STR_REPEAT) );
1079 aTmp += pShUndoMgr->GetRepeatActionComment(*pTarget);
1080 rSet.Put( SfxStringItem( SID_REPEAT, aTmp ) );
1081 }
1082 else
1083 rSet.DisableItem( SID_REPEAT );
1084 }
1085
1086 //--------------------------------------------------------------------
PopShellAndSubShells_Impl(SfxViewShell & i_rViewShell)1087 void SfxViewFrame::PopShellAndSubShells_Impl( SfxViewShell& i_rViewShell )
1088 {
1089 i_rViewShell.PopSubShells_Impl();
1090 sal_uInt16 nLevel = pDispatcher->GetShellLevel( i_rViewShell );
1091 if ( nLevel != USHRT_MAX )
1092 {
1093 if ( nLevel )
1094 {
1095 // more sub shells on the stack, which were not affected by PopSubShells_Impl
1096 SfxShell *pSubShell = pDispatcher->GetShell( nLevel-1 );
1097 if ( pSubShell == i_rViewShell.GetSubShell() )
1098 // "real" sub shells will be deleted elsewhere
1099 pDispatcher->Pop( *pSubShell, SFX_SHELL_POP_UNTIL );
1100 else
1101 pDispatcher->Pop( *pSubShell, SFX_SHELL_POP_UNTIL | SFX_SHELL_POP_DELETE );
1102 }
1103 pDispatcher->Pop( i_rViewShell );
1104 pDispatcher->Flush();
1105 }
1106
1107 }
1108
1109 //--------------------------------------------------------------------
ReleaseObjectShell_Impl()1110 void SfxViewFrame::ReleaseObjectShell_Impl()
1111
1112 /* [Beschreibung]
1113
1114 Diese Methode entleert den SfxViewFrame, d.h. nimmt die <SfxObjectShell>
1115 vom Dispatcher und beendet seine <SfxListener>-Beziehung zu dieser
1116 SfxObjectShell (wodurch sie sich ggf. selbst zerst"ort).
1117
1118 Somit kann durch Aufruf von ReleaseObjectShell() und SetObjectShell()
1119 die SfxObjectShell ausgetauscht werden.
1120
1121 Zwischen RealeaseObjectShell() und SetObjectShell() darf die Kontrolle
1122 nicht an das System abgegeben werden.
1123
1124
1125 [Querverweise]
1126
1127 <SfxViewFrame::SetObjectShell(SfxObjectShell&)>
1128 */
1129 {
1130 DBG_CHKTHIS(SfxViewFrame, 0);
1131 DBG_ASSERT( xObjSh.Is(), "no SfxObjectShell to release!" );
1132
1133 GetFrame().ReleasingComponent_Impl( sal_True );
1134 if ( GetWindow().HasChildPathFocus( sal_True ) )
1135 {
1136 DBG_ASSERT( !GetActiveChildFrame_Impl(), "Wrong active child frame!" );
1137 GetWindow().GrabFocus();
1138 }
1139
1140 SfxViewShell *pDyingViewSh = GetViewShell();
1141 if ( pDyingViewSh )
1142 {
1143 PopShellAndSubShells_Impl( *pDyingViewSh );
1144 pDyingViewSh->DisconnectAllClients();
1145 SetViewShell_Impl(0);
1146 delete pDyingViewSh;
1147 }
1148 #ifdef DBG_UTIL
1149 else
1150 DBG_ERROR("Keine Shell");
1151 #endif
1152
1153 if ( xObjSh.Is() )
1154 {
1155 pImp->aLastType = xObjSh->Type();
1156 pDispatcher->Pop( *xObjSh );
1157 SfxModule* pModule = xObjSh->GetModule();
1158 if( pModule )
1159 pDispatcher->RemoveShell_Impl( *pModule );
1160 pDispatcher->Flush();
1161 EndListening( *xObjSh );
1162
1163 Notify( *xObjSh, SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1164 Notify( *xObjSh, SfxSimpleHint(SFX_HINT_DOCCHANGED) );
1165
1166 if ( 1 == xObjSh->GetOwnerLockCount() && pImp->bObjLocked && xObjSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
1167 xObjSh->DoClose();
1168 SfxObjectShellRef xDyingObjSh = xObjSh;
1169 xObjSh.Clear();
1170 if( ( GetFrameType() & SFXFRAME_HASTITLE ) && pImp->nDocViewNo )
1171 xDyingObjSh->GetNoSet_Impl().ReleaseIndex(pImp->nDocViewNo-1);
1172 if ( pImp->bObjLocked )
1173 {
1174 xDyingObjSh->OwnerLock( sal_False );
1175 pImp->bObjLocked = sal_False;
1176 }
1177 }
1178
1179 GetDispatcher()->SetDisableFlags( 0 );
1180 }
1181
1182 //--------------------------------------------------------------------
Close()1183 sal_Bool SfxViewFrame::Close()
1184 {
1185 DBG_CHKTHIS(SfxViewFrame, 0);
1186
1187 DBG_ASSERT( GetFrame().IsClosing_Impl() || !GetFrame().GetFrameInterface().is(), "ViewFrame closed too early!" );
1188
1189 // Wenn bis jetzt noch nicht gespeichert wurde, sollen eingebettete Objekte
1190 // auch nicht mehr automatisch gespeichert werden!
1191 if ( GetViewShell() )
1192 GetViewShell()->DiscardClients_Impl();
1193 Broadcast( SfxSimpleHint( SFX_HINT_DYING ) );
1194
1195 if (SfxViewFrame::Current() == this)
1196 SfxViewFrame::SetViewFrame( NULL );
1197
1198 // Da der Dispatcher leer ger"aumt wird, kann man ihn auch nicht mehr
1199 // vern"unftig verwenden - also besser still legen
1200 GetDispatcher()->Lock(sal_True);
1201 delete this;
1202
1203 return sal_True;
1204 }
1205
1206 //--------------------------------------------------------------------
1207
DoActivate(sal_Bool bUI,SfxViewFrame * pOldFrame)1208 void SfxViewFrame::DoActivate( sal_Bool bUI, SfxViewFrame* pOldFrame )
1209 {
1210 DBG_CHKTHIS(SfxViewFrame, 0);
1211 SFX_APP();
1212
1213 pDispatcher->DoActivate_Impl( bUI, pOldFrame );
1214
1215 // Wenn ich einen parent habe und dieser ist kein parent des alten
1216 // ViewFrames, erh"alt er ein ParentActivate
1217 if ( bUI )
1218 {
1219 /*
1220 SfxMedium* pMed = GetObjectShell() ? GetObjectShell()->GetMedium() : NULL;
1221 if( pMed )
1222 {
1223 SFX_ITEMSET_ARG(
1224 pMed->GetItemSet(), pInterceptorItem, SfxSlotInterceptorItem,
1225 SID_INTERCEPTOR, sal_False );
1226 if( pInterceptorItem )
1227 {
1228 SfxSlotInterceptor* pInter = pInterceptorItem->GetValue();
1229 if( !pInter->GetBindings() )
1230 pInter->SetBindings( &GetBindings() );
1231 pInter->Activate( sal_True );
1232 }
1233 }
1234 */
1235 SfxViewFrame *pFrame = GetParentViewFrame();
1236 while ( pFrame )
1237 {
1238 if ( !pOldFrame || !pOldFrame->GetFrame().IsParent( &pFrame->GetFrame() ) )
1239 pFrame->pDispatcher->DoParentActivate_Impl();
1240 pFrame = pFrame->GetParentViewFrame();
1241 }
1242 }
1243 }
1244
1245 //--------------------------------------------------------------------
DoDeactivate(sal_Bool bUI,SfxViewFrame * pNewFrame)1246 void SfxViewFrame::DoDeactivate(sal_Bool bUI, SfxViewFrame* pNewFrame )
1247 {
1248 DBG_CHKTHIS(SfxViewFrame, 0);
1249 SFX_APP();
1250 pDispatcher->DoDeactivate_Impl( bUI, pNewFrame );
1251
1252 // Wenn ich einen parent habe und dieser ist kein parent des neuen
1253 // ViewFrames, erh"alt er ein ParentDeactivate
1254 if ( bUI )
1255 {
1256 // if ( GetFrame().GetWorkWindow_Impl() )
1257 // GetFrame().GetWorkWindow_Impl()->SaveStatus_Impl();
1258 /*
1259 SfxMedium* pMed = GetObjectShell() ? GetObjectShell()->GetMedium() : NULL;
1260 if( pMed )
1261 {
1262 SFX_ITEMSET_ARG(
1263 pMed->GetItemSet(), pInterceptorItem, SfxSlotInterceptorItem,
1264 SID_INTERCEPTOR, sal_False );
1265 if( pInterceptorItem )
1266 pInterceptorItem->GetValue()->Activate( sal_False );
1267 }
1268 */
1269 SfxViewFrame *pFrame = GetParentViewFrame();
1270 while ( pFrame )
1271 {
1272 if ( !pNewFrame || !pNewFrame->GetFrame().IsParent( &pFrame->GetFrame() ) )
1273 pFrame->pDispatcher->DoParentDeactivate_Impl();
1274 pFrame = pFrame->GetParentViewFrame();
1275 }
1276 }
1277 }
1278
1279 //------------------------------------------------------------------------
InvalidateBorderImpl(const SfxViewShell * pSh)1280 void SfxViewFrame::InvalidateBorderImpl( const SfxViewShell* pSh )
1281 {
1282 if( pSh && !nAdjustPosPixelLock )
1283 {
1284 if ( GetViewShell() && GetWindow().IsVisible() )
1285 {
1286 if ( GetFrame().IsInPlace() )
1287 {
1288 /*
1289 Size aSize( GetViewShell()->GetWindow()->GetSizePixel() );
1290
1291 //Size aBorderSz( pEnv->GetBorderWin()->GetHatchBorderPixel() );
1292 Point aOfs; //( aBorderSz.Width(), aBorderSz.Height() );
1293
1294 DoAdjustPosSizePixel( GetViewShell(), aOfs, aSize );*/
1295 return;
1296 }
1297
1298 DoAdjustPosSizePixel( (SfxViewShell *) GetViewShell(), Point(),
1299 GetWindow().GetOutputSizePixel() );
1300 }
1301 }
1302 }
1303
1304 //------------------------------------------------------------------------
SetBorderPixelImpl(const SfxViewShell * pVSh,const SvBorder & rBorder)1305 sal_Bool SfxViewFrame::SetBorderPixelImpl
1306 (
1307 const SfxViewShell* pVSh,
1308 const SvBorder& rBorder
1309 )
1310
1311 {
1312 pImp->aBorder = rBorder;
1313
1314 if ( IsResizeInToOut_Impl() && !GetFrame().IsInPlace() )
1315 {
1316 Size aSize = pVSh->GetWindow()->GetOutputSizePixel();
1317 if ( aSize.Width() && aSize.Height() )
1318 {
1319 aSize.Width() += rBorder.Left() + rBorder.Right();
1320 aSize.Height() += rBorder.Top() + rBorder.Bottom();
1321
1322 Size aOldSize = GetWindow().GetOutputSizePixel();
1323 GetWindow().SetOutputSizePixel( aSize );
1324 Window* pParent = &GetWindow();
1325 while ( pParent->GetParent() )
1326 pParent = pParent->GetParent();
1327 Size aOuterSize = pParent->GetOutputSizePixel();
1328 aOuterSize.Width() += ( aSize.Width() - aOldSize.Width() );
1329 aOuterSize.Height() += ( aSize.Height() - aOldSize.Height() );
1330 pParent->SetOutputSizePixel( aOuterSize );
1331 }
1332 }
1333 else
1334 {
1335 Point aPoint;
1336 Rectangle aEditArea( aPoint, GetWindow().GetOutputSizePixel() );
1337 aEditArea.Left() += rBorder.Left();
1338 aEditArea.Right() -= rBorder.Right();
1339 aEditArea.Top() += rBorder.Top();
1340 aEditArea.Bottom() -= rBorder.Bottom();
1341 pVSh->GetWindow()->SetPosSizePixel( aEditArea.TopLeft(), aEditArea.GetSize() );
1342 }
1343
1344 return sal_True;
1345 }
1346
1347 //------------------------------------------------------------------------
GetBorderPixelImpl(const SfxViewShell *) const1348 const SvBorder& SfxViewFrame::GetBorderPixelImpl
1349 (
1350 const SfxViewShell* /*pSh*/
1351 ) const
1352
1353 {
1354 return pImp->aBorder;
1355 }
1356
1357 //--------------------------------------------------------------------
Notify(SfxBroadcaster &,const SfxHint & rHint)1358 void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
1359 {
1360 {DBG_CHKTHIS(SfxViewFrame, 0);}
1361
1362 if( IsDowning_Impl())
1363 return;
1364
1365 // we know only SimpleHints
1366 if ( rHint.IsA(TYPE(SfxSimpleHint)) )
1367 {
1368 switch( ( (SfxSimpleHint&) rHint ).GetId() )
1369 {
1370 case SFX_HINT_MODECHANGED:
1371 {
1372 UpdateTitle();
1373
1374 if ( !xObjSh.Is() )
1375 break;
1376
1377 // r/o Umschaltung?
1378 SfxBindings& rBind = GetBindings();
1379 rBind.Invalidate( SID_RELOAD );
1380 SfxDispatcher *pDispat = GetDispatcher();
1381 sal_Bool bWasReadOnly = pDispat->GetReadOnly_Impl();
1382 sal_Bool bIsReadOnly = xObjSh->IsReadOnly();
1383 if ( !bWasReadOnly != !bIsReadOnly )
1384 {
1385 // Dann auch TITLE_CHANGED
1386 UpdateTitle();
1387 rBind.Invalidate( SID_FILE_NAME );
1388 rBind.Invalidate( SID_DOCINFO_TITLE );
1389 rBind.Invalidate( SID_EDITDOC );
1390
1391 pDispat->GetBindings()->InvalidateAll(sal_True);
1392 pDispat->SetReadOnly_Impl( bIsReadOnly );
1393
1394 // Dispatcher-Update nur erzwingen, wenn es nicht sowieso
1395 // demn"achst kommt, anderenfalls ist Zappelei oder gar
1396 // GPF m"oglich, da Writer z.B. gerne mal im Resize irgendwelche
1397 // Aktionen t"atigt, die ein SetReadOnlyUI am Dispatcher zur
1398 // Folge haben!
1399 if ( pDispat->IsUpdated_Impl() )
1400 pDispat->Update_Impl(sal_True);
1401 }
1402
1403 Enable( !xObjSh->IsInModalMode() );
1404 break;
1405 }
1406
1407 case SFX_HINT_TITLECHANGED:
1408 {
1409 UpdateTitle();
1410 SfxBindings& rBind = GetBindings();
1411 rBind.Invalidate( SID_FILE_NAME );
1412 rBind.Invalidate( SID_DOCINFO_TITLE );
1413 rBind.Invalidate( SID_EDITDOC );
1414 rBind.Invalidate( SID_RELOAD );
1415 break;
1416 }
1417
1418 case SFX_HINT_DEINITIALIZING:
1419 GetFrame().DoClose();
1420 break;
1421 case SFX_HINT_DYING:
1422 // when the Object is being deleted, destroy the view too
1423 if ( xObjSh.Is() )
1424 ReleaseObjectShell_Impl();
1425 else
1426 GetFrame().DoClose();
1427 break;
1428
1429 }
1430 }
1431 else if ( rHint.IsA(TYPE(SfxEventHint)) )
1432 {
1433 // Wenn das Document asynchron geladen wurde, wurde der Dispatcher
1434 // auf ReadOnly gesetzt, was zur"?ckgenommen werden mu\s, wenn
1435 // das Document selbst nicht ReadOnly ist und das Laden fertig ist.
1436 switch ( ((SfxEventHint&)rHint).GetEventId() )
1437 {
1438 case SFX_EVENT_MODIFYCHANGED:
1439 {
1440 SfxBindings& rBind = GetBindings();
1441 rBind.Invalidate( SID_DOC_MODIFIED );
1442 rBind.Invalidate( SID_SAVEDOC );
1443 rBind.Invalidate( SID_RELOAD );
1444 rBind.Invalidate( SID_EDITDOC );
1445 break;
1446 }
1447
1448 case SFX_EVENT_OPENDOC:
1449 case SFX_EVENT_CREATEDOC:
1450 {
1451 if ( !xObjSh.Is() )
1452 break;
1453
1454 SfxBindings& rBind = GetBindings();
1455 rBind.Invalidate( SID_RELOAD );
1456 rBind.Invalidate( SID_EDITDOC );
1457 if ( !xObjSh->IsReadOnly() )
1458 {
1459 // Im Gegensatz zu oben (TITLE_CHANGED) mu\s das UI nicht
1460 // upgedated werden, da es nicht gehidet war!
1461
1462 // #i21560# InvalidateAll() causes the assertion
1463 // 'SfxBindings::Invalidate while in update" when
1464 // the sfx slot SID_BASICIDE_APPEAR is executed
1465 // via API from another thread (Java).
1466 // According to MBA this call is not necessary anymore,
1467 // because each document has its own SfxBindings.
1468 //
1469 //GetDispatcher()->GetBindings()->InvalidateAll(sal_True);
1470 }
1471
1472 break;
1473 }
1474
1475 case SFX_EVENT_TOGGLEFULLSCREENMODE:
1476 {
1477 if ( GetFrame().OwnsBindings_Impl() )
1478 GetBindings().GetDispatcher_Impl()->Update_Impl( sal_True );
1479 break;
1480 }
1481 }
1482 }
1483 }
1484
1485 //------------------------------------------------------------------------
Construct_Impl(SfxObjectShell * pObjSh)1486 void SfxViewFrame::Construct_Impl( SfxObjectShell *pObjSh )
1487 {
1488 pImp->bResizeInToOut = sal_True;
1489 pImp->bDontOverwriteResizeInToOut = sal_False;
1490 pImp->bObjLocked = sal_False;
1491 pImp->pFocusWin = 0;
1492 pImp->pActiveChild = NULL;
1493 pImp->nCurViewId = 0;
1494 pImp->bReloading = sal_False;
1495 pImp->bIsDowning = sal_False;
1496 pImp->bModal = sal_False;
1497 pImp->bEnabled = sal_True;
1498 pImp->nDocViewNo = 0;
1499 pImp->aMargin = Size( -1, -1 );
1500 pImp->pWindow = 0;
1501
1502 SetPool( &SFX_APP()->GetPool() );
1503 pDispatcher = new SfxDispatcher(this);
1504 if ( !GetBindings().GetDispatcher() )
1505 GetBindings().SetDispatcher( pDispatcher );
1506
1507 xObjSh = pObjSh;
1508 if ( xObjSh.Is() && xObjSh->IsPreview() )
1509 SetQuietMode_Impl( sal_True );
1510
1511 if ( pObjSh )
1512 {
1513 pDispatcher->Push( *SFX_APP() );
1514 SfxModule* pModule = xObjSh->GetModule();
1515 if( pModule )
1516 pDispatcher->Push( *pModule );
1517 pDispatcher->Push( *this );
1518 pDispatcher->Push( *pObjSh );
1519 pDispatcher->Flush();
1520 StartListening( *pObjSh );
1521 pObjSh->ViewAssigned();
1522 Notify( *pObjSh, SfxSimpleHint(SFX_HINT_TITLECHANGED) );
1523 Notify( *pObjSh, SfxSimpleHint(SFX_HINT_DOCCHANGED) );
1524 pDispatcher->SetReadOnly_Impl( pObjSh->IsReadOnly() );
1525 }
1526 else
1527 {
1528 pDispatcher->Push( *SFX_APP() );
1529 pDispatcher->Push( *this );
1530 pDispatcher->Flush();
1531 }
1532
1533 SfxViewFrame *pThis = this; // wegen der kranken Array-Syntax
1534 SfxViewFrameArr_Impl &rViewArr = SFX_APP()->GetViewFrames_Impl();
1535 rViewArr.C40_INSERT(SfxViewFrame, pThis, rViewArr.Count() );
1536 }
1537
SfxViewFrame(SfxFrame & rFrame,SfxObjectShell * pObjShell)1538 SfxViewFrame::SfxViewFrame
1539 (
1540 SfxFrame& rFrame,
1541 SfxObjectShell* pObjShell
1542 )
1543
1544 /* [Beschreibung]
1545
1546 Ctor des SfxViewFrame f"ur eine <SfxObjectShell> aus der Ressource.
1547 Die 'nViewId' der zu erzeugenden <SfxViewShell> kann angegeben werden
1548 (default ist die zuerst registrierte SfxViewShell-Subklasse).
1549 */
1550
1551 : pImp( new SfxViewFrame_Impl( rFrame ) )
1552 , pDispatcher(0)
1553 , pBindings( new SfxBindings )
1554 , nAdjustPosPixelLock( 0 )
1555 {
1556 DBG_CTOR( SfxViewFrame, NULL );
1557
1558 rFrame.SetCurrentViewFrame_Impl( this );
1559 rFrame.SetFrameType_Impl( GetFrameType() | SFXFRAME_HASTITLE );
1560 Construct_Impl( pObjShell );
1561
1562 pImp->pWindow = new SfxFrameViewWindow_Impl( this, rFrame.GetWindow() );
1563 pImp->pWindow->SetSizePixel( rFrame.GetWindow().GetOutputSizePixel() );
1564 rFrame.SetOwnsBindings_Impl( sal_True );
1565 rFrame.CreateWorkWindow_Impl();
1566 }
1567
1568 //------------------------------------------------------------------------
~SfxViewFrame()1569 SfxViewFrame::~SfxViewFrame()
1570 {
1571 DBG_DTOR(SfxViewFrame, 0);
1572
1573 SetDowning_Impl();
1574
1575 if ( SfxViewFrame::Current() == this )
1576 SfxViewFrame::SetViewFrame( NULL );
1577
1578 ReleaseObjectShell_Impl();
1579
1580 if ( GetFrame().OwnsBindings_Impl() )
1581 // Die Bindings l"oscht der Frame!
1582 KillDispatcher_Impl();
1583
1584 delete pImp->pWindow;
1585
1586 if ( GetFrame().GetCurrentViewFrame() == this )
1587 GetFrame().SetCurrentViewFrame_Impl( NULL );
1588
1589 // von Frame-Liste abmelden
1590 SfxApplication *pSfxApp = SFX_APP();
1591 SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1592 const SfxViewFrame *pThis = this;
1593 rFrames.Remove( rFrames.GetPos(pThis) );
1594
1595 // Member l"oschen
1596 KillDispatcher_Impl();
1597
1598 delete pImp;
1599 }
1600
1601 //------------------------------------------------------------------------
KillDispatcher_Impl()1602 void SfxViewFrame::KillDispatcher_Impl()
1603
1604 // Dispatcher abr"aumen und l"oschen
1605
1606 {
1607 DBG_CHKTHIS(SfxViewFrame, 0);
1608
1609 SfxModule* pModule = xObjSh.Is() ? xObjSh->GetModule() : 0;
1610 if ( xObjSh.Is() )
1611 ReleaseObjectShell_Impl();
1612 if ( pDispatcher )
1613 {
1614 if( pModule )
1615 pDispatcher->Pop( *pModule, SFX_SHELL_POP_UNTIL );
1616 else
1617 pDispatcher->Pop( *this );
1618 DELETEZ(pDispatcher);
1619 }
1620 }
1621
1622 //------------------------------------------------------------------------
Current()1623 SfxViewFrame* SfxViewFrame::Current()
1624 {
1625 return SfxApplication::Get() ? SFX_APP()->Get_Impl()->pViewFrame : NULL;
1626 }
1627
1628 //--------------------------------------------------------------------
Count()1629 sal_uInt16 SfxViewFrame::Count()
1630
1631 /* [Beschreibung]
1632
1633 Liefert die Anzahl der sichtbaren <SfxViewFrame>-Instanzen.
1634 */
1635
1636 {
1637 SfxApplication *pSfxApp = SFX_APP();
1638 SfxViewFrameArr_Impl& rFrames = pSfxApp->GetViewFrames_Impl();
1639 const sal_uInt16 nCount = rFrames.Count();
1640 sal_uInt16 nFound = 0;
1641 for ( sal_uInt16 i = 0; i < nCount; ++i )
1642 {
1643 SfxViewFrame *pFrame = rFrames[i];
1644 if ( pFrame->IsVisible() )
1645 ++nFound;
1646 }
1647 return nFound;
1648 }
1649
1650 //--------------------------------------------------------------------
1651 // returns the first window of spec. type viewing the specified doc.
GetFirst(const SfxObjectShell * pDoc,sal_Bool bOnlyIfVisible)1652 SfxViewFrame* SfxViewFrame::GetFirst
1653 (
1654 const SfxObjectShell* pDoc,
1655 sal_Bool bOnlyIfVisible
1656 )
1657 {
1658 SfxApplication *pSfxApp = SFX_APP();
1659 SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1660
1661 // search for a SfxDocument of the specified type
1662 for ( sal_uInt16 nPos = 0; nPos < rFrames.Count(); ++nPos )
1663 {
1664 SfxViewFrame *pFrame = rFrames.GetObject(nPos);
1665 if ( ( !pDoc || pDoc == pFrame->GetObjectShell() )
1666 && ( !bOnlyIfVisible || pFrame->IsVisible() )
1667 )
1668 return pFrame;
1669 }
1670
1671 return 0;
1672 }
1673 //--------------------------------------------------------------------
1674
1675 // returns thenext window of spec. type viewing the specified doc.
GetNext(const SfxViewFrame & rPrev,const SfxObjectShell * pDoc,sal_Bool bOnlyIfVisible)1676 SfxViewFrame* SfxViewFrame::GetNext
1677 (
1678 const SfxViewFrame& rPrev,
1679 const SfxObjectShell* pDoc,
1680 sal_Bool bOnlyIfVisible
1681 )
1682 {
1683 SfxApplication *pSfxApp = SFX_APP();
1684 SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1685
1686 // refind the specified predecessor
1687 sal_uInt16 nPos;
1688 for ( nPos = 0; nPos < rFrames.Count(); ++nPos )
1689 if ( rFrames.GetObject(nPos) == &rPrev )
1690 break;
1691
1692 // search for a Frame of the specified type
1693 for ( ++nPos; nPos < rFrames.Count(); ++nPos )
1694 {
1695 SfxViewFrame *pFrame = rFrames.GetObject(nPos);
1696 if ( ( !pDoc || pDoc == pFrame->GetObjectShell() )
1697 && ( !bOnlyIfVisible || pFrame->IsVisible() )
1698 )
1699 return pFrame;
1700 }
1701 return 0;
1702 }
1703
CloseHiddenFrames_Impl()1704 void SfxViewFrame::CloseHiddenFrames_Impl()
1705 {
1706 SfxApplication *pSfxApp = SFX_APP();
1707 SfxViewFrameArr_Impl &rFrames = pSfxApp->GetViewFrames_Impl();
1708 for ( sal_uInt16 nPos=0; nPos<rFrames.Count(); )
1709 {
1710 SfxViewFrame *pFrame = rFrames.GetObject(nPos);
1711 if ( !pFrame->IsVisible() )
1712 pFrame->DoClose();
1713 else
1714 nPos++;
1715 }
1716 }
1717
1718 //--------------------------------------------------------------------
GetProgress() const1719 SfxProgress* SfxViewFrame::GetProgress() const
1720 {
1721 SfxObjectShell *pObjSh = GetObjectShell();
1722 return pObjSh ? pObjSh->GetProgress() : 0;
1723 }
1724
1725 //--------------------------------------------------------------------
ShowStatusText(const String &)1726 void SfxViewFrame::ShowStatusText( const String& /*rText*/)
1727 {
1728 /* OBSOLETE: If this is used, framework/uielement/progressbarwrapper.[h|c]xx &
1729 framework/uielement/statusindicatorinterfacewrapper.[h|c]xx must be
1730 extended to support a new interface to support ShowStatusText/HideStatusText
1731 SfxWorkWindow* pWorkWin = GetFrame().GetWorkWindow_Impl();
1732 SfxStatusBarManager *pMgr = pWorkWin->GetStatusBarManager_Impl();
1733 if ( pMgr )
1734 {
1735 pMgr->GetStatusBar()->HideItems();
1736 pMgr->GetStatusBar()->SetText( rText );
1737 }
1738 */
1739 }
1740
1741 //--------------------------------------------------------------------
HideStatusText()1742 void SfxViewFrame::HideStatusText()
1743 {
1744 /* OBSOLETE: If this is used, framework/uielement/progressbarwrapper.[h|c]xx &
1745 framework/uielement/statusindicatorinterfacewrapper.[h|c]xx must be
1746 extended to support a new interface to support ShowStatusText/HideStatusText
1747 SfxWorkWindow* pWorkWin = GetFrame().GetWorkWindow_Impl();
1748 SfxStatusBarManager *pMgr = pWorkWin->GetStatusBarManager_Impl();
1749 if ( pMgr )
1750 pMgr->GetStatusBar()->ShowItems();
1751 */
1752 }
1753
1754
1755 //--------------------------------------------------------------------
1756 #ifdef ENABLE_INIMANAGER//MUSTINI
GetIniManager() const1757 SfxIniManager* SfxViewFrame::GetIniManager() const
1758 {
1759 /* SfxIniManager *pIniMgr = GetObjectShell()
1760 ? GetObjectShell()->GetFactory().GetIniManager()
1761 : 0;
1762 if ( !pIniMgr )*/ //!
1763 return SFX_APP()->GetAppIniManager();
1764 // return pIniMgr;
1765 }
1766 #endif
1767
1768 //--------------------------------------------------------------------
DoAdjustPosSizePixel(SfxViewShell * pSh,const Point & rPos,const Size & rSize)1769 void SfxViewFrame::DoAdjustPosSizePixel //! teilen in Inner.../Outer...
1770 (
1771 SfxViewShell* pSh,
1772 const Point& rPos,
1773 const Size& rSize
1774 )
1775 {
1776 DBG_CHKTHIS(SfxViewFrame, 0);
1777
1778 // Components benutzen diese Methode nicht!
1779 if( pSh && pSh->GetWindow() && !nAdjustPosPixelLock )
1780 {
1781 nAdjustPosPixelLock++;
1782 if ( pImp->bResizeInToOut )
1783 pSh->InnerResizePixel( rPos, rSize );
1784 else
1785 pSh->OuterResizePixel( rPos, rSize );
1786 nAdjustPosPixelLock--;
1787 }
1788 }
1789
1790 //========================================================================
1791
operator ==(const SfxPoolItem & rItem) const1792 int SfxViewFrameItem::operator==( const SfxPoolItem &rItem ) const
1793 {
1794 return PTR_CAST(SfxViewFrameItem, &rItem)->pFrame== pFrame;
1795 }
1796
1797 //--------------------------------------------------------------------
GetValueText() const1798 String SfxViewFrameItem::GetValueText() const
1799 {
1800 return String();
1801 }
1802
1803 //--------------------------------------------------------------------
Clone(SfxItemPool *) const1804 SfxPoolItem* SfxViewFrameItem::Clone( SfxItemPool *) const
1805 {
1806 return new SfxViewFrameItem( pFrame);
1807 }
1808
1809 //--------------------------------------------------------------------
SetViewShell_Impl(SfxViewShell * pVSh)1810 void SfxViewFrame::SetViewShell_Impl( SfxViewShell *pVSh )
1811
1812 /* [Beschreibung]
1813
1814 Interne Methode zum setzen der jeweils aktuellen <SfxViewShell>-Instanz,
1815 die in diesem SfxViewFrame aktiv ist.
1816 */
1817
1818 {
1819 SfxShell::SetViewShell_Impl( pVSh );
1820
1821 // Hack: InPlaceMode
1822 if ( pVSh )
1823 pImp->bResizeInToOut = sal_False;
1824 }
1825
1826 //--------------------------------------------------------------------
1827 /*
1828 Beschreibung:
1829 Der ParentViewFrame ist der ViewFrame des Containers bei internem InPlace
1830 */
1831
1832 //TODO/LATER: is it still necessary? is there a replacement for GetParentViewFrame_Impl?
GetParentViewFrame_Impl() const1833 SfxViewFrame* SfxViewFrame::GetParentViewFrame_Impl() const
1834 {
1835 return NULL;
1836 }
1837
1838 //--------------------------------------------------------------------
ForceOuterResize_Impl(sal_Bool bOn)1839 void SfxViewFrame::ForceOuterResize_Impl(sal_Bool bOn)
1840 {
1841 if ( !pImp->bDontOverwriteResizeInToOut )
1842 pImp->bResizeInToOut = !bOn;
1843 }
1844
ForceInnerResize_Impl(sal_Bool bOn)1845 void SfxViewFrame::ForceInnerResize_Impl(sal_Bool bOn)
1846 {
1847 pImp->bDontOverwriteResizeInToOut = bOn;
1848 }
1849
1850 //--------------------------------------------------------------------
IsResizeInToOut_Impl() const1851 sal_Bool SfxViewFrame::IsResizeInToOut_Impl() const
1852 {
1853 return pImp->bResizeInToOut;
1854 }
1855 //--------------------------------------------------------------------
DoAdjustPosSize(SfxViewShell * pSh,const Point rPos,const Size & rSize)1856 void SfxViewFrame::DoAdjustPosSize( SfxViewShell *pSh,
1857 const Point rPos, const Size &rSize )
1858 {
1859 DBG_CHKTHIS(SfxViewFrame, 0);
1860 if( pSh && !nAdjustPosPixelLock )
1861 {
1862 Window *pWindow = pSh->GetWindow();
1863 Point aPos = pWindow->LogicToPixel(rPos);
1864 Size aSize = pWindow->LogicToPixel(rSize);
1865 DoAdjustPosSizePixel(pSh, aPos, aSize);
1866 }
1867 }
1868
1869 //--------------------------------------------------------------------
GetDocNumber_Impl()1870 void SfxViewFrame::GetDocNumber_Impl()
1871 {
1872 DBG_ASSERT( GetObjectShell(), "Kein Dokument!" );
1873 GetObjectShell()->SetNamedVisibility_Impl();
1874 pImp->nDocViewNo = GetObjectShell()->GetNoSet_Impl().GetFreeIndex()+1;
1875 }
1876
1877 //--------------------------------------------------------------------
1878
Enable(sal_Bool bEnable)1879 void SfxViewFrame::Enable( sal_Bool bEnable )
1880 {
1881 if ( bEnable != pImp->bEnabled )
1882 {
1883 pImp->bEnabled = bEnable;
1884
1885 // e.g. InPlace-Frames have a parent...
1886 SfxViewFrame *pParent = GetParentViewFrame_Impl();
1887 if ( pParent )
1888 {
1889 pParent->Enable( bEnable );
1890 }
1891 else
1892 {
1893 Window *pWindow = &GetFrame().GetTopFrame().GetWindow();
1894 if ( !bEnable )
1895 pImp->bWindowWasEnabled = pWindow->IsInputEnabled();
1896 if ( !bEnable || pImp->bWindowWasEnabled )
1897 pWindow->EnableInput( bEnable, sal_True );
1898 }
1899
1900 // cursor and focus
1901 SfxViewShell* pViewSh = GetViewShell();
1902 if ( bEnable )
1903 {
1904 // show cursor
1905 if ( pViewSh )
1906 pViewSh->ShowCursor();
1907 }
1908 else
1909 {
1910 // hide cursor
1911 if ( pViewSh )
1912 pViewSh->ShowCursor(sal_False);
1913 }
1914 /*
1915 if ( !bEnable )
1916 GetBindings().ENTERREGISTRATIONS();
1917 GetDispatcher()->Lock( !bEnable );
1918 if ( bEnable )
1919 GetBindings().LEAVEREGISTRATIONS();
1920 */
1921 }
1922 }
1923
1924 //--------------------------------------------------------------------
Show()1925 void SfxViewFrame::Show()
1926
1927 /* [Beschreibung]
1928
1929 Diese Methode macht das Frame-Window sichtbar und ermittelt vorher
1930 den Fenstername. Au\serdem wird das Dokument festgehalten. Man darf
1931 i.d.R. nie das Window direkt showen!
1932 */
1933
1934 {
1935 // zuerst locken damit in UpdateTitle() gilt: IsVisible() == sal_True (:#)
1936 if ( xObjSh.Is() )
1937 {
1938 xObjSh->GetMedium()->GetItemSet()->ClearItem( SID_HIDDEN );
1939 if ( !pImp->bObjLocked )
1940 LockObjectShell_Impl( sal_True );
1941
1942 // Doc-Shell Titel-Nummer anpassen, get unique view-no
1943 if ( 0 == pImp->nDocViewNo )
1944 {
1945 GetDocNumber_Impl();
1946 UpdateTitle();
1947 }
1948 }
1949 else
1950 UpdateTitle();
1951
1952 // Frame-Window anzeigen, aber nur wenn der ViewFrame kein eigenes Window
1953 // hat oder wenn er keine Component enth"alt
1954 if ( &GetWindow() == &GetFrame().GetWindow() || !GetFrame().HasComponent() )
1955 GetWindow().Show();
1956 GetFrame().GetWindow().Show();
1957
1958 /* SfxViewFrame* pCurrent = SfxViewFrame::Current();
1959 if ( GetFrame().GetFrameInterface()->isActive() &&
1960 pCurrent != this &&
1961 ( !pCurrent || pCurrent->GetParentViewFrame_Impl() != this ) &&
1962 !GetActiveChildFrame_Impl() )
1963 MakeActive_Impl( sal_False );*/
1964 if ( xObjSh.Is() && xObjSh->Get_Impl()->bHiddenLockedByAPI )
1965 {
1966 xObjSh->Get_Impl()->bHiddenLockedByAPI = sal_False;
1967 xObjSh->OwnerLock(sal_False);
1968 }
1969 }
1970
1971 //--------------------------------------------------------------------
IsVisible() const1972 sal_Bool SfxViewFrame::IsVisible() const
1973 {
1974 return pImp->bObjLocked;
1975 }
1976
1977 //--------------------------------------------------------------------
Hide()1978 void SfxViewFrame::Hide()
1979 {
1980 GetWindow().Hide();
1981 if ( pImp->bObjLocked )
1982 LockObjectShell_Impl( sal_False );
1983 }
1984
1985 //--------------------------------------------------------------------
LockObjectShell_Impl(sal_Bool bLock)1986 void SfxViewFrame::LockObjectShell_Impl( sal_Bool bLock )
1987 {
1988 DBG_ASSERT( pImp->bObjLocked != bLock, "Falscher Locked-Status!" );
1989
1990 DBG_ASSERT( GetObjectShell(), "Kein Dokument!" );
1991 GetObjectShell()->OwnerLock(bLock);
1992 pImp->bObjLocked = bLock;
1993 }
1994
1995 //--------------------------------------------------------------------
MakeActive_Impl(sal_Bool bGrabFocus)1996 void SfxViewFrame::MakeActive_Impl( sal_Bool bGrabFocus )
1997 {
1998 if ( GetViewShell() && !GetFrame().IsClosing_Impl() )
1999 {
2000 if ( IsVisible() )
2001 {
2002 if ( GetViewShell() )
2003 {
2004 sal_Bool bPreview = sal_False;
2005 if ( GetObjectShell()->IsPreview() )
2006 {
2007 bPreview = sal_True;
2008 }
2009 else
2010 {
2011 SfxViewFrame* pParent = GetParentViewFrame();
2012 if ( pParent )
2013 pParent->SetActiveChildFrame_Impl( this );
2014 }
2015
2016 SfxViewFrame* pCurrent = SfxViewFrame::Current();
2017 css::uno::Reference< css::frame::XFrame > xFrame = GetFrame().GetFrameInterface();
2018 if ( !bPreview )
2019 {
2020 SetViewFrame( this );
2021 GetBindings().SetActiveFrame( css::uno::Reference< css::frame::XFrame >() );
2022 uno::Reference< frame::XFramesSupplier > xSupp( xFrame, uno::UNO_QUERY );
2023 if ( xSupp.is() )
2024 xSupp->setActiveFrame( uno::Reference < frame::XFrame >() );
2025
2026 css::uno::Reference< css::awt::XWindow > xContainerWindow = xFrame->getContainerWindow();
2027 Window* pWindow = VCLUnoHelper::GetWindow(xContainerWindow);
2028 if (pWindow && pWindow->HasChildPathFocus() && bGrabFocus)
2029 {
2030 SfxInPlaceClient *pCli = GetViewShell()->GetUIActiveClient();
2031 if ( ( !pCli || !pCli->IsObjectUIActive() ) &&
2032 ( !pCurrent || pCurrent->GetParentViewFrame_Impl() != this ) )
2033 GetFrame().GrabFocusOnComponent_Impl();
2034 }
2035 }
2036 else
2037 {
2038 GetBindings().SetDispatcher( GetDispatcher() );
2039 GetBindings().SetActiveFrame( ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > () );
2040 GetDispatcher()->Update_Impl( sal_False );
2041 }
2042 }
2043 }
2044 }
2045 }
2046
2047 //-------------------------------------------------------------------------
2048
SetQuietMode_Impl(sal_Bool bOn)2049 void SfxViewFrame::SetQuietMode_Impl( sal_Bool bOn )
2050 {
2051 GetDispatcher()->SetQuietMode_Impl( bOn );
2052 }
2053
2054 //-------------------------------------------------------------------------
2055
GetObjectShell()2056 SfxObjectShell* SfxViewFrame::GetObjectShell()
2057 {
2058 return xObjSh;
2059 }
2060
GetMargin_Impl() const2061 const Size& SfxViewFrame::GetMargin_Impl() const
2062 {
2063 return pImp->aMargin;
2064 }
2065
SetActiveChildFrame_Impl(SfxViewFrame * pViewFrame)2066 void SfxViewFrame::SetActiveChildFrame_Impl( SfxViewFrame *pViewFrame )
2067 {
2068 if ( pViewFrame != pImp->pActiveChild )
2069 {
2070 if ( !pImp->pActiveChild )
2071 GetDispatcher()->LockUI_Impl( sal_False );
2072
2073 pImp->pActiveChild = pViewFrame;
2074
2075 Reference< XFramesSupplier > xFrame( GetFrame().GetFrameInterface(), UNO_QUERY );
2076 Reference< XFrame > xActive;
2077 if ( pViewFrame )
2078 xActive = pViewFrame->GetFrame().GetFrameInterface();
2079
2080 if ( xFrame.is() ) // PB: #74432# xFrame cann be NULL
2081 xFrame->setActiveFrame( xActive );
2082 }
2083 }
2084
GetActiveChildFrame_Impl() const2085 SfxViewFrame* SfxViewFrame::GetActiveChildFrame_Impl() const
2086 {
2087 SfxViewFrame *pViewFrame = pImp->pActiveChild;
2088 /*
2089 if ( !pViewFrame )
2090 {
2091 // Wenn es keinen aktiven ChildFrame gibt, irgendeinen nehmen
2092 for ( sal_uInt16 n=0; n<GetChildFrameCount(); n++ )
2093 {
2094 pViewFrame =
2095 PTR_CAST( SfxViewFrame, GetChildFrame(n)->GetChildFrame(0) );
2096 if ( pViewFrame )
2097 break;
2098 }
2099 }
2100
2101 pImp->pActiveChild = pViewFrame;
2102 */
2103 return pViewFrame;
2104 }
2105
2106 //--------------------------------------------------------------------
LoadViewIntoFrame_Impl_NoThrow(const SfxObjectShell & i_rDoc,const Reference<XFrame> & i_rFrame,const sal_uInt16 i_nViewId,const bool i_bHidden)2107 SfxViewFrame* SfxViewFrame::LoadViewIntoFrame_Impl_NoThrow( const SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rFrame,
2108 const sal_uInt16 i_nViewId, const bool i_bHidden )
2109 {
2110 Reference< XFrame > xFrame( i_rFrame );
2111 bool bOwnFrame = false;
2112 SfxViewShell* pSuccessView = NULL;
2113 try
2114 {
2115 if ( !xFrame.is() )
2116 {
2117 ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2118 Reference < XFrame > xDesktop( aContext.createComponent( "com.sun.star.frame.Desktop" ), UNO_QUERY_THROW );
2119
2120 if ( !i_bHidden )
2121 {
2122 try
2123 {
2124 // if there is a backing component, use it
2125 Reference< XFramesSupplier > xTaskSupplier( xDesktop , css::uno::UNO_QUERY_THROW );
2126 ::framework::FrameListAnalyzer aAnalyzer( xTaskSupplier, Reference< XFrame >(), ::framework::FrameListAnalyzer::E_BACKINGCOMPONENT );
2127
2128 if ( aAnalyzer.m_xBackingComponent.is() )
2129 xFrame = aAnalyzer.m_xBackingComponent;
2130 }
2131 catch( uno::Exception& )
2132 {}
2133 }
2134
2135 if ( !xFrame.is() )
2136 xFrame.set( xDesktop->findFrame( DEFINE_CONST_UNICODE("_blank"), 0 ), UNO_SET_THROW );
2137
2138 bOwnFrame = true;
2139 }
2140
2141 pSuccessView = LoadViewIntoFrame_Impl(
2142 i_rDoc,
2143 xFrame,
2144 Sequence< PropertyValue >(), // means "reuse existing model's args"
2145 i_nViewId,
2146 i_bHidden
2147 );
2148
2149 if ( bOwnFrame && !i_bHidden )
2150 {
2151 // ensure the frame/window is visible
2152 Reference< XWindow > xContainerWindow( xFrame->getContainerWindow(), UNO_SET_THROW );
2153 xContainerWindow->setVisible( sal_True );
2154 }
2155 }
2156 catch( const Exception& )
2157 {
2158 DBG_UNHANDLED_EXCEPTION();
2159 }
2160
2161 if ( pSuccessView )
2162 return pSuccessView->GetViewFrame();
2163
2164 if ( bOwnFrame )
2165 {
2166 try
2167 {
2168 xFrame->dispose();
2169 }
2170 catch( const Exception& )
2171 {
2172 DBG_UNHANDLED_EXCEPTION();
2173 }
2174 }
2175
2176 return NULL;
2177 }
2178
2179 //--------------------------------------------------------------------
LoadViewIntoFrame_Impl(const SfxObjectShell & i_rDoc,const Reference<XFrame> & i_rFrame,const Sequence<PropertyValue> & i_rLoadArgs,const sal_uInt16 i_nViewId,const bool i_bHidden)2180 SfxViewShell* SfxViewFrame::LoadViewIntoFrame_Impl( const SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rFrame,
2181 const Sequence< PropertyValue >& i_rLoadArgs, const sal_uInt16 i_nViewId,
2182 const bool i_bHidden )
2183 {
2184 Reference< XModel > xDocument( i_rDoc.GetModel(), UNO_SET_THROW );
2185
2186 ::comphelper::NamedValueCollection aTransformLoadArgs( i_rLoadArgs.getLength() ? i_rLoadArgs : xDocument->getArgs() );
2187 aTransformLoadArgs.put( "Model", xDocument );
2188 if ( i_nViewId )
2189 aTransformLoadArgs.put( "ViewId", sal_Int16( i_nViewId ) );
2190 if ( i_bHidden )
2191 aTransformLoadArgs.put( "Hidden", i_bHidden );
2192 else
2193 aTransformLoadArgs.remove( "Hidden" );
2194
2195 ::rtl::OUString sURL( RTL_CONSTASCII_USTRINGPARAM( "private:object" ) );
2196 if ( !sURL.getLength() )
2197 sURL = i_rDoc.GetFactory().GetFactoryURL();
2198
2199 Reference< XComponentLoader > xLoader( i_rFrame, UNO_QUERY_THROW );
2200 xLoader->loadComponentFromURL( sURL, ::rtl::OUString::createFromAscii( "_self" ), 0,
2201 aTransformLoadArgs.getPropertyValues() );
2202
2203 SfxViewShell* pViewShell = SfxViewShell::Get( i_rFrame->getController() );
2204 ENSURE_OR_THROW( pViewShell,
2205 "SfxViewFrame::LoadViewIntoFrame_Impl: loading an SFX doc into a frame resulted in a non-SFX view - quite impossible" );
2206 return pViewShell;
2207 }
2208
2209 //--------------------------------------------------------------------
2210
LoadHiddenDocument(SfxObjectShell & i_rDoc,const sal_uInt16 i_nViewId)2211 SfxViewFrame* SfxViewFrame::LoadHiddenDocument( SfxObjectShell& i_rDoc, const sal_uInt16 i_nViewId )
2212 {
2213 return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, Reference< XFrame >(), i_nViewId, true );
2214 }
2215
2216 //--------------------------------------------------------------------
2217
LoadDocument(SfxObjectShell & i_rDoc,const sal_uInt16 i_nViewId)2218 SfxViewFrame* SfxViewFrame::LoadDocument( SfxObjectShell& i_rDoc, const sal_uInt16 i_nViewId )
2219 {
2220 return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, Reference< XFrame >(), i_nViewId, false );
2221 }
2222
2223 //--------------------------------------------------------------------
2224
LoadDocumentIntoFrame(SfxObjectShell & i_rDoc,const Reference<XFrame> & i_rTargetFrame,const sal_uInt16 i_nViewId)2225 SfxViewFrame* SfxViewFrame::LoadDocumentIntoFrame( SfxObjectShell& i_rDoc, const Reference< XFrame >& i_rTargetFrame, const sal_uInt16 i_nViewId )
2226 {
2227 return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, i_rTargetFrame, i_nViewId, false );
2228 }
2229
2230 //--------------------------------------------------------------------
2231
LoadDocumentIntoFrame(SfxObjectShell & i_rDoc,const SfxFrameItem * i_pFrameItem,const sal_uInt16 i_nViewId)2232 SfxViewFrame* SfxViewFrame::LoadDocumentIntoFrame( SfxObjectShell& i_rDoc, const SfxFrameItem* i_pFrameItem, const sal_uInt16 i_nViewId )
2233 {
2234 return LoadViewIntoFrame_Impl_NoThrow( i_rDoc, i_pFrameItem && i_pFrameItem->GetFrame() ? i_pFrameItem->GetFrame()->GetFrameInterface() : NULL, i_nViewId, false );
2235 }
2236
2237 //--------------------------------------------------------------------
DisplayNewDocument(SfxObjectShell & i_rDoc,const SfxRequest & i_rCreateDocRequest,const sal_uInt16 i_nViewId)2238 SfxViewFrame* SfxViewFrame::DisplayNewDocument( SfxObjectShell& i_rDoc, const SfxRequest& i_rCreateDocRequest, const sal_uInt16 i_nViewId )
2239 {
2240 SFX_REQUEST_ARG( i_rCreateDocRequest, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
2241 SFX_REQUEST_ARG( i_rCreateDocRequest, pHiddenItem, SfxBoolItem, SID_HIDDEN, sal_False );
2242
2243 return LoadViewIntoFrame_Impl_NoThrow(
2244 i_rDoc,
2245 pFrameItem ? pFrameItem->GetFrame() : NULL,
2246 i_nViewId,
2247 pHiddenItem ? pHiddenItem->GetValue() : false
2248 );
2249 }
2250
2251 //--------------------------------------------------------------------
2252
Get(const Reference<XController> & i_rController,const SfxObjectShell * i_pDoc)2253 SfxViewFrame* SfxViewFrame::Get( const Reference< XController>& i_rController, const SfxObjectShell* i_pDoc )
2254 {
2255 if ( !i_rController.is() )
2256 return NULL;
2257
2258 const SfxObjectShell* pDoc = i_pDoc;
2259 if ( !pDoc )
2260 {
2261 Reference< XModel > xDocument( i_rController->getModel() );
2262 for ( pDoc = SfxObjectShell::GetFirst( 0, false );
2263 pDoc;
2264 pDoc = SfxObjectShell::GetNext( *pDoc, 0, false )
2265 )
2266 {
2267 if ( pDoc->GetModel() == xDocument )
2268 break;
2269 }
2270 }
2271
2272 SfxViewFrame* pViewFrame = NULL;
2273 for ( pViewFrame = SfxViewFrame::GetFirst( pDoc, sal_False );
2274 pViewFrame;
2275 pViewFrame = SfxViewFrame::GetNext( *pViewFrame, pDoc, sal_False )
2276 )
2277 {
2278 if ( pViewFrame->GetViewShell()->GetController() == i_rController )
2279 break;
2280 }
2281
2282 return pViewFrame;
2283 }
2284
2285 //--------------------------------------------------------------------
2286
SaveCurrentViewData_Impl(const sal_uInt16 i_nNewViewId)2287 void SfxViewFrame::SaveCurrentViewData_Impl( const sal_uInt16 i_nNewViewId )
2288 {
2289 SfxViewShell* pCurrentShell = GetViewShell();
2290 ENSURE_OR_RETURN_VOID( pCurrentShell != NULL, "SfxViewFrame::SaveCurrentViewData_Impl: no current view shell -> no current view data!" );
2291
2292 // determine the logical (API) view name
2293 const SfxObjectFactory& rDocFactory( pCurrentShell->GetObjectShell()->GetFactory() );
2294 const sal_uInt16 nCurViewNo = rDocFactory.GetViewNo_Impl( GetCurViewId(), 0 );
2295 const String sCurrentViewName = rDocFactory.GetViewFactory( nCurViewNo ).GetAPIViewName();
2296 const sal_uInt16 nNewViewNo = rDocFactory.GetViewNo_Impl( i_nNewViewId, 0 );
2297 const String sNewViewName = rDocFactory.GetViewFactory( nNewViewNo ).GetAPIViewName();
2298 if ( ( sCurrentViewName.Len() == 0 ) || ( sNewViewName.Len() == 0 ) )
2299 {
2300 // can't say anything about the view, the respective application did not yet migrate its code to
2301 // named view factories => bail out
2302 OSL_ENSURE( false, "SfxViewFrame::SaveCurrentViewData_Impl: views without API names? Shouldn't happen anymore?" );
2303 return;
2304 }
2305 OSL_ENSURE( !sNewViewName.Equals( sCurrentViewName ), "SfxViewFrame::SaveCurrentViewData_Impl: suspicious: new and old view name are identical!" );
2306
2307 // save the view data only when we're moving from a non-print-preview to the print-preview view
2308 if ( !sNewViewName.EqualsAscii( "PrintPreview" ) )
2309 return;
2310
2311 // retrieve the view data from the view
2312 Sequence< PropertyValue > aViewData;
2313 pCurrentShell->WriteUserDataSequence( aViewData );
2314
2315 try
2316 {
2317 // retrieve view data (for *all* views) from the model
2318 const Reference< XController > xController( pCurrentShell->GetController(), UNO_SET_THROW );
2319 const Reference< XViewDataSupplier > xViewDataSupplier( xController->getModel(), UNO_QUERY_THROW );
2320 const Reference< XIndexContainer > xViewData( xViewDataSupplier->getViewData(), UNO_QUERY_THROW );
2321
2322 // look up the one view data item which corresponds to our current view, and remove it
2323 const sal_Int32 nCount = xViewData->getCount();
2324 for ( sal_Int32 i=0; i<nCount; ++i )
2325 {
2326 const ::comphelper::NamedValueCollection aCurViewData( xViewData->getByIndex(i) );
2327 ::rtl::OUString sViewId( aCurViewData.getOrDefault( "ViewId", ::rtl::OUString() ) );
2328 if ( sViewId.getLength() == 0 )
2329 continue;
2330
2331 const SfxViewFactory* pViewFactory = rDocFactory.GetViewFactoryByViewName( sViewId );
2332 if ( pViewFactory == NULL )
2333 continue;
2334
2335 if ( pViewFactory->GetOrdinal() == GetCurViewId() )
2336 {
2337 xViewData->removeByIndex(i);
2338 break;
2339 }
2340 }
2341
2342 // then replace it with the most recent view data we just obtained
2343 xViewData->insertByIndex( 0, makeAny( aViewData ) );
2344 }
2345 catch( const Exception& )
2346 {
2347 DBG_UNHANDLED_EXCEPTION();
2348 }
2349 }
2350
2351 //--------------------------------------------------------------------
2352
SwitchToViewShell_Impl(sal_uInt16 nViewIdOrNo,sal_Bool bIsIndex)2353 sal_Bool SfxViewFrame::SwitchToViewShell_Impl
2354 (
2355 sal_uInt16 nViewIdOrNo, /* > 0
2356 Registrierungs-Id der View, auf die umge-
2357 schaltet werden soll, bzw. die erstmalig
2358 erzeugt werden soll.
2359
2360 == 0
2361 Es soll die Default-View verwendet werden. */
2362
2363 sal_Bool bIsIndex /* sal_True
2364 'nViewIdOrNo' ist keine Registrations-Id sondern
2365 ein Index in die f"ur die in diesem
2366 <SfxViewFrame> dargestellte <SfxObjectShell>.
2367 */
2368 )
2369
2370 /* [Beschreibung]
2371
2372 Interne Methode zum Umschalten auf eine andere <SfxViewShell>-Subklasse,
2373 die in diesem SfxMDIFrame erzeugt werden soll. Existiert noch
2374 keine SfxViewShell in diesem SfxMDIFrame, so wird erstmalig eine
2375 erzeugt.
2376
2377
2378 [R"uckgabewert]
2379
2380 sal_Bool sal_True
2381 die angeforderte SfxViewShell wurde erzeugt
2382 und eine ggf. bestehende gel"oscht
2383
2384 sal_False
2385 die angeforderte SfxViewShell konnte nicht
2386 erzeugt werden, die bestehende SfxViewShell
2387 existiert daher weiterhin
2388 */
2389
2390 {
2391 try
2392 {
2393 ENSURE_OR_THROW( GetObjectShell() != NULL, "not possible without a document" );
2394
2395 // if we already have a view shell, remove it
2396 SfxViewShell* pOldSh = GetViewShell();
2397 OSL_PRECOND( pOldSh, "SfxViewFrame::SwitchToViewShell_Impl: that's called *switch* (not for *initial-load*) for a reason" );
2398 if ( pOldSh )
2399 {
2400 // ask whether it can be closed
2401 if ( !pOldSh->PrepareClose( sal_True ) )
2402 return sal_False;
2403
2404 // remove sub shells from Dispatcher before switching to new ViewShell
2405 PopShellAndSubShells_Impl( *pOldSh );
2406 }
2407
2408 GetBindings().ENTERREGISTRATIONS();
2409 LockAdjustPosSizePixel();
2410
2411 // ID of the new view
2412 SfxObjectFactory& rDocFact = GetObjectShell()->GetFactory();
2413 const sal_uInt16 nViewId = ( bIsIndex || !nViewIdOrNo ) ? rDocFact.GetViewFactory( nViewIdOrNo ).GetOrdinal() : nViewIdOrNo;
2414
2415 // save the view data of the old view, so it can be restored later on (when needed)
2416 SaveCurrentViewData_Impl( nViewId );
2417
2418 // create and load new ViewShell
2419 SfxViewShell* pNewSh = LoadViewIntoFrame_Impl(
2420 *GetObjectShell(),
2421 GetFrame().GetFrameInterface(),
2422 Sequence< PropertyValue >(), // means "reuse existing model's args"
2423 nViewId,
2424 false
2425 );
2426
2427 // allow resize events to be processed
2428 UnlockAdjustPosSizePixel();
2429
2430 if ( GetWindow().IsReallyVisible() )
2431 DoAdjustPosSizePixel( pNewSh, Point(), GetWindow().GetOutputSizePixel() );
2432
2433 GetBindings().LEAVEREGISTRATIONS();
2434 delete pOldSh;
2435 }
2436 catch ( const com::sun::star::uno::Exception& )
2437 {
2438 // the SfxCode is not able to cope with exceptions thrown while creating views
2439 // the code will crash in the stack unwinding procedure, so we shouldn't let exceptions go through here
2440 DBG_UNHANDLED_EXCEPTION();
2441 return sal_False;
2442 }
2443
2444 DBG_ASSERT( SFX_APP()->GetViewFrames_Impl().Count() == SFX_APP()->GetViewShells_Impl().Count(), "Inconsistent view arrays!" );
2445 return sal_True;
2446 }
2447
2448 //-------------------------------------------------------------------------
SetCurViewId_Impl(const sal_uInt16 i_nID)2449 void SfxViewFrame::SetCurViewId_Impl( const sal_uInt16 i_nID )
2450 {
2451 pImp->nCurViewId = i_nID;
2452 }
2453
2454 //-------------------------------------------------------------------------
GetCurViewId() const2455 sal_uInt16 SfxViewFrame::GetCurViewId() const
2456 {
2457 return pImp->nCurViewId;
2458 }
2459
2460 //-------------------------------------------------------------------------
ExecView_Impl(SfxRequest & rReq)2461 void SfxViewFrame::ExecView_Impl
2462 (
2463 SfxRequest& rReq // der auszuf"uhrende <SfxRequest>
2464 )
2465
2466 /* [Beschreibung]
2467
2468 Interne Methode zum Ausf"uhren der f"ur die <SfxShell> Subklasse
2469 SfxViewFrame in der <SVIDL> beschriebenen Slots.
2470 */
2471
2472 {
2473 DBG_CHKTHIS(SfxViewFrame, 0);
2474
2475 // Wenn gerade die Shells ausgetauscht werden...
2476 if ( !GetObjectShell() || !GetViewShell() )
2477 return;
2478
2479 switch ( rReq.GetSlot() )
2480 {
2481 case SID_TERMINATE_INPLACEACTIVATION :
2482 {
2483 SfxInPlaceClient* pClient = GetViewShell()->GetUIActiveClient();
2484 if ( pClient )
2485 pClient->DeactivateObject();
2486 break;
2487 }
2488
2489 case SID_VIEWSHELL:
2490 {
2491 const SfxPoolItem *pItem = 0;
2492 if ( rReq.GetArgs()
2493 && SFX_ITEM_SET == rReq.GetArgs()->GetItemState( SID_VIEWSHELL, sal_False, &pItem )
2494 )
2495 {
2496 const sal_uInt16 nViewId = static_cast< const SfxUInt16Item* >( pItem )->GetValue();
2497 sal_Bool bSuccess = SwitchToViewShell_Impl( nViewId );
2498 rReq.SetReturnValue( SfxBoolItem( 0, bSuccess ) );
2499 }
2500 break;
2501 }
2502
2503 case SID_VIEWSHELL0:
2504 case SID_VIEWSHELL1:
2505 case SID_VIEWSHELL2:
2506 case SID_VIEWSHELL3:
2507 case SID_VIEWSHELL4:
2508 {
2509 const sal_uInt16 nViewNo = rReq.GetSlot() - SID_VIEWSHELL0;
2510 sal_Bool bSuccess = SwitchToViewShell_Impl( nViewNo, sal_True );
2511 rReq.SetReturnValue( SfxBoolItem( 0, bSuccess ) );
2512 break;
2513 }
2514
2515 case SID_NEWWINDOW:
2516 {
2517 // Hack. demnaechst virtuelle Funktion
2518 if ( !GetViewShell()->NewWindowAllowed() )
2519 {
2520 OSL_ENSURE( false, "You should have disabled the 'Window/New Window' slot!" );
2521 return;
2522 }
2523
2524 // ViewData bei FrameSets rekursiv holen
2525 GetFrame().GetViewData_Impl();
2526 SfxMedium* pMed = GetObjectShell()->GetMedium();
2527
2528 // do not open the new window hidden
2529 pMed->GetItemSet()->ClearItem( SID_HIDDEN );
2530
2531 // the view ID (optional arg. TODO: this is currently not supported in the slot definition ...)
2532 SFX_REQUEST_ARG( rReq, pViewIdItem, SfxUInt16Item, SID_VIEW_ID, sal_False );
2533 const sal_uInt16 nViewId = pViewIdItem ? pViewIdItem->GetValue() : GetCurViewId();
2534
2535 Reference < XFrame > xFrame;
2536 // the frame (optional arg. TODO: this is currently not supported in the slot definition ...)
2537 SFX_REQUEST_ARG( rReq, pFrameItem, SfxUnoFrameItem, SID_FILLFRAME, sal_False );
2538 if ( pFrameItem )
2539 xFrame = pFrameItem->GetFrame();
2540
2541 LoadViewIntoFrame_Impl_NoThrow( *GetObjectShell(), xFrame, nViewId, false );
2542
2543 rReq.Done();
2544 break;
2545 }
2546
2547 case SID_OBJECT:
2548 {
2549 SFX_REQUEST_ARG( rReq, pItem, SfxUInt16Item, SID_OBJECT, sal_False );
2550
2551 SfxViewShell *pViewShell = GetViewShell();
2552 if ( pViewShell && pItem )
2553 {
2554 pViewShell->DoVerb( pItem->GetValue() );
2555 rReq.Done();
2556 break;;
2557 }
2558 }
2559 }
2560 }
2561
2562 //-------------------------------------------------------------------------
2563 /* TODO as96863:
2564 This method try to collect informations about the count of currently open documents.
2565 But the algorithm is implemented very simple ...
2566 E.g. hidden documents should be ignored here ... but they are counted.
2567 TODO: export special helper "framework::FrameListAnalyzer" within the framework module
2568 and use it here.
2569 */
impl_maxOpenDocCountReached()2570 sal_Bool impl_maxOpenDocCountReached()
2571 {
2572 static ::rtl::OUString SERVICE_DESKTOP = ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop");
2573
2574 try
2575 {
2576 css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
2577 css::uno::Any aVal = ::comphelper::ConfigurationHelper::readDirectKey(
2578 xSMGR,
2579 ::rtl::OUString::createFromAscii("org.openoffice.Office.Common/"),
2580 ::rtl::OUString::createFromAscii("Misc"),
2581 ::rtl::OUString::createFromAscii("MaxOpenDocuments"),
2582 ::comphelper::ConfigurationHelper::E_READONLY);
2583
2584 // NIL means: count of allowed documents = infinite !
2585 if ( ! aVal.hasValue())
2586 return sal_False;
2587
2588 sal_Int32 nOpenDocs = 0;
2589 sal_Int32 nMaxDocs = 0;
2590 aVal >>= nMaxDocs;
2591
2592 css::uno::Reference< css::frame::XFramesSupplier > xDesktop(xSMGR->createInstance(SERVICE_DESKTOP), css::uno::UNO_QUERY_THROW);
2593 css::uno::Reference< css::container::XIndexAccess > xCont (xDesktop->getFrames() , css::uno::UNO_QUERY_THROW);
2594
2595 sal_Int32 c = xCont->getCount();
2596 sal_Int32 i = 0;
2597
2598 for (i=0; i<c; ++i)
2599 {
2600 try
2601 {
2602 css::uno::Reference< css::frame::XFrame > xFrame;
2603 xCont->getByIndex(i) >>= xFrame;
2604 if ( ! xFrame.is())
2605 continue;
2606
2607 // a) do not count the help window
2608 if (xFrame->getName().equalsAscii("OFFICE_HELP_TASK"))
2609 continue;
2610
2611 // b) count all other frames
2612 ++nOpenDocs;
2613 }
2614 catch(const css::uno::Exception&)
2615 // A IndexOutOfBoundException can happen in multithreaded environments,
2616 // where any other thread can change this container !
2617 { continue; }
2618 }
2619
2620 return (nOpenDocs >= nMaxDocs);
2621 }
2622 catch(const css::uno::Exception&)
2623 {}
2624
2625 // Any internal error is no reason to stop opening documents !
2626 // Limitation of opening documents is a special "nice to have" feature.
2627 // Otherwise it can happen, that NO document will be opened ...
2628 return sal_False;
2629 }
2630
2631 //-------------------------------------------------------------------------
StateView_Impl(SfxItemSet & rSet)2632 void SfxViewFrame::StateView_Impl
2633 (
2634 SfxItemSet& rSet /* leeres <SfxItemSet> mit <Which-Ranges>,
2635 welche die Ids der zu erfragenden
2636 Slots beschreiben. */
2637 )
2638
2639 /* [Beschreibung]
2640
2641 Diese interne Methode liefert in 'rSet' die Status der f"ur die
2642 <SfxShell> Subklasse SfxViewFrame in der <SVIDL> beschriebenen <Slots>.
2643
2644 In 'rSet' sind dabei genau die vom SFx als ung"ultig erkannten
2645 Slot-Ids als Which-ranges enthalten. Falls der an dieser Shell gesetzte
2646 <SfxItemPool> f"ur einzelne Slot-Ids ein Mapping hat, werden die
2647 entsprechenden Which-Ids verwendet, so da\s Items ggf. direkt mit
2648 einer mit Which-Ids arbeitenden Core-::com::sun::star::script::Engine ausgetauscht werden
2649 k"onnen.
2650 */
2651
2652 {
2653 DBG_CHKTHIS(SfxViewFrame, 0);
2654
2655 SfxObjectShell *pDocSh = GetObjectShell();
2656
2657 if ( !pDocSh )
2658 // Ich bin gerade am Reloaden und Yielde so vor mich hin ...
2659 return;
2660
2661 const sal_uInt16 *pRanges = rSet.GetRanges();
2662 DBG_ASSERT(pRanges, "Set ohne Bereich");
2663 while ( *pRanges )
2664 {
2665 for ( sal_uInt16 nWhich = *pRanges++; nWhich <= *pRanges; ++nWhich )
2666 {
2667 switch(nWhich)
2668 {
2669 case SID_VIEWSHELL:
2670 {
2671 rSet.Put( SfxUInt16Item( nWhich, pImp->nCurViewId ) );
2672 break;
2673 }
2674
2675 case SID_VIEWSHELL0:
2676 case SID_VIEWSHELL1:
2677 case SID_VIEWSHELL2:
2678 case SID_VIEWSHELL3:
2679 case SID_VIEWSHELL4:
2680 {
2681 sal_uInt16 nViewNo = nWhich - SID_VIEWSHELL0;
2682 if ( GetObjectShell()->GetFactory().GetViewFactoryCount() >
2683 nViewNo && !GetObjectShell()->IsInPlaceActive() )
2684 {
2685 SfxViewFactory &rViewFactory =
2686 GetObjectShell()->GetFactory().GetViewFactory(nViewNo);
2687 rSet.Put( SfxBoolItem(
2688 nWhich, pImp->nCurViewId == rViewFactory.GetOrdinal() ) );
2689 }
2690 else
2691 rSet.DisableItem( nWhich );
2692 break;
2693 }
2694 case SID_FRAMETITLE:
2695 {
2696 if( GetFrameType() & SFXFRAME_HASTITLE )
2697 rSet.Put( SfxStringItem(
2698 SID_FRAMETITLE, pImp->aFrameTitle) );
2699 else
2700 rSet.DisableItem( nWhich );
2701 break;
2702 }
2703
2704 case SID_NEWWINDOW:
2705 {
2706 if ( !GetViewShell()->NewWindowAllowed()
2707 || impl_maxOpenDocCountReached()
2708 )
2709 rSet.DisableItem( nWhich );
2710 break;
2711 }
2712 }
2713 }
2714 }
2715 }
2716
2717 //-------------------------------------------------------------------------
ToTop()2718 void SfxViewFrame::ToTop()
2719 {
2720 GetFrame().Appear();
2721 }
2722
2723 //-------------------------------------------------------------------------
GetParentViewFrame() const2724 SfxViewFrame* SfxViewFrame::GetParentViewFrame() const
2725 /*
2726 Beschreibung:
2727 Der ParentViewFrame ist der ViewFrame des ParentFrames
2728 */
2729 {
2730 SfxFrame *pFrame = GetFrame().GetParentFrame();
2731 return pFrame ? pFrame->GetCurrentViewFrame() : NULL;
2732 }
2733
2734 //-------------------------------------------------------------------------
GetFrame() const2735 SfxFrame& SfxViewFrame::GetFrame() const
2736 /*
2737 Beschreibung:
2738 GetFrame liefert den Frame, in dem sich der ViewFrame befindet
2739 */
2740 {
2741 return pImp->rFrame;
2742 }
2743
2744 //-------------------------------------------------------------------------
GetTopViewFrame() const2745 SfxViewFrame* SfxViewFrame::GetTopViewFrame() const
2746 {
2747 return GetFrame().GetTopFrame().GetCurrentViewFrame();
2748 }
2749
GetWindow() const2750 Window& SfxViewFrame::GetWindow() const
2751 {
2752 return pImp->pWindow ? *pImp->pWindow : GetFrame().GetWindow();
2753 }
2754
DoClose()2755 sal_Bool SfxViewFrame::DoClose()
2756 {
2757 return GetFrame().DoClose();
2758 }
2759
GetActualPresentationURL_Impl() const2760 String SfxViewFrame::GetActualPresentationURL_Impl() const
2761 {
2762 if ( xObjSh.Is() )
2763 return xObjSh->GetMedium()->GetName();
2764 return String();
2765 }
2766
SetModalMode(sal_Bool bModal)2767 void SfxViewFrame::SetModalMode( sal_Bool bModal )
2768 {
2769 pImp->bModal = bModal;
2770 if ( xObjSh.Is() )
2771 {
2772 for ( SfxViewFrame* pFrame = SfxViewFrame::GetFirst( xObjSh );
2773 !bModal && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, xObjSh ) )
2774 bModal = pFrame->pImp->bModal;
2775 xObjSh->SetModalMode_Impl( bModal );
2776 }
2777 }
2778
IsInModalMode() const2779 sal_Bool SfxViewFrame::IsInModalMode() const
2780 {
2781 return pImp->bModal || GetFrame().GetWindow().IsInModalMode();
2782 }
2783
Resize(sal_Bool bForce)2784 void SfxViewFrame::Resize( sal_Bool bForce )
2785 {
2786 Size aSize = GetWindow().GetOutputSizePixel();
2787 if ( bForce || aSize != pImp->aSize )
2788 {
2789 pImp->aSize = aSize;
2790 SfxViewShell *pShell = GetViewShell();
2791 if ( pShell )
2792 {
2793 if ( GetFrame().IsInPlace() )
2794 {
2795 Point aPoint = GetWindow().GetPosPixel();
2796 DoAdjustPosSizePixel( pShell, aPoint, aSize );
2797 }
2798 else
2799 {
2800 DoAdjustPosSizePixel( pShell, Point(), aSize );
2801 }
2802 }
2803 }
2804 }
2805
2806 #define LINE_SEP 0x0A
2807
CutLines(::rtl::OUString & rStr,sal_Int32 nStartLine,sal_Int32 nLines,sal_Bool bEraseTrailingEmptyLines)2808 void CutLines( ::rtl::OUString& rStr, sal_Int32 nStartLine, sal_Int32 nLines, sal_Bool bEraseTrailingEmptyLines )
2809 {
2810 sal_Int32 nStartPos = 0;
2811 sal_Int32 nEndPos = 0;
2812 sal_Int32 nLine = 0;
2813 while ( nLine < nStartLine )
2814 {
2815 nStartPos = rStr.indexOf( LINE_SEP, nStartPos );
2816 if( nStartPos == -1 )
2817 break;
2818 nStartPos++; // nicht das \n.
2819 nLine++;
2820 }
2821
2822 DBG_ASSERTWARNING( nStartPos != STRING_NOTFOUND, "CutLines: Startzeile nicht gefunden!" );
2823
2824 if ( nStartPos != -1 )
2825 {
2826 nEndPos = nStartPos;
2827 for ( sal_Int32 i = 0; i < nLines; i++ )
2828 nEndPos = rStr.indexOf( LINE_SEP, nEndPos+1 );
2829
2830 if ( nEndPos == -1 ) // kann bei letzter Zeile passieren
2831 nEndPos = rStr.getLength();
2832 else
2833 nEndPos++;
2834
2835 ::rtl::OUString aEndStr = rStr.copy( nEndPos );
2836 rStr = rStr.copy( 0, nStartPos );
2837 rStr += aEndStr;
2838 }
2839 if ( bEraseTrailingEmptyLines )
2840 {
2841 sal_Int32 n = nStartPos;
2842 sal_Int32 nLen = rStr.getLength();
2843 while ( ( n < nLen ) && ( rStr.getStr()[ n ] == LINE_SEP ) )
2844 n++;
2845
2846 if ( n > nStartPos )
2847 {
2848 ::rtl::OUString aEndStr = rStr.copy( n );
2849 rStr = rStr.copy( 0, nStartPos );
2850 rStr += aEndStr;
2851 }
2852 }
2853 }
2854
2855 /*
2856 add new recorded dispatch macro script into the application global basic lib container
2857 It generates a new unique id for it and insert the macro by using this number as name for
2858 the modul
2859 */
AddDispatchMacroToBasic_Impl(const::rtl::OUString & sMacro)2860 void SfxViewFrame::AddDispatchMacroToBasic_Impl( const ::rtl::OUString& sMacro )
2861 {
2862 /*
2863 // get lib and modul name from dialog
2864 SfxModule *pMod = GetObjectShell()->GetModule();
2865 SfxRequest aReq( SID_BASICCHOOSER, SFX_CALLMODE_SYNCHRON, pMod->GetPool() );
2866 const SfxPoolItem* pRet = pMod->ExecuteSlot( aReq );
2867 if ( pRet )
2868 ::rtl::OUString = ((SfxStringItem*)pRet)->GetValue();
2869 */
2870 if ( !sMacro.getLength() )
2871 return;
2872
2873 SfxApplication* pSfxApp = SFX_APP();
2874 SfxRequest aReq( SID_BASICCHOOSER, SFX_CALLMODE_SYNCHRON, pSfxApp->GetPool() );
2875 aReq.AppendItem( SfxBoolItem(SID_RECORDMACRO,sal_True) );
2876 const SfxPoolItem* pRet = SFX_APP()->ExecuteSlot( aReq );
2877 String aScriptURL;
2878 if ( pRet )
2879 aScriptURL = ((SfxStringItem*)pRet)->GetValue();
2880 if ( aScriptURL.Len() )
2881 {
2882 // parse scriptURL
2883 String aLibName;
2884 String aModuleName;
2885 String aMacroName;
2886 String aLocation;
2887 Reference< XMultiServiceFactory > xSMgr = ::comphelper::getProcessServiceFactory();
2888 Reference< com::sun::star::uri::XUriReferenceFactory > xFactory( xSMgr->createInstance(
2889 ::rtl::OUString::createFromAscii( "com.sun.star.uri.UriReferenceFactory" ) ), UNO_QUERY );
2890 if ( xFactory.is() )
2891 {
2892 Reference< com::sun::star::uri::XVndSunStarScriptUrl > xUrl( xFactory->parse( aScriptURL ), UNO_QUERY );
2893 if ( xUrl.is() )
2894 {
2895 // get name
2896 ::rtl::OUString aName = xUrl->getName();
2897 sal_Unicode cTok = '.';
2898 sal_Int32 nIndex = 0;
2899 aLibName = aName.getToken( 0, cTok, nIndex );
2900 if ( nIndex != -1 )
2901 aModuleName = aName.getToken( 0, cTok, nIndex );
2902 if ( nIndex != -1 )
2903 aMacroName = aName.getToken( 0, cTok, nIndex );
2904
2905 // get location
2906 ::rtl::OUString aLocKey = ::rtl::OUString::createFromAscii( "location" );
2907 if ( xUrl->hasParameter( aLocKey ) )
2908 aLocation = xUrl->getParameter( aLocKey );
2909 }
2910 }
2911
2912 BasicManager* pBasMgr = 0;
2913 if ( aLocation.EqualsIgnoreCaseAscii( "application" ) )
2914 {
2915 // application basic
2916 pBasMgr = pSfxApp->GetBasicManager();
2917 }
2918 else if ( aLocation.EqualsIgnoreCaseAscii( "document" ) )
2919 {
2920 pBasMgr = GetObjectShell()->GetBasicManager();
2921 }
2922
2923 ::rtl::OUString aOUSource;
2924 if ( pBasMgr)
2925 {
2926 StarBASIC* pBasic = pBasMgr->GetLib( aLibName );
2927 if ( pBasic )
2928 {
2929 SbModule* pModule = pBasic->FindModule( aModuleName );
2930 if ( pModule )
2931 {
2932 SbMethod* pMethod = (SbMethod*)pModule->GetMethods()->Find( aMacroName, SbxCLASS_METHOD );
2933 aOUSource = pModule->GetSource32();
2934 sal_uInt16 nStart, nEnd;
2935 pMethod->GetLineRange( nStart, nEnd );
2936 sal_uIntPtr nlStart = nStart;
2937 sal_uIntPtr nlEnd = nEnd;
2938 CutLines( aOUSource, nlStart-1, nlEnd-nlStart+1, sal_True );
2939 }
2940 }
2941 }
2942
2943 // open lib container and break operation if it couldn't be opened
2944 com::sun::star::uno::Reference< com::sun::star::script::XLibraryContainer > xLibCont;
2945 if ( aLocation.EqualsIgnoreCaseAscii( "application" ) )
2946 {
2947 xLibCont = SFX_APP()->GetBasicContainer();
2948 }
2949 else if ( aLocation.EqualsIgnoreCaseAscii( "document" ) )
2950 {
2951 xLibCont = GetObjectShell()->GetBasicContainer();
2952 }
2953
2954 if(!xLibCont.is())
2955 {
2956 DBG_ERRORFILE("couldn't get access to the basic lib container. Adding of macro isn't possible.");
2957 return;
2958 }
2959
2960 // get LibraryContainer
2961 com::sun::star::uno::Any aTemp;
2962 com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xRoot(
2963 xLibCont,
2964 com::sun::star::uno::UNO_QUERY);
2965
2966 ::rtl::OUString sLib( aLibName );
2967 com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > xLib;
2968 if(xRoot->hasByName(sLib))
2969 {
2970 // library must be loaded
2971 aTemp = xRoot->getByName(sLib);
2972 xLibCont->loadLibrary(sLib);
2973 aTemp >>= xLib;
2974 }
2975 else
2976 {
2977 xLib = com::sun::star::uno::Reference< com::sun::star::container::XNameAccess >(
2978 xLibCont->createLibrary(sLib),
2979 com::sun::star::uno::UNO_QUERY);
2980 }
2981
2982 // pack the macro as direct usable "sub" routine
2983 ::rtl::OUString sCode;
2984 ::rtl::OUStringBuffer sRoutine(10000);
2985 ::rtl::OUString sMacroName( aMacroName );
2986 sal_Bool bReplace = sal_False;
2987
2988 // get module
2989 ::rtl::OUString sModule( aModuleName );
2990 if(xLib->hasByName(sModule))
2991 {
2992 if ( aOUSource.getLength() )
2993 {
2994 sRoutine.append( aOUSource );
2995 }
2996 else
2997 {
2998 aTemp = xLib->getByName(sModule);
2999 aTemp >>= sCode;
3000 sRoutine.append( sCode );
3001 }
3002
3003 bReplace = sal_True;
3004 }
3005
3006 // append new method
3007 sRoutine.appendAscii("\nsub " );
3008 sRoutine.append (sMacroName );
3009 sRoutine.appendAscii("\n" );
3010 sRoutine.append (sMacro );
3011 sRoutine.appendAscii("\nend sub\n");
3012
3013 // create the modul inside the library and insert the macro routine
3014 aTemp <<= sRoutine.makeStringAndClear();
3015 if ( bReplace )
3016 {
3017 com::sun::star::uno::Reference< com::sun::star::container::XNameContainer > xModulCont(
3018 xLib,
3019 com::sun::star::uno::UNO_QUERY);
3020 xModulCont->replaceByName(sModule,aTemp);
3021 }
3022 else
3023 {
3024 com::sun::star::uno::Reference< com::sun::star::container::XNameContainer > xModulCont(
3025 xLib,
3026 com::sun::star::uno::UNO_QUERY);
3027 xModulCont->insertByName(sModule,aTemp);
3028 }
3029
3030 // #i17355# update the Basic IDE
3031 for ( SfxViewShell* pViewShell = SfxViewShell::GetFirst(); pViewShell; pViewShell = SfxViewShell::GetNext( *pViewShell ) )
3032 {
3033 if ( pViewShell->GetName().EqualsAscii( "BasicIDE" ) )
3034 {
3035 SfxViewFrame* pViewFrame = pViewShell->GetViewFrame();
3036 SfxDispatcher* pDispat = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
3037 if ( pDispat )
3038 {
3039 SfxMacroInfoItem aInfoItem( SID_BASICIDE_ARG_MACROINFO, pBasMgr, aLibName, aModuleName, String(), String() );
3040 pDispat->Execute( SID_BASICIDE_UPDATEMODULESOURCE, SFX_CALLMODE_SYNCHRON, &aInfoItem, 0L );
3041 }
3042 }
3043 }
3044 }
3045 else
3046 {
3047 // add code for "session only" macro
3048 }
3049 }
3050
MiscExec_Impl(SfxRequest & rReq)3051 void SfxViewFrame::MiscExec_Impl( SfxRequest& rReq )
3052 {
3053 DBG_MEMTEST();
3054 switch ( rReq.GetSlot() )
3055 {
3056 case SID_STOP_RECORDING :
3057 case SID_RECORDMACRO :
3058 {
3059 // try to find any active recorder on this frame
3060 ::rtl::OUString sProperty = rtl::OUString::createFromAscii("DispatchRecorderSupplier");
3061 com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
3062 GetFrame().GetFrameInterface(),
3063 com::sun::star::uno::UNO_QUERY);
3064
3065 com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(xFrame,com::sun::star::uno::UNO_QUERY);
3066 com::sun::star::uno::Any aProp = xSet->getPropertyValue(sProperty);
3067 com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
3068 aProp >>= xSupplier;
3069 com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder;
3070 if (xSupplier.is())
3071 xRecorder = xSupplier->getDispatchRecorder();
3072
3073 sal_Bool bIsRecording = xRecorder.is();
3074 SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, SID_RECORDMACRO, sal_False);
3075 if ( pItem && pItem->GetValue() == bIsRecording )
3076 return;
3077
3078 if ( xRecorder.is() )
3079 {
3080 // disable active recording
3081 aProp <<= com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier >();
3082 xSet->setPropertyValue(sProperty,aProp);
3083
3084 SFX_REQUEST_ARG( rReq, pRecordItem, SfxBoolItem, FN_PARAM_1, sal_False);
3085 if ( !pRecordItem || !pRecordItem->GetValue() )
3086 // insert script into basic library container of application
3087 AddDispatchMacroToBasic_Impl(xRecorder->getRecordedMacro());
3088
3089 xRecorder->endRecording();
3090 xRecorder = NULL;
3091 GetBindings().SetRecorder_Impl( xRecorder );
3092
3093 SetChildWindow( SID_RECORDING_FLOATWINDOW, sal_False );
3094 if ( rReq.GetSlot() != SID_RECORDMACRO )
3095 GetBindings().Invalidate( SID_RECORDMACRO );
3096 }
3097 else if ( rReq.GetSlot() == SID_RECORDMACRO )
3098 {
3099 // enable recording
3100 com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > xFactory(
3101 ::comphelper::getProcessServiceFactory(),
3102 com::sun::star::uno::UNO_QUERY);
3103
3104 xRecorder = com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder >(
3105 xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.frame.DispatchRecorder")),
3106 com::sun::star::uno::UNO_QUERY);
3107
3108 xSupplier = com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier >(
3109 xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.frame.DispatchRecorderSupplier")),
3110 com::sun::star::uno::UNO_QUERY);
3111
3112 xSupplier->setDispatchRecorder(xRecorder);
3113 xRecorder->startRecording(xFrame);
3114 aProp <<= xSupplier;
3115 xSet->setPropertyValue(sProperty,aProp);
3116 GetBindings().SetRecorder_Impl( xRecorder );
3117 SetChildWindow( SID_RECORDING_FLOATWINDOW, sal_True );
3118 }
3119
3120 rReq.Done();
3121 break;
3122 }
3123
3124 case SID_TOGGLESTATUSBAR:
3125 {
3126 com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
3127 GetFrame().GetFrameInterface(),
3128 com::sun::star::uno::UNO_QUERY);
3129
3130 Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
3131 Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
3132 if ( xPropSet.is() )
3133 {
3134 try
3135 {
3136 Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
3137 aValue >>= xLayoutManager;
3138 }
3139 catch ( Exception& )
3140 {
3141 }
3142 }
3143
3144 if ( xLayoutManager.is() )
3145 {
3146 rtl::OUString aStatusbarResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" ));
3147 // Parameter auswerten
3148 SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, rReq.GetSlot(), sal_False);
3149 sal_Bool bShow( sal_True );
3150 if ( !pShowItem )
3151 bShow = xLayoutManager->isElementVisible( aStatusbarResString );
3152 else
3153 bShow = pShowItem->GetValue();
3154
3155 if ( bShow )
3156 {
3157 xLayoutManager->createElement( aStatusbarResString );
3158 xLayoutManager->showElement( aStatusbarResString );
3159 }
3160 else
3161 xLayoutManager->hideElement( aStatusbarResString );
3162
3163 if ( !pShowItem )
3164 rReq.AppendItem( SfxBoolItem( SID_TOGGLESTATUSBAR, bShow ) );
3165 }
3166 rReq.Done();
3167 break;
3168 }
3169
3170 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3171 case SID_WIN_FULLSCREEN:
3172 {
3173 SFX_REQUEST_ARG(rReq, pItem, SfxBoolItem, rReq.GetSlot(), sal_False);
3174 SfxViewFrame *pTop = GetTopViewFrame();
3175 if ( pTop )
3176 {
3177 WorkWindow* pWork = (WorkWindow*) pTop->GetFrame().GetTopWindow_Impl();
3178 if ( pWork )
3179 {
3180 com::sun::star::uno::Reference< com::sun::star::frame::XFrame > xFrame(
3181 GetFrame().GetFrameInterface(),
3182 com::sun::star::uno::UNO_QUERY);
3183
3184 Reference< ::com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
3185 Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
3186 if ( xPropSet.is() )
3187 {
3188 try
3189 {
3190 Any aValue = xPropSet->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )));
3191 aValue >>= xLayoutManager;
3192 }
3193 catch ( Exception& )
3194 {
3195 }
3196 }
3197
3198 sal_Bool bNewFullScreenMode = pItem ? pItem->GetValue() : !pWork->IsFullScreenMode();
3199 if ( bNewFullScreenMode != pWork->IsFullScreenMode() )
3200 {
3201 Reference< ::com::sun::star::beans::XPropertySet > xLMPropSet( xLayoutManager, UNO_QUERY );
3202 if ( xLMPropSet.is() )
3203 {
3204 try
3205 {
3206 xLMPropSet->setPropertyValue(
3207 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HideCurrentUI" )),
3208 makeAny( bNewFullScreenMode ));
3209 }
3210 catch ( ::com::sun::star::beans::UnknownPropertyException& )
3211 {
3212 }
3213 }
3214 pWork->ShowFullScreenMode( bNewFullScreenMode );
3215 pWork->SetMenuBarMode( bNewFullScreenMode ? MENUBAR_MODE_HIDE : MENUBAR_MODE_NORMAL );
3216 GetFrame().GetWorkWindow_Impl()->SetFullScreen_Impl( bNewFullScreenMode );
3217 if ( !pItem )
3218 rReq.AppendItem( SfxBoolItem( SID_WIN_FULLSCREEN, bNewFullScreenMode ) );
3219 rReq.Done();
3220 }
3221 else
3222 rReq.Ignore();
3223 }
3224 }
3225 else
3226 rReq.Ignore();
3227
3228 GetDispatcher()->Update_Impl( sal_True );
3229 break;
3230 }
3231 }
3232 }
3233
MiscState_Impl(SfxItemSet & rSet)3234 void SfxViewFrame::MiscState_Impl(SfxItemSet &rSet)
3235 {
3236 DBG_MEMTEST();
3237
3238 const sal_uInt16 *pRanges = rSet.GetRanges();
3239 DBG_ASSERT(pRanges && *pRanges, "Set ohne Bereich");
3240 while ( *pRanges )
3241 {
3242 for(sal_uInt16 nWhich = *pRanges++; nWhich <= *pRanges; ++nWhich)
3243 {
3244 switch(nWhich)
3245 {
3246 case SID_CURRENT_URL:
3247 {
3248 // Bei internem InPlace den ContainerFrame nehmen
3249 SfxViewFrame *pFrame = this;
3250 if ( pFrame->GetParentViewFrame_Impl() )
3251 pFrame = pFrame->GetParentViewFrame_Impl();
3252 rSet.Put( SfxStringItem( nWhich, pFrame->GetActualPresentationURL_Impl() ) );
3253 break;
3254 }
3255
3256 case SID_RECORDMACRO :
3257 {
3258 const char* pName = GetObjectShell()->GetFactory().GetShortName();
3259 if ( strcmp(pName,"swriter") && strcmp(pName,"scalc") )
3260 {
3261 rSet.DisableItem( nWhich );
3262 break;
3263 }
3264
3265 ::rtl::OUString sProperty = rtl::OUString::createFromAscii("DispatchRecorderSupplier");
3266 com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
3267 GetFrame().GetFrameInterface(),
3268 com::sun::star::uno::UNO_QUERY);
3269
3270 com::sun::star::uno::Any aProp = xSet->getPropertyValue(sProperty);
3271 com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
3272 if ( aProp >>= xSupplier )
3273 rSet.Put( SfxBoolItem( nWhich, xSupplier.is() ) );
3274 else
3275 rSet.DisableItem( nWhich );
3276 break;
3277 }
3278
3279 case SID_STOP_RECORDING :
3280 {
3281 const char* pName = GetObjectShell()->GetFactory().GetShortName();
3282 if ( strcmp(pName,"swriter") && strcmp(pName,"scalc") )
3283 {
3284 rSet.DisableItem( nWhich );
3285 break;
3286 }
3287
3288 ::rtl::OUString sProperty = rtl::OUString::createFromAscii("DispatchRecorderSupplier");
3289 com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
3290 GetFrame().GetFrameInterface(),
3291 com::sun::star::uno::UNO_QUERY);
3292
3293 com::sun::star::uno::Any aProp = xSet->getPropertyValue(sProperty);
3294 com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorderSupplier > xSupplier;
3295 if ( !(aProp >>= xSupplier) || !xSupplier.is() )
3296 rSet.DisableItem( nWhich );
3297 break;
3298 }
3299
3300 case SID_TOGGLESTATUSBAR:
3301 {
3302 com::sun::star::uno::Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
3303 com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet > xSet(
3304 GetFrame().GetFrameInterface(),
3305 com::sun::star::uno::UNO_QUERY);
3306 com::sun::star::uno::Any aProp = xSet->getPropertyValue(
3307 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )) );
3308
3309 if ( !( aProp >>= xLayoutManager ))
3310 rSet.Put( SfxBoolItem( nWhich, sal_False ));
3311 else
3312 {
3313 rtl::OUString aStatusbarResString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" ));
3314 sal_Bool bShow = xLayoutManager->isElementVisible( aStatusbarResString );
3315 rSet.Put( SfxBoolItem( nWhich, bShow ));
3316 }
3317 break;
3318 }
3319
3320 case SID_WIN_FULLSCREEN:
3321 {
3322 SfxViewFrame* pTop = GetTopViewFrame();
3323 if ( pTop )
3324 {
3325 WorkWindow* pWork = (WorkWindow*) pTop->GetFrame().GetTopWindow_Impl();
3326 if ( pWork )
3327 {
3328 rSet.Put( SfxBoolItem( nWhich, pWork->IsFullScreenMode() ) );
3329 break;
3330 }
3331 }
3332
3333 rSet.DisableItem( nWhich );
3334 break;
3335 }
3336
3337 case SID_FORMATMENUSTATE :
3338 {
3339 DBG_ERROR("Outdated slot!");
3340 rSet.DisableItem( nWhich );
3341 break;
3342 }
3343
3344 default:
3345 //! DBG_ASSERT(FALSE, "Falscher Server fuer GetState");
3346 break;
3347 }
3348 }
3349
3350 ++pRanges;
3351 }
3352 }
3353
ChildWindowExecute(SfxRequest & rReq)3354 void SfxViewFrame::ChildWindowExecute( SfxRequest &rReq )
3355
3356 /* [Beschreibung]
3357
3358 Diese Methode kann in der Execute-Methode f"ur das ein- und ausschalten
3359 von Child-Windows eingesetzt werden, um dieses inkl. API-Anbindung zu
3360 implementieren.
3361
3362 Einfach in der IDL als 'ExecuteMethod' eintragen.
3363 */
3364
3365 {
3366 // Parameter auswerten
3367 sal_uInt16 nSID = rReq.GetSlot();
3368
3369 SFX_REQUEST_ARG(rReq, pShowItem, SfxBoolItem, nSID, sal_False);
3370 if ( nSID == SID_VIEW_DATA_SOURCE_BROWSER )
3371 {
3372 if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE))
3373 return;
3374 Reference < XFrame > xFrame = GetFrame().GetTopFrame().GetFrameInterface();
3375 Reference < XFrame > xBeamer( xFrame->findFrame( DEFINE_CONST_UNICODE("_beamer"), FrameSearchFlag::CHILDREN ) );
3376 sal_Bool bShow = sal_False;
3377 sal_Bool bHasChild = xBeamer.is();
3378 bShow = pShowItem ? pShowItem->GetValue() : !bHasChild;
3379 if ( pShowItem )
3380 {
3381 if( bShow == bHasChild )
3382 return;
3383 }
3384 else
3385 rReq.AppendItem( SfxBoolItem( nSID, bShow ) );
3386
3387 if ( !bShow )
3388 {
3389 SetChildWindow( SID_BROWSER, sal_False );
3390 }
3391 else
3392 {
3393 ::com::sun::star::util::URL aTargetURL;
3394 aTargetURL.Complete = ::rtl::OUString::createFromAscii(".component:DB/DataSourceBrowser");
3395 Reference < ::com::sun::star::util::XURLTransformer > xTrans( ::comphelper::getProcessServiceFactory()->createInstance( rtl::OUString::createFromAscii("com.sun.star.util.URLTransformer" )), UNO_QUERY );
3396 xTrans->parseStrict( aTargetURL );
3397
3398 Reference < XDispatchProvider > xProv( xFrame, UNO_QUERY );
3399 Reference < ::com::sun::star::frame::XDispatch > xDisp;
3400 if ( xProv.is() )
3401 xDisp = xProv->queryDispatch( aTargetURL, ::rtl::OUString::createFromAscii("_beamer"), 31 );
3402 if ( xDisp.is() )
3403 {
3404 Sequence < ::com::sun::star::beans::PropertyValue > aArgs(1);
3405 ::com::sun::star::beans::PropertyValue* pArg = aArgs.getArray();
3406 pArg[0].Name = rtl::OUString::createFromAscii("Referer");
3407 pArg[0].Value <<= ::rtl::OUString::createFromAscii("private:user");
3408 xDisp->dispatch( aTargetURL, aArgs );
3409 }
3410 }
3411
3412 rReq.Done();
3413 return;
3414 }
3415
3416 sal_Bool bShow = sal_False;
3417 sal_Bool bHasChild = HasChildWindow(nSID);
3418 bShow = pShowItem ? pShowItem->GetValue() : !bHasChild;
3419 GetDispatcher()->Update_Impl( sal_True );
3420
3421 // ausf"uhren
3422 if ( !pShowItem || bShow != bHasChild )
3423 ToggleChildWindow( nSID );
3424
3425 GetBindings().Invalidate( nSID );
3426
3427 // ggf. recorden
3428 if ( nSID == SID_HYPERLINK_DIALOG || nSID == SID_SEARCH_DLG )
3429 {
3430 rReq.Ignore();
3431 }
3432 else
3433 {
3434 rReq.AppendItem( SfxBoolItem( nSID, bShow ) );
3435 rReq.Done();
3436 }
3437 }
3438
3439 //--------------------------------------------------------------------
3440
ChildWindowState(SfxItemSet & rState)3441 void SfxViewFrame::ChildWindowState( SfxItemSet& rState )
3442
3443 /* [Beschreibung]
3444
3445 Diese Methode kann in der Status-Methode f"ur das Ein- und Ausschalt-
3446 Zustand von Child-Windows eingesetzt werden, um dieses zu implementieren.
3447
3448 Einfach in der IDL als 'StateMethod' eintragen.
3449 */
3450
3451 {
3452 SfxWhichIter aIter( rState );
3453 for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
3454 {
3455 if ( nSID == SID_VIEW_DATA_SOURCE_BROWSER )
3456 {
3457 rState.Put( SfxBoolItem( nSID, HasChildWindow( SID_BROWSER ) ) );
3458 }
3459 else if ( nSID == SID_HYPERLINK_DIALOG )
3460 {
3461 const SfxPoolItem* pDummy = NULL;
3462 SfxItemState eState = GetDispatcher()->QueryState( SID_HYPERLINK_SETLINK, pDummy );
3463 if ( SFX_ITEM_DISABLED == eState )
3464 rState.DisableItem(nSID);
3465 else
3466 {
3467 if ( KnowsChildWindow(nSID) )
3468 rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID)) );
3469 else
3470 rState.DisableItem(nSID);
3471 }
3472 }
3473 else if ( nSID == SID_BROWSER )
3474 {
3475 Reference < XFrame > xFrame = GetFrame().GetTopFrame().GetFrameInterface()->
3476 findFrame( DEFINE_CONST_UNICODE("_beamer"), FrameSearchFlag::CHILDREN );
3477 if ( !xFrame.is() )
3478 rState.DisableItem( nSID );
3479 else if ( KnowsChildWindow(nSID) )
3480 rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID) ) );
3481 }
3482 else if ( nSID == SID_TASKPANE )
3483 {
3484 if ( !KnowsChildWindow( nSID ) )
3485 {
3486 OSL_ENSURE( false, "SID_TASKPANE state requested, but no task pane child window exists for this ID!" );
3487 rState.DisableItem( nSID );
3488 }
3489 else if ( !moduleHasToolPanels( *pImp ) )
3490 {
3491 rState.Put( SfxVisibilityItem( nSID, sal_False ) );
3492 }
3493 else
3494 {
3495 rState.Put( SfxBoolItem( nSID, HasChildWindow( nSID ) ) );
3496 }
3497 }
3498 else if ( nSID == SID_SIDEBAR )
3499 {
3500 if ( !KnowsChildWindow( nSID ) )
3501 {
3502 OSL_ENSURE( false, "SID_TASKPANE state requested, but no task pane child window exists for this ID!" );
3503 rState.DisableItem( nSID );
3504 }
3505 else
3506 {
3507 rState.Put( SfxBoolItem( nSID, HasChildWindow( nSID ) ) );
3508 }
3509 }
3510 else if ( KnowsChildWindow(nSID) )
3511 rState.Put( SfxBoolItem( nSID, HasChildWindow(nSID) ) );
3512 else
3513 rState.DisableItem(nSID);
3514 }
3515 }
3516
3517 //--------------------------------------------------------------------
GetWorkWindow_Impl(sal_uInt16)3518 SfxWorkWindow* SfxViewFrame::GetWorkWindow_Impl( sal_uInt16 /*nId*/ )
3519 {
3520 SfxWorkWindow* pWork = 0;
3521 pWork = GetFrame().GetWorkWindow_Impl();
3522 return pWork;
3523 }
3524
3525 /*
3526 void SfxViewFrame::SetChildWindow(sal_uInt16 nId, sal_Bool bOn)
3527 {
3528 SetChildWindow( nId, bOn, sal_True );
3529 }*/
3530
SetChildWindow(sal_uInt16 nId,sal_Bool bOn,sal_Bool bSetFocus)3531 void SfxViewFrame::SetChildWindow(sal_uInt16 nId, sal_Bool bOn, sal_Bool bSetFocus )
3532 {
3533 SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3534 if ( pWork )
3535 pWork->SetChildWindow_Impl( nId, bOn, bSetFocus );
3536 }
3537
3538 //--------------------------------------------------------------------
3539
ToggleChildWindow(sal_uInt16 nId)3540 void SfxViewFrame::ToggleChildWindow(sal_uInt16 nId)
3541 {
3542 SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3543 if ( pWork )
3544 pWork->ToggleChildWindow_Impl( nId, sal_True );
3545 }
3546
3547 //--------------------------------------------------------------------
3548
HasChildWindow(sal_uInt16 nId)3549 sal_Bool SfxViewFrame::HasChildWindow( sal_uInt16 nId )
3550 {
3551 SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3552 return pWork ? pWork->HasChildWindow_Impl(nId) : sal_False;
3553 }
3554
3555 //--------------------------------------------------------------------
3556
KnowsChildWindow(sal_uInt16 nId)3557 sal_Bool SfxViewFrame::KnowsChildWindow( sal_uInt16 nId )
3558 {
3559 SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3560 return pWork ? pWork->KnowsChildWindow_Impl(nId) : sal_False;
3561 }
3562
3563 //--------------------------------------------------------------------
3564
ShowChildWindow(sal_uInt16 nId,sal_Bool bVisible)3565 void SfxViewFrame::ShowChildWindow( sal_uInt16 nId, sal_Bool bVisible )
3566 {
3567 SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3568 if ( pWork )
3569 {
3570 GetDispatcher()->Update_Impl(sal_True);
3571 pWork->ShowChildWindow_Impl(nId, bVisible, sal_True );
3572 }
3573 }
3574
3575 //--------------------------------------------------------------------
3576
GetChildWindow(sal_uInt16 nId)3577 SfxChildWindow* SfxViewFrame::GetChildWindow(sal_uInt16 nId)
3578 {
3579 SfxWorkWindow* pWork = GetWorkWindow_Impl( nId );
3580 return pWork ? pWork->GetChildWindow_Impl(nId) : NULL;
3581 }
3582
UpdateDocument_Impl()3583 void SfxViewFrame::UpdateDocument_Impl()
3584 {
3585 SfxObjectShell* pDoc = GetObjectShell();
3586 if ( pDoc->IsLoadingFinished() )
3587 pDoc->CheckSecurityOnLoading_Impl();
3588
3589 // check if document depends on a template
3590 pDoc->UpdateFromTemplate_Impl();
3591 }
3592
SetViewFrame(SfxViewFrame * pFrame)3593 void SfxViewFrame::SetViewFrame( SfxViewFrame* pFrame )
3594 {
3595 SFX_APP()->SetViewFrame_Impl( pFrame );
3596 }
3597
3598 // ---------------------------------------------------------------------------------------------------------------------
ActivateToolPanel(const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & i_rFrame,const::rtl::OUString & i_rPanelURL)3599 void SfxViewFrame::ActivateToolPanel( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& i_rFrame, const ::rtl::OUString& i_rPanelURL )
3600 {
3601 ::vos::OGuard aGuard( Application::GetSolarMutex() );
3602
3603 // look up the SfxFrame for the given XFrame
3604 SfxFrame* pFrame = NULL;
3605 for ( pFrame = SfxFrame::GetFirst(); pFrame; pFrame = SfxFrame::GetNext( *pFrame ) )
3606 {
3607 if ( pFrame->GetFrameInterface() == i_rFrame )
3608 break;
3609 }
3610 SfxViewFrame* pViewFrame = pFrame ? pFrame->GetCurrentViewFrame() : NULL;
3611 ENSURE_OR_RETURN_VOID( pViewFrame != NULL, "SfxViewFrame::ActivateToolPanel: did not find an SfxFrame for the given XFrame!" );
3612
3613 pViewFrame->ActivateToolPanel_Impl( i_rPanelURL );
3614 }
3615
3616 // ---------------------------------------------------------------------------------------------------------------------
ActivateToolPanel_Impl(const::rtl::OUString & i_rPanelURL)3617 void SfxViewFrame::ActivateToolPanel_Impl( const ::rtl::OUString& i_rPanelURL )
3618 {
3619 // ensure the task pane is visible
3620 ENSURE_OR_RETURN_VOID( KnowsChildWindow( SID_TASKPANE ), "SfxViewFrame::ActivateToolPanel: this frame/module does not allow for a task pane!" );
3621 if ( !HasChildWindow( SID_TASKPANE ) )
3622 ToggleChildWindow( SID_TASKPANE );
3623
3624 SfxChildWindow* pTaskPaneChildWindow = GetChildWindow( SID_TASKPANE );
3625 ENSURE_OR_RETURN_VOID( pTaskPaneChildWindow, "SfxViewFrame::ActivateToolPanel_Impl: just switched it on, but it is not there!" );
3626
3627 ::sfx2::ITaskPaneToolPanelAccess* pPanelAccess = dynamic_cast< ::sfx2::ITaskPaneToolPanelAccess* >( pTaskPaneChildWindow );
3628 ENSURE_OR_RETURN_VOID( pPanelAccess, "SfxViewFrame::ActivateToolPanel_Impl: task pane child window does not implement a required interface!" );
3629 pPanelAccess->ActivateToolPanel( i_rPanelURL );
3630 }
3631