/src/libreoffice/chart2/source/controller/main/DragMethod_PieSegment.cxx
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | /* |
3 | | * This file is part of the LibreOffice project. |
4 | | * |
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/. |
8 | | * |
9 | | * This file incorporates work covered by the following license notice: |
10 | | * |
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 . |
18 | | */ |
19 | | |
20 | | #include "DragMethod_PieSegment.hxx" |
21 | | #include <DrawViewWrapper.hxx> |
22 | | #include <ChartModel.hxx> |
23 | | #include <strings.hrc> |
24 | | #include <ResId.hxx> |
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 <comphelper/diagnose_ex.hxx> |
30 | | |
31 | | namespace chart |
32 | | { |
33 | | |
34 | | using namespace ::com::sun::star; |
35 | | using ::com::sun::star::uno::Reference; |
36 | | using ::basegfx::B2DVector; |
37 | | |
38 | | DragMethod_PieSegment::DragMethod_PieSegment( DrawViewWrapper& rDrawViewWrapper |
39 | | , const OUString& rObjectCID |
40 | | , const rtl::Reference<::chart::ChartModel>& xChartModel ) |
41 | 0 | : DragMethod_Base( rDrawViewWrapper, rObjectCID, xChartModel ) |
42 | 0 | , m_aStartVector(100.0,100.0) |
43 | 0 | , m_fInitialOffset(0.0) |
44 | 0 | , m_fAdditionalOffset(0.0) |
45 | 0 | , m_aDragDirection(1000.0,1000.0) |
46 | 0 | , m_fDragRange( 1.0 ) |
47 | 0 | { |
48 | 0 | std::u16string_view aParameter( ObjectIdentifier::getDragParameterString( m_aObjectCID ) ); |
49 | |
|
50 | 0 | sal_Int32 nOffsetPercent(0); |
51 | 0 | awt::Point aMinimumPosition(0,0); |
52 | 0 | awt::Point aMaximumPosition(0,0); |
53 | |
|
54 | 0 | ObjectIdentifier::parsePieSegmentDragParameterString( |
55 | 0 | aParameter, nOffsetPercent, aMinimumPosition, aMaximumPosition ); |
56 | |
|
57 | 0 | m_fInitialOffset = nOffsetPercent / 100.0; |
58 | 0 | if( m_fInitialOffset < 0.0 ) |
59 | 0 | m_fInitialOffset = 0.0; |
60 | 0 | if( m_fInitialOffset > 1.0 ) |
61 | 0 | m_fInitialOffset = 1.0; |
62 | 0 | B2DVector aMinVector( aMinimumPosition.X, aMinimumPosition.Y ); |
63 | 0 | B2DVector aMaxVector( aMaximumPosition.X, aMaximumPosition.Y ); |
64 | 0 | m_aDragDirection = aMaxVector - aMinVector; |
65 | 0 | m_fDragRange = m_aDragDirection.scalar( m_aDragDirection ); |
66 | 0 | if( m_fDragRange == 0.0 ) |
67 | 0 | m_fDragRange = 1.0; |
68 | 0 | } |
69 | | DragMethod_PieSegment::~DragMethod_PieSegment() |
70 | 0 | { |
71 | 0 | } |
72 | | OUString DragMethod_PieSegment::GetSdrDragComment() const |
73 | 0 | { |
74 | 0 | OUString aStr = SchResId(STR_STATUS_PIE_SEGMENT_EXPLODED); |
75 | 0 | aStr = aStr.replaceFirst( "%PERCENTVALUE", OUString::number( static_cast<sal_Int32>((m_fAdditionalOffset+m_fInitialOffset)*100.0) )); |
76 | 0 | return aStr; |
77 | 0 | } |
78 | | bool DragMethod_PieSegment::BeginSdrDrag() |
79 | 0 | { |
80 | 0 | Point aStart( DragStat().GetStart() ); |
81 | 0 | m_aStartVector = B2DVector( aStart.X(), aStart.Y() ); |
82 | 0 | Show(); |
83 | 0 | return true; |
84 | 0 | } |
85 | | void DragMethod_PieSegment::MoveSdrDrag(const Point& rPnt) |
86 | 0 | { |
87 | 0 | if( !DragStat().CheckMinMoved(rPnt) ) |
88 | 0 | return; |
89 | | |
90 | | //calculate new offset |
91 | 0 | B2DVector aShiftVector( B2DVector( rPnt.X(), rPnt.Y() ) - m_aStartVector ); |
92 | 0 | m_fAdditionalOffset = m_aDragDirection.scalar( aShiftVector )/m_fDragRange; // projection |
93 | |
|
94 | 0 | if( m_fAdditionalOffset < -m_fInitialOffset ) |
95 | 0 | m_fAdditionalOffset = -m_fInitialOffset; |
96 | 0 | else if( m_fAdditionalOffset > (1.0-m_fInitialOffset) ) |
97 | 0 | m_fAdditionalOffset = 1.0 - m_fInitialOffset; |
98 | |
|
99 | 0 | B2DVector aNewPosVector = m_aStartVector + (m_aDragDirection * m_fAdditionalOffset); |
100 | 0 | Point aNewPos( static_cast<tools::Long>(aNewPosVector.getX()), static_cast<tools::Long>(aNewPosVector.getY()) ); |
101 | 0 | if( aNewPos != DragStat().GetNow() ) |
102 | 0 | { |
103 | 0 | Hide(); |
104 | 0 | DragStat().NextMove( aNewPos ); |
105 | 0 | Show(); |
106 | 0 | } |
107 | 0 | } |
108 | | bool DragMethod_PieSegment::EndSdrDrag(bool /*bCopy*/) |
109 | 0 | { |
110 | 0 | Hide(); |
111 | |
|
112 | 0 | try |
113 | 0 | { |
114 | 0 | rtl::Reference<::chart::ChartModel> xChartModel( getChartModel() ); |
115 | 0 | if( xChartModel.is() ) |
116 | 0 | { |
117 | 0 | Reference< beans::XPropertySet > xPointProperties( |
118 | 0 | ObjectIdentifier::getObjectPropertySet( m_aObjectCID, xChartModel ) ); |
119 | 0 | if( xPointProperties.is() ) |
120 | 0 | xPointProperties->setPropertyValue( u"Offset"_ustr, uno::Any( m_fAdditionalOffset+m_fInitialOffset )); |
121 | 0 | } |
122 | 0 | } |
123 | 0 | catch( const uno::Exception & ) |
124 | 0 | { |
125 | 0 | DBG_UNHANDLED_EXCEPTION("chart2"); |
126 | 0 | } |
127 | |
|
128 | 0 | return true; |
129 | 0 | } |
130 | | basegfx::B2DHomMatrix DragMethod_PieSegment::getCurrentTransformation() const |
131 | 0 | { |
132 | 0 | basegfx::B2DHomMatrix aRetval; |
133 | |
|
134 | 0 | aRetval.translate(DragStat().GetDX(), DragStat().GetDY()); |
135 | |
|
136 | 0 | return aRetval; |
137 | 0 | } |
138 | | void DragMethod_PieSegment::createSdrDragEntries() |
139 | 0 | { |
140 | 0 | SdrObject* pObj = m_rDrawViewWrapper.getSelectedObject(); |
141 | 0 | SdrPageView* pPV = m_rDrawViewWrapper.GetPageView(); |
142 | |
|
143 | 0 | if( pObj && pPV ) |
144 | 0 | { |
145 | 0 | basegfx::B2DPolyPolygon aNewPolyPolygon(pObj->TakeXorPoly()); |
146 | 0 | addSdrDragEntry(std::unique_ptr<SdrDragEntry>(new SdrDragEntryPolyPolygon(std::move(aNewPolyPolygon)))); |
147 | 0 | } |
148 | 0 | } |
149 | | } //namespace chart |
150 | | |
151 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |