1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#ifndef INCLUDED_FORMS_SOURCE_XFORMS_MODEL_HXX
#define INCLUDED_FORMS_SOURCE_XFORMS_MODEL_HXX
#include <cppuhelper/implbase.hxx>
#include "propertysetbase.hxx"
#include <com/sun/star/xforms/XModel2.hpp>
#include <com/sun/star/xforms/XFormsUIHelper1.hpp>
#include <com/sun/star/util/XUpdatable.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/uno/Reference.hxx>
#include <rtl/ref.hxx>
#include "mip.hxx"
#include <map>
// forward declaractions
namespace com::sun::star
{
namespace xml::dom { class XDocument; }
namespace xml::dom { class XNode; }
namespace uno { template<typename T> class Sequence; }
namespace lang { class IndexOutOfBoundsException; }
namespace lang { class IllegalArgumentException; }
namespace beans { class XPropertySet; }
namespace container { class XSet; }
namespace container { class XNameContainer; }
namespace frame { class XModel; }
}
namespace xforms
{
class BindingCollection;
class SubmissionCollection;
class InstanceCollection;
class EvaluationContext;
}
namespace xforms
{
/** An XForms Model. Contains:
* # (set of) instance data (XML DOM tree)
* # (set of) bindings
* # (set of) submissions
* # (NOT YET IMPLEMENTED) actions (set of)
*
* See http://www.w3.org/TR/xforms/ for more information.
*/
typedef cppu::ImplInheritanceHelper<
PropertySetBase,
css::xforms::XModel2,
css::xforms::XFormsUIHelper1,
css::util::XUpdatable,
css::lang::XUnoTunnel,
css::lang::XServiceInfo
> Model_t;
class Model : public Model_t
{
// a number of local typedefs, to make the remaining header readable
typedef css::uno::Reference<css::xml::dom::XNode> XNode_t;
typedef css::uno::Reference<css::beans::XPropertySet> XPropertySet_t;
typedef std::multimap<XNode_t,std::pair<void*,MIP> > MIPs_t;
private:
OUString msID; /// the model ID
rtl::Reference<BindingCollection> mxBindings; /// the bindings
rtl::Reference<SubmissionCollection> mxSubmissions; /// the submissions
rtl::Reference<InstanceCollection> mxInstances; /// the instance(s)
css::uno::Reference<css::xforms::XDataTypeRepository> mxDataTypes; /// the XSD data-types used
css::uno::Reference<css::xml::dom::XDocument> mxForeignSchema; /// the XSD-schema part we cannot
/// map onto data types
OUString msSchemaRef; /// xforms:model/@schema attribute
css::uno::Reference<css::container::XNameContainer> mxNamespaces; /// namespaces for entire model
MIPs_t maMIPs; /// map nodes to their MIPs
bool mbInitialized; /// has model been initialized ?
bool mbExternalData; /// is the data of this model to be considered an integral part of the document?
void initializePropertySet();
void ensureAtLeastOneInstance();
public:
/// create a new model with an empty, default instance
Model();
virtual ~Model() throw() override;
xforms::EvaluationContext getEvaluationContext();
static css::uno::Sequence<sal_Int8> getUnoTunnelId();
// get/set that part of the schema, that we can't interpret as data types
css::uno::Reference<css::xml::dom::XDocument> getForeignSchema() const { return mxForeignSchema;}
void setForeignSchema( const css::uno::Reference<css::xml::dom::XDocument>& );
// get/set the xforms:model/@schema attribute
OUString getSchemaRef() const { return msSchemaRef;}
void setSchemaRef( const OUString& );
// get/set namespaces for entire model
css::uno::Reference<css::container::XNameContainer> getNamespaces() const { return mxNamespaces;}
void setNamespaces( const css::uno::Reference<css::container::XNameContainer>& );
// get/set the ExternalData property
bool getExternalData() const { return mbExternalData;}
void setExternalData( bool _bData );
#if OSL_DEBUG_LEVEL > 0 && !defined NDEBUG
void dbg_assertInvariant() const;
#endif
// MIP (model item property) management
// register MIPs which apply to a given node; only to be called by bindings
// (The pTag parameter serves only to be able to remove the MIPs
// that were added using the same tag. No functions will be
// performed on it; hence the void* type.)
void addMIP( void* pTag, const XNode_t&, const MIP& );
void removeMIPs( void const * pTag );
/// query which MIPs apply to the given node
MIP queryMIP( const XNode_t& xNode ) const;
/// re-bind all bindings
void rebind();
/// call defer notifications on all bindings
void deferNotifications( bool );
/// set a data value in the instance
/// (also defers notifications)
bool setSimpleContent( const XNode_t&, const OUString& );
/// load instance data
void loadInstance( sal_Int32 nInstance );
void loadInstances();
/// has model been initialized?
bool isInitialized() const { return mbInitialized;}
/// is model currently valid (for submission)?
bool isValid() const;
// XModel
// implement the xforms::XModel implementation
virtual OUString SAL_CALL getID() override;
virtual void SAL_CALL setID( const OUString& sID ) override;
virtual void SAL_CALL initialize() override;
virtual void SAL_CALL rebuild() override;
virtual void SAL_CALL recalculate() override;
virtual void SAL_CALL revalidate() override;
virtual void SAL_CALL refresh() override;
virtual void SAL_CALL submit( const OUString& sID ) override;
virtual void SAL_CALL submitWithInteraction( const OUString& id, const css::uno::Reference<css::task::XInteractionHandler>& _rxHandler ) override;
virtual css::uno::Reference<css::xforms::XDataTypeRepository> SAL_CALL getDataTypeRepository( ) override;
// XModel: instance management
virtual css::uno::Reference<css::container::XSet> SAL_CALL getInstances() override;
virtual css::uno::Reference<css::xml::dom::XDocument> SAL_CALL getInstanceDocument( const OUString& ) override;
virtual css::uno::Reference<css::xml::dom::XDocument> SAL_CALL getDefaultInstance() override;
// XModel: binding management
virtual css::uno::Reference<css::beans::XPropertySet> SAL_CALL createBinding() override;
virtual css::uno::Reference<css::beans::XPropertySet> SAL_CALL cloneBinding( const css::uno::Reference<css::beans::XPropertySet>& ) override;
virtual css::uno::Reference<css::beans::XPropertySet> SAL_CALL getBinding( const OUString& ) override;
virtual css::uno::Reference<css::container::XSet> SAL_CALL getBindings() override;
// XModel: submission management
virtual css::uno::Reference<css::xforms::XSubmission> SAL_CALL createSubmission() override;
virtual css::uno::Reference<css::xforms::XSubmission> SAL_CALL cloneSubmission( const css::uno::Reference<css::beans::XPropertySet>& ) override;
virtual css::uno::Reference<css::xforms::XSubmission> SAL_CALL getSubmission( const OUString& ) override;
virtual css::uno::Reference<css::container::XSet> SAL_CALL getSubmissions() override;
// XPropertySet
virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& p) override
{ return PropertySetBase::getPropertyValue(p); }
virtual void SAL_CALL addPropertyChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XPropertyChangeListener>& p2) override
{ PropertySetBase::addPropertyChangeListener(p1, p2); }
virtual void SAL_CALL removePropertyChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XPropertyChangeListener>& p2) override
{ PropertySetBase::removePropertyChangeListener(p1, p2); }
virtual void SAL_CALL addVetoableChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XVetoableChangeListener>& p2) override
{ PropertySetBase::addVetoableChangeListener(p1, p2); }
virtual void SAL_CALL removeVetoableChangeListener(const OUString& p1, const css::uno::Reference<css::beans::XVetoableChangeListener>& p2) override
{ PropertySetBase::removeVetoableChangeListener(p1, p2); }
virtual css::uno::Reference<css::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() override
{ return PropertySetBase::getPropertySetInfo(); }
virtual void SAL_CALL setPropertyValue(const OUString& p1, const css::uno::Any& p2) override
{ PropertySetBase::setPropertyValue(p1, p2); }
// XFormsUIHelper1 & friends:
// (implementation in model_ui.cxx)
/// determine a reasonable control service for a given node
/// (based on data type MIP assigned to the node)
virtual OUString SAL_CALL getDefaultServiceNameForNode( const css::uno::Reference<css::xml::dom::XNode>& xNode ) override;
/// call getDefaultBindingExpressionForNode with default evaluation context
virtual OUString SAL_CALL getDefaultBindingExpressionForNode( const css::uno::Reference<css::xml::dom::XNode>& xNode ) override;
/// determine a reasonable default binding expression for a given node
/// and a given evaluation context
/// @returns expression, or empty string if no expression could be derived
OUString getDefaultBindingExpressionForNode(
const XNode_t&,
const EvaluationContext& );
virtual OUString SAL_CALL getNodeDisplayName( const css::uno::Reference<css::xml::dom::XNode>&,
sal_Bool bDetail ) override;
virtual OUString SAL_CALL getNodeName( const css::uno::Reference<css::xml::dom::XNode>& ) override;
virtual OUString SAL_CALL getBindingName( const css::uno::Reference< ::css::beans::XPropertySet >&,
sal_Bool bDetail ) override;
virtual OUString SAL_CALL getSubmissionName( const css::uno::Reference< ::css::beans::XPropertySet >&,
sal_Bool bDetail ) override;
virtual css::uno::Reference< ::css::beans::XPropertySet > SAL_CALL cloneBindingAsGhost( const css::uno::Reference< ::css::beans::XPropertySet >& ) override;
virtual void SAL_CALL removeBindingIfUseless( const css::uno::Reference< ::css::beans::XPropertySet >& ) override;
virtual css::uno::Reference<css::xml::dom::XDocument> SAL_CALL newInstance( const OUString& sName,
const OUString& sURL,
sal_Bool bURLOnce ) override;
virtual void SAL_CALL renameInstance( const OUString& sFrom,
const OUString& sTo,
const OUString& sURL,
sal_Bool bURLOnce ) override;
virtual void SAL_CALL removeInstance( const OUString& sName ) override;
virtual css::uno::Reference<css::xforms::XModel> SAL_CALL newModel( const css::uno::Reference<css::frame::XModel>& xComponent,
const OUString& sName ) override;
virtual void SAL_CALL renameModel( const css::uno::Reference<css::frame::XModel>& xComponent,
const OUString& sFrom,
const OUString& sTo ) override;
virtual void SAL_CALL removeModel( const css::uno::Reference<css::frame::XModel>& xComponent,
const OUString& sName ) override;
virtual css::uno::Reference< css::xml::dom::XNode > SAL_CALL createElement(
const css::uno::Reference< ::css::xml::dom::XNode >& xParent,
const OUString& sName ) override;
virtual css::uno::Reference< css::xml::dom::XNode > SAL_CALL createAttribute(
const css::uno::Reference< ::css::xml::dom::XNode >& xParent,
const OUString& sName ) override;
virtual css::uno::Reference< css::xml::dom::XNode > SAL_CALL renameNode(
const css::uno::Reference< ::css::xml::dom::XNode >& xNode,
const OUString& sName ) override;
virtual css::uno::Reference< css::beans::XPropertySet > SAL_CALL getBindingForNode( const
css::uno::Reference<css::xml::dom::XNode>&,
sal_Bool bCreate ) override;
virtual void SAL_CALL removeBindingForNode( const css::uno::Reference< ::css::xml::dom::XNode >& ) override;
virtual OUString SAL_CALL getResultForExpression(
const css::uno::Reference< css::beans::XPropertySet >& xBinding,
sal_Bool bIsBindingExpression,
const OUString& sExpression ) override;
virtual sal_Bool SAL_CALL isValidXMLName( const OUString& sName ) override;
virtual sal_Bool SAL_CALL isValidPrefixName( const OUString& sName ) override;
virtual void SAL_CALL setNodeValue(
const css::uno::Reference< ::css::xml::dom::XNode >& xNode,
const OUString& sValue ) override;
// XUpdatable
public:
virtual void SAL_CALL update() override;
// XUnoTunnel
public:
virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence<sal_Int8>& ) override;
// XTypeProvider::getImplementationId
public:
virtual css::uno::Sequence<sal_Int8> SAL_CALL getImplementationId() override;
OUString SAL_CALL getImplementationName() override;
sal_Bool SAL_CALL supportsService(OUString const & ServiceName) override;
css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
};
} // namespace
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|