1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "DragMethod_PieSegment.hxx"
22 #include "Strings.hrc"
25 #include "ObjectIdentifier.hxx"
26 #include <rtl/math.hxx>
27 #include <svx/svdpagv.hxx>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <basegfx/matrix/b2dhommatrix.hxx>
34 using namespace ::com::sun::star
;
35 using ::com::sun::star::uno::Reference
;
36 using ::basegfx::B2DVector
;
38 DragMethod_PieSegment::DragMethod_PieSegment( DrawViewWrapper
& rDrawViewWrapper
39 , const OUString
& rObjectCID
40 , const Reference
< frame::XModel
>& xChartModel
)
41 : DragMethod_Base( rDrawViewWrapper
, rObjectCID
, xChartModel
)
42 , m_aStartVector(100.0,100.0)
43 , m_fInitialOffset(0.0)
44 , m_fAdditionalOffset(0.0)
45 , m_aDragDirection(1000.0,1000.0)
48 OUString
aParameter( ObjectIdentifier::getDragParameterString( m_aObjectCID
) );
50 sal_Int32
nOffsetPercent(0);
51 awt::Point
aMinimumPosition(0,0);
52 awt::Point
aMaximumPosition(0,0);
54 ObjectIdentifier::parsePieSegmentDragParameterString(
55 aParameter
, nOffsetPercent
, aMinimumPosition
, aMaximumPosition
);
57 m_fInitialOffset
= nOffsetPercent
/ 100.0;
58 if( m_fInitialOffset
< 0.0 )
59 m_fInitialOffset
= 0.0;
60 if( m_fInitialOffset
> 1.0 )
61 m_fInitialOffset
= 1.0;
62 B2DVector
aMinVector( aMinimumPosition
.X
, aMinimumPosition
.Y
);
63 B2DVector
aMaxVector( aMaximumPosition
.X
, aMaximumPosition
.Y
);
64 m_aDragDirection
= aMaxVector
- aMinVector
;
65 m_fDragRange
= m_aDragDirection
.scalar( m_aDragDirection
);
66 if( ::rtl::math::approxEqual( m_fDragRange
, 0.0 ) )
69 DragMethod_PieSegment::~DragMethod_PieSegment()
72 void DragMethod_PieSegment::TakeSdrDragComment(OUString
& rStr
) const
74 rStr
= SCH_RESSTR(STR_STATUS_PIE_SEGMENT_EXPLODED
);
75 rStr
= rStr
.replaceFirst( "%PERCENTVALUE", OUString::number( static_cast<sal_Int32
>((m_fAdditionalOffset
+m_fInitialOffset
)*100.0) ));
77 bool DragMethod_PieSegment::BeginSdrDrag()
79 Point
aStart( DragStat().GetStart() );
80 m_aStartVector
= B2DVector( aStart
.X(), aStart
.Y() );
84 void DragMethod_PieSegment::MoveSdrDrag(const Point
& rPnt
)
86 if( DragStat().CheckMinMoved(rPnt
) )
88 //calculate new offset
89 B2DVector
aShiftVector(( B2DVector( rPnt
.X(), rPnt
.Y() ) - m_aStartVector
));
90 m_fAdditionalOffset
= m_aDragDirection
.scalar( aShiftVector
)/m_fDragRange
; // projection
92 if( m_fAdditionalOffset
< -m_fInitialOffset
)
93 m_fAdditionalOffset
= -m_fInitialOffset
;
94 else if( m_fAdditionalOffset
> (1.0-m_fInitialOffset
) )
95 m_fAdditionalOffset
= 1.0 - m_fInitialOffset
;
97 B2DVector aNewPosVector
= m_aStartVector
+ (m_aDragDirection
* m_fAdditionalOffset
);
98 Point aNewPos
= Point( (long)(aNewPosVector
.getX()), (long)(aNewPosVector
.getY()) );
99 if( aNewPos
!= DragStat().GetNow() )
102 DragStat().NextMove( aNewPos
);
107 bool DragMethod_PieSegment::EndSdrDrag(bool /*bCopy*/)
113 Reference
< frame::XModel
> xChartModel( this->getChartModel() );
114 if( xChartModel
.is() )
116 Reference
< beans::XPropertySet
> xPointProperties(
117 ObjectIdentifier::getObjectPropertySet( m_aObjectCID
, xChartModel
) );
118 if( xPointProperties
.is() )
119 xPointProperties
->setPropertyValue( "Offset", uno::makeAny( m_fAdditionalOffset
+m_fInitialOffset
));
122 catch( const uno::Exception
& ex
)
124 ASSERT_EXCEPTION( ex
);
129 basegfx::B2DHomMatrix
DragMethod_PieSegment::getCurrentTransformation()
131 basegfx::B2DHomMatrix aRetval
;
133 aRetval
.translate(DragStat().GetDX(), DragStat().GetDY());
137 void DragMethod_PieSegment::createSdrDragEntries()
139 SdrObject
* pObj
= m_rDrawViewWrapper
.getSelectedObject();
140 SdrPageView
* pPV
= m_rDrawViewWrapper
.GetPageView();
144 const basegfx::B2DPolyPolygon
aNewPolyPolygon(pObj
->TakeXorPoly());
145 addSdrDragEntry(new SdrDragEntryPolyPolygon(aNewPolyPolygon
));
150 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */