/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ package com.sun.star.wizards.common; import com.sun.star.beans.*; import com.sun.star.container.*; import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.Exception; import com.sun.star.uno.UnoRuntime; import com.sun.star.lang.Locale; import com.sun.star.util.XChangesBatch; /** * This class gives access to the OO configuration api. * It contains 4 get and 4 set convenience methods for getting and settings properties * in the configuration.
* For the get methods, two parameters must be given: name and parent, where name is the * name of the property, parent is a HierarchyElement (::com::sun::star::configuration::HierarchyElement)
* The get and set methods support hieryrchical property names like "options/gridX".
* NOTE: not yet supported, but sometime later, * If you will ommit the "parent" parameter, then the "name" parameter must be in hierarchy form from * the root of the registry. * @author rpiterman */ public abstract class Configuration { public static int getInt(String name, Object parent) throws Exception { Object o = getNode(name, parent); if (AnyConverter.isVoid(o)) { return 0; } return AnyConverter.toInt(o); } public static short getShort(String name, Object parent) throws Exception { Object o = getNode(name, parent); if (AnyConverter.isVoid(o)) { return (short) 0; } return AnyConverter.toShort(o); } public static float getFloat(String name, Object parent) throws Exception { Object o = getNode(name, parent); if (AnyConverter.isVoid(o)) { return (float) 0; } return AnyConverter.toFloat(o); } public static double getDouble(String name, Object parent) throws Exception { Object o = getNode(name, parent); if (AnyConverter.isVoid(o)) { return (double) 0; } return AnyConverter.toDouble(o); } public static String getString(String name, Object parent) throws Exception { Object o = getNode(name, parent); if (AnyConverter.isVoid(o)) { return PropertyNames.EMPTY_STRING; } return (String) o; } public static boolean getBoolean(String name, Object parent) throws Exception { Object o = getNode(name, parent); if (AnyConverter.isVoid(o)) { return false; } return AnyConverter.toBoolean(o); } public static Object getNode(String name, Object parent) throws Exception { return UnoRuntime.queryInterface(XNameAccess.class, parent).getByName(name); } public static void set(int value, String name, Object parent) throws Exception { set(new Integer(value), name, parent); } public static void set(short value, String name, Object parent) throws Exception { set(new Short(value), name, parent); } public static void set(String value, String name, Object parent) throws Exception { set((Object) value, name, parent); } public static void set(boolean value, String name, Object parent) throws Exception { if (value) { set(Boolean.TRUE, name, parent); } else { set(Boolean.FALSE, name, parent); } } public static void set(Object value, String name, Object parent) throws com.sun.star.lang.IllegalArgumentException, PropertyVetoException, UnknownPropertyException, WrappedTargetException { UnoRuntime.queryInterface(XHierarchicalPropertySet.class, parent).setHierarchicalPropertyValue(name, value); } /** Creates a new instance of RegistryEntry * @param name * @param parent * @return * @throws Exception */ public static Object getConfigurationNode(String name, Object parent) throws Exception { return UnoRuntime.queryInterface(XNameAccess.class, parent).getByName(name); } public static Object getConfigurationRoot(XMultiServiceFactory xmsf, String sPath, boolean updateable) throws com.sun.star.uno.Exception { Object oConfigProvider; oConfigProvider = xmsf.createInstance("com.sun.star.configuration.ConfigurationProvider"); XMultiServiceFactory confMsf = UnoRuntime.queryInterface(XMultiServiceFactory.class, oConfigProvider); final String sView = updateable ? "com.sun.star.configuration.ConfigurationUpdateAccess" : "com.sun.star.configuration.ConfigurationAccess"; Object args[] = new Object[updateable ? 2 : 1]; PropertyValue aPathArgument = new PropertyValue(); aPathArgument.Name = "nodepath"; aPathArgument.Value = sPath; args[0] = aPathArgument; if (updateable) { PropertyValue aModeArgument = new PropertyValue(); aModeArgument.Name = "lazywrite"; aModeArgument.Value = Boolean.FALSE; args[1] = aModeArgument; } return confMsf.createInstanceWithArguments(sView, args); } public static String[] getChildrenNames(Object configView) { XNameAccess nameAccess = UnoRuntime.queryInterface(XNameAccess.class, configView); return nameAccess.getElementNames(); } public static String getProductName(XMultiServiceFactory xMSF) { try { Object oProdNameAccess = getConfigurationRoot(xMSF, "org.openoffice.Setup/Product", false); return (String) Helper.getUnoObjectbyName(oProdNameAccess, "ooName"); } catch (Exception exception) { exception.printStackTrace(System.out); return null; } } public static String getOfficeLocaleString(XMultiServiceFactory xMSF) { String sLocale = PropertyNames.EMPTY_STRING; try { Locale aLocLocale = new Locale(); Object oMasterKey = getConfigurationRoot(xMSF, "org.openoffice.Setup/L10N/", false); sLocale = (String) Helper.getUnoObjectbyName(oMasterKey, "ooLocale"); } catch (Exception exception) { exception.printStackTrace(System.out); } return sLocale; } public static Locale getOfficeLocale(XMultiServiceFactory xMSF) { Locale aLocLocale = new Locale(); // Object oMasterKey = getConfigurationRoot(xMSF, "org.openoffice.Setup/L10N/", false); // String sLocale = (String) Helper.getUnoObjectbyName(oMasterKey, "ooLocale"); String sLocale = getOfficeLocaleString(xMSF); String[] sLocaleList = JavaTools.ArrayoutofString(sLocale, "-"); aLocLocale.Language = sLocaleList[0]; if (sLocaleList.length > 1) { aLocLocale.Country = sLocaleList[1]; } return aLocLocale; } public static String getOfficeLinguistic(XMultiServiceFactory xMSF) { try { Object oMasterKey = getConfigurationRoot(xMSF, "org.openoffice.Setup/L10N/", false); return (String) Helper.getUnoObjectbyName(oMasterKey, "ooLocale"); } catch (Exception exception) { exception.printStackTrace(); return null; } } /** * This method creates a new configuration node and adds it * to the given view. Note that if a node with the given name * already exists it will be completely removed from * the configuration. * @param configView * @param name * @return the new created configuration node. * @throws com.sun.star.lang.WrappedTargetException * @throws ElementExistException * @throws NoSuchElementException * @throws com.sun.star.uno.Exception */ public static Object addConfigNode(Object configView, String name) throws com.sun.star.lang.WrappedTargetException, ElementExistException, NoSuchElementException, com.sun.star.uno.Exception { XNameContainer xNameContainer = UnoRuntime.queryInterface(XNameContainer.class, configView); if (xNameContainer == null) { XNameReplace xNameReplace = UnoRuntime.queryInterface(XNameReplace.class, configView); return xNameReplace.getByName(name); } else { /*if (xNameContainer.hasByName(name)) xNameContainer.removeByName(name);*/ // create a new detached set element (instance of DataSourceDescription) XSingleServiceFactory xElementFactory = UnoRuntime.queryInterface(XSingleServiceFactory.class, configView); // the new element is the result ! Object newNode = xElementFactory.createInstance(); // insert it - this also names the element xNameContainer.insertByName(name, newNode); return newNode; } } public static void removeNode(Object configView, String name) throws NoSuchElementException, WrappedTargetException { XNameContainer xNameContainer = UnoRuntime.queryInterface(XNameContainer.class, configView); if (xNameContainer.hasByName(name)) { xNameContainer.removeByName(name); } } public static void commit(Object configView) throws WrappedTargetException { XChangesBatch xUpdateControl = UnoRuntime.queryInterface(XChangesBatch.class, configView); xUpdateControl.commitChanges(); } public static void updateConfiguration(XMultiServiceFactory xmsf, String path, String name, ConfigNode node, Object param) throws com.sun.star.uno.Exception, com.sun.star.container.ElementExistException, NoSuchElementException, WrappedTargetException { Object view = Configuration.getConfigurationRoot(xmsf, path, true); addConfigNode(path, name); node.writeConfiguration(view, param); XChangesBatch xUpdateControl = UnoRuntime.queryInterface(XChangesBatch.class, view); xUpdateControl.commitChanges(); } public static void removeNode(XMultiServiceFactory xmsf, String path, String name) throws com.sun.star.uno.Exception, com.sun.star.container.ElementExistException, NoSuchElementException, WrappedTargetException { Object view = Configuration.getConfigurationRoot(xmsf, path, true); removeNode(view, name); XChangesBatch xUpdateControl = UnoRuntime.queryInterface(XChangesBatch.class, view); xUpdateControl.commitChanges(); } public static String[] getNodeDisplayNames(XNameAccess _xNameAccessNode) { String[] snames = null; return getNodeChildNames(_xNameAccessNode, PropertyNames.PROPERTY_NAME); } public static String[] getNodeChildNames(XNameAccess xNameAccessNode, String _schildname) { String[] snames = null; try { snames = xNameAccessNode.getElementNames(); String[] sdisplaynames = new String[snames.length]; for (int i = 0; i < snames.length; i++) { Object oContent = Helper.getUnoPropertyValue(xNameAccessNode.getByName(snames[i]), _schildname); if (!AnyConverter.isVoid(oContent)) { sdisplaynames[i] = (String) Helper.getUnoPropertyValue(xNameAccessNode.getByName(snames[i]), _schildname); } else { sdisplaynames[i] = snames[i]; } } return sdisplaynames; } catch (Exception e) { e.printStackTrace(System.out); return snames; } } public static XNameAccess getChildNodebyIndex(XNameAccess _xNameAccess, int _index) { try { String[] snames = _xNameAccess.getElementNames(); Object oNode = _xNameAccess.getByName(snames[_index]); return UnoRuntime.queryInterface(XNameAccess.class, oNode); } catch (Exception e) { e.printStackTrace(System.out); return null; } } public static XNameAccess getChildNodebyName(XNameAccess _xNameAccessNode, String _SubNodeName) { try { if (_xNameAccessNode.hasByName(_SubNodeName)) { return UnoRuntime.queryInterface(XNameAccess.class, _xNameAccessNode.getByName(_SubNodeName)); } } catch (Exception e) { e.printStackTrace(System.out); } return null; } public static XNameAccess getChildNodebyDisplayName(XNameAccess _xNameAccessNode, String _displayname) { String[] snames = null; return getChildNodebyDisplayName(_xNameAccessNode, _displayname, PropertyNames.PROPERTY_NAME); } public static XNameAccess getChildNodebyDisplayName(XNameAccess _xNameAccessNode, String _displayname, String _nodename) { String[] snames = null; try { snames = _xNameAccessNode.getElementNames(); String[] sdisplaynames = new String[snames.length]; for (int i = 0; i < snames.length; i++) { String curdisplayname = (String) Helper.getUnoPropertyValue(_xNameAccessNode.getByName(snames[i]), _nodename); if (curdisplayname.equals(_displayname)) { return UnoRuntime.queryInterface(XNameAccess.class, _xNameAccessNode.getByName(snames[i])); } } } catch (Exception e) { e.printStackTrace(System.out); } return null; } public static XNameAccess getChildNodebyDisplayName(XMultiServiceFactory _xMSF, Locale _aLocale, XNameAccess _xNameAccessNode, String _displayname, String _nodename, int _nmaxcharcount) { String[] snames = null; try { snames = _xNameAccessNode.getElementNames(); String[] sdisplaynames = new String[snames.length]; for (int i = 0; i < snames.length; i++) { String curdisplayname = (String) Helper.getUnoPropertyValue(_xNameAccessNode.getByName(snames[i]), _nodename); if ((_nmaxcharcount > 0) && (_nmaxcharcount < curdisplayname.length())) { curdisplayname = curdisplayname.substring(0, _nmaxcharcount); } curdisplayname = Desktop.removeSpecialCharacters(_xMSF, _aLocale, curdisplayname); if (curdisplayname.equals(_displayname)) { return UnoRuntime.queryInterface(XNameAccess.class, _xNameAccessNode.getByName(snames[i])); } } } catch (Exception e) { e.printStackTrace(System.out); } return null; } }