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

Generated by: LCOV version 1.11