summaryrefslogtreecommitdiffstats
path: root/sw/source/core/inc/bookmark.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/inc/bookmark.hxx')
-rw-r--r--sw/source/core/inc/bookmark.hxx347
1 files changed, 347 insertions, 0 deletions
diff --git a/sw/source/core/inc/bookmark.hxx b/sw/source/core/inc/bookmark.hxx
new file mode 100644
index 000000000..a9c807063
--- /dev/null
+++ b/sw/source/core/inc/bookmark.hxx
@@ -0,0 +1,347 @@
+/* -*- 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 <cppuhelper/weakref.hxx>
+#include <sfx2/Metadatable.hxx>
+#include <vcl/keycod.hxx>
+#include <memory>
+#include <string_view>
+#include <com/sun/star/text/XTextContent.hpp>
+
+#include <rtl/ustring.hxx>
+#include <osl/diagnose.h>
+#include <tools/ref.hxx>
+#include <IMark.hxx>
+#include <swrect.hxx>
+#include "FormFieldButton.hxx"
+
+class SwDoc;
+class SwEditWin;
+class SwServerObject;
+class SvNumberFormatter;
+class SfxViewShell;
+
+namespace sw::mark {
+ class MarkBase
+ : virtual public IMark
+ {
+ public:
+ //getters
+ virtual SwPosition& GetMarkPos() const override
+ { return *m_pPos1; }
+ virtual const OUString& GetName() const override
+ { return m_aName; }
+ virtual SwPosition& GetOtherMarkPos() const override
+ {
+ OSL_PRECOND(IsExpanded(), "<SwPosition::GetOtherMarkPos(..)> - I have no other Pos set." );
+ return *m_pPos2;
+ }
+ virtual SwPosition& GetMarkStart() const override
+ {
+ if( !IsExpanded() ) return GetMarkPos( );
+ if ( GetMarkPos( ) < GetOtherMarkPos( ) )
+ return GetMarkPos();
+ else
+ return GetOtherMarkPos( );
+ }
+ virtual SwPosition& GetMarkEnd() const override
+ {
+ if( !IsExpanded() ) return GetMarkPos();
+ if ( GetMarkPos( ) >= GetOtherMarkPos( ) )
+ return GetMarkPos( );
+ else
+ return GetOtherMarkPos( );
+ }
+
+ virtual bool IsCoveringPosition(const SwPosition& rPos) const override;
+ virtual bool IsExpanded() const override
+ { return static_cast< bool >(m_pPos2); }
+
+ void SetName(const OUString& rName)
+ { m_aName = rName; }
+ virtual void SetMarkPos(const SwPosition& rNewPos);
+ virtual void SetOtherMarkPos(const SwPosition& rNewPos);
+ virtual void ClearOtherMarkPos()
+ { m_pPos2.reset(); }
+
+ virtual auto InvalidateFrames() -> void;
+
+ virtual OUString ToString( ) const override;
+ virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+ void Swap()
+ {
+ if(m_pPos2)
+ m_pPos1.swap(m_pPos2);
+ }
+
+ virtual void InitDoc(SwDoc&, sw::mark::InsertMode, SwPosition const*)
+ {
+ }
+
+ virtual ~MarkBase() override;
+
+ const css::uno::WeakReference< css::text::XTextContent> & GetXBookmark() const
+ { return m_wXBookmark; }
+ void SetXBookmark(css::uno::Reference< css::text::XTextContent> const& xBkmk)
+ { m_wXBookmark = xBkmk; }
+
+ protected:
+ // SwClient
+ virtual void SwClientNotify(const SwModify&, const SfxHint&) override;
+
+ MarkBase(const SwPaM& rPaM, const OUString& rName);
+ std::unique_ptr<SwPosition> m_pPos1;
+ std::unique_ptr<SwPosition> m_pPos2;
+ OUString m_aName;
+ static OUString GenerateNewName(std::u16string_view rPrefix);
+
+ css::uno::WeakReference< css::text::XTextContent> m_wXBookmark;
+ };
+
+ class NavigatorReminder final
+ : public MarkBase
+ {
+ public:
+ NavigatorReminder(const SwPaM& rPaM);
+ };
+
+ class UnoMark final
+ : public MarkBase
+ {
+ public:
+ UnoMark(const SwPaM& rPaM);
+ };
+
+ class DdeBookmark
+ : public MarkBase
+ {
+ public:
+ DdeBookmark(const SwPaM& rPaM);
+
+ const SwServerObject* GetRefObject() const { return m_aRefObj.get(); }
+ SwServerObject* GetRefObject() { return m_aRefObj.get(); }
+
+ bool IsServer() const { return m_aRefObj.is(); }
+
+ void SetRefObject( SwServerObject* pObj );
+
+ virtual void DeregisterFromDoc(SwDoc& rDoc);
+ virtual ~DdeBookmark() override;
+
+ private:
+ tools::SvRef<SwServerObject> m_aRefObj;
+ };
+
+ class Bookmark
+ : virtual public IBookmark
+ , public DdeBookmark
+ , public ::sfx2::Metadatable
+ {
+ public:
+ Bookmark(const SwPaM& rPaM,
+ const vcl::KeyCode& rCode,
+ const OUString& rName);
+ virtual void InitDoc(SwDoc& io_Doc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+
+ virtual void DeregisterFromDoc(SwDoc& io_rDoc) override;
+
+ virtual auto InvalidateFrames() -> void override;
+
+ virtual const OUString& GetShortName() const override
+ { return m_sShortName; }
+ virtual const vcl::KeyCode& GetKeyCode() const override
+ { return m_aCode; }
+ virtual void SetShortName(const OUString& rShortName) override
+ { m_sShortName = rShortName; }
+ virtual void SetKeyCode(const vcl::KeyCode& rCode) override
+ { m_aCode = rCode; }
+ virtual bool IsHidden() const override
+ { return m_bHidden; }
+ virtual const OUString& GetHideCondition() const override
+ { return m_sHideCondition; }
+ virtual void Hide(bool rHide) override;
+ virtual void SetHideCondition(const OUString& rHideCondition) override;
+
+ // ::sfx2::Metadatable
+ virtual ::sfx2::IXmlIdRegistry& GetRegistry() override;
+ virtual bool IsInClipboard() const override;
+ virtual bool IsInUndo() const override;
+ virtual bool IsInContent() const override;
+ virtual css::uno::Reference< css::rdf::XMetadatable > MakeUnoObject() override;
+
+ private:
+ vcl::KeyCode m_aCode;
+ OUString m_sShortName;
+ bool m_bHidden;
+ OUString m_sHideCondition;
+ };
+
+ class Fieldmark
+ : virtual public IFieldmark
+ , public MarkBase
+ {
+ public:
+ Fieldmark(const SwPaM& rPaM);
+
+ virtual OUString GetFieldname() const override
+ { return m_aFieldname; }
+ virtual OUString GetFieldHelptext() const override
+ { return m_aFieldHelptext; }
+
+ virtual IFieldmark::parameter_map_t* GetParameters() override
+ { return &m_vParams; }
+
+ virtual const IFieldmark::parameter_map_t* GetParameters() const override
+ { return &m_vParams; }
+
+ virtual void SetFieldname(const OUString& aFieldname) override
+ { m_aFieldname = aFieldname; }
+ virtual void SetFieldHelptext(const OUString& aFieldHelptext) override
+ { m_aFieldHelptext = aFieldHelptext; }
+
+ virtual void ReleaseDoc(SwDoc&) = 0;
+
+ void SetMarkStartPos( const SwPosition& rNewStartPos );
+
+ virtual void Invalidate() override;
+ virtual OUString ToString() const override;
+ virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override;
+
+ private:
+ OUString m_aFieldname;
+ OUString m_aFieldHelptext;
+ IFieldmark::parameter_map_t m_vParams;
+ };
+
+ class TextFieldmark final
+ : public Fieldmark
+ {
+ public:
+ TextFieldmark(const SwPaM& rPaM, const OUString& rName);
+ virtual void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+ virtual void ReleaseDoc(SwDoc& rDoc) override;
+ };
+
+ // Non text fieldmarks have no content between the start and end marks.
+ class NonTextFieldmark
+ : public Fieldmark
+ {
+ public:
+ NonTextFieldmark(const SwPaM& rPaM);
+ virtual void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+ virtual void ReleaseDoc(SwDoc& rDoc) override;
+ };
+
+ /// Fieldmark representing a checkbox form field.
+ class CheckboxFieldmark final
+ : virtual public ICheckboxFieldmark
+ , public NonTextFieldmark
+ {
+ public:
+ CheckboxFieldmark(const SwPaM& rPaM);
+ bool IsChecked() const override;
+ void SetChecked(bool checked) override;
+ };
+
+ /// Fieldmark with a drop down button (e.g. this button opens the date picker for a date field)
+ class FieldmarkWithDropDownButton
+ : public NonTextFieldmark
+ {
+ public:
+ FieldmarkWithDropDownButton(const SwPaM& rPaM);
+ virtual ~FieldmarkWithDropDownButton() override;
+
+ virtual void ShowButton(SwEditWin* pEditWin) = 0;
+ virtual void RemoveButton();
+
+ protected:
+ VclPtr<FormFieldButton> m_pButton;
+ };
+
+ /// Fieldmark representing a drop-down form field.
+ class DropDownFieldmark final
+ : public FieldmarkWithDropDownButton
+ {
+ public:
+ DropDownFieldmark(const SwPaM& rPaM);
+ virtual ~DropDownFieldmark() override;
+
+ virtual void ShowButton(SwEditWin* pEditWin) override;
+ virtual void RemoveButton() override;
+
+ // This method should be called only by the portion so we can now the portion's painting area
+ void SetPortionPaintArea(const SwRect& rPortionPaintArea);
+
+ void SendLOKShowMessage(const SfxViewShell* pViewShell);
+ static void SendLOKHideMessage(const SfxViewShell* pViewShell);
+
+ private:
+ SwRect m_aPortionPaintArea;
+ };
+
+ /// Fieldmark representing a date form field.
+ /// TODO: this was an SDT in DOCX, which is modelled suboptimally here
+ /// as a fieldmark; as it cannot contain paragraph breaks, must be
+ /// well-formed XML element, and does not have field separator, it
+ /// should be a nesting text attribute similar to SwTextMeta.
+ class DateFieldmark final
+ : virtual public IDateFieldmark
+ , public FieldmarkWithDropDownButton
+ {
+ public:
+ DateFieldmark(const SwPaM& rPaM);
+ virtual ~DateFieldmark() override;
+
+ virtual void InitDoc(SwDoc& io_rDoc, sw::mark::InsertMode eMode, SwPosition const* pSepPos) override;
+ virtual void ReleaseDoc(SwDoc& rDoc) override;
+
+ virtual void ShowButton(SwEditWin* pEditWin) override;
+
+ void SetPortionPaintAreaStart(const SwRect& rPortionPaintArea);
+ void SetPortionPaintAreaEnd(const SwRect& rPortionPaintArea);
+
+ virtual OUString GetContent() const override;
+ virtual void ReplaceContent(const OUString& sNewContent) override;
+
+ virtual std::pair<bool, double> GetCurrentDate() const override;
+ virtual void SetCurrentDate(double fDate) override;
+ virtual OUString GetDateInStandardDateFormat(double fDate) const override;
+
+ private:
+ OUString GetDateInCurrentDateFormat(double fDate) const;
+ std::pair<bool, double> ParseCurrentDateParam() const;
+ void InvalidateCurrentDateParam();
+
+ SvNumberFormatter* m_pNumberFormatter;
+ sw::DocumentContentOperationsManager* m_pDocumentContentOperationsManager;
+ SwRect m_aPaintAreaStart;
+ SwRect m_aPaintAreaEnd;
+ };
+
+ /// return position of the CH_TXT_ATR_FIELDSEP for rMark
+ SwPosition FindFieldSep(IFieldmark const& rMark);
+
+ /// check if rPaM is valid range of new fieldmark
+ bool IsFieldmarkOverlap(SwPaM const& rPaM);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */