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

Generated by: LCOV version 1.10