summaryrefslogtreecommitdiff
path: root/include/unotools/configitem.hxx
blob: 7692bd3d6c9e4c90796021c94b8a2a12e39697fb (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
/* -*- 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_UNOTOOLS_CONFIGITEM_HXX
#define INCLUDED_UNOTOOLS_CONFIGITEM_HXX

#include <sal/types.h>
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/uno/Reference.h>
#include <unotools/unotoolsdllapi.h>
#include <unotools/options.hxx>
#include <o3tl/typed_flags_set.hxx>

namespace com::sun::star {
    namespace uno{
        class Any;
    }
    namespace beans{
        struct PropertyValue;
    }
    namespace container{
        class XHierarchicalNameAccess;
    }
    namespace util{
        class XChangesListener;
    }
}

enum class ConfigItemMode
{
    NONE               = 0x00,
    AllLocales         = 0x02,
    ReleaseTree        = 0x04,
};

namespace o3tl
{
    template<> struct typed_flags<ConfigItemMode> : is_typed_flags<ConfigItemMode, 0x06> {};
}

namespace utl
{

    enum class ConfigNameFormat
    {
        LocalNode,     // local node name, for use in XNameAccess etc. ("Item", "Q & A")
        LocalPath,     // one-level relative path, for use when building paths etc.  ("Item", "Typ['Q &amp; A']")
    };

    class UNOTOOLS_DLLPUBLIC ConfigItem : public ConfigurationBroadcaster
    {
            friend class ConfigChangeListener_Impl;
            friend class ConfigManager;

            const OUString              sSubTree;
            css::uno::Reference< css::container::XHierarchicalNameAccess>
                                        m_xHierarchyAccess;
            css::uno::Reference< css::util::XChangesListener >
                                        xChangeLstnr;
            ConfigItemMode              m_nMode;
            bool                        m_bIsModified;
            bool                        m_bEnableInternalNotification;
            sal_Int16                   m_nInValueChange;

            void                    RemoveChangesListener();
            void                    CallNotify(
                                const css::uno::Sequence<OUString>& aPropertyNames);

            // In special mode ALL_LOCALES we must support reading/writing of localized cfg entries as Sequence< PropertyValue >.
            // These methods are helper to convert given lists of names and Any-values.
            // format:  PropertyValue.Name  = <locale as ISO string>
            //          PropertyValue.Value = <value; type depends from cfg entry!>
            // e.g.
            //          LOCALIZED NODE
            //          "UIName"
            //                      LOCALE      VALUE
            //                      "de"        "Mein Name"
            //                      "en-US"     "my name"
            static void impl_packLocalizedProperties   (   const   css::uno::Sequence< OUString >&                  lInNames    ,
                                                    const   css::uno::Sequence< css::uno::Any >&  lInValues   ,
                                                            css::uno::Sequence< css::uno::Any >&  lOutValues  );
            static void impl_unpackLocalizedProperties (
                        const   css::uno::Sequence< OUString >&                  lInNames    ,
                        const   css::uno::Sequence< css::uno::Any >&  lInValues   ,
                                css::uno::Sequence< OUString >&                  lOutNames   ,
                                css::uno::Sequence< css::uno::Any >&  lOutValues);

            css::uno::Reference< css::container::XHierarchicalNameAccess>
                                        GetTree();
            /** writes the changed values into the sub tree.
                Private and only called from non-virtual public Commit().  */
            virtual void            ImplCommit() = 0;

        protected:
            explicit ConfigItem(OUString aSubTree,
                        ConfigItemMode nMode = ConfigItemMode::NONE);

            void                    SetModified  (); // mark item as modified
            void                    ClearModified(); // reset state after commit!

            css::uno::Sequence< css::uno::Any>
                                    GetProperties(const css::uno::Sequence< OUString >& rNames);

            css::uno::Sequence< sal_Bool >
                                    GetReadOnlyStates(const css::uno::Sequence< OUString >& rNames);

            bool                PutProperties(
                                        const css::uno::Sequence< OUString >& rNames,
                                        const css::uno::Sequence< css::uno::Any>& rValues);

            /** enables notifications about changes on selected sub nodes/values

                Before calling this method a second time for a possibly changed node/value set,
                you must disable the current notifications by calling DisableNotification.

                @see Notify
                @see DisableNotification
            */
            bool                EnableNotification(const css::uno::Sequence< OUString >& rNames,
                                        bool bEnableInternalNotification = false);
            /** disables notifications about changes on sub nodes/values, which previously had
                been enabled with EnableNotification
                @see Notify
                @see EnableNotification
            */
            void                    DisableNotification();

            //returns all members of a node in a specific format
            css::uno::Sequence< OUString >
                                    GetNodeNames(const OUString& rNode);
            //returns all members of a node in a specific format
            css::uno::Sequence< OUString >
                                    GetNodeNames(const OUString& rNode, ConfigNameFormat eFormat);
            // remove all members of a set
            bool                ClearNodeSet(const OUString& rNode);
            // remove selected members of a set
            bool                ClearNodeElements(const OUString& rNode,
                                        css::uno::Sequence< OUString > const & rElements);
            // change or add members to a set
            bool                SetSetProperties(const OUString& rNode, const css::uno::Sequence< css::beans::PropertyValue >& rValues);
            // remove, change or add members of a set
            bool                ReplaceSetProperties(const OUString& rNode, const css::uno::Sequence< css::beans::PropertyValue >& rValues);
            // add a new node without setting any properties
            bool                AddNode(const OUString& rNode, const OUString& rNewNode);

        public:
            virtual ~ConfigItem() override;

            ConfigItem(ConfigItem const &) = default;
            ConfigItem(ConfigItem &&) = default;
            ConfigItem & operator =(ConfigItem const &) = delete; // due to const sSubTree
            ConfigItem & operator =(ConfigItem &&) = delete; // due to const sSubTree

            /** is called from the ConfigManager before application ends of from the
                PropertyChangeListener if the sub tree broadcasts changes. */
            virtual void            Notify( const css::uno::Sequence<OUString>& aPropertyNames)=0;

            const OUString&         GetSubTreeName() const {return sSubTree;}

            bool IsModified() const { return m_bIsModified;}

            void                    Commit();

            ConfigItemMode GetMode() const { return m_nMode;}

            //returns all members of a node in a specific format
            static css::uno::Sequence< OUString > GetNodeNames(
                    css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess,
                    const OUString& rNode, ConfigNameFormat eFormat);
            static css::uno::Sequence< css::uno::Any> GetProperties(
                    css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess,
                    const css::uno::Sequence< OUString >& rNames,
                    bool bAllLocales);
            static bool PutProperties(
                    css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess,
                    const css::uno::Sequence< OUString >& rNames,
                    const css::uno::Sequence< css::uno::Any>& rValues,
                    bool bAllLocales);
            // remove all members of a set
            static bool ClearNodeSet(
                    css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess,
                    const OUString& rNode);
            // remove, change or add members of a set
            static bool ReplaceSetProperties(
                    css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess,
                    const OUString& rNode,
                    const css::uno::Sequence< css::beans::PropertyValue >& rValues,
                    bool bAllLocales);
            // change or add members to a set
            static bool SetSetProperties(
                    css::uno::Reference<css::container::XHierarchicalNameAccess> const & xHierarchyAccess,
                    const OUString& rNode,
                    const css::uno::Sequence< css::beans::PropertyValue >& rValues);
    };
}//namespace utl
#endif // INCLUDED_UNOTOOLS_CONFIGITEM_HXX

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