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