Files
libreoffice/sw/source/ui/utlui/prcntfld.cxx
2002-12-05 12:08:00 +00:00

402 lines
12 KiB
C++

/*************************************************************************
*
* $RCSfile: prcntfld.cxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: os $ $Date: 2002-12-05 13:01:16 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
// include ---------------------------------------------------------------
#pragma hdrstop
#include "prcntfld.hxx"
// STATIC DATA -----------------------------------------------------------
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
PercentField::PercentField( Window* pWin, const ResId& rResId ) :
MetricField ( pWin, rResId ),
eOldUnit (FUNIT_NONE),
nOldMin (0),
nOldMax (0),
nLastPercent(-1L),
nLastValue (-1L)
{
nOldSpinSize = GetSpinSize();
nRefValue = Denormalize(MetricField::GetMax(FUNIT_TWIP));
nOldDigits = GetDecimalDigits();
SetCustomUnitText('%');
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetRefValue(long nValue)
{
long nRealValue = GetRealValue(eOldUnit);
nRefValue = nValue;
if (GetUnit() == FUNIT_CUSTOM)
SetPrcntValue(nRealValue, eOldUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::ShowPercent(BOOL bPercent)
{
if ((bPercent && GetUnit() == FUNIT_CUSTOM) ||
(!bPercent && GetUnit() != FUNIT_CUSTOM))
return;
long nOldValue;
if (bPercent)
{
long 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(1L, 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
{
long 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(long nNewValue, FieldUnit eInUnit)
{
MetricFormatter::SetValue(nNewValue, eInUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetPrcntValue(long nNewValue, FieldUnit eInUnit)
{
if (GetUnit() != FUNIT_CUSTOM || eInUnit == FUNIT_CUSTOM)
MetricFormatter::SetValue(Convert(nNewValue, eInUnit, GetUnit()));
else
{
// Ausgangswert ueberschreiben, nicht spaeter restaurieren
long nPercent, nAktWidth;
if(eInUnit == FUNIT_TWIP)
{
nAktWidth = ConvertValue(nNewValue, 0, nOldDigits, FUNIT_TWIP, FUNIT_TWIP);
}
else
{
long 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( long nNewValue, FieldUnit eInUnit )
{
if (GetUnit() != FUNIT_CUSTOM || eInUnit == FUNIT_CUSTOM)
MetricField::SetUserValue(Convert(nNewValue, eInUnit, GetUnit()),FUNIT_NONE);
else
{
// Ausgangswert ueberschreiben, nicht spaeter restaurieren
long nPercent, nAktWidth;
if(eInUnit == FUNIT_TWIP)
{
nAktWidth = ConvertValue(nNewValue, 0, nOldDigits, FUNIT_TWIP, FUNIT_TWIP);
}
else
{
long 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(long nNewValue, FieldUnit eInUnit)
{
if (GetUnit() == FUNIT_CUSTOM)
nOldBaseValue = ConvertValue(nNewValue, 0, nOldDigits, eInUnit, eOldUnit);
else
MetricField::SetBaseValue(nNewValue, eInUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
long PercentField::GetValue( FieldUnit eOutUnit )
{
return Convert(MetricField::GetValue(), GetUnit(), eOutUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetMin(long nNewMin, FieldUnit eInUnit)
{
if (GetUnit() != FUNIT_CUSTOM)
MetricField::SetMin(nNewMin, eInUnit);
else
{
if (eInUnit == FUNIT_NONE)
eInUnit = eOldUnit;
nOldMin = Convert(nNewMin, eInUnit, eOldUnit);
long nPercent = Convert(nNewMin, eInUnit, FUNIT_CUSTOM);
MetricField::SetMin(Max(1L, nPercent));
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void PercentField::SetMax(long 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:
--------------------------------------------------------------------*/
long PercentField::Normalize(long nValue)
{
if (GetUnit() != FUNIT_CUSTOM)
nValue = MetricField::Normalize(nValue);
else
nValue = nValue * ImpPower10(nOldDigits);
return nValue;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
long PercentField::Denormalize(long nValue)
{
if (GetUnit() != FUNIT_CUSTOM)
nValue = MetricField::Denormalize(nValue);
else
{
long nFactor = ImpPower10(nOldDigits);
nValue = ((nValue+(nFactor/2)) / nFactor);
}
return nValue;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
BOOL PercentField::IsValueModified()
{
if (GetUnit() == FUNIT_CUSTOM)
return TRUE;
else
return MetricField::IsValueModified();
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
long PercentField::ImpPower10( USHORT n )
{
USHORT i;
long nValue = 1;
for ( i=0; i < n; i++ )
nValue *= 10;
return nValue;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
long PercentField::GetRealValue(FieldUnit eOutUnit)
{
if (GetUnit() != FUNIT_CUSTOM)
return GetValue(eOutUnit);
else
return Convert(GetValue(), GetUnit(), eOutUnit);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
long PercentField::Convert(long 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
long nTwipValue = (nRefValue * nValue + 50) / 100;
if (eOutUnit == FUNIT_TWIP) // Nur wandeln, wenn unbedingt notwendig
return Normalize(nTwipValue);
else
return ConvertValue(Normalize(nTwipValue), 0, nOldDigits, FUNIT_TWIP, eOutUnit);
}
if (eOutUnit == FUNIT_CUSTOM)
{
// Umrechnen in Prozent
long nAktWidth;
nValue = Denormalize(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);
}