diff options
-rw-r--r-- | cui/source/tabpages/transfrm.cxx | 48 | ||||
-rw-r--r-- | include/LibreOfficeKit/LibreOfficeKitEnums.h | 6 | ||||
-rw-r--r-- | svx/sdi/svx.sdi | 2 | ||||
-rw-r--r-- | svx/source/sidebar/possize/PosSizePropertyPanel.cxx | 66 | ||||
-rw-r--r-- | svx/source/svdraw/svdedtv1.cxx | 58 | ||||
-rw-r--r-- | svx/source/svdraw/svdmrkv.cxx | 11 |
6 files changed, 164 insertions, 27 deletions
diff --git a/cui/source/tabpages/transfrm.cxx b/cui/source/tabpages/transfrm.cxx index 2b56a7a76ad0..1918f676a15d 100644 --- a/cui/source/tabpages/transfrm.cxx +++ b/cui/source/tabpages/transfrm.cxx @@ -41,6 +41,7 @@ #include <svl/rectitem.hxx> #include <svl/aeitem.hxx> #include <swpossizetabpage.hxx> +#include <comphelper/lok.hxx> // static ---------------------------------------------------------------- @@ -83,6 +84,28 @@ const sal_uInt16 SvxSlantTabPage::pSlantRanges[] = 0 }; +namespace { + +bool lcl_twipsNeeded(const SdrView* pView) +{ + const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); + if (bTiledRendering) + { + // We gets the position in twips + if (OutputDevice* pOutputDevice = pView->GetFirstOutputDevice()) + { + if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + return true; + } + } + } + return false; +} + +} // anonymouus ns + + /************************************************************************* |* |* constructor of the tab dialog: adds the pages to the dialog @@ -252,9 +275,18 @@ bool SvxAngleTabPage::FillItemSet(SfxItemSet* rSet) const double fTmpX((GetCoreValue(*m_xMtrPosX, ePoolUnit) + maAnchor.getX()) * fUIScale); const double fTmpY((GetCoreValue(*m_xMtrPosY, ePoolUnit) + maAnchor.getY()) * fUIScale); + long nRotateX = basegfx::fround(fTmpX); + long nRotateY = basegfx::fround(fTmpY); + + if (lcl_twipsNeeded(pView)) + { + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::Map100thMM, MapUnit::MapTwip); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + rSet->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_ANGLE), m_aCtlAngle.GetRotation())); - rSet->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_ROT_X), basegfx::fround(fTmpX))); - rSet->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_ROT_Y), basegfx::fround(fTmpY))); + rSet->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_ROT_X), nRotateX)); + rSet->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_ROT_Y), nRotateY)); bModified = true; } @@ -938,6 +970,12 @@ bool SvxPositionSizeTabPage::FillItemSet( SfxItemSet* rOutAttrs ) // #101581# GetTopLeftPosition(...) needs coordinates after UI scaling, in real PagePositions GetTopLeftPosition(fX, fY, maRange); + if (lcl_twipsNeeded(mpView)) + { + fX = OutputDevice::LogicToLogic(fX, MapUnit::Map100thMM, MapUnit::MapTwip); + fY = OutputDevice::LogicToLogic(fY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + rOutAttrs->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_POS_X), basegfx::fround(fX))); rOutAttrs->Put(SfxInt32Item(GetWhich(SID_ATTR_TRANSFORM_POS_Y), basegfx::fround(fY))); @@ -977,6 +1015,12 @@ bool SvxPositionSizeTabPage::FillItemSet( SfxItemSet* rOutAttrs ) lHeight = OutputDevice::LogicToLogic( lHeight, MapUnit::Map100thMM, mePoolUnit ); lHeight = static_cast<long>(m_xMtrHeight->denormalize( lHeight )); + if (lcl_twipsNeeded(mpView)) + { + lWidth = OutputDevice::LogicToLogic(lWidth, MapUnit::Map100thMM, MapUnit::MapTwip); + lHeight = OutputDevice::LogicToLogic(lHeight, MapUnit::Map100thMM, MapUnit::MapTwip); + } + // put Width & Height to itemset rOutAttrs->Put( SfxUInt32Item( GetWhich( SID_ATTR_TRANSFORM_WIDTH ), static_cast<sal_uInt32>(lWidth) ) ); rOutAttrs->Put( SfxUInt32Item( GetWhich( SID_ATTR_TRANSFORM_HEIGHT ), static_cast<sal_uInt32>(lHeight) ) ); diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h b/include/LibreOfficeKit/LibreOfficeKitEnums.h index cb9091711acc..1d55ce8583b3 100644 --- a/include/LibreOfficeKit/LibreOfficeKitEnums.h +++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h @@ -161,9 +161,11 @@ typedef enum */ LOK_CALLBACK_CURSOR_VISIBLE = 5, /** - * The size and/or the position of the graphic selection changed. + * The size and/or the position of the graphic selection changed and + * the rotation angle of the embedded graphic object * - * Rectangle format is the same as LOK_CALLBACK_INVALIDATE_TILES. + * Format is "x, y, width, height, angle", where angle is in 100th + * of degree. */ LOK_CALLBACK_GRAPHIC_SELECTION = 6, diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi index 694b9d01d172..d3aa1537be8f 100644 --- a/svx/sdi/svx.sdi +++ b/svx/sdi/svx.sdi @@ -8504,7 +8504,7 @@ SvxULSpaceItem TopBottomMargin SID_ATTR_ULSPACE SfxVoidItem TransformDialog SID_ATTR_TRANSFORM -(SfxUInt32Item TransformRotationDeltaAngle SID_ATTR_TRANSFORM_DELTA_ANGLE,SfxUInt32Item TransformRotationAngle SID_ATTR_TRANSFORM_ANGLE,SfxUInt32Item TransformRotationX SID_ATTR_TRANSFORM_ROT_X,SfxUInt32Item TransformRotationY SID_ATTR_TRANSFORM_ROT_Y) +(SfxUInt32Item TransformPosX SID_ATTR_TRANSFORM_POS_X,SfxUInt32Item TransformPosY SID_ATTR_TRANSFORM_POS_Y,SfxUInt32Item TransformWidth SID_ATTR_TRANSFORM_WIDTH, SfxUInt32Item TransformHeight SID_ATTR_TRANSFORM_HEIGHT,SfxUInt32Item TransformRotationDeltaAngle SID_ATTR_TRANSFORM_DELTA_ANGLE,SfxUInt32Item TransformRotationAngle SID_ATTR_TRANSFORM_ANGLE,SfxUInt32Item TransformRotationX SID_ATTR_TRANSFORM_ROT_X,SfxUInt32Item TransformRotationY SID_ATTR_TRANSFORM_ROT_Y) [ AutoUpdate = FALSE, FastCall = TRUE, diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx index 1afdf1e725b9..e210f75cfdd9 100644 --- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx +++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx @@ -38,15 +38,35 @@ #include <svl/aeitem.hxx> #include <svx/svdview.hxx> #include <svx/transfrmhelper.hxx> -#include <sal/log.hxx> +#include <comphelper/lok.hxx> using namespace css; using namespace css::uno; const char USERITEM_NAME[] = "FitItem"; -namespace svx { namespace sidebar { +namespace { +bool lcl_twipsNeeded(const SdrView* pView) +{ + const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); + if (bTiledRendering) + { + // We gets the position in twips + if (OutputDevice* pOutputDevice = pView->GetFirstOutputDevice()) + { + if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + return true; + } + } + } + return false; +} + +} // anonymouus ns + +namespace svx { namespace sidebar { PosSizePropertyPanel::PosSizePropertyPanel( vcl::Window* pParent, @@ -373,6 +393,11 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, ChangePosXHdl, Edit&, void ) Fraction aUIScale = mpView->GetModel()->GetUIScale(); lX = long( lX * aUIScale ); + if (lcl_twipsNeeded(mpView)) + { + lX = OutputDevice::LogicToLogic(lX, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aPosXItem( SID_ATTR_TRANSFORM_POS_X,static_cast<sal_uInt32>(lX)); GetBindings()->GetDispatcher()->ExecuteList( @@ -390,6 +415,11 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, ChangePosYHdl, Edit&, void ) Fraction aUIScale = mpView->GetModel()->GetUIScale(); lY = long( lY * aUIScale ); + if (lcl_twipsNeeded(mpView)) + { + lY = OutputDevice::LogicToLogic(lY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aPosYItem( SID_ATTR_TRANSFORM_POS_Y,static_cast<sal_uInt32>(lY)); GetBindings()->GetDispatcher()->ExecuteList( @@ -447,9 +477,18 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, AngleModifiedHdl, Edit&, void ) // #i123993# Need to take UIScale into account when executing rotations const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0); + long nRotateX = basegfx::fround(mlRotX * fUIScale); + long nRotateY = basegfx::fround(mlRotY * fUIScale); + + if (lcl_twipsNeeded(mpView)) + { + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::Map100thMM, MapUnit::MapTwip); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,static_cast<sal_uInt32>(nTmp)); - SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale)); - SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale)); + SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, nRotateX); + SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, nRotateY); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem }); @@ -462,9 +501,18 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, RotationHdl, DialControl*, void ) // #i123993# Need to take UIScale into account when executing rotations const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0); + long nRotateX = basegfx::fround(mlRotX * fUIScale); + long nRotateY = basegfx::fround(mlRotY * fUIScale); + + if (lcl_twipsNeeded(mpView)) + { + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::Map100thMM, MapUnit::MapTwip); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,static_cast<sal_uInt32>(nTmp)); - SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale)); - SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale)); + SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, nRotateX); + SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, nRotateY); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem }); @@ -831,6 +879,12 @@ void PosSizePropertyPanel::executeSize() lHeight = OutputDevice::LogicToLogic( lHeight, MapUnit::Map100thMM, mePoolUnit ); lHeight = static_cast<long>(mpMtrWidth->Denormalize( lHeight )); + if (lcl_twipsNeeded(mpView)) + { + lWidth = OutputDevice::LogicToLogic(lWidth, MapUnit::Map100thMM, MapUnit::MapTwip); + lHeight = OutputDevice::LogicToLogic(lHeight, MapUnit::Map100thMM, MapUnit::MapTwip); + } + // put Width & Height to itemset SfxUInt32Item aWidthItem( SID_ATTR_TRANSFORM_WIDTH, static_cast<sal_uInt32>(lWidth)); SfxUInt32Item aHeightItem( SID_ATTR_TRANSFORM_HEIGHT, static_cast<sal_uInt32>(lHeight)); diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx index 784cbc462215..b0a53732e973 100644 --- a/svx/source/svdraw/svdedtv1.cxx +++ b/svx/source/svdraw/svdedtv1.cxx @@ -1425,6 +1425,20 @@ static Point ImpGetPoint(const tools::Rectangle& rRect, RectPoint eRP) void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) { + bool bDealingWithTwips = false; + const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); + if (bTiledRendering) + { + // We gets the position in twips + if (OutputDevice* pOutputDevice = mpMarkedPV->GetView().GetFirstOutputDevice()) + { + if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + bDealingWithTwips = true; + } + } + } + tools::Rectangle aRect(GetMarkedObjRect()); if(GetSdrPageView()) @@ -1439,8 +1453,14 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) SdrObject* pObj=nullptr; RectPoint eSizePoint=RectPoint::MM; - long nPosDX=0; - long nPosDY=0; + long nPosX=aRect.Left(); + long nPosY=aRect.Top(); + if (bDealingWithTwips) + { + nPosX = OutputDevice::LogicToLogic(nPosX, MapUnit::Map100thMM, MapUnit::MapTwip); + nPosY = OutputDevice::LogicToLogic(nPosY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + long nSizX=0; long nSizY=0; long nRotateAngle=0; @@ -1482,26 +1502,29 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) // position if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_POS_X,true,&pPoolItem)) { - nPosDX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue()-aRect.Left(); + nPosX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgPos=true; } if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_POS_Y,true,&pPoolItem)){ - nPosDY=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue()-aRect.Top(); + nPosY=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgPos=true; } // size if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_WIDTH,true,&pPoolItem)) { - nSizX=static_cast<const SfxUInt32Item*>(pPoolItem)->GetValue(); + nSizX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgSiz=true; bChgWdh=true; } if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_HEIGHT,true,&pPoolItem)) { - nSizY=static_cast<const SfxUInt32Item*>(pPoolItem)->GetValue(); + nSizY=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgSiz=true; bChgHgt=true; } if (bChgSiz) { - eSizePoint=static_cast<RectPoint>(rAttr.Get(SID_ATTR_TRANSFORM_SIZE_POINT).GetValue()); + if (bTiledRendering && SfxItemState::SET != rAttr.GetItemState(SID_ATTR_TRANSFORM_SIZE_POINT, true, &pPoolItem)) + eSizePoint = RectPoint::LT; + else + eSizePoint = static_cast<RectPoint>(rAttr.Get(SID_ATTR_TRANSFORM_SIZE_POINT).GetValue()); } // rotation @@ -1573,6 +1596,18 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) bSetAttr=true; } + if(bDealingWithTwips) { + nPosX = OutputDevice::LogicToLogic(nPosX, MapUnit::MapTwip, MapUnit::Map100thMM); + nPosY = OutputDevice::LogicToLogic(nPosY, MapUnit::MapTwip, MapUnit::Map100thMM); + nSizX = OutputDevice::LogicToLogic(nSizX, MapUnit::MapTwip, MapUnit::Map100thMM); + nSizY = OutputDevice::LogicToLogic(nSizY, MapUnit::MapTwip, MapUnit::Map100thMM); + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::MapTwip, MapUnit::Map100thMM); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::MapTwip, MapUnit::Map100thMM); + } + + long nPosDX = nPosX - aRect.Left(); + long nPosDY = nPosY - aRect.Top(); + ForcePossibilities(); BegUndo(SvxResId(STR_EditTransform),GetDescriptionOfMarkedObjects()); @@ -1601,15 +1636,6 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) if(GetSdrPageView()) { - const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); - if(bTiledRendering) { - // We gets the position in twips - if (OutputDevice* pOutputDevice = mpMarkedPV->GetView().GetFirstOutputDevice()) - { - if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) - aRef = OutputDevice::LogicToLogic(aRef, MapMode(MapUnit::MapTwip), MapMode(MapUnit::Map100thMM)); - } - } GetSdrPageView()->PagePosToLogic(aRef); } diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 8c4be9154284..42926e718100 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -782,6 +782,17 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell) } if(SfxViewShell* pViewShell = GetSfxViewShell()) { + + long nRotAngle(0); + if(GetMarkedObjectCount()) + { + SdrMark* pM = GetSdrMarkByIndex(0); + SdrObject* pO = pM->GetMarkedSdrObj(); + + nRotAngle = pO->GetRotateAngle(); + sSelection += OString(", ") + OString::number(nRotAngle); + } + if (pOtherShell) { // Another shell wants to know about our existing |