Anonymous avatar Anonymous committed 4aa3992 Merge

sb143: merged in DEV300_m104

Comments (0)

Files changed (1039)

 20c5c9384888da33596d864251881e6e46bdd339 DEV300_m100
 564e24baaaae5e18c8bfa76811993fbefa571b5c DEV300_m101
 7dbaa615ad894cfd4f9611e82783250bd0a3016d DEV300_m102
+1bdfec44e7ce902365aa7d9cb632f0adeb86262e DEV300_m103
+21b3740610dc90f5298f3bea070153020f3db8b8 DEV300_m104

File contents unchanged.

File contents unchanged.

basic/source/basmgr/basmgr.cxx

     sCall += ']';
 
 	SbxVariable* pRet = pMethod->GetParent()->Execute( sCall );
-    if ( pRet )
+    if ( pRet && ( pRet != pMethod ) )
         *i_retValue = *pRet;
     return SbxBase::GetError();
 }

basic/source/classes/sbxmod.cxx

 #include <svl/brdcst.hxx>
 #include <tools/shl.hxx>
 #include <basic/sbx.hxx>
+#include "sbdiagnose.hxx"
 #include "sb.hxx"
 #include <sbjsmeth.hxx>
 #include "sbjsmod.hxx"
 
 		        GlobalRunDeInit();
 
+#ifdef DBG_UTIL
+                ResetCapturedAssertions();
+#endif
+
                 // VBA always ensures screenupdating is enabled after completing
                 if ( mbVBACompat )
                     VBAUnlockDocuments( PTR_CAST( StarBASIC, GetParent() ) );

basic/source/inc/sbdiagnose.hxx

+/*************************************************************************
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2011 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef BASIC_SBDIAGNOSE_HXX
+#define BASIC_SBDIAGNOSE_HXX
+
+#ifdef DBG_UTIL
+void    ResetCapturedAssertions();
+#endif
+
+#endif // BASIC_SBDIAGNOSE_HXX

basic/source/runtime/makefile.mk

 	$(SLO)$/methods1.obj	\
 	$(SLO)$/props.obj	\
 	$(SLO)$/ddectrl.obj	\
-	$(SLO)$/dllmgr.obj
+	$(SLO)$/dllmgr.obj \
+	$(SLO)$/sbdiagnose.obj
 
 .IF "$(GUI)$(COM)$(CPU)" == "WNTMSCI"
 SLOFILES+=	$(SLO)$/wnt.obj

basic/source/runtime/rtlproto.hxx

 extern RTLFUNC(CDateFromIso);
 extern RTLFUNC(CompatibilityMode);
 extern RTLFUNC(CDec);
+extern RTLFUNC(CaptureAssertions);
 
 extern RTLFUNC(Partition); // Fong
 

basic/source/runtime/sbdiagnose.cxx

+/*************************************************************************
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2011 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_basic.hxx"
+
+#include "rtlproto.hxx"
+#include "sbdiagnose.hxx"
+
+#include "basic/sbstar.hxx"
+
+#include <tools/debug.hxx>
+#include <comphelper/flagguard.hxx>
+
+#ifdef DBG_UTIL
+
+static DbgChannelId nRestoreChannelId = 0;
+static DbgChannelId nAssertionChannelId = 0;
+static StarBASICRef xAssertionChannelBasic;
+static String sCaptureFunctionName;
+static bool bReportingAssertion = false;
+
+void ResetCapturedAssertions()
+{
+	if ( nRestoreChannelId != 0 )
+	{
+		DBG_INSTOUTERROR( nRestoreChannelId );
+	}
+    nRestoreChannelId = 0;
+    xAssertionChannelBasic = NULL;
+    sCaptureFunctionName = String();
+    bReportingAssertion = false;
+}
+
+void DbgReportAssertion( const sal_Char* i_assertionMessage )
+{
+    if ( !xAssertionChannelBasic )
+    {
+        ResetCapturedAssertions();
+        return;
+    }
+
+    // prevent infinite recursion
+    if ( bReportingAssertion )
+        return;
+    ::comphelper::FlagRestorationGuard aGuard( bReportingAssertion, true );
+
+	SbxArrayRef const xArguments( new SbxArray( SbxVARIANT ) );
+	SbxVariableRef const xMessageText = new SbxVariable( SbxSTRING );
+    xMessageText->PutString( String::CreateFromAscii( i_assertionMessage ) );
+    xArguments->Put( xMessageText, 1 );
+
+    ErrCode const nError = xAssertionChannelBasic->Call( sCaptureFunctionName, xArguments );
+    if ( ( nError & SbERR_METHOD_NOT_FOUND ) != 0 )
+        ResetCapturedAssertions();
+}
+
+#endif
+
+/// capture assertions, route them to the given given Basic function
+RTLFUNC(CaptureAssertions)
+{
+    (void)bWrite;
+
+    // need exactly one argument
+	if ( rPar.Count() != 2 )
+	{
+		StarBASIC::Error( SbERR_BAD_ARGUMENT );
+		return;
+	}
+
+#ifdef DBG_UTIL
+    DBG_TESTSOLARMUTEX();
+
+    String const sFunctionName = rPar.Get(1)->GetString();
+    if ( sFunctionName.Len() == 0 )
+    {
+        ResetCapturedAssertions();
+        return;
+    }
+
+    if ( nAssertionChannelId == 0 )
+    {
+        // TODO: should we register a named channel at the VCL API, instead of an unnamed channel at the tools API?
+        // A named channel would mean it would appear in the nonpro-debug-options dialog
+        nAssertionChannelId = DbgRegisterUserChannel( &DbgReportAssertion );
+    }
+
+    DbgChannelId const nCurrentChannelId = (DbgChannelId)DbgGetErrorOut();
+    if ( nCurrentChannelId != nAssertionChannelId )
+    {
+        // remember the current channel
+        nRestoreChannelId = nCurrentChannelId;
+
+        // set the new channel
+        DBG_INSTOUTERROR( nAssertionChannelId );
+
+        // ensure OSL assertions are captured, too
+        DbgData aData( *DbgGetData() );
+        aData.bHookOSLAssert = sal_True;
+        DbgUpdateOslHook( &aData );
+    }
+
+    xAssertionChannelBasic = pBasic;
+    sCaptureFunctionName = sFunctionName;
+#else
+    (void)pBasic;
+    (void)rPar;
+    (void)bWrite;
+#endif
+}
+

basic/source/runtime/stdobj.cxx

   { "number",       SbxDOUBLE, 0,NULL,0 },
 { "CreateObject",   SbxOBJECT,    1 | _FUNCTION, RTLNAME( CreateObject ),0  },
   { "class",        SbxSTRING, 0,NULL,0 },
+{ "CaptureAssertions",  SbxNULL, 1 | _FUNCTION, RTLNAME(CaptureAssertions), 0 },
+  { "methodName",   SbxSTRING, 0, NULL, 0 },
 { "CreateUnoListener",SbxOBJECT,   1 | _FUNCTION, RTLNAME( CreateUnoListener ),0 },
   { "prefix",  SbxSTRING, 0,NULL,0 },
   { "typename",  SbxSTRING, 0,NULL,0 },

chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx

         }
         break;
 
+        case EE_CHAR_OVERLINE:
+        {
+            SvxOverlineItem aItem( UNDERLINE_NONE, EE_CHAR_OVERLINE );
+            bool bModified = false;
+
+            uno::Any aValue( GetPropertySet()->getPropertyValue( C2U( "CharOverline" ) ) );
+            if ( aValue.hasValue() )
+            {
+                aItem.PutValue( aValue, MID_TL_STYLE );
+                bModified = true;
+            }
+
+            aValue = GetPropertySet()->getPropertyValue( C2U( "CharOverlineHasColor" ) );
+            if ( aValue.hasValue() &&
+                 ( *reinterpret_cast< const sal_Bool* >( aValue.getValue() ) != sal_False ) )
+            {
+                aItem.PutValue( aValue, MID_TL_HASCOLOR );
+                bModified = true;
+            }
+
+            aValue = GetPropertySet()->getPropertyValue( C2U( "CharOverlineColor" ) );
+            if ( aValue.hasValue() )
+            {
+                aItem.PutValue( aValue, MID_TL_COLOR );
+                bModified = true;
+            }
+
+            if ( bModified )
+            {
+                rOutItemSet.Put( aItem );
+            }
+        }
+        break;
+
         case EE_CHAR_ITALIC:
         case EE_CHAR_ITALIC_CJK:
         case EE_CHAR_ITALIC_CTL:
         }
         break;
 
+        case EE_CHAR_OVERLINE:
+        {
+            const SvxOverlineItem& rItem = static_cast< const SvxOverlineItem & >( rItemSet.Get( nWhichId ) );
+
+            if ( rItem.QueryValue( aValue, MID_TL_STYLE ) )
+            {
+                if ( aValue != GetPropertySet()->getPropertyValue( C2U( "CharOverline" ) ) )
+                {
+                    GetPropertySet()->setPropertyValue( C2U( "CharOverline" ), aValue );
+                    bChanged = true;
+                }
+            }
+
+            if ( rItem.QueryValue( aValue, MID_TL_COLOR ) )
+            {
+                if ( aValue != GetPropertySet()->getPropertyValue( C2U( "CharOverlineColor" ) ) )
+                {
+                    GetPropertySet()->setPropertyValue( C2U( "CharOverlineColor" ), aValue );
+                    bChanged = true;
+                }
+            }
+
+            if ( rItem.QueryValue( aValue, MID_TL_HASCOLOR ) )
+            {
+                if ( aValue != GetPropertySet()->getPropertyValue( C2U( "CharOverlineHasColor" ) ) )
+                {
+                    GetPropertySet()->setPropertyValue( C2U( "CharOverlineHasColor" ), aValue );
+                    bChanged = true;
+                }
+            }
+        }
+        break;
+
         case EE_CHAR_ITALIC:
         case EE_CHAR_ITALIC_CJK:
         case EE_CHAR_ITALIC_CTL:

chart2/source/controller/main/ChartController_Position.cxx

 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
-void lcl_getPositionAndSizeFromItemSet( const SfxItemSet& rItemSet, Rectangle& rPosAndSize, const awt::Size aOriginalSize )
+void lcl_getPositionAndSizeFromItemSet( const SfxItemSet& rItemSet, awt::Rectangle& rPosAndSize, const awt::Size aOriginalSize )
 {
     long nPosX(0);
 	long nPosY(0);
             break;
     }
 
-	rPosAndSize = Rectangle(Point(nPosX,nPosY),Size(nSizX,nSizY));
+    rPosAndSize = awt::Rectangle(nPosX,nPosY,nSizX,nSizY);
 }
 
 void SAL_CALL ChartController::executeDispatch_PositionAndSize()
             const SfxItemSet* pOutItemSet = pDlg->GetOutputItemSet();
             if(pOutItemSet)
             {
-                Rectangle aObjectRect;
+                awt::Rectangle aObjectRect;
                 aItemSet.Put(*pOutItemSet);//overwrite old values with new values (-> all items are set)
                 lcl_getPositionAndSizeFromItemSet( aItemSet, aObjectRect, aSelectedSize );
                 awt::Size aPageSize( ChartModelHelper::getPageSize( getModel() ) );
-                Rectangle aPageRect( 0,0,aPageSize.Width,aPageSize.Height );
+                awt::Rectangle aPageRect( 0,0,aPageSize.Width,aPageSize.Height );
 
                 bool bChanged = false;    
                 if ( eObjectType == OBJECTTYPE_LEGEND )
                     bChanged = DiagramHelper::switchDiagramPositioningToExcludingPositioning( getModel(), false , true );
 
                 bool bMoved = PositionAndSizeHelper::moveObject( m_aSelection.getSelectedCID(), getModel()
-                            , awt::Rectangle(aObjectRect.getX(),aObjectRect.getY(),aObjectRect.getWidth(),aObjectRect.getHeight())
-                            , awt::Rectangle(aPageRect.getX(),aPageRect.getY(),aPageRect.getWidth(),aPageRect.getHeight()) );
+                            , aObjectRect, aPageRect );
                 if( bMoved || bChanged )
                     aUndoGuard.commit();
             }

chart2/source/controller/main/ChartController_Window.cxx

 
     if ( bSuccess )
     {
+        ::vos::OGuard aGuard( Application::GetSolarMutex() );
+        if ( m_pDrawViewWrapper && m_pDrawViewWrapper->IsTextEdit() )
+        {
+            this->EndTextEdit();
+        }
         this->impl_selectObjectAndNotiy();
+        if ( m_pChartWindow )
+        {
+            m_pChartWindow->Invalidate();
+        }
         return sal_True;
     }
 

chart2/source/inc/CharacterProperties.hxx

         PROP_CHAR_UNDERLINE,
         PROP_CHAR_UNDERLINE_COLOR,
         PROP_CHAR_UNDERLINE_HAS_COLOR,
+        PROP_CHAR_OVERLINE,
+        PROP_CHAR_OVERLINE_COLOR,
+        PROP_CHAR_OVERLINE_HAS_COLOR,
         PROP_CHAR_WEIGHT,
         PROP_CHAR_POSTURE,
         PROP_CHAR_AUTO_KERNING,

chart2/source/inc/ExponentialRegressionCurveCalculator.hxx

         throw (::com::sun::star::lang::IllegalArgumentException,
                ::com::sun::star::uno::RuntimeException);
 
-    // formula is: f(x) = m_fSlope ^ x + m_fIntercept
-    double m_fSlope;
-    double m_fIntercept;
+    // formula is: f(x) = exp(m_fLogIntercept) * exp( m_fLogSlope * x )
+    // mathematical model f(x) = Intercept * Slope^x
+    double m_fLogSlope;
+    double m_fLogIntercept;
 };
 
 } //  namespace chart

chart2/source/model/main/Diagram.cxx

         ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_INCLUDE_HIDDEN_CELLS, true );
         ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_DIAGRAM_RIGHT_ANGLED_AXES, false );
         ::chart::PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_DIAGRAM_STARTING_ANGLE, 90 );
+        ::chart::SceneProperties::AddDefaultsToMap( rOutMap );
     }    
 };
 

chart2/source/tools/CharacterProperties.cxx

                   ::getBooleanCppuType(),
                   beans::PropertyAttribute::BOUND
                   | beans::PropertyAttribute::MAYBEDEFAULT ));
+    // CharOverline (see awt.FontUnderline)
+    rOutProperties.push_back(
+        Property( C2U( "CharOverline" ),
+                  PROP_CHAR_OVERLINE,
+                  ::getCppuType( reinterpret_cast< const sal_Int16* >( 0 ) ),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ) );
+    // CharOverlineColor
+    rOutProperties.push_back(
+        Property( C2U( "CharOverlineColor" ),
+                  PROP_CHAR_OVERLINE_COLOR,
+                  ::getCppuType( reinterpret_cast< const sal_Int32* >( 0 ) ),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT
+                  | beans::PropertyAttribute::MAYBEVOID ) );
+    // CharOverlineHasColor
+    rOutProperties.push_back(
+        Property( C2U( "CharOverlineHasColor" ),
+                  PROP_CHAR_OVERLINE_HAS_COLOR,
+                  ::getBooleanCppuType(),
+                  beans::PropertyAttribute::BOUND
+                  | beans::PropertyAttribute::MAYBEDEFAULT ) );
     // CharWeight (see awt.FontWeight)
     rOutProperties.push_back(
         Property( C2U( "CharWeight" ),
     ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_UNDERLINE, awt::FontUnderline::NONE );
     ::chart::PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_CHAR_UNDERLINE_COLOR, -1 ); //automatic color (COL_AUTO)
     ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_UNDERLINE_HAS_COLOR, false );
+    ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_OVERLINE, awt::FontUnderline::NONE );
+    ::chart::PropertyHelper::setPropertyValueDefault< sal_Int32 >( rOutMap, PROP_CHAR_OVERLINE_COLOR, -1 ); //automatic color (COL_AUTO)
+    ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_OVERLINE_HAS_COLOR, false );
     ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_WEIGHT, awt::FontWeight::NORMAL );
     ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_POSTURE, awt::FontSlant_NONE );
     ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_CHAR_AUTO_KERNING, true );

chart2/source/tools/ExponentialRegressionCurveCalculator.cxx

 {
 
 ExponentialRegressionCurveCalculator::ExponentialRegressionCurveCalculator() :
-        m_fSlope( 0.0 ),
-        m_fIntercept( 0.0 )
+        m_fLogSlope( 0.0 ),
+        m_fLogIntercept( 0.0 )
 {
-    ::rtl::math::setNan( & m_fSlope );
-    ::rtl::math::setNan( & m_fIntercept );
+    ::rtl::math::setNan( & m_fLogSlope );
+    ::rtl::math::setNan( & m_fLogIntercept );
 }
 
 ExponentialRegressionCurveCalculator::~ExponentialRegressionCurveCalculator()
     const size_t nMax = aValues.first.size();
     if( nMax == 0 )
     {
-        ::rtl::math::setNan( & m_fSlope );
-        ::rtl::math::setNan( & m_fIntercept );
-        ::rtl::math::setNan( & m_fCorrelationCoeffitient );
+        ::rtl::math::setNan( & m_fLogSlope );
+        ::rtl::math::setNan( & m_fLogIntercept );
+        ::rtl::math::setNan( & m_fCorrelationCoeffitient );// actual it is coefficient of determination
         return;
     }
 
         fQxy += fDeltaX * fDeltaY;
     }
 
-    m_fSlope = fQxy / fQx;
-    m_fIntercept = fAverageY - m_fSlope * fAverageX;
+    m_fLogSlope = fQxy / fQx;
+    m_fLogIntercept = fAverageY - m_fLogSlope * fAverageX;
     m_fCorrelationCoeffitient = fQxy / sqrt( fQx * fQy );
 
-    m_fSlope = exp( m_fSlope );
-    m_fIntercept = exp( m_fIntercept );
 }
 
 double SAL_CALL ExponentialRegressionCurveCalculator::getCurveValue( double x )
     double fResult;
     ::rtl::math::setNan( & fResult );
 
-    if( ! ( ::rtl::math::isNan( m_fSlope ) ||
-            ::rtl::math::isNan( m_fIntercept )))
+    if( ! ( ::rtl::math::isNan( m_fLogSlope ) ||
+            ::rtl::math::isNan( m_fLogIntercept )))
     {
-        fResult = m_fIntercept * pow( m_fSlope, x );
+        fResult = exp(m_fLogIntercept + x * m_fLogSlope);
     }
 
     return fResult;
     const uno::Reference< util::XNumberFormatter >& xNumFormatter,
     ::sal_Int32 nNumberFormatKey ) const
 {
+    double fIntercept = exp(m_fLogIntercept);
+    double fSlope = exp(m_fLogSlope);
+    bool bHasSlope = !rtl::math::approxEqual( fSlope, 1.0 );
+    bool bHasIntercept = !rtl::math::approxEqual( fIntercept, 1.0 );
+    
     OUStringBuffer aBuf( C2U( "f(x) = " ));
 
-    if( m_fIntercept == 0.0 ||
-        m_fSlope == 0.0 )
+    if ( fIntercept == 0.0)
     {
-        aBuf.append( sal_Unicode( '0' ));
-    }
-    else if( rtl::math::approxEqual( m_fSlope, 1.0 ) )
-    {
-        aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fIntercept ));
+        // underflow, a true zero is impossible
+        aBuf.append( C2U( "exp( " ));
+        aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fLogIntercept) );
+        aBuf.append( (m_fLogSlope < 0.0) ? C2U( " - " ) : C2U( " + " ));
+        aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fLogSlope)) );
+        aBuf.append( C2U( " x )" ));
     }
     else
     {
-        if( ! rtl::math::approxEqual( m_fIntercept, 1.0 ) )
+        if (bHasIntercept)
         {
-            aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fIntercept ));
-            aBuf.append( sal_Unicode( 0x00b7 ));
+            aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, fIntercept) );
+            aBuf.append( C2U( " exp( " ));
+            aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fLogSlope) );
+            aBuf.append( C2U( " x )" ));
         }
-
-        if( m_fSlope < 0.0 )
-            aBuf.append( sal_Unicode( '(' ));
-        aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fSlope ));
-        if( m_fSlope < 0.0 )
-            aBuf.append( sal_Unicode( ')' ));
-        aBuf.appendAscii( RTL_CONSTASCII_STRINGPARAM( "^x" ));
+        else
+        {
+            // show logarithmic output, if intercept and slope both are near one
+            // otherwise drop output of intercept, which is 1 here
+            aBuf.append( C2U( " exp( " ));
+            if (!bHasSlope)
+            {
+                aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, m_fLogIntercept) );
+                aBuf.append( (m_fLogSlope < 0.0) ? C2U( " - " ) : C2U( " + " ));
+                aBuf.append( getFormattedString( xNumFormatter, nNumberFormatKey, fabs(m_fLogSlope)) );
+            }