fdo#60120 Modify DialControl to store 100th degree angle.

DialControl internally stores the angle to a 100th of a degree
percision, but when SetRotation is called, the value was always
rounded to a 1 degree percision. This has now been modified to
round only on DialControl mouse interaction.

Additionally add add a parameter to SetLinkedField which states
the number of decimal places the NumericField is set to. This change
makes possible to set the NumericField to 100th of a Degree as the
internal angle is represented in. Default value is 0, so no change is
needed to existing DialControls.

Change-Id: I1f0c20092cdfccbd0878d7eb620bfdad7825b0fb
This commit is contained in:
Tomaž Vajngerl
2013-06-03 22:11:34 +02:00
parent 30f2fa988f
commit 870dd81899
4 changed files with 22 additions and 10 deletions

View File

@@ -235,7 +235,7 @@ SvxAngleTabPage::SvxAngleTabPage( Window* pParent, const SfxItemSet& rInAttrs )
aCtlRect.SetAccessibleRelationMemberOf(&aFlPosition);
aCtlAngle.SetAccessibleRelationLabeledBy(&aFtAnglePresets);
aCtlAngle.SetAccessibleRelationMemberOf(&aFlAngle);
aCtlAngle.SetLinkedField( &maNfAngle );
aCtlAngle.SetLinkedField( &maNfAngle, 2 );
}
// -----------------------------------------------------------------------

View File

@@ -390,8 +390,9 @@ TabPage RID_SVXPAGE_ANGLE
Repeat = TRUE ;
Spin = TRUE ;
Minimum = 0 ;
Maximum = 359 ;
SpinSize = 5 ;
Maximum = 35999 ;
DecimalDigits = 2 ;
SpinSize = 10 ;
};
FixedText FT_ANGLEPRESETS
{

View File

@@ -109,8 +109,13 @@ public:
/** Sets the rotation to the passed value (in 1/100 degrees). */
void SetRotation( sal_Int32 nAngle );
/** Links the passed numeric edit field to the control (bi-directional). */
void SetLinkedField( NumericField* pField );
/** Links the passed numeric edit field to the control (bi-directional).
* nDecimalPlaces:
* field value is usign given decimal places
* default is 0 which means field values are in degrees,
* 2 means 100th of degree
*/
void SetLinkedField( NumericField* pField, sal_Int32 nDecimalPlaces = 0);
/** Returns the linked numeric edit field, or 0. */
NumericField* GetLinkedField() const;
@@ -133,6 +138,7 @@ protected:
::boost::scoped_ptr<DialControlBmp> mpBmpBuffered;
Link maModifyHdl;
NumericField* mpLinkField;
sal_Int32 mnLinkedFieldValueMultiplyer;
Size maWinSize;
Font maWinFont;
sal_Int32 mnAngle;

View File

@@ -388,8 +388,10 @@ void DialControl::SetRotation( sal_Int32 nAngle )
SetRotation( nAngle, false );
}
void DialControl::SetLinkedField( NumericField* pField )
void DialControl::SetLinkedField( NumericField* pField, sal_Int32 nDecimalPlaces )
{
mpImpl->mnLinkedFieldValueMultiplyer = 100 / pow(10, nDecimalPlaces);
// remove modify handler from old linked field
ImplSetFieldLink( Link() );
// remember the new linked field
@@ -453,14 +455,15 @@ void DialControl::SetRotation( sal_Int32 nAngle, bool bBroadcast )
bool bOldSel = mpImpl->mbNoRot;
mpImpl->mbNoRot = false;
while( nAngle < 0 ) nAngle += 36000;
nAngle = (((nAngle + 50) / 100) * 100) % 36000;
while( nAngle < 0 )
nAngle += 36000;
if( !bOldSel || (mpImpl->mnAngle != nAngle) )
{
mpImpl->mnAngle = nAngle;
InvalidateControl();
if( mpImpl->mpLinkField )
mpImpl->mpLinkField->SetValue( static_cast< long >( GetRotation() / 100 ) );
mpImpl->mpLinkField->SetValue( static_cast< long >( GetRotation() / mpImpl->mnLinkedFieldValueMultiplyer ) );
if( bBroadcast )
mpImpl->maModifyHdl.Call( this );
}
@@ -493,6 +496,8 @@ void DialControl::HandleMouseEvent( const Point& rPos, bool bInitial )
nAngle = 36000 - nAngle;
if( bInitial ) // round to entire 15 degrees
nAngle = ((nAngle + 750) / 1500) * 1500;
// Round up to 1 degree
nAngle = (((nAngle + 50) / 100) * 100) % 36000;
SetRotation( nAngle, true );
}
}
@@ -511,7 +516,7 @@ void DialControl::HandleEscapeEvent()
IMPL_LINK( DialControl, LinkedFieldModifyHdl, NumericField*, pField )
{
if( pField )
SetRotation( static_cast< sal_Int32 >( pField->GetValue() * 100 ), false );
SetRotation( static_cast< sal_Int32 >( pField->GetValue() * mpImpl->mnLinkedFieldValueMultiplyer ), false );
return 0;
}