LCOV - code coverage report
Current view: top level - framework/source/uielement - spinfieldtoolbarcontroller.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 250 0.4 %
Date: 2015-06-13 12:38:46 Functions: 2 36 5.6 %
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 <stdio.h>
      21             : #include <wchar.h>
      22             : 
      23             : #include "uielement/spinfieldtoolbarcontroller.hxx"
      24             : 
      25             : #include <com/sun/star/util/XURLTransformer.hpp>
      26             : #include <com/sun/star/frame/XDispatchProvider.hpp>
      27             : #include <com/sun/star/beans/PropertyValue.hpp>
      28             : #include <com/sun/star/frame/status/ItemStatus.hpp>
      29             : #include <com/sun/star/frame/status/ItemState.hpp>
      30             : #include <com/sun/star/frame/status/Visibility.hpp>
      31             : #include <com/sun/star/frame/XControlNotificationListener.hpp>
      32             : 
      33             : #include <svtools/toolboxcontroller.hxx>
      34             : #include <osl/mutex.hxx>
      35             : #include <vcl/svapp.hxx>
      36             : #include <vcl/mnemonic.hxx>
      37             : #include <vcl/toolbox.hxx>
      38             : #ifdef WINNT
      39             : #include <systools/win32/snprintf.h>
      40             : #endif
      41             : 
      42             : using namespace ::com::sun::star;
      43             : using namespace ::com::sun::star::uno;
      44             : using namespace ::com::sun::star::beans;
      45             : using namespace ::com::sun::star::lang;
      46             : using namespace ::com::sun::star::frame;
      47             : using namespace ::com::sun::star::frame::status;
      48             : using namespace ::com::sun::star::util;
      49             : 
      50             : namespace framework
      51             : {
      52             : 
      53             : // Wrapper class to notify controller about events from combobox.
      54             : // Unfortunaltly the events are notifed through virtual methods instead
      55             : // of Listeners.
      56             : 
      57             : class SpinfieldControl : public SpinField
      58             : {
      59             :     public:
      60             :         SpinfieldControl( vcl::Window* pParent, WinBits nStyle, ISpinfieldListener* pSpinFieldListener );
      61             :         virtual ~SpinfieldControl();
      62             :         virtual void dispose() SAL_OVERRIDE;
      63             : 
      64             :         virtual void Up() SAL_OVERRIDE;
      65             :         virtual void Down() SAL_OVERRIDE;
      66             :         virtual void First() SAL_OVERRIDE;
      67             :         virtual void Last() SAL_OVERRIDE;
      68             :         virtual void KeyInput( const ::KeyEvent& rKEvt ) SAL_OVERRIDE;
      69             :         virtual void Modify() SAL_OVERRIDE;
      70             :         virtual void GetFocus() SAL_OVERRIDE;
      71             :         virtual void LoseFocus() SAL_OVERRIDE;
      72             :         virtual void StateChanged( StateChangedType nType ) SAL_OVERRIDE;
      73             :         virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
      74             :         virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
      75             : 
      76             :     private:
      77             :         ISpinfieldListener* m_pSpinFieldListener;
      78             : };
      79             : 
      80           0 : SpinfieldControl::SpinfieldControl( vcl::Window* pParent, WinBits nStyle, ISpinfieldListener* pSpinFieldListener ) :
      81             :     SpinField( pParent, nStyle )
      82           0 :     , m_pSpinFieldListener( pSpinFieldListener )
      83             : {
      84           0 : }
      85             : 
      86           0 : SpinfieldControl::~SpinfieldControl()
      87             : {
      88           0 :     disposeOnce();
      89           0 : }
      90             : 
      91           0 : void SpinfieldControl::dispose()
      92             : {
      93           0 :     m_pSpinFieldListener = 0;
      94           0 :     SpinField::dispose();
      95           0 : }
      96             : 
      97           0 : void SpinfieldControl::Up()
      98             : {
      99           0 :     SpinField::Up();
     100           0 :     if ( m_pSpinFieldListener )
     101           0 :         m_pSpinFieldListener->Up();
     102           0 : }
     103             : 
     104           0 : void SpinfieldControl::Down()
     105             : {
     106           0 :     SpinField::Down();
     107           0 :     if ( m_pSpinFieldListener )
     108           0 :         m_pSpinFieldListener->Down();
     109           0 : }
     110             : 
     111           0 : void SpinfieldControl::First()
     112             : {
     113           0 :     SpinField::First();
     114           0 :     if ( m_pSpinFieldListener )
     115           0 :         m_pSpinFieldListener->First();
     116           0 : }
     117             : 
     118           0 : void SpinfieldControl::Last()
     119             : {
     120           0 :     SpinField::First();
     121           0 :     if ( m_pSpinFieldListener )
     122           0 :         m_pSpinFieldListener->Last();
     123           0 : }
     124             : 
     125           0 : void SpinfieldControl::KeyInput( const ::KeyEvent& rKEvt )
     126             : {
     127           0 :     SpinField::KeyInput( rKEvt );
     128           0 :     if ( m_pSpinFieldListener )
     129           0 :         m_pSpinFieldListener->KeyInput( rKEvt );
     130           0 : }
     131             : 
     132           0 : void SpinfieldControl::Modify()
     133             : {
     134           0 :     SpinField::Modify();
     135           0 :     if ( m_pSpinFieldListener )
     136           0 :         m_pSpinFieldListener->Modify();
     137           0 : }
     138             : 
     139           0 : void SpinfieldControl::GetFocus()
     140             : {
     141           0 :     SpinField::GetFocus();
     142           0 :     if ( m_pSpinFieldListener )
     143           0 :         m_pSpinFieldListener->GetFocus();
     144           0 : }
     145             : 
     146           0 : void SpinfieldControl::LoseFocus()
     147             : {
     148           0 :     SpinField::GetFocus();
     149           0 :     if ( m_pSpinFieldListener )
     150           0 :         m_pSpinFieldListener->GetFocus();
     151           0 : }
     152             : 
     153           0 : void SpinfieldControl::StateChanged( StateChangedType nType )
     154             : {
     155           0 :     SpinField::StateChanged( nType );
     156           0 :     if ( m_pSpinFieldListener )
     157           0 :         m_pSpinFieldListener->StateChanged( nType );
     158           0 : }
     159             : 
     160           0 : void SpinfieldControl::DataChanged( const DataChangedEvent& rDCEvt )
     161             : {
     162           0 :     SpinField::DataChanged( rDCEvt );
     163           0 :     if ( m_pSpinFieldListener )
     164           0 :         m_pSpinFieldListener->DataChanged( rDCEvt );
     165           0 : }
     166             : 
     167           0 : bool SpinfieldControl::PreNotify( NotifyEvent& rNEvt )
     168             : {
     169           0 :     bool nRet = false;
     170           0 :     if ( m_pSpinFieldListener )
     171           0 :         nRet = m_pSpinFieldListener->PreNotify( rNEvt );
     172           0 :     if ( !nRet )
     173           0 :         nRet = SpinField::PreNotify( rNEvt );
     174             : 
     175           0 :     return nRet;
     176             : }
     177             : 
     178           0 : SpinfieldToolbarController::SpinfieldToolbarController(
     179             :     const Reference< XComponentContext >&    rxContext,
     180             :     const Reference< XFrame >&               rFrame,
     181             :     ToolBox*                                 pToolbar,
     182             :     sal_uInt16                                   nID,
     183             :     sal_Int32                                nWidth,
     184             :     const OUString&                          aCommand ) :
     185             :     ComplexToolbarController( rxContext, rFrame, pToolbar, nID, aCommand )
     186             :     ,   m_bFloat( false )
     187             :     ,   m_bMaxSet( false )
     188             :     ,   m_bMinSet( false )
     189             :     ,   m_nMax( 0.0 )
     190             :     ,   m_nMin( 0.0 )
     191             :     ,   m_nValue( 0.0 )
     192             :     ,   m_nStep( 0.0 )
     193           0 :     ,   m_pSpinfieldControl( 0 )
     194             : {
     195           0 :     m_pSpinfieldControl = VclPtr<SpinfieldControl>::Create( m_pToolbar, WB_SPIN|WB_BORDER, this );
     196           0 :     if ( nWidth == 0 )
     197           0 :         nWidth = 100;
     198             : 
     199             :     // Calculate height of the spin field according to the application font height
     200           0 :     sal_Int32 nHeight = getFontSizePixel( m_pSpinfieldControl ) + 5 + 1;
     201             : 
     202           0 :     m_pSpinfieldControl->SetSizePixel( ::Size( nWidth, nHeight ));
     203           0 :     m_pToolbar->SetItemWindow( m_nID, m_pSpinfieldControl );
     204           0 : }
     205             : 
     206           0 : SpinfieldToolbarController::~SpinfieldToolbarController()
     207             : {
     208           0 : }
     209             : 
     210           0 : void SAL_CALL SpinfieldToolbarController::dispose()
     211             : throw ( RuntimeException, std::exception )
     212             : {
     213           0 :     SolarMutexGuard aSolarMutexGuard;
     214             : 
     215           0 :     m_pToolbar->SetItemWindow( m_nID, 0 );
     216           0 :     m_pSpinfieldControl.disposeAndClear();
     217             : 
     218           0 :     ComplexToolbarController::dispose();
     219           0 : }
     220             : 
     221           0 : Sequence<PropertyValue> SpinfieldToolbarController::getExecuteArgs(sal_Int16 KeyModifier) const
     222             : {
     223           0 :     Sequence<PropertyValue> aArgs( 2 );
     224           0 :     OUString aSpinfieldText = m_pSpinfieldControl->GetText();
     225             : 
     226             :     // Add key modifier to argument list
     227           0 :     aArgs[0].Name = "KeyModifier";
     228           0 :     aArgs[0].Value <<= KeyModifier;
     229           0 :     aArgs[1].Name = "Value";
     230           0 :     if ( m_bFloat )
     231           0 :         aArgs[1].Value <<= aSpinfieldText.toDouble();
     232             :     else
     233           0 :         aArgs[1].Value <<= aSpinfieldText.toInt32();
     234           0 :     return aArgs;
     235             : }
     236             : 
     237           0 : void SpinfieldToolbarController::Up()
     238             : {
     239           0 :     double nValue = m_nValue + m_nStep;
     240           0 :     if ( m_bMaxSet && nValue > m_nMax )
     241           0 :         return;
     242             : 
     243           0 :     m_nValue = nValue;
     244             : 
     245           0 :     OUString aText = impl_formatOutputString( m_nValue );
     246           0 :     m_pSpinfieldControl->SetText( aText );
     247           0 :     execute( 0 );
     248             : }
     249             : 
     250           0 : void SpinfieldToolbarController::Down()
     251             : {
     252           0 :     double nValue = m_nValue - m_nStep;
     253           0 :     if ( m_bMinSet && nValue < m_nMin )
     254           0 :         return;
     255             : 
     256           0 :     m_nValue = nValue;
     257             : 
     258           0 :     OUString aText = impl_formatOutputString( m_nValue );
     259           0 :     m_pSpinfieldControl->SetText( aText );
     260           0 :     execute( 0 );
     261             : }
     262             : 
     263           0 : void SpinfieldToolbarController::First()
     264             : {
     265           0 :     if ( m_bMinSet )
     266             :     {
     267           0 :         m_nValue = m_nMin;
     268             : 
     269           0 :         OUString aText = impl_formatOutputString( m_nValue );
     270           0 :         m_pSpinfieldControl->SetText( aText );
     271           0 :         execute( 0 );
     272             :     }
     273           0 : }
     274             : 
     275           0 : void SpinfieldToolbarController::Last()
     276             : {
     277           0 :     if ( m_bMaxSet )
     278             :     {
     279           0 :         m_nValue = m_nMax;
     280             : 
     281           0 :         OUString aText = impl_formatOutputString( m_nValue );
     282           0 :         m_pSpinfieldControl->SetText( aText );
     283           0 :         execute( 0 );
     284             :     }
     285           0 : }
     286             : 
     287           0 : void SpinfieldToolbarController::Modify()
     288             : {
     289           0 :     notifyTextChanged( m_pSpinfieldControl->GetText() );
     290           0 : }
     291             : 
     292           0 : void SpinfieldToolbarController::KeyInput( const ::KeyEvent& /*rKEvt*/ )
     293             : {
     294           0 : }
     295             : 
     296           0 : void SpinfieldToolbarController::GetFocus()
     297             : {
     298           0 :     notifyFocusGet();
     299           0 : }
     300             : 
     301           0 : void SpinfieldToolbarController::LoseFocus()
     302             : {
     303           0 :     notifyFocusLost();
     304           0 : }
     305             : 
     306           0 : void SpinfieldToolbarController::StateChanged( StateChangedType /*nType*/ )
     307             : {
     308           0 : }
     309             : 
     310           0 : void SpinfieldToolbarController::DataChanged( const DataChangedEvent& /*rDCEvt*/ )
     311             : {
     312           0 : }
     313             : 
     314           0 : bool SpinfieldToolbarController::PreNotify( NotifyEvent& rNEvt )
     315             : {
     316           0 :     if( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     317             :     {
     318           0 :         const ::KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
     319           0 :         const vcl::KeyCode& rKeyCode = pKeyEvent->GetKeyCode();
     320           0 :         if(( rKeyCode.GetModifier() | rKeyCode.GetCode()) == KEY_RETURN )
     321             :         {
     322             :             // Call execute only with non-empty text
     323           0 :             if ( !m_pSpinfieldControl->GetText().isEmpty() )
     324           0 :                 execute( rKeyCode.GetModifier() );
     325           0 :             return true;
     326             :         }
     327             :     }
     328             : 
     329           0 :     return false;
     330             : }
     331             : 
     332           0 : void SpinfieldToolbarController::executeControlCommand( const ::com::sun::star::frame::ControlCommand& rControlCommand )
     333             : {
     334           0 :     OUString aValue;
     335           0 :     OUString aMax;
     336           0 :     OUString aMin;
     337           0 :     OUString aStep;
     338           0 :     bool          bFloatValue( false );
     339             : 
     340           0 :     if ( rControlCommand.Command == "SetStep" )
     341             :     {
     342           0 :         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
     343             :         {
     344           0 :             if ( rControlCommand.Arguments[i].Name == "Step" )
     345             :             {
     346             :                 sal_Int32   nValue;
     347             :                 double      fValue;
     348           0 :                 bool        bFloat( false );
     349           0 :                 if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
     350           0 :                     aStep = bFloat ? OUString::number( fValue ) :
     351           0 :                                      OUString::number( nValue );
     352           0 :                 break;
     353             :             }
     354             :         }
     355             :     }
     356           0 :     else if ( rControlCommand.Command == "SetValue" )
     357             :     {
     358           0 :         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
     359             :         {
     360           0 :             if ( rControlCommand.Arguments[i].Name == "Value" )
     361             :             {
     362             :                 sal_Int32   nValue;
     363             :                 double      fValue;
     364           0 :                 bool        bFloat( false );
     365             : 
     366           0 :                 if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
     367             :                 {
     368           0 :                     aValue = bFloat ? OUString::number( fValue ) : OUString::number( nValue );
     369           0 :                     bFloatValue = bFloat;
     370             :                 }
     371           0 :                 break;
     372             :             }
     373             :         }
     374             :     }
     375           0 :     else if ( rControlCommand.Command == "SetValues" )
     376             :     {
     377           0 :         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
     378             :         {
     379             :             sal_Int32   nValue;
     380             :             double      fValue;
     381           0 :             bool        bFloat( false );
     382             : 
     383           0 :             OUString aName = rControlCommand.Arguments[i].Name;
     384           0 :             if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
     385             :             {
     386           0 :                 if ( aName == "Value" )
     387             :                 {
     388           0 :                     aValue = bFloat ? OUString::number( fValue ) : OUString::number( nValue );
     389           0 :                     bFloatValue = bFloat;
     390             :                 }
     391           0 :                 else if ( aName == "Step" )
     392           0 :                     aStep = bFloat ? OUString::number( fValue ) :
     393           0 :                                      OUString::number( nValue );
     394           0 :                 else if ( aName == "LowerLimit" )
     395           0 :                     aMin = bFloat ? OUString::number( fValue ) :
     396           0 :                                     OUString::number( nValue );
     397           0 :                 else if ( aName == "UpperLimit" )
     398           0 :                     aMax = bFloat ? OUString::number( fValue ) :
     399           0 :                                     OUString::number( nValue );
     400             :             }
     401           0 :             else if ( aName == "OutputFormat" )
     402           0 :                 rControlCommand.Arguments[i].Value >>= m_aOutFormat;
     403           0 :         }
     404             :     }
     405           0 :     else if ( rControlCommand.Command == "SetLowerLimit" )
     406             :     {
     407           0 :         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
     408             :         {
     409           0 :             if ( rControlCommand.Arguments[i].Name == "LowerLimit" )
     410             :             {
     411             :                 sal_Int32   nValue;
     412             :                 double      fValue;
     413           0 :                 bool        bFloat( false );
     414           0 :                 if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
     415           0 :                     aMin = bFloat ? OUString::number( fValue ) :
     416           0 :                                     OUString::number( nValue );
     417           0 :                 break;
     418             :             }
     419             :         }
     420             :     }
     421           0 :     else if ( rControlCommand.Command == "SetUpperLimit" )
     422             :     {
     423           0 :         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
     424             :         {
     425           0 :             if ( rControlCommand.Arguments[i].Name == "UpperLimit" )
     426             :             {
     427             :                 sal_Int32   nValue;
     428             :                 double      fValue;
     429           0 :                 bool        bFloat( false );
     430           0 :                 if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
     431           0 :                     aMax = bFloat ? OUString::number( fValue ) :
     432           0 :                                     OUString::number( nValue );
     433           0 :                 break;
     434             :             }
     435             :         }
     436             :     }
     437           0 :     else if ( rControlCommand.Command == "SetOutputFormat" )
     438             :     {
     439           0 :         for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
     440             :         {
     441           0 :             if ( rControlCommand.Arguments[i].Name == "OutputFormat" )
     442             :             {
     443           0 :                 rControlCommand.Arguments[i].Value >>= m_aOutFormat;
     444           0 :                 break;
     445             :             }
     446             :         }
     447             :     }
     448             : 
     449             :     // Check values and set members
     450           0 :     if ( !aValue.isEmpty() )
     451             :     {
     452           0 :         m_bFloat = bFloatValue;
     453           0 :         m_nValue = aValue.toDouble();
     454             : 
     455           0 :         OUString aOutString = impl_formatOutputString( m_nValue );
     456           0 :         m_pSpinfieldControl->SetText( aOutString );
     457           0 :         notifyTextChanged( aOutString );
     458             :     }
     459           0 :     if ( !aMax.isEmpty() )
     460             :     {
     461           0 :         m_nMax = aMax.toDouble();
     462           0 :         m_bMaxSet = true;
     463             :     }
     464           0 :     if ( !aMin.isEmpty() )
     465             :     {
     466           0 :         m_nMin = aMin.toDouble();
     467           0 :         m_bMinSet = true;
     468             :     }
     469           0 :     if ( !aStep.isEmpty() )
     470           0 :         m_nStep = aStep.toDouble();
     471           0 : }
     472             : 
     473           0 : bool SpinfieldToolbarController::impl_getValue(
     474             :     const Any& rAny, sal_Int32& nValue, double& fValue, bool& bFloat )
     475             : {
     476             :     using ::com::sun::star::uno::TypeClass;
     477             : 
     478           0 :     bool bValueValid( false );
     479             : 
     480           0 :     bFloat = false;
     481           0 :     TypeClass aTypeClass = rAny.getValueTypeClass();
     482           0 :     if (( aTypeClass == TypeClass( typelib_TypeClass_LONG  )) ||
     483           0 :         ( aTypeClass == TypeClass( typelib_TypeClass_SHORT )) ||
     484             :         ( aTypeClass == TypeClass( typelib_TypeClass_BYTE  )))
     485           0 :         bValueValid = rAny >>= nValue;
     486           0 :     else if (( aTypeClass == TypeClass( typelib_TypeClass_FLOAT  )) ||
     487             :              ( aTypeClass == TypeClass( typelib_TypeClass_DOUBLE )))
     488             :     {
     489           0 :         bValueValid = rAny >>= fValue;
     490           0 :         bFloat = true;
     491             :     }
     492             : 
     493           0 :     return bValueValid;
     494             : }
     495             : 
     496           0 : OUString SpinfieldToolbarController::impl_formatOutputString( double fValue )
     497             : {
     498           0 :     if ( m_aOutFormat.isEmpty() )
     499             :     {
     500           0 :         if ( m_bFloat )
     501           0 :             return OUString::number( fValue );
     502             :         else
     503           0 :             return OUString::number( sal_Int32( fValue ));
     504             :     }
     505             :     else
     506             :     {
     507             : #ifdef WNT
     508             :         sal_Unicode aBuffer[128];
     509             : 
     510             :         aBuffer[0] = 0;
     511             :         if ( m_bFloat )
     512             :             snwprintf( reinterpret_cast<wchar_t *>(aBuffer), 128, reinterpret_cast<const wchar_t *>(m_aOutFormat.getStr()), fValue );
     513             :         else
     514             :             snwprintf( reinterpret_cast<wchar_t *>(aBuffer), 128, reinterpret_cast<const wchar_t *>(m_aOutFormat.getStr()), sal_Int32( fValue ));
     515             : 
     516             :         sal_Int32 nSize = rtl_ustr_getLength( aBuffer );
     517             :         return OUString( aBuffer, nSize );
     518             : #else
     519             :         // Currently we have no support for a format string using sal_Unicode. wchar_t
     520             :         // is 32 bit on Unix platform!
     521             :         char aBuffer[128];
     522             : 
     523           0 :         OString aFormat = OUStringToOString( m_aOutFormat, osl_getThreadTextEncoding() );
     524           0 :         if ( m_bFloat )
     525           0 :             snprintf( aBuffer, 128, aFormat.getStr(), fValue );
     526             :         else
     527           0 :             snprintf( aBuffer, 128, aFormat.getStr(), static_cast<long>( fValue ));
     528             : 
     529           0 :         sal_Int32 nSize = strlen( aBuffer );
     530           0 :         OString aTmp( aBuffer, nSize );
     531           0 :         return OStringToOUString( aTmp, osl_getThreadTextEncoding() );
     532             : #endif
     533             :     }
     534             : }
     535             : 
     536         648 : } // namespace
     537             : 
     538             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11