21 #include <bookmark.hxx>
34 #include <libxml/xmlwriter.h>
46 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
47 #include <rtl/strbuf.hxx>
48 #include <strings.hrc>
61 SwNodes const& rNodes(rStartPos.nNode.GetNodes());
62 SwNodeOffset const nStartNode(rStartPos.nNode.GetIndex());
65 std::optional<SwPosition> ret;
72 sal_Int32
const nStart(n == nStartNode
73 ? rStartPos.nContent.GetIndex() + 1
75 sal_Int32
const nEnd(n == nEndNode
77 ? rEndPos.nContent.GetIndex() - 1
79 for (sal_Int32
i = nEnd; nStart <
i; --i)
108 assert(nStartNode <= pNode->StartOfSectionIndex());
133 <<
" without proper TextNode");
141 <<
" is beyond " << pTextNode->
Len());
146 void lcl_AssertFieldMarksSet(
const Fieldmark& rField,
152 SwPosition const& rStart(rField.GetMarkStart());
153 assert(rStart.nNode.GetNode().GetTextNode()->GetText()[rStart.nContent.GetIndex()] == aStartMark); (
void) rStart; (
void) aStartMark;
155 assert(sepPos.nNode.GetNode().GetTextNode()->GetText()[sepPos.nContent.GetIndex()] ==
CH_TXT_ATR_FIELDSEP); (
void) sepPos;
159 assert(rField.GetMarkPos().nContent.GetIndex() + 1 == rField.GetOtherMarkPos().nContent.GetIndex());
162 assert(rEnd.nNode.GetNode().GetTextNode()->GetText()[rEnd.nContent.GetIndex() - 1] == aEndMark); (
void) rEnd;
165 void lcl_SetFieldMarks(Fieldmark& rField,
172 OUString startChar(aStartMark);
174 && rField.GetMarkStart() == rField.GetMarkEnd())
184 SwPaM aStartPaM(start);
186 start.
nContent -= startChar.getLength();
189 rField.SetMarkStartPos( start );
192 assert(pSepPos ==
nullptr || (start < *pSepPos && *pSepPos <= rEnd));
193 if (startChar.getLength() == 1)
195 *aStartPaM.GetPoint() = pSepPos ? *pSepPos : rEnd;
197 if (!pSepPos || rEnd < *pSepPos)
202 assert(pSepPos ==
nullptr || (start < *pSepPos && *pSepPos <= rEnd));
206 assert(pSepPos ==
nullptr);
210 if (aEndMark && startChar.getLength() == 1)
220 assert(rField.GetMarkPos().nContent.GetIndex() + 1 == rField.GetOtherMarkPos().nContent.GetIndex());
223 lcl_AssertFieldMarksSet(rField, aStartMark, aEndMark);
228 void lcl_RemoveFieldMarks(
const Fieldmark& rField,
235 const SwPosition& rStart = rField.GetMarkStart();
237 assert(pStartTextNode);
240 (
void) pStartTextNode;
249 assert(pEndTextNode);
250 const sal_Int32 nEndPos = (rEnd == rStart)
253 assert(pEndTextNode->
GetText()[nEndPos] == aEndMark);
254 SwPosition const aEnd(*pEndTextNode, nEndPos);
260 auto InvalidatePosition(
SwPosition const& rPos) ->
void
270 const OUString& rName)
274 m_pPos1->nContent.SetMark(
this);
293 std::make_unique<SwPosition>(rNewPos).
swap(
m_pPos1);
294 m_pPos1->nContent.SetMark(
this);
299 std::make_unique<SwPosition>(rNewPos).
swap(
m_pPos2);
300 m_pPos2->nContent.SetMark(
this);
305 return "Mark: ( Name, [ Node1, Index1 ] ): ( " +
m_aName +
", [ "
306 + OUString::number( sal_Int32(
GetMarkPos().nNode.GetIndex()) ) +
", "
307 + OUString::number(
GetMarkPos().nContent.GetIndex( ) ) +
" ] )";
312 (
void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"MarkBase"));
313 (
void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST(
"name"), BAD_CAST(
m_aName.toUtf8().getStr()));
314 (
void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"markPos"));
316 (
void)xmlTextWriterEndElement(pWriter);
319 (
void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"otherMarkPos"));
321 (
void)xmlTextWriterEndElement(pWriter);
323 (
void)xmlTextWriterEndElement(pWriter);
331 static bool bHack = (getenv(
"LIBO_ONEWAY_STABLE_ODF_EXPORT") !=
nullptr);
335 static sal_Int64 nIdCounter = SAL_CONST_INT64(6000000000);
336 return rPrefix + OUString::number(nIdCounter++);
340 static OUString sUniquePostfix;
345 std::numeric_limits<unsigned int>::max()));
346 sUniquePostfix =
"_" + OUString::number(n);
350 return rPrefix + OUString::number(nCount++) + sUniquePostfix;
357 if (rHint.
GetId() != SfxHintId::SwLegacyModify)
362 SetXBookmark(uno::Reference<text::XTextContent>(
nullptr));
408 const OUString& rName)
422 std::make_unique<SwUndoInsBookmark>(*
this));
435 std::make_unique<SwUndoDeleteBookmark>(*
this));
444 InvalidatePosition(GetMarkPos());
447 InvalidatePosition(GetOtherMarkPos());
496 const uno::Reference< rdf::XMetadatable> xMeta(
518 return "Fieldmark: ( Name, Type, [ Nd1, Id1 ], [ Nd2, Id2 ] ): ( " +
m_aName +
", "
520 +
", " + OUString::number(
GetMarkPos( ).nContent.GetIndex( ) ) +
" ], ["
521 + OUString::number( sal_Int32(
GetOtherMarkPos().nNode.GetIndex( )) ) +
", "
522 + OUString::number(
GetOtherMarkPos( ).nContent.GetIndex( ) ) +
" ] ) ";
535 (
void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"Fieldmark"));
536 (
void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST(
"fieldname"), BAD_CAST(
m_aFieldname.toUtf8().getStr()));
537 (
void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST(
"fieldHelptext"), BAD_CAST(
m_aFieldHelptext.toUtf8().getStr()));
539 (
void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"parameters"));
542 (
void)xmlTextWriterStartElement(pWriter, BAD_CAST(
"parameter"));
543 (
void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST(
"name"), BAD_CAST(rParam.first.toUtf8().getStr()));
545 (
void)xmlTextWriterEndElement(pWriter);
547 (
void)xmlTextWriterEndElement(pWriter);
548 (
void)xmlTextWriterEndElement(pWriter);
554 if ( !rName.isEmpty() )
574 if (rIDUR.DoesUndo())
576 rIDUR.
AppendUndo(std::make_unique<SwUndoDelTextFieldmark>(*
this));
592 assert(pSepPos ==
nullptr);
606 if (rIDUR.DoesUndo())
608 rIDUR.
AppendUndo(std::make_unique<SwUndoDelNoTextFieldmark>(*
this));
611 lcl_RemoveFieldMarks(*
this, rDoc,
633 bool bResult =
false;
636 pResult->second >>= bResult;
703 OStringBuffer sPayload;
704 sPayload = OString::Concat(
"{\"action\": \"show\","
705 " \"type\": \"drop-down\", \"textArea\": \"") +
708 sPayload.append(
" \"params\": { \"items\": [");
713 css::uno::Sequence<OUString> vListEntries;
714 if (pListEntriesIter != pParameters->end())
716 pListEntriesIter->second >>= vListEntries;
717 for (
const OUString& sItem : std::as_const(vListEntries))
718 sPayload.append(
"\"" +
OUStringToOString(sItem, RTL_TEXTENCODING_UTF8) +
"\", ");
719 sPayload.setLength(sPayload.getLength() - 2);
721 sPayload.append(
"], ");
725 sal_Int32 nSelection = -1;
726 if (pSelectedItemIter != pParameters->end())
728 pSelectedItemIter->second >>= nSelection;
730 sPayload.append(
"\"selected\": \"" + OString::number(nSelection) +
"\", ");
733 sPayload.append(
"\"placeholderText\": \"" +
OUStringToOString(
SwResId(STR_DROP_DOWN_EMPTY_LIST), RTL_TEXTENCODING_UTF8) +
"\"}}");
739 OString sPayload =
"{\"action\": \"hide\", \"type\": \"drop-down\"}";
745 , m_pNumberFormatter(nullptr)
746 , m_pDocumentContentOperationsManager(nullptr)
772 if (rIDUR.DoesUndo())
775 rIDUR.
AppendUndo(std::make_unique<SwUndoDelTextFieldmark>(*
this));
798 if (rPortionPaintArea.
IsEmpty())
807 if (rPortionPaintArea.
IsEmpty())
830 const sal_Int32 nEnd (
GetMarkEnd().nContent.GetIndex());
833 if(nStart + 1 < pTextNode->
GetText().getLength() && nEnd <= pTextNode->
GetText().getLength() &&
835 sContent = pTextNode->
GetText().copy(nStart + 1, nEnd - nStart - 2);
847 const sal_Int32 nEnd (
GetMarkEnd().nContent.GetIndex());
849 if(nStart + 1 < pTextNode->
GetText().getLength() && nEnd <= pTextNode->
GetText().getLength() &&
872 bool bFoundValidDate =
false;
873 double dCurrentDate = 0;
874 OUString sDateFormat;
876 if (pResult != pParameters->end())
878 pResult->second >>= sDateFormat;
883 if (pResult != pParameters->end())
885 pResult->second >>= sLang;
894 sal_Int32 nCheckPos = 0;
907 return std::pair<bool, double>(bFoundValidDate, dCurrentDate);
922 OUString sCurrentDate;
926 sal_Int32 nCheckPos = 0;
938 const Color* pCol =
nullptr;
946 bool bFoundValidDate =
false;
947 double dCurrentDate = 0;
951 OUString sCurrentDate;
952 if (pResult != pParameters->end())
954 pResult->second >>= sCurrentDate;
956 if(!sCurrentDate.isEmpty())
961 sal_Int32 nCheckPos = 0;
976 return std::pair<bool, double>(bFoundValidDate, dCurrentDate);
983 OUString sDateFormat;
986 if (pResult != pParameters->end())
988 pResult->second >>= sDateFormat;
993 if (pResult != pParameters->end())
995 pResult->second >>= sLang;
999 OUString sCurrentContent;
1003 sal_Int32 nCheckPos = 0;
1005 OUString sFormat = sDateFormat;
1015 const Color* pCol =
nullptr;
1018 return sCurrentContent;
void SetMarkStartPos(const SwPosition &rNewStartPos)
virtual void Hide(bool rHide) override
virtual std::pair< bool, double > GetCurrentDate() const override
virtual void InitDoc(SwDoc &io_rDoc, sw::mark::InsertMode eMode, SwPosition const *pSepPos) override
DateFieldmark(const SwPaM &rPaM)
static void SendLOKHideMessage(const SfxViewShell *pViewShell)
std::map< OUString, css::uno::Any > parameter_map_t
Marks a position in the document model.
OUString m_aFieldHelptext
bool IsSectionNode() const
bool isLOKMobilePhone() const
bool IsChecked() const override
virtual void ShowButton(SwEditWin *pEditWin) override
const OUString & GetText() const
virtual bool IsInUndo() const override
virtual void ReplaceContent(const OUString &sNewContent) override
SvNumberFormatter * GetNumberFormatter(bool bCreate=true)
constexpr OUStringLiteral ODF_FORMCHECKBOX_RESULT
constexpr TypedWhichId< SwPtrMsgPoolItem > RES_REMOVE_UNO_OBJECT(181)
SwNodeOffset StartOfSectionIndex() const
OUString m_sHideCondition
virtual sal_Int32 Len() const override
virtual void SetModified()=0
Must be called manually at changes of format.
const SwPosition * GetMark() const
virtual SwUndoId EndUndo(SwUndoId const eUndoId, SwRewriter const *const pRewriter)=0
Closes undo block.
virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override
virtual void InitDoc(SwDoc &io_rDoc, sw::mark::InsertMode eMode, SwPosition const *pSepPos) override
virtual SwPosition & GetMarkStart() const override
IDocumentLinksAdministration const & getIDocumentLinksAdministration() const
sw::DocumentContentOperationsManager * m_pDocumentContentOperationsManager
virtual void SwClientNotify(const SwModify &, const SfxHint &) override
virtual auto InvalidateFrames() -> void override
virtual const SwPosition & GetMarkPos() const =0
SwPosition FindFieldSep(IFieldmark const &rMark)
return position of the CH_TXT_ATR_FIELDSEP for rMark
void SetChecked(bool checked) override
virtual OUString ToString() const override
UnoMark(const SwPaM &rPaM)
virtual ::sfx2::IXmlIdRegistry & GetRegistry() override
IDocumentUndoRedo & GetIDocumentUndoRedo()
Of course Writer needs its own rectangles.
IDocumentContentOperations const & getIDocumentContentOperations() const
void SetPortionPaintAreaEnd(const SwRect &rPortionPaintArea)
virtual bool IsCoveringPosition(const SwPosition &rPos) const override
#define CH_TXT_ATR_FORMELEMENT
virtual ~DdeBookmark() override
bool InsertString(const SwPaM &rRg, const OUString &, const SwInsertFlags nInsertMode=SwInsertFlags::EMPTYEXPAND) override
Insert string into existing text node at position rRg.Point().
TextFieldmark(const SwPaM &rPaM, const OUString &rName)
bool IsInHeaderFooter(const SwNodeIndex &rIdx) const
unsigned int uniform_uint_distribution(unsigned int a, unsigned int b)
std::unique_ptr< SwPosition > m_pPos1
virtual bool IsExpanded() const override
OUString SwResId(TranslateId aId)
virtual void InitDoc(SwDoc &io_Doc, sw::mark::InsertMode eMode, SwPosition const *pSepPos) override
#define ODF_FORMDATE_CURRENTDATE_LANGUAGE
virtual SwPosition & GetMarkEnd() const override
constexpr OUStringLiteral ODF_FORMDROPDOWN_RESULT
std::unique_ptr< SwPosition > m_pPos2
constexpr sal_uInt32 NUMBERFORMAT_ENTRY_NOT_FOUND
virtual ~DropDownFieldmark() override
void RemoveServer(SvLinkSource *rObj)
virtual void libreOfficeKitViewCallback(int nType, const char *pPayload) const override
std::pair< bool, double > ParseCurrentDateParam() const
constexpr OUStringLiteral ODF_FORMDATE_CURRENTDATE_FORMAT
::sfx2::IXmlIdRegistry & GetXmlIdRegistry()
OUString GetDateInCurrentDateFormat(double fDate) const
void InvalidateCurrentDateParam()
virtual parameter_map_t * GetParameters()=0
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
void DeleteDummyChar(SwPosition const &rPos, sal_Unicode cDummy)
virtual void DeregisterFromDoc(SwDoc &rDoc)
virtual bool DoesUndo() const =0
Is Undo enabled?
Bookmark(const SwPaM &rPaM, const vcl::KeyCode &rCode, const OUString &rName)
virtual void ShowButton(SwEditWin *pEditWin) override
void SetRefObject(SwServerObject *pObj)
Point BottomRight() const
constexpr OUStringLiteral ODF_FORMDROPDOWN_LISTENTRY
PaM is Point and Mark: a selection of the document model.
void swap(cow_wrapper< T, P > &a, cow_wrapper< T, P > &b)
static css::uno::Reference< css::text::XTextContent > CreateXBookmark(SwDoc &rDoc,::sw::mark::IMark *pBookmark)
virtual bool InsertString(const SwPaM &rRg, const OUString &, const SwInsertFlags nInsertMode=SwInsertFlags::EMPTYEXPAND)=0
Insert string into existing text node at position rRg.Point().
virtual void AppendUndo(std::unique_ptr< SwUndo > pUndo)=0
Add new Undo action.
virtual SwUndoId StartUndo(SwUndoId const eUndoId, SwRewriter const *const pRewriter)=0
Opens undo block.
SwRect m_aPortionPaintArea
const SwStartNode * StartOfSectionNode() const
virtual void ReleaseDoc(SwDoc &rDoc) override
const SwPosition * GetPoint() const
Window class for the Writer edit area, this is the one handling mouse and keyboard events and doing t...
SwIndex & Assign(SwIndexReg *, sal_Int32)
virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override
virtual void DeregisterFromDoc(SwDoc &io_rDoc) override
::sw::DocumentContentOperationsManager const & GetDocumentContentOperationsManager() const
virtual void ReleaseDoc(SwDoc &rDoc) override
virtual void ReleaseDoc(SwDoc &rDoc) override
virtual void Invalidate(InvalidateFlags nFlags=InvalidateFlags::NONE)
bool HasMark() const
A PaM marks a selection if Point and Mark are distinct positions.
virtual auto InvalidateFrames() -> void
virtual ~MarkBase() override
#define CH_TXT_ATR_FIELDSTART
SvNumberFormatter * m_pNumberFormatter
IDocumentState const & getIDocumentState() const
DdeBookmark(const SwPaM &rPaM)
virtual css::uno::Reference< css::rdf::XMetadatable > MakeUnoObject() override
bool IsNoTextNode() const
void SetPortionPaintAreaStart(const SwRect &rPortionPaintArea)
static OUString GenerateNewName(std::u16string_view rPrefix)
DropDownFieldmark(const SwPaM &rPaM)
CheckboxFieldmark(const SwPaM &rPaM)
constexpr OUStringLiteral ODF_FORMDATE_DATEFORMAT_LANGUAGE
enumrange< T >::Iterator end(enumrange< T >)
virtual OUString ToString() const override
bool HasDataLinks() const
NavigatorReminder(const SwPaM &rPaM)
NonTextFieldmark(const SwPaM &rPaM)
virtual SwPosition & GetOtherMarkPos() const override
SwTextNode is a paragraph in the document model.
MarkBase(const SwPaM &rPaM, const OUString &rName)
void SendLOKShowMessage(const SfxViewShell *pViewShell)
tools::Rectangle SVRect() const
void SetXBookmark(css::uno::Reference< css::text::XTextContent > const &xBkmk)
void UpdateFramesForRemoveDeleteRedline(SwDoc &rDoc, SwPaM const &rPam)
virtual bool IsInContent() const override
constexpr OUStringLiteral ODF_FORMDATE_DATEFORMAT
constexpr OUStringLiteral ODF_FORMDATE_CURRENTDATE
virtual bool IsInClipboard() const override
#define SAL_INFO(area, stream)
virtual void RemoveButton() override
sal_Int32 GetIndex() const
virtual SwPosition & GetMarkPos() const override
static VclPtr< reference_type > Create(Arg &&...arg)
virtual void SetMarkPos(const SwPosition &rNewPos)
void dumpAsXml(xmlTextWriterPtr pWriter) const
virtual void InitDoc(SwDoc &io_rDoc, sw::mark::InsertMode eMode, SwPosition const *pSepPos) override
void SetPortionPaintArea(const SwRect &rPortionPaintArea)
IFieldmark::parameter_map_t m_vParams
virtual const SwPosition & GetMarkEnd() const =0
virtual ~DateFieldmark() override
#define CH_TXT_ATR_FIELDEND
virtual void SetCurrentDate(double fDate) override
virtual void CallSwClientNotify(const SfxHint &rHint) const override
virtual OUString GetContent() const override
Fieldmark(const SwPaM &rPaM)
virtual sfx2::LinkManager & GetLinkManager()=0
virtual void SetHideCondition(const OUString &rHideCondition) override
struct _xmlTextWriter * xmlTextWriterPtr
tools::SvRef< SwServerObject > m_aRefObj
virtual const SwPosition & GetMarkStart() const =0
bool ReplaceRange(SwPaM &rPam, const OUString &rNewStr, const bool bRegExReplace) override
Replace selected range in a TextNode with string.
virtual void SetOtherMarkPos(const SwPosition &rNewPos)
#define CH_TXT_ATR_FIELDSEP
virtual void Invalidate() override
virtual IFieldmark::parameter_map_t * GetParameters() override
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
virtual const SwPosition & GetOtherMarkPos() const =0
OUString anyToString(uno::Any const &value)
bool m_bDetectedRangeSegmentation false
void Show(bool bVisible=true, ShowFlags nFlags=ShowFlags::NONE)
Base class of the Writer document model elements.
virtual OUString GetDateInStandardDateFormat(double fDate) const override