blob: 70784e909c4a08d3cae7eb7139aa2aeafe8ac1d3 [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_sw.hxx"
// include ---------------------------------------------------------------
#include "prcntfld.hxx"
// STATIC DATA -----------------------------------------------------------
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
PercentField::PercentField( Window* pWin, const ResId& rResId ) :
MetricField ( pWin, rResId ),
nOldMax (0),
nOldMin (0),
nLastPercent(-1),
nLastValue (-1),
eOldUnit (FUNIT_NONE),
bLockAutoCalculation(sal_False)
{
nOldSpinSize = GetSpinSize();
nRefValue = DenormalizePercent(MetricField::GetMax(FUNIT_TWIP));
nOldDigits = GetDecimalDigits();
SetCustomUnitText('%');
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetRefValue(sal_Int64 nValue)
{
sal_Int64 nRealValue = GetRealValue(eOldUnit);
nRefValue = nValue;
if (!bLockAutoCalculation && (GetUnit() == FUNIT_CUSTOM))
SetPrcntValue(nRealValue, eOldUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::ShowPercent(sal_Bool bPercent)
{
if ((bPercent && GetUnit() == FUNIT_CUSTOM) ||
(!bPercent && GetUnit() != FUNIT_CUSTOM))
return;
sal_Int64 nOldValue;
if (bPercent)
{
sal_Int64 nAktWidth, nPercent;
nOldValue = GetValue();
eOldUnit = GetUnit();
nOldDigits = GetDecimalDigits();
nOldMin = GetMin();
nOldMax = GetMax();
nOldSpinSize = GetSpinSize();
nOldBaseValue = GetBaseValue();
SetUnit(FUNIT_CUSTOM);
SetDecimalDigits( 0 );
nAktWidth = ConvertValue(nOldMin, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
// Um 0.5 Prozent aufrunden
nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
MetricField::SetMin(Max(static_cast< sal_Int64 >(1), nPercent));
MetricField::SetMax(100);
SetSpinSize(5);
MetricField::SetBaseValue(0);
if (nOldValue != nLastValue)
{
nAktWidth = ConvertValue(nOldValue, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
MetricFormatter::SetValue(nPercent);
nLastPercent = nPercent;
nLastValue = nOldValue;
}
else
MetricFormatter::SetValue(nLastPercent);
// SetValue(100, FUNIT_CUSTOM);
}
else
{
sal_Int64 nOldPercent = GetValue(FUNIT_CUSTOM);
nOldValue = Convert(GetValue(), GetUnit(), eOldUnit);
SetUnit(eOldUnit);
SetDecimalDigits(nOldDigits);
MetricField::SetMin(nOldMin);
MetricField::SetMax(nOldMax);
SetSpinSize(nOldSpinSize);
MetricField::SetBaseValue(nOldBaseValue);
if (nOldPercent != nLastPercent)
{
SetPrcntValue(nOldValue, eOldUnit);
nLastPercent = nOldPercent;
nLastValue = nOldValue;
}
else
SetPrcntValue(nLastValue, eOldUnit);
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetValue(sal_Int64 nNewValue, FieldUnit eInUnit)
{
MetricFormatter::SetValue(nNewValue, eInUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetPrcntValue(sal_Int64 nNewValue, FieldUnit eInUnit)
{
if (GetUnit() != FUNIT_CUSTOM || eInUnit == FUNIT_CUSTOM)
MetricFormatter::SetValue(Convert(nNewValue, eInUnit, GetUnit()));
else
{
// Ausgangswert ueberschreiben, nicht spaeter restaurieren
sal_Int64 nPercent, nAktWidth;
if(eInUnit == FUNIT_TWIP)
{
nAktWidth = ConvertValue(nNewValue, 0, nOldDigits, FUNIT_TWIP, FUNIT_TWIP);
}
else
{
sal_Int64 nValue = Convert(nNewValue, eInUnit, eOldUnit);
nAktWidth = ConvertValue(nValue, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
}
nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
MetricFormatter::SetValue(nPercent);
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetUserValue( sal_Int64 nNewValue, FieldUnit eInUnit )
{
if (GetUnit() != FUNIT_CUSTOM || eInUnit == FUNIT_CUSTOM)
MetricField::SetUserValue(Convert(nNewValue, eInUnit, GetUnit()),FUNIT_NONE);
else
{
// Ausgangswert ueberschreiben, nicht spaeter restaurieren
sal_Int64 nPercent, nAktWidth;
if(eInUnit == FUNIT_TWIP)
{
nAktWidth = ConvertValue(nNewValue, 0, nOldDigits, FUNIT_TWIP, FUNIT_TWIP);
}
else
{
sal_Int64 nValue = Convert(nNewValue, eInUnit, eOldUnit);
nAktWidth = ConvertValue(nValue, 0, nOldDigits, eOldUnit, FUNIT_TWIP);
}
nPercent = ((nAktWidth * 10) / nRefValue + 5) / 10;
MetricField::SetUserValue(nPercent,FUNIT_NONE);
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetBaseValue(sal_Int64 nNewValue, FieldUnit eInUnit)
{
if (GetUnit() == FUNIT_CUSTOM)
nOldBaseValue = ConvertValue(nNewValue, 0, nOldDigits, eInUnit, eOldUnit);
else
MetricField::SetBaseValue(nNewValue, eInUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Int64 PercentField::GetValue( FieldUnit eOutUnit )
{
return Convert(MetricField::GetValue(), GetUnit(), eOutUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetMin(sal_Int64 nNewMin, FieldUnit eInUnit)
{
if (GetUnit() != FUNIT_CUSTOM)
MetricField::SetMin(nNewMin, eInUnit);
else
{
if (eInUnit == FUNIT_NONE)
eInUnit = eOldUnit;
nOldMin = Convert(nNewMin, eInUnit, eOldUnit);
sal_Int64 nPercent = Convert(nNewMin, eInUnit, FUNIT_CUSTOM);
MetricField::SetMin(Max( static_cast< sal_Int64 >(1), nPercent));
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetMax(sal_Int64 nNewMax, FieldUnit eInUnit)
{
if (GetUnit() != FUNIT_CUSTOM)
MetricField::SetMax(nNewMax, eInUnit);
else
{
if (eInUnit == FUNIT_NONE)
eInUnit = eOldUnit;
// SetRefValue(Convert(nNewMax, eInUnit, FUNIT_TWIP));
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Int64 PercentField::NormalizePercent(sal_Int64 nValue)
{
if (GetUnit() != FUNIT_CUSTOM)
nValue = MetricField::Normalize(nValue);
else
nValue = nValue * ImpPower10(nOldDigits);
return nValue;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Int64 PercentField::DenormalizePercent(sal_Int64 nValue)
{
if (GetUnit() != FUNIT_CUSTOM)
nValue = MetricField::Denormalize(nValue);
else
{
sal_Int64 nFactor = ImpPower10(nOldDigits);
nValue = ((nValue+(nFactor/2)) / nFactor);
}
return nValue;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Bool PercentField::IsValueModified()
{
if (GetUnit() == FUNIT_CUSTOM)
return sal_True;
else
return MetricField::IsValueModified();
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Int64 PercentField::ImpPower10( sal_uInt16 n )
{
sal_uInt16 i;
sal_Int64 nValue = 1;
for ( i=0; i < n; i++ )
nValue *= 10;
return nValue;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Int64 PercentField::GetRealValue(FieldUnit eOutUnit)
{
if (GetUnit() != FUNIT_CUSTOM)
return GetValue(eOutUnit);
else
return Convert(GetValue(), GetUnit(), eOutUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Int64 PercentField::Convert(sal_Int64 nValue, FieldUnit eInUnit, FieldUnit eOutUnit)
{
if (eInUnit == eOutUnit ||
(eInUnit == FUNIT_NONE && eOutUnit == GetUnit()) ||
(eOutUnit == FUNIT_NONE && eInUnit == GetUnit()))
return nValue;
if (eInUnit == FUNIT_CUSTOM)
{
// Umrechnen in Metrik
sal_Int64 nTwipValue = (nRefValue * nValue + 50) / 100;
if (eOutUnit == FUNIT_TWIP) // Nur wandeln, wenn unbedingt notwendig
return NormalizePercent(nTwipValue);
else
return ConvertValue(NormalizePercent(nTwipValue), 0, nOldDigits, FUNIT_TWIP, eOutUnit);
}
if (eOutUnit == FUNIT_CUSTOM)
{
// Umrechnen in Prozent
sal_Int64 nAktWidth;
nValue = DenormalizePercent(nValue);
if (eInUnit == FUNIT_TWIP) // Nur wandeln, wenn unbedingt notwendig
nAktWidth = nValue;
else
nAktWidth = ConvertValue(nValue, 0, nOldDigits, eInUnit, FUNIT_TWIP);
// Um 0.5 Prozent runden
return ((nAktWidth * 1000) / nRefValue + 5) / 10;
}
return ConvertValue(nValue, 0, nOldDigits, eInUnit, eOutUnit);
}