Coverage Report

Created: 2025-07-07 10:01

/src/libreoffice/sw/source/uibase/inc/fldmgr.hxx
Line
Count
Source (jump to first uncovered line)
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
#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_FLDMGR_HXX
20
#define INCLUDED_SW_SOURCE_UIBASE_INC_FLDMGR_HXX
21
22
#include <fldbas.hxx>
23
#include <pam.hxx>
24
#include <swdllapi.h>
25
#include <names.hxx>
26
#include <com/sun/star/uno/Reference.h>
27
#include <com/sun/star/uno/Any.h>
28
#include <memory>
29
#include <optional>
30
#include <utility>
31
#include <vector>
32
33
namespace com::sun::star{
34
    namespace text{
35
        class XNumberingTypeInfo;
36
    }
37
}
38
39
class SwWrtShell;
40
class SwField;
41
class SwFieldType;
42
class SvNumberFormatter;
43
namespace weld { class Widget; class Window; }
44
enum class SwFieldIds : sal_uInt16;
45
46
// the groups of fields
47
enum SwFieldGroups
48
{
49
    GRP_DOC,
50
    GRP_FKT,
51
    GRP_REF,
52
    GRP_REG,
53
    GRP_DB,
54
    GRP_VAR
55
};
56
57
struct SwFieldGroupRgn
58
{
59
    sal_uInt16 nStart;
60
    sal_uInt16 nEnd;
61
};
62
63
// the field manager handles the insertation of fields
64
// with command strings
65
struct SwInsertField_Data
66
{
67
    SwFieldTypesEnum m_nTypeId;
68
    sal_uInt16 m_nSubType;
69
    const OUString m_sPar1;
70
    const OUString m_sPar2;
71
    sal_uInt32 m_nFormatId;
72
    SwWrtShell* m_pSh;
73
    sal_Unicode m_cSeparator;
74
    bool m_bIsAutomaticLanguage;
75
    css::uno::Any m_aDBDataSource;
76
    css::uno::Any m_aDBConnection;
77
    css::uno::Any m_aDBColumn;
78
    weld::Widget* m_pParent; // parent widget used for SwWrtShell::StartInputFieldDlg()
79
    /// Marks the PostIt field's annotation start/end if it differs from the cursor selection.
80
    std::optional<SwPaM> m_oAnnotationRange;
81
    std::optional<std::tuple<sal_uInt32, sal_uInt32, SwMarkName>> m_oParentId;
82
    bool m_bNeverExpand;
83
84
    SwInsertField_Data(SwFieldTypesEnum nType, sal_uInt16 nSub, OUString aPar1, OUString aPar2,
85
                       sal_uInt32 nFormatId, SwWrtShell* pShell = nullptr, sal_Unicode cSep = ' ',
86
                       bool bIsAutoLanguage = true, bool bNeverExpand = false)
87
0
        : m_nTypeId(nType)
88
0
        , m_nSubType(nSub)
89
0
        , m_sPar1(std::move(aPar1))
90
0
        , m_sPar2(std::move(aPar2))
91
0
        , m_nFormatId(nFormatId)
92
0
        , m_pSh(pShell)
93
0
        , m_cSeparator(cSep)
94
0
        , m_bIsAutomaticLanguage(bIsAutoLanguage)
95
0
        , m_pParent(nullptr)
96
0
        , m_bNeverExpand(bNeverExpand)
97
0
    {
98
0
    }
99
};
100
101
class SW_DLLPUBLIC SwFieldMgr
102
{
103
private:
104
    SwField*            m_pCurField;
105
    SwWrtShell*         m_pWrtShell; // can be ZERO too!
106
    OUString          m_aCurPar1;
107
    OUString          m_aCurPar2;
108
    OUString          m_sCurFrame;
109
110
    OUString          m_sMacroPath;
111
    OUString          m_sMacroName;
112
113
    bool            m_bEvalExp;
114
115
    SAL_DLLPRIVATE LanguageType    GetCurrLanguage() const;
116
117
    css::uno::Reference<css::text::XNumberingTypeInfo> m_xNumberingInfo;
118
    SAL_DLLPRIVATE css::uno::Reference<css::text::XNumberingTypeInfo> const & GetNumberingInfo()const;
119
120
public:
121
    explicit SwFieldMgr(SwWrtShell* pSh = nullptr);
122
    ~SwFieldMgr();
123
124
    void                SetWrtShell( SwWrtShell* pShell )
125
0
                        {   m_pWrtShell = pShell;     }
126
127
     // insert field using TypeID (TYP_ ...)
128
    bool InsertField( SwInsertField_Data& rData );
129
130
    // change the current field directly
131
    void            UpdateCurField(sal_uInt32 nFormat,
132
                                 const OUString& rPar1,
133
                                 const OUString& rPar2,
134
                                 std::unique_ptr<SwField> _pField = nullptr);
135
136
0
    const OUString& GetCurFieldPar1() const { return m_aCurPar1; }
137
0
    const OUString& GetCurFieldPar2() const { return m_aCurPar2; }
138
139
    // determine a field
140
    SwField*        GetCurField();
141
142
    void            InsertFieldType(SwFieldType const & rType);
143
144
    bool            ChooseMacro(weld::Window* pDialogParent);
145
    void            SetMacroPath(const OUString& rPath);
146
0
    const OUString& GetMacroPath() const         { return m_sMacroPath; }
147
0
    const OUString& GetMacroName() const         { return m_sMacroName; }
148
149
    // previous and next of the same type
150
    bool GoNextPrev( bool bNext = true, SwFieldType* pTyp = nullptr );
151
0
    bool GoNext()    { return GoNextPrev(); }
152
0
    bool GoPrev()    { return GoNextPrev( false ); }
153
154
    bool            IsDBNumeric(const OUString& rDBName, const OUString& rTableQryName,
155
                                    bool bIsTable, const OUString& rFieldName);
156
157
    // organise RefMark with names
158
    bool            CanInsertRefMark( const SwMarkName& rStr );
159
160
    // access to field types via ResId
161
    size_t          GetFieldTypeCount() const;
162
    SwFieldType*    GetFieldType(SwFieldIds nResId, size_t nField = 0) const;
163
    SwFieldType*    GetFieldType(SwFieldIds nResId, const OUString& rName) const;
164
165
    void            RemoveFieldType(SwFieldIds nResId, const OUString& rName);
166
167
    // access via TypeId from the dialog
168
    // Ids for a range of fields
169
    static const SwFieldGroupRgn& GetGroupRange(bool bHtmlMode, sal_uInt16 nGrpId);
170
    static sal_uInt16           GetGroup(SwFieldTypesEnum nTypeId, sal_uInt16 nSubType);
171
172
    // the current field's TypeId
173
    SwFieldTypesEnum    GetCurTypeId() const;
174
175
    // TypeId for a concrete position in the list
176
    static SwFieldTypesEnum GetTypeId(sal_uInt16 nPos);
177
    // name of the type in the list of fields
178
    static const OUString & GetTypeStr(sal_uInt16 nPos);
179
180
    // Pos in the list of fields
181
    static sal_uInt16   GetPos(SwFieldTypesEnum nTypeId);
182
183
    // subtypes to a type
184
    void                GetSubTypes(SwFieldTypesEnum nId, std::vector<OUString>& rToFill);
185
186
    // format to a type
187
    sal_uInt16          GetFormatCount(SwFieldTypesEnum nTypeId, bool bHtmlMode) const;
188
    OUString            GetFormatStr(SwFieldTypesEnum nTypeId, sal_uInt32 nFormatId) const;
189
    sal_uInt16          GetFormatId(SwFieldTypesEnum nTypeId, sal_uInt32 nFormatId) const;
190
    sal_uInt32          GetDefaultFormat(SwFieldTypesEnum nTypeId, bool bIsText, SvNumberFormatter* pFormatter);
191
192
    // turn off evaluation of expression fields for insertation
193
    // of many expression fields (see labels)
194
195
    inline void     SetEvalExpFields(bool bEval);
196
    void            EvalExpFields(SwWrtShell* pSh);
197
};
198
199
inline void SwFieldMgr::SetEvalExpFields(bool bEval)
200
0
    { m_bEvalExp = bEval; }
201
202
#endif
203
204
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */