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 #ifndef INCLUDED_SVX_INC_DRAGMT3D_HXX
21 #define INCLUDED_SVX_INC_DRAGMT3D_HXX
22 
23 #include <svx/def3d.hxx>
24 #include <svx/svddrgmt.hxx>
25 #include <svx/view3d.hxx>
26 #include <basegfx/polygon/b3dpolypolygon.hxx>
27 #include <basegfx/matrix/b3dhommatrix.hxx>
28 
29 // Parameters for the interaction of a 3D object
30 class E3dDragMethodUnit
31 {
32 public:
33     E3dObject&                      mr3DObj;
34     basegfx::B3DPolyPolygon         maWireframePoly;
35     basegfx::B3DHomMatrix           maDisplayTransform;
36     basegfx::B3DHomMatrix           maInvDisplayTransform;
37     basegfx::B3DHomMatrix           maInitTransform;
38     basegfx::B3DHomMatrix           maTransform;
39     Degree100                       mnStartAngle;
40     Degree100                       mnLastAngle;
41 
E3dDragMethodUnit(E3dObject & r3DObj)42     E3dDragMethodUnit(E3dObject& r3DObj)
43     :   mr3DObj(r3DObj),
44         maWireframePoly(),
45         maDisplayTransform(),
46         maInvDisplayTransform(),
47         maInitTransform(),
48         maTransform(),
49         mnStartAngle(0),
50         mnLastAngle(0)
51     {
52     }
53 };
54 
55 // Derivative of SdrDragMethod for 3D objects
56 class E3dDragMethod : public SdrDragMethod
57 {
58 protected:
59     ::std::vector< E3dDragMethodUnit >  maGrp;
60     E3dDragConstraint                   meConstraint;
61     Point                               maLastPos;
62     tools::Rectangle                           maFullBound;
63     bool                                mbMoveFull;
64     bool                                mbMovedAtAll;
65 
66 public:
67     E3dDragMethod(
68         SdrDragView &rView,
69         const SdrMarkList& rMark,
70         E3dDragConstraint eConstr,
71         bool bFull);
72 
73     virtual OUString GetSdrDragComment() const override;
74     virtual bool BeginSdrDrag() override;
75     virtual void MoveSdrDrag(const Point& rPnt) override;
76     virtual void CancelSdrDrag() override;
77     virtual bool EndSdrDrag(bool bCopy) override;
78 
79     // for migration from XOR to overlay
80     virtual void CreateOverlayGeometry(
81         sdr::overlay::OverlayManager& rOverlayManager,
82         const sdr::contact::ObjectContact& rObjectContact) override;
83 };
84 
85 // Derivative of SdrDragMethod for spinning 3D objects
86 class E3dDragRotate final : public E3dDragMethod
87 {
88     basegfx::B3DPoint                   maGlobalCenter;
89 
90 public:
91     E3dDragRotate(
92         SdrDragView &rView,
93         const SdrMarkList& rMark,
94         E3dDragConstraint eConstr,
95         bool bFull);
96 
97     virtual void MoveSdrDrag(const Point& rPnt) override;
98     virtual PointerStyle GetSdrDragPointer() const override;
99 };
100 
101 // Derivative of SdrDragMethod for moving 3D sub-objects
102 class E3dDragMove final : public E3dDragMethod
103 {
104     SdrHdlKind              meWhatDragHdl;
105     Point                   maScaleFixPos;
106 
107 public:
108     E3dDragMove(
109         SdrDragView &rView,
110         const SdrMarkList& rMark,
111         SdrHdlKind eDrgHdl,
112         E3dDragConstraint eConstr,
113         bool bFull);
114 
115     virtual void MoveSdrDrag(const Point& rPnt) override;
116     virtual PointerStyle GetSdrDragPointer() const override;
117 };
118 
119 
120 #endif // INCLUDED_SVX_INC_DRAGMT3D_HXX
121 
122 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
123