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