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 & 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: */
|