xref: /trunk/main/odk/examples/DevelopersGuide/Config/ConfigExamples.java (revision 002e2b2b0f316c060b83ff39613d9c63682a4d0d)
134dd1e25SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
334dd1e25SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
434dd1e25SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
534dd1e25SAndrew Rist  * distributed with this work for additional information
634dd1e25SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
734dd1e25SAndrew Rist  * to you under the Apache License, Version 2.0 (the
834dd1e25SAndrew Rist  * "License"); you may not use this file except in compliance
934dd1e25SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
1134dd1e25SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
1334dd1e25SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1434dd1e25SAndrew Rist  * software distributed under the License is distributed on an
1534dd1e25SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1634dd1e25SAndrew Rist  * KIND, either express or implied.  See the License for the
1734dd1e25SAndrew Rist  * specific language governing permissions and limitations
1834dd1e25SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
2034dd1e25SAndrew Rist  *************************************************************/
2134dd1e25SAndrew Rist 
2234dd1e25SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // Import everything we use
25cdf0e10cSrcweir 
26cdf0e10cSrcweir import com.sun.star.beans.XPropertySet;
27cdf0e10cSrcweir import com.sun.star.beans.XMultiPropertySet;
28cdf0e10cSrcweir import com.sun.star.beans.XHierarchicalPropertySet;
29cdf0e10cSrcweir import com.sun.star.beans.XMultiHierarchicalPropertySet;
30cdf0e10cSrcweir import com.sun.star.beans.XPropertyState;
31cdf0e10cSrcweir import com.sun.star.beans.XMultiPropertyStates;
32cdf0e10cSrcweir 
33cdf0e10cSrcweir import com.sun.star.bridge.XUnoUrlResolver;
34cdf0e10cSrcweir 
35cdf0e10cSrcweir import com.sun.star.configuration.XTemplateInstance;
36cdf0e10cSrcweir 
37cdf0e10cSrcweir import com.sun.star.container.XNameAccess;
38cdf0e10cSrcweir import com.sun.star.container.XNameReplace;
39cdf0e10cSrcweir import com.sun.star.container.XNameContainer;
40cdf0e10cSrcweir import com.sun.star.container.XNamed;
41cdf0e10cSrcweir import com.sun.star.container.XChild;
42cdf0e10cSrcweir import com.sun.star.container.XHierarchicalNameAccess;
43cdf0e10cSrcweir import com.sun.star.container.XHierarchicalName;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir import com.sun.star.lang.XComponent;
46cdf0e10cSrcweir import com.sun.star.lang.XMultiComponentFactory;
47cdf0e10cSrcweir import com.sun.star.lang.XSingleServiceFactory;
48cdf0e10cSrcweir import com.sun.star.lang.XMultiServiceFactory;
49cdf0e10cSrcweir import com.sun.star.lang.XMultiComponentFactory;
50cdf0e10cSrcweir import com.sun.star.lang.XServiceInfo;
51cdf0e10cSrcweir import com.sun.star.lang.EventObject;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir import com.sun.star.uno.UnoRuntime;
54cdf0e10cSrcweir import com.sun.star.uno.XComponentContext;
55cdf0e10cSrcweir import com.sun.star.uno.XInterface;
56cdf0e10cSrcweir import com.sun.star.uno.XNamingService;
57cdf0e10cSrcweir import com.sun.star.uno.AnyConverter;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir import com.sun.star.util.XChangesBatch;
60cdf0e10cSrcweir import com.sun.star.util.XChangesNotifier;
61cdf0e10cSrcweir import com.sun.star.util.XChangesListener;
62cdf0e10cSrcweir import com.sun.star.util.ChangesEvent;
63cdf0e10cSrcweir /** Config examples
64cdf0e10cSrcweir     @author Joerg Barfurth
65cdf0e10cSrcweir  */
66cdf0e10cSrcweir 
67cdf0e10cSrcweir /* These examples show how to use the following features of the Config API:
68cdf0e10cSrcweir 
69cdf0e10cSrcweir     o Accessing data
70cdf0e10cSrcweir     o Updating data
71cdf0e10cSrcweir     o Updating properties in groups
72cdf0e10cSrcweir     o Adding and removing items in sets
73cdf0e10cSrcweir     o Resetting data to their defaults
74cdf0e10cSrcweir 
75cdf0e10cSrcweir    Each example is in a separate method call.
76cdf0e10cSrcweir */
77cdf0e10cSrcweir public class ConfigExamples
78cdf0e10cSrcweir {
79cdf0e10cSrcweir     // The ComponentContext interface of the remote component context
80cdf0e10cSrcweir     private XComponentContext mxContext = null;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir     // The MultiComponentFactory interface of the ServiceManager
83cdf0e10cSrcweir     private XMultiComponentFactory mxServiceManager = null;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir     // The MultiServiceFactory interface of the ConfigurationProvider
86cdf0e10cSrcweir     private XMultiServiceFactory mxProvider = null;
87cdf0e10cSrcweir 
main( String args[] )88cdf0e10cSrcweir     public static void main( String args[] )
89cdf0e10cSrcweir     {
90cdf0e10cSrcweir         try {
91cdf0e10cSrcweir             // get the remote office component context
92cdf0e10cSrcweir             com.sun.star.uno.XComponentContext xContext =
93cdf0e10cSrcweir                 com.sun.star.comp.helper.Bootstrap.bootstrap();
94cdf0e10cSrcweir 
95cdf0e10cSrcweir             if( xContext != null )
96cdf0e10cSrcweir                 System.out.println("Connected to a running office ...");
97cdf0e10cSrcweir             else
98cdf0e10cSrcweir                 System.out.println( "ERROR: Cannot connect - no remote component context available." );
99cdf0e10cSrcweir 
100cdf0e10cSrcweir             // Create an instance of the class and call it's run method
101cdf0e10cSrcweir             ConfigExamples aExample = new ConfigExamples(xContext);
102cdf0e10cSrcweir             aExample.run( );
103cdf0e10cSrcweir 
104cdf0e10cSrcweir             // if you own the service manager dispose it here
105cdf0e10cSrcweir             // to ensure that the default provider is properly disposed and flushed
106cdf0e10cSrcweir             System.exit(0);
107cdf0e10cSrcweir         }
108cdf0e10cSrcweir         catch( Exception e )
109cdf0e10cSrcweir         {
110cdf0e10cSrcweir             e.printStackTrace();
111cdf0e10cSrcweir             System.exit(-1);
112cdf0e10cSrcweir         }
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir 
115cdf0e10cSrcweir     /** Create a ConfigExamples instance supplying a service factory
116cdf0e10cSrcweir     */
ConfigExamples(XComponentContext xContext)117cdf0e10cSrcweir     public ConfigExamples(XComponentContext xContext)
118cdf0e10cSrcweir     {
119cdf0e10cSrcweir         mxContext = xContext;
120cdf0e10cSrcweir         mxServiceManager = xContext.getServiceManager();
121cdf0e10cSrcweir     }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir     /** Run the examples with a default ConfigurationProvider
124cdf0e10cSrcweir     */
run()125cdf0e10cSrcweir     public void run()
126cdf0e10cSrcweir         throws com.sun.star.uno.Exception
127cdf0e10cSrcweir     {
128cdf0e10cSrcweir         mxProvider = createProvider();
129cdf0e10cSrcweir 
130cdf0e10cSrcweir         runExamples( );
131cdf0e10cSrcweir 
132cdf0e10cSrcweir         // we are using the default ConfigurationProvider, so we must not dispose it
133cdf0e10cSrcweir         mxProvider = null;
134cdf0e10cSrcweir     }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     /** Run the examples with a given ConfigurationProvider
137cdf0e10cSrcweir     */
runExamples( )138cdf0e10cSrcweir     public void runExamples( )
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir         if (checkProvider(mxProvider))
141cdf0e10cSrcweir         {
142cdf0e10cSrcweir             System.out.println("\nStarting examples.");
143cdf0e10cSrcweir 
144cdf0e10cSrcweir             readDataExample();
145cdf0e10cSrcweir 
146cdf0e10cSrcweir             browseDataExample();
147cdf0e10cSrcweir 
148cdf0e10cSrcweir             updateGroupExample();
149cdf0e10cSrcweir 
150cdf0e10cSrcweir             resetGroupExample();
151cdf0e10cSrcweir 
152cdf0e10cSrcweir             updateSetExample();
153cdf0e10cSrcweir 
154cdf0e10cSrcweir             System.out.println("\nAll Examples completed.");
155cdf0e10cSrcweir         }
156cdf0e10cSrcweir         else
157cdf0e10cSrcweir             System.out.println("ERROR: Cannot run examples without ConfigurationProvider.");
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     }
160cdf0e10cSrcweir 
161*002e2b2bSmseidel     /** Do some simple checks, if there is a valid ConfigurationProvider
162cdf0e10cSrcweir     */
checkProvider(XMultiServiceFactory xProvider)163cdf0e10cSrcweir     public static boolean checkProvider(XMultiServiceFactory xProvider)
164cdf0e10cSrcweir     {
165cdf0e10cSrcweir         // check the provider we have
166cdf0e10cSrcweir         if (xProvider == null)
167cdf0e10cSrcweir         {
168cdf0e10cSrcweir             System.out.println("No provider available. Cannot access configuration data.");
169cdf0e10cSrcweir             return false;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir         }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         try
174cdf0e10cSrcweir         {
175cdf0e10cSrcweir             // check the provider implementation
176cdf0e10cSrcweir             XServiceInfo xProviderServices =
177cdf0e10cSrcweir                 (XServiceInfo) UnoRuntime.queryInterface( XServiceInfo.class, xProvider );
178cdf0e10cSrcweir 
179cdf0e10cSrcweir             if (xProviderServices == null ||
180cdf0e10cSrcweir                 !xProviderServices.supportsService("com.sun.star.configuration.ConfigurationProvider"))
181cdf0e10cSrcweir             {
182cdf0e10cSrcweir                 System.out.println("WARNING: The provider is not a com.sun.star.configuration.ConfigurationProvider");
183cdf0e10cSrcweir             }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir             if (xProviderServices != null)
186cdf0e10cSrcweir             {
187cdf0e10cSrcweir                 System.out.println("Using provider implementation: " + xProviderServices.getImplementationName());
188cdf0e10cSrcweir             }
189cdf0e10cSrcweir 
190cdf0e10cSrcweir             return true;
191cdf0e10cSrcweir         }
192cdf0e10cSrcweir         catch (com.sun.star.uno.RuntimeException e)
193cdf0e10cSrcweir         {
194cdf0e10cSrcweir             System.err.println("ERROR: Failure while checking the provider services.");
195cdf0e10cSrcweir             e.printStackTrace();
196cdf0e10cSrcweir             return false;
197cdf0e10cSrcweir         }
198cdf0e10cSrcweir     }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     /** Get the provider we have
201cdf0e10cSrcweir      */
getProvider( )202cdf0e10cSrcweir     public XMultiServiceFactory getProvider( )
203cdf0e10cSrcweir     {
204cdf0e10cSrcweir         return mxProvider;
205cdf0e10cSrcweir     }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     /** Create a default configuration provider
208cdf0e10cSrcweir      */
createProvider( )209cdf0e10cSrcweir     public XMultiServiceFactory createProvider( )
210cdf0e10cSrcweir         throws com.sun.star.uno.Exception
211cdf0e10cSrcweir     {
212cdf0e10cSrcweir         final String sProviderService = "com.sun.star.configuration.ConfigurationProvider";
213cdf0e10cSrcweir 
214cdf0e10cSrcweir         // create the provider and return it as a XMultiServiceFactory
215cdf0e10cSrcweir         XMultiServiceFactory xProvider = (XMultiServiceFactory)
216cdf0e10cSrcweir             UnoRuntime.queryInterface(XMultiServiceFactory.class,
217cdf0e10cSrcweir                 mxServiceManager.createInstanceWithContext(sProviderService,
218cdf0e10cSrcweir                                                            mxContext));
219cdf0e10cSrcweir 
220cdf0e10cSrcweir         return xProvider;
221cdf0e10cSrcweir     }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     /** Create a specified read-only configuration view
224cdf0e10cSrcweir      */
createConfigurationView( String sPath )225cdf0e10cSrcweir     public Object createConfigurationView( String sPath )
226cdf0e10cSrcweir         throws com.sun.star.uno.Exception
227cdf0e10cSrcweir     {
228cdf0e10cSrcweir         XMultiServiceFactory xProvider = getProvider();
229cdf0e10cSrcweir 
230cdf0e10cSrcweir         // The service name: Need only read access:
231cdf0e10cSrcweir         final String sReadOnlyView = "com.sun.star.configuration.ConfigurationAccess";
232cdf0e10cSrcweir 
233cdf0e10cSrcweir         // creation arguments: nodepath
234cdf0e10cSrcweir         com.sun.star.beans.PropertyValue aPathArgument = new com.sun.star.beans.PropertyValue();
235cdf0e10cSrcweir         aPathArgument.Name = "nodepath";
236cdf0e10cSrcweir         aPathArgument.Value = sPath;
237cdf0e10cSrcweir 
238cdf0e10cSrcweir         Object[] aArguments = new Object[1];
239cdf0e10cSrcweir         aArguments[0] = aPathArgument;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir         // create the view
242cdf0e10cSrcweir         Object xViewRoot = xProvider.createInstanceWithArguments(sReadOnlyView, aArguments);
243cdf0e10cSrcweir 
244cdf0e10cSrcweir         return xViewRoot;
245cdf0e10cSrcweir     }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir     /** Create a specified updatable configuration view
248cdf0e10cSrcweir      */
createUpdatableView( String sPath )249cdf0e10cSrcweir     Object createUpdatableView( String sPath )
250cdf0e10cSrcweir         throws com.sun.star.uno.Exception
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         XMultiServiceFactory xProvider = getProvider();
253cdf0e10cSrcweir 
254cdf0e10cSrcweir         // The service name: Need update access:
255cdf0e10cSrcweir         final String cUpdatableView = "com.sun.star.configuration.ConfigurationUpdateAccess";
256cdf0e10cSrcweir 
257cdf0e10cSrcweir         // creation arguments: nodepath
258cdf0e10cSrcweir         com.sun.star.beans.PropertyValue aPathArgument = new com.sun.star.beans.PropertyValue();
259cdf0e10cSrcweir         aPathArgument.Name = "nodepath";
260cdf0e10cSrcweir         aPathArgument.Value = sPath;
261cdf0e10cSrcweir 
262cdf0e10cSrcweir         Object[] aArguments = new Object[1];
263cdf0e10cSrcweir         aArguments[0] = aPathArgument;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir         // create the view
266cdf0e10cSrcweir         Object xViewRoot = xProvider.createInstanceWithArguments(cUpdatableView, aArguments);
267cdf0e10cSrcweir 
268cdf0e10cSrcweir         return xViewRoot;
269cdf0e10cSrcweir     }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir     /** This method demonstrates read access to data
272cdf0e10cSrcweir      */
readDataExample()273cdf0e10cSrcweir     protected void readDataExample ()
274cdf0e10cSrcweir     {
275cdf0e10cSrcweir         try
276cdf0e10cSrcweir         {
277cdf0e10cSrcweir             System.out.println("\n--- starting example: read grid option settings --------------------");
278cdf0e10cSrcweir             Object aData = readGridConfiguration( );
279cdf0e10cSrcweir             System.out.println("Read grid options: " + aData);
280cdf0e10cSrcweir 
281cdf0e10cSrcweir         }
282cdf0e10cSrcweir         catch ( Exception e )
283cdf0e10cSrcweir         {
284cdf0e10cSrcweir             e.printStackTrace();
285cdf0e10cSrcweir         }
286cdf0e10cSrcweir     }
287cdf0e10cSrcweir 
288cdf0e10cSrcweir     /** This method demonstrates browsing access to data
289cdf0e10cSrcweir      */
browseDataExample()290cdf0e10cSrcweir     protected void browseDataExample ()
291cdf0e10cSrcweir     {
292cdf0e10cSrcweir         try
293cdf0e10cSrcweir         {
294cdf0e10cSrcweir             System.out.println("\n--- starting example: browse filter configuration ------------------");
295cdf0e10cSrcweir             printRegisteredFilters( );
296cdf0e10cSrcweir         }
297cdf0e10cSrcweir         catch ( Exception e )
298cdf0e10cSrcweir         {
299cdf0e10cSrcweir             e.printStackTrace();
300cdf0e10cSrcweir         }
301cdf0e10cSrcweir     }
302cdf0e10cSrcweir 
303cdf0e10cSrcweir     /** This method demonstrates update access to group data
304cdf0e10cSrcweir      */
updateGroupExample()305cdf0e10cSrcweir     protected void updateGroupExample ()
306cdf0e10cSrcweir     {
307cdf0e10cSrcweir         try
308cdf0e10cSrcweir         {
309cdf0e10cSrcweir             System.out.println("\n--- starting example: update group data --------------");
310cdf0e10cSrcweir             editGridOptions( );
311cdf0e10cSrcweir         }
312cdf0e10cSrcweir         catch ( Exception e )
313cdf0e10cSrcweir         {
314cdf0e10cSrcweir             e.printStackTrace();
315cdf0e10cSrcweir         }
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir     /** This method demonstrates resetting data to its default state
319cdf0e10cSrcweir      */
resetGroupExample()320cdf0e10cSrcweir     protected void resetGroupExample ()
321cdf0e10cSrcweir     {
322cdf0e10cSrcweir         try
323cdf0e10cSrcweir         {
324cdf0e10cSrcweir             System.out.println("\n--- starting example: reset group data -----------------------------");
325cdf0e10cSrcweir             Object aOldData = readGridConfiguration( );
326cdf0e10cSrcweir             resetGridConfiguration( );
327cdf0e10cSrcweir             Object aNewData = readGridConfiguration( );
328cdf0e10cSrcweir             System.out.println("Before reset:   user grid options: " + aOldData);
329cdf0e10cSrcweir             System.out.println("After reset: default grid options: " + aNewData);
330cdf0e10cSrcweir         }
331cdf0e10cSrcweir         catch ( Exception e )
332cdf0e10cSrcweir         {
333cdf0e10cSrcweir             e.printStackTrace();
334cdf0e10cSrcweir         }
335cdf0e10cSrcweir     }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir     /** This method demonstrates update access to set data
338cdf0e10cSrcweir      */
updateSetExample()339cdf0e10cSrcweir     protected void updateSetExample ()
340cdf0e10cSrcweir     {
341cdf0e10cSrcweir         try
342cdf0e10cSrcweir         {
343cdf0e10cSrcweir             System.out.println("\n--- starting example: update set data ---------------");
344cdf0e10cSrcweir             storeSampleDataSource( );
345cdf0e10cSrcweir         }
346cdf0e10cSrcweir         catch ( Exception e )
347cdf0e10cSrcweir         {
348cdf0e10cSrcweir             e.printStackTrace();
349cdf0e10cSrcweir         }
350cdf0e10cSrcweir     }
351cdf0e10cSrcweir 
352cdf0e10cSrcweir // READ example
353*002e2b2bSmseidel     // class to hold information about grid settings
354cdf0e10cSrcweir     public static class GridOptions
355cdf0e10cSrcweir     {
356cdf0e10cSrcweir         public boolean visible;
357cdf0e10cSrcweir         public int resolution_x;
358cdf0e10cSrcweir         public int resolution_y;
359cdf0e10cSrcweir         public int subdivision_x;
360cdf0e10cSrcweir         public int subdivision_y;
361cdf0e10cSrcweir 
toString()362cdf0e10cSrcweir         public String toString() {
363cdf0e10cSrcweir             StringBuffer aBuffer = new StringBuffer();
364cdf0e10cSrcweir             aBuffer.append("[ Grid is "); aBuffer.append(visible ? "VISIBLE" : "HIDDEN");
365cdf0e10cSrcweir             aBuffer.append("; resolution  = (" + resolution_x  + "," + resolution_y  + ")");
366cdf0e10cSrcweir             aBuffer.append("; subdivision = (" + subdivision_x + "," + subdivision_y + ")");
367cdf0e10cSrcweir             aBuffer.append(" ]");
368cdf0e10cSrcweir             return aBuffer.toString();
369cdf0e10cSrcweir         }
370cdf0e10cSrcweir     };
371cdf0e10cSrcweir 
372*002e2b2bSmseidel     // This method reads information about grid settings
readGridConfiguration()373cdf0e10cSrcweir     protected GridOptions readGridConfiguration()
374cdf0e10cSrcweir         throws com.sun.star.uno.Exception
375cdf0e10cSrcweir     {
376cdf0e10cSrcweir         // The path to the root element
377cdf0e10cSrcweir         final String cGridOptionsPath = "/org.openoffice.Office.Calc/Grid";
378cdf0e10cSrcweir 
379cdf0e10cSrcweir         // create the view
380cdf0e10cSrcweir         Object xViewRoot = createConfigurationView(cGridOptionsPath);
381cdf0e10cSrcweir 
382cdf0e10cSrcweir         // the result structure
383cdf0e10cSrcweir         GridOptions options = new GridOptions();
384cdf0e10cSrcweir 
385cdf0e10cSrcweir       // accessing a single nested value
386cdf0e10cSrcweir         XHierarchicalPropertySet xProperties =
387cdf0e10cSrcweir             (XHierarchicalPropertySet)UnoRuntime.queryInterface(XHierarchicalPropertySet.class, xViewRoot);
388cdf0e10cSrcweir 
389cdf0e10cSrcweir         Object aVisible = xProperties.getHierarchicalPropertyValue("Option/VisibleGrid");
390cdf0e10cSrcweir         options.visible = ((Boolean) aVisible).booleanValue();
391cdf0e10cSrcweir 
392cdf0e10cSrcweir       // accessing a nested object and its subproperties
393cdf0e10cSrcweir         Object xSubdivision = xProperties.getHierarchicalPropertyValue("Subdivision");
394cdf0e10cSrcweir 
395cdf0e10cSrcweir         XMultiPropertySet xSubdivProperties =
396cdf0e10cSrcweir             (XMultiPropertySet)UnoRuntime.queryInterface(XMultiPropertySet.class, xSubdivision);
397cdf0e10cSrcweir 
398cdf0e10cSrcweir         // variables for multi-element access
399cdf0e10cSrcweir         String[] aElementNames = new String[2];
400cdf0e10cSrcweir 
401cdf0e10cSrcweir         aElementNames[0] = "XAxis";
402cdf0e10cSrcweir         aElementNames[1] = "YAxis";
403cdf0e10cSrcweir 
404cdf0e10cSrcweir         Object[] aElementValues = xSubdivProperties.getPropertyValues(aElementNames);
405cdf0e10cSrcweir 
406cdf0e10cSrcweir         options.subdivision_x = ((Integer) aElementValues[0]).intValue();
407cdf0e10cSrcweir         options.subdivision_y = ((Integer) aElementValues[1]).intValue();
408cdf0e10cSrcweir 
409cdf0e10cSrcweir       // accessing deeply nested subproperties
410cdf0e10cSrcweir         Object xResolution = xProperties.getHierarchicalPropertyValue("Resolution");
411cdf0e10cSrcweir 
412cdf0e10cSrcweir         XMultiHierarchicalPropertySet xResolutionProperties =
413cdf0e10cSrcweir             (XMultiHierarchicalPropertySet)
414cdf0e10cSrcweir                 UnoRuntime.queryInterface(XMultiHierarchicalPropertySet.class, xResolution);
415cdf0e10cSrcweir 
416cdf0e10cSrcweir         aElementNames[0] = "XAxis/Metric";
417cdf0e10cSrcweir         aElementNames[1] = "YAxis/Metric";
418cdf0e10cSrcweir 
419cdf0e10cSrcweir         aElementValues = xResolutionProperties.getHierarchicalPropertyValues(aElementNames);
420cdf0e10cSrcweir 
421cdf0e10cSrcweir         options.resolution_x = ((Integer) aElementValues[0]).intValue();
422cdf0e10cSrcweir         options.resolution_y = ((Integer) aElementValues[1]).intValue();
423cdf0e10cSrcweir 
424cdf0e10cSrcweir       // all options have been retrieved - clean up and return
425cdf0e10cSrcweir         // we are done with the view - dispose it
426cdf0e10cSrcweir 
427cdf0e10cSrcweir         ((XComponent)UnoRuntime.queryInterface(XComponent.class, xViewRoot)).dispose();
428cdf0e10cSrcweir 
429cdf0e10cSrcweir         return options;
430cdf0e10cSrcweir     }
431cdf0e10cSrcweir 
432cdf0e10cSrcweir // BROWSE example
433*002e2b2bSmseidel     // Interface to process information when browsing the configuration tree
434cdf0e10cSrcweir     public static interface IConfigurationProcessor
435cdf0e10cSrcweir     {
436*002e2b2bSmseidel         // process a value item
processValueElement( String sPath_, Object aValue_ )437cdf0e10cSrcweir        public abstract void processValueElement( String sPath_, Object aValue_ );
438*002e2b2bSmseidel         // process a structural item
processStructuralElement( String sPath_, XInterface xElement_)439cdf0e10cSrcweir        public abstract void processStructuralElement( String sPath_, XInterface xElement_);
440cdf0e10cSrcweir     };
441cdf0e10cSrcweir 
442*002e2b2bSmseidel     // Internal method to recursively browse a structural element in preorder
browseElementRecursively( XInterface xElement, IConfigurationProcessor aProcessor )443cdf0e10cSrcweir     public void browseElementRecursively( XInterface xElement, IConfigurationProcessor aProcessor )
444cdf0e10cSrcweir         throws com.sun.star.uno.Exception
445cdf0e10cSrcweir     {
446cdf0e10cSrcweir         // First process this as an element (preorder traversal)
447cdf0e10cSrcweir         XHierarchicalName xElementPath =
448cdf0e10cSrcweir             (XHierarchicalName) UnoRuntime.queryInterface(XHierarchicalName.class, xElement);
449cdf0e10cSrcweir 
450cdf0e10cSrcweir         String sPath = xElementPath.getHierarchicalName();
451cdf0e10cSrcweir 
452cdf0e10cSrcweir         aProcessor.processStructuralElement( sPath, xElement);
453cdf0e10cSrcweir 
454cdf0e10cSrcweir         // now process this as a container
455cdf0e10cSrcweir         XNameAccess xChildAccess =
456cdf0e10cSrcweir             (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xElement);
457cdf0e10cSrcweir 
458cdf0e10cSrcweir         // get a list of child elements
459cdf0e10cSrcweir         String[] aElementNames = xChildAccess.getElementNames();
460cdf0e10cSrcweir 
461cdf0e10cSrcweir         // and process them one by one
462cdf0e10cSrcweir         for(int i=0; i< aElementNames.length; ++i)
463cdf0e10cSrcweir         {
464cdf0e10cSrcweir             Object aChild = xChildAccess.getByName( aElementNames[i] );
465cdf0e10cSrcweir             AnyConverter aAnyConv = new AnyConverter();
466cdf0e10cSrcweir             // is it a structural element (object) ...
467cdf0e10cSrcweir             if ( aAnyConv.isObject(aChild) && !aAnyConv.isArray(aChild) )
468cdf0e10cSrcweir             {
469cdf0e10cSrcweir                 // then get an interface
470cdf0e10cSrcweir                 XInterface xChildElement = (XInterface)UnoRuntime.queryInterface(XInterface.class, aChild);
471cdf0e10cSrcweir 
472cdf0e10cSrcweir                 // and continue processing child elements recursively
473cdf0e10cSrcweir                 browseElementRecursively( xChildElement, aProcessor );
474cdf0e10cSrcweir             }
475cdf0e10cSrcweir             // ... or is it a simple value
476cdf0e10cSrcweir             else
477cdf0e10cSrcweir             {
478cdf0e10cSrcweir                 // Build the path to it from the path of
479cdf0e10cSrcweir                 // the element and the name of the child
480cdf0e10cSrcweir                 String sChildPath;
481cdf0e10cSrcweir                 sChildPath =
482cdf0e10cSrcweir                     xElementPath.composeHierarchicalName(aElementNames[i]);
483cdf0e10cSrcweir 
484cdf0e10cSrcweir                 // and process the value
485cdf0e10cSrcweir                 aProcessor.processValueElement( sChildPath, aChild );
486cdf0e10cSrcweir             }
487cdf0e10cSrcweir         }
488cdf0e10cSrcweir     }
489cdf0e10cSrcweir 
490cdf0e10cSrcweir     /** Method to browse the part rooted at sRootPath
491cdf0e10cSrcweir         of the configuration that the Provider provides.
492cdf0e10cSrcweir 
493cdf0e10cSrcweir         All nodes will be processed by the IConfigurationProcessor passed.
494cdf0e10cSrcweir     */
browseConfiguration( String sRootPath, IConfigurationProcessor aProcessor )495cdf0e10cSrcweir     public void browseConfiguration( String sRootPath, IConfigurationProcessor aProcessor )
496cdf0e10cSrcweir         throws com.sun.star.uno.Exception
497cdf0e10cSrcweir     {
498cdf0e10cSrcweir         // create the root element
499cdf0e10cSrcweir         XInterface xViewRoot = (XInterface)createConfigurationView( sRootPath );
500cdf0e10cSrcweir 
501cdf0e10cSrcweir         // now do the processing
502cdf0e10cSrcweir         browseElementRecursively( xViewRoot, aProcessor );
503cdf0e10cSrcweir 
504cdf0e10cSrcweir         // we are done with the view - dispose it
505cdf0e10cSrcweir         //   This assumes that the processor
506cdf0e10cSrcweir         //   does not keep a reference to the elements in processStructuralElement
507cdf0e10cSrcweir 
508cdf0e10cSrcweir         ((XComponent) UnoRuntime.queryInterface(XComponent.class,xViewRoot)).dispose();
509cdf0e10cSrcweir         xViewRoot = null;
510cdf0e10cSrcweir     }
511cdf0e10cSrcweir 
512cdf0e10cSrcweir     /** Method to browse the filter configuration.
513cdf0e10cSrcweir 
514cdf0e10cSrcweir         Information about installed filters will be printed.
515cdf0e10cSrcweir     */
printRegisteredFilters()516cdf0e10cSrcweir     public void printRegisteredFilters()
517cdf0e10cSrcweir         throws com.sun.star.uno.Exception
518cdf0e10cSrcweir     {
519cdf0e10cSrcweir         final String sProviderService = "com.sun.star.configuration.ConfigurationProvider";
520cdf0e10cSrcweir         final String sFilterKey = "/org.openoffice.TypeDetection.Filter/Filters";
521cdf0e10cSrcweir 
522cdf0e10cSrcweir        // browse the configuration, dumping filter information
523cdf0e10cSrcweir         browseConfiguration( sFilterKey,
524cdf0e10cSrcweir            new IConfigurationProcessor () {
525*002e2b2bSmseidel                // prints Path and Value of properties
526cdf0e10cSrcweir                public void processValueElement( String sPath_, Object aValue_ ) {
527cdf0e10cSrcweir                    if (new AnyConverter().isArray(aValue_))
528cdf0e10cSrcweir                    {
529cdf0e10cSrcweir                        final Object [] aArray = (Object [])aValue_;
530cdf0e10cSrcweir 
531cdf0e10cSrcweir                        System.out.print("\tValue: " + sPath_ + " = { ");
532cdf0e10cSrcweir                        for (int i=0; i<aArray.length; ++i)
533cdf0e10cSrcweir                        {
534cdf0e10cSrcweir                            if (i != 0) System.out.print(", ");
535cdf0e10cSrcweir                            System.out.print(aArray[i]);
536cdf0e10cSrcweir                        }
537cdf0e10cSrcweir                        System.out.println(" }");
538cdf0e10cSrcweir                    }
539cdf0e10cSrcweir                    else
540cdf0e10cSrcweir                         System.out.println("\tValue: " + sPath_ + " = " + aValue_);
541cdf0e10cSrcweir                }
542cdf0e10cSrcweir 
543*002e2b2bSmseidel                // prints the Filter entries
544cdf0e10cSrcweir                public void processStructuralElement( String sPath_, XInterface xElement_) {
545cdf0e10cSrcweir                    // get template information, to detect instances of the 'Filter' template
546cdf0e10cSrcweir                    XTemplateInstance xInstance =
547cdf0e10cSrcweir                        ( XTemplateInstance )UnoRuntime.queryInterface( XTemplateInstance .class,xElement_);
548cdf0e10cSrcweir 
549cdf0e10cSrcweir                    // only select the Filter entries
550cdf0e10cSrcweir                    if (xInstance != null && xInstance.getTemplateName().endsWith("Filter")) {
551cdf0e10cSrcweir                         XNamed xNamed = (XNamed)UnoRuntime.queryInterface(XNamed.class,xElement_);
552cdf0e10cSrcweir                         System.out.println("Filter " + xNamed.getName() + " (" + sPath_ + ")");
553cdf0e10cSrcweir                    }
554cdf0e10cSrcweir                }
555cdf0e10cSrcweir            } );
556cdf0e10cSrcweir     }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir // GROUP UPDATE example
559cdf0e10cSrcweir 
560cdf0e10cSrcweir     /** This method simulates editing configuration data using a GridEditor dialog class
561cdf0e10cSrcweir     */
editGridOptions( )562cdf0e10cSrcweir     public void editGridOptions( )
563cdf0e10cSrcweir         throws com.sun.star.uno.Exception
564cdf0e10cSrcweir     {
565cdf0e10cSrcweir         // The path to the root element
566cdf0e10cSrcweir         final String cGridOptionsPath = "/org.openoffice.Office.Calc/Grid";
567cdf0e10cSrcweir 
568cdf0e10cSrcweir       // create the view
569cdf0e10cSrcweir         Object xViewRoot = createUpdatableView( cGridOptionsPath );
570cdf0e10cSrcweir 
571cdf0e10cSrcweir         // the 'editor'
572cdf0e10cSrcweir         GridOptionsEditor dialog = new GridOptionsEditor();
573cdf0e10cSrcweir 
574cdf0e10cSrcweir       // set up the initial values and register listeners
575cdf0e10cSrcweir         // get a data access interface, to supply the view with a model
576cdf0e10cSrcweir         XMultiHierarchicalPropertySet xProperties =
577cdf0e10cSrcweir             (XMultiHierarchicalPropertySet)
578cdf0e10cSrcweir                 UnoRuntime.queryInterface(XMultiHierarchicalPropertySet.class, xViewRoot);
579cdf0e10cSrcweir 
580cdf0e10cSrcweir         dialog.setModel( xProperties );
581cdf0e10cSrcweir 
582cdf0e10cSrcweir         // get a listener object (probably an adapter) that notifies
583cdf0e10cSrcweir         // the dialog of external changes to its model
584cdf0e10cSrcweir         XChangesListener xListener = dialog.createChangesListener( );
585cdf0e10cSrcweir 
586cdf0e10cSrcweir         XChangesNotifier xNotifier =
587cdf0e10cSrcweir             (XChangesNotifier)UnoRuntime.queryInterface(XChangesNotifier.class, xViewRoot);
588cdf0e10cSrcweir 
589cdf0e10cSrcweir         xNotifier.addChangesListener( xListener );
590cdf0e10cSrcweir 
591cdf0e10cSrcweir         // trigger the listener
592cdf0e10cSrcweir         changeSomeData( cGridOptionsPath + "/Subdivision" );
593cdf0e10cSrcweir 
594cdf0e10cSrcweir         if (dialog.execute() == GridOptionsEditor.SAVE_SETTINGS)
595cdf0e10cSrcweir         {
596cdf0e10cSrcweir             // changes have been applied to the view here
597cdf0e10cSrcweir             XChangesBatch xUpdateControl =
598cdf0e10cSrcweir                 (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class,xViewRoot);
599cdf0e10cSrcweir 
600cdf0e10cSrcweir             try
601cdf0e10cSrcweir             {
602cdf0e10cSrcweir                xUpdateControl.commitChanges();
603cdf0e10cSrcweir             }
604cdf0e10cSrcweir             catch (Exception e)
605cdf0e10cSrcweir             {
606cdf0e10cSrcweir                 dialog.informUserOfError( e );
607cdf0e10cSrcweir             }
608cdf0e10cSrcweir         }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir       // all changes have been handled - clean up and return
611cdf0e10cSrcweir         // listener is done now
612cdf0e10cSrcweir         xNotifier.removeChangesListener( xListener );
613cdf0e10cSrcweir 
614cdf0e10cSrcweir         // we are done with the view - dispose it
615cdf0e10cSrcweir         ((XComponent)UnoRuntime.queryInterface(XComponent.class, xViewRoot)).dispose();
616cdf0e10cSrcweir     }
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     /** A class that changes some grid options settings
619cdf0e10cSrcweir 
620cdf0e10cSrcweir         The interface of this class is chose to resemble a possible UI dialog class
621cdf0e10cSrcweir     */
622cdf0e10cSrcweir     private class GridOptionsEditor {
623*002e2b2bSmseidel         // the data this editor edits
624cdf0e10cSrcweir         XMultiHierarchicalPropertySet mxModel;
625cdf0e10cSrcweir 
626cdf0e10cSrcweir         public static final int CANCELED = 0;
627cdf0e10cSrcweir         public static final int SAVE_SETTINGS = 1;
628cdf0e10cSrcweir 
629cdf0e10cSrcweir         // sets a model and updates the display
setModel(XMultiHierarchicalPropertySet xModel)630cdf0e10cSrcweir         public void setModel(XMultiHierarchicalPropertySet xModel) {
631cdf0e10cSrcweir             mxModel = xModel;
632cdf0e10cSrcweir             updateDisplay();
633cdf0e10cSrcweir         }
634cdf0e10cSrcweir 
635cdf0e10cSrcweir         // this method 'runs' the 'dialog'
execute()636cdf0e10cSrcweir         public int execute() {
637cdf0e10cSrcweir             try
638cdf0e10cSrcweir             {
639cdf0e10cSrcweir                 System.out.println("-- GridEditor executing --");
640cdf0e10cSrcweir                 // simulate a user action changing some data
641cdf0e10cSrcweir                 toggleVisibility();
642cdf0e10cSrcweir                 System.out.println("-- GridEditor done      --");
643cdf0e10cSrcweir                 return SAVE_SETTINGS;
644cdf0e10cSrcweir             }
645cdf0e10cSrcweir             catch (Exception e)
646cdf0e10cSrcweir             {
647cdf0e10cSrcweir                 informUserOfError(e);
648cdf0e10cSrcweir                 return CANCELED;
649cdf0e10cSrcweir             }
650cdf0e10cSrcweir         }
651cdf0e10cSrcweir 
652*002e2b2bSmseidel         // this method is called to report an error during dialog execution to the user
informUserOfError(Exception e)653cdf0e10cSrcweir         public void informUserOfError(Exception e) {
654cdf0e10cSrcweir             System.err.println("ERROR in GridEditor:");
655cdf0e10cSrcweir             e.printStackTrace();
656cdf0e10cSrcweir         }
657cdf0e10cSrcweir 
658*002e2b2bSmseidel         // this method is called to allow the dialog to get feedback about changes occurring elsewhere
createChangesListener()659cdf0e10cSrcweir         public XChangesListener createChangesListener() {
660cdf0e10cSrcweir             if (mxModel == null) return null;
661cdf0e10cSrcweir 
662cdf0e10cSrcweir             return (new XChangesListener () {
663cdf0e10cSrcweir                 public void changesOccurred( ChangesEvent event ) {
664cdf0e10cSrcweir                     System.out.println("GridEditor - Listener received changes event containing " +
665cdf0e10cSrcweir                                         event.Changes.length + " change(s).");
666cdf0e10cSrcweir                     updateDisplay();
667cdf0e10cSrcweir                 }
668cdf0e10cSrcweir 
669cdf0e10cSrcweir                 public void disposing(EventObject event) {
670cdf0e10cSrcweir                     System.out.println("GridEditor - Listener received disposed event: releasing model");
671cdf0e10cSrcweir                     setModel(null);
672cdf0e10cSrcweir                 }
673cdf0e10cSrcweir             });
674cdf0e10cSrcweir         }
675*002e2b2bSmseidel         // this method is called when data has changed to display the updated data
updateDisplay()676cdf0e10cSrcweir         private void updateDisplay() {
677cdf0e10cSrcweir             if (mxModel != null)
678cdf0e10cSrcweir                 System.out.println("Grid options editor: data=" + readModel());
679cdf0e10cSrcweir             else
680cdf0e10cSrcweir                 System.out.println("Grid options editor: no model set");
681cdf0e10cSrcweir         }
682cdf0e10cSrcweir 
683cdf0e10cSrcweir         // this method is used to read all relevant data from the model
readModel()684cdf0e10cSrcweir         private GridOptions readModel()
685cdf0e10cSrcweir         {
686cdf0e10cSrcweir             try
687cdf0e10cSrcweir             {
688cdf0e10cSrcweir                 String [] aOptionNames = new String [5];
689cdf0e10cSrcweir                 aOptionNames[0] = "Option/VisibleGrid";
690cdf0e10cSrcweir                 aOptionNames[1] = "Subdivision/XAxis";
691cdf0e10cSrcweir                 aOptionNames[2] = "Subdivision/YAxis";
692cdf0e10cSrcweir                 aOptionNames[3] = "Resolution/XAxis/Metric";
693cdf0e10cSrcweir                 aOptionNames[4] = "Resolution/YAxis/Metric";
694cdf0e10cSrcweir 
695cdf0e10cSrcweir                 Object [] aValues = mxModel.getHierarchicalPropertyValues(aOptionNames);
696cdf0e10cSrcweir 
697cdf0e10cSrcweir                 GridOptions result = new GridOptions();
698cdf0e10cSrcweir                 result.visible = ((Boolean)aValues[0]).booleanValue();
699cdf0e10cSrcweir                 result.subdivision_x = ((Integer)aValues[1]).intValue();
700cdf0e10cSrcweir                 result.subdivision_y = ((Integer)aValues[2]).intValue();
701cdf0e10cSrcweir                 result.resolution_x  = ((Integer)aValues[3]).intValue();
702cdf0e10cSrcweir                 result.resolution_y  = ((Integer)aValues[4]).intValue();
703cdf0e10cSrcweir 
704cdf0e10cSrcweir                 return result;
705cdf0e10cSrcweir             }
706cdf0e10cSrcweir             catch (Exception e)
707cdf0e10cSrcweir             {
708cdf0e10cSrcweir                 informUserOfError(e);
709cdf0e10cSrcweir                 return null;
710cdf0e10cSrcweir             }
711cdf0e10cSrcweir         }
712cdf0e10cSrcweir 
713cdf0e10cSrcweir         // this method executes an edit
toggleVisibility()714cdf0e10cSrcweir         private void toggleVisibility()
715cdf0e10cSrcweir         {
716cdf0e10cSrcweir             try
717cdf0e10cSrcweir             {
718cdf0e10cSrcweir                 XHierarchicalPropertySet xHPS =
719cdf0e10cSrcweir                     (XHierarchicalPropertySet)UnoRuntime.queryInterface(XHierarchicalPropertySet.class, mxModel);
720cdf0e10cSrcweir 
721cdf0e10cSrcweir                 final String sSetting = "Option/VisibleGrid";
722cdf0e10cSrcweir 
723cdf0e10cSrcweir                 System.out.println("GridEditor: toggling Visibility");
724cdf0e10cSrcweir 
725cdf0e10cSrcweir                 Boolean bOldValue = (Boolean)xHPS.getHierarchicalPropertyValue(sSetting);
726cdf0e10cSrcweir 
727cdf0e10cSrcweir                 Boolean bNewValue = new Boolean( ! bOldValue.booleanValue() );
728cdf0e10cSrcweir 
729cdf0e10cSrcweir                 xHPS.setHierarchicalPropertyValue(sSetting,bNewValue);
730cdf0e10cSrcweir             }
731cdf0e10cSrcweir             catch (Exception e)
732cdf0e10cSrcweir             {
733cdf0e10cSrcweir                 informUserOfError(e);
734cdf0e10cSrcweir             }
735cdf0e10cSrcweir         }
736cdf0e10cSrcweir     }
737cdf0e10cSrcweir 
738cdf0e10cSrcweir     /** This method creates an extra updatable view to change some data
739cdf0e10cSrcweir         and trigger the listener of the GridEditor
740cdf0e10cSrcweir     */
741cdf0e10cSrcweir     void changeSomeData(String xKey)
742cdf0e10cSrcweir     {
743cdf0e10cSrcweir         try
744cdf0e10cSrcweir         {
745cdf0e10cSrcweir             Object xOtherViewRoot = createUpdatableView(xKey);
746cdf0e10cSrcweir 
747cdf0e10cSrcweir             XNameReplace aReplace = (XNameReplace)UnoRuntime.queryInterface(XNameReplace.class, xOtherViewRoot);
748cdf0e10cSrcweir 
749cdf0e10cSrcweir             String aItemNames [] = aReplace.getElementNames();
750cdf0e10cSrcweir             for (int i=0; i < aItemNames.length; ++i) {
751cdf0e10cSrcweir                 Object aItem = aReplace.getByName( aItemNames [i] );
752cdf0e10cSrcweir                 AnyConverter aAnyConv = new AnyConverter();
753cdf0e10cSrcweir                 // replace integers by a 'complement' value
754cdf0e10cSrcweir                 if ( aAnyConv.isInt(aItem) )
755cdf0e10cSrcweir                 {
756cdf0e10cSrcweir                     int nOld = aAnyConv.toInt(aItem);
757cdf0e10cSrcweir                     int nNew = 9999 - nOld;
758cdf0e10cSrcweir 
759cdf0e10cSrcweir                     System.out.println("Replacing integer value: " + aItemNames [i]);
760cdf0e10cSrcweir                     aReplace.replaceByName( aItemNames [i], new Integer( nNew ) );
761cdf0e10cSrcweir                 }
762cdf0e10cSrcweir 
763cdf0e10cSrcweir                 // and booleans by their negated value
764cdf0e10cSrcweir                 else if ( aAnyConv.isBoolean(aItem) )
765cdf0e10cSrcweir                 {
766cdf0e10cSrcweir                     boolean bOld = aAnyConv.toBoolean(aItem);
767cdf0e10cSrcweir                     boolean bNew = ! bOld;
768cdf0e10cSrcweir 
769cdf0e10cSrcweir                     System.out.println("Replacing boolean value: " + aItemNames [i]);
770cdf0e10cSrcweir                     aReplace.replaceByName( aItemNames [i], new Boolean( bNew ) );
771cdf0e10cSrcweir                 }
772cdf0e10cSrcweir             }
773cdf0e10cSrcweir 
774cdf0e10cSrcweir             // commit the changes
775cdf0e10cSrcweir             XChangesBatch xUpdateControl =
776cdf0e10cSrcweir                 (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class,xOtherViewRoot);
777cdf0e10cSrcweir 
778cdf0e10cSrcweir             xUpdateControl.commitChanges();
779cdf0e10cSrcweir 
780cdf0e10cSrcweir             // we are done with the view - dispose it
781cdf0e10cSrcweir             ((XComponent)UnoRuntime.queryInterface(XComponent.class, xOtherViewRoot)).dispose();
782cdf0e10cSrcweir         }
783cdf0e10cSrcweir         catch (Exception e)
784cdf0e10cSrcweir         {
785cdf0e10cSrcweir             System.err.println("Could not change some data in a different view. An exception occurred:");
786cdf0e10cSrcweir             e.printStackTrace();
787cdf0e10cSrcweir         }
788cdf0e10cSrcweir     }
789cdf0e10cSrcweir 
790cdf0e10cSrcweir // GROUP RESET EXAMPLE
791*002e2b2bSmseidel     // This method resets the grid settings to their default values
792cdf0e10cSrcweir     protected void resetGridConfiguration()
793cdf0e10cSrcweir         throws com.sun.star.uno.Exception
794cdf0e10cSrcweir     {
795cdf0e10cSrcweir         // The path to the root element
796cdf0e10cSrcweir         final String cGridOptionsPath = "/org.openoffice.Office.Calc/Grid";
797cdf0e10cSrcweir 
798cdf0e10cSrcweir         // create the view
799cdf0e10cSrcweir         Object xViewRoot = createUpdatableView(cGridOptionsPath);
800cdf0e10cSrcweir 
801cdf0e10cSrcweir      // resetting a single nested value
802cdf0e10cSrcweir         XHierarchicalNameAccess xHierarchicalAccess =
803cdf0e10cSrcweir             (XHierarchicalNameAccess)UnoRuntime.queryInterface(XHierarchicalNameAccess.class, xViewRoot);
804cdf0e10cSrcweir 
805cdf0e10cSrcweir         // get using absolute name
806cdf0e10cSrcweir         Object xOptions = xHierarchicalAccess.getByHierarchicalName(cGridOptionsPath + "/Option");
807cdf0e10cSrcweir 
808cdf0e10cSrcweir         XPropertyState xOptionState =
809cdf0e10cSrcweir             (XPropertyState)UnoRuntime.queryInterface(XPropertyState.class, xOptions);
810cdf0e10cSrcweir 
811cdf0e10cSrcweir         xOptionState.setPropertyToDefault("VisibleGrid");
812cdf0e10cSrcweir 
813cdf0e10cSrcweir      // resetting more deeply nested values
814cdf0e10cSrcweir         Object xResolutionX = xHierarchicalAccess.getByHierarchicalName("Resolution/XAxis");
815cdf0e10cSrcweir         Object xResolutionY = xHierarchicalAccess.getByHierarchicalName("Resolution/YAxis");
816cdf0e10cSrcweir 
817cdf0e10cSrcweir         XPropertyState xResolutionStateX =
818cdf0e10cSrcweir             (XPropertyState)UnoRuntime.queryInterface(XPropertyState.class, xResolutionX);
819cdf0e10cSrcweir         XPropertyState xResolutionStateY =
820cdf0e10cSrcweir             (XPropertyState)UnoRuntime.queryInterface(XPropertyState.class, xResolutionY);
821cdf0e10cSrcweir 
822cdf0e10cSrcweir         xResolutionStateX.setPropertyToDefault("Metric");
823cdf0e10cSrcweir         xResolutionStateY.setPropertyToDefault("Metric");
824cdf0e10cSrcweir 
825cdf0e10cSrcweir      // resetting multiple sibling values
826cdf0e10cSrcweir         Object xSubdivision = xHierarchicalAccess.getByHierarchicalName("Subdivision");
827cdf0e10cSrcweir 
828cdf0e10cSrcweir         XMultiPropertyStates xSubdivisionStates =
829cdf0e10cSrcweir             (XMultiPropertyStates)UnoRuntime.queryInterface(XMultiPropertyStates.class, xSubdivision);
830cdf0e10cSrcweir 
831cdf0e10cSrcweir         xSubdivisionStates.setAllPropertiesToDefault();
832cdf0e10cSrcweir 
833cdf0e10cSrcweir         // commit the changes
834cdf0e10cSrcweir         XChangesBatch xUpdateControl =
835cdf0e10cSrcweir             (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class,xViewRoot);
836cdf0e10cSrcweir 
837cdf0e10cSrcweir         xUpdateControl.commitChanges();
838cdf0e10cSrcweir 
839cdf0e10cSrcweir        // we are done with the view - dispose it
840cdf0e10cSrcweir         ((XComponent)UnoRuntime.queryInterface(XComponent.class, xViewRoot)).dispose();
841cdf0e10cSrcweir     }
842cdf0e10cSrcweir 
843cdf0e10cSrcweir 
844cdf0e10cSrcweir // SET UPDATE EXAMPLE
845cdf0e10cSrcweir     private static boolean SET_EXAMPLE_BROKEN_IN_THIS_RELEASE = true;
846cdf0e10cSrcweir 
847cdf0e10cSrcweir     /** This method stores a sample data source given some connection data.
848cdf0e10cSrcweir 
849cdf0e10cSrcweir         ATTENTION: This example requires an older version of the
850cdf0e10cSrcweir                    org.openoffice.Office.DataAccess schema.
851cdf0e10cSrcweir                    It does not work with the current schema.
852*002e2b2bSmseidel                    Because of this, the method currently does nothing.
853cdf0e10cSrcweir                    You can still use the techniques shown in the example code.
854cdf0e10cSrcweir     */
855cdf0e10cSrcweir     void storeSampleDataSource()
856cdf0e10cSrcweir         throws com.sun.star.uno.Exception
857cdf0e10cSrcweir     {
858cdf0e10cSrcweir         if (SET_EXAMPLE_BROKEN_IN_THIS_RELEASE)
859cdf0e10cSrcweir         {
860cdf0e10cSrcweir             System.out.println("-  DISABLED: (the existing example does not work with this version) -");
861cdf0e10cSrcweir             return; // this function does not work
862cdf0e10cSrcweir         }
863cdf0e10cSrcweir 
864cdf0e10cSrcweir         String sSampleDataSourceName = "SampleTextDatabase";
865cdf0e10cSrcweir 
866cdf0e10cSrcweir         String sSampleDataSourceURL = "sdbc:flat:$(userurl)/database/SampleTextDatabase";
867cdf0e10cSrcweir         // String sSampleDataSourceURL = "sdbc:flat:file:///usr/local/database/SampleTextDatabase";
868cdf0e10cSrcweir         // String sSampleDataSourceURL = "sdbc:flat:file:///C:/data/database/SampleTextDatabase";
869cdf0e10cSrcweir 
870cdf0e10cSrcweir         com.sun.star.beans.NamedValue [] aSettings = new com.sun.star.beans.NamedValue [2];
871cdf0e10cSrcweir         aSettings[0] = new com.sun.star.beans.NamedValue("HeaderLine",new Boolean(true));
872cdf0e10cSrcweir         aSettings[1] = new com.sun.star.beans.NamedValue("FieldDelimiter",";");
873cdf0e10cSrcweir 
874cdf0e10cSrcweir         String [] aTableFilter = new String[2];
875cdf0e10cSrcweir         aTableFilter[0] = "table.txt";
876cdf0e10cSrcweir         aTableFilter[1] = "othertable.txt";
877cdf0e10cSrcweir 
878cdf0e10cSrcweir         storeDataSource(sSampleDataSourceName,sSampleDataSourceURL,"",false,0,aSettings,aTableFilter);
879cdf0e10cSrcweir     }
880cdf0e10cSrcweir 
881*002e2b2bSmseidel     // This method stores a data source given some connection data
882cdf0e10cSrcweir     void storeDataSource(
883cdf0e10cSrcweir         String sDataSourceName,
884cdf0e10cSrcweir         String sDataSourceURL,
885cdf0e10cSrcweir         String sUser,
886cdf0e10cSrcweir         boolean bNeedsPassword,
887cdf0e10cSrcweir         int nTimeout,
888cdf0e10cSrcweir         com.sun.star.beans.NamedValue [] aDriverSettings,
889cdf0e10cSrcweir         String [] aTableFilter
890cdf0e10cSrcweir     )
891cdf0e10cSrcweir         throws com.sun.star.uno.Exception
892cdf0e10cSrcweir     {
893cdf0e10cSrcweir       // create the view and get the data source element
894cdf0e10cSrcweir         Object xDataSource = createDataSourceDescription(getProvider(),sDataSourceName);
895cdf0e10cSrcweir 
896cdf0e10cSrcweir       // set the values
897cdf0e10cSrcweir         XPropertySet xDataSourceProperties =
898cdf0e10cSrcweir             (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xDataSource);
899cdf0e10cSrcweir 
900cdf0e10cSrcweir         xDataSourceProperties.setPropertyValue("URL",  sDataSourceURL  );
901cdf0e10cSrcweir         xDataSourceProperties.setPropertyValue("User", sUser  );
902cdf0e10cSrcweir         xDataSourceProperties.setPropertyValue("IsPasswordRequired", new Boolean( bNeedsPassword ) );
903cdf0e10cSrcweir         xDataSourceProperties.setPropertyValue("LoginTimeout", new Integer( nTimeout ) );
904cdf0e10cSrcweir 
905cdf0e10cSrcweir         if ( aTableFilter != null )
906cdf0e10cSrcweir             xDataSourceProperties.setPropertyValue("TableFilter",  aTableFilter  );
907cdf0e10cSrcweir 
908cdf0e10cSrcweir       // store the driver-specific settings
909cdf0e10cSrcweir         if (aDriverSettings != null)
910cdf0e10cSrcweir         {
911cdf0e10cSrcweir             Object xSettingsSet = xDataSourceProperties.getPropertyValue("DataSourceSettings");
912cdf0e10cSrcweir             storeSettings( xSettingsSet, aDriverSettings);
913cdf0e10cSrcweir         }
914cdf0e10cSrcweir 
915cdf0e10cSrcweir       // save the data and dispose the view
916cdf0e10cSrcweir         // recover the view root
917cdf0e10cSrcweir         Object xViewRoot = getViewRoot(xDataSource);
918cdf0e10cSrcweir 
919cdf0e10cSrcweir         // commit the changes
920cdf0e10cSrcweir         XChangesBatch xUpdateControl =
921cdf0e10cSrcweir             (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class,xViewRoot);
922cdf0e10cSrcweir 
923cdf0e10cSrcweir         xUpdateControl.commitChanges();
924cdf0e10cSrcweir 
925cdf0e10cSrcweir         // now clean up
926cdf0e10cSrcweir         ((XComponent) UnoRuntime.queryInterface(XComponent.class, xViewRoot)).dispose();
927cdf0e10cSrcweir     }
928cdf0e10cSrcweir 
929cdf0e10cSrcweir     /** This method gets the DataSourceDescription for a data source.
930cdf0e10cSrcweir         It either gets the existing entry or creates a new instance.
931cdf0e10cSrcweir     */
932cdf0e10cSrcweir     Object createDataSourceDescription(XMultiServiceFactory xProvider, String sDataSourceName )
933cdf0e10cSrcweir         throws com.sun.star.uno.Exception
934cdf0e10cSrcweir     {
935cdf0e10cSrcweir         // The service name: Need an update access:
936cdf0e10cSrcweir         final String cUpdatableView = "com.sun.star.configuration.ConfigurationUpdateAccess";
937cdf0e10cSrcweir 
938cdf0e10cSrcweir          // The path to the DataSources set node
939cdf0e10cSrcweir         final String cDataSourcesPath = "/org.openoffice.Office.DataAccess/DataSources";
940cdf0e10cSrcweir 
941cdf0e10cSrcweir        // creation arguments: nodepath
942cdf0e10cSrcweir         com.sun.star.beans.PropertyValue aPathArgument = new com.sun.star.beans.PropertyValue();
943cdf0e10cSrcweir         aPathArgument.Name = "nodepath";
944cdf0e10cSrcweir         aPathArgument.Value = cDataSourcesPath ;
945cdf0e10cSrcweir 
946cdf0e10cSrcweir         Object[] aArguments = new Object[1];
947cdf0e10cSrcweir         aArguments[0] = aPathArgument;
948cdf0e10cSrcweir 
949cdf0e10cSrcweir         // create the view
950cdf0e10cSrcweir         Object xViewRoot =
951cdf0e10cSrcweir             xProvider.createInstanceWithArguments(cUpdatableView, aArguments);
952cdf0e10cSrcweir 
953cdf0e10cSrcweir         XNameAccess xSetOfDataSources =
954cdf0e10cSrcweir             (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class,xViewRoot);
955cdf0e10cSrcweir 
956cdf0e10cSrcweir         Object xDataSourceDescriptor = null; // the result
957cdf0e10cSrcweir         if ( xSetOfDataSources .hasByName( sDataSourceName ))
958cdf0e10cSrcweir         {
959cdf0e10cSrcweir             // the element is there
960cdf0e10cSrcweir             try
961cdf0e10cSrcweir             {
962cdf0e10cSrcweir                 // the view should point to the element directly, so we need to extend the path
963cdf0e10cSrcweir                 XHierarchicalName xComposePath = (XHierarchicalName)
964cdf0e10cSrcweir                     UnoRuntime.queryInterface(XHierarchicalName.class, xSetOfDataSources );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir                 String sElementPath = xComposePath.composeHierarchicalName( sDataSourceName );
967cdf0e10cSrcweir 
968cdf0e10cSrcweir                 // use the name of the element now
969cdf0e10cSrcweir                 aPathArgument.Value = sElementPath;
970cdf0e10cSrcweir 
971cdf0e10cSrcweir                 // create another view now
972cdf0e10cSrcweir                 Object[] aDeepArguments = new Object[1];
973cdf0e10cSrcweir                 aDeepArguments[0] = aPathArgument;
974cdf0e10cSrcweir 
975cdf0e10cSrcweir                 // create the view
976cdf0e10cSrcweir                 xDataSourceDescriptor =
977cdf0e10cSrcweir                       xProvider.createInstanceWithArguments(cUpdatableView, aDeepArguments);
978cdf0e10cSrcweir 
979cdf0e10cSrcweir                 if ( xDataSourceDescriptor != null) // all went fine
980cdf0e10cSrcweir                 {
981cdf0e10cSrcweir                     // dispose the other view
982cdf0e10cSrcweir                     ((XComponent)UnoRuntime.queryInterface(XComponent.class, xViewRoot)).dispose();
983cdf0e10cSrcweir                     xViewRoot = null;
984cdf0e10cSrcweir                 }
985cdf0e10cSrcweir             }
986cdf0e10cSrcweir             catch (Exception e)
987cdf0e10cSrcweir             {
988cdf0e10cSrcweir               // something went wrong, we retry with a new element
989cdf0e10cSrcweir                System.err.println("WARNING: An exception occurred while creating a view for an existing data source: " + e);
990cdf0e10cSrcweir                xDataSourceDescriptor = null;
991cdf0e10cSrcweir             }
992cdf0e10cSrcweir         }
993cdf0e10cSrcweir 
994cdf0e10cSrcweir         // do we have a result element yet ?
995cdf0e10cSrcweir         if ( xDataSourceDescriptor == null)
996cdf0e10cSrcweir         {
997cdf0e10cSrcweir             // get the container
998cdf0e10cSrcweir             XNameContainer xSetUpdate =
999cdf0e10cSrcweir                 (XNameContainer)UnoRuntime.queryInterface(XNameContainer.class, xViewRoot);
1000cdf0e10cSrcweir 
1001cdf0e10cSrcweir             // create a new detached set element (instance of DataSourceDescription)
1002cdf0e10cSrcweir             XSingleServiceFactory xElementFactory =
1003cdf0e10cSrcweir                 (XSingleServiceFactory)UnoRuntime.queryInterface(XSingleServiceFactory.class, xSetUpdate);
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir             // the new element is the result !
1006cdf0e10cSrcweir              xDataSourceDescriptor = xElementFactory.createInstance();
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir             // insert it - this also names the element
1009cdf0e10cSrcweir             xSetUpdate.insertByName( sDataSourceName , xDataSourceDescriptor );
1010cdf0e10cSrcweir         }
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir         return xDataSourceDescriptor ;
1013cdf0e10cSrcweir     }
1014cdf0e10cSrcweir 
1015*002e2b2bSmseidel     // This method stores a number of settings in a set node containing DataSourceSetting objects
1016cdf0e10cSrcweir     void storeSettings(Object xSettingsSet, com.sun.star.beans.NamedValue [] aSettings )
1017cdf0e10cSrcweir         throws com.sun.star.uno.Exception
1018cdf0e10cSrcweir     {
1019cdf0e10cSrcweir         if (aSettings == null)
1020cdf0e10cSrcweir             return;
1021cdf0e10cSrcweir 
1022cdf0e10cSrcweir         // get the settings set as a container
1023cdf0e10cSrcweir         XNameContainer xSettingsContainer =
1024cdf0e10cSrcweir             (XNameContainer) UnoRuntime.queryInterface( XNameContainer.class, xSettingsSet);
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir         // and get a factory interface for creating the entries
1027cdf0e10cSrcweir         XSingleServiceFactory xSettingsFactory =
1028cdf0e10cSrcweir             (XSingleServiceFactory) UnoRuntime.queryInterface(XSingleServiceFactory.class, xSettingsSet);
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir         // now insert the individual settings
1031cdf0e10cSrcweir         for (int i = 0; i < aSettings.length; ++i) {
1032cdf0e10cSrcweir             // create a DataSourceSetting object
1033cdf0e10cSrcweir             XPropertySet xSetting = (XPropertySet)
1034cdf0e10cSrcweir                 UnoRuntime.queryInterface( XPropertySet.class, xSettingsFactory.createInstance() );
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir             // can set the value before inserting
1037cdf0e10cSrcweir             xSetting.setPropertyValue( "Value", aSettings[i].Value );
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir             // and now insert or replace as appropriate
1040cdf0e10cSrcweir             if (xSettingsContainer.hasByName( aSettings[i].Name ))
1041cdf0e10cSrcweir                 xSettingsContainer.replaceByName( aSettings[i].Name, xSetting );
1042cdf0e10cSrcweir             else
1043cdf0e10cSrcweir                 xSettingsContainer.insertByName( aSettings[i].Name, xSetting );
1044cdf0e10cSrcweir         }
1045cdf0e10cSrcweir     }
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir // HELPER FUNCTIONS
1048cdf0e10cSrcweir 
1049*002e2b2bSmseidel     // This method get the view root node given an interface to any node in the view
1050cdf0e10cSrcweir     public static Object getViewRoot(Object xElement)
1051cdf0e10cSrcweir     {
1052cdf0e10cSrcweir         Object xResult = xElement;
1053cdf0e10cSrcweir 
1054cdf0e10cSrcweir         // set the result to its parent until that would be null
1055cdf0e10cSrcweir         Object xParent;
1056cdf0e10cSrcweir         do
1057cdf0e10cSrcweir         {
1058cdf0e10cSrcweir             XChild xParentAccess =
1059cdf0e10cSrcweir                 (XChild) UnoRuntime.queryInterface(XChild.class,xResult);
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir             if (xParentAccess != null)
1062cdf0e10cSrcweir                 xParent = xParentAccess.getParent();
1063cdf0e10cSrcweir             else
1064cdf0e10cSrcweir                 xParent = null;
1065cdf0e10cSrcweir 
1066cdf0e10cSrcweir             if (xParent != null)
1067cdf0e10cSrcweir                 xResult = xParent;
1068cdf0e10cSrcweir          }
1069cdf0e10cSrcweir          while (xParent != null);
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir          return xResult;
1072cdf0e10cSrcweir     }
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir // workaround methods for unimplemented functionality
1075cdf0e10cSrcweir 
1076*002e2b2bSmseidel     // WORKAROUND: does the same as xNamedItem.setName(sNewName) should do
1077cdf0e10cSrcweir     void renameSetItem(XNamed xNamedItem, String sNewName)
1078cdf0e10cSrcweir         throws com.sun.star.uno.Exception
1079cdf0e10cSrcweir     {
1080cdf0e10cSrcweir         XChild xChildItem = (XChild)
1081cdf0e10cSrcweir             UnoRuntime.queryInterface(XChild.class, xNamedItem);
1082cdf0e10cSrcweir 
1083cdf0e10cSrcweir         XNameContainer xParentSet = (XNameContainer)
1084cdf0e10cSrcweir             UnoRuntime.queryInterface( XNameContainer.class, xChildItem.getParent() );
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir         String sOldName = xNamedItem.getName();
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir         // now rename the item
1089cdf0e10cSrcweir         xParentSet.removeByName(sOldName);
1090cdf0e10cSrcweir         xParentSet.insertByName(sNewName,xNamedItem);
1091cdf0e10cSrcweir     }
1092cdf0e10cSrcweir 
1093*002e2b2bSmseidel     // WORKAROUND: does the same as xChildItem.setParent( xNewParent ) should do
1094cdf0e10cSrcweir     void moveSetItem(XChild xChildItem, XNameContainer xNewParent)
1095cdf0e10cSrcweir         throws com.sun.star.uno.Exception
1096cdf0e10cSrcweir     {
1097cdf0e10cSrcweir         XNamed xNamedItem = (XNamed)
1098cdf0e10cSrcweir             UnoRuntime.queryInterface(XNamed.class, xChildItem);
1099cdf0e10cSrcweir 
1100cdf0e10cSrcweir         XNameContainer xOldParent = (XNameContainer)
1101cdf0e10cSrcweir             UnoRuntime.queryInterface( XNameContainer.class, xChildItem.getParent() );
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir         String sItemName = xNamedItem.getName();
1104cdf0e10cSrcweir 
1105cdf0e10cSrcweir         // now rename the item
1106cdf0e10cSrcweir         xOldParent.removeByName(sItemName);
1107cdf0e10cSrcweir         xNewParent.insertByName(sItemName,xChildItem);
1108cdf0e10cSrcweir     }
1109cdf0e10cSrcweir 
1110cdf0e10cSrcweir 
1111cdf0e10cSrcweir // ------- the end -----------
1112cdf0e10cSrcweir }
1113