summaryrefslogtreecommitdiff
path: root/forms/source/xforms/binding.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'forms/source/xforms/binding.hxx')
-rw-r--r--forms/source/xforms/binding.hxx527
1 files changed, 527 insertions, 0 deletions
diff --git a/forms/source/xforms/binding.hxx b/forms/source/xforms/binding.hxx
new file mode 100644
index 000000000000..7a69b1547418
--- /dev/null
+++ b/forms/source/xforms/binding.hxx
@@ -0,0 +1,527 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _BINDING_HXX
+#define _BINDING_HXX
+
+#include <com/sun/star/uno/Reference.hxx>
+
+// forward declaractions
+namespace xforms
+{
+ class Model;
+ class EvaluationContext;
+}
+namespace com { namespace sun { namespace star {
+ namespace xml {
+ namespace xpath { class XXPathAPI; }
+ namespace dom
+ {
+ class XNode;
+ class XNodeList;
+ }
+ }
+ namespace container { class XNameContainer; }
+ namespace xforms { class XModel; }
+ namespace xsd { class XDataType; }
+} } }
+
+// includes for parent classes
+#include <cppuhelper/implbase8.hxx>
+#include <propertysetbase.hxx>
+#include <com/sun/star/form/binding/XValueBinding.hpp>
+#include <com/sun/star/form/binding/XListEntrySource.hpp>
+#include <com/sun/star/form/validation/XValidator.hpp>
+#include <com/sun/star/util/XModifyBroadcaster.hpp>
+#include <com/sun/star/container/XNamed.hpp>
+#include <com/sun/star/xml/dom/events/XEventListener.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
+#include <com/sun/star/util/XCloneable.hpp>
+
+// includes for member variables
+#include "pathexpression.hxx"
+#include "boolexpression.hxx"
+#include "mip.hxx"
+#include <rtl/ustring.hxx>
+#include <vector>
+#include <memory> // auto_ptr
+
+
+
+namespace xforms
+{
+
+/** An XForms Binding. Contains:
+ * # a connection to its model
+ * # an ID
+ * # an binding expression
+ * # model item properties
+ * # (NOT YET IMPLEMENTED) child bindings (sequence of)
+ *
+ * See http://www.w3.org/TR/xforms/ for more information.
+ */
+
+typedef cppu::ImplInheritanceHelper8<
+ PropertySetBase,
+ com::sun::star::form::binding::XValueBinding,
+ com::sun::star::form::binding::XListEntrySource,
+ com::sun::star::form::validation::XValidator,
+ com::sun::star::util::XModifyBroadcaster,
+ com::sun::star::container::XNamed,
+ com::sun::star::xml::dom::events::XEventListener,
+ com::sun::star::lang::XUnoTunnel,
+ com::sun::star::util::XCloneable
+> Binding_t;
+
+class Binding : public Binding_t
+{
+public:
+ typedef com::sun::star::uno::Reference<com::sun::star::xforms::XModel> Model_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::util::XModifyListener> XModifyListener_t;
+ typedef std::vector<XModifyListener_t> ModifyListeners_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::form::validation::XValidityConstraintListener> XValidityConstraintListener_t;
+ typedef std::vector<XValidityConstraintListener_t> XValidityConstraintListeners_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::form::binding::XListEntryListener> XListEntryListener_t;
+ typedef std::vector<XListEntryListener_t> XListEntryListeners_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::container::XNameContainer> XNameContainer_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::xml::dom::XNode> XNode_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::xml::dom::XNodeList> XNodeList_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::util::XCloneable> XCloneable_t;
+ typedef com::sun::star::uno::Sequence<sal_Int8> IntSequence_t;
+ typedef com::sun::star::uno::Sequence<rtl::OUString> StringSequence_t;
+ typedef std::vector<MIP> MIPs_t;
+ typedef std::vector<XNode_t> XNodes_t;
+
+
+
+private:
+
+ /// the Model to which this Binding belongs; may be NULL
+ Model_t mxModel;
+
+ /// binding-ID. A document-wide unique ID for this binding element.
+ rtl::OUString msBindingID;
+
+ /// an XPath-expression to be instantiated on the data instance
+ PathExpression maBindingExpression;
+
+ /// an XPath-expression to determine read-only status
+ BoolExpression maReadonly;
+
+ /// an XPath-expression to determine relevance
+ BoolExpression maRelevant;
+
+ /// an XPath-expression to determine if item is required
+ BoolExpression maRequired;
+
+ /// an XPath-expression to determine if item is valid
+ BoolExpression maConstraint;
+
+ /// user-readable explanation of the constraint
+ rtl::OUString msExplainConstraint;
+
+ /// an XPath-expression to calculate values
+ ComputedExpression maCalculate;
+
+ /// the XML namespaces used for XML names/XPath-expressions in this binding
+ XNameContainer_t mxNamespaces;
+
+ /// a type name
+ rtl::OUString msTypeName;
+
+ /// modify listeners
+ ModifyListeners_t maModifyListeners;
+
+ /// list entry listener
+ XListEntryListeners_t maListEntryListeners;
+
+ /// validity listeners;
+ XValidityConstraintListeners_t maValidityListeners;
+
+ /// nodes on which we are listening for events
+ XNodes_t maEventNodes;
+
+ /// the current MIP object for the first node we are bound to
+ MIP maMIP;
+
+ /// flag to detect recursions in calculate
+ bool mbInCalculate;
+
+ // flags to manage deferred notifications:
+ /// if >0, valueModified() and bindingModified() will only set flags
+ sal_Int32 mnDeferModifyNotifications;
+ bool mbValueModified; /// if true, valueModified needs to be called
+ bool mbBindingModified; /// if true, bindingModified needs to be called
+
+
+ void initializePropertySet();
+
+
+public:
+ Binding();
+ virtual ~Binding() throw();
+
+ //
+ // property methods: get/set value
+ //
+
+ Model_t getModel() const; /// get XForms model
+ void _setModel( const Model_t& ); /// set XForms model (only called by Model)
+
+
+ rtl::OUString getModelID() const; /// get ID of XForms model
+
+ rtl::OUString getBindingID() const; /// get ID for this binding
+ void setBindingID( const rtl::OUString& ); /// set ID for this binding
+
+ rtl::OUString getBindingExpression() const; /// get binding expression
+ void setBindingExpression( const rtl::OUString& ); /// set binding exp.
+
+ // MIPs (model item properties)
+
+ rtl::OUString getReadonlyExpression() const; /// get read-only MIP
+ void setReadonlyExpression( const rtl::OUString& ); /// set read-only MIP
+
+ rtl::OUString getRelevantExpression() const; /// get relevant MIP
+ void setRelevantExpression( const rtl::OUString& ); /// set relevant MIP
+
+ rtl::OUString getRequiredExpression() const; /// get required MIP
+ void setRequiredExpression( const rtl::OUString& ); /// set required MIP
+
+ rtl::OUString getConstraintExpression() const; /// get constraint MIP
+ void setConstraintExpression( const rtl::OUString& );/// set constraint MIP
+
+ rtl::OUString getCalculateExpression() const; /// get calculate MIP
+ void setCalculateExpression( const rtl::OUString& ); /// set calculate MIP
+
+ rtl::OUString getType() const; /// get type name MIP (static)
+ void setType( const rtl::OUString& ); /// set type name MIP (static)
+
+ // a binding expression can only be interpreted with respect to
+ // suitable namespace declarations. We collect those in the model and in a binding.
+
+ // access to a binding's namespace
+ // (set-method only changes local namespaces (but may add to model))
+ XNameContainer_t getBindingNamespaces() const; /// set binding namespaces
+ void setBindingNamespaces( const XNameContainer_t& ); /// get binding nmsp.
+
+ // access to the model's namespaces
+ // (set-method changes model's namespaces (unless a local one is present))
+ XNameContainer_t getModelNamespaces() const; /// set model namespaces
+ void setModelNamespaces( const XNameContainer_t& ); /// get model nmsp.
+
+
+ // read-only properties that map MIPs to control data source properties
+ bool getReadOnly() const; // MIP readonly
+ bool getRelevant() const; // MIP relevant
+ bool getExternalData() const; // mapped from model's ExternalData property
+
+
+ // missing binding properties:
+ // - type (static; default: xsd:string)
+ // - minOccurs/maxOccurs (computed XPath; default: 0/inf)
+ // - p3ptype (static; no default)
+
+
+
+
+ /// get this binding's context node
+ xforms::EvaluationContext getEvaluationContext() const;
+
+ /// get evalation contexts for this binding's MIPs
+ std::vector<xforms::EvaluationContext> getMIPEvaluationContexts();
+
+ /// get nodeset the bind is bound to
+ XNodeList_t getXNodeList();
+
+ /// heuristically determine whether this binding is simple binding
+ /// (here: simple binding == does not depend on other parts of the
+ /// instance, it's not a 'dynamic' binding)
+ bool isSimpleBinding() const;
+
+ /// heuristically determine whether this binding's binding
+ /// expression is simple
+ bool isSimpleBindingExpression() const;
+
+ /// update this binding (e.g. called by model for refresh )
+ void update();
+
+ /// prevent change notifications being sent to controls
+ void deferNotifications( bool );
+
+ /// is this binding valid? (are constraint, type and required MIPs ok?)
+ bool isValid();
+
+ /// determine whether this binding currently performs a useful
+ /// function, r whether is may be discarded
+ bool isUseful();
+
+ /// explain why binding is invalid
+ rtl::OUString explainInvalid();
+
+
+ // the ID for XUnoTunnel calls
+ static IntSequence_t getUnoTunnelID();
+ static Binding* getBinding( const com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet>& );
+
+ //
+ // class-scoped typedef for easy-to-read UNO interfaces
+ //
+
+ // basic types
+ typedef com::sun::star::uno::Any Any_t;
+ typedef com::sun::star::uno::Sequence<com::sun::star::uno::Type> Sequence_Type_t;
+ typedef com::sun::star::uno::Type Type_t;
+
+ // reference types
+ typedef com::sun::star::uno::Reference<com::sun::star::beans::XPropertyChangeListener> XPropertyChangeListener_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::beans::XPropertySetInfo> XPropertySetInfo_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::beans::XVetoableChangeListener> XVetoableChangeListener_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::xml::xpath::XXPathAPI> XXPathAPI_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::xml::dom::events::XEvent> XEvent_t;
+ typedef com::sun::star::uno::Reference<com::sun::star::xsd::XDataType> XDataType_t;
+
+ // exceptions
+ typedef com::sun::star::beans::PropertyVetoException PropertyVetoException_t;
+ typedef com::sun::star::beans::UnknownPropertyException UnknownPropertyException_t;
+ typedef com::sun::star::lang::IllegalArgumentException IllegalArgumentException_t;
+ typedef com::sun::star::lang::NoSupportException NoSupportException_t;
+ typedef com::sun::star::lang::WrappedTargetException WrappedTargetException_t;
+ typedef com::sun::star::uno::RuntimeException RuntimeException_t;
+ typedef com::sun::star::form::binding::IncompatibleTypesException IncompatibleTypesException_t;
+ typedef com::sun::star::form::binding::InvalidBindingStateException InvalidBindingStateException_t;
+ typedef com::sun::star::lang::NullPointerException NullPointerException_t;
+ typedef com::sun::star::lang::IndexOutOfBoundsException IndexOutOfBoundsException_t;
+
+
+
+private:
+ /// check whether object is live, and throw suitable exception if not
+ /// (to be used be API methods before acting on the object)
+ void checkLive() throw( RuntimeException_t );
+
+ /// check whether binding has a model, and throw exception if not
+ /// (to be used be API methods before acting on the object)
+ void checkModel() throw( RuntimeException_t );
+
+ /// determine whether object is live
+ /// live: has model, and model has been initialized
+ bool isLive() const;
+
+ /// get the model implementation
+ xforms::Model* getModelImpl() const;
+ xforms::Model* getModelImpl( const Model_t& xModel ) const;
+
+ /// get MIP evaluation contexts
+ /// (only valid if control has already been bound)
+ std::vector<xforms::EvaluationContext> _getMIPEvaluationContexts() const;
+
+ /// bind this binding, and pre-compute the affected nodes
+ void bind( bool bForceRebind = false );
+
+ /// the binding value has been changed:
+ /// trigger a modified event on all modified listeners
+ void valueModified();
+
+ /// the binding itself has changed:
+ /// force rebind, then call valueModified()
+ void bindingModified();
+
+
+ /// register the event listeners for
+ void registerListeners();
+
+ /// set MIPs defined by this binding on MIP item
+ MIP getLocalMIP() const;
+
+ /// get the data type that applies to this binding
+ XDataType_t getDataType();
+
+ /// determine whether binding is valid according to the given data type
+ bool isValid_DataType();
+
+ /// explain validity of binding with respect to the given data type
+ rtl::OUString explainInvalid_DataType();
+
+ /// 'clear' this binding - remove all listeners, etc.
+ void clear();
+
+ /// distribute MIPs from current node recursively to childs
+ void distributeMIP( const XNode_t &rxNode );
+
+ /// implement get*Namespaces()
+ XNameContainer_t _getNamespaces() const;
+
+ /// implement set*Namespaces()
+ void _setNamespaces( const XNameContainer_t&, bool bBinding );
+
+ /// set a useful default binding ID (if none is set)
+ void _checkBindingID();
+
+public:
+ /// for debugging purposes only: get the MIPs defined by this binding
+ const MIP* _getMIP();
+
+
+
+
+
+ //
+ // XValueBinding:
+ //
+
+public:
+
+ virtual Sequence_Type_t SAL_CALL getSupportedValueTypes()
+ throw( RuntimeException_t );
+
+ virtual sal_Bool SAL_CALL supportsType( const Type_t& aType )
+ throw( RuntimeException_t );
+
+ virtual Any_t SAL_CALL getValue( const Type_t& aType )
+ throw( IncompatibleTypesException_t,
+ RuntimeException_t );
+
+ virtual void SAL_CALL setValue( const Any_t& aValue )
+ throw( IncompatibleTypesException_t,
+ InvalidBindingStateException_t,
+ NoSupportException_t,
+ RuntimeException_t );
+
+
+
+ //
+ // XListEntry Source
+ //
+
+ virtual sal_Int32 SAL_CALL getListEntryCount()
+ throw( RuntimeException_t );
+
+ virtual rtl::OUString SAL_CALL getListEntry( sal_Int32 nPosition )
+ throw( IndexOutOfBoundsException_t,
+ RuntimeException_t );
+
+ virtual StringSequence_t SAL_CALL getAllListEntries()
+ throw( RuntimeException_t );
+
+ virtual void SAL_CALL addListEntryListener( const XListEntryListener_t& )
+ throw( NullPointerException_t,
+ RuntimeException_t );
+
+ virtual void SAL_CALL removeListEntryListener( const XListEntryListener_t&)
+ throw( NullPointerException_t,
+ RuntimeException_t );
+
+
+
+ //
+ // XValidator:
+ //
+
+ virtual sal_Bool SAL_CALL isValid(
+ const Any_t& )
+ throw( RuntimeException_t );
+
+ virtual rtl::OUString SAL_CALL explainInvalid(
+ const Any_t& )
+ throw( RuntimeException_t );
+
+ virtual void SAL_CALL addValidityConstraintListener(
+ const XValidityConstraintListener_t& xListener )
+ throw( NullPointerException_t,
+ RuntimeException_t );
+
+ virtual void SAL_CALL removeValidityConstraintListener(
+ const XValidityConstraintListener_t& xListener )
+ throw( NullPointerException_t,
+ RuntimeException_t );
+
+
+ //
+ // XModifyBroadcaster & friends:
+ // inform listeners about changes in our values
+ //
+
+public:
+
+ virtual void SAL_CALL addModifyListener(
+ const XModifyListener_t& xListener )
+ throw( RuntimeException_t );
+
+ virtual void SAL_CALL removeModifyListener(
+ const XModifyListener_t& xListener )
+ throw( RuntimeException_t );
+
+
+
+
+ //
+ // XNamed:
+ // get/set name
+ //
+
+public:
+
+ virtual rtl::OUString SAL_CALL getName()
+ throw( RuntimeException_t );
+
+ virtual void SAL_CALL setName( const rtl::OUString& )
+ throw( RuntimeException_t );
+
+
+
+ //
+ // xml::dom::event::XEventListener
+ // receive an event if our node changed
+ //
+
+ virtual void SAL_CALL handleEvent(
+ const XEvent_t& xEvent )
+ throw( RuntimeException_t );
+
+
+
+ //
+ // XUnoTunnel
+ //
+
+ virtual sal_Int64 SAL_CALL getSomething( const IntSequence_t& )
+ throw( RuntimeException_t );
+
+
+ //
+ // XCloneable
+ //
+
+ virtual XCloneable_t SAL_CALL createClone()
+ throw( RuntimeException_t );
+};
+
+
+} // namespace xforms
+
+#endif