summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorMarco Cecchetti <mrcekets@gmail.com>2018-11-29 22:37:45 +0100
committerJan Holesovsky <kendy@collabora.com>2018-12-10 13:01:55 +0100
commit7dc11857e2547c9d6a9603259a648c7c7a6ed2d8 (patch)
tree69edffe9a958a605387639994430d2d0322093c0 /svx
parent693f6481d961357426e2ca4337d4a73ed8dfaa20 (diff)
lok: shape scaling rework
Now shape scaling is handled through the transform dialog instead of simulating a drag and drop event in core. For Impress the unit used for length is '100th mm' instead of twips, so we need to transform positions and size from twips to '100th mm'. Anyway since we don't know in SetGeoAttrToMarked if the new data is due to a mouse event or by entering a new value in the transormation dialog or in the side pane, for Impress we need to convert the new values sent by the dialogs from '100th mm' to twips which are converted back in SetGeoAttrToMarked. For performing a uniform scaling when the shape/image is rotated we need to inform the client about the rotation angle for the selected graphic object that has been achieved but appending an angle argument to the graphic selection callback. Now it is also possible to reverse shapes/images through negative scaling. Change-Id: I8a32f3e4b28f36e884a59c59b7e1351e85ef4489 Reviewed-on: https://gerrit.libreoffice.org/64696 Tested-by: Jenkins Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Diffstat (limited to 'svx')
-rw-r--r--svx/sdi/svx.sdi2
-rw-r--r--svx/source/sidebar/possize/PosSizePropertyPanel.cxx73
-rw-r--r--svx/source/svdraw/svdedtv1.cxx58
-rw-r--r--svx/source/svdraw/svdmrkv.cxx11
4 files changed, 118 insertions, 26 deletions
diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi
index f303263c5879..57208ebce7bf 100644
--- a/svx/sdi/svx.sdi
+++ b/svx/sdi/svx.sdi
@@ -8523,7 +8523,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 89e3584bba40..4985f370dfe3 100644
--- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
+++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx
@@ -37,14 +37,35 @@
#include <svl/aeitem.hxx>
#include <svx/svdview.hxx>
#include <svx/transfrmhelper.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,7 +394,12 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, ChangePosXHdl, Edit&, void )
lX += maAnchorPos.X();
lX = long( lX * aUIScale );
- SfxInt32Item aPosXItem( SID_ATTR_TRANSFORM_POS_X,(sal_uInt32) lX);
+ 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(
SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aPosXItem });
@@ -391,7 +417,12 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, ChangePosYHdl, Edit&, void )
lY += maAnchorPos.Y();
lY = long( lY * aUIScale );
- SfxInt32Item aPosYItem( SID_ATTR_TRANSFORM_POS_Y,(sal_uInt32) lY);
+ 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(
SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aPosYItem });
@@ -448,9 +479,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);
- SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,(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));
+ 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, nRotateX);
+ SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, nRotateY);
GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_TRANSFORM,
SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem });
@@ -463,9 +503,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);
- SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,(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));
+ 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, nRotateX);
+ SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, nRotateY);
GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_TRANSFORM,
SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem });
@@ -832,6 +881,12 @@ void PosSizePropertyPanel::executeSize()
lHeight = OutputDevice::LogicToLogic( lHeight, MapUnit::Map100thMM, mePoolUnit );
lHeight = (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, (sal_uInt32) lWidth);
SfxUInt32Item aHeightItem( SID_ATTR_TRANSFORM_HEIGHT, (sal_uInt32) lHeight);
diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx
index 0a178389acc9..1dda837a5d1f 100644
--- a/svx/source/svdraw/svdedtv1.cxx
+++ b/svx/source/svdraw/svdedtv1.cxx
@@ -1438,6 +1438,20 @@ 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())
@@ -1452,8 +1466,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;
@@ -1495,26 +1515,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=(RectPoint)static_cast<const SfxAllEnumItem&>(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 = (RectPoint)static_cast<const SfxAllEnumItem&>(rAttr.Get(SID_ATTR_TRANSFORM_SIZE_POINT)).GetValue();
}
// rotation
@@ -1586,6 +1609,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(ImpGetResStr(STR_EditTransform),GetDescriptionOfMarkedObjects());
@@ -1614,15 +1649,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 91db7024faa8..442466d37295 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -806,6 +806,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)
{
// An other shell wants to know about our existing