summaryrefslogtreecommitdiffstats
path: root/include/svx/svdopath.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/svx/svdopath.hxx')
-rw-r--r--include/svx/svdopath.hxx175
1 files changed, 175 insertions, 0 deletions
diff --git a/include/svx/svdopath.hxx b/include/svx/svdopath.hxx
new file mode 100644
index 000000000..dd854468b
--- /dev/null
+++ b/include/svx/svdopath.hxx
@@ -0,0 +1,175 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <svx/svdotext.hxx>
+#include <svx/svxdllapi.h>
+#include <memory>
+
+class ImpPathForDragAndCreate;
+
+// Helper class SdrPathObjGeoData
+// used for undo/redo
+
+class SdrPathObjGeoData final : public SdrTextObjGeoData
+{
+public:
+ basegfx::B2DPolyPolygon maPathPolygon;
+ SdrObjKind meKind;
+
+ SdrPathObjGeoData();
+ virtual ~SdrPathObjGeoData() override;
+};
+
+
+class SVXCORE_DLLPUBLIC SdrPathObj final : public SdrTextObj
+{
+private:
+ friend class ImpPathForDragAndCreate;
+
+ virtual std::unique_ptr<sdr::contact::ViewContact> CreateObjectSpecificViewContact() override;
+
+ basegfx::B2DPolyPolygon maPathPolygon;
+ SdrObjKind meKind;
+ bool mbHandleScale = false;
+
+ // for isolation of old Drag/Create code
+ std::unique_ptr<ImpPathForDragAndCreate> mpDAC;
+
+ // helper functions for GET, SET, INS etc. PNT
+ void ImpSetClosed(bool bClose);
+ void ImpForceKind();
+ void ImpForceLineAngle();
+ ImpPathForDragAndCreate& impGetDAC() const;
+
+private:
+ // protected destructor - due to final, make private
+ virtual ~SdrPathObj() override;
+
+public:
+ SdrPathObj(
+ SdrModel& rSdrModel,
+ SdrObjKind eNewKind);
+ // Copy constructor
+ SdrPathObj(SdrModel& rSdrModel, SdrPathObj const & rSource);
+ SdrPathObj(
+ SdrModel& rSdrModel,
+ SdrObjKind eNewKind,
+ const basegfx::B2DPolyPolygon& rPathPoly);
+
+ virtual void TakeObjInfo(SdrObjTransformInfoRec& rInfo) const override;
+ virtual SdrObjKind GetObjIdentifier() const override;
+ virtual void TakeUnrotatedSnapRect(tools::Rectangle& rRect) const override;
+ virtual SdrPathObj* CloneSdrObject(SdrModel& rTargetModel) const override;
+
+ virtual OUString TakeObjNameSingul() const override;
+ virtual OUString TakeObjNamePlural() const override;
+ virtual basegfx::B2DPolyPolygon TakeXorPoly() const override;
+ virtual void RecalcSnapRect() override;
+ virtual void NbcSetSnapRect(const tools::Rectangle& rRect) override;
+ virtual sal_uInt32 GetHdlCount() const override;
+ virtual void AddToHdlList(SdrHdlList& rHdlList) const override;
+ virtual void AddToPlusHdlList(SdrHdlList& rHdlList, SdrHdl& rHdl) const override;
+ virtual const tools::Rectangle& GetLogicRect() const override;
+
+ // special drag methods
+ virtual bool hasSpecialDrag() const override;
+ virtual bool beginSpecialDrag(SdrDragStat& rDrag) const override;
+ virtual bool applySpecialDrag(SdrDragStat& rDrag) override;
+ virtual OUString getSpecialDragComment(const SdrDragStat& rDrag) const override;
+ virtual basegfx::B2DPolyPolygon getSpecialDragPoly(const SdrDragStat& rDrag) const override;
+
+ virtual bool BegCreate(SdrDragStat& rStat) override;
+ virtual bool MovCreate(SdrDragStat& rStat) override;
+ virtual bool EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd) override;
+ virtual bool BckCreate(SdrDragStat& rStat) override;
+ virtual void BrkCreate(SdrDragStat& rStat) override;
+ virtual basegfx::B2DPolyPolygon TakeCreatePoly(const SdrDragStat& rDrag) const override;
+ PointerStyle GetCreatePointer() const override;
+
+ // during drag or create, allow accessing the so-far created/modified polyPolygon
+ basegfx::B2DPolyPolygon getObjectPolyPolygon(const SdrDragStat& rDrag) const;
+ basegfx::B2DPolyPolygon getDragPolyPolygon(const SdrDragStat& rDrag) const;
+
+ virtual void NbcMove(const Size& aSize) override;
+ virtual void NbcResize(const Point& rRefPnt, const Fraction& aXFact, const Fraction& aYFact) override;
+ virtual void NbcRotate(const Point& rRefPnt, Degree100 nAngle, double fSin, double fCos) override;
+ virtual void NbcMirror(const Point& rRefPnt1, const Point& rRefPnt2) override;
+ virtual void NbcShear(const Point& rRefPnt, Degree100 nAngle, double fTan, bool bVShear) override;
+
+ virtual sal_uInt32 GetSnapPointCount() const override;
+ virtual Point GetSnapPoint(sal_uInt32 i) const override;
+
+ virtual bool IsPolyObj() const override;
+ virtual sal_uInt32 GetPointCount() const override;
+ virtual Point GetPoint(sal_uInt32 nHdlNum) const override;
+ virtual void NbcSetPoint(const Point& rPnt, sal_uInt32 nHdlNum) override;
+
+ // insert point
+ sal_uInt32 NbcInsPointOld(const Point& rPos, bool bNewObj);
+ sal_uInt32 NbcInsPoint(const Point& rPos, bool bNewObj);
+
+ // rip at given point
+ SdrObject* RipPoint(sal_uInt32 nHdlNum, sal_uInt32& rNewPt0Index);
+
+private:
+ virtual std::unique_ptr<SdrObjGeoData> NewGeoData() const override;
+ virtual void SaveGeoData(SdrObjGeoData& rGeo) const override;
+ virtual void RestoreGeoData(const SdrObjGeoData& rGeo) override;
+
+public:
+ virtual SdrObjectUniquePtr DoConvertToPolyObj(bool bBezier, bool bAddText) const override;
+
+ // Bezier-polygon getter/setter
+ const basegfx::B2DPolyPolygon& GetPathPoly() const { return maPathPolygon; }
+ void SetPathPoly(const basegfx::B2DPolyPolygon& rPathPoly);
+ void NbcSetPathPoly(const basegfx::B2DPolyPolygon& rPathPoly);
+
+ // special functions for Bezier-polygon handling
+ bool IsClosed() const { return meKind==SdrObjKind::Polygon || meKind==SdrObjKind::PathPoly || meKind==SdrObjKind::PathFill || meKind==SdrObjKind::FreehandFill || meKind==SdrObjKind::SplineFill; }
+ bool IsLine() const { return meKind==SdrObjKind::PolyLine || meKind==SdrObjKind::PathPolyLine || meKind==SdrObjKind::PathLine || meKind==SdrObjKind::FreehandLine || meKind==SdrObjKind::SplineLine || meKind==SdrObjKind::Line; }
+ bool IsBezier() const { return meKind==SdrObjKind::PathLine || meKind==SdrObjKind::PathFill; }
+ bool IsSpline() const { return meKind==SdrObjKind::SplineLine || meKind==SdrObjKind::SplineFill; }
+
+ // close/open path
+ // if opening, move end point by "nOpenDistance"
+ void ToggleClosed(); // long nOpenDistance);
+
+ // transformation interface for StarOfficeAPI. This implements support for
+ // homogen 3x3 matrices containing the transformation of the SdrObject. At the
+ // moment it contains a shearX, rotation and translation, but for setting all linear
+ // transforms like Scale, ShearX, ShearY, Rotate and Translate are supported.
+ //
+ // gets base transformation and rectangle of object. If it's an SdrPathObj it fills the PolyPolygon
+ // with the base geometry and returns TRUE. Otherwise it returns FALSE.
+ virtual bool TRGetBaseGeometry(basegfx::B2DHomMatrix& rMatrix, basegfx::B2DPolyPolygon& rPolyPolygon) const override;
+ // sets the base geometry of the object using infos contained in the homogen 3x3 matrix.
+ // If it's an SdrPathObj it will use the provided geometry information. The Polygon has
+ // to use (0,0) as upper left and will be scaled to the given size in the matrix.
+ virtual void TRSetBaseGeometry(const basegfx::B2DHomMatrix& rMatrix, const basegfx::B2DPolyPolygon& rPolyPolygon) override;
+
+ /**
+ * Scaling is ignored from the transform matrix by default, to not break compatibility. One can
+ * opt in to handle scaling if matching ODF behavior is more important.
+ */
+ void SetHandleScale(bool bHandleScale);
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */