summaryrefslogtreecommitdiffstats
path: root/sw/inc/authfld.hxx
blob: 6996f5090b6891597a540343d4c0068b3e8e1651 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/* -*- 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 .
 */
#ifndef INCLUDED_SW_INC_AUTHFLD_HXX
#define INCLUDED_SW_INC_AUTHFLD_HXX

#include <sal/config.h>

#include "swdllapi.h"
#include "fldbas.hxx"
#include "toxe.hxx"
#include <rtl/ref.hxx>
#include <sal/log.hxx>
#include <salhelper/simplereferenceobject.hxx>

#include <memory>
#include <vector>

class SwTOXInternational;
class SwTextAttr;
class SwForm;

class SwAuthEntry final : public salhelper::SimpleReferenceObject
{
friend class SwAuthorityFieldType;
    OUString        m_aAuthFields[AUTH_FIELD_END];
public:
    SwAuthEntry() = default;
    SwAuthEntry( const SwAuthEntry& rCopy );
    bool            operator==(const SwAuthEntry& rComp) const;

    inline OUString const & GetAuthorField(ToxAuthorityField ePos) const;
    inline void             SetAuthorField(ToxAuthorityField ePos,
                                            const OUString& rField);
    void dumpAsXml(xmlTextWriterPtr pWriter) const;
};

struct SwTOXSortKey
{
    ToxAuthorityField   eField;
    bool                bSortAscending;
    SwTOXSortKey() :
        eField(AUTH_FIELD_END),
        bSortAscending(true){}
};

typedef std::vector<SwTOXSortKey> SortKeyArr;
typedef std::vector<rtl::Reference<SwAuthEntry>> SwAuthDataArr;

class SW_DLLPUBLIC SwAuthorityFieldType final : public SwFieldType
{
    SwDoc*                  m_pDoc;
    SwAuthDataArr           m_DataArr;
    std::vector<SwAuthEntry*> m_SequArr;
    std::vector<SwAuthEntry*> m_SequArrRLHidden; ///< hidden redlines
    SortKeyArr              m_SortKeyArr;
    sal_Unicode             m_cPrefix;
    sal_Unicode             m_cSuffix;
    bool                    m_bIsSequence :1;
    bool                    m_bSortByDocument :1;
    LanguageType            m_eLanguage;
    OUString                m_sSortAlgorithm;

    virtual void SwClientNotify(const SwModify&, const SfxHint&) override;

public:
    SwAuthorityFieldType(SwDoc* pDoc);
    virtual ~SwAuthorityFieldType() override;

    virtual std::unique_ptr<SwFieldType> Copy() const override;

    virtual void        QueryValue( css::uno::Any& rVal, sal_uInt16 nWhichId ) const override;
    virtual void        PutValue( const css::uno::Any& rVal, sal_uInt16 nWhichId ) override;

    void                SetDoc(SwDoc* pNewDoc)              { m_pDoc = pNewDoc; }
    SwDoc*              GetDoc(){ return m_pDoc; }
    void                RemoveField(const SwAuthEntry* nHandle);
    SwAuthEntry*        AddField(std::u16string_view rFieldContents);
    void                DelSequenceArray()
                        {
                            m_SequArr.clear();
                            m_SequArrRLHidden.clear();
                        }

    void                GetAllEntryIdentifiers( std::vector<OUString>& rToFill ) const;
    SwAuthEntry*        GetEntryByIdentifier(std::u16string_view rIdentifier) const;

    bool                ChangeEntryContent(const SwAuthEntry* pNewEntry);
    // import interface
    SwAuthEntry*        AppendField(const SwAuthEntry& rInsert);

    sal_uInt16          GetSequencePos(const SwAuthEntry* pAuthEntry, SwRootFrame const* pLayout);
    std::unique_ptr<SwTOXInternational> CreateTOXInternational() const;

    bool                IsSequence() const      {return m_bIsSequence;}
    void                SetSequence(bool bSet)
                            {
                                DelSequenceArray();
                                m_bIsSequence = bSet;
                            }

    void                SetPreSuffix( sal_Unicode cPre, sal_Unicode cSuf)
                            {
                                m_cPrefix = cPre;
                                m_cSuffix = cSuf;
                            }
    sal_Unicode         GetPrefix() const { return m_cPrefix;}
    sal_Unicode         GetSuffix() const { return m_cSuffix;}

    bool                IsSortByDocument() const {return m_bSortByDocument;}
    void                SetSortByDocument(bool bSet)
                            {
                                DelSequenceArray();
                                m_bSortByDocument = bSet;
                            }

    sal_uInt16          GetSortKeyCount() const ;
    const SwTOXSortKey* GetSortKey(sal_uInt16 nIdx) const ;
    void                SetSortKeys(sal_uInt16 nKeyCount, SwTOXSortKey const nKeys[]);

    //initui.cxx
    static OUString const & GetAuthFieldName(ToxAuthorityField eType);
    static OUString const & GetAuthTypeName(ToxAuthorityType eType);

    LanguageType    GetLanguage() const {return m_eLanguage;}
    void            SetLanguage(LanguageType nLang)  {m_eLanguage = nLang;}

    const OUString& GetSortAlgorithm() const {return m_sSortAlgorithm;}
    void            SetSortAlgorithm(const OUString& rSet) {m_sSortAlgorithm = rSet;}
    void dumpAsXml(xmlTextWriterPtr pWriter) const override;

};

/** Represents an inserted bibliography entry, created using Insert -> Table of Contents and Index
    -> Bibliography Entry.

    invariant for SwAuthorityField is that it is always registered at its
    SwAuthorityFieldType via AddField()/RemoveField() & therefore has m_nHandle
    set - but it's possible that multiple SwAuthorityField have the same
    m_nHandle & so the number of instances is an upper bound on
    SwAuthorityField::m_DataArr.size() - it's not clear to me if more than one
    one of the instances with the same m_nHandle is actually in the document,
    they're all cloned via CopyField()...
 */
class SW_DLLPUBLIC SwAuthorityField final : public SwField
{
    rtl::Reference<SwAuthEntry>  m_xAuthEntry;
    mutable sal_IntPtr  m_nTempSequencePos;
    mutable sal_IntPtr  m_nTempSequencePosRLHidden; ///< hidden redlines

    virtual OUString    ExpandImpl(SwRootFrame const* pLayout) const override;
    virtual std::unique_ptr<SwField> Copy() const override;

public:
    enum TargetType : sal_uInt16
    {
        UseDisplayURL           = 0,
        UseTargetURL            = 1,
        None                    = 2,
        BibliographyTableRow    = 3,
        // BibliographyTablePage   = 4, // TODO: implement
    };


    /// For internal use only, in general continue using ExpandField() instead.
    OUString ConditionalExpandAuthIdentifier(SwRootFrame const* pLayout) const;

    //To handle Citation
    OUString ExpandCitation(ToxAuthorityField eField, SwRootFrame const* pLayout) const;

    SwAuthorityField(SwAuthorityFieldType* pType, std::u16string_view rFieldContents);
    SwAuthorityField(SwAuthorityFieldType* pType, SwAuthEntry* pAuthEntry);
    virtual ~SwAuthorityField() override;

    const OUString &    GetFieldText(ToxAuthorityField eField) const;

    virtual void        SetPar1(const OUString& rStr) override;
    virtual SwFieldType* ChgTyp( SwFieldType* ) override;

    virtual bool        QueryValue( css::uno::Any& rVal, sal_uInt16 nWhichId ) const override;
    virtual bool        PutValue( const css::uno::Any& rVal, sal_uInt16 nWhichId ) override;

    SwAuthEntry*        GetAuthEntry() const       { return m_xAuthEntry.get(); }

    virtual OUString GetDescription() const override;

    /**
     * Returns the line matching the source's default row in the ToX.
     *
     * \param   pLayout     layout to be used
     * \param   pTOX        bibliography table to take the format of the string from
     * \return              entry formatted as the appropriate authority type in the table
     */
    OUString GetAuthority(const SwRootFrame *pLayout,
                          const SwForm *pTOX = nullptr) const;

    /**
     * Returns which target should be used when the entry
     *   (the standalone field, such as '[ASDF]', not in the table) is clicked.
     */
    TargetType GetTargetType() const;
    /**
     * Returns absolute target URL in case there is one (GetTargetType() should be checked).
     *   If there isn't one, the result is undefined.
     */
    OUString GetAbsoluteURL() const;

    /**
     * Returns relative URI for the URL
     */
    OUString GetRelativeURI() const;

    void dumpAsXml(xmlTextWriterPtr pWriter) const override;
};

inline OUString const & SwAuthEntry::GetAuthorField(ToxAuthorityField ePos) const
{
    SAL_WARN_IF(AUTH_FIELD_END <= ePos, "sw", "wrong index");
    return m_aAuthFields[ePos];
}
inline void SwAuthEntry::SetAuthorField(ToxAuthorityField ePos, const OUString& rField)
{
    SAL_WARN_IF(AUTH_FIELD_END <= ePos, "sw", "wrong index");
    if(AUTH_FIELD_END > ePos)
        m_aAuthFields[ePos] = rField;
}

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */