1
0
Fork 0
libreoffice/include/svx/annotation/Annotation.hxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

185 lines
5.5 KiB
C++

/* -*- 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/.
*/
#pragma once
#include <com/sun/star/geometry/RealPoint2D.hpp>
#include <com/sun/star/geometry/RealSize2D.hpp>
#include <com/sun/star/util/DateTime.hpp>
#include <svx/svdundo.hxx>
#include <svx/svxdllapi.h>
#include <com/sun/star/office/XAnnotation.hpp>
#include <comphelper/compbase.hxx>
#include <cppuhelper/propertysetmixin.hxx>
#include <svx/annotation/Annotation.hxx>
#include <svx/annotation/TextAPI.hxx>
#include <tools/UniqueID.hxx>
#include <vcl/bitmapex.hxx>
class SdrUndoAction;
class SfxViewShell;
class SdrPage;
namespace sdr::annotation
{
class Annotation;
/** Type of the annotation / comment change. */
enum class CommentNotificationType
{
Add,
Modify,
Remove
};
/** LOKit notify for a view */
SVXCORE_DLLPUBLIC void LOKCommentNotify(CommentNotificationType nType,
const SfxViewShell* pViewShell, Annotation& rAnnotation);
/** LOKit notify for all views */
SVXCORE_DLLPUBLIC void LOKCommentNotifyAll(CommentNotificationType nType, Annotation& rAnnotation);
/** Type of the annotation (that is supported) */
enum class AnnotationType
{
None,
Square,
Polygon,
Circle,
Ink,
Highlight,
Line,
FreeText,
Stamp
};
/** Annotation data that is used at annotation creation */
struct CreationInfo
{
AnnotationType meType = AnnotationType::None;
std::vector<basegfx::B2DPolygon> maPolygons;
basegfx::B2DRectangle maRectangle;
float mnWidth = 0.0f;
bool mbFillColor = false;
Color maFillColor = COL_TRANSPARENT;
bool mbColor = false;
Color maColor = COL_TRANSPARENT;
BitmapEx maBitmapEx;
};
/** Data of an annotation */
struct SVXCORE_DLLPUBLIC AnnotationData
{
css::geometry::RealPoint2D m_Position;
css::geometry::RealSize2D m_Size;
OUString m_Author;
OUString m_Initials;
css::util::DateTime m_DateTime;
OUString m_Text;
void get(Annotation& rAnnotation);
void set(Annotation& rAnnotation);
};
/** Annotation object, responsible for handling of the annotation.
*
* Implements the XAnnotation UNO API, handles undo/redo and notifications ()
*
**/
class SVXCORE_DLLPUBLIC Annotation
: public ::comphelper::WeakComponentImplHelper<css::office::XAnnotation>,
public ::cppu::PropertySetMixin<css::office::XAnnotation>
{
protected:
SdrPage* mpPage;
UniqueID maUniqueID;
css::geometry::RealPoint2D m_Position;
css::geometry::RealSize2D m_Size;
OUString m_Author;
OUString m_Initials;
css::util::DateTime m_DateTime;
rtl::Reference<sdr::annotation::TextApiObject> m_TextRange;
CreationInfo maCreationInfo;
std::unique_ptr<SdrUndoAction> createUndoAnnotation();
public:
Annotation(const css::uno::Reference<css::uno::XComponentContext>& context, SdrPage* pPage);
Annotation(const Annotation&) = delete;
Annotation& operator=(const Annotation&) = delete;
// XInterface:
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const& type) override;
virtual void SAL_CALL acquire() noexcept override
{
comphelper::WeakComponentImplHelper<css::office::XAnnotation>::acquire();
}
virtual void SAL_CALL release() noexcept override
{
comphelper::WeakComponentImplHelper<css::office::XAnnotation>::release();
}
// Changes without triggering notification broadcast
const css::geometry::RealPoint2D& GetPosition() const { return m_Position; }
void SetPosition(const css::geometry::RealPoint2D& rValue) { m_Position = rValue; }
const css::geometry::RealSize2D& GetSize() const { return m_Size; }
void SetSize(const css::geometry::RealSize2D& rValue) { m_Size = rValue; }
const OUString& GetAuthor() const { return m_Author; }
void SetAuthor(const OUString& rValue) { m_Author = rValue; }
const OUString& GetInitials() const { return m_Initials; }
void SetInitials(const OUString& rValue) { m_Initials = rValue; }
const css::util::DateTime& GetDateTime() const { return m_DateTime; }
void SetDateTime(const css::util::DateTime& rValue) { m_DateTime = rValue; }
virtual css::uno::Reference<css::text::XText> SAL_CALL getTextRange() override;
// override WeakComponentImplHelperBase::disposing()
// This function is called upon disposing the component,
// if your component needs special work when it becomes
// disposed, do it here.
virtual void disposing(std::unique_lock<std::mutex>& rGuard) override;
OUString GetText();
void SetText(OUString const& rText);
const rtl::Reference<sdr::annotation::TextApiObject>& getTextApiObject() { return m_TextRange; }
SdrModel* GetModel() const;
SdrPage const* getPage() const { return mpPage; }
SdrPage* getPage() { return mpPage; }
// Unique ID of the annotation
sal_uInt64 GetId() const { return maUniqueID.getID(); }
CreationInfo const& getCreationInfo() { return maCreationInfo; }
void setCreationInfo(CreationInfo const& rCreationInfo) { maCreationInfo = rCreationInfo; }
SdrObject* findAnnotationObject();
virtual rtl::Reference<Annotation> clone(SdrPage* pTargetPage) = 0;
};
/** Vector of annotations */
typedef std::vector<rtl::Reference<Annotation>> AnnotationVector;
} // namespace sdr::annotation
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */