LibreOffice Module sw (master) 1
annotationmark.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <algorithm>
21#include <annotationmark.hxx>
22
23#include <doc.hxx>
25#include <IDocumentState.hxx>
26#include <fldbas.hxx>
27#include <fmtfld.hxx>
28#include <docufld.hxx>
29#include <IDocumentUndoRedo.hxx>
30#include <UndoBookmark.hxx>
31#include <ndtxt.hxx>
32#include <txtfld.hxx>
33
34namespace sw::mark
35{
37 const SwPaM& rPaM,
38 const OUString& rName )
39 : MarkBase( rPaM, rName )
40 {
41 if ( rName.getLength() == 0 )
42 {
43 SetName( MarkBase::GenerateNewName(u"__Annotation__") );
44 }
45 }
46
48 {
49 }
50
52 sw::mark::InsertMode const, SwPosition const*const)
53 {
54 SwTextNode *pTextNode = GetMarkEnd().GetNode().GetTextNode();
55 assert(pTextNode);
56 SwTextField *const pTextField = pTextNode->GetFieldTextAttrAt(
57 GetMarkEnd().GetContentIndex()-1, ::sw::GetTextAttrMode::Default);
58 assert(pTextField != nullptr);
59 auto pPostItField
60 = dynamic_cast<const SwPostItField*>(pTextField->GetFormatField().GetField());
61 assert(pPostItField);
62 // use the annotation mark's name as the annotation name, if
63 // - the annotation field has an empty annotation name or
64 // - the annotation mark's name differs (on mark creation a name clash had been detected)
65 if ( pPostItField->GetName().isEmpty()
66 || pPostItField->GetName() != GetName() )
67 {
68 const_cast<SwPostItField*>(pPostItField)->SetName( GetName() );
69 }
70
71 if (io_rDoc.GetIDocumentUndoRedo().DoesUndo())
72 {
73 io_rDoc.GetIDocumentUndoRedo().AppendUndo( std::make_unique<SwUndoInsBookmark>(*this) );
74 }
76 }
77
79 {
80 SwDoc& rDoc = GetMarkPos().GetDoc();
81
82 const auto sName = GetName();
83 SwFieldType* pType = rDoc.getIDocumentFieldsAccess().GetFieldType( SwFieldIds::Postit, OUString(), false );
84 std::vector<SwFormatField*> vFields;
85 pType->GatherFields(vFields);
86 auto ppFound = std::find_if(vFields.begin(), vFields.end(), [&sName](SwFormatField* pF)
87 {
88 auto pPF = dynamic_cast<const SwPostItField*>(pF->GetField());
89 return pPF && pPF->GetName() == sName;
90 });
91 return ppFound != vFields.end() ? *ppFound : nullptr;
92 }
93}
94
95/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
virtual SwFieldType * GetFieldType(SwFieldIds nResId, const OUString &rName, bool bDbFieldMatching) const =0
virtual void SetModified()=0
Must be called manually at changes of format.
Definition: doc.hxx:197
IDocumentState const & getIDocumentState() const
Definition: doc.cxx:408
IDocumentUndoRedo & GetIDocumentUndoRedo()
Definition: doc.cxx:158
IDocumentFieldsAccess const & getIDocumentFieldsAccess() const
Definition: doc.cxx:371
Instances of SwFields and those derived from it occur 0 to n times.
Definition: fldbas.hxx:247
void GatherFields(std::vector< SwFormatField * > &rvFormatFields, bool bCollectOnlyInDocNodes=true) const
Definition: fldbas.cxx:205
const SwField * GetField() const
Definition: fmtfld.hxx:131
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
Definition: ndtxt.hxx:901
PaM is Point and Mark: a selection of the document model.
Definition: pam.hxx:188
const SwFormatField & GetFormatField() const
Definition: txatbase.hxx:199
SwTextNode is a paragraph in the document model.
Definition: ndtxt.hxx:112
SwTextField * GetFieldTextAttrAt(const sal_Int32 nIndex, ::sw::GetTextAttrMode const eMode=::sw::GetTextAttrMode::Expand) const
Definition: ndtxt.cxx:1849
AnnotationMark(const SwPaM &rPaM, const OUString &rName)
virtual void InitDoc(SwDoc &io_Doc, sw::mark::InsertMode eMode, SwPosition const *pSepPos) override
virtual ~AnnotationMark() override
const SwFormatField * GetAnnotationFormatField() const
const OUString & GetName() const override
SwPosition & GetMarkEnd() const override
void SetName(const OUString &rName)
SwPosition & GetMarkPos() const override
static OUString GenerateNewName(std::u16string_view rPrefix)
float u
OUString sName
InsertMode
Definition: IMark.hxx:32
Marks a position in the document model.
Definition: pam.hxx:38
SwNode & GetNode() const
Definition: pam.hxx:81
SwDoc & GetDoc() const
Returns the document this position is in.
Definition: pam.cxx:218