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