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