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 #include <sfx2/sidebar/ResourceDefinitions.hrc>
23 #include <sfx2/sidebar/Theme.hxx>
24 #include <sfx2/sidebar/ControlFactory.hxx>
25 #include <sfx2/sidebar/Layouter.hxx>
26 #include "PosSizePropertyPanel.hxx"
27 #include "PosSizePropertyPanel.hrc"
28 #include <svx/sidebar/SidebarDialControl.hxx>
29 #include <svx/dialogs.hrc>
30 #include <svx/dialmgr.hxx>
31 #include <sfx2/dispatch.hxx>
32 #include <sfx2/bindings.hxx>
33 #include <sfx2/viewsh.hxx>
34 #include <sfx2/objsh.hxx>
35 #include <sfx2/imagemgr.hxx>
36 #include <svx/dlgutil.hxx>
37 #include <unotools/viewoptions.hxx>
38 #include <vcl/virdev.hxx>
39 #include <vcl/svapp.hxx>
40 #include <vcl/field.hxx>
41 #include <vcl/fixed.hxx>
42 #include <vcl/toolbox.hxx>
43 #include <svx/svdview.hxx>
44 #include <svl/aeitem.hxx>
45 
46 using namespace css;
47 using namespace cssu;
48 using ::sfx2::sidebar::Layouter;
49 using ::sfx2::sidebar::Theme;
50 
51 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
52 #define USERITEM_NAME rtl::OUString::createFromAscii("FitItem")
53 #define NO_SELECT       (65535)
54 
55 
56 
57 namespace svx { namespace sidebar {
58 
59 
60 
PosSizePropertyPanel(Window * pParent,const cssu::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings,const cssu::Reference<css::ui::XSidebar> & rxSidebar)61 PosSizePropertyPanel::PosSizePropertyPanel(
62     Window* pParent,
63     const cssu::Reference<css::frame::XFrame>& rxFrame,
64     SfxBindings* pBindings,
65     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
66 :   Control(
67         pParent,
68         SVX_RES(RID_SIDEBAR_POSSIZE_PANEL)),
69     mpFtPosX(new FixedText(this, SVX_RES(FT_SBSHAPE_HORIZONTAL))),
70     mpMtrPosX(new MetricField(this, SVX_RES(MF_SBSHAPE_HORIZONTAL))),
71     mpFtPosY(new FixedText(this, SVX_RES(FT_SBSHAPE_VERTICAL))),
72     mpMtrPosY(new MetricField(this, SVX_RES(MF_SBSHAPE_VERTICAL))),
73     mpFtWidth(new FixedText(this, SVX_RES(FT_WIDTH))),
74     mpMtrWidth(new MetricField(this, SVX_RES(MTR_FLD_WIDTH))),
75     mpFtHeight(new FixedText(this, SVX_RES(FT_HEIGHT))),
76     mpMtrHeight(new MetricField(this, SVX_RES(MTR_FLD_HEIGHT))),
77     mpCbxScale(new CheckBox(this, SVX_RES(CBX_SCALE))),
78     mpFtAngle(new FixedText(this, SVX_RES(FT_ANGLE))),
79     mpMtrAngle(new MetricBox(this, SVX_RES(MTR_FLD_ANGLE))),
80     mpDial(new SidebarDialControl(this, SVX_RES(DIAL_CONTROL))),
81     mpFtFlip(new FixedText(this, SVX_RES(FT_FLIP))),
82     mpFlipTbxBackground(sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this)),
83     mpFlipTbx(sfx2::sidebar::ControlFactory::CreateToolBox(mpFlipTbxBackground.get(), SVX_RES(TBX_FLIP))),
84     maRect(),
85     mpView(0),
86     mlOldWidth(1),
87     mlOldHeight(1),
88     meRP(RP_LT),
89     maAnchorPos(),
90     mlRotX(0),
91     mlRotY(0),
92     maUIScale(),
93     mePoolUnit(),
94 
95     // #124409# init with fallback default
96     meDlgUnit(FUNIT_INCH),
97 
98     maTransfPosXControl(SID_ATTR_TRANSFORM_POS_X, *pBindings, *this),
99     maTransfPosYControl(SID_ATTR_TRANSFORM_POS_Y, *pBindings, *this),
100     maTransfWidthControl(SID_ATTR_TRANSFORM_WIDTH, *pBindings, *this),
101     maTransfHeightControl(SID_ATTR_TRANSFORM_HEIGHT, *pBindings, *this),
102     maSvxAngleControl( SID_ATTR_TRANSFORM_ANGLE, *pBindings, *this),
103     maRotXControl(SID_ATTR_TRANSFORM_ROT_X, *pBindings, *this),
104     maRotYControl(SID_ATTR_TRANSFORM_ROT_Y, *pBindings, *this),
105     maProPosControl(SID_ATTR_TRANSFORM_PROTECT_POS, *pBindings, *this),
106     maProSizeControl(SID_ATTR_TRANSFORM_PROTECT_SIZE, *pBindings, *this),
107     maAutoWidthControl(SID_ATTR_TRANSFORM_AUTOWIDTH, *pBindings, *this),
108     maAutoHeightControl(SID_ATTR_TRANSFORM_AUTOHEIGHT, *pBindings, *this),
109     m_aMetricCtl(SID_ATTR_METRIC, *pBindings, *this),
110     mxFrame(rxFrame),
111     maContext(),
112     mpBindings(pBindings),
113     maFtWidthOrigPos(mpFtWidth->GetPosPixel()),
114     maMtrWidthOrigPos(mpMtrWidth->GetPosPixel()),
115     maFtHeightOrigPos(mpFtHeight->GetPosPixel()),
116     maMtrHeightOrigPos(mpMtrHeight->GetPosPixel()),
117     maCbxScaleOrigPos(mpCbxScale->GetPosPixel()),
118     maFtAngleOrigPos(mpFtAngle->GetPosPixel()),
119     maMtrAnglOrigPos(mpMtrAngle->GetPosPixel()),
120     maFlipTbxOrigPos(mpFlipTbx->GetPosPixel()),
121     maDialOrigPos(mpDial->GetPosPixel()),
122     maFtFlipOrigPos(mpFtFlip->GetPosPixel()),
123     mbMtrPosXMirror(false),
124     mbSizeProtected(false),
125     mbPositionProtected(false),
126     mbAutoWidth(false),
127     mbAutoHeight(false),
128     mbAdjustEnabled(false),
129     mbIsFlip(false),
130     mxSidebar(rxSidebar),
131     maLayouter(*this)
132 {
133     Initialize();
134     FreeResource();
135 
136     mpBindings->Update( SID_ATTR_TRANSFORM_WIDTH );
137     mpBindings->Update( SID_ATTR_TRANSFORM_HEIGHT );
138     mpBindings->Update( SID_ATTR_TRANSFORM_PROTECT_SIZE );
139     mpBindings->Update( SID_ATTR_METRIC );
140 
141     // Setup the grid layouter.
142     const sal_Int32 nMappedMboxWidth (Layouter::MapWidth(*this, MBOX_WIDTH));
143 
144     maLayouter.GetCell(0,0).SetControl(*mpFtPosX);
145     maLayouter.GetCell(1,0).SetControl(*mpMtrPosX);
146 
147     maLayouter.GetCell(0,2).SetControl(*mpFtPosY);
148     maLayouter.GetCell(1,2).SetControl(*mpMtrPosY);
149 
150     maLayouter.GetCell(2,0).SetControl(*mpFtWidth);
151     maLayouter.GetCell(3,0).SetControl(*mpMtrWidth);
152 
153     maLayouter.GetCell(2,2).SetControl(*mpFtHeight);
154     maLayouter.GetCell(3,2).SetControl(*mpMtrHeight);
155 
156     maLayouter.GetCell(4,0).SetControl(*mpCbxScale).SetGridWidth(3);
157     maLayouter.GetCell(5,0).SetControl(*mpFtAngle).SetGridWidth(3);
158 
159 
160     maLayouter.GetColumn(0)
161         .SetWeight(1)
162         .SetLeftPadding(Layouter::MapWidth(*this,SECTIONPAGE_MARGIN_HORIZONTAL))
163         .SetMinimumWidth(nMappedMboxWidth);
164     maLayouter.GetColumn(1)
165         .SetWeight(0)
166         .SetMinimumWidth(Layouter::MapWidth(*this, CONTROL_SPACING_HORIZONTAL));
167     maLayouter.GetColumn(2)
168         .SetWeight(1)
169         .SetRightPadding(Layouter::MapWidth(*this,SECTIONPAGE_MARGIN_HORIZONTAL))
170         .SetMinimumWidth(nMappedMboxWidth);
171 
172     // Make controls that display text handle short widths more
173     // graceful.
174     Layouter::PrepareForLayouting(*mpFtPosX);
175     Layouter::PrepareForLayouting(*mpFtPosY);
176     Layouter::PrepareForLayouting(*mpFtWidth);
177     Layouter::PrepareForLayouting(*mpFtHeight);
178     Layouter::PrepareForLayouting(*mpCbxScale);
179     Layouter::PrepareForLayouting(*mpFtAngle);
180 
181 }
182 
183 
184 
~PosSizePropertyPanel()185 PosSizePropertyPanel::~PosSizePropertyPanel()
186 {
187     // Destroy the background windows of the toolboxes.
188     mpFlipTbx.reset();
189     mpFlipTbxBackground.reset();
190 }
191 
192 
193 
ShowMenu(void)194 void PosSizePropertyPanel::ShowMenu (void)
195 {
196     if (mpBindings != NULL)
197     {
198         SfxDispatcher* pDispatcher = mpBindings->GetDispatcher();
199         if (pDispatcher != NULL)
200             pDispatcher->Execute(SID_ATTR_TRANSFORM, SFX_CALLMODE_ASYNCHRON);
201     }
202 }
203 
204 
205 
206 namespace
207 {
hasText(const SdrView & rSdrView)208     bool hasText(const SdrView& rSdrView)
209     {
210         const SdrMarkList& rMarkList = rSdrView.GetMarkedObjectList();
211 
212         if(1 == rMarkList.GetMarkCount())
213         {
214             const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
215             const SdrObjKind eKind((SdrObjKind)pObj->GetObjIdentifier());
216 
217             if((pObj->GetObjInventor() == SdrInventor) && (OBJ_TEXT == eKind || OBJ_TITLETEXT == eKind || OBJ_OUTLINETEXT == eKind))
218             {
219                 const SdrTextObj* pSdrTextObj = dynamic_cast< const SdrTextObj* >(pObj);
220 
221                 if(pSdrTextObj && pSdrTextObj->HasText())
222                 {
223                     return true;
224                 }
225             }
226         }
227 
228         return false;
229     }
230 } // end of anonymous namespace
231 
232 
233 
234 
Resize(void)235 void PosSizePropertyPanel::Resize (void)
236 {
237     maLayouter.Layout();
238 }
239 
240 
241 
242 
Initialize()243 void PosSizePropertyPanel::Initialize()
244 {
245     mpFtPosX->SetBackground(Wallpaper());
246     mpFtPosY->SetBackground(Wallpaper());
247     mpFtWidth->SetBackground(Wallpaper());
248     mpFtHeight->SetBackground(Wallpaper());
249     mpFtAngle->SetBackground(Wallpaper());
250     mpFtFlip->SetBackground(Wallpaper());
251 
252         //Position : Horizontal / Vertical
253     mpMtrPosX->SetModifyHdl( LINK( this, PosSizePropertyPanel, ChangePosXHdl ) );
254     mpMtrPosY->SetModifyHdl( LINK( this, PosSizePropertyPanel, ChangePosYHdl ) );
255     mpMtrPosX->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Horizontal")));	//wj acc
256     mpMtrPosY->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Vertical")));		//wj acc
257 
258     //Size : Width / Height
259     mpMtrWidth->SetModifyHdl( LINK( this, PosSizePropertyPanel, ChangeWidthHdl ) );
260     mpMtrHeight->SetModifyHdl( LINK( this, PosSizePropertyPanel, ChangeHeightHdl ) );
261     mpMtrWidth->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Width")));	//wj acc
262     mpMtrHeight->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Height")));	//wj acc
263 
264     //Size : Keep ratio
265     mpCbxScale->SetClickHdl( LINK( this, PosSizePropertyPanel, ClickAutoHdl ) );
266 
267     //rotation:
268     mpMtrAngle->SetModifyHdl(LINK( this, PosSizePropertyPanel, AngleModifiedHdl));
269     mpMtrAngle->EnableAutocomplete( false );
270     mpMtrAngle->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Rotation")));	//wj acc
271 
272     //rotation control
273     mpDial->SetModifyHdl(LINK( this, PosSizePropertyPanel, RotationHdl));
274 
275     //flip:
276     mpFlipTbx->SetSelectHdl( LINK( this, PosSizePropertyPanel, FlipHdl) );
277     mpFlipTbx->SetItemImage(
278         FLIP_HORIZONTAL,
279         GetImage(mxFrame, A2S(".uno:FlipHorizontal"), sal_False, Theme::IsHighContrastMode()));
280     mpFlipTbx->SetItemImage(
281         FLIP_VERTICAL,
282         GetImage(mxFrame, A2S(".uno:FlipVertical"), sal_False, Theme::IsHighContrastMode()));
283     mpFlipTbx->SetQuickHelpText(FLIP_HORIZONTAL,String(SVX_RES(STR_QH_HORI_FLIP))); //Add
284     mpFlipTbx->SetQuickHelpText(FLIP_VERTICAL,String(SVX_RES(STR_QH_VERT_FLIP))); //Add
285 
286     mpMtrPosX->SetAccessibleRelationLabeledBy(mpFtPosX.get());
287     mpMtrPosY->SetAccessibleRelationLabeledBy(mpFtPosY.get());
288     mpMtrWidth->SetAccessibleRelationLabeledBy(mpFtWidth.get());
289     mpMtrHeight->SetAccessibleRelationLabeledBy(mpFtHeight.get());
290     mpMtrAngle->SetAccessibleRelationLabeledBy(mpFtAngle.get());
291 #ifdef HAS_IA2
292     mpMtrAngle->SetMpSubEditAccLableBy(mpFtAngle.get());
293 #endif
294     mpFlipTbx->SetAccessibleRelationLabeledBy(mpFtFlip.get());
295 
296     mpMtrAngle->InsertValue(0, FUNIT_CUSTOM);
297     mpMtrAngle->InsertValue(4500, FUNIT_CUSTOM);
298     mpMtrAngle->InsertValue(9000, FUNIT_CUSTOM);
299     mpMtrAngle->InsertValue(13500, FUNIT_CUSTOM);
300     mpMtrAngle->InsertValue(18000, FUNIT_CUSTOM);
301     mpMtrAngle->InsertValue(22500, FUNIT_CUSTOM);
302     mpMtrAngle->InsertValue(27000, FUNIT_CUSTOM);
303     mpMtrAngle->InsertValue(31500, FUNIT_CUSTOM);
304     mpMtrAngle->AdaptDropDownLineCountToMaximum();
305 
306     SfxViewShell* pCurSh = SfxViewShell::Current();
307     if ( pCurSh )
308         mpView = pCurSh->GetDrawView();
309     else
310         mpView = NULL;
311 
312     if ( mpView != NULL )
313     {
314         maUIScale = mpView->GetModel()->GetUIScale();
315         mbAdjustEnabled = hasText(*mpView);
316     }
317 
318     mePoolUnit = maTransfWidthControl.GetCoreMetric();
319 
320     // #124409# no need to do this, the mpBindings->Update( SID_ATTR_METRIC )
321     // call in the constructor will trigger MetricState and will get the correct unit
322     //
323     // meDlgUnit = GetModuleFieldUnit();
324     // SetFieldUnit( *mpMtrPosX, meDlgUnit, true );
325     // SetFieldUnit( *mpMtrPosY, meDlgUnit, true );
326     // SetFieldUnit( *mpMtrWidth, meDlgUnit, true );
327     // SetFieldUnit( *mpMtrHeight, meDlgUnit, true );
328 }
329 
330 
331 
SetupIcons(void)332 void PosSizePropertyPanel::SetupIcons(void)
333 {
334     if(Theme::GetBoolean(Theme::Bool_UseSymphonyIcons))
335     {
336         // todo
337     }
338     else
339     {
340         // todo
341     }
342 }
343 
344 
345 
Create(Window * pParent,const cssu::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings,const cssu::Reference<css::ui::XSidebar> & rxSidebar)346 PosSizePropertyPanel* PosSizePropertyPanel::Create (
347     Window* pParent,
348     const cssu::Reference<css::frame::XFrame>& rxFrame,
349     SfxBindings* pBindings,
350     const cssu::Reference<css::ui::XSidebar>& rxSidebar)
351 {
352     if (pParent == NULL)
353         throw lang::IllegalArgumentException(A2S("no parent Window given to PosSizePropertyPanel::Create"), NULL, 0);
354     if ( ! rxFrame.is())
355         throw lang::IllegalArgumentException(A2S("no XFrame given to PosSizePropertyPanel::Create"), NULL, 1);
356     if (pBindings == NULL)
357         throw lang::IllegalArgumentException(A2S("no SfxBindings given to PosSizePropertyPanel::Create"), NULL, 2);
358 
359     return new PosSizePropertyPanel(
360         pParent,
361         rxFrame,
362         pBindings,
363         rxSidebar);
364 }
365 
366 
367 
DataChanged(const DataChangedEvent & rEvent)368 void PosSizePropertyPanel::DataChanged(
369     const DataChangedEvent& rEvent)
370 {
371     (void)rEvent;
372 
373     SetupIcons();
374 }
375 
376 
377 
AdaptWidthHeightScalePosition(bool bOriginal)378 void PosSizePropertyPanel::AdaptWidthHeightScalePosition(bool bOriginal)
379 {
380     if(bOriginal)
381     {
382         mpFtWidth->SetPosPixel(maFtWidthOrigPos);
383         mpMtrWidth->SetPosPixel(maMtrWidthOrigPos);
384         mpFtHeight->SetPosPixel(maFtHeightOrigPos);
385         mpMtrHeight->SetPosPixel(maMtrHeightOrigPos);
386         mpCbxScale->SetPosPixel(maCbxScaleOrigPos);
387     }
388     else
389     {
390         mpFtWidth->SetPosPixel(Point(LogicToPixel(Point(FT_POSITION_X_X,FT_POSITION_X_Y), MAP_APPFONT)));
391         mpMtrWidth->SetPosPixel(Point(LogicToPixel(Point(MF_POSITION_X_X,MF_POSITION_X_Y), MAP_APPFONT)));
392         mpFtHeight->SetPosPixel(Point(LogicToPixel(Point(FT_POSITION_Y_X,FT_POSITION_Y_Y), MAP_APPFONT)));
393         mpMtrHeight->SetPosPixel(Point(LogicToPixel(Point(MF_POSITION_Y_X,MF_POSITION_Y_Y), MAP_APPFONT)));
394         mpCbxScale->SetPosPixel(Point(LogicToPixel(Point(FT_WIDTH_X,FT_WIDTH_Y), MAP_APPFONT)));
395     }
396 }
397 
AdaptAngleFlipDialPosition(bool bOriginal)398 void PosSizePropertyPanel::AdaptAngleFlipDialPosition(bool bOriginal)
399 {
400     if(bOriginal)
401     {
402         mpFtAngle->SetPosPixel(maFtAngleOrigPos);
403         mpMtrAngle->SetPosPixel(maMtrAnglOrigPos);
404         mpFlipTbx->SetPosPixel(maFlipTbxOrigPos);
405         mpDial->SetPosPixel(maDialOrigPos);
406         mpFtFlip->SetPosPixel(maFtFlipOrigPos);
407     }
408     else
409     {
410         mpFtAngle->SetPosPixel(Point(LogicToPixel(Point(FT_ANGLE_X,FT_ANGLE_Y), MAP_APPFONT)));
411         mpMtrAngle->SetPosPixel(Point(LogicToPixel(Point(MF_ANGLE_X2,MF_ANGLE_Y2), MAP_APPFONT)));
412         mpFlipTbx->SetPosPixel(Point(LogicToPixel(Point(FLIP_HORI_X2,FLIP_HORI_Y2), MAP_APPFONT)));
413         mpDial->SetPosPixel(Point(LogicToPixel(Point(ROTATE_CONTROL_X2,ROTATE_CONTROL_Y2), MAP_APPFONT)));
414         mpFtFlip->SetPosPixel(Point(LogicToPixel(Point(FT_FLIP_X2,FT_FLIP_Y2), MAP_APPFONT)));
415     }
416 }
417 
HandleContextChange(const::sfx2::sidebar::EnumContext aContext)418 void PosSizePropertyPanel::HandleContextChange(
419     const ::sfx2::sidebar::EnumContext aContext)
420 {
421     if(maContext == aContext)
422     {
423         // Nothing to do.
424         return;
425     }
426 
427     maContext = aContext;
428 
429     sal_Int32 nLayoutMode (0);
430     switch (maContext.GetCombinedContext_DI())
431     {
432         case CombinedEnumContext(Application_WriterVariants, Context_Draw):
433             nLayoutMode = 0;
434             break;
435 
436         case CombinedEnumContext(Application_WriterVariants, Context_Graphic):
437         case CombinedEnumContext(Application_WriterVariants, Context_Media):
438         case CombinedEnumContext(Application_WriterVariants, Context_Frame):
439         case CombinedEnumContext(Application_WriterVariants, Context_OLE):
440         case CombinedEnumContext(Application_WriterVariants, Context_Form):
441             nLayoutMode = 1;
442             break;
443 
444         case CombinedEnumContext(Application_Calc, Context_Draw):
445         case CombinedEnumContext(Application_Calc, Context_Graphic):
446         case CombinedEnumContext(Application_DrawImpress, Context_Draw):
447         case CombinedEnumContext(Application_DrawImpress, Context_TextObject):
448         case CombinedEnumContext(Application_DrawImpress, Context_Graphic):
449             nLayoutMode = 2;
450             break;
451 
452         case CombinedEnumContext(Application_Calc, Context_Chart):
453         case CombinedEnumContext(Application_Calc, Context_Form):
454         case CombinedEnumContext(Application_Calc, Context_Media):
455         case CombinedEnumContext(Application_Calc, Context_OLE):
456         case CombinedEnumContext(Application_Calc, Context_MultiObject):
457         case CombinedEnumContext(Application_DrawImpress, Context_Media):
458         case CombinedEnumContext(Application_DrawImpress, Context_Form):
459         case CombinedEnumContext(Application_DrawImpress, Context_OLE):
460         case CombinedEnumContext(Application_DrawImpress, Context_3DObject):
461         case CombinedEnumContext(Application_DrawImpress, Context_MultiObject):
462             nLayoutMode = 3;
463             break;
464     }
465 
466     switch (nLayoutMode)
467     {
468         case 0:
469         {
470             mpMtrWidth->SetMin( 2 );
471             mpMtrHeight->SetMin( 2 );
472             mpFtPosX->Hide();
473             mpMtrPosX->Hide();
474             mpFtPosY->Hide();
475             mpMtrPosY->Hide();
476 
477             //rotation
478             mpFtAngle->Show();
479             mpMtrAngle->Show();
480             mpDial->Show();
481 
482             //flip
483             mpFtFlip->Show();
484             mpFlipTbx->Show();
485             Size aTbxSize = mpFlipTbx->CalcWindowSizePixel();
486             mpFlipTbx->SetOutputSizePixel( aTbxSize );
487             mbIsFlip = true;
488 
489             AdaptWidthHeightScalePosition(false);
490             AdaptAngleFlipDialPosition(false);
491 
492             mpFtAngle->SetPosPixel(Point(LogicToPixel(Point(FT_ANGLE_X,FT_ANGLE_Y), MAP_APPFONT)));
493             mpMtrAngle->SetPosPixel(Point(LogicToPixel(Point(MF_ANGLE_X2,MF_ANGLE_Y2), MAP_APPFONT)));
494             mpFlipTbx->SetPosPixel(Point(LogicToPixel(Point(FLIP_HORI_X2,FLIP_HORI_Y2), MAP_APPFONT)));
495             mpDial->SetPosPixel(Point(LogicToPixel(Point(ROTATE_CONTROL_X2,ROTATE_CONTROL_Y2), MAP_APPFONT)));
496             mpFtFlip->SetPosPixel(Point(LogicToPixel(Point(FT_FLIP_X2,FT_FLIP_Y2), MAP_APPFONT)));
497 
498             Size aSize(GetOutputSizePixel().Width(),PS_SECTIONPAGE_HEIGHT2);
499             aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
500             SetSizePixel(aSize);
501             if (mxSidebar.is())
502                 mxSidebar->requestLayout();
503         }
504         break;
505 
506         case 1:
507         {
508             mpMtrWidth->SetMin( 2 );
509             mpMtrHeight->SetMin( 2 );
510             mpFtPosX->Hide();
511             mpMtrPosX->Hide();
512             mpFtPosY->Hide();
513             mpMtrPosY->Hide();
514 
515             //rotation
516             mpFtAngle->Hide();
517             mpMtrAngle->Hide();
518             mpDial->Hide();
519 
520             //flip
521             mpFlipTbx->Hide();
522             mpFtFlip->Hide();
523             mbIsFlip = false;
524 
525             AdaptWidthHeightScalePosition(false);
526             AdaptAngleFlipDialPosition(true);
527 
528             Size aSize(GetOutputSizePixel().Width(),PS_SECTIONPAGE_HEIGHT3);
529             aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
530             SetSizePixel(aSize);
531             if (mxSidebar.is())
532                 mxSidebar->requestLayout();
533         }
534         break;
535 
536         case 2:
537         {
538             mpMtrWidth->SetMin( 1 );
539             mpMtrHeight->SetMin( 1 );
540             mpFtPosX->Show();
541             mpMtrPosX->Show();
542             mpFtPosY->Show();
543             mpMtrPosY->Show();
544 
545             //rotation
546             mpFtAngle->Show();
547             mpMtrAngle->Show();
548             mpDial->Show();
549 
550             //flip
551             mpFlipTbx->Show();
552             mpFtFlip->Show();
553             Size aTbxSize = mpFlipTbx->CalcWindowSizePixel();
554             mpFlipTbx->SetOutputSizePixel( aTbxSize );
555             mbIsFlip = true;
556 
557             AdaptWidthHeightScalePosition(true);
558             AdaptAngleFlipDialPosition(true);
559 
560             Size aSize(GetOutputSizePixel().Width(),PS_SECTIONPAGE_HEIGHT);
561             aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
562             SetSizePixel(aSize);
563             if (mxSidebar.is())
564                 mxSidebar->requestLayout();
565         }
566         break;
567 
568         case 3:
569         {
570             mpMtrWidth->SetMin( 1 );
571             mpMtrHeight->SetMin( 1 );
572             mpFtPosX->Show();
573             mpMtrPosX->Show();
574             mpFtPosY->Show();
575             mpMtrPosY->Show();
576 
577             //rotation
578             mpFtAngle->Hide();
579             mpMtrAngle->Hide();
580             mpDial->Hide();
581 
582             //flip
583             mpFlipTbx->Hide();
584             mpFtFlip->Hide();
585             mbIsFlip = false;
586 
587             AdaptWidthHeightScalePosition(true);
588             AdaptAngleFlipDialPosition(true);
589 
590             Size aSize(GetOutputSizePixel().Width(),PS_SECTIONPAGE_HEIGHT4);
591             aSize = LogicToPixel( aSize, MapMode(MAP_APPFONT) );
592             SetSizePixel(aSize);
593             if (mxSidebar.is())
594                 mxSidebar->requestLayout();
595         }
596         break;
597     }
598 
599     //Added for windows classic theme
600     mpFlipTbx->SetBackground(Wallpaper());
601     mpFlipTbx->SetPaintTransparent(true);
602 }
603 
604 
605 
606 IMPL_LINK( PosSizePropertyPanel, ChangeWidthHdl, void*, /*pBox*/ )
607 {
608     if( mpCbxScale->IsChecked() &&
609         mpCbxScale->IsEnabled() )
610     {
611         long nHeight = (long) ( ((double) mlOldHeight * (double) mpMtrWidth->GetValue()) / (double) mlOldWidth );
612         if( nHeight <= mpMtrHeight->GetMax( FUNIT_NONE ) )
613         {
614             mpMtrHeight->SetUserValue( nHeight, FUNIT_NONE );
615         }
616         else
617         {
618             nHeight = (long)mpMtrHeight->GetMax( FUNIT_NONE );
619             mpMtrHeight->SetUserValue( nHeight );
620             const long nWidth = (long) ( ((double) mlOldWidth * (double) nHeight) / (double) mlOldHeight );
621             mpMtrWidth->SetUserValue( nWidth, FUNIT_NONE );
622         }
623     }
624     executeSize();
625     return 0;
626 }
627 
628 
629 
IMPL_LINK(PosSizePropertyPanel,ChangeHeightHdl,void *,EMPTYARG)630 IMPL_LINK( PosSizePropertyPanel, ChangeHeightHdl, void *, EMPTYARG )
631 {
632     if( mpCbxScale->IsChecked() &&
633         mpCbxScale->IsEnabled() )
634     {
635         long nWidth = (long) ( ((double)mlOldWidth * (double)mpMtrHeight->GetValue()) / (double)mlOldHeight );
636         if( nWidth <= mpMtrWidth->GetMax( FUNIT_NONE ) )
637         {
638             mpMtrWidth->SetUserValue( nWidth, FUNIT_NONE );
639         }
640         else
641         {
642             nWidth = (long)mpMtrWidth->GetMax( FUNIT_NONE );
643             mpMtrWidth->SetUserValue( nWidth );
644             const long nHeight = (long) ( ((double)mlOldHeight * (double)nWidth) / (double)mlOldWidth );
645             mpMtrHeight->SetUserValue( nHeight, FUNIT_NONE );
646         }
647     }
648     executeSize();
649     return 0;
650 }
651 
652 
653 
IMPL_LINK(PosSizePropertyPanel,ChangePosXHdl,void *,EMPTYARG)654 IMPL_LINK( PosSizePropertyPanel, ChangePosXHdl, void *, EMPTYARG )
655 {
656     executePosX();
657     return 0;
658 }
659 
660 
661 
IMPL_LINK(PosSizePropertyPanel,ChangePosYHdl,void *,EMPTYARG)662 IMPL_LINK( PosSizePropertyPanel, ChangePosYHdl, void *, EMPTYARG )
663 {
664     executePosY();
665     return 0;
666 }
667 
668 
669 
IMPL_LINK(PosSizePropertyPanel,ClickAutoHdl,void *,EMPTYARG)670 IMPL_LINK( PosSizePropertyPanel, ClickAutoHdl, void *, EMPTYARG )
671 {
672     if ( mpCbxScale->IsChecked() )
673     {
674         mlOldWidth  = Max( GetCoreValue( *mpMtrWidth,  mePoolUnit ), 1L );
675         mlOldHeight = Max( GetCoreValue( *mpMtrHeight, mePoolUnit ), 1L );
676     }
677 
678     // mpCbxScale must synchronized with that on Position and Size tabpage on Shape Properties dialog
679     SvtViewOptions	aPageOpt( E_TABPAGE, String::CreateFromInt32( RID_SVXPAGE_POSITION_SIZE ) );
680     aPageOpt.SetUserItem( USERITEM_NAME, ::com::sun::star::uno::makeAny( ::rtl::OUString( String::CreateFromInt32( mpCbxScale->IsChecked() ) ) ) );
681 
682     return 0;
683 }
684 
685 
686 
IMPL_LINK(PosSizePropertyPanel,AngleModifiedHdl,void *,EMPTYARG)687 IMPL_LINK( PosSizePropertyPanel, AngleModifiedHdl, void *, EMPTYARG )
688 {
689     String sTmp = mpMtrAngle->GetText();
690     bool    bNegative = 0;
691     sal_Unicode nChar = sTmp.GetChar( 0 );
692 
693     if( nChar == '-' )
694     {
695         bNegative = 1;
696         nChar = sTmp.GetChar( 1 );
697     }
698 
699     if( (nChar < '0') || (nChar > '9') )
700         return 0;
701     double dTmp = sTmp.ToDouble();
702     if(bNegative)
703     {
704         while(dTmp<0)
705             dTmp += 360;
706     }
707     sal_Int64 nTmp = dTmp*100;
708 
709     // #123993# Need to take UIScale into account when executing rotations
710     const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0);
711     SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,(sal_uInt32) nTmp);
712     SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale));
713     SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale));
714 
715     GetBindings()->GetDispatcher()->Execute(
716         SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aAngleItem, &aRotXItem, &aRotYItem, 0L );
717 
718     return 0;
719 }
720 
721 
722 
IMPL_LINK(PosSizePropertyPanel,RotationHdl,void *,EMPTYARG)723 IMPL_LINK( PosSizePropertyPanel, RotationHdl, void *, EMPTYARG )
724 {
725     sal_Int32 nTmp = mpDial->GetRotation();
726 
727     // #123993# Need to take UIScale into account when executing rotations
728     const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0);
729     SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,(sal_uInt32) nTmp);
730     SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale));
731     SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale));
732 
733     GetBindings()->GetDispatcher()->Execute(
734         SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aAngleItem, &aRotXItem, &aRotYItem, 0L );
735 
736     return 0;
737 }
738 
739 
740 
IMPL_LINK(PosSizePropertyPanel,FlipHdl,ToolBox *,pBox)741 IMPL_LINK( PosSizePropertyPanel, FlipHdl, ToolBox*, pBox )
742 {
743     switch (pBox->GetCurItemId())
744     {
745         case FLIP_HORIZONTAL:
746         {
747             SfxVoidItem aHoriItem (SID_FLIP_HORIZONTAL);
748             GetBindings()->GetDispatcher()->Execute(
749                 SID_FLIP_HORIZONTAL, SFX_CALLMODE_RECORD, &aHoriItem, 0L );
750         }
751         break;
752         case FLIP_VERTICAL:
753         {
754             SfxVoidItem aVertItem (SID_FLIP_VERTICAL );
755             GetBindings()->GetDispatcher()->Execute(
756                 SID_FLIP_VERTICAL, SFX_CALLMODE_RECORD, &aVertItem, 0L );
757         }
758         break;
759     }
760     return 0;
761 }
762 
763 
764 
NotifyItemUpdate(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState,const bool)765 void PosSizePropertyPanel::NotifyItemUpdate(
766     sal_uInt16 nSID,
767     SfxItemState eState,
768     const SfxPoolItem* pState,
769     const bool /* bIsEnabled */)
770 {
771     mpFtAngle->Enable();
772     mpMtrAngle->Enable();
773     mpDial->Enable();
774     mpFtFlip->Enable();
775     mpFlipTbx->Enable();
776 
777     const SfxUInt32Item*	pWidthItem;
778     const SfxUInt32Item*	pHeightItem;
779 
780     SfxViewShell* pCurSh = SfxViewShell::Current();
781     if ( pCurSh )
782         mpView = pCurSh->GetDrawView();
783     else
784         mpView = NULL;
785 
786     if ( mpView == NULL )
787         return;
788 
789     mbAdjustEnabled = hasText(*mpView);
790 
791     // Pool unit and dialog unit may have changed, make sure that we
792     // have the current values.
793     mePoolUnit = maTransfWidthControl.GetCoreMetric();
794 
795     // #124409# do not change; GetModuleFieldUnit uses SfxModule::GetCurrentFieldUnit()
796     // which uses GetActiveModule() and if no items are set there (which is the case e.g.
797     // for writer), will just return the system fallback of FUNIT_INCH which is wrong.
798     // Anyways, with multiple open views the static call GetActiveModule is ambigious
799     //
800     // meDlgUnit = GetModuleFieldUnit();
801 
802     switch (nSID)
803     {
804         case SID_ATTR_TRANSFORM_WIDTH:
805             if ( SFX_ITEM_AVAILABLE == eState )
806             {
807                 pWidthItem = dynamic_cast< const SfxUInt32Item* >(pState);
808 
809                 if(pWidthItem)
810                 {
811                     long mlOldWidth1 = pWidthItem->GetValue();
812 
813                     mlOldWidth1 = Fraction( mlOldWidth1 ) / maUIScale;
814                     SetFieldUnit( *mpMtrWidth, meDlgUnit, true );
815                     SetMetricValue( *mpMtrWidth, mlOldWidth1, mePoolUnit );
816                     mlOldWidth = mlOldWidth1;
817                     break;
818                 }
819             }
820 
821             mpMtrWidth->SetText( String());
822             break;
823 
824         case SID_ATTR_TRANSFORM_HEIGHT:
825             if ( SFX_ITEM_AVAILABLE == eState )
826             {
827                 pHeightItem = dynamic_cast< const SfxUInt32Item* >(pState);
828 
829                 if(pHeightItem)
830                 {
831                     long mlOldHeight1 = pHeightItem->GetValue();
832 
833                     mlOldHeight1 = Fraction( mlOldHeight1 ) / maUIScale;
834                     SetFieldUnit( *mpMtrHeight, meDlgUnit, true );
835                     SetMetricValue( *mpMtrHeight, mlOldHeight1, mePoolUnit );
836                     mlOldHeight = mlOldHeight1;
837                     break;
838                 }
839             }
840 
841             mpMtrHeight->SetText( String());
842             break;
843 
844         case SID_ATTR_TRANSFORM_POS_X:
845             if(SFX_ITEM_AVAILABLE == eState)
846             {
847                 const SfxInt32Item* pItem = dynamic_cast< const SfxInt32Item* >(pState);
848 
849                 if(pItem)
850                 {
851                     long nTmp = pItem->GetValue();
852                     nTmp = Fraction( nTmp ) / maUIScale;
853                     SetFieldUnit( *mpMtrPosX, meDlgUnit, true );
854                     SetMetricValue( *mpMtrPosX, nTmp, mePoolUnit );
855                     break;
856                 }
857             }
858 
859             mpMtrPosX->SetText( String());
860             break;
861 
862         case SID_ATTR_TRANSFORM_POS_Y:
863             if(SFX_ITEM_AVAILABLE == eState)
864             {
865                 const SfxInt32Item* pItem = dynamic_cast< const SfxInt32Item* >(pState);
866 
867                 if(pItem)
868                 {
869                     long nTmp = pItem->GetValue();
870                     nTmp = Fraction( nTmp ) / maUIScale;
871                     SetFieldUnit( *mpMtrPosY, meDlgUnit, true );
872                     SetMetricValue( *mpMtrPosY, nTmp, mePoolUnit );
873                     break;
874                 }
875             }
876 
877             mpMtrPosY->SetText( String());
878             break;
879 
880         case SID_ATTR_TRANSFORM_ROT_X:
881             if (SFX_ITEM_AVAILABLE == eState)
882             {
883                 const SfxInt32Item* pItem = dynamic_cast< const SfxInt32Item* >(pState);
884 
885                 if(pItem)
886                 {
887                     mlRotX = pItem->GetValue();
888                     mlRotX = Fraction( mlRotX ) / maUIScale;
889                 }
890             }
891             break;
892 
893         case SID_ATTR_TRANSFORM_ROT_Y:
894             if (SFX_ITEM_AVAILABLE == eState)
895             {
896                 const SfxInt32Item* pItem = dynamic_cast< const SfxInt32Item* >(pState);
897 
898                 if(pItem)
899                 {
900                     mlRotY = pItem->GetValue();
901                     mlRotY = Fraction( mlRotY ) / maUIScale;
902                 }
903             }
904             break;
905 
906         case SID_ATTR_TRANSFORM_PROTECT_POS:
907             if(SFX_ITEM_AVAILABLE == eState)
908             {
909                 const SfxBoolItem* pItem = dynamic_cast< const SfxBoolItem* >(pState);
910 
911                 if(pItem)
912                 {
913                     // record the state of position protect
914                     mbPositionProtected = pItem->GetValue();
915                     break;
916                 }
917             }
918 
919             mbPositionProtected = false;
920             break;
921 
922         case SID_ATTR_TRANSFORM_PROTECT_SIZE:
923             if(SFX_ITEM_AVAILABLE == eState)
924             {
925                 const SfxBoolItem* pItem = dynamic_cast< const SfxBoolItem* >(pState);
926 
927                 if(pItem)
928                 {
929                     // record the state of size protect
930                     mbSizeProtected = pItem->GetValue();
931                     break;
932                 }
933             }
934 
935             mbSizeProtected = false;
936             break;
937 
938         case SID_ATTR_TRANSFORM_AUTOWIDTH:
939             if(SFX_ITEM_AVAILABLE == eState)
940             {
941                 const SfxBoolItem* pItem = dynamic_cast< const SfxBoolItem* >(pState);
942 
943                 if(pItem)
944                 {
945                     mbAutoWidth = pItem->GetValue();
946                 }
947             }
948             break;
949 
950         case SID_ATTR_TRANSFORM_AUTOHEIGHT:
951             if(SFX_ITEM_AVAILABLE == eState)
952             {
953                 const SfxBoolItem* pItem = dynamic_cast< const SfxBoolItem* >(pState);
954 
955                 if(pItem)
956                 {
957                     mbAutoHeight = pItem->GetValue();
958                 }
959             }
960             break;
961 
962         case SID_ATTR_TRANSFORM_ANGLE:
963             if (eState >= SFX_ITEM_AVAILABLE)
964             {
965                 const SfxInt32Item* pItem = dynamic_cast< const SfxInt32Item* >(pState);
966 
967                 if(pItem)
968                 {
969                     long nTmp = pItem->GetValue();
970 
971                     mpMtrAngle->SetValue( nTmp );
972                     mpDial->SetRotation( nTmp );
973 
974                     switch(nTmp)
975                     {
976                         case 0:
977                             mpMtrAngle->SelectEntryPos(0);
978                             break;
979                         case 4500:
980                             mpMtrAngle->SelectEntryPos(1);
981                             break;
982                         case 9000:
983                             mpMtrAngle->SelectEntryPos(2);
984                             break;
985                         case 13500:
986                             mpMtrAngle->SelectEntryPos(3);
987                             break;
988                         case 18000:
989                             mpMtrAngle->SelectEntryPos(4);
990                             break;
991                         case 22500:
992                             mpMtrAngle->SelectEntryPos(5);
993                             break;
994                         case 27000:
995                             mpMtrAngle->SelectEntryPos(6);
996                             break;
997                         case 315000:
998                             mpMtrAngle->SelectEntryPos(7);
999                             break;
1000                     }
1001 
1002                     break;
1003                 }
1004             }
1005 
1006             mpMtrAngle->SetText( String() );
1007             mpDial->SetRotation( 0 );
1008             break;
1009 
1010         case SID_ATTR_METRIC:
1011             MetricState( eState, pState );
1012             UpdateUIScale();
1013             break;
1014 
1015         default:
1016             break;
1017     }
1018 
1019     const sal_Int32 nCombinedContext(maContext.GetCombinedContext_DI());
1020     const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
1021 
1022     switch (rMarkList.GetMarkCount())
1023     {
1024         case 0:
1025             break;
1026 
1027         case 1:
1028         {
1029             const SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
1030             const SdrObjKind eKind((SdrObjKind)pObj->GetObjIdentifier());
1031 
1032             if(((nCombinedContext == CombinedEnumContext(Application_DrawImpress, Context_Draw)
1033                || nCombinedContext == CombinedEnumContext(Application_DrawImpress, Context_TextObject)
1034                  ) && OBJ_EDGE == eKind)
1035                || OBJ_CAPTION == eKind)
1036             {
1037                 mpFtAngle->Disable();
1038                 mpMtrAngle->Disable();
1039                 mpDial->Disable();
1040                 mpFlipTbx->Disable();
1041                 mpFtFlip->Disable();
1042             }
1043             break;
1044         }
1045 
1046         default:
1047         {
1048             sal_uInt16 nMarkObj = 0;
1049             bool isNoEdge = true;
1050 
1051             while(isNoEdge && rMarkList.GetMark(nMarkObj))
1052             {
1053                 const SdrObject* pObj = rMarkList.GetMark(nMarkObj)->GetMarkedSdrObj();
1054                 const SdrObjKind eKind((SdrObjKind)pObj->GetObjIdentifier());
1055 
1056                 if(((nCombinedContext == CombinedEnumContext(Application_DrawImpress, Context_Draw)
1057                   || nCombinedContext == CombinedEnumContext(Application_DrawImpress, Context_TextObject)
1058                      ) && OBJ_EDGE == eKind)
1059                   || OBJ_CAPTION == eKind)
1060                 {
1061                     isNoEdge = false;
1062                     break;
1063                 }
1064                 nMarkObj++;
1065             }
1066 
1067             if(!isNoEdge)
1068             {
1069                 mpFtAngle->Disable();
1070                 mpMtrAngle->Disable();
1071                 mpDial->Disable();
1072                 mpFlipTbx->Disable();
1073                 mpFtFlip->Disable();
1074             }
1075             break;
1076         }
1077     }
1078 
1079     if(nCombinedContext == CombinedEnumContext(Application_DrawImpress, Context_TextObject))
1080     {
1081         mpFlipTbx->Disable();
1082         mpFtFlip->Disable();
1083     }
1084 
1085     DisableControls();
1086 
1087     // mpCbxScale must synchronized with that on Position and Size tabpage on Shape Properties dialog
1088     SvtViewOptions	aPageOpt( E_TABPAGE, String::CreateFromInt32( RID_SVXPAGE_POSITION_SIZE ) );
1089     String	sUserData;
1090     ::com::sun::star::uno::Any	aUserItem = aPageOpt.GetUserItem( USERITEM_NAME );
1091     ::rtl::OUString	aTemp;
1092     if ( aUserItem >>= aTemp )
1093         sUserData = String( aTemp );
1094     mpCbxScale->Check( (bool)sUserData.ToInt32() );
1095 }
1096 
1097 
1098 
1099 
GetBindings()1100 SfxBindings* PosSizePropertyPanel::GetBindings()
1101 {
1102     return mpBindings;
1103 }
1104 
1105 
1106 
executeSize()1107 void PosSizePropertyPanel::executeSize()
1108 {
1109     if ( mpMtrWidth->IsValueModified() || mpMtrHeight->IsValueModified())
1110     {
1111         Fraction aUIScale = mpView->GetModel()->GetUIScale();
1112 
1113         // get Width
1114         double nWidth = (double)mpMtrWidth->GetValue( meDlgUnit );
1115         nWidth = MetricField::ConvertDoubleValue( nWidth, mpMtrWidth->GetBaseValue(), mpMtrWidth->GetDecimalDigits(), meDlgUnit, FUNIT_100TH_MM );
1116         long lWidth = (long)(nWidth * (double)aUIScale);
1117         lWidth = OutputDevice::LogicToLogic( lWidth, MAP_100TH_MM, (MapUnit)mePoolUnit );
1118         lWidth = (long)mpMtrWidth->Denormalize( lWidth );
1119 
1120         // get Height
1121         double nHeight = (double)mpMtrHeight->GetValue( meDlgUnit );
1122         nHeight = MetricField::ConvertDoubleValue( nHeight, mpMtrHeight->GetBaseValue(), mpMtrHeight->GetDecimalDigits(), meDlgUnit, FUNIT_100TH_MM );
1123         long lHeight = (long)(nHeight * (double)aUIScale);
1124         lHeight = OutputDevice::LogicToLogic( lHeight, MAP_100TH_MM, (MapUnit)mePoolUnit );
1125         lHeight = (long)mpMtrWidth->Denormalize( lHeight );
1126 
1127         // put Width & Height to itemset
1128         SfxUInt32Item aWidthItem( SID_ATTR_TRANSFORM_WIDTH, (sal_uInt32) lWidth);
1129         SfxUInt32Item aHeightItem( SID_ATTR_TRANSFORM_HEIGHT, (sal_uInt32) lHeight);
1130         SfxAllEnumItem aPointItem (SID_ATTR_TRANSFORM_SIZE_POINT, (sal_uInt16)meRP);
1131         const sal_Int32 nCombinedContext(maContext.GetCombinedContext_DI());
1132 
1133         if( nCombinedContext == CombinedEnumContext(Application_WriterVariants, Context_Graphic)
1134             || nCombinedContext == CombinedEnumContext(Application_WriterVariants, Context_OLE)
1135             )
1136         {
1137             GetBindings()->GetDispatcher()->Execute(SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aWidthItem, &aHeightItem, &aPointItem, 0L );
1138         }
1139         else
1140         {
1141             if ( (mpMtrWidth->IsValueModified()) && (mpMtrHeight->IsValueModified()))
1142                 GetBindings()->GetDispatcher()->Execute(SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aWidthItem, &aHeightItem, &aPointItem, 0L );
1143             else if( mpMtrWidth->IsValueModified())
1144                 GetBindings()->GetDispatcher()->Execute(SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aWidthItem, &aPointItem, 0L );
1145             else if ( mpMtrHeight->IsValueModified())
1146                 GetBindings()->GetDispatcher()->Execute(SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aHeightItem, &aPointItem, 0L );
1147         }
1148     }
1149 }
1150 
1151 
1152 
executePosX()1153 void PosSizePropertyPanel::executePosX()
1154 {
1155     if ( mpMtrPosX->IsValueModified())
1156     {
1157         long lX = GetCoreValue( *mpMtrPosX, mePoolUnit );
1158         if( mbMtrPosXMirror )
1159             lX = -lX;
1160         long lY = GetCoreValue( *mpMtrPosY, mePoolUnit );
1161 
1162         Size aPageSize;
1163         Rectangle aRect;
1164         maRect = mpView->GetAllMarkedRect();
1165         aRect = mpView->GetAllMarkedRect();
1166 
1167         Fraction aUIScale = mpView->GetModel()->GetUIScale();
1168         lX += maAnchorPos.X();
1169         lX = Fraction( lX ) * aUIScale;
1170         lY += maAnchorPos.Y();
1171         lY = Fraction( lY ) * aUIScale;
1172 
1173         SfxInt32Item aPosXItem( SID_ATTR_TRANSFORM_POS_X,(sal_uInt32) lX);
1174         SfxInt32Item aPosYItem( SID_ATTR_TRANSFORM_POS_Y,(sal_uInt32) lY);
1175 
1176         GetBindings()->GetDispatcher()->Execute(
1177             SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aPosXItem, 0L );
1178     }
1179 }
1180 
1181 
1182 
executePosY()1183 void PosSizePropertyPanel::executePosY()
1184 {
1185     if ( mpMtrPosY->IsValueModified() )
1186     {
1187         long lX = GetCoreValue( *mpMtrPosX, mePoolUnit );
1188         long lY = GetCoreValue( *mpMtrPosY, mePoolUnit );
1189 
1190         Size aPageSize;
1191         Rectangle aRect;
1192         maRect = mpView->GetAllMarkedRect();
1193         aRect = mpView->GetAllMarkedRect();
1194 
1195         Fraction aUIScale = mpView->GetModel()->GetUIScale();
1196         lX += maAnchorPos.X();
1197         lX = Fraction( lX ) * aUIScale;
1198         lY += maAnchorPos.Y();
1199         lY = Fraction( lY ) * aUIScale;
1200 
1201         SfxInt32Item aPosXItem( SID_ATTR_TRANSFORM_POS_X,(sal_uInt32) lX);
1202         SfxInt32Item aPosYItem( SID_ATTR_TRANSFORM_POS_Y,(sal_uInt32) lY);
1203 
1204         GetBindings()->GetDispatcher()->Execute(
1205             SID_ATTR_TRANSFORM, SFX_CALLMODE_RECORD, &aPosYItem, 0L );
1206     }
1207 }
1208 
1209 
1210 
MetricState(SfxItemState eState,const SfxPoolItem * pState)1211 void PosSizePropertyPanel::MetricState( SfxItemState eState, const SfxPoolItem* pState )
1212 {
1213     bool bPosXBlank = false;
1214     bool bPosYBlank = false;
1215     bool bWidthBlank = false;
1216     bool bHeightBlank = false;
1217     String sNull = String::CreateFromAscii("");
1218 
1219     // #124409# use the given Item to get the correct UI unit and initialize it
1220     // and the Fields using it
1221     meDlgUnit = GetCurrentUnit(eState,pState);
1222 
1223     if( mpMtrPosX->GetText() == sNull )
1224         bPosXBlank = true;
1225     SetFieldUnit( *mpMtrPosX, meDlgUnit, true );
1226     if(bPosXBlank)
1227         mpMtrPosX->SetText(String());
1228 
1229     if( mpMtrPosY->GetText() == sNull )
1230         bPosYBlank = true;
1231     SetFieldUnit( *mpMtrPosY, meDlgUnit, true );
1232     if(bPosYBlank)
1233         mpMtrPosY->SetText(String());
1234 
1235     if( mpMtrWidth->GetText() == sNull )
1236         bWidthBlank = true;
1237     SetFieldUnit( *mpMtrWidth, meDlgUnit, true );
1238     if(bWidthBlank)
1239         mpMtrWidth->SetText(String());
1240 
1241     if( mpMtrHeight->GetText() == sNull )
1242         bHeightBlank = true;
1243     SetFieldUnit( *mpMtrHeight, meDlgUnit, true );
1244     if(bHeightBlank)
1245         mpMtrHeight->SetText(String());
1246 }
1247 
1248 
1249 
GetCurrentUnit(SfxItemState eState,const SfxPoolItem * pState)1250 FieldUnit PosSizePropertyPanel::GetCurrentUnit( SfxItemState eState, const SfxPoolItem* pState )
1251 {
1252     FieldUnit eUnit = FUNIT_NONE;
1253 
1254     if ( pState && eState >= SFX_ITEM_DEFAULT )
1255     {
1256         eUnit = (FieldUnit)( (const SfxUInt16Item*)pState )->GetValue();
1257     }
1258     else
1259     {
1260         SfxViewFrame* pFrame = SfxViewFrame::Current();
1261         SfxObjectShell* pSh = NULL;
1262         if ( pFrame )
1263             pSh = pFrame->GetObjectShell();
1264         if ( pSh )
1265         {
1266             SfxModule* pModule = pSh->GetModule();
1267             if ( pModule )
1268             {
1269                 const SfxPoolItem* pItem = pModule->GetItem( SID_ATTR_METRIC );
1270                 if ( pItem )
1271                     eUnit = (FieldUnit)( (SfxUInt16Item*)pItem )->GetValue();
1272             }
1273             else
1274             {
1275                 DBG_ERRORFILE( "GetModuleFieldUnit(): no module found" );
1276             }
1277         }
1278     }
1279 
1280     return eUnit;
1281 }
1282 
1283 
1284 
DisableControls()1285 void PosSizePropertyPanel::DisableControls()
1286 {
1287     if( mbPositionProtected )
1288     {
1289         // the position is protected("Position protect" option in modal dialog is checked),
1290         // disable all the Position controls in sidebar
1291         mpFtPosX->Disable();
1292         mpMtrPosX->Disable();
1293         mpFtPosY->Disable();
1294         mpMtrPosY->Disable();
1295         mpFtAngle->Disable();
1296         mpMtrAngle->Disable();
1297         mpDial->Disable();
1298         mpFtFlip->Disable();
1299         mpFlipTbx->Disable();
1300 
1301         mpFtWidth->Disable();
1302         mpMtrWidth->Disable();
1303         mpFtHeight->Disable();
1304         mpMtrHeight->Disable();
1305         mpCbxScale->Disable();
1306     }
1307     else
1308     {
1309         mpFtPosX->Enable();
1310         mpMtrPosX->Enable();
1311         mpFtPosY->Enable();
1312         mpMtrPosY->Enable();
1313 
1314         //mpFtAngle->Enable();
1315         //mpMtrAngle->Enable();
1316         //mpDial->Enable();
1317         //mpFtFlip->Enable();
1318         //mpFlipTbx->Enable();
1319 
1320         if( mbSizeProtected )
1321         {
1322             mpFtWidth->Disable();
1323             mpMtrWidth->Disable();
1324             mpFtHeight->Disable();
1325             mpMtrHeight->Disable();
1326             mpCbxScale->Disable();
1327         }
1328         else
1329         {
1330             if(	mbAdjustEnabled )
1331             {
1332                 if( mbAutoWidth )
1333                 {
1334                     mpFtWidth->Disable();
1335                     mpMtrWidth->Disable();
1336                     mpCbxScale->Disable();
1337                 }
1338                 else
1339                 {
1340                     mpFtWidth->Enable();
1341                     mpMtrWidth->Enable();
1342                 }
1343                 if( mbAutoHeight )
1344                 {
1345                     mpFtHeight->Disable();
1346                     mpMtrHeight->Disable();
1347                     mpCbxScale->Disable();
1348                 }
1349                 else
1350                 {
1351                     mpFtHeight->Enable();
1352                     mpMtrHeight->Enable();
1353                 }
1354                 if( !mbAutoWidth && !mbAutoHeight )
1355                     mpCbxScale->Enable();
1356             }
1357             else
1358             {
1359                 mpFtWidth->Enable();
1360                 mpMtrWidth->Enable();
1361                 mpFtHeight->Enable();
1362                 mpMtrHeight->Enable();
1363                 mpCbxScale->Enable();
1364             }
1365         }
1366     }
1367 }
1368 
1369 
1370 
1371 
UpdateUIScale(void)1372 void PosSizePropertyPanel::UpdateUIScale (void)
1373 {
1374     const Fraction aUIScale (mpView->GetModel()->GetUIScale());
1375     if (maUIScale != aUIScale)
1376     {
1377         // UI scale has changed.
1378 
1379         // Remember the new UI scale.
1380         maUIScale = aUIScale;
1381 
1382         // The content of the position and size boxes is only updated when item changes are notified.
1383         // Request such notifications without changing the actual item values.
1384         GetBindings()->Invalidate(SID_ATTR_TRANSFORM_POS_X, sal_True, sal_False);
1385         GetBindings()->Invalidate(SID_ATTR_TRANSFORM_POS_Y, sal_True, sal_False);
1386         GetBindings()->Invalidate(SID_ATTR_TRANSFORM_WIDTH, sal_True, sal_False);
1387         GetBindings()->Invalidate(SID_ATTR_TRANSFORM_HEIGHT, sal_True, sal_False);
1388     }
1389 }
1390 
1391 
1392 } } // end of namespace svx::sidebar
1393 
1394 // eof
1395