LCOV - code coverage report
Current view: top level - svx/source/sidebar/possize - PosSizePropertyPanel.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 301 621 48.5 %
Date: 2015-06-13 12:38:46 Functions: 14 37 37.8 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11