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