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