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

Generated by: LCOV version 1.10