summaryrefslogtreecommitdiff
path: root/svx/source/svdraw
diff options
context:
space:
mode:
authorPranam Lashkari <lpranam@collabora.com>2024-02-28 04:55:46 +0530
committerCaolán McNamara <caolan.mcnamara@collabora.com>2024-03-01 21:39:07 +0100
commit948cd8b9f62e28883b691084a9bb83177422defd (patch)
treeea7f4041a17c190bb6a4f7a9410220a10894fe05 /svx/source/svdraw
parentde5816806589c6e6d1da11f50f9ceeb6f50dc3ef (diff)
LOK: send inner text boundry information of shapes/textbox
Sends inner rectangle boundry info as part of LOK_CALLBACK_GRAPHIC_SELECTION message Change-Id: Idc51e807bec01711c8a4326e3193127f0b2cd765 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164124 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Diffstat (limited to 'svx/source/svdraw')
-rw-r--r--svx/source/svdraw/svdmrkv.cxx52
1 files changed, 51 insertions, 1 deletions
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx
index b0784449f159..b9a492aa35ad 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -40,6 +40,7 @@
#include <svx/scene3d.hxx>
#include <svx/svdovirt.hxx>
#include <sdr/overlay/overlayrollingrectangle.hxx>
+#include <svx/sdr/contact/displayinfo.hxx>
#include <svx/sdr/contact/objectcontact.hxx>
#include <svx/sdr/overlay/overlaymanager.hxx>
#include <svx/sdr/overlay/overlayselection.hxx>
@@ -60,6 +61,8 @@
#include <sfx2/viewsh.hxx>
#include <svtools/optionsdrawinglayer.hxx>
+#include <drawinglayer/processor2d/textextractor2d.hxx>
+
#include <array>
#include <com/sun/star/frame/XController.hpp>
@@ -759,6 +762,30 @@ bool SdrMarkView::dumpGluePointsToJSON(boost::property_tree::ptree& rTree)
return result;
}
+namespace
+{
+ class TextBoundsExtractor final : public drawinglayer::processor2d::TextExtractor2D
+ {
+ private:
+ basegfx::B2DRange maTextRange;
+ void processTextPrimitive2D(const drawinglayer::primitive2d::BasePrimitive2D& rCandidate) override
+ {
+ maTextRange.expand(rCandidate.getB2DRange(getViewInformation2D()));
+ }
+ public:
+ explicit TextBoundsExtractor(const drawinglayer::geometry::ViewInformation2D& rViewInformation)
+ : drawinglayer::processor2d::TextExtractor2D(rViewInformation)
+ {
+ }
+
+ basegfx::B2DRange getTextBounds(const sdr::contact::ViewObjectContact &rVOC, sdr::contact::DisplayInfo &raDisplayInfo)
+ {
+ this->process(rVOC.getPrimitive2DSequence(raDisplayInfo));
+ return maTextRange;
+ }
+ };
+}
+
void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, const SfxViewShell* pOtherShell)
{
SfxViewShell* pViewShell = GetSfxViewShell();
@@ -837,6 +864,8 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, const S
bConnectorSelection = dumpGluePointsToJSON(aGluePointsTree);
}
+ SdrPageView* pPageView = GetSdrPageView();
+
if (GetMarkedObjectCount())
{
SdrMark* pM = GetSdrMarkByIndex(0);
@@ -853,6 +882,27 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, const S
+ "\",\"type\":"
+ OString::number(static_cast<sal_Int32>(pO->GetObjIdentifier())));
+ if (mpMarkedObj && !pOtherShell)
+ {
+ const sdr::contact::ViewObjectContact& rVOC = mpMarkedObj->GetViewContact().GetViewObjectContact(
+ pPageView->GetPageWindow(0)->GetObjectContact());
+
+ sdr::contact::DisplayInfo aDisplayInfo;
+ TextBoundsExtractor aTextBoundsExtractor(rVOC.GetObjectContact().getViewInformation2D());
+ basegfx::B2DRange aRange = aTextBoundsExtractor.getTextBounds(rVOC, aDisplayInfo);
+ if (!aRange.isEmpty()) {
+ tools::Rectangle rect(aRange.getMinX(), aRange.getMinY(), aRange.getMaxX(), aRange.getMaxY());
+ tools::Rectangle aRangeTWIP = o3tl::convert(rect, o3tl::Length::mm100, o3tl::Length::twip);
+ OString innerTextInfo = ",\"innerTextRect\":[" +
+ OString::number(aRangeTWIP.getX()) + "," +
+ OString::number(aRangeTWIP.getY()) + "," +
+ OString::number(aRangeTWIP.GetWidth()) + "," +
+ OString::number(aRangeTWIP.GetHeight()) + "]";
+
+ aExtraInfo.append(innerTextInfo);
+ }
+ }
+
// In core, the gridOffset is calculated based on the LogicRect's TopLeft coordinate
// In online, we have the SnapRect and we calculate it based on its TopLeft coordinate
// SnapRect's TopLeft and LogicRect's TopLeft match unless there is rotation
@@ -862,7 +912,7 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, const S
// whether the shape is rotated or not, we will always have the correct gridOffset
// Note that the gridOffset is calculated from the first selected obj
basegfx::B2DVector aGridOffset(0.0, 0.0);
- if(getPossibleGridOffsetForSdrObject(aGridOffset, GetMarkedObjectByIndex(0), GetSdrPageView()))
+ if(getPossibleGridOffsetForSdrObject(aGridOffset, GetMarkedObjectByIndex(0), pPageView))
{
Point p(aGridOffset.getX(), aGridOffset.getY());
if (convertMapMode)