1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SDEXT_PRESENTER_CONFIGURATION_ACCESS_HXX
25 #define SDEXT_PRESENTER_CONFIGURATION_ACCESS_HXX
26 
27 #include <rtl/ustring.hxx>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/container/XNameAccess.hpp>
30 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
31 #include <com/sun/star/uno/XComponentContext.hpp>
32 #include <vector>
33 #include <boost/function.hpp>
34 
35 namespace css = ::com::sun::star;
36 
37 namespace sdext { namespace presenter {
38 
39 /** This class gives access to the configuration.  Create an object of this
40     class for one node of the configuration.  This will be the root node.
41     From this one you can use this class in two ways.
42 
43     <p>In a stateless mode (with exception of the root node) you can use static
44     methods for obtaining child nodes, get values from properties at leaf
45     nodes and iterate over children of inner nodes.</p>
46 
47     <p>In a stateful mode use non-static methods like GoToChild() to
48     navigate to children.</p>
49 
50     <p>Note to call CommitChanges() after making changes to
51     PresenterConfigurationAccess object that was opened in READ_WRITE mode.</p>
52 */
53 class PresenterConfigurationAccess
54 {
55 public:
56     enum WriteMode { READ_WRITE, READ_ONLY };
57     typedef ::boost::function<bool(
58         const ::rtl::OUString&,
59         const css::uno::Reference<css::beans::XPropertySet>&)> Predicate;
60     static const ::rtl::OUString msPresenterScreenRootName;
61 
62     /** Create a new object to access the configuration entries below the
63         given root.
64         @param rsRootName
65             Name of the root.  You can use msPresenterScreenRootName to
66             access the configuration of the presenter screen.
67         @param eMode
68             This flag specifies whether to give read-write or read-only
69             access.
70     */
71     PresenterConfigurationAccess(
72         const css::uno::Reference<css::uno::XComponentContext>& rxContext,
73         const ::rtl::OUString& rsRootName,
74         WriteMode eMode);
75 
76     ~PresenterConfigurationAccess (void);
77 
78     /** Return a configuration node below the root of the called object.
79         @param rsPathToNode
80             The relative path from the root (as given the constructor) to the node.
81     */
82     css::uno::Any GetConfigurationNode (
83         const ::rtl::OUString& rsPathToNode);
84     css::uno::Reference<css::beans::XPropertySet> GetNodeProperties (
85         const ::rtl::OUString& rsPathToNode);
86 
87     /** Return <TRUE/> when opening the configuration (via creating a new
88         PresenterConfigurationAccess object) or previous calls to
89         GoToChild() left the called PresenterConfigurationAccess object in a
90         valid state.
91     */
92     bool IsValid (void) const;
93 
94     /** Move the focused node to the (possibly indirect) child specified by the given path.
95     */
96     bool GoToChild (const ::rtl::OUString& rsPathToNode);
97 
98     /** Move the focused node to the first direct child that fulfills the the given predicate.
99     */
100     bool GoToChild (const Predicate& rPredicate);
101 
102     /** Modify the property child of the currently focused node.  Keep in
103         mind to call CommitChanges() to write the change back to the
104         configuration.
105     */
106     bool SetProperty (const ::rtl::OUString& rsPropertyName, const css::uno::Any& rValue);
107 
108     /** Return a configuration node below the given node.
109         @param rxNode
110             The node that acts as root to the given relative path.
111         @param rsPathToNode
112             The relative path from the given node to the requested node.
113             When this string is empty then rxNode is returned.
114         @return
115             The type of the returned node varies with the requested node.
116             It is empty when the node was not found.
117     */
118     static css::uno::Any GetConfigurationNode (
119         const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
120         const ::rtl::OUString& rsPathToNode);
121 
122     static css::uno::Reference<css::beans::XPropertySet> GetNodeProperties (
123         const css::uno::Reference<css::container::XHierarchicalNameAccess>& rxNode,
124         const ::rtl::OUString& rsPathToNode);
125 
126     /** Write any changes that have been made back to the configuration.
127         This call is ignored when the called ConfigurationAccess object was
128         not create with read-write mode.
129     */
130     void CommitChanges (void);
131 
132     css::uno::Any GetValue (const rtl::OUString& sKey);
133 
134     typedef ::boost::function<void(
135         const ::rtl::OUString&,
136         const ::std::vector<css::uno::Any>&) > ItemProcessor;
137     typedef ::boost::function<void(
138         const ::rtl::OUString&,
139         const ::css::uno::Reference<css::beans::XPropertySet>&) > PropertySetProcessor;
140 
141     /** Execute a functor for all elements of the given container.
142         @param rxContainer
143             The container is a XNameAccess to a list of the configuration.
144             This can be a node returned by GetConfigurationNode().
145         @param rArguments
146             The functor is called with arguments that are children of each
147             element of the container.  The set of children is specified  this
148             list.
149         @param rFunctor
150             The functor to be executed for some or all of the elements in
151             the given container.
152     */
153     static void ForAll (
154         const css::uno::Reference<css::container::XNameAccess>& rxContainer,
155         const ::std::vector<rtl::OUString>& rArguments,
156         const ItemProcessor& rProcessor);
157     static void ForAll (
158         const css::uno::Reference<css::container::XNameAccess>& rxContainer,
159         const PropertySetProcessor& rProcessor);
160 
161     /** Fill a list with the string contents of all sub-elements in the given container.
162         @param rxContainer
163             The container is a XNameAccess to a list of the configuration.
164             This can be a node returned by GetConfigurationNode().
165         @param rsArgument
166             This specifies which string children of the elements in the
167             container are to be inserted into the list.  The specified child
168             has to be of type string.
169         @param rList
170             The list to be filled.
171     */
172     static void FillList(
173         const css::uno::Reference<css::container::XNameAccess>& rxContainer,
174         const ::rtl::OUString& rsArgument,
175         ::std::vector<rtl::OUString>& rList);
176 
177     static css::uno::Any Find (
178         const css::uno::Reference<css::container::XNameAccess>& rxContainer,
179         const Predicate& rPredicate);
180 
181     static bool IsStringPropertyEqual (
182         const ::rtl::OUString& rsValue,
183         const ::rtl::OUString& rsPropertyName,
184         const css::uno::Reference<css::beans::XPropertySet>& rxNode);
185 
186     /** This method wraps a call to getPropertyValue() and returns an empty
187         Any instead of throwing an exception when the property does not
188         exist.
189     */
190     static css::uno::Any GetProperty (
191         const css::uno::Reference<css::beans::XPropertySet>& rxProperties,
192         const ::rtl::OUString& rsKey);
193 
194 private:
195     css::uno::Reference<css::uno::XInterface> mxRoot;
196     css::uno::Any maNode;
197 };
198 
199 } } // end of namespace sdext::tools
200 
201 #endif
202