blob: f7421ec61d197920a38bf8ae09bb4a64a0ee8fd3 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#include <vcl/svapp.hxx>
#include <svl/zforlist.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include "cfgids.hxx"
#include "docoptio.hxx"
#include "rechead.hxx"
#include "scresid.hxx"
#include "sc.hrc"
#include "miscuno.hxx"
using namespace utl;
using namespace rtl;
using namespace com::sun::star::uno;
//------------------------------------------------------------------------
#define SC_VERSION ((sal_uInt16)251)
TYPEINIT1(ScTpCalcItem, SfxPoolItem);
//------------------------------------------------------------------------
//! these functions should be moved to some header file
inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; }
inline long HMMToTwips(long nHMM) { return (nHMM * 72 + 63) / 127; }
inline long TwipsToEvenHMM(long nTwips) { return ( (nTwips * 127 + 72) / 144 ) * 2; }
//------------------------------------------------------------------------
sal_uInt16 lcl_GetDefaultTabDist()
{
if ( ScOptionsUtil::IsMetricSystem() )
return 709; // 1,25 cm
else
return 720; // 1/2"
}
//========================================================================
// ScDocOptions - Dokument-Optionen
//========================================================================
ScDocOptions::ScDocOptions()
{
ResetDocOptions();
}
//------------------------------------------------------------------------
ScDocOptions::ScDocOptions( const ScDocOptions& rCpy )
: fIterEps( rCpy.fIterEps ),
nIterCount( rCpy.nIterCount ),
nPrecStandardFormat( rCpy.nPrecStandardFormat ),
nDay( rCpy.nDay ),
nMonth( rCpy.nMonth ),
nYear( rCpy.nYear ),
nYear2000( rCpy.nYear2000 ),
nTabDistance( rCpy.nTabDistance ),
bIsIgnoreCase( rCpy.bIsIgnoreCase ),
bIsIter( rCpy.bIsIter ),
bCalcAsShown( rCpy.bCalcAsShown ),
bMatchWholeCell( rCpy.bMatchWholeCell ),
bDoAutoSpell( rCpy.bDoAutoSpell ),
bLookUpColRowNames( rCpy.bLookUpColRowNames ),
bFormulaRegexEnabled( rCpy.bFormulaRegexEnabled )
{
}
//------------------------------------------------------------------------
ScDocOptions::~ScDocOptions()
{
}
//------------------------------------------------------------------------
void ScDocOptions::ResetDocOptions()
{
bIsIgnoreCase = sal_False;
bIsIter = sal_False;
nIterCount = 100;
fIterEps = 1.0E-3;
nPrecStandardFormat = SvNumberFormatter::UNLIMITED_PRECISION;
nDay = 30;
nMonth = 12;
nYear = 1899;
nYear2000 = SvNumberFormatter::GetYear2000Default();
nTabDistance = lcl_GetDefaultTabDist();
bCalcAsShown = sal_False;
bMatchWholeCell = sal_True;
bDoAutoSpell = sal_False;
bLookUpColRowNames = sal_True;
bFormulaRegexEnabled= sal_True;
}
//========================================================================
// ScTpCalcItem - Daten fuer die CalcOptions-TabPage
//========================================================================
//UNUSED2008-05 ScTpCalcItem::ScTpCalcItem( sal_uInt16 nWhichP ) : SfxPoolItem( nWhichP )
//UNUSED2008-05 {
//UNUSED2008-05 }
//------------------------------------------------------------------------
ScTpCalcItem::ScTpCalcItem( sal_uInt16 nWhichP, const ScDocOptions& rOpt )
: SfxPoolItem ( nWhichP ),
theOptions ( rOpt )
{
}
//------------------------------------------------------------------------
ScTpCalcItem::ScTpCalcItem( const ScTpCalcItem& rItem )
: SfxPoolItem ( rItem ),
theOptions ( rItem.theOptions )
{
}
//------------------------------------------------------------------------
__EXPORT ScTpCalcItem::~ScTpCalcItem()
{
}
//------------------------------------------------------------------------
String __EXPORT ScTpCalcItem::GetValueText() const
{
return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM("ScTpCalcItem") );
}
//------------------------------------------------------------------------
int __EXPORT ScTpCalcItem::operator==( const SfxPoolItem& rItem ) const
{
DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal Which or Type" );
const ScTpCalcItem& rPItem = (const ScTpCalcItem&)rItem;
return ( theOptions == rPItem.theOptions );
}
//------------------------------------------------------------------------
SfxPoolItem* __EXPORT ScTpCalcItem::Clone( SfxItemPool * ) const
{
return new ScTpCalcItem( *this );
}
//==================================================================
// Config Item containing document options
//==================================================================
#define CFGPATH_CALC "Office.Calc/Calculate"
#define SCCALCOPT_ITER_ITER 0
#define SCCALCOPT_ITER_STEPS 1
#define SCCALCOPT_ITER_MINCHG 2
#define SCCALCOPT_DATE_DAY 3
#define SCCALCOPT_DATE_MONTH 4
#define SCCALCOPT_DATE_YEAR 5
#define SCCALCOPT_DECIMALS 6
#define SCCALCOPT_CASESENSITIVE 7
#define SCCALCOPT_PRECISION 8
#define SCCALCOPT_SEARCHCRIT 9
#define SCCALCOPT_FINDLABEL 10
#define SCCALCOPT_REGEX 11
#define SCCALCOPT_COUNT 12
#define CFGPATH_DOCLAYOUT "Office.Calc/Layout/Other"
#define SCDOCLAYOUTOPT_TABSTOP 0
#define SCDOCLAYOUTOPT_COUNT 1
Sequence<OUString> ScDocCfg::GetCalcPropertyNames()
{
static const char* aPropNames[] =
{
"IterativeReference/Iteration", // SCCALCOPT_ITER_ITER
"IterativeReference/Steps", // SCCALCOPT_ITER_STEPS
"IterativeReference/MinimumChange", // SCCALCOPT_ITER_MINCHG
"Other/Date/DD", // SCCALCOPT_DATE_DAY
"Other/Date/MM", // SCCALCOPT_DATE_MONTH
"Other/Date/YY", // SCCALCOPT_DATE_YEAR
"Other/DecimalPlaces", // SCCALCOPT_DECIMALS
"Other/CaseSensitive", // SCCALCOPT_CASESENSITIVE
"Other/Precision", // SCCALCOPT_PRECISION
"Other/SearchCriteria", // SCCALCOPT_SEARCHCRIT
"Other/FindLabel", // SCCALCOPT_FINDLABEL
"Other/RegularExpressions" // SCCALCOPT_REGEX
};
Sequence<OUString> aNames(SCCALCOPT_COUNT);
OUString* pNames = aNames.getArray();
for(int i = 0; i < SCCALCOPT_COUNT; i++)
pNames[i] = OUString::createFromAscii(aPropNames[i]);
return aNames;
}
Sequence<OUString> ScDocCfg::GetLayoutPropertyNames()
{
static const char* aPropNames[] =
{
"TabStop/NonMetric" // SCDOCLAYOUTOPT_TABSTOP
};
Sequence<OUString> aNames(SCDOCLAYOUTOPT_COUNT);
OUString* pNames = aNames.getArray();
for(int i = 0; i < SCDOCLAYOUTOPT_COUNT; i++)
pNames[i] = OUString::createFromAscii(aPropNames[i]);
// adjust for metric system
if (ScOptionsUtil::IsMetricSystem())
pNames[SCDOCLAYOUTOPT_TABSTOP] = OUString::createFromAscii( "TabStop/Metric" );
return aNames;
}
ScDocCfg::ScDocCfg() :
aCalcItem( OUString::createFromAscii( CFGPATH_CALC ) ),
aLayoutItem( OUString::createFromAscii( CFGPATH_DOCLAYOUT ) )
{
sal_Int32 nIntVal = 0;
double fDoubleVal = 0;
Sequence<OUString> aNames;
Sequence<Any> aValues;
const Any* pValues = NULL;
sal_uInt16 nDateDay, nDateMonth, nDateYear;
GetDate( nDateDay, nDateMonth, nDateYear );
aNames = GetCalcPropertyNames();
aValues = aCalcItem.GetProperties(aNames);
aCalcItem.EnableNotification(aNames);
pValues = aValues.getConstArray();
DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
if(aValues.getLength() == aNames.getLength())
{
for(int nProp = 0; nProp < aNames.getLength(); nProp++)
{
DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
if(pValues[nProp].hasValue())
{
switch(nProp)
{
case SCCALCOPT_ITER_ITER:
SetIter( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
break;
case SCCALCOPT_ITER_STEPS:
if (pValues[nProp] >>= nIntVal) SetIterCount( (sal_uInt16) nIntVal );
break;
case SCCALCOPT_ITER_MINCHG:
if (pValues[nProp] >>= fDoubleVal) SetIterEps( fDoubleVal );
break;
case SCCALCOPT_DATE_DAY:
if (pValues[nProp] >>= nIntVal) nDateDay = (sal_uInt16) nIntVal;
break;
case SCCALCOPT_DATE_MONTH:
if (pValues[nProp] >>= nIntVal) nDateMonth = (sal_uInt16) nIntVal;
break;
case SCCALCOPT_DATE_YEAR:
if (pValues[nProp] >>= nIntVal) nDateYear = (sal_uInt16) nIntVal;
break;
case SCCALCOPT_DECIMALS:
if (pValues[nProp] >>= nIntVal) SetStdPrecision( (sal_uInt16) nIntVal );
break;
case SCCALCOPT_CASESENSITIVE:
// content is reversed
SetIgnoreCase( !ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
break;
case SCCALCOPT_PRECISION:
SetCalcAsShown( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
break;
case SCCALCOPT_SEARCHCRIT:
SetMatchWholeCell( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
break;
case SCCALCOPT_FINDLABEL:
SetLookUpColRowNames( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
break;
case SCCALCOPT_REGEX :
SetFormulaRegexEnabled( ScUnoHelpFunctions::GetBoolFromAny( pValues[nProp] ) );
break;
}
}
}
}
aCalcItem.SetCommitLink( LINK( this, ScDocCfg, CalcCommitHdl ) );
SetDate( nDateDay, nDateMonth, nDateYear );
aNames = GetLayoutPropertyNames();
aValues = aLayoutItem.GetProperties(aNames);
aLayoutItem.EnableNotification(aNames);
pValues = aValues.getConstArray();
DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
if(aValues.getLength() == aNames.getLength())
{
for(int nProp = 0; nProp < aNames.getLength(); nProp++)
{
DBG_ASSERT(pValues[nProp].hasValue(), "property value missing");
if(pValues[nProp].hasValue())
{
switch(nProp)
{
case SCDOCLAYOUTOPT_TABSTOP:
// TabDistance in ScDocOptions is in twips
if (pValues[nProp] >>= nIntVal)
SetTabDistance( (sal_uInt16) HMMToTwips( nIntVal ) );
break;
}
}
}
}
aLayoutItem.SetCommitLink( LINK( this, ScDocCfg, LayoutCommitHdl ) );
}
IMPL_LINK( ScDocCfg, CalcCommitHdl, void *, EMPTYARG )
{
Sequence<OUString> aNames = GetCalcPropertyNames();
Sequence<Any> aValues(aNames.getLength());
Any* pValues = aValues.getArray();
sal_uInt16 nDateDay, nDateMonth, nDateYear;
GetDate( nDateDay, nDateMonth, nDateYear );
for(int nProp = 0; nProp < aNames.getLength(); nProp++)
{
switch(nProp)
{
case SCCALCOPT_ITER_ITER:
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsIter() );
break;
case SCCALCOPT_ITER_STEPS:
pValues[nProp] <<= (sal_Int32) GetIterCount();
break;
case SCCALCOPT_ITER_MINCHG:
pValues[nProp] <<= (double) GetIterEps();
break;
case SCCALCOPT_DATE_DAY:
pValues[nProp] <<= (sal_Int32) nDateDay;
break;
case SCCALCOPT_DATE_MONTH:
pValues[nProp] <<= (sal_Int32) nDateMonth;
break;
case SCCALCOPT_DATE_YEAR:
pValues[nProp] <<= (sal_Int32) nDateYear;
break;
case SCCALCOPT_DECIMALS:
pValues[nProp] <<= (sal_Int32) GetStdPrecision();
break;
case SCCALCOPT_CASESENSITIVE:
// content is reversed
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], !IsIgnoreCase() );
break;
case SCCALCOPT_PRECISION:
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsCalcAsShown() );
break;
case SCCALCOPT_SEARCHCRIT:
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsMatchWholeCell() );
break;
case SCCALCOPT_FINDLABEL:
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsLookUpColRowNames() );
break;
case SCCALCOPT_REGEX :
ScUnoHelpFunctions::SetBoolInAny( pValues[nProp], IsFormulaRegexEnabled() );
}
}
aCalcItem.PutProperties(aNames, aValues);
return 0;
}
IMPL_LINK( ScDocCfg, LayoutCommitHdl, void *, EMPTYARG )
{
Sequence<OUString> aNames = GetLayoutPropertyNames();
Sequence<Any> aValues(aNames.getLength());
Any* pValues = aValues.getArray();
for(int nProp = 0; nProp < aNames.getLength(); nProp++)
{
switch(nProp)
{
case SCDOCLAYOUTOPT_TABSTOP:
// TabDistance in ScDocOptions is in twips
// use only even numbers, so defaults don't get changed
// by modifying other settings in the same config item
pValues[nProp] <<= (sal_Int32) TwipsToEvenHMM( GetTabDistance() );
break;
}
}
aLayoutItem.PutProperties(aNames, aValues);
return 0;
}
void ScDocCfg::SetOptions( const ScDocOptions& rNew )
{
*(ScDocOptions*)this = rNew;
aCalcItem.SetModified();
aLayoutItem.SetModified();
}