LCOV - code coverage report
Current view: top level - sfx2/source/view - frame.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 257 462 55.6 %
Date: 2014-11-03 Functions: 48 94 51.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/embed/EmbedStates.hpp>
      21             : #include <com/sun/star/uno/Reference.h>
      22             : #include <com/sun/star/awt/XWindow.hpp>
      23             : #include <com/sun/star/util/XURLTransformer.hpp>
      24             : #include <com/sun/star/util/XCloseable.hpp>
      25             : #include <com/sun/star/util/CloseVetoException.hpp>
      26             : #include <com/sun/star/lang/XComponent.hpp>
      27             : #include <com/sun/star/lang/DisposedException.hpp>
      28             : #include <com/sun/star/container/XChild.hpp>
      29             : 
      30             : #include <vcl/menu.hxx>
      31             : #include <svl/intitem.hxx>
      32             : #include <vcl/splitwin.hxx>
      33             : #include <svl/eitem.hxx>
      34             : #include <svl/stritem.hxx>
      35             : #include <toolkit/helper/vclunohelper.hxx>
      36             : #include <com/sun/star/awt/PosSize.hpp>
      37             : #include <comphelper/processfactory.hxx>
      38             : #include <vcl/msgbox.hxx>
      39             : 
      40             : // due to pTopFrames
      41             : #include "appdata.hxx"
      42             : #include <sfx2/app.hxx>
      43             : #include <sfx2/event.hxx>
      44             : #include <sfx2/unoctitm.hxx>
      45             : #include <sfx2/frame.hxx>
      46             : #include "arrdecl.hxx"
      47             : #include <sfx2/objsh.hxx>
      48             : #include <sfx2/dispatch.hxx>
      49             : #include <sfx2/docfile.hxx>
      50             : #include <sfx2/docfilt.hxx>
      51             : #include <sfx2/frmdescr.hxx>
      52             : #include "openflag.hxx"
      53             : #include <sfx2/viewsh.hxx>
      54             : #include <sfx2/viewfrm.hxx>
      55             : #include <sfx2/request.hxx>
      56             : #include <sfx2/fcontnr.hxx>
      57             : #include "impframe.hxx"
      58             : #include "workwin.hxx"
      59             : #include <sfx2/sfxuno.hxx>
      60             : #include <sfx2/msgpool.hxx>
      61             : #include "objshimp.hxx"
      62             : #include <sfx2/ipclient.hxx>
      63             : 
      64             : #ifdef DBG_UTIL
      65             : #include <sfx2/frmhtmlw.hxx>
      66             : #endif
      67             : 
      68             : using namespace com::sun::star;
      69             : 
      70             : static SfxFrameArr_Impl* pFramesArr_Impl=0;
      71             : 
      72             : using namespace ::com::sun::star::uno;
      73             : using namespace ::com::sun::star::util;
      74             : using namespace ::com::sun::star::frame;
      75             : using namespace ::com::sun::star::container;
      76             : 
      77           0 : TYPEINIT1(SfxFrame, SfxListener);
      78           8 : TYPEINIT1_AUTOFACTORY(SfxFrameItem, SfxPoolItem);
      79      375904 : TYPEINIT1(SfxUsrAnyItem, SfxPoolItem);
      80         453 : TYPEINIT1_AUTOFACTORY(SfxUnoFrameItem, SfxPoolItem);
      81             : 
      82        5508 : void SfxFrame::Construct_Impl()
      83             : {
      84        5508 :     pImp = new SfxFrame_Impl( this );
      85        5508 :     if ( !pFramesArr_Impl )
      86         148 :         pFramesArr_Impl = new SfxFrameArr_Impl;
      87        5508 :     pFramesArr_Impl->push_back( this );
      88        5508 : }
      89             : 
      90             : 
      91             : 
      92       16518 : SfxFrame::~SfxFrame()
      93             : {
      94        5506 :     RemoveTopFrame_Impl( this );
      95        5506 :     DELETEZ( pWindow );
      96             : 
      97        5506 :     SfxFrameArr_Impl::iterator it = std::find( pFramesArr_Impl->begin(), pFramesArr_Impl->end(), this );
      98        5506 :     if ( it != pFramesArr_Impl->end() )
      99        5506 :         pFramesArr_Impl->erase( it );
     100             : 
     101        5506 :     if ( pParentFrame )
     102             :     {
     103           0 :         pParentFrame->RemoveChildFrame_Impl( this );
     104           0 :         pParentFrame = 0;
     105             :     }
     106             : 
     107        5506 :     delete pImp->pDescr;
     108             : 
     109        5506 :     if ( pChildArr )
     110             :     {
     111             :         DBG_ASSERT( pChildArr->empty(), "Children are not removed!" );
     112           0 :         delete pChildArr;
     113             :     }
     114             : 
     115        5506 :     delete pImp;
     116       11012 : }
     117             : 
     118        5267 : bool SfxFrame::DoClose()
     119             : {
     120             :     // Actually, one more PrepareClose is still needed!
     121        5267 :     bool bRet = false;
     122        5267 :     if ( !pImp->bClosing )
     123             :     {
     124        5267 :         pImp->bClosing = true;
     125        5267 :         CancelTransfers();
     126             : 
     127             :         // now close frame; it will be deleted if this call is successful, so don't use any members after that!
     128        5267 :         bRet = true;
     129             :         try
     130             :         {
     131        5267 :             Reference< XCloseable > xCloseable  ( pImp->xFrame, UNO_QUERY );
     132        5267 :             if ( (!GetCurrentDocument() || !GetCurrentDocument()->Get_Impl()->bDisposing ) && xCloseable.is())
     133        5267 :                 xCloseable->close(sal_True);
     134           0 :             else if ( pImp->xFrame.is() )
     135             :             {
     136           0 :                 Reference < XFrame > xFrame = pImp->xFrame;
     137           0 :                 xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
     138           0 :                 xFrame->dispose();
     139             :             }
     140             :             else
     141           0 :                 bRet = DoClose_Impl();
     142             :         }
     143           0 :         catch( ::com::sun::star::util::CloseVetoException& )
     144             :         {
     145           0 :             pImp->bClosing = false;
     146           0 :             bRet = false;
     147             :         }
     148           0 :         catch( ::com::sun::star::lang::DisposedException& )
     149             :         {
     150             :         }
     151             :     }
     152             : 
     153        5267 :     return bRet;
     154             : }
     155             : 
     156        5506 : bool SfxFrame::DoClose_Impl()
     157             : {
     158        5506 :     SfxBindings* pBindings = NULL;
     159        5506 :     if ( pImp->pCurrentViewFrame )
     160        5506 :         pBindings = &pImp->pCurrentViewFrame->GetBindings();
     161             : 
     162             :     // For internal tasks Controllers and Tools must be cleared
     163        5506 :     if ( pImp->pWorkWin )
     164        5506 :         pImp->pWorkWin->DeleteControllers_Impl();
     165             : 
     166        5506 :     if ( pImp->pCurrentViewFrame )
     167        5506 :         pImp->pCurrentViewFrame->Close();
     168             : 
     169        5506 :     if ( pImp->bOwnsBindings )
     170        5506 :         DELETEZ( pBindings );
     171             : 
     172        5506 :     bool bRet = Close();
     173             :     DBG_ASSERT( bRet, "Impossible state: frame closes, but controller refuses!");
     174        5506 :     return bRet;
     175             : }
     176             : 
     177           0 : bool SfxFrame::DocIsModified_Impl()
     178             : {
     179           0 :     if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetObjectShell() &&
     180           0 :             pImp->pCurrentViewFrame->GetObjectShell()->IsModified() )
     181           0 :         return true;
     182           0 :     for( sal_uInt16 nPos = GetChildFrameCount(); nPos--; )
     183           0 :         if( (*pChildArr)[ nPos ]->DocIsModified_Impl() )
     184           0 :             return true;
     185           0 :     return false;
     186             : }
     187             : 
     188           6 : bool SfxFrame::PrepareClose_Impl( bool bUI )
     189             : {
     190           6 :     bool nRet = true;
     191             : 
     192             :     // prevent recursive calls
     193           6 :     if( !pImp->bPrepClosing )
     194             :     {
     195           6 :         pImp->bPrepClosing = true;
     196             : 
     197           6 :         SfxObjectShell* pCur = GetCurrentDocument() ;
     198           6 :         if( pCur )
     199             :         {
     200             :             // SFX components have a known behaviour
     201             :             // First check if this frame is the only view to its current document
     202           6 :             bool bOther = false;
     203          24 :             for ( const SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pCur );
     204          24 :                     !bOther && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, pCur ) )
     205             :             {
     206           6 :                 bOther = ( &pFrame->GetFrame() != this );
     207             :             }
     208             : 
     209           6 :             SfxGetpApp()->NotifyEvent( SfxViewEventHint(SFX_EVENT_PREPARECLOSEVIEW, GlobalEventConfig::GetEventName( STR_EVENT_PREPARECLOSEVIEW ), pCur, GetController() ) );
     210             : 
     211           6 :             if ( bOther )
     212             :                 // if there are other views only the current view of this frame must be asked
     213           0 :                 nRet = GetCurrentViewFrame()->GetViewShell()->PrepareClose( bUI );
     214             :             else
     215             :                 // otherwise ask the document
     216           6 :                 nRet = pCur->PrepareClose( bUI );
     217             :         }
     218             : 
     219           6 :         if ( nRet )
     220             :         {
     221             :             // if this frame has child frames, ask them too
     222          12 :             for( sal_uInt16 nPos = GetChildFrameCount(); nRet && nPos--; )
     223           0 :                 nRet = (*pChildArr)[ nPos ]->PrepareClose_Impl( bUI );
     224             :         }
     225             : 
     226           6 :         pImp->bPrepClosing = false;
     227             :     }
     228             : 
     229           6 :     if ( nRet && pImp->pWorkWin )
     230             :         // if closing was accepted by the component the UI subframes must be asked also
     231           6 :         nRet = pImp->pWorkWin->PrepareClose_Impl();
     232             : 
     233           6 :     return nRet;
     234             : }
     235             : 
     236             : 
     237             : 
     238           0 : SfxFrame* SfxFrame::GetChildFrame( sal_uInt16 nPos ) const
     239             : {
     240           0 :     if ( pChildArr && pChildArr->size() > nPos )
     241             :     {
     242             :         DBG_ASSERT( nPos < pChildArr->size(), "Wrong Index!");
     243           0 :         return (*pChildArr)[nPos];
     244             :     }
     245             : 
     246           0 :     return 0L;
     247             : }
     248             : 
     249           0 : void SfxFrame::RemoveChildFrame_Impl( SfxFrame* pFrame )
     250             : {
     251             :     DBG_ASSERT( pChildArr, "Unknown Frame!");
     252           0 :     SfxFrameArr_Impl::iterator it = std::find( pChildArr->begin(), pChildArr->end(), pFrame );
     253           0 :     if ( it != pChildArr->end() )
     254           0 :         pChildArr->erase( it );
     255           0 : };
     256             : 
     257       43658 : SfxFrame& SfxFrame::GetTopFrame() const
     258             : {
     259       43658 :     const SfxFrame* pParent = this;
     260       87316 :     while ( pParent->pParentFrame )
     261           0 :         pParent = pParent->pParentFrame;
     262       43658 :     return *const_cast< SfxFrame* >( pParent );
     263             : }
     264             : 
     265      397353 : bool SfxFrame::IsClosing_Impl() const
     266             : {
     267      397353 :     return pImp->bClosing;
     268             : }
     269             : 
     270        5506 : void SfxFrame::SetIsClosing_Impl()
     271             : {
     272        5506 :     pImp->bClosing = true;
     273        5506 : }
     274             : 
     275        5273 : sal_uInt16 SfxFrame::GetChildFrameCount() const
     276             : {
     277        5273 :     return pChildArr ? pChildArr->size() : 0;
     278             : }
     279             : 
     280        5267 : void SfxFrame::CancelTransfers( bool /*bCancelLoadEnv*/ )
     281             : {
     282        5267 :     if( !pImp->bInCancelTransfers )
     283             :     {
     284        5267 :         pImp->bInCancelTransfers = true;
     285        5267 :         SfxObjectShell* pObj = GetCurrentDocument();
     286        5267 :         if( pObj ) //&& !( pObj->Get_Impl()->nLoadedFlags & SFX_LOADED_ALL ))
     287             :         {
     288             :             SfxViewFrame* pFrm;
     289       15734 :             for( pFrm = SfxViewFrame::GetFirst( pObj );
     290       10467 :                  pFrm && &pFrm->GetFrame() == this;
     291             :                  pFrm = SfxViewFrame::GetNext( *pFrm, pObj ) ) ;
     292             :             // No more Frame in Document -> Cancel
     293        5267 :             if( !pFrm )
     294             :             {
     295        5265 :                 pObj->CancelTransfers();
     296        5265 :                 GetCurrentDocument()->Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
     297             :             }
     298             :         }
     299             : 
     300             :         // First stop multiload Frames
     301        5267 :         sal_uInt16 nCount = GetChildFrameCount();
     302        5267 :         for( sal_uInt16 n = 0; n<nCount; n++ )
     303           0 :             GetChildFrame( n )->CancelTransfers();
     304             : 
     305             :         //  Check if StarOne-Loader should be canceled
     306        5267 :         SfxFrameWeakRef wFrame( this );
     307        5267 :         if (wFrame.Is())
     308        5267 :             pImp->bInCancelTransfers = false;
     309             :     }
     310        5267 : }
     311             : 
     312      229320 : SfxViewFrame* SfxFrame::GetCurrentViewFrame() const
     313             : {
     314      229320 :     return pImp->pCurrentViewFrame;
     315             : }
     316             : 
     317           0 : SfxDispatcher* SfxFrame::GetDispatcher_Impl() const
     318             : {
     319           0 :     if ( pImp->pCurrentViewFrame )
     320           0 :         return pImp->pCurrentViewFrame->GetDispatcher();
     321           0 :     return GetParentFrame()->GetDispatcher_Impl();
     322             : }
     323             : 
     324           0 : bool SfxFrame::IsAutoLoadLocked_Impl() const
     325             : {
     326             :     // Its own Docucument is locked?
     327           0 :     const SfxObjectShell* pObjSh = GetCurrentDocument();
     328           0 :     if ( !pObjSh || !pObjSh->IsAutoLoadLocked() )
     329           0 :         return false;
     330             : 
     331             :     // Its children are locked?
     332           0 :     for ( sal_uInt16 n = GetChildFrameCount(); n--; )
     333           0 :         if ( !GetChildFrame(n)->IsAutoLoadLocked_Impl() )
     334           0 :             return false;
     335             : 
     336             :     // otherwise allow AutoLoad
     337           0 :     return true;
     338             : }
     339             : 
     340       26582 : SfxObjectShell* SfxFrame::GetCurrentDocument() const
     341             : {
     342             :     return pImp->pCurrentViewFrame ?
     343       21074 :             pImp->pCurrentViewFrame->GetObjectShell() :
     344       47656 :             NULL;
     345             : }
     346             : 
     347       11014 : void SfxFrame::SetCurrentViewFrame_Impl( SfxViewFrame *pFrame )
     348             : {
     349       11014 :     pImp->pCurrentViewFrame = pFrame;
     350       11014 : }
     351             : 
     352       11014 : sal_uInt32 SfxFrame::GetFrameType() const
     353             : {
     354       11014 :     return pImp->nType;
     355             : }
     356             : 
     357        5508 : void SfxFrame::SetFrameType_Impl( sal_uInt32 n )
     358             : {
     359        5508 :     pImp->nType = n;
     360        5508 : }
     361             : 
     362           2 : void SfxFrame::GetViewData_Impl()
     363             : {
     364             :     // Update all modifiable data between load and unload, the
     365             :     // fixed data is only processed once (after PrepareForDoc_Impl in
     366             :     // updateDescriptor) to save time.
     367             : 
     368           2 :     SfxViewFrame* pViewFrame = GetCurrentViewFrame();
     369           2 :     if( pViewFrame && pViewFrame->GetViewShell() )
     370             :     {
     371           2 :         const SfxMedium *pMed = GetCurrentDocument()->GetMedium();
     372           2 :         bool bReadOnly = pMed->GetOpenMode() == SFX_STREAM_READONLY;
     373           2 :         GetDescriptor()->SetReadOnly( bReadOnly );
     374             : 
     375           2 :         SfxItemSet *pSet = GetDescriptor()->GetArgs();
     376           2 :         bool bGetViewData = false;
     377           2 :         if ( GetController().is() && pSet->GetItemState( SID_VIEW_DATA ) != SfxItemState::SET )
     378             :         {
     379           2 :             ::com::sun::star::uno::Any aData = GetController()->getViewData();
     380           2 :             pSet->Put( SfxUsrAnyItem( SID_VIEW_DATA, aData ) );
     381           2 :             bGetViewData = true;
     382             :         }
     383             : 
     384           2 :         if ( pViewFrame->GetCurViewId() )
     385           2 :             pSet->Put( SfxUInt16Item( SID_VIEW_ID, pViewFrame->GetCurViewId() ) );
     386           2 :         if ( pChildArr )
     387             :         {
     388             :             // For Framesets also the data from the ChildViews hace to be processed
     389           0 :             sal_uInt16 nCount = pChildArr->size();
     390           0 :             for ( sal_uInt16 n=nCount; n>0; n--)
     391             :             {
     392           0 :                 SfxFrame* pFrame = (*pChildArr)[n-1];
     393           0 :                 if ( bGetViewData )
     394           0 :                     pFrame->GetDescriptor()->GetArgs()->ClearItem( SID_VIEW_DATA );
     395           0 :                 pFrame->GetViewData_Impl();
     396             :             }
     397             :         }
     398             :     }
     399           2 : }
     400             : 
     401        5508 : void SfxFrame::UpdateDescriptor( SfxObjectShell *pDoc )
     402             : {
     403             :     // For PrepareForDoc_Impl frames, the descriptor of the updated
     404             :     // and new itemset to be initialized. All data fir restoring the view
     405             :     // are thus saved. If the document be replaced, GetViewData_Impl (so)
     406             :     // the latest information hinzugef by "added. All together then the
     407             :     // browser-history saved in. When you activate such frame pick entry
     408             :     // is complete itemsets and the descriptor in the OpenDoc sent;.
     409             :     // Here only the fixed properties identified "other adjustable, the
     410             :     // retrieved by GetViewData (saves time).
     411             : 
     412             :     assert(pDoc && "NULL-Document inserted ?!");
     413             : 
     414        5508 :     GetParentFrame();
     415        5508 :     const SfxMedium *pMed = pDoc->GetMedium();
     416        5508 :     GetDescriptor()->SetActualURL( pMed->GetOrigURL() );
     417             : 
     418        5508 :     SFX_ITEMSET_ARG( pMed->GetItemSet(), pItem, SfxBoolItem, SID_EDITDOC, false );
     419        5508 :     bool bEditable = ( !pItem || pItem->GetValue() );
     420             : 
     421        5508 :     GetDescriptor()->SetEditable( bEditable );
     422             : 
     423             :     // Mark FileOpen parameter
     424        5508 :     SfxItemSet* pItemSet = pMed->GetItemSet();
     425             : 
     426        5508 :     const SfxFilter* pFilter = pMed->GetOrigFilter();
     427        5508 :     OUString aFilter;
     428        5508 :     if ( pFilter )
     429        5480 :         aFilter = pFilter->GetFilterName();
     430             : 
     431        5508 :     SFX_ITEMSET_ARG( pItemSet, pRefererItem, SfxStringItem, SID_REFERER, false);
     432        5508 :     SFX_ITEMSET_ARG( pItemSet, pOptionsItem, SfxStringItem, SID_FILE_FILTEROPTIONS, false);
     433        5508 :     SFX_ITEMSET_ARG( pItemSet, pTitle1Item, SfxStringItem, SID_DOCINFO_TITLE, false);
     434             : 
     435        5508 :     SfxItemSet *pSet = GetDescriptor()->GetArgs();
     436             : 
     437             :     // Delete all old Items
     438        5508 :     pSet->ClearItem();
     439             : 
     440        5508 :     if ( pRefererItem )
     441        1474 :         pSet->Put( *pRefererItem );
     442             :     else
     443        4034 :         pSet->Put( SfxStringItem( SID_REFERER, OUString() ) );
     444             : 
     445        5508 :     if ( pOptionsItem )
     446           0 :         pSet->Put( *pOptionsItem );
     447             : 
     448        5508 :     if ( pTitle1Item )
     449           0 :         pSet->Put( *pTitle1Item );
     450             : 
     451        5508 :     pSet->Put( SfxStringItem( SID_FILTER_NAME, aFilter ));
     452        5508 : }
     453             : 
     454             : 
     455             : 
     456       16528 : SfxFrameDescriptor* SfxFrame::GetDescriptor() const
     457             : {
     458             :     // Create a FrameDescriptor On Demand; if there is no TopLevel-Frame
     459             :     // will result in an error, as no valid link is created.
     460             : 
     461       16528 :     if ( !pImp->pDescr )
     462             :     {
     463             :         DBG_ASSERT( !GetParentFrame(), "No TopLevel-Frame, but no Descriptor!" );
     464        5508 :         pImp->pDescr = new SfxFrameDescriptor;
     465        5508 :         if ( GetCurrentDocument() )
     466           0 :             pImp->pDescr->SetURL( GetCurrentDocument()->GetMedium()->GetOrigURL() );
     467             :     }
     468       16528 :     return pImp->pDescr;
     469             : }
     470             : 
     471           0 : void SfxFrame::GetDefaultTargetList(TargetList& rList)
     472             : {
     473             :     // An empty string for 'No Target'
     474           0 :     rList.push_back( OUString() );
     475           0 :     rList.push_back( OUString( "_top" ) );
     476           0 :     rList.push_back( OUString( "_parent" ) );
     477           0 :     rList.push_back( OUString( "_blank" ) );
     478           0 :     rList.push_back( OUString( "_self" ) );
     479           0 : }
     480             : 
     481           0 : void SfxFrame::GetTargetList( TargetList& rList ) const
     482             : {
     483           0 :     if ( !GetParentFrame() )
     484             :     {
     485           0 :         SfxFrame::GetDefaultTargetList(rList);
     486             :     }
     487             : 
     488           0 :     SfxViewFrame* pView = GetCurrentViewFrame();
     489           0 :     if( pView && pView->GetViewShell() && pChildArr )
     490             :     {
     491           0 :         sal_uInt16 nCount = pChildArr->size();
     492           0 :         for ( sal_uInt16 n=0; n<nCount; n++)
     493             :         {
     494           0 :             SfxFrame* pFrame = (*pChildArr)[n];
     495           0 :             pFrame->GetTargetList( rList );
     496             :         }
     497             :     }
     498           0 : }
     499             : 
     500           0 : bool SfxFrame::IsParent( SfxFrame *pFrame ) const
     501             : {
     502           0 :     SfxFrame *pParent = pParentFrame;
     503           0 :     while ( pParent )
     504             :     {
     505           0 :         if ( pParent == pFrame )
     506           0 :             return true;
     507           0 :         pParent = pParent->pParentFrame;
     508             :     }
     509             : 
     510           0 :     return false;
     511             : }
     512             : 
     513        5508 : void SfxFrame::InsertTopFrame_Impl( SfxFrame* pFrame )
     514             : {
     515        5508 :     SfxFrameArr_Impl& rArr = *SfxGetpApp()->Get_Impl()->pTopFrames;
     516        5508 :     rArr.push_back( pFrame );
     517        5508 : }
     518             : 
     519        5506 : void SfxFrame::RemoveTopFrame_Impl( SfxFrame* pFrame )
     520             : {
     521        5506 :     SfxFrameArr_Impl& rArr = *SfxGetpApp()->Get_Impl()->pTopFrames;
     522        5506 :     SfxFrameArr_Impl::iterator it = std::find( rArr.begin(), rArr.end(), pFrame );
     523        5506 :     if ( it != rArr.end() )
     524        5506 :         rArr.erase( it );
     525        5506 : }
     526             : 
     527           0 : SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxViewFrame *p )
     528           0 :     : SfxPoolItem( nWhichId ), pFrame( p ? &p->GetFrame() : NULL )
     529             : {
     530           0 :     wFrame = pFrame;
     531           0 : }
     532             : 
     533           0 : SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxFrame *p ):
     534             :     SfxPoolItem( nWhichId ),
     535           0 :     pFrame( p ), wFrame( p )
     536             : {
     537           0 : }
     538             : 
     539           0 : SfxFrameItem::SfxFrameItem( SfxFrame *p ):
     540             :     SfxPoolItem( 0 ),
     541           0 :     pFrame( p ), wFrame( p )
     542             : {
     543           0 : }
     544             : 
     545           0 : bool SfxFrameItem::operator==( const SfxPoolItem &rItem ) const
     546             : {
     547           0 :      return static_cast<const SfxFrameItem&>(rItem).pFrame == pFrame &&
     548           0 :          static_cast<const SfxFrameItem&>(rItem).wFrame == wFrame;
     549             : }
     550             : 
     551             : 
     552             : 
     553           0 : OUString SfxFrameItem::GetValueText() const
     554             : {
     555           0 :     return OUString();
     556             : }
     557             : 
     558           0 : SfxPoolItem* SfxFrameItem::Clone( SfxItemPool *) const
     559             : {
     560           0 :     SfxFrameItem* pNew = new SfxFrameItem( wFrame);
     561           0 :     pNew->SetFramePtr_Impl( pFrame );
     562           0 :     return pNew;
     563             : }
     564             : 
     565           0 : bool SfxFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const
     566             : {
     567           0 :     if ( wFrame )
     568             :     {
     569           0 :         rVal <<= wFrame->GetFrameInterface();
     570           0 :         return true;
     571             :     }
     572             : 
     573           0 :     return false;
     574             : }
     575             : 
     576           0 : bool SfxFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 )
     577             : {
     578           0 :     Reference < XFrame > xFrame;
     579           0 :     if ( (rVal >>= xFrame) && xFrame.is() )
     580             :     {
     581           0 :         SfxFrame* pFr = SfxFrame::GetFirst();
     582           0 :         while ( pFr )
     583             :         {
     584           0 :             if ( pFr->GetFrameInterface() == xFrame )
     585             :             {
     586           0 :                 wFrame = pFrame = pFr;
     587           0 :                 return true;
     588             :             }
     589             : 
     590           0 :             pFr = SfxFrame::GetNext( *pFr );
     591             :         }
     592           0 :         return true;
     593             :     }
     594             : 
     595           0 :     return false;
     596             : }
     597             : 
     598             : 
     599       91328 : SfxUsrAnyItem::SfxUsrAnyItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Any& rAny )
     600       91328 :     : SfxPoolItem( nWhichId )
     601             : {
     602       91328 :     aValue = rAny;
     603       91328 : }
     604             : 
     605           0 : bool SfxUsrAnyItem::operator==( const SfxPoolItem& /*rItem*/ ) const
     606             : {
     607           0 :     return false;
     608             : }
     609             : 
     610       51767 : SfxPoolItem* SfxUsrAnyItem::Clone( SfxItemPool *) const
     611             : {
     612       51767 :     return new SfxUsrAnyItem( Which(), aValue );
     613             : }
     614             : 
     615           0 : bool SfxUsrAnyItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
     616             : {
     617           0 :     rVal = aValue;
     618           0 :     return true;
     619             : }
     620             : 
     621           0 : bool SfxUsrAnyItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
     622             : {
     623           0 :     aValue = rVal;
     624           0 :     return true;
     625             : }
     626             : 
     627           0 : SfxUnoFrameItem::SfxUnoFrameItem()
     628             :     : SfxPoolItem()
     629           0 :     , m_xFrame()
     630             : {
     631           0 : }
     632             : 
     633        1160 : SfxUnoFrameItem::SfxUnoFrameItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& i_rFrame )
     634             :     : SfxPoolItem( nWhichId )
     635        1160 :     , m_xFrame( i_rFrame )
     636             : {
     637        1160 : }
     638             : 
     639           0 : bool SfxUnoFrameItem::operator==( const SfxPoolItem& i_rItem ) const
     640             : {
     641           0 :     return i_rItem.ISA( SfxUnoFrameItem ) && static_cast< const SfxUnoFrameItem& >( i_rItem ).m_xFrame == m_xFrame;
     642             : }
     643             : 
     644         862 : SfxPoolItem* SfxUnoFrameItem::Clone( SfxItemPool* ) const
     645             : {
     646         862 :     return new SfxUnoFrameItem( Which(), m_xFrame );
     647             : }
     648             : 
     649           0 : bool SfxUnoFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
     650             : {
     651           0 :     rVal <<= m_xFrame;
     652           0 :     return true;
     653             : }
     654             : 
     655           0 : bool SfxUnoFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
     656             : {
     657           0 :     return ( rVal >>= m_xFrame );
     658             : }
     659             : 
     660           0 : SfxFrameIterator::SfxFrameIterator( const SfxFrame& rFrame, bool bRecur )
     661             :     : pFrame( &rFrame )
     662           0 :     , bRecursive( bRecur )
     663           0 : {}
     664             : 
     665           0 : SfxFrame* SfxFrameIterator::FirstFrame()
     666             : {
     667             :     // GetFirst starts the iteration at the first child frame
     668           0 :     return pFrame->GetChildFrame( 0 );
     669             : }
     670             : 
     671           0 : SfxFrame* SfxFrameIterator::NextFrame( SfxFrame& rPrev )
     672             : {
     673             :     // If recursion is requested testing is done first on Children.
     674           0 :     SfxFrame *pRet = NULL;
     675           0 :     if ( bRecursive )
     676           0 :         pRet = rPrev.GetChildFrame( 0 );
     677           0 :     if ( !pRet )
     678             :     {
     679             :         // In other case continue with the siblings of rPrev
     680           0 :         pRet = NextSibling_Impl( rPrev );
     681             :     }
     682             : 
     683           0 :     return pRet;
     684             : }
     685             : 
     686             : 
     687           0 : SfxFrame* SfxFrameIterator::NextSibling_Impl( SfxFrame& rPrev )
     688             : {
     689           0 :     SfxFrame *pRet = NULL;
     690           0 :     if ( &rPrev != pFrame )
     691             :     {
     692           0 :         SfxFrameArr_Impl& rArr = *rPrev.pParentFrame->pChildArr;
     693           0 :         SfxFrameArr_Impl::iterator it = std::find( rArr.begin(), rArr.end(), &rPrev );
     694           0 :         if ( it != rArr.end() && (++it) != rArr.end() )
     695           0 :             pRet = *it;
     696             : 
     697           0 :         if ( !pRet && rPrev.pParentFrame->pParentFrame )
     698           0 :             pRet = NextSibling_Impl( *rPrev.pParentFrame );
     699             :     }
     700             : 
     701           0 :     return pRet;
     702             : }
     703             : 
     704       15264 : bool SfxFrame::HasComponent() const
     705             : {
     706       15264 :     return false;
     707             : }
     708             : 
     709       29722 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SfxFrame::GetController() const
     710             : {
     711       29722 :     if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetViewShell() )
     712       28628 :         return pImp->pCurrentViewFrame->GetViewShell()->GetController();
     713             :     else
     714        1094 :         return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > ();
     715             : }
     716             : 
     717      394450 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >  SfxFrame::GetFrameInterface() const
     718             : {
     719      394450 :     return pImp->xFrame;
     720             : }
     721             : 
     722       11014 : void SfxFrame::SetFrameInterface_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame )
     723             : {
     724       11014 :     pImp->xFrame = rFrame;
     725       11014 :     com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder;
     726       11014 :     if ( !rFrame.is() && GetCurrentViewFrame() )
     727        5506 :         GetCurrentViewFrame()->GetBindings().SetRecorder_Impl( xRecorder );
     728       11014 : }
     729             : 
     730           2 : void SfxFrame::Appear()
     731             : {
     732           2 :     if ( GetCurrentViewFrame() )
     733             :     {
     734           2 :         GetCurrentViewFrame()->Show();
     735           2 :         GetWindow().Show();
     736           2 :         pImp->xFrame->getContainerWindow()->setVisible( sal_True );
     737           2 :         if ( pParentFrame )
     738           0 :             pParentFrame->Appear();
     739           2 :         Reference < ::com::sun::star::awt::XTopWindow > xTopWindow( pImp->xFrame->getContainerWindow(), UNO_QUERY );
     740           2 :         if ( xTopWindow.is() )
     741           2 :             xTopWindow->toFront();
     742             :     }
     743           2 : }
     744             : 
     745           0 : void SfxFrame::AppearWithUpdate()
     746             : {
     747           0 :     Appear();
     748           0 :     if ( GetCurrentViewFrame() )
     749           0 :         GetCurrentViewFrame()->GetDispatcher()->Update_Impl( true );
     750           0 : }
     751             : 
     752        5508 : void SfxFrame::SetOwnsBindings_Impl( bool bSet )
     753             : {
     754        5508 :     pImp->bOwnsBindings = bSet;
     755        5508 : }
     756             : 
     757       29271 : bool SfxFrame::OwnsBindings_Impl() const
     758             : {
     759       29271 :     return pImp->bOwnsBindings;
     760             : }
     761             : 
     762       43374 : void SfxFrame::SetToolSpaceBorderPixel_Impl( const SvBorder& rBorder )
     763             : {
     764       43374 :     pImp->aBorder = rBorder;
     765       43374 :     SfxViewFrame *pF = GetCurrentViewFrame();
     766       43374 :     if ( pF )
     767             :     {
     768       43374 :         Point aPos ( rBorder.Left(), rBorder.Top() );
     769       43374 :         Size aSize( GetWindow().GetOutputSizePixel() );
     770       43374 :         long nDeltaX = rBorder.Left() + rBorder.Right();
     771       43374 :         if ( aSize.Width() > nDeltaX )
     772       41720 :             aSize.Width() -= nDeltaX;
     773             :         else
     774        1654 :             aSize.Width() = 0;
     775             : 
     776       43374 :         long nDeltaY = rBorder.Top() + rBorder.Bottom();
     777       43374 :         if ( aSize.Height() > nDeltaY )
     778       41720 :             aSize.Height() -= nDeltaY;
     779             :         else
     780        1654 :             aSize.Height() = 0;
     781             : 
     782       43374 :         if ( GetParentFrame() )
     783             :         {
     784           0 :             bool bHasTools = rBorder.Left() != rBorder.Right() || rBorder.Top() != rBorder.Bottom();
     785           0 :             pF->GetWindow().SetBorderStyle( bHasTools ? WindowBorderStyle::NORMAL : WindowBorderStyle::NOBORDER );
     786             :         }
     787             : 
     788       43374 :         pF->GetWindow().SetPosSizePixel( aPos, aSize );
     789             :     }
     790       43374 : }
     791             : 
     792       65091 : Rectangle SfxFrame::GetTopOuterRectPixel_Impl() const
     793             : {
     794       65091 :     Size aSize( GetWindow().GetOutputSizePixel() );
     795       65091 :     Point aPoint;
     796       65091 :     return ( Rectangle ( aPoint, aSize ) );
     797             : }
     798             : 
     799      347465 : SfxWorkWindow* SfxFrame::GetWorkWindow_Impl() const
     800             : {
     801      347465 :     if ( pImp->pWorkWin )
     802      347465 :         return pImp->pWorkWin;
     803           0 :     else if ( pParentFrame )
     804           0 :         return pParentFrame->GetWorkWindow_Impl();
     805             :     else
     806           0 :         return NULL;
     807             : }
     808             : 
     809        5508 : void SfxFrame::CreateWorkWindow_Impl()
     810             : {
     811        5508 :     SfxFrame* pFrame = this;
     812             : 
     813        5508 :     if ( IsInPlace() )
     814             :     {
     815             :         // this makes sence only for inplace activated objects
     816             :         try
     817             :         {
     818           0 :             Reference < XChild > xChild( GetCurrentDocument()->GetModel(), UNO_QUERY );
     819           0 :             if ( xChild.is() )
     820             :             {
     821           0 :                 Reference < XModel > xParent( xChild->getParent(), UNO_QUERY );
     822           0 :                 if ( xParent.is() )
     823             :                 {
     824           0 :                     Reference< XController > xParentCtrler = xParent->getCurrentController();
     825           0 :                     if ( xParentCtrler.is() )
     826             :                     {
     827           0 :                         Reference < XFrame > xFrame( xParentCtrler->getFrame() );
     828           0 :                         SfxFrame* pFr = SfxFrame::GetFirst();
     829           0 :                         while ( pFr )
     830             :                         {
     831           0 :                             if ( pFr->GetFrameInterface() == xFrame )
     832             :                             {
     833           0 :                                 pFrame = pFr;
     834           0 :                                 break;
     835             :                             }
     836             : 
     837           0 :                             pFr = SfxFrame::GetNext( *pFr );
     838           0 :                         }
     839           0 :                     }
     840           0 :                 }
     841           0 :             }
     842             :         }
     843           0 :         catch(Exception&)
     844             :         {
     845             :             OSL_FAIL("SfxFrame::CreateWorkWindow_Impl: Exception cachted. Please try to submit a repoducable bug !");
     846             :         }
     847             :     }
     848             : 
     849        5508 :     pImp->pWorkWin = new SfxFrameWorkWin_Impl( &pFrame->GetWindow(), this, pFrame );
     850        5508 : }
     851             : 
     852        4958 : void SfxFrame::GrabFocusOnComponent_Impl()
     853             : {
     854        4958 :     if ( pImp->bReleasingComponent )
     855             :     {
     856           0 :         GetWindow().GrabFocus();
     857        4958 :         return;
     858             :     }
     859             : 
     860        4958 :     vcl::Window* pFocusWindow = &GetWindow();
     861        4958 :     if ( GetCurrentViewFrame() && GetCurrentViewFrame()->GetViewShell() && GetCurrentViewFrame()->GetViewShell()->GetWindow() )
     862        4958 :         pFocusWindow = GetCurrentViewFrame()->GetViewShell()->GetWindow();
     863             : 
     864        4958 :     if( !pFocusWindow->HasChildPathFocus() )
     865        4942 :         pFocusWindow->GrabFocus();
     866             : }
     867             : 
     868        5506 : void SfxFrame::ReleasingComponent_Impl( bool bSet )
     869             : {
     870        5506 :     pImp->bReleasingComponent = bSet;
     871        5506 : }
     872             : 
     873      426393 : bool SfxFrame::IsInPlace() const
     874             : {
     875      426393 :     return pImp->bInPlace;
     876             : }
     877             : 
     878           0 : void SfxFrame::SetInPlace_Impl( bool bSet )
     879             : {
     880           0 :     pImp->bInPlace = bSet;
     881           0 : }
     882             : 
     883       18309 : void SfxFrame::Resize()
     884             : {
     885       18309 :     if ( IsClosing_Impl() )
     886       18359 :         return;
     887             : 
     888       18259 :     if ( OwnsBindings_Impl() )
     889             :     {
     890       14475 :         if ( IsInPlace() )
     891             :         {
     892           0 :             SetToolSpaceBorderPixel_Impl( SvBorder() );
     893             :         }
     894             :         else
     895             :         {
     896             :             // check for IPClient that contains UIactive object or object that is currently UI activating
     897       14475 :             SfxWorkWindow *pWork = GetWorkWindow_Impl();
     898       14475 :             SfxInPlaceClient* pClient = GetCurrentViewFrame()->GetViewShell() ? GetCurrentViewFrame()->GetViewShell()->GetUIActiveIPClient_Impl() : 0;
     899       14475 :             if ( pClient )
     900             :             {
     901           2 :                 uno::Reference < lang::XUnoTunnel > xObj( pClient->GetObject()->getComponent(), uno::UNO_QUERY );
     902           4 :                 uno::Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() );
     903           2 :                 sal_Int64 nHandle = (xObj.is()? xObj->getSomething( aSeq ): 0);
     904           2 :                 if ( nHandle )
     905             :                 {
     906           0 :                     SfxObjectShell* pDoc = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle ));
     907           0 :                     SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDoc );
     908           0 :                     pWork = pFrame ? pFrame->GetFrame().GetWorkWindow_Impl() : NULL;
     909           2 :                 }
     910             :             }
     911             : 
     912       14475 :             if ( pWork )
     913             :             {
     914       14475 :                 pWork->ArrangeChildren_Impl();
     915       14475 :                 pWork->ShowChildren_Impl();
     916             :             }
     917             : 
     918             :             // problem in presence of UIActive object: when the window is resized, but the toolspace border
     919             :             // remains the same, setting the toolspace border at the ContainerEnvironment doesn't force a
     920             :             // resize on the IPEnvironment; without that no resize is called for the SfxViewFrame. So always
     921             :             // set the window size of the SfxViewFrame explicit.
     922       14475 :             SetToolSpaceBorderPixel_Impl( pImp->aBorder );
     923             :         }
     924             :     }
     925        3784 :     else if ( pImp->pCurrentViewFrame )
     926             :     {
     927           0 :         pImp->pCurrentViewFrame->GetWindow().SetSizePixel( GetWindow().GetOutputSizePixel() );
     928             :     }
     929             : 
     930             : }
     931             : 
     932           0 : SfxFrame* SfxFrame::GetFirst()
     933             : {
     934           0 :     if ( !pFramesArr_Impl )
     935           0 :         return 0;
     936           0 :     return pFramesArr_Impl->empty() ? 0 : pFramesArr_Impl->front();
     937             : }
     938             : 
     939           0 : SfxFrame* SfxFrame::GetNext( SfxFrame& rFrame )
     940             : {
     941           0 :     SfxFrameArr_Impl::iterator it = std::find( pFramesArr_Impl->begin(), pFramesArr_Impl->end(), &rFrame );
     942           0 :     if ( it != pFramesArr_Impl->end() && (++it) != pFramesArr_Impl->end() )
     943           0 :         return *it;
     944             :     else
     945           0 :         return NULL;
     946             : }
     947             : 
     948           0 : const SfxPoolItem* SfxFrame::OpenDocumentSynchron( SfxItemSet& i_rSet, const Reference< XFrame >& i_rTargetFrame )
     949             : {
     950           0 :     i_rSet.Put( SfxUnoFrameItem( SID_FILLFRAME, i_rTargetFrame ) );
     951           0 :     i_rSet.ClearItem( SID_TARGETNAME );
     952           0 :     return SfxGetpApp()->GetDispatcher_Impl()->Execute( SID_OPENDOC, SfxCallMode::SYNCHRON, i_rSet );
     953         951 : }
     954             : 
     955             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10