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"
21 #include <DrawViewWrapper.hxx>
23 #include <strings.hrc>
25 #include <ObjectIdentifier.hxx>
26 #include <com/sun/star/beans/XPropertySet.hpp>
27 #include <com/sun/star/awt/Point.hpp>
28 #include <basegfx/matrix/b2dhommatrix.hxx>
29 #include <tools/diagnose_ex.h>
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( m_fDragRange
== 0.0 )
69 DragMethod_PieSegment::~DragMethod_PieSegment()
72 OUString
DragMethod_PieSegment::GetSdrDragComment() const
74 OUString aStr
= SchResId(STR_STATUS_PIE_SEGMENT_EXPLODED
);
75 aStr
= aStr
.replaceFirst( "%PERCENTVALUE", OUString::number( static_cast<sal_Int32
>((m_fAdditionalOffset
+m_fInitialOffset
)*100.0) ));
78 bool DragMethod_PieSegment::BeginSdrDrag()
80 Point
aStart( DragStat().GetStart() );
81 m_aStartVector
= B2DVector( aStart
.X(), aStart
.Y() );
85 void DragMethod_PieSegment::MoveSdrDrag(const Point
& rPnt
)
87 if( DragStat().CheckMinMoved(rPnt
) )
89 //calculate new offset
90 B2DVector
aShiftVector( B2DVector( rPnt
.X(), rPnt
.Y() ) - m_aStartVector
);
91 m_fAdditionalOffset
= m_aDragDirection
.scalar( aShiftVector
)/m_fDragRange
; // projection
93 if( m_fAdditionalOffset
< -m_fInitialOffset
)
94 m_fAdditionalOffset
= -m_fInitialOffset
;
95 else if( m_fAdditionalOffset
> (1.0-m_fInitialOffset
) )
96 m_fAdditionalOffset
= 1.0 - m_fInitialOffset
;
98 B2DVector aNewPosVector
= m_aStartVector
+ (m_aDragDirection
* m_fAdditionalOffset
);
99 Point
aNewPos( static_cast<long>(aNewPosVector
.getX()), static_cast<long>(aNewPosVector
.getY()) );
100 if( aNewPos
!= DragStat().GetNow() )
103 DragStat().NextMove( aNewPos
);
108 bool DragMethod_PieSegment::EndSdrDrag(bool /*bCopy*/)
114 Reference
< frame::XModel
> xChartModel( getChartModel() );
115 if( xChartModel
.is() )
117 Reference
< beans::XPropertySet
> xPointProperties(
118 ObjectIdentifier::getObjectPropertySet( m_aObjectCID
, xChartModel
) );
119 if( xPointProperties
.is() )
120 xPointProperties
->setPropertyValue( "Offset", uno::Any( m_fAdditionalOffset
+m_fInitialOffset
));
123 catch( const uno::Exception
& )
125 DBG_UNHANDLED_EXCEPTION("chart2");
130 basegfx::B2DHomMatrix
DragMethod_PieSegment::getCurrentTransformation()
132 basegfx::B2DHomMatrix aRetval
;
134 aRetval
.translate(DragStat().GetDX(), DragStat().GetDY());
138 void DragMethod_PieSegment::createSdrDragEntries()
140 SdrObject
* pObj
= m_rDrawViewWrapper
.getSelectedObject();
141 SdrPageView
* pPV
= m_rDrawViewWrapper
.GetPageView();
145 const basegfx::B2DPolyPolygon
aNewPolyPolygon(pObj
->TakeXorPoly());
146 addSdrDragEntry(std::unique_ptr
<SdrDragEntry
>(new SdrDragEntryPolyPolygon(aNewPolyPolygon
)));
151 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */