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

Generated by: LCOV version 1.10