blob: e614d5e4f03308f1d461aa9b467d9203ccff6817 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#ifndef _UTL_CONFIGITEM_HXX_
#define _UTL_CONFIGITEM_HXX_
#include <sal/types.h>
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Sequence.h>
#include <com/sun/star/uno/Reference.h>
#include "unotools/unotoolsdllapi.h"
#include "unotools/options.hxx"
//-----------------------------------------------------------------------------
namespace com{ namespace sun{ namespace star{
namespace uno{
class Any;
}
namespace beans{
struct PropertyValue;
}
namespace container{
class XHierarchicalNameAccess;
}
namespace util{
class XChangesListener;
}
}}}
//-----------------------------------------------------------------------------
namespace utl
{
#define CONFIG_MODE_IMMEDIATE_UPDATE 0x00
#define CONFIG_MODE_DELAYED_UPDATE 0x01
#define CONFIG_MODE_ALL_LOCALES 0x02
#define CONFIG_MODE_RELEASE_TREE 0x04
#define CONFIG_MODE_IGNORE_ERRORS 0x08 // prevent assertions, if creation fails
#define CONFIG_MODE_PROPAGATE_ERRORS 0x10 // throw exceptions, if creation fails
enum ConfigNameFormat
{
CONFIG_NAME_PLAINTEXT_NAME, // unescaped local node name, for user display etc.
CONFIG_NAME_LOCAL_NAME, // local node name, for use in XNameAccess etc. ("Item", "Q & A")
CONFIG_NAME_LOCAL_PATH, // one-level relative path, for use when building pathes etc. ("Item", "Typ['Q &amp; A']")
CONFIG_NAME_FULL_PATH, // full absolute path. ("/org.openoffice.Sample/Group/Item", "/org.openoffice.Sample/Set/Typ['Q &amp; A']")
CONFIG_NAME_DEFAULT = CONFIG_NAME_LOCAL_PATH // default format
};
class ConfigChangeListener_Impl;
class ConfigManager;
struct ConfigItem_Impl;
class UNOTOOLS_DLLPUBLIC ConfigItem : public ConfigurationBroadcaster
{
friend class ConfigChangeListener_Impl;
friend class ConfigManager;
const rtl::OUString sSubTree;
com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess>
m_xHierarchyAccess;
com::sun::star::uno::Reference< com::sun::star::util::XChangesListener >
xChangeLstnr;
ConfigItem_Impl* pImpl;
ConfigItem();//
void RemoveChangesListener();
void CallNotify(
const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames);
//***********************************************************************************************************************
// In special mode ALL_LOCALES we must support reading/writing of localized cfg entries as Sequence< PropertyValue >.
// These methods are helper to convert given lists of names and Any-values.
// format: PropertyValue.Name = <locale as ISO string>
// PropertyValue.Value = <value; type depends from cfg entry!>
// e.g.
// LOCALIZED NODE
// "UIName"
// LOCALE VALUE
// "de" "Mein Name"
// "en-US" "my name"
void impl_packLocalizedProperties ( const com::sun::star::uno::Sequence< rtl::OUString >& lInNames ,
const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& lInValues ,
com::sun::star::uno::Sequence< com::sun::star::uno::Any >& lOutValues );
void impl_unpackLocalizedProperties ( const com::sun::star::uno::Sequence< rtl::OUString >& lInNames ,
const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& lInValues ,
com::sun::star::uno::Sequence< rtl::OUString >& lOutNames ,
com::sun::star::uno::Sequence< com::sun::star::uno::Any >& lOutValues );
com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess>
GetTree();
protected:
ConfigItem(const rtl::OUString rSubTree,
sal_Int16 nMode = CONFIG_MODE_DELAYED_UPDATE);
ConfigItem(utl::ConfigManager& rManager, const rtl::OUString rSubTree);
void SetModified (); // mark item as modified
void ClearModified(); // reset state after commit!
com::sun::star::uno::Sequence< com::sun::star::uno::Any>
GetProperties(const com::sun::star::uno::Sequence< rtl::OUString >& rNames);
com::sun::star::uno::Sequence< sal_Bool >
GetReadOnlyStates(const com::sun::star::uno::Sequence< rtl::OUString >& rNames);
sal_Bool PutProperties(
const com::sun::star::uno::Sequence< rtl::OUString >& rNames,
const com::sun::star::uno::Sequence< com::sun::star::uno::Any>& rValues);
/** enables notifications about changes on selected sub nodes/values
Before calling this method a second time for a possibly changed node/value set,
you must disable the current notifications by calling DisableNotification.
@see Notify
@see DisableNotification
*/
sal_Bool EnableNotification(const com::sun::star::uno::Sequence< rtl::OUString >& rNames,
sal_Bool bEnableInternalNotification = sal_False);
/** disables notifications about changes on sub nodes/values, which previosly had
been enabled with EnableNotification
@see Notify
@see EnableNotification
*/
void DisableNotification();
sal_Bool IsInternalNotification()const {return IsInValueChange();}
//returns all members of a node in a specific format
com::sun::star::uno::Sequence< rtl::OUString >
GetNodeNames(const rtl::OUString& rNode);
//returns all members of a node in a specific format
com::sun::star::uno::Sequence< rtl::OUString >
GetNodeNames(const rtl::OUString& rNode, ConfigNameFormat eFormat);
// remove all members of a set
sal_Bool ClearNodeSet(const rtl::OUString& rNode);
// remove selected members of a set
sal_Bool ClearNodeElements(const rtl::OUString& rNode,
com::sun::star::uno::Sequence< rtl::OUString >& rElements);
// change or add members to a set
sal_Bool SetSetProperties(const rtl::OUString& rNode, com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > rValues);
// remove, change or add members of a set
sal_Bool ReplaceSetProperties(const rtl::OUString& rNode, com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > rValues);
// add a new node without setting any properties
sal_Bool AddNode(const rtl::OUString& rNode, const rtl::OUString& rNewNode);
/** get a name for a new element of a set node
@param _rSetNode
relative path to the set node
@param _rBaseName
<ul><li><b>in</b>: the base to use when calculating a new name</li>
<li><b>out</b>: an unused element name</li>
</ul>
@return <TRUE/> if a free name could be generated
*/
sal_Bool getUniqueSetElementName( const rtl::OUString& _rSetNode, rtl::OUString& _rBaseName);
public:
virtual ~ConfigItem();
/** is called from the ConfigManager before application ends of from the
PropertyChangeListener if the sub tree broadcasts changes. */
virtual void Notify( const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames)=0;
/** is called from the ConfigManager if it is destroyed before the ConfigItem. */
void ReleaseConfigMgr();
/** enable locking of the XHierarchicalNameAccess if CONFIG_MODE_RELEASE_TREE is set to
prevent multiple calls ConfigManager::AcquireTree() from a single Commit() operation*/
void LockTree();
void UnlockTree();
const rtl::OUString& GetSubTreeName() const {return sSubTree;}
sal_Bool IsModified() const;
/** writes the changed values into the sub tree. Always called in the Dtor of the derived class. */
virtual void Commit()=0;
sal_Bool IsInValueChange() const;
sal_Int16 GetMode() const;
/** checks if the configuration manager used by this item is valid.
*/
sal_Bool IsValidConfigMgr() const;
};
}//namespace utl
#endif //_UTL_CONFIGITEM_HXX_