1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 #ifndef SVX_PROPERTYPANEL_POSIZEPAGE_HXX
23 #define SVX_PROPERTYPANEL_POSIZEPAGE_HXX
24 
25 #include <vcl/ctrl.hxx>
26 #include <sfx2/sidebar/SidebarPanelBase.hxx>
27 #include <sfx2/sidebar/ControllerItem.hxx>
28 #include <sfx2/sidebar/IContextChangeReceiver.hxx>
29 #include <sfx2/sidebar/GridLayouter.hxx>
30 #include <boost/scoped_ptr.hpp>
31 #include <svx/rectenum.hxx>
32 #include <svl/poolitem.hxx>
33 #include <tools/fldunit.hxx>
34 #include <com/sun/star/ui/XSidebar.hpp>
35 
36 class DialControl;
37 class SdrView;
38 class FixedText;
39 class MetricField;
40 class CheckBox;
41 class MetricBox;
42 
43 
44 namespace svx { namespace sidebar {
45 
46 class SidebarDialControl;
47 
48 class PosSizePropertyPanel
49 :   public Control,
50     public ::sfx2::sidebar::IContextChangeReceiver,
51     public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface
52 {
53 public:
54     static PosSizePropertyPanel* Create(
55         Window* pParent,
56         const cssu::Reference<css::frame::XFrame>& rxFrame,
57         SfxBindings* pBindings,
58         const cssu::Reference<css::ui::XSidebar>& rxSidebar);
59 
60     virtual void DataChanged(
61         const DataChangedEvent& rEvent);
62 
63     virtual void HandleContextChange(
64         const ::sfx2::sidebar::EnumContext aContext);
65 
66     virtual void NotifyItemUpdate(
67         const sal_uInt16 nSId,
68         const SfxItemState eState,
69         const SfxPoolItem* pState,
70         const bool bIsEnabled);
71 
72     SfxBindings* GetBindings();
73     void ShowMenu (void);
74 
75     virtual void Resize (void);
76 
77 private:
78     //Position
79     ::boost::scoped_ptr< FixedText >        mpFtPosX;
80     ::boost::scoped_ptr< MetricField >      mpMtrPosX;
81     ::boost::scoped_ptr< FixedText >        mpFtPosY;
82     ::boost::scoped_ptr< MetricField >      mpMtrPosY;
83 
84     // size
85     ::boost::scoped_ptr< FixedText >        mpFtWidth;
86     ::boost::scoped_ptr< MetricField >      mpMtrWidth;
87     ::boost::scoped_ptr< FixedText >        mpFtHeight;
88     ::boost::scoped_ptr< MetricField >      mpMtrHeight;
89     ::boost::scoped_ptr< CheckBox >         mpCbxScale;
90 
91     //rotation
92     ::boost::scoped_ptr< FixedText >        mpFtAngle;
93     ::boost::scoped_ptr< MetricBox >        mpMtrAngle;
94 
95     //rotation control
96     ::boost::scoped_ptr<SidebarDialControl> mpDial;
97 
98     //flip
99     ::boost::scoped_ptr< FixedText >        mpFtFlip;
100     ::boost::scoped_ptr< Window >           mpFlipTbxBackground;
101     ::boost::scoped_ptr< ToolBox >          mpFlipTbx;
102 
103     // Internal variables
104     Rectangle                               maRect;
105     const SdrView*                          mpView;
106     sal_uInt32                              mlOldWidth;
107     sal_uInt32                              mlOldHeight;
108     RECT_POINT                              meRP;
109     Point                                   maAnchorPos;    //anchor position
110     long                                    mlRotX;
111     long                                    mlRotY;
112     Fraction                                maUIScale;
113     SfxMapUnit                              mePoolUnit;
114     FieldUnit                               meDlgUnit;
115 
116     // Controller Items
117     ::sfx2::sidebar::ControllerItem         maTransfPosXControl;
118     ::sfx2::sidebar::ControllerItem         maTransfPosYControl;
119     ::sfx2::sidebar::ControllerItem         maTransfWidthControl;
120     ::sfx2::sidebar::ControllerItem         maTransfHeightControl;
121 
122     ::sfx2::sidebar::ControllerItem         maSvxAngleControl;
123     ::sfx2::sidebar::ControllerItem         maRotXControl;
124     ::sfx2::sidebar::ControllerItem         maRotYControl;
125     ::sfx2::sidebar::ControllerItem         maProPosControl;
126     ::sfx2::sidebar::ControllerItem         maProSizeControl;
127     ::sfx2::sidebar::ControllerItem         maAutoWidthControl;
128     ::sfx2::sidebar::ControllerItem         maAutoHeightControl;
129     ::sfx2::sidebar::ControllerItem         m_aMetricCtl;
130 
131     cssu::Reference< css::frame::XFrame >   mxFrame;
132     ::sfx2::sidebar::EnumContext            maContext;
133     SfxBindings*                            mpBindings;
134 
135     // to remember original positions for restoring these for different layouts
136     Point                                   maFtWidthOrigPos;
137     Point                                   maMtrWidthOrigPos;
138     Point                                   maFtHeightOrigPos;
139     Point                                   maMtrHeightOrigPos;
140     Point                                   maCbxScaleOrigPos;
141     Point                                   maFtAngleOrigPos;
142     Point                                   maMtrAnglOrigPos;
143     Point                                   maFlipTbxOrigPos;
144     Point                                   maDialOrigPos;
145     Point                                   maFtFlipOrigPos;
146 
147     /// bitfield
148     bool                                    mbMtrPosXMirror : 1;
149     bool                                    mbSizeProtected : 1;
150     bool                                    mbPositionProtected : 1;
151     bool                                    mbAutoWidth : 1;
152     bool                                    mbAutoHeight : 1;
153     bool                                    mbAdjustEnabled : 1;
154     bool                                    mbIsFlip : 1;
155 
156     cssu::Reference<css::ui::XSidebar> mxSidebar;
157     ::sfx2::sidebar::GridLayouter maLayouter;
158 
159     DECL_LINK( ChangePosXHdl, void * );
160     DECL_LINK( ChangePosYHdl, void * );
161     DECL_LINK( ChangeWidthHdl, void * );
162     DECL_LINK( ChangeHeightHdl, void * );
163     DECL_LINK( ClickAutoHdl, void * );
164     DECL_LINK( AngleModifiedHdl, void * );
165     DECL_LINK( RotationHdl, void * );
166     DECL_LINK( FlipHdl, ToolBox * );
167 
168     void SetupIcons(void);
169     void Initialize();
170     void executePosX();
171     void executePosY();
172     void executeSize();
173 
174     // constructor/destuctor
175     PosSizePropertyPanel(
176         Window* pParent,
177         const cssu::Reference<css::frame::XFrame>& rxFrame,
178         SfxBindings* pBindings,
179         const cssu::Reference<css::ui::XSidebar>& rxSidebar);
180     virtual ~PosSizePropertyPanel();
181 
182     void MetricState( SfxItemState eState, const SfxPoolItem* pState );
183     FieldUnit GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState );
184     void DisableControls();
185     void AdaptWidthHeightScalePosition(bool bOriginal);
186     void AdaptAngleFlipDialPosition(bool bOriginal);
187 
188     /** Check if the UI scale has changed and handle such a change.
189         UI scale is an SD only feature.  The UI scale is represented by items
190         ATTR_OPTIONS_SCALE_X and
191         ATTR_OPTIONS_SCALE_Y.
192         As we have no direct access (there is no dependency of svx on sd) we have to
193         use a small trick (aka hack):
194         a) call this method whenever a change of the metric item is notified,
195         b) check if the UI scale has changed (strangely, the UI scale value is available at the SdrModel.
196         c) invalidate the items for position and size to trigger notifications of their current values.
197     */
198     void UpdateUIScale (void);
199 };
200 
201 
202 } } // end of namespace svx::sidebar
203 
204 
205 
206 #endif // SVX_PROPERTYPANEL_POSIZEPAGE_HXX
207 
208 // eof
209