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