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