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_WriterAndWeb, Context_Draw):
309             nLayoutMode = 0;
310             break;
311 
312         case CombinedEnumContext(Application_WriterAndWeb, Context_Graphic):
313         case CombinedEnumContext(Application_WriterAndWeb, Context_Media):
314         case CombinedEnumContext(Application_WriterAndWeb, Context_Frame):
315         case CombinedEnumContext(Application_WriterAndWeb, Context_OLE):
316         case CombinedEnumContext(Application_WriterAndWeb, 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