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 #include <com/sun/star/embed/EmbedStates.hpp> 27 #include <com/sun/star/uno/Reference.h> 28 #include <com/sun/star/awt/XWindow.hpp> 29 #include <com/sun/star/util/XURLTransformer.hpp> 30 #include <com/sun/star/util/XCloseable.hpp> 31 #include <com/sun/star/util/CloseVetoException.hpp> 32 #include <com/sun/star/lang/XComponent.hpp> 33 #include <com/sun/star/lang/DisposedException.hpp> 34 #include <com/sun/star/container/XChild.hpp> 35 36 #ifndef _MENU_HXX //autogen 37 #include <vcl/menu.hxx> 38 #endif 39 #include <svl/intitem.hxx> 40 #ifndef _SPLITWIN_HXX //autogen 41 #include <vcl/splitwin.hxx> 42 #endif 43 #include <svl/eitem.hxx> 44 #include <svl/stritem.hxx> 45 #ifndef _TOOLKIT_UNOHLP_HXX 46 #include <toolkit/helper/vclunohelper.hxx> 47 #endif 48 #include <com/sun/star/awt/PosSize.hpp> 49 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX 50 #include <comphelper/processfactory.hxx> 51 #endif 52 #include <vcl/msgbox.hxx> 53 54 #ifndef GCC 55 #endif 56 57 // wg. pTopFrames 58 #include "appdata.hxx" 59 #include <sfx2/app.hxx> 60 #include <sfx2/event.hxx> 61 #include <sfx2/unoctitm.hxx> 62 #include <sfx2/frame.hxx> 63 #include "arrdecl.hxx" 64 #include <sfx2/objsh.hxx> 65 #include <sfx2/dispatch.hxx> 66 #include <sfx2/docfile.hxx> 67 #include <sfx2/docfilt.hxx> 68 #include <sfx2/frmdescr.hxx> 69 #include "openflag.hxx" 70 #include <sfx2/viewsh.hxx> 71 #include <sfx2/viewfrm.hxx> 72 #include <sfx2/request.hxx> 73 #include <sfx2/fcontnr.hxx> 74 #include "impframe.hxx" 75 #include <sfx2/appuno.hxx> 76 #include <sfx2/viewfrm.hxx> 77 #include "workwin.hxx" 78 #include <sfx2/sfxuno.hxx> 79 #include <sfx2/msgpool.hxx> 80 #include "objshimp.hxx" 81 #include <sfx2/ipclient.hxx> 82 83 #ifdef DBG_UTIL 84 #include <sfx2/frmhtmlw.hxx> 85 #endif 86 87 using namespace com::sun::star; 88 89 static SfxFrameArr_Impl* pFramesArr_Impl=0; 90 91 using namespace ::com::sun::star::uno; 92 using namespace ::com::sun::star::util; 93 using namespace ::com::sun::star::frame; 94 using namespace ::com::sun::star::container; 95 96 TYPEINIT1(SfxFrame, SfxListener); 97 TYPEINIT1_AUTOFACTORY(SfxFrameItem, SfxPoolItem); 98 TYPEINIT1(SfxUsrAnyItem, SfxPoolItem); 99 TYPEINIT1_AUTOFACTORY(SfxUnoFrameItem, SfxPoolItem); 100 101 SvCompatWeakHdl* SfxFrame::GetHdl() 102 { 103 return pImp->GetHdl(); 104 } 105 106 //-------------------------------------------------------------------- 107 void SfxFrame::Construct_Impl() 108 { 109 pImp = new SfxFrame_Impl( this ); 110 if ( !pFramesArr_Impl ) 111 pFramesArr_Impl = new SfxFrameArr_Impl; 112 pFramesArr_Impl->Insert( this, pFramesArr_Impl->Count() ); 113 } 114 115 //-------------------------------------------------------------------- 116 117 SfxFrame::~SfxFrame() 118 { 119 RemoveTopFrame_Impl( this ); 120 DELETEZ( pWindow ); 121 122 pFramesArr_Impl->Remove( pFramesArr_Impl->GetPos( this ) ); 123 124 if ( pParentFrame ) 125 { 126 pParentFrame->RemoveChildFrame_Impl( this ); 127 pParentFrame = 0; 128 } 129 130 delete pImp->pDescr; 131 132 if ( pChildArr ) 133 { 134 DBG_ASSERT( !pChildArr->Count(), "Childs nicht entfernt!" ); 135 delete pChildArr; 136 } 137 138 delete pImp; 139 } 140 141 sal_Bool SfxFrame::DoClose() 142 { 143 // Eigentlich wird noch ein PrepareClose gebraucht !!! 144 sal_Bool bRet = sal_False; 145 if ( !pImp->bClosing ) 146 { 147 pImp->bClosing = sal_True; 148 CancelTransfers(); 149 150 // now close frame; it will be deleted if this call is successful, so don't use any members after that! 151 bRet = sal_True; 152 try 153 { 154 Reference< XCloseable > xCloseable ( pImp->xFrame, UNO_QUERY ); 155 if ( (!GetCurrentDocument() || !GetCurrentDocument()->Get_Impl()->bDisposing ) && xCloseable.is()) 156 xCloseable->close(sal_True); 157 else if ( pImp->xFrame.is() ) 158 { 159 Reference < XFrame > xFrame = pImp->xFrame; 160 xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() ); 161 xFrame->dispose(); 162 } 163 else 164 bRet = DoClose_Impl(); 165 } 166 catch( ::com::sun::star::util::CloseVetoException& ) 167 { 168 pImp->bClosing = sal_False; 169 bRet = sal_False; 170 } 171 catch( ::com::sun::star::lang::DisposedException& ) 172 { 173 } 174 } 175 176 return bRet; 177 } 178 179 sal_Bool SfxFrame::DoClose_Impl() 180 { 181 sal_Bool bRet = sal_True; 182 SfxBindings* pBindings = NULL; 183 if ( pImp->pCurrentViewFrame ) 184 pBindings = &pImp->pCurrentViewFrame->GetBindings(); 185 186 // Bei internen Tasks m"ussen Controller und Tools abger"aumt werden 187 if ( pImp->pWorkWin ) 188 pImp->pWorkWin->DeleteControllers_Impl(); 189 190 if ( pImp->pCurrentViewFrame ) 191 bRet = pImp->pCurrentViewFrame->Close(); 192 193 if ( pImp->bOwnsBindings ) 194 DELETEZ( pBindings ); 195 196 bRet = Close(); 197 DBG_ASSERT( bRet, "Impossible state: frame closes, but controller refuses!"); 198 return bRet; 199 } 200 201 sal_Bool SfxFrame::DocIsModified_Impl() 202 { 203 if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetObjectShell() && 204 pImp->pCurrentViewFrame->GetObjectShell()->IsModified() ) 205 return sal_True; 206 for( sal_uInt16 nPos = GetChildFrameCount(); nPos--; ) 207 if( pChildArr->GetObject( nPos )->DocIsModified_Impl() ) 208 return sal_True; 209 return sal_False; 210 } 211 212 sal_uInt16 SfxFrame::PrepareClose_Impl( sal_Bool bUI, sal_Bool bForBrowsing ) 213 { 214 sal_uInt16 nRet = RET_OK; 215 216 // prevent recursive calls 217 if( !pImp->bPrepClosing ) 218 { 219 pImp->bPrepClosing = sal_True; 220 221 SfxObjectShell* pCur = GetCurrentDocument() ; 222 if( pCur ) 223 { 224 // SFX components have a known behaviour 225 // First check if this frame is the only view to its current document 226 int bOther = sal_False; 227 for ( const SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pCur ); 228 !bOther && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, pCur ) ) 229 { 230 bOther = ( &pFrame->GetFrame() != this ); 231 } 232 233 SFX_APP()->NotifyEvent( SfxViewEventHint(SFX_EVENT_PREPARECLOSEVIEW, GlobalEventConfig::GetEventName( STR_EVENT_PREPARECLOSEVIEW ), pCur, GetController() ) ); 234 235 if ( bOther ) 236 // if there are other views only the current view of this frame must be asked 237 nRet = GetCurrentViewFrame()->GetViewShell()->PrepareClose( bUI, bForBrowsing ); 238 else 239 // otherwise ask the document 240 nRet = pCur->PrepareClose( bUI, bForBrowsing ); 241 } 242 243 if ( nRet == RET_OK ) 244 { 245 // if this frame has child frames, ask them too 246 for( sal_uInt16 nPos = GetChildFrameCount(); nRet == RET_OK && nPos--; ) 247 nRet = pChildArr->GetObject( nPos )->PrepareClose_Impl( bUI, bForBrowsing ); 248 } 249 250 pImp->bPrepClosing = sal_False; 251 } 252 253 if ( nRet == RET_OK && pImp->pWorkWin ) 254 // if closing was accepted by the component the UI subframes must be asked also 255 nRet = pImp->pWorkWin->PrepareClose_Impl(); 256 257 return nRet; 258 } 259 260 //-------------------------------------------------------------------- 261 262 SfxFrame* SfxFrame::GetChildFrame( sal_uInt16 nPos ) const 263 { 264 if ( pChildArr && pChildArr->Count() > nPos ) 265 { 266 DBG_ASSERT( nPos < pChildArr->Count(), "Falscher Index!"); 267 return (*pChildArr)[nPos]; 268 } 269 270 return 0L; 271 } 272 273 void SfxFrame::RemoveChildFrame_Impl( SfxFrame* pFrame ) 274 { 275 DBG_ASSERT( pChildArr, "Unbekannter Frame!"); 276 sal_uInt16 nPos = pChildArr->GetPos(pFrame); 277 pChildArr->Remove( nPos ); 278 }; 279 280 SfxFrame& SfxFrame::GetTopFrame() const 281 { 282 const SfxFrame* pParent = this; 283 while ( pParent->pParentFrame ) 284 pParent = pParent->pParentFrame; 285 return *const_cast< SfxFrame* >( pParent ); 286 } 287 288 sal_Bool SfxFrame::IsClosing_Impl() const 289 { 290 return pImp->bClosing; 291 } 292 293 void SfxFrame::SetIsClosing_Impl() 294 { 295 pImp->bClosing = sal_True; 296 } 297 298 sal_uInt16 SfxFrame::GetChildFrameCount() const 299 { 300 return pChildArr ? pChildArr->Count() : 0; 301 } 302 303 void SfxFrame::CancelTransfers( sal_Bool /*bCancelLoadEnv*/ ) 304 { 305 if( !pImp->bInCancelTransfers ) 306 { 307 pImp->bInCancelTransfers = sal_True; 308 SfxObjectShell* pObj = GetCurrentDocument(); 309 if( pObj ) //&& !( pObj->Get_Impl()->nLoadedFlags & SFX_LOADED_ALL )) 310 { 311 SfxViewFrame* pFrm; 312 for( pFrm = SfxViewFrame::GetFirst( pObj ); 313 pFrm && &pFrm->GetFrame() == this; 314 pFrm = SfxViewFrame::GetNext( *pFrm, pObj ) ) ; 315 // Keine anderer Frame mehr auf Doc -> Cancel 316 if( !pFrm ) 317 { 318 pObj->CancelTransfers(); 319 GetCurrentDocument()->Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) ); 320 } 321 } 322 323 // zuerst Nachladende Frames stoppen 324 sal_uInt16 nCount = GetChildFrameCount(); 325 for( sal_uInt16 n = 0; n<nCount; n++ ) 326 GetChildFrame( n )->CancelTransfers(); 327 328 // ggf. StarOne-Loader canceln 329 SfxFrameWeak wFrame( this ); 330 if (wFrame.Is()) 331 pImp->bInCancelTransfers = sal_False; 332 } 333 } 334 335 SfxViewFrame* SfxFrame::GetCurrentViewFrame() const 336 { 337 return pImp->pCurrentViewFrame; 338 } 339 340 SfxDispatcher* SfxFrame::GetDispatcher_Impl() const 341 { 342 if ( pImp->pCurrentViewFrame ) 343 return pImp->pCurrentViewFrame->GetDispatcher(); 344 return GetParentFrame()->GetDispatcher_Impl(); 345 } 346 347 SfxObjectShell* SfxFrame::GetCurrentDocument() const 348 { 349 return pImp->pCurrentViewFrame ? 350 pImp->pCurrentViewFrame->GetObjectShell() : 351 NULL; 352 } 353 354 void SfxFrame::SetCurrentViewFrame_Impl( SfxViewFrame *pFrame ) 355 { 356 pImp->pCurrentViewFrame = pFrame; 357 } 358 359 sal_uInt32 SfxFrame::GetFrameType() const 360 { 361 return pImp->nType; 362 } 363 364 void SfxFrame::SetFrameType_Impl( sal_uInt32 n ) 365 { 366 pImp->nType = n; 367 } 368 369 void SfxFrame::GetViewData_Impl() 370 { 371 // Alle zwischen Laden und Entfernen "anderbaren Daten aktualisieren; die 372 // festen Daten werden nur einmal ( nach PrepareForDoc_Impl in UpdateDescriptor ) 373 // geholt, um Zeit zu sparen. 374 SfxViewFrame* pViewFrame = GetCurrentViewFrame(); 375 if( pViewFrame && pViewFrame->GetViewShell() ) 376 { 377 const SfxMedium *pMed = GetCurrentDocument()->GetMedium(); 378 sal_Bool bReadOnly = pMed->GetOpenMode() == SFX_STREAM_READONLY; 379 GetDescriptor()->SetReadOnly( bReadOnly ); 380 381 SfxItemSet *pSet = GetDescriptor()->GetArgs(); 382 sal_Bool bGetViewData = sal_False; 383 if ( GetController().is() && pSet->GetItemState( SID_VIEW_DATA ) != SFX_ITEM_SET ) 384 { 385 ::com::sun::star::uno::Any aData = GetController()->getViewData(); 386 pSet->Put( SfxUsrAnyItem( SID_VIEW_DATA, aData ) ); 387 bGetViewData = sal_True; 388 } 389 390 if ( pViewFrame->GetCurViewId() ) 391 pSet->Put( SfxUInt16Item( SID_VIEW_ID, pViewFrame->GetCurViewId() ) ); 392 if ( pChildArr ) 393 { 394 // Bei Framesets m"ussen auch die Daten der ChildViews geholt werden 395 sal_uInt16 nCount = pChildArr->Count(); 396 for ( sal_uInt16 n=nCount; n>0; n--) 397 { 398 SfxFrame* pFrame = (*pChildArr)[n-1]; 399 if ( bGetViewData ) 400 pFrame->GetDescriptor()->GetArgs()->ClearItem( SID_VIEW_DATA ); 401 pFrame->GetViewData_Impl(); 402 } 403 } 404 } 405 } 406 407 void SfxFrame::UpdateDescriptor( SfxObjectShell *pDoc ) 408 { 409 // Beim PrepareForDoc_Impl wird der Descriptor des Frames aktualisiert 410 // und sein ItemSet neu initialisiert. Alle Daten, die f"ur ein sp"ateres 411 // Restaurieren der View n"otig sind, sind damit festgehalten. 412 // Soll das Dokument ersetzt werden, wird durch GetViewData_Impl (s.o.) 413 // die neueste Information hinzugef"ugt. Alles zusammen wird dann in der 414 // Browse-History gesichert. Beim Aktivieren eines solchen FramePickEntry 415 // wird das komplette ItemSet und der Descriptor im OpenDoc mitgeschickt. 416 // Hier werden nur die festen Eigenschaften gesichert; die "anderbaren werden 417 // durch GetViewData geholt ( spart Zeit ). 418 DBG_ASSERT( pDoc, "NULL-Document inserted ?!" ); 419 420 GetParentFrame(); 421 const SfxMedium *pMed = pDoc->GetMedium(); 422 GetDescriptor()->SetActualURL( pMed->GetOrigURL() ); 423 424 SFX_ITEMSET_ARG( pMed->GetItemSet(), pItem, SfxBoolItem, SID_EDITDOC, sal_False ); 425 sal_Bool bEditable = ( !pItem || pItem->GetValue() ); 426 427 GetDescriptor()->SetEditable( bEditable ); 428 429 // FileOpen-Parameter merken 430 SfxItemSet* pItemSet = pMed->GetItemSet(); 431 String aMedName( pMed->GetName() ); 432 433 const SfxFilter* pFilter = pMed->GetOrigFilter(); 434 String aFilter; 435 if ( pFilter ) 436 aFilter = pFilter->GetFilterName(); 437 438 SFX_ITEMSET_ARG( pItemSet, pRefererItem, SfxStringItem, SID_REFERER, sal_False); 439 SFX_ITEMSET_ARG( pItemSet, pOptionsItem, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False); 440 SFX_ITEMSET_ARG( pItemSet, pTitle1Item, SfxStringItem, SID_DOCINFO_TITLE, sal_False); 441 442 SfxItemSet *pSet = GetDescriptor()->GetArgs(); 443 444 // Alle alten Items l"oschen 445 pSet->ClearItem(); 446 447 if ( pRefererItem ) 448 pSet->Put( *pRefererItem ); 449 else 450 pSet->Put( SfxStringItem( SID_REFERER, String() ) ); 451 452 if ( pOptionsItem ) 453 pSet->Put( *pOptionsItem ); 454 455 if ( pTitle1Item ) 456 pSet->Put( *pTitle1Item ); 457 458 pSet->Put( SfxStringItem( SID_FILTER_NAME, aFilter )); 459 } 460 461 //------------------------------------------------------------------------- 462 463 void SfxFrame::SetDescriptor( SfxFrameDescriptor *pD ) 464 { 465 DBG_ASSERT( pD, "Kein Descriptor!" ); 466 DBG_ASSERT( pD != pImp->pDescr, "Descriptor ist schon gesetzt!" ); 467 468 if ( pImp->pDescr ) 469 { 470 // Nur TopLevel-Frames verwalten ihren Descriptor selbst, bei den 471 // anderen tut es das Frameset 472 if ( !pParentFrame ) 473 delete pImp->pDescr; 474 } 475 pImp->pDescr = pD; 476 } 477 478 //------------------------------------------------------------------------- 479 480 SfxFrameDescriptor* SfxFrame::GetDescriptor() const 481 { 482 // On Demand einen FrameDescriptor anlegen; wenn es kein TopLevel-Frame 483 // ist, f"uhrt es zu Fehlern, da keine g"ulige Verkettung hergestellt wird 484 485 if ( !pImp->pDescr ) 486 { 487 DBG_ASSERT( !GetParentFrame(), "Kein TopLevel-Frame, aber kein Descriptor!" ); 488 pImp->pDescr = new SfxFrameDescriptor; 489 if ( GetCurrentDocument() ) 490 pImp->pDescr->SetURL( GetCurrentDocument()->GetMedium()->GetOrigURL() ); 491 } 492 return pImp->pDescr; 493 } 494 495 //------------------------------------------------------------------------- 496 497 void SfxFrame::GetTargetList( TargetList& rList ) const 498 { 499 if ( !GetParentFrame() ) 500 { 501 // Einen Leerstring f"ur 'Kein Target' 502 rList.Insert( new String() ); 503 rList.Insert( new String( DEFINE_CONST_UNICODE( "_top" ) ) ); 504 rList.Insert( new String( DEFINE_CONST_UNICODE( "_parent" ) ) ); 505 rList.Insert( new String( DEFINE_CONST_UNICODE( "_blank" ) ) ); 506 rList.Insert( new String( DEFINE_CONST_UNICODE( "_self" ) ) ); 507 } 508 509 SfxViewFrame* pView = GetCurrentViewFrame(); 510 if( pView && pView->GetViewShell() && pChildArr ) 511 { 512 sal_uInt16 nCount = pChildArr->Count(); 513 for ( sal_uInt16 n=0; n<nCount; n++) 514 { 515 SfxFrame* pFrame = (*pChildArr)[n]; 516 pFrame->GetTargetList( rList ); 517 } 518 } 519 } 520 521 //------------------------------------------------------------------------- 522 523 SfxBroadcaster& SfxFrame::GetBroadcaster() const 524 { 525 return *pImp; 526 } 527 528 sal_Bool SfxFrame::IsParent( SfxFrame *pFrame ) const 529 { 530 SfxFrame *pParent = pParentFrame; 531 while ( pParent ) 532 { 533 if ( pParent == pFrame ) 534 return sal_True; 535 pParent = pParent->pParentFrame; 536 } 537 538 return sal_False; 539 } 540 541 void SfxFrame::InsertTopFrame_Impl( SfxFrame* pFrame ) 542 { 543 SfxFrameArr_Impl& rArr = *SFX_APP()->Get_Impl()->pTopFrames; 544 rArr.Insert( pFrame, rArr.Count() ); 545 } 546 547 void SfxFrame::RemoveTopFrame_Impl( SfxFrame* pFrame ) 548 { 549 SfxFrameArr_Impl& rArr = *SFX_APP()->Get_Impl()->pTopFrames; 550 rArr.Remove( rArr.GetPos( pFrame ) ); 551 } 552 553 SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxViewFrame *p ) 554 : SfxPoolItem( nWhichId ), pFrame( p ? &p->GetFrame() : NULL ) 555 { 556 wFrame = pFrame; 557 } 558 559 SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxFrame *p ): 560 SfxPoolItem( nWhichId ), 561 pFrame( p ), wFrame( p ) 562 { 563 } 564 565 SfxFrameItem::SfxFrameItem( SfxFrame *p ): 566 SfxPoolItem( 0 ), 567 pFrame( p ), wFrame( p ) 568 { 569 } 570 571 int SfxFrameItem::operator==( const SfxPoolItem &rItem ) const 572 { 573 return ((SfxFrameItem&)rItem).pFrame == pFrame && 574 ((SfxFrameItem&)rItem).wFrame == wFrame; 575 } 576 577 //-------------------------------------------------------------------- 578 579 String SfxFrameItem::GetValueText() const 580 { 581 return String(); 582 } 583 584 SfxPoolItem* SfxFrameItem::Clone( SfxItemPool *) const 585 { 586 SfxFrameItem* pNew = new SfxFrameItem( wFrame); 587 pNew->SetFramePtr_Impl( pFrame ); 588 return pNew; 589 } 590 591 sal_Bool SfxFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const 592 { 593 if ( wFrame ) 594 { 595 rVal <<= wFrame->GetFrameInterface(); 596 return sal_True; 597 } 598 599 return sal_False; 600 } 601 602 sal_Bool SfxFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 ) 603 { 604 Reference < XFrame > xFrame; 605 if ( (rVal >>= xFrame) && xFrame.is() ) 606 { 607 SfxFrame* pFr = SfxFrame::GetFirst(); 608 while ( pFr ) 609 { 610 if ( pFr->GetFrameInterface() == xFrame ) 611 { 612 wFrame = pFrame = pFr; 613 return sal_True; 614 } 615 616 pFr = SfxFrame::GetNext( *pFr ); 617 } 618 return sal_True; 619 } 620 621 return sal_False; 622 } 623 624 625 SfxUsrAnyItem::SfxUsrAnyItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Any& rAny ) 626 : SfxPoolItem( nWhichId ) 627 { 628 aValue = rAny; 629 } 630 631 int SfxUsrAnyItem::operator==( const SfxPoolItem& /*rItem*/ ) const 632 { 633 // return rItem.ISA( SfxUsrAnyItem ) && ((SfxUsrAnyItem&)rItem).aValue == aValue; 634 return sal_False; 635 } 636 637 SfxPoolItem* SfxUsrAnyItem::Clone( SfxItemPool *) const 638 { 639 return new SfxUsrAnyItem( Which(), aValue ); 640 } 641 642 sal_Bool SfxUsrAnyItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const 643 { 644 rVal = aValue; 645 return sal_True; 646 } 647 648 sal_Bool SfxUsrAnyItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) 649 { 650 aValue = rVal; 651 return sal_True; 652 } 653 654 SfxUnoFrameItem::SfxUnoFrameItem() 655 : SfxPoolItem() 656 , m_xFrame() 657 { 658 } 659 660 SfxUnoFrameItem::SfxUnoFrameItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& i_rFrame ) 661 : SfxPoolItem( nWhichId ) 662 , m_xFrame( i_rFrame ) 663 { 664 } 665 666 int SfxUnoFrameItem::operator==( const SfxPoolItem& i_rItem ) const 667 { 668 return i_rItem.ISA( SfxUnoFrameItem ) && static_cast< const SfxUnoFrameItem& >( i_rItem ).m_xFrame == m_xFrame; 669 } 670 671 SfxPoolItem* SfxUnoFrameItem::Clone( SfxItemPool* ) const 672 { 673 return new SfxUnoFrameItem( Which(), m_xFrame ); 674 } 675 676 sal_Bool SfxUnoFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const 677 { 678 rVal <<= m_xFrame; 679 return sal_True; 680 } 681 682 sal_Bool SfxUnoFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) 683 { 684 return ( rVal >>= m_xFrame ); 685 } 686 687 SfxFrameIterator::SfxFrameIterator( const SfxFrame& rFrame, sal_Bool bRecur ) 688 : pFrame( &rFrame ) 689 , bRecursive( bRecur ) 690 {} 691 692 SfxFrame* SfxFrameIterator::FirstFrame() 693 { 694 // GetFirst beginnt die Iteration beim ersten ChildFrame 695 return pFrame->GetChildFrame( 0 ); 696 } 697 698 SfxFrame* SfxFrameIterator::NextFrame( SfxFrame& rPrev ) 699 { 700 // Zuerst auf Kinder testen, wenn Rekursion erw"unscht 701 SfxFrame *pRet = NULL; 702 if ( bRecursive ) 703 pRet = rPrev.GetChildFrame( 0 ); 704 if ( !pRet ) 705 { 706 // Anderenfalls mit den Geschwistern von rPrev weitermachen 707 pRet = NextSibling_Impl( rPrev ); 708 } 709 710 return pRet; 711 } 712 713 714 SfxFrame* SfxFrameIterator::NextSibling_Impl( SfxFrame& rPrev ) 715 { 716 SfxFrame *pRet = NULL; 717 if ( &rPrev != pFrame ) 718 { 719 SfxFrameArr_Impl& rArr = *rPrev.pParentFrame->pChildArr; 720 sal_uInt16 nPos = rArr.GetPos( &rPrev ); 721 if ( nPos+1 < rArr.Count() ) 722 pRet = rArr[nPos+1]; 723 724 if ( !pRet && rPrev.pParentFrame->pParentFrame ) 725 pRet = NextSibling_Impl( *rPrev.pParentFrame ); 726 } 727 728 return pRet; 729 } 730 731 sal_Bool SfxFrame::IsTop() const 732 { 733 return GetFrameInterface().is() ? GetFrameInterface()->isTop() : sal_False; 734 } 735 736 sal_Bool SfxFrame::HasComponent() const 737 { 738 return sal_False; 739 } 740 741 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SfxFrame::GetController() const 742 { 743 if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetViewShell() ) 744 return pImp->pCurrentViewFrame->GetViewShell()->GetController(); 745 else 746 return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > (); 747 } 748 749 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxFrame::GetFrameInterface() const 750 { 751 return pImp->xFrame; 752 } 753 754 void SfxFrame::SetFrameInterface_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame ) 755 { 756 pImp->xFrame = rFrame; 757 com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder; 758 if ( !rFrame.is() && GetCurrentViewFrame() ) 759 GetCurrentViewFrame()->GetBindings().SetRecorder_Impl( xRecorder ); 760 } 761 762 void SfxFrame::Appear() 763 { 764 if ( GetCurrentViewFrame() ) 765 { 766 GetCurrentViewFrame()->Show(); 767 GetWindow().Show(); 768 pImp->xFrame->getContainerWindow()->setVisible( sal_True ); 769 if ( pParentFrame ) 770 pParentFrame->Appear(); 771 Reference < ::com::sun::star::awt::XTopWindow > xTopWindow( pImp->xFrame->getContainerWindow(), UNO_QUERY ); 772 if ( xTopWindow.is() ) 773 xTopWindow->toFront(); 774 } 775 } 776 777 void SfxFrame::AppearWithUpdate() 778 { 779 Appear(); 780 if ( GetCurrentViewFrame() ) 781 GetCurrentViewFrame()->GetDispatcher()->Update_Impl( sal_True ); 782 } 783 784 void SfxFrame::SetOwnsBindings_Impl( sal_Bool bSet ) 785 { 786 pImp->bOwnsBindings = bSet; 787 } 788 789 sal_Bool SfxFrame::OwnsBindings_Impl() const 790 { 791 return pImp->bOwnsBindings; 792 } 793 794 void SfxFrame::SetToolSpaceBorderPixel_Impl( const SvBorder& rBorder ) 795 { 796 pImp->aBorder = rBorder; 797 SfxViewFrame *pF = GetCurrentViewFrame(); 798 if ( pF ) 799 { 800 Point aPos ( rBorder.Left(), rBorder.Top() ); 801 Size aSize( GetWindow().GetOutputSizePixel() ); 802 long nDeltaX = rBorder.Left() + rBorder.Right(); 803 if ( aSize.Width() > nDeltaX ) 804 aSize.Width() -= nDeltaX; 805 else 806 aSize.Width() = 0; 807 808 long nDeltaY = rBorder.Top() + rBorder.Bottom(); 809 if ( aSize.Height() > nDeltaY ) 810 aSize.Height() -= nDeltaY; 811 else 812 aSize.Height() = 0; 813 814 if ( GetParentFrame() ) 815 { 816 sal_Bool bHasTools = rBorder.Left() != rBorder.Right() || rBorder.Top() != rBorder.Bottom(); 817 pF->GetWindow().SetBorderStyle( bHasTools ? WINDOW_BORDER_NORMAL : WINDOW_BORDER_NOBORDER ); 818 } 819 820 pF->GetWindow().SetPosSizePixel( aPos, aSize ); 821 } 822 } 823 824 Rectangle SfxFrame::GetTopOuterRectPixel_Impl() const 825 { 826 Size aSize( GetWindow().GetOutputSizePixel() ); 827 Point aPoint; 828 return ( Rectangle ( aPoint, aSize ) ); 829 } 830 831 SfxWorkWindow* SfxFrame::GetWorkWindow_Impl() const 832 { 833 if ( pImp->pWorkWin ) 834 return pImp->pWorkWin; 835 else if ( pParentFrame ) 836 return pParentFrame->GetWorkWindow_Impl(); 837 else 838 return NULL; 839 } 840 841 void SfxFrame::SetWorkWindow_Impl( SfxWorkWindow* pWorkwin ) 842 { 843 pImp->pWorkWin = pWorkwin; 844 } 845 846 void SfxFrame::CreateWorkWindow_Impl() 847 { 848 SfxFrame* pFrame = this; 849 850 if ( IsInPlace() ) 851 { 852 // this makes sence only for inplace activated objects 853 try 854 { 855 Reference < XChild > xChild( GetCurrentDocument()->GetModel(), UNO_QUERY ); 856 if ( xChild.is() ) 857 { 858 Reference < XModel > xParent( xChild->getParent(), UNO_QUERY ); 859 if ( xParent.is() ) 860 { 861 Reference< XController > xParentCtrler = xParent->getCurrentController(); 862 if ( xParentCtrler.is() ) 863 { 864 Reference < XFrame > xFrame( xParentCtrler->getFrame() ); 865 SfxFrame* pFr = SfxFrame::GetFirst(); 866 while ( pFr ) 867 { 868 if ( pFr->GetFrameInterface() == xFrame ) 869 { 870 pFrame = pFr; 871 break; 872 } 873 874 pFr = SfxFrame::GetNext( *pFr ); 875 } 876 } 877 } 878 } 879 } 880 catch(Exception&) 881 { 882 OSL_ENSURE(0,"SfxFrame::CreateWorkWindow_Impl: Exception cachted. Please try to submit a repoducable bug !"); 883 } 884 } 885 886 pImp->pWorkWin = new SfxFrameWorkWin_Impl( &pFrame->GetWindow(), this, pFrame ); 887 } 888 889 void SfxFrame::GrabFocusOnComponent_Impl() 890 { 891 if ( pImp->bReleasingComponent ) 892 { 893 GetWindow().GrabFocus(); 894 return; 895 } 896 897 Window* pFocusWindow = &GetWindow(); 898 if ( GetCurrentViewFrame() && GetCurrentViewFrame()->GetViewShell() && GetCurrentViewFrame()->GetViewShell()->GetWindow() ) 899 pFocusWindow = GetCurrentViewFrame()->GetViewShell()->GetWindow(); 900 901 if( !pFocusWindow->HasChildPathFocus() ) 902 pFocusWindow->GrabFocus(); 903 } 904 905 void SfxFrame::ReleasingComponent_Impl( sal_Bool bSet ) 906 { 907 pImp->bReleasingComponent = bSet; 908 } 909 910 sal_Bool SfxFrame::IsInPlace() const 911 { 912 return pImp->bInPlace; 913 } 914 915 void SfxFrame::SetInPlace_Impl( sal_Bool bSet ) 916 { 917 pImp->bInPlace = bSet; 918 } 919 920 void SfxFrame::Resize() 921 { 922 if ( IsClosing_Impl() ) 923 return; 924 925 if ( OwnsBindings_Impl() ) 926 { 927 if ( IsInPlace() ) 928 { 929 SetToolSpaceBorderPixel_Impl( SvBorder() ); 930 } 931 else 932 { 933 // check for IPClient that contains UIactive object or object that is currently UI activating 934 SfxWorkWindow *pWork = GetWorkWindow_Impl(); 935 SfxInPlaceClient* pClient = GetCurrentViewFrame()->GetViewShell() ? GetCurrentViewFrame()->GetViewShell()->GetUIActiveIPClient_Impl() : 0; 936 if ( pClient ) 937 { 938 uno::Reference < lang::XUnoTunnel > xObj( pClient->GetObject()->getComponent(), uno::UNO_QUERY ); 939 uno::Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() ); 940 sal_Int64 nHandle = (xObj.is()? xObj->getSomething( aSeq ): 0); 941 if ( nHandle ) 942 { 943 SfxObjectShell* pDoc = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle )); 944 pWork = SfxViewFrame::GetFirst( pDoc )->GetFrame().GetWorkWindow_Impl(); 945 } 946 } 947 948 if ( pWork ) 949 { 950 pWork->ArrangeChilds_Impl(); 951 pWork->ShowChilds_Impl(); 952 } 953 954 // problem in presence of UIActive object: when the window is resized, but the toolspace border 955 // remains the same, setting the toolspace border at the ContainerEnvironment doesn't force a 956 // resize on the IPEnvironment; without that no resize is called for the SfxViewFrame. So always 957 // set the window size of the SfxViewFrame explicit. 958 SetToolSpaceBorderPixel_Impl( pImp->aBorder ); 959 } 960 } 961 else if ( pImp->pCurrentViewFrame ) 962 { 963 pImp->pCurrentViewFrame->GetWindow().SetSizePixel( GetWindow().GetOutputSizePixel() ); 964 } 965 966 } 967 968 SfxFrame* SfxFrame::GetFirst() 969 { 970 if ( !pFramesArr_Impl ) 971 return 0; 972 return pFramesArr_Impl->Count() ? pFramesArr_Impl->GetObject(0) : 0; 973 } 974 975 SfxFrame* SfxFrame::GetNext( SfxFrame& rFrame ) 976 { 977 sal_uInt16 nPos = pFramesArr_Impl->GetPos( &rFrame ); 978 if ( nPos+1 < pFramesArr_Impl->Count() ) 979 return pFramesArr_Impl->GetObject(nPos+1); 980 else 981 return NULL; 982 } 983 984 const SfxPoolItem* SfxFrame::OpenDocumentSynchron( SfxItemSet& i_rSet, const Reference< XFrame >& i_rTargetFrame ) 985 { 986 i_rSet.Put( SfxUnoFrameItem( SID_FILLFRAME, i_rTargetFrame ) ); 987 i_rSet.ClearItem( SID_TARGETNAME ); 988 return SFX_APP()->GetDispatcher_Impl()->Execute( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, i_rSet ); 989 } 990 991