LCOV - code coverage report
Current view: top level - sfx2/source/appl - childwin.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 291 388 75.0 %
Date: 2015-06-13 12:38:46 Functions: 40 47 85.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 <boost/scoped_ptr.hpp>
      21             : #include <vcl/toolbox.hxx>
      22             : #include <tools/rcid.h>
      23             : #include <unotools/moduleoptions.hxx>
      24             : #include <unotools/viewoptions.hxx>
      25             : #include <com/sun/star/frame/ModuleManager.hpp>
      26             : #include <com/sun/star/frame/XController.hpp>
      27             : #include <com/sun/star/frame/XFrame.hpp>
      28             : #include <com/sun/star/util/XCloseable.hpp>
      29             : #include <comphelper/processfactory.hxx>
      30             : #include <comphelper/string.hxx>
      31             : #include <cppuhelper/implbase1.hxx>
      32             : 
      33             : #include <sfx2/childwin.hxx>
      34             : #include <sfx2/app.hxx>
      35             : #include <sfx2/bindings.hxx>
      36             : #include <sfx2/module.hxx>
      37             : #include <sfx2/dockwin.hxx>
      38             : #include <sfx2/dispatch.hxx>
      39             : #include "workwin.hxx"
      40             : #include "childwinimpl.hxx"
      41             : 
      42             : static const sal_uInt16 nVersion = 2;
      43             : 
      44        7182 : SfxChildWinFactory::SfxChildWinFactory( SfxChildWinCtor pTheCtor, sal_uInt16 nID,
      45             :         sal_uInt16 n )
      46             :     : pCtor(pTheCtor)
      47             :     , nId( nID )
      48             :     , nPos(n)
      49        7182 :     , pArr( NULL )
      50        7182 : {}
      51             : 
      52        6486 : SfxChildWinFactory::~SfxChildWinFactory()
      53             : {
      54        3243 :     delete pArr;
      55        3243 : }
      56             : 
      57       13508 : struct SfxChildWindow_Impl
      58             : {
      59             :     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >             xFrame;
      60             :     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >      xListener;
      61             :     SfxChildWinFactory* pFact;
      62             :     bool                bHideNotDelete;
      63             :     bool                bVisible;
      64             :     bool                bHideAtToggle;
      65             :     bool                bWantsFocus;
      66             :     SfxModule*          pContextModule;
      67             :     SfxWorkWindow*      pWorkWin;
      68             : };
      69             : 
      70             : 
      71             : 
      72           2 : class DisposeListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
      73             : {
      74             :     public:
      75           1 :         DisposeListener( SfxChildWindow*      pOwner ,
      76             :                          SfxChildWindow_Impl* pData  )
      77             :             :   m_pOwner( pOwner )
      78           1 :             ,   m_pData ( pData  )
      79           1 :         {}
      80             : 
      81           1 :         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& aSource ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE
      82             :         {
      83           1 :             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > xSelfHold( this );
      84             : 
      85           2 :             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComp( aSource.Source, ::com::sun::star::uno::UNO_QUERY );
      86           1 :             if( xComp.is() )
      87           1 :                 xComp->removeEventListener( this );
      88             : 
      89           1 :             if( m_pOwner && m_pData )
      90             :             {
      91           1 :                 m_pData->xListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >();
      92             : 
      93           1 :                 if ( m_pData->pWorkWin )
      94             :                 {
      95             :                     // m_pOwner and m_pData will be killed
      96           0 :                     m_pData->xFrame    = ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >();
      97           0 :                     m_pData->pWorkWin->GetBindings().Execute( m_pOwner->GetType() );
      98             :                 }
      99             :                 else
     100             :                 {
     101           1 :                     delete m_pOwner;
     102             :                 }
     103             : 
     104           1 :                 m_pOwner = NULL;
     105           1 :                 m_pData  = NULL;
     106           1 :             }
     107           1 :         }
     108             : 
     109             :     private:
     110             :         SfxChildWindow*      m_pOwner;
     111             :         SfxChildWindow_Impl* m_pData ;
     112             : };
     113             : 
     114             : 
     115             : 
     116        3149 : bool GetPosSizeFromString( const OUString& rStr, Point& rPos, Size& rSize )
     117             : {
     118        3149 :     if ( comphelper::string::getTokenCount(rStr, '/') != 4 )
     119           0 :         return false;
     120             : 
     121        3149 :     sal_Int32 nIdx = 0;
     122        3149 :     rPos.X() = rStr.getToken(0, '/', nIdx).toInt32();
     123        3149 :     rPos.Y() = rStr.getToken(0, '/', nIdx).toInt32();
     124        3149 :     rSize.Width() = rStr.getToken(0, '/', nIdx).toInt32();
     125        3149 :     rSize.Height() = rStr.getToken(0, '/', nIdx).toInt32();
     126             : 
     127             :     // negative sizes are invalid
     128        3149 :     if ( rSize.Width() < 0 || rSize.Height() < 0 )
     129           0 :         return false;
     130             : 
     131        3149 :     return true;
     132             : }
     133             : 
     134        3149 : bool GetSplitSizeFromString( const OUString& rStr, Size& rSize )
     135             : {
     136        3149 :     sal_Int32 nIndex = rStr.indexOf( ',' );
     137        3149 :     if ( nIndex != -1 )
     138             :     {
     139        3149 :         OUString aStr = rStr.copy( nIndex+1 );
     140             : 
     141        3149 :         sal_Int32 nCount = comphelper::string::getTokenCount(aStr, ';');
     142        3149 :         if ( nCount != 2 )
     143           0 :             return false;
     144             : 
     145        3149 :         rSize.Width() = aStr.getToken(0, ';' ).toInt32();
     146        3149 :         rSize.Height() = aStr.getToken(1, ';' ).toInt32();
     147             : 
     148             :         // negative sizes are invalid
     149        3149 :         if ( rSize.Width() < 0 || rSize.Height() < 0 )
     150           0 :             return false;
     151             : 
     152        3149 :         return true;
     153             :     }
     154             : 
     155           0 :     return false;
     156             : }
     157             : 
     158             : 
     159        6759 : SfxChildWindow::SfxChildWindow(vcl::Window *pParentWindow, sal_uInt16 nId)
     160             :     : pParent(pParentWindow)
     161             :     , nType(nId)
     162        6759 :     , eChildAlignment(SfxChildAlignment::NOALIGNMENT)
     163             : {
     164        6759 :     pImp = new SfxChildWindow_Impl;
     165        6759 :     pImp->pFact = 0L;
     166        6759 :     pImp->bHideNotDelete = false;
     167        6759 :     pImp->bHideAtToggle = false;
     168        6759 :     pImp->bWantsFocus = true;
     169        6759 :     pImp->bVisible = true;
     170        6759 :     pImp->pContextModule = NULL;
     171        6759 :     pImp->pWorkWin = NULL;
     172             : 
     173        6759 :     pContext = 0L;
     174        6759 : }
     175             : 
     176        6749 : void SfxChildWindow::Destroy()
     177             : {
     178        6749 :     if ( GetFrame().is() )
     179             :     {
     180           1 :         if (pImp->pWorkWin)
     181             :         {
     182           1 :             if (pImp->pWorkWin->GetActiveChild_Impl() == pWindow)
     183           0 :                 pImp->pWorkWin->SetActiveChild_Impl(NULL);
     184           1 :             pImp->pWorkWin = NULL;
     185             :         }
     186             :         try
     187             :         {
     188           1 :             ::com::sun::star::uno::Reference < ::com::sun::star::util::XCloseable > xClose( GetFrame(), ::com::sun::star::uno::UNO_QUERY );
     189           1 :             if ( xClose.is() )
     190           1 :                 xClose->close( sal_True );
     191             :             else
     192           0 :                 GetFrame()->dispose();
     193             :         }
     194           0 :         catch (const com::sun::star::uno::Exception&)
     195             :         {
     196             :         }
     197             :     }
     198             :     else
     199        6748 :         delete this;
     200        6749 : }
     201             : 
     202             : 
     203       13498 : SfxChildWindow::~SfxChildWindow()
     204             : {
     205        6749 :     delete pContext;
     206        6749 :     pContext = NULL;
     207        6749 :     pWindow.disposeAndClear();
     208        6749 :     delete pImp;
     209        6749 :     pImp = NULL;
     210        6749 : }
     211             : 
     212             : 
     213        6759 : SfxChildWindow* SfxChildWindow::CreateChildWindow( sal_uInt16 nId,
     214             :         vcl::Window *pParent, SfxBindings* pBindings, SfxChildWinInfo& rInfo)
     215             : {
     216        6759 :     SfxChildWindow *pChild=0;
     217        6759 :     SfxChildWinFactory* pFact=0;
     218        6759 :     SystemWindowFlags nOldMode = Application::GetSystemWindowMode();
     219             : 
     220             :     // First search for ChildWindow in SDT; Overlay windows are realized
     221             :     // by using ChildWindowContext
     222        6759 :     SfxApplication *pApp = SfxGetpApp();
     223             :     {
     224        6759 :         SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
     225      117412 :         for ( size_t nFactory = 0; nFactory < rFactories.size(); ++nFactory )
     226             :         {
     227      113853 :             pFact = &rFactories[nFactory];
     228      113853 :             if ( pFact->nId == nId )
     229             :             {
     230        3200 :                 SfxChildWinInfo& rFactInfo = pFact->aInfo;
     231        3200 :                 if ( rInfo.bVisible )
     232             :                 {
     233        3200 :                     if ( pBindings )
     234        3200 :                         pBindings->ENTERREGISTRATIONS();
     235        3200 :                     SfxChildWinInfo aInfo = rFactInfo;
     236        3200 :                     Application::SetSystemWindowMode( SystemWindowFlags::NOAUTOMODE );
     237        3200 :                     pChild = pFact->pCtor( pParent, nId, pBindings, &aInfo );
     238        3200 :                     Application::SetSystemWindowMode( nOldMode );
     239        3200 :                     if ( pBindings )
     240        3200 :                         pBindings->LEAVEREGISTRATIONS();
     241             :                 }
     242             : 
     243        3200 :                 break;
     244             :             }
     245             :         }
     246             :     }
     247             : 
     248        6759 :     SfxDispatcher *pDisp = pBindings ? pBindings->GetDispatcher_Impl() : NULL;
     249        6759 :     SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) : NULL;
     250        6759 :     if (!pChild && pMod)
     251             :     {
     252        3559 :         SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
     253        3559 :         if ( pFactories )
     254             :         {
     255        3559 :             SfxChildWinFactArr_Impl &rFactories = *pFactories;
     256       55461 :             for ( size_t nFactory = 0; nFactory < rFactories.size(); ++nFactory )
     257             :             {
     258       55461 :                 pFact = &rFactories[nFactory];
     259       55461 :                 if ( pFact->nId == nId )
     260             :                 {
     261        3559 :                     SfxChildWinInfo& rFactInfo = pFact->aInfo;
     262        3559 :                     if ( rInfo.bVisible )
     263             :                     {
     264        3559 :                         if ( pBindings )
     265        3559 :                             pBindings->ENTERREGISTRATIONS();
     266        3559 :                         SfxChildWinInfo aInfo = rFactInfo;
     267        3559 :                         Application::SetSystemWindowMode( SystemWindowFlags::NOAUTOMODE );
     268        3559 :                         pChild = pFact->pCtor( pParent, nId, pBindings, &aInfo );
     269        3559 :                         Application::SetSystemWindowMode( nOldMode );
     270        3559 :                         if ( pBindings )
     271        3559 :                             pBindings->LEAVEREGISTRATIONS();
     272             :                     }
     273             : 
     274        3559 :                     break;
     275             :                 }
     276             :             }
     277             :         }
     278             :     }
     279             : 
     280        6759 :     if ( pChild )
     281        6759 :         pChild->SetFactory_Impl( pFact );
     282             : 
     283             :     DBG_ASSERT(pFact && (pChild || !rInfo.bVisible), "ChildWindow-Typ not registered!");
     284             : 
     285        6759 :     if ( pChild && !pChild->pWindow )
     286             :     {
     287           0 :         DELETEZ(pChild);
     288             :         DBG_WARNING("ChildWindow has no Window!");
     289             :     }
     290             : 
     291        6759 :     return pChild;
     292             : }
     293             : 
     294             : 
     295        6841 : void SfxChildWindow::SaveStatus(const SfxChildWinInfo& rInfo)
     296             : {
     297        6841 :     sal_uInt16 nID = GetType();
     298             : 
     299        6841 :     OUStringBuffer aWinData;
     300        6841 :     aWinData.append('V').append(static_cast<sal_Int32>(nVersion)).
     301       13682 :         append(',').append(rInfo.bVisible ? 'V' : 'H').append(',').
     302       13682 :         append(static_cast<sal_Int32>(rInfo.nFlags));
     303        6841 :     if ( !rInfo.aExtraString.isEmpty() )
     304             :     {
     305        3330 :         aWinData.append(',');
     306        3330 :         aWinData.append(rInfo.aExtraString);
     307             :     }
     308             : 
     309       13682 :     OUString sName(OUString::number(nID));
     310             :     //Try and save window state per-module, e.g. sidebar on in one application
     311             :     //but off in another
     312        6841 :     if (!rInfo.aModule.isEmpty())
     313        6709 :         sName = rInfo.aModule + "/" + sName;
     314       13682 :     SvtViewOptions aWinOpt(E_WINDOW, sName);
     315        6841 :     aWinOpt.SetWindowState(OStringToOUString(rInfo.aWinState, RTL_TEXTENCODING_UTF8));
     316             : 
     317       13682 :     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq(1);
     318        6841 :     aSeq[0].Name = "Data";
     319        6841 :     aSeq[0].Value <<= aWinData.makeStringAndClear();
     320        6841 :     aWinOpt.SetUserData( aSeq );
     321             : 
     322             :     // ... but save status at runtime!
     323       13682 :     pImp->pFact->aInfo = rInfo;
     324        6841 : }
     325             : 
     326             : 
     327        3149 : void SfxChildWindow::SetAlignment(SfxChildAlignment eAlign)
     328             : {
     329             : 
     330        3149 :     eChildAlignment = eAlign;
     331        3149 : }
     332             : 
     333             : 
     334        6842 : SfxChildWinInfo SfxChildWindow::GetInfo() const
     335             : {
     336             : 
     337        6842 :     SfxChildWinInfo aInfo(pImp->pFact->aInfo);
     338        6842 :     aInfo.aPos  = pWindow->GetPosPixel();
     339        6842 :     aInfo.aSize = pWindow->GetSizePixel();
     340        6842 :     if ( pWindow->IsSystemWindow() )
     341             :     {
     342           0 :         sal_uIntPtr nMask = WINDOWSTATE_MASK_POS | WINDOWSTATE_MASK_STATE;
     343           0 :         if ( pWindow->GetStyle() & WB_SIZEABLE )
     344           0 :             nMask |= ( WINDOWSTATE_MASK_WIDTH | WINDOWSTATE_MASK_HEIGHT );
     345           0 :         aInfo.aWinState = static_cast<SystemWindow*>(pWindow.get())->GetWindowState( nMask );
     346             :     }
     347        6842 :     else if ( pWindow->GetType() == RSC_DOCKINGWINDOW )
     348             :     {
     349        3330 :         if (static_cast<DockingWindow*>(pWindow.get())->GetFloatingWindow() )
     350           0 :             aInfo.aWinState = static_cast<DockingWindow*>(pWindow.get())->GetFloatingWindow()->GetWindowState();
     351             :         else
     352             :         {
     353        3330 :             SfxChildWinInfo aTmpInfo;
     354        3330 :             static_cast<SfxDockingWindow*>(pWindow.get())->FillInfo( aTmpInfo );
     355        3330 :             aInfo.aExtraString = aTmpInfo.aExtraString;
     356             :         }
     357             :     }
     358             : 
     359        6842 :     aInfo.bVisible = pImp->bVisible;
     360        6842 :     aInfo.nFlags = SfxChildWindowFlags::NONE;
     361        6842 :     return aInfo;
     362             : }
     363             : 
     364             : 
     365        6759 : sal_uInt16 SfxChildWindow::GetPosition()
     366             : {
     367        6759 :     return pImp->pFact->nPos;
     368             : }
     369             : 
     370             : 
     371      102730 : void SfxChildWindow::InitializeChildWinFactory_Impl(sal_uInt16 nId, SfxChildWinInfo& rInfo)
     372             : {
     373             :     // load configuration
     374             : 
     375      102730 :     boost::scoped_ptr<SvtViewOptions> xWinOpt;
     376             :     // first see if a module specific id exists
     377      102730 :     if (rInfo.aModule.getLength())
     378      102611 :         xWinOpt.reset(new SvtViewOptions(E_WINDOW, rInfo.aModule + "/" + OUString::number(nId)));
     379             : 
     380             :     // if not then try the generic id
     381      102730 :     if (!xWinOpt || !xWinOpt->Exists())
     382       96182 :         xWinOpt.reset(new SvtViewOptions(E_WINDOW, OUString::number(nId)));
     383             : 
     384      102730 :     if (xWinOpt->Exists() && xWinOpt->HasVisible() )
     385        3160 :         rInfo.bVisible  = xWinOpt->IsVisible(); // set state from configuration. Can be overwritten by UserData, see below
     386             : 
     387      205460 :     ::com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue > aSeq = xWinOpt->GetUserData();
     388             : 
     389      205460 :     OUString aTmp;
     390      102730 :     if ( aSeq.getLength() )
     391        6497 :         aSeq[0].Value >>= aTmp;
     392             : 
     393      205460 :     OUString aWinData( aTmp );
     394      102730 :     rInfo.aWinState = OUStringToOString(xWinOpt->GetWindowState(), RTL_TEXTENCODING_UTF8);
     395             : 
     396      102730 :     if ( !aWinData.isEmpty() )
     397             :     {
     398             :         // Search for version ID
     399        6497 :         if ( aWinData[0] != 0x0056 ) // 'V' = 56h
     400             :             // A version ID, so do not use
     401           0 :             return;
     402             : 
     403             :         // Delete 'V'
     404        6497 :         aWinData = aWinData.copy(1);
     405             : 
     406             :         // Read version
     407        6497 :         char cToken = ',';
     408        6497 :         sal_Int32 nPos = aWinData.indexOf( cToken );
     409        6497 :         sal_uInt16 nActVersion = (sal_uInt16)aWinData.copy( 0, nPos + 1 ).toInt32();
     410        6497 :         if ( nActVersion != nVersion )
     411           0 :             return;
     412             : 
     413        6497 :         aWinData = aWinData.copy(nPos+1);
     414             : 
     415             :         // Load Visibility: is coded as a char
     416        6497 :         rInfo.bVisible = (aWinData[0] == 0x0056); // 'V' = 56h
     417        6497 :         aWinData = aWinData.copy(1);
     418        6497 :         nPos = aWinData.indexOf( cToken );
     419        6497 :         if (nPos != -1)
     420             :         {
     421        6497 :             sal_Int32 nNextPos = aWinData.indexOf( cToken, 2 );
     422        6497 :             if ( nNextPos != -1 )
     423             :             {
     424             :                 // there is extra information
     425        3143 :                 rInfo.nFlags = static_cast<SfxChildWindowFlags>((sal_uInt16)aWinData.copy( nPos+1, nNextPos - nPos - 1 ).toInt32());
     426        3143 :                 aWinData = aWinData.replaceAt( nPos, nNextPos-nPos+1, "" );
     427        3143 :                 rInfo.aExtraString = aWinData;
     428             :             }
     429             :             else
     430        3354 :                 rInfo.nFlags = static_cast<SfxChildWindowFlags>((sal_uInt16)aWinData.copy( nPos+1 ).toInt32());
     431             :         }
     432      102730 :     }
     433             : }
     434             : 
     435           8 : void SfxChildWindow::CreateContext( sal_uInt16 nContextId, SfxBindings& rBindings )
     436             : {
     437           8 :     SfxChildWindowContext *pCon = NULL;
     438           8 :     SfxChildWinFactory* pFact=0;
     439           8 :     SfxApplication *pApp = SfxGetpApp();
     440           8 :     SfxDispatcher *pDisp = rBindings.GetDispatcher_Impl();
     441           8 :     SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) :0;
     442           8 :     if ( pMod )
     443             :     {
     444           8 :         SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
     445           8 :         if ( pFactories )
     446             :         {
     447           8 :             SfxChildWinFactArr_Impl &rFactories = *pFactories;
     448          58 :             for ( size_t nFactory = 0; nFactory < rFactories.size(); ++nFactory )
     449             :             {
     450          58 :                 pFact = &rFactories[nFactory];
     451          58 :                 if ( pFact->nId == GetType() )
     452             :                 {
     453             :                     DBG_ASSERT( pFact->pArr, "No context registered!" );
     454           8 :                     if ( !pFact->pArr )
     455           0 :                         break;
     456             : 
     457          17 :                     for ( size_t n=0; n<pFact->pArr->size(); ++n )
     458             :                     {
     459           9 :                         SfxChildWinContextFactory *pConFact = &(*pFact->pArr)[n];
     460           9 :                         rBindings.ENTERREGISTRATIONS();
     461           9 :                         if ( pConFact->nContextId == nContextId )
     462             :                         {
     463           8 :                             SfxChildWinInfo aInfo = pFact->aInfo;
     464           8 :                             pCon = pConFact->pCtor( GetWindow(), &rBindings, &aInfo );
     465           8 :                             pCon->nContextId = pConFact->nContextId;
     466           8 :                             pImp->pContextModule = pMod;
     467             :                         }
     468           9 :                         rBindings.LEAVEREGISTRATIONS();
     469             :                     }
     470           8 :                     break;
     471             :                 }
     472             :             }
     473             :         }
     474             :     }
     475             : 
     476           8 :     if ( !pCon )
     477             :     {
     478           0 :         SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
     479           0 :         for ( size_t nFactory = 0; nFactory < rFactories.size(); ++nFactory )
     480             :         {
     481           0 :             pFact = &rFactories[nFactory];
     482           0 :             if ( pFact->nId == GetType() )
     483             :             {
     484             :                 DBG_ASSERT( pFact->pArr, "No context registered!" );
     485           0 :                 if ( !pFact->pArr )
     486           0 :                     break;
     487             : 
     488           0 :                 for ( size_t n=0; n<pFact->pArr->size(); ++n )
     489             :                 {
     490           0 :                     SfxChildWinContextFactory *pConFact = &(*pFact->pArr)[n];
     491           0 :                     rBindings.ENTERREGISTRATIONS();
     492           0 :                     if ( pConFact->nContextId == nContextId )
     493             :                     {
     494           0 :                         SfxChildWinInfo aInfo = pFact->aInfo;
     495           0 :                         pCon = pConFact->pCtor( GetWindow(), &rBindings, &aInfo );
     496           0 :                         pCon->nContextId = pConFact->nContextId;
     497           0 :                         pImp->pContextModule = NULL;
     498             :                     }
     499           0 :                     rBindings.LEAVEREGISTRATIONS();
     500             :                 }
     501           0 :                 break;
     502             :             }
     503             :         }
     504             :     }
     505             : 
     506           8 :     if ( !pCon )
     507             :     {
     508             :         OSL_FAIL( "No suitable context found! ");
     509           8 :         return;
     510             :     }
     511             : 
     512           8 :     if ( pContext )
     513           0 :         delete( pContext );
     514           8 :     pContext = pCon;
     515           8 :     pContext->GetWindow()->SetSizePixel( pWindow->GetOutputSizePixel() );
     516           8 :     pContext->GetWindow()->Show();
     517             : }
     518             : 
     519           8 : SfxChildWindowContext::SfxChildWindowContext( sal_uInt16 nId )
     520           8 :     : nContextId( nId )
     521             : {
     522           8 : }
     523             : 
     524          16 : SfxChildWindowContext::~SfxChildWindowContext()
     525             : {
     526           8 :     pWindow.disposeAndClear();
     527           8 : }
     528             : 
     529           7 : FloatingWindow* SfxChildWindowContext::GetFloatingWindow() const
     530             : {
     531           7 :     vcl::Window *pParent = pWindow->GetParent();
     532           7 :     if (pParent->GetType() == WINDOW_DOCKINGWINDOW || pParent->GetType() == WINDOW_TOOLBOX)
     533             :     {
     534           7 :         return static_cast<DockingWindow*>(pParent)->GetFloatingWindow();
     535             :     }
     536           0 :     else if (pParent->GetType() == WINDOW_FLOATINGWINDOW)
     537             :     {
     538           0 :         return static_cast<FloatingWindow*>(pParent);
     539             :     }
     540             :     else
     541             :     {
     542             :         OSL_FAIL("No FloatingWindow-Context!");
     543           0 :         return NULL;
     544             :     }
     545             : }
     546             : 
     547           0 : void SfxChildWindowContext::Resizing( Size& )
     548             : {
     549           0 : }
     550             : 
     551        6759 : void SfxChildWindow::SetFactory_Impl( SfxChildWinFactory *pF )
     552             : {
     553        6759 :     pImp->pFact = pF;
     554        6759 : }
     555             : 
     556        3230 : void SfxChildWindow::SetHideNotDelete( bool bOn )
     557             : {
     558        3230 :     pImp->bHideNotDelete = bOn;
     559        3230 : }
     560             : 
     561          24 : bool SfxChildWindow::IsHideNotDelete() const
     562             : {
     563          24 :     return pImp->bHideNotDelete;
     564             : }
     565             : 
     566          66 : bool SfxChildWindow::IsHideAtToggle() const
     567             : {
     568          66 :     return pImp->bHideAtToggle;
     569             : }
     570             : 
     571           0 : void SfxChildWindow::SetWantsFocus( bool bSet )
     572             : {
     573           0 :     pImp->bWantsFocus = bSet;
     574           0 : }
     575             : 
     576          68 : bool SfxChildWindow::WantsFocus() const
     577             : {
     578          68 :     return pImp->bWantsFocus;
     579             : }
     580             : 
     581           0 : bool SfxChildWinInfo::GetExtraData_Impl
     582             : (
     583             :     SfxChildAlignment   *pAlign,
     584             :     SfxChildAlignment   *pLastAlign,
     585             :     Size                *pSize,
     586             :     sal_uInt16          *pLine,
     587             :     sal_uInt16          *pPos
     588             : )   const
     589             : {
     590             :     // invalid?
     591           0 :     if ( aExtraString.isEmpty() )
     592           0 :         return false;
     593           0 :     OUString aStr;
     594           0 :     sal_Int32 nPos = aExtraString.indexOf("AL:");
     595           0 :     if ( nPos == -1 )
     596           0 :         return false;
     597             : 
     598             :     // Try to read the alignment string "ALIGN :(...)", but if
     599             :     // it is not present, then use an older version
     600           0 :     sal_Int32 n1 = aExtraString.indexOf('(', nPos);
     601           0 :     if ( n1 != -1 )
     602             :     {
     603           0 :         sal_Int32 n2 = aExtraString.indexOf(')', n1);
     604           0 :         if ( n2 != -1 )
     605             :         {
     606             :             // Cut out Alignment string
     607           0 :             aStr = aExtraString.copy(nPos, n2 - nPos + 1);
     608           0 :             aStr = aStr.replaceAt(nPos, n1-nPos+1, "");
     609             :         }
     610             :     }
     611             : 
     612             :     // First extract the Alignment
     613           0 :     if ( aStr.isEmpty() )
     614           0 :         return false;
     615           0 :     if ( pAlign )
     616           0 :         *pAlign = (SfxChildAlignment) (sal_uInt16) aStr.toInt32();
     617             : 
     618             :     // then the LastAlignment
     619           0 :     nPos = aStr.indexOf(',');
     620           0 :     if ( nPos == -1 )
     621           0 :         return false;
     622           0 :     aStr = aStr.copy(nPos+1);
     623           0 :     if ( pLastAlign )
     624           0 :         *pLastAlign = (SfxChildAlignment) (sal_uInt16) aStr.toInt32();
     625             : 
     626             :     // Then the splitting information
     627           0 :     nPos = aStr.indexOf(',');
     628           0 :     if ( nPos == -1 )
     629             :         // No docking in a Splitwindow
     630           0 :         return true;
     631           0 :     aStr = aStr.copy(nPos+1);
     632           0 :     Point aChildPos;
     633           0 :     Size aChildSize;
     634           0 :     if ( GetPosSizeFromString( aStr, aChildPos, aChildSize ) )
     635             :     {
     636           0 :         if ( pSize )
     637           0 :             *pSize = aChildSize;
     638           0 :         if ( pLine )
     639           0 :             *pLine = (sal_uInt16) aChildPos.X();
     640           0 :         if ( pPos )
     641           0 :             *pPos = (sal_uInt16) aChildPos.Y();
     642           0 :         return true;
     643             :     }
     644           0 :     return false;
     645             : }
     646             : 
     647           0 : bool SfxChildWindow::IsVisible() const
     648             : {
     649           0 :     return pImp->bVisible;
     650             : }
     651             : 
     652          67 : void SfxChildWindow::SetVisible_Impl( bool bVis )
     653             : {
     654          67 :     pImp->bVisible = bVis;
     655          67 : }
     656             : 
     657        6749 : void SfxChildWindow::Hide()
     658             : {
     659        6749 :     switch ( pWindow->GetType() )
     660             :     {
     661             :         case RSC_DOCKINGWINDOW :
     662        3260 :             static_cast<DockingWindow*>(pWindow.get())->Hide();
     663        3260 :             break;
     664             :         case RSC_TOOLBOX :
     665         336 :             static_cast<ToolBox*>(pWindow.get())->Hide();
     666         336 :             break;
     667             :         default:
     668        3153 :             pWindow->Hide();
     669        3153 :             break;
     670             :     }
     671        6749 : }
     672             : 
     673           1 : void SfxChildWindow::Show( ShowFlags nFlags )
     674             : {
     675           1 :     switch ( pWindow->GetType() )
     676             :     {
     677             :         case RSC_DOCKINGWINDOW :
     678           0 :             static_cast<DockingWindow*>(pWindow.get())->Show( true, nFlags );
     679           0 :             break;
     680             :         case RSC_TOOLBOX :
     681           0 :             static_cast<ToolBox*>(pWindow.get())->Show( true, nFlags );
     682           0 :             break;
     683             :         default:
     684           1 :             pWindow->Show( true, nFlags );
     685           1 :             break;
     686             :     }
     687           1 : }
     688             : 
     689           4 : vcl::Window* SfxChildWindow::GetContextWindow( SfxModule *pModule ) const
     690             : {
     691           4 :     return pModule == pImp->pContextModule && pContext ? pContext->GetWindow(): 0;
     692             : }
     693             : 
     694        6759 : void SfxChildWindow::SetWorkWindow_Impl( SfxWorkWindow* pWin )
     695             : {
     696        6759 :     pImp->pWorkWin = pWin;
     697        6759 :     if ( pWin && pWindow->HasChildPathFocus() )
     698           0 :         pImp->pWorkWin->SetActiveChild_Impl( pWindow );
     699        6759 : }
     700             : 
     701           0 : void SfxChildWindow::Activate_Impl()
     702             : {
     703           0 :     if(pImp->pWorkWin!=NULL)
     704           0 :         pImp->pWorkWin->SetActiveChild_Impl( pWindow );
     705           0 : }
     706             : 
     707           4 : void SfxChildWindow::Deactivate_Impl()
     708             : {
     709           4 : }
     710             : 
     711          97 : bool SfxChildWindow::QueryClose()
     712             : {
     713          97 :     bool bAllow = true;
     714             : 
     715          97 :     if ( pImp->xFrame.is() )
     716             :     {
     717           0 :         ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController >  xCtrl = pImp->xFrame->getController();
     718           0 :         if ( xCtrl.is() )
     719           0 :             bAllow = xCtrl->suspend( sal_True );
     720             :     }
     721             : 
     722          97 :     if ( bAllow )
     723          97 :         bAllow = !GetWindow()->IsInModalMode();
     724             : 
     725          97 :     return bAllow;
     726             : }
     727             : 
     728       10053 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >  SfxChildWindow::GetFrame()
     729             : {
     730       10053 :     return pImp->xFrame;
     731             : }
     732             : 
     733           1 : void SfxChildWindow::SetFrame( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > & rFrame )
     734             : {
     735             :     // Do nothing if nothing will be changed ...
     736           1 :     if( pImp->xFrame != rFrame )
     737             :     {
     738             :         // ... but stop listening on old frame, if connection exist!
     739           1 :         if( pImp->xFrame.is() )
     740           0 :             pImp->xFrame->removeEventListener( pImp->xListener );
     741             : 
     742             :         // If new frame is not NULL -> we must guarantee valid listener for disposing events.
     743             :         // Use already existing or create new one.
     744           1 :         if( rFrame.is() )
     745           1 :             if( !pImp->xListener.is() )
     746           1 :                 pImp->xListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >( new DisposeListener( this, pImp ) );
     747             : 
     748             :         // Set new frame in data container
     749             :         // and build new listener connection, if necessary.
     750           1 :         pImp->xFrame = rFrame;
     751           1 :         if( pImp->xFrame.is() )
     752           1 :             pImp->xFrame->addEventListener( pImp->xListener );
     753             :     }
     754           1 : }
     755             : 
     756        3495 : bool SfxChildWindow::CanGetFocus() const
     757             : {
     758        3495 :     return !(pImp->pFact->aInfo.nFlags & SfxChildWindowFlags::CANTGETFOCUS);
     759             : }
     760             : 
     761         153 : void SfxChildWindowContext::RegisterChildWindowContext(SfxModule* pMod, sal_uInt16 nId, SfxChildWinContextFactory* pFact)
     762             : {
     763         153 :     SfxGetpApp()->RegisterChildWindowContext_Impl( pMod, nId, pFact );
     764         153 : }
     765             : 
     766        7050 : void SfxChildWindow::RegisterChildWindow(SfxModule* pMod, SfxChildWinFactory* pFact)
     767             : {
     768        7050 :     SfxGetpApp()->RegisterChildWindow_Impl( pMod, pFact );
     769        7050 : }
     770             : 
     771             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11