First commit
Send all results
This commit is contained in:
		@@ -0,0 +1,75 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
// ReSharper disable InconsistentNaming
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Indicates that this field can be accessed via SetValue and GetValue.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
 | 
			
		||||
    public class DVAttribute : Attribute
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Initializes a new instance of the DVAttribute class.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public DVAttribute()
 | 
			
		||||
        {
 | 
			
		||||
            RefOnly = false;
 | 
			
		||||
            ItemType = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the type of the reflected value. Must be specified by NEnum.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public Type Type
 | 
			
		||||
        {
 | 
			
		||||
            get { return _type; }
 | 
			
		||||
            set { _type = value; }
 | 
			
		||||
        }
 | 
			
		||||
        Type _type;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether the field is RefOnly and should be excluded from recursive operations.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool RefOnly;
 | 
			
		||||
 | 
			
		||||
        // TODO: Check type in value descriptor
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Describes the type of the elements a collection contains.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public Type ItemType;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,91 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// A collection that manages ValueDescriptors.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class ValueDescriptorCollection : IEnumerable
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the count of ValueDescriptors.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public int Count
 | 
			
		||||
        {
 | 
			
		||||
            get { return _list.Count; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Adds the specified ValueDescriptor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void Add(ValueDescriptor vd)
 | 
			
		||||
        {
 | 
			
		||||
            _dictionary.Add(vd.ValueName, vd);
 | 
			
		||||
            _list.Add(vd);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the <see cref="MigraDoc.DocumentObjectModel.publics.ValueDescriptor"/> at the specified index.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public ValueDescriptor this[int index]
 | 
			
		||||
        {
 | 
			
		||||
            get { return _list[index]; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the <see cref="MigraDoc.DocumentObjectModel.publics.ValueDescriptor"/> with the specified name.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public ValueDescriptor this[string name]
 | 
			
		||||
        {
 | 
			
		||||
            get { return _dictionary[name]; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns an enumerator that iterates through a collection.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns>
 | 
			
		||||
        /// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
 | 
			
		||||
        /// </returns>
 | 
			
		||||
        public IEnumerator GetEnumerator()
 | 
			
		||||
        {
 | 
			
		||||
            return _list.GetEnumerator();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        readonly List<ValueDescriptor> _list = new List<ValueDescriptor>();
 | 
			
		||||
        readonly Dictionary<string, ValueDescriptor> _dictionary = new Dictionary<string, ValueDescriptor>(StringComparer.OrdinalIgnoreCase);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,45 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Interface for simple nullable values like NInt, NString etc.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface INullableValue
 | 
			
		||||
    {
 | 
			
		||||
        object GetValue();
 | 
			
		||||
        void SetValue(object value);
 | 
			
		||||
        void SetNull();
 | 
			
		||||
        bool IsNull { get; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,282 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Meta class for document objects.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public sealed class Meta
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Initializes a new instance of the DomMeta class.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public Meta(Type documentObjectType)
 | 
			
		||||
        {
 | 
			
		||||
            AddValueDescriptors(this, documentObjectType);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the meta object of the specified document object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="documentObject">The document object the meta is returned for.</param>
 | 
			
		||||
        public static Meta GetMeta(DocumentObject documentObject)
 | 
			
		||||
        {
 | 
			
		||||
            return documentObject.Meta;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the object specified by name from dom.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public object GetValue(DocumentObject dom, string name, GV flags)
 | 
			
		||||
        {
 | 
			
		||||
            int dot = name.IndexOf('.');
 | 
			
		||||
            if (dot == 0)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
            string trail = null;
 | 
			
		||||
            if (dot > 0)
 | 
			
		||||
            {
 | 
			
		||||
                trail = name.Substring(dot + 1);
 | 
			
		||||
                name = name.Substring(0, dot);
 | 
			
		||||
            }
 | 
			
		||||
            ValueDescriptor vd = _vds[name];
 | 
			
		||||
            if (vd == null)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
 | 
			
		||||
            object value = vd.GetValue(dom, flags);
 | 
			
		||||
            if (value == null && flags == GV.GetNull)  //??? also for GV.ReadOnly?
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
            //REVIEW DaSt: Create object in case of GV.ReadWrite?
 | 
			
		||||
            if (trail != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (value == null || trail == "")
 | 
			
		||||
                    throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
                DocumentObject doc = value as DocumentObject;
 | 
			
		||||
                if (doc == null)
 | 
			
		||||
                    throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
                value = doc.GetValue(trail, flags);
 | 
			
		||||
            }
 | 
			
		||||
            return value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the member of dom specified by name to val.
 | 
			
		||||
        /// If a member with the specified name does not exist an ArgumentException will be thrown.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void SetValue(DocumentObject dom, string name, object val)
 | 
			
		||||
        {
 | 
			
		||||
            int dot = name.IndexOf('.');
 | 
			
		||||
            if (dot == 0)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
            string trail = null;
 | 
			
		||||
            if (dot > 0)
 | 
			
		||||
            {
 | 
			
		||||
                trail = name.Substring(dot + 1);
 | 
			
		||||
                name = name.Substring(0, dot);
 | 
			
		||||
            }
 | 
			
		||||
            ValueDescriptor vd = _vds[name];
 | 
			
		||||
            if (vd == null)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
 | 
			
		||||
            if (trail != null)
 | 
			
		||||
            {
 | 
			
		||||
                //REVIEW DaSt: dom.GetValue(name) and call SetValue recursively,
 | 
			
		||||
                //             or dom.GetValue(name.BisVorletzteElement) and then call SetValue?
 | 
			
		||||
                DocumentObject doc = (DocumentObject)dom.GetValue(name);
 | 
			
		||||
                doc.SetValue(trail, val);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
                vd.SetValue(dom, val);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether this meta contains a value with the specified name.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool HasValue(string name)
 | 
			
		||||
        {
 | 
			
		||||
            ValueDescriptor vd = _vds[name];
 | 
			
		||||
            return vd != null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the member of dom specified by name to null.
 | 
			
		||||
        /// If a member with the specified name does not exist an ArgumentException will be thrown.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void SetNull(DocumentObject dom, string name)
 | 
			
		||||
        {
 | 
			
		||||
            ValueDescriptor vd = _vds[name];
 | 
			
		||||
            if (vd == null)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
 | 
			
		||||
            vd.SetNull(dom);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether the member of dom specified by name is null.
 | 
			
		||||
        /// If a member with the specified name does not exist an ArgumentException will be thrown.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public /* not virtual */ bool IsNull(DocumentObject dom, string name)
 | 
			
		||||
        {
 | 
			
		||||
            //bool isNull = false;
 | 
			
		||||
            int dot = name.IndexOf('.');
 | 
			
		||||
            if (dot == 0)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
            string trail = null;
 | 
			
		||||
            if (dot > 0)
 | 
			
		||||
            {
 | 
			
		||||
                trail = name.Substring(dot + 1);
 | 
			
		||||
                name = name.Substring(0, dot);
 | 
			
		||||
            }
 | 
			
		||||
            ValueDescriptor vd = _vds[name];
 | 
			
		||||
            if (vd == null)
 | 
			
		||||
                throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
 | 
			
		||||
            if (vd is NullableDescriptor || vd is ValueTypeDescriptor)
 | 
			
		||||
            {
 | 
			
		||||
                if (trail != null)
 | 
			
		||||
                    throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
                return vd.IsNull(dom);
 | 
			
		||||
            }
 | 
			
		||||
            DocumentObject docObj = (DocumentObject)vd.GetValue(dom, GV.ReadOnly);
 | 
			
		||||
            if (docObj == null)
 | 
			
		||||
                return true;
 | 
			
		||||
            if (trail != null)
 | 
			
		||||
                return docObj.IsNull(trail);
 | 
			
		||||
            return docObj.IsNull();
 | 
			
		||||
 | 
			
		||||
            //      DomValueDescriptor vd = vds[name];
 | 
			
		||||
            //      if (vd == null)
 | 
			
		||||
            //        throw new ArgumentException(DomSR.InvalidValueName(name));
 | 
			
		||||
            //      
 | 
			
		||||
            //      return vd.IsNull(dom);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets all members of the specified dom to null.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public /*virtual*/ void SetNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            int count = _vds.Count;
 | 
			
		||||
            for (int index = 0; index < count; index++)
 | 
			
		||||
            {
 | 
			
		||||
                if (!_vds[index].IsRefOnly)
 | 
			
		||||
                    _vds[index].SetNull(dom);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether all members of the specified dom are null. If dom contains no members IsNull
 | 
			
		||||
        /// returns true.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            int count = _vds.Count;
 | 
			
		||||
            for (int index = 0; index < count; index++)
 | 
			
		||||
            {
 | 
			
		||||
                ValueDescriptor vd = _vds[index];
 | 
			
		||||
                if (vd.IsRefOnly)
 | 
			
		||||
                    continue;
 | 
			
		||||
                if (!vd.IsNull(dom))
 | 
			
		||||
                    return false;
 | 
			
		||||
            }
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the DomValueDescriptor of the member specified by name from the DocumentObject.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public ValueDescriptor this[string name]
 | 
			
		||||
        {
 | 
			
		||||
            get { return _vds[name]; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the DomValueDescriptorCollection of the DocumentObject.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public ValueDescriptorCollection ValueDescriptors
 | 
			
		||||
        {
 | 
			
		||||
            get { return _vds; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        readonly ValueDescriptorCollection _vds = new ValueDescriptorCollection();
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Adds a value descriptor for each field and property found in type to meta.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        static void AddValueDescriptors(Meta meta, Type type)
 | 
			
		||||
        {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
 | 
			
		||||
#else
 | 
			
		||||
            var fieldInfos = type.GetTypeInfo().DeclaredFields;
 | 
			
		||||
#endif
 | 
			
		||||
            foreach (FieldInfo fieldInfo in fieldInfos)
 | 
			
		||||
            {
 | 
			
		||||
#if DEBUG_
 | 
			
		||||
                string name = fieldInfo.Name;
 | 
			
		||||
                if (name == "parent")
 | 
			
		||||
                    name.GetType();
 | 
			
		||||
#endif
 | 
			
		||||
                DVAttribute[] dvs = (DVAttribute[])fieldInfo.GetCustomAttributes(typeof(DVAttribute), false);
 | 
			
		||||
                if (dvs.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    ValueDescriptor vd = ValueDescriptor.CreateValueDescriptor(fieldInfo, dvs[0]);
 | 
			
		||||
                    meta.ValueDescriptors.Add(vd);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            PropertyInfo[] propInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
 | 
			
		||||
#else
 | 
			
		||||
            var propInfos = type.GetTypeInfo().DeclaredProperties;
 | 
			
		||||
#endif
 | 
			
		||||
            foreach (PropertyInfo propInfo in propInfos)
 | 
			
		||||
            {
 | 
			
		||||
#if DEBUG_
 | 
			
		||||
        string name = propInfo.Name;
 | 
			
		||||
        if (name == "Font")
 | 
			
		||||
          name.GetType();
 | 
			
		||||
#endif
 | 
			
		||||
                DVAttribute[] dvs = (DVAttribute[])propInfo.GetCustomAttributes(typeof(DVAttribute), false);
 | 
			
		||||
                if (dvs.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    ValueDescriptor vd = ValueDescriptor.CreateValueDescriptor(propInfo, dvs[0]);
 | 
			
		||||
                    meta.ValueDescriptors.Add(vd);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,128 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Represents a nullable boolean value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public struct NBool : INullableValue
 | 
			
		||||
    {
 | 
			
		||||
        public NBool(bool value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = value ? (sbyte)1 : (sbyte)0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        NBool(sbyte value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool Value
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value == 1; }
 | 
			
		||||
            set { _value = value ? (sbyte)1 : (sbyte)0; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        object INullableValue.GetValue()
 | 
			
		||||
        {
 | 
			
		||||
            return Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        void INullableValue.SetValue(object value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = (bool)value ? (sbyte)1 : (sbyte)0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Resets this instance,
 | 
			
		||||
        /// i.e. IsNull() will return true afterwards.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void SetNull()
 | 
			
		||||
        {
 | 
			
		||||
            _value = -1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether this instance is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsNull
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value == -1; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns a value indicating whether this instance is equal to the specified object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool Equals(object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value is NBool)
 | 
			
		||||
                return this == (NBool)value;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return _value.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(NBool l, NBool r)
 | 
			
		||||
        {
 | 
			
		||||
            if (l.IsNull)
 | 
			
		||||
                return r.IsNull;
 | 
			
		||||
            if (r.IsNull)
 | 
			
		||||
                return false;
 | 
			
		||||
            return l.Value == r.Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(NBool l, NBool r)
 | 
			
		||||
        {
 | 
			
		||||
            return !(l == r);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static readonly NBool NullValue = new NBool(-1);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// -1 (undefined), 0 (false), or 1 (true).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        sbyte _value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,120 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Represents a nullable double value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public struct NDouble : INullableValue
 | 
			
		||||
    {
 | 
			
		||||
        public NDouble(double value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public double Value
 | 
			
		||||
        {
 | 
			
		||||
            get { return double.IsNaN(_value) ? 0 : _value; }
 | 
			
		||||
            set { _value = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        object INullableValue.GetValue()
 | 
			
		||||
        {
 | 
			
		||||
            return Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        void INullableValue.SetValue(object value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = (double)value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Resets this instance,
 | 
			
		||||
        /// i.e. IsNull() will return true afterwards.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void SetNull()
 | 
			
		||||
        {
 | 
			
		||||
            _value = double.NaN;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether this instance is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsNull
 | 
			
		||||
        {
 | 
			
		||||
            get { return double.IsNaN(_value); }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns a value indicating whether this instance is equal to the specified object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool Equals(object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value is NDouble)
 | 
			
		||||
                return this == (NDouble)value;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return _value.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(NDouble l, NDouble r)
 | 
			
		||||
        {
 | 
			
		||||
            if (l.IsNull)
 | 
			
		||||
                return r.IsNull;
 | 
			
		||||
            if (r.IsNull)
 | 
			
		||||
                return false;
 | 
			
		||||
            return l.Value == r.Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(NDouble l, NDouble r)
 | 
			
		||||
        {
 | 
			
		||||
            return !(l == r);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static readonly NDouble NullValue = new NDouble(double.NaN);
 | 
			
		||||
 | 
			
		||||
        double _value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,158 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Represents a nullable Enum value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public struct NEnum : INullableValue
 | 
			
		||||
    {
 | 
			
		||||
        public NEnum(int val, Type type)
 | 
			
		||||
        {
 | 
			
		||||
            _type = type;
 | 
			
		||||
            _value = val;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        NEnum(int value)
 | 
			
		||||
        {
 | 
			
		||||
            _type = null;
 | 
			
		||||
            _value = value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Type Type
 | 
			
		||||
        {
 | 
			
		||||
            get { return _type; }
 | 
			
		||||
            set { _type = value; }
 | 
			
		||||
        }
 | 
			
		||||
        Type _type;
 | 
			
		||||
 | 
			
		||||
        public int Value
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value != int.MinValue ? _value : 0; }
 | 
			
		||||
            set
 | 
			
		||||
            {
 | 
			
		||||
                // TODO Remove German remarks!
 | 
			
		||||
                //TODO: Klasse Character so <20>ndern, dass symbolName und char in unterschiedlichen Feldern gespeichert werden.
 | 
			
		||||
                //Diese Spezialbehandlung entf<74>llt dann.
 | 
			
		||||
                if (_type == typeof(SymbolName))
 | 
			
		||||
                {
 | 
			
		||||
                    //          if (Enum.IsDefined(this .type, (uint)value))
 | 
			
		||||
                    _value = value;
 | 
			
		||||
                    //          else
 | 
			
		||||
                    //            throw new ArgumentOutOfRangeException("value");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (Enum.IsDefined(_type, value))
 | 
			
		||||
                        _value = value;
 | 
			
		||||
                    else
 | 
			
		||||
                        throw new /*InvalidEnum*/ArgumentException(DomSR.InvalidEnumValue(value), "value");
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        object INullableValue.GetValue()
 | 
			
		||||
        {
 | 
			
		||||
            return ToObject();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        void INullableValue.SetValue(object value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = (int)value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetNull()
 | 
			
		||||
        {
 | 
			
		||||
            _value = int.MinValue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether this instance is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsNull
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value == int.MinValue; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public object ToObject()
 | 
			
		||||
        {
 | 
			
		||||
            if (_value != int.MinValue)
 | 
			
		||||
                return Enum.ToObject(_type, _value);
 | 
			
		||||
            // BUG Have all enum 0 as valid value?
 | 
			
		||||
            return Enum.ToObject(_type, 0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //public static readonly NEnum NullValue = new NEnum(int.MinValue);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns a value indicating whether this instance is equal to the specified object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool Equals(object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value is NEnum)
 | 
			
		||||
                return this == (NEnum)value;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return _value.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(NEnum l, NEnum r)
 | 
			
		||||
        {
 | 
			
		||||
            if (l.IsNull)
 | 
			
		||||
                return r.IsNull;
 | 
			
		||||
            if (r.IsNull)
 | 
			
		||||
                return false;
 | 
			
		||||
            if (l._type == r._type)
 | 
			
		||||
                return l.Value == r.Value;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(NEnum l, NEnum r)
 | 
			
		||||
        {
 | 
			
		||||
            return !(l == r);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static NEnum NullValue(Type fieldType)
 | 
			
		||||
        {
 | 
			
		||||
            return new NEnum(int.MinValue, fieldType);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int _value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,130 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Represents a nullable integer value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public struct NInt : INullableValue
 | 
			
		||||
    {
 | 
			
		||||
        public NInt(int val)
 | 
			
		||||
        {
 | 
			
		||||
            _value = val;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public int Value
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value != int.MinValue ? _value : 0; }
 | 
			
		||||
            set { _value = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        object INullableValue.GetValue()
 | 
			
		||||
        {
 | 
			
		||||
            return Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        void INullableValue.SetValue(object value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = (int)value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Resets this instance,
 | 
			
		||||
        /// i.e. IsNull() will return true afterwards.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void SetNull()
 | 
			
		||||
        {
 | 
			
		||||
            _value = int.MinValue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether this instance is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsNull
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value == int.MinValue; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static implicit operator NInt(int val)
 | 
			
		||||
        {
 | 
			
		||||
            return new NInt(val);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static implicit operator int(NInt val)
 | 
			
		||||
        {
 | 
			
		||||
            return val.Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns a value indicating whether this instance is equal to the specified object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool Equals(object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value is NInt)
 | 
			
		||||
                return this == (NInt)value;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return _value.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(NInt l, NInt r)
 | 
			
		||||
        {
 | 
			
		||||
            if (l.IsNull)
 | 
			
		||||
                return r.IsNull;
 | 
			
		||||
            if (r.IsNull)
 | 
			
		||||
                return false;
 | 
			
		||||
            return l.Value == r.Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(NInt l, NInt r)
 | 
			
		||||
        {
 | 
			
		||||
            return !(l == r);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static readonly NInt NullValue = new NInt(int.MinValue);
 | 
			
		||||
 | 
			
		||||
        int _value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,117 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Represents a nullable string value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public struct NString : INullableValue
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets or sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string Value
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value ?? String.Empty; }
 | 
			
		||||
            set { _value = value; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        object INullableValue.GetValue()
 | 
			
		||||
        {
 | 
			
		||||
            return Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the value of the instance.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        void INullableValue.SetValue(object value)
 | 
			
		||||
        {
 | 
			
		||||
            _value = (String)value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Resets this instance,
 | 
			
		||||
        /// i.e. IsNull() will return true afterwards.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void SetNull()
 | 
			
		||||
        {
 | 
			
		||||
            _value = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether this instance is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsNull
 | 
			
		||||
        {
 | 
			
		||||
            get { return _value == null; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns a value indicating whether this instance is equal to the specified object.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool Equals(object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value is NString)
 | 
			
		||||
                return this == (NString)value;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int GetHashCode()
 | 
			
		||||
        {
 | 
			
		||||
            return _value == null ? 0 : _value.GetHashCode();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator ==(NString l, NString r)
 | 
			
		||||
        {
 | 
			
		||||
            if (l.IsNull)
 | 
			
		||||
                return r.IsNull;
 | 
			
		||||
            if (r.IsNull)
 | 
			
		||||
                return false;
 | 
			
		||||
            return l.Value == r.Value;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool operator !=(NString l, NString r)
 | 
			
		||||
        {
 | 
			
		||||
            return !(l == r);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static readonly NString NullValue = new NString();
 | 
			
		||||
 | 
			
		||||
        string _value;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,521 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
 | 
			
		||||
#pragma warning disable 1591
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Base class of all value descriptor classes.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public abstract class ValueDescriptor
 | 
			
		||||
    {
 | 
			
		||||
        public ValueDescriptor(string valueName, Type valueType, Type memberType, MemberInfo memberInfo, VDFlags flags)
 | 
			
		||||
        {
 | 
			
		||||
            // Take new naming convention into account.
 | 
			
		||||
            if (valueName.StartsWith("_"))
 | 
			
		||||
                valueName = valueName.Substring(1);
 | 
			
		||||
 | 
			
		||||
            ValueName = valueName;
 | 
			
		||||
            ValueType = valueType;
 | 
			
		||||
            MemberType = memberType;
 | 
			
		||||
            MemberInfo = memberInfo;
 | 
			
		||||
            _flags = flags;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public object CreateValue()
 | 
			
		||||
        {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            ConstructorInfo constructorInfo = ValueType.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
 | 
			
		||||
#else
 | 
			
		||||
            var constructorInfos = ValueType.GetTypeInfo().DeclaredConstructors;
 | 
			
		||||
            ConstructorInfo constructorInfo = null;
 | 
			
		||||
            foreach (var info in constructorInfos)
 | 
			
		||||
            {
 | 
			
		||||
                if (info.GetParameters().Length == 0)
 | 
			
		||||
                    constructorInfo = info;
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
            Debug.Assert(constructorInfo != null);
 | 
			
		||||
            return constructorInfo.Invoke(null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public abstract object GetValue(DocumentObject dom, GV flags);
 | 
			
		||||
        public abstract void SetValue(DocumentObject dom, object val);
 | 
			
		||||
        public abstract void SetNull(DocumentObject dom);
 | 
			
		||||
        public abstract bool IsNull(DocumentObject dom);
 | 
			
		||||
 | 
			
		||||
        public static ValueDescriptor CreateValueDescriptor(MemberInfo memberInfo, DVAttribute attr)
 | 
			
		||||
        {
 | 
			
		||||
            VDFlags flags = VDFlags.None;
 | 
			
		||||
            if (attr.RefOnly)
 | 
			
		||||
                flags |= VDFlags.RefOnly;
 | 
			
		||||
 | 
			
		||||
            string name = memberInfo.Name;
 | 
			
		||||
 | 
			
		||||
            FieldInfo fieldInfo = memberInfo as FieldInfo;
 | 
			
		||||
            Type type = fieldInfo != null ? fieldInfo.FieldType : ((PropertyInfo)memberInfo).PropertyType;
 | 
			
		||||
 | 
			
		||||
            if (type == typeof(NBool))
 | 
			
		||||
                return new NullableDescriptor(name, typeof(Boolean), type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
            if (type == typeof(NInt))
 | 
			
		||||
                return new NullableDescriptor(name, typeof(Int32), type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
            if (type == typeof(NDouble))
 | 
			
		||||
                return new NullableDescriptor(name, typeof(Double), type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
            if (type == typeof(NString))
 | 
			
		||||
                return new NullableDescriptor(name, typeof(String), type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
            if (type == typeof(String))
 | 
			
		||||
                return new ValueTypeDescriptor(name, typeof(String), type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
            if (type == typeof(NEnum))
 | 
			
		||||
            {
 | 
			
		||||
                Type valueType = attr.Type;
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                Debug.Assert(valueType.IsSubclassOf(typeof(Enum)), "NEnum must have 'Type' attribute with the underlying type");
 | 
			
		||||
#else
 | 
			
		||||
                Debug.Assert(valueType.GetTypeInfo().IsSubclassOf(typeof(Enum)), "NEnum must have 'Type' attribute with the underlying type");
 | 
			
		||||
#endif
 | 
			
		||||
                return new NullableDescriptor(name, valueType, type, memberInfo, flags);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            if (type.IsSubclassOf(typeof(ValueType)))
 | 
			
		||||
#else
 | 
			
		||||
            if (type.GetTypeInfo().IsSubclassOf(typeof(ValueType)))
 | 
			
		||||
#endif
 | 
			
		||||
                return new ValueTypeDescriptor(name, type, type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            if (typeof(DocumentObjectCollection).IsAssignableFrom(type))
 | 
			
		||||
#else
 | 
			
		||||
            if (typeof(DocumentObjectCollection).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
 | 
			
		||||
#endif
 | 
			
		||||
                return new DocumentObjectCollectionDescriptor(name, type, type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            if (typeof(DocumentObject).IsAssignableFrom(type))
 | 
			
		||||
#else
 | 
			
		||||
            if (typeof(DocumentObject).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
 | 
			
		||||
#endif
 | 
			
		||||
                return new DocumentObjectDescriptor(name, type, type, memberInfo, flags);
 | 
			
		||||
 | 
			
		||||
            Debug.Assert(false, type.FullName);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool IsRefOnly
 | 
			
		||||
        {
 | 
			
		||||
            get { return (_flags & VDFlags.RefOnly) == VDFlags.RefOnly; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public FieldInfo FieldInfo
 | 
			
		||||
        {
 | 
			
		||||
            get { return MemberInfo as FieldInfo; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public PropertyInfo PropertyInfo
 | 
			
		||||
        {
 | 
			
		||||
            get { return MemberInfo as PropertyInfo; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Name of the value.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public readonly string ValueName;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Type of the described value, e.g. typeof(Int32) for an NInt.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public readonly Type ValueType;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Type of the described field or property, e.g. typeof(NInt) for an NInt.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public readonly Type MemberType;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// FieldInfo of the described field.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public readonly MemberInfo MemberInfo;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Flags of the described field, e.g. RefOnly.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        readonly VDFlags _flags;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Value descriptor of all nullable types.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class NullableDescriptor : ValueDescriptor
 | 
			
		||||
    {
 | 
			
		||||
        public NullableDescriptor(string valueName, Type valueType, Type fieldType, MemberInfo memberInfo, VDFlags flags)
 | 
			
		||||
            : base(valueName, valueType, fieldType, memberInfo, flags)
 | 
			
		||||
        { }
 | 
			
		||||
 | 
			
		||||
        public override object GetValue(DocumentObject dom, GV flags)
 | 
			
		||||
        {
 | 
			
		||||
            if (!Enum.IsDefined(typeof(GV), flags))
 | 
			
		||||
                throw new /*InvalidEnum*/ArgumentException(DomSR.InvalidEnumValue(flags), "flags");
 | 
			
		||||
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
            INullableValue ival = (INullableValue)val;
 | 
			
		||||
            if (ival.IsNull && flags == GV.GetNull)
 | 
			
		||||
                return null;
 | 
			
		||||
            return ival.GetValue();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetValue(DocumentObject dom, object value)
 | 
			
		||||
        {
 | 
			
		||||
            object val;
 | 
			
		||||
            INullableValue ival;
 | 
			
		||||
            if (FieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                val = FieldInfo.GetValue(dom);
 | 
			
		||||
                ival = (INullableValue)val;
 | 
			
		||||
                ival.SetValue(value);
 | 
			
		||||
                FieldInfo.SetValue(dom, ival);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                val = PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
                val = PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
                ival = (INullableValue)val;
 | 
			
		||||
                ival.SetValue(value);
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                PropertyInfo.GetSetMethod(true).Invoke(dom, new object[] { ival });
 | 
			
		||||
#else
 | 
			
		||||
                PropertyInfo.SetValue(dom, ival);
 | 
			
		||||
#endif
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            object val;
 | 
			
		||||
            INullableValue ival;
 | 
			
		||||
            if (FieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                val = FieldInfo.GetValue(dom);
 | 
			
		||||
                ival = (INullableValue)val;
 | 
			
		||||
                ival.SetNull();
 | 
			
		||||
                FieldInfo.SetValue(dom, ival);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                val = PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
                val = PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
                ival = (INullableValue)val;
 | 
			
		||||
                ival.SetNull();
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                PropertyInfo.GetSetMethod(true).Invoke(dom, new object[] { ival });
 | 
			
		||||
#else
 | 
			
		||||
                PropertyInfo.SetValue(dom, ival);
 | 
			
		||||
#endif
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether the given DocumentObject is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool IsNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
            return ((INullableValue)val).IsNull;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Value descriptor of value types.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class ValueTypeDescriptor : ValueDescriptor
 | 
			
		||||
    {
 | 
			
		||||
        public ValueTypeDescriptor(string valueName, Type valueType, Type fieldType, MemberInfo memberInfo, VDFlags flags)
 | 
			
		||||
            : base(valueName, valueType, fieldType, memberInfo, flags)
 | 
			
		||||
        { }
 | 
			
		||||
 | 
			
		||||
        public override object GetValue(DocumentObject dom, GV flags)
 | 
			
		||||
        {
 | 
			
		||||
            if (!Enum.IsDefined(typeof(GV), flags))
 | 
			
		||||
                throw new /*InvalidEnum*/ArgumentException(DomSR.InvalidEnumValue(flags), "flags");
 | 
			
		||||
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
            INullableValue ival = val as INullableValue;
 | 
			
		||||
            if (ival != null && ival.IsNull && flags == GV.GetNull)
 | 
			
		||||
                return null;
 | 
			
		||||
            return val;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetValue(DocumentObject dom, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (FieldInfo != null)
 | 
			
		||||
                FieldInfo.SetValue(dom, value);
 | 
			
		||||
            else
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                PropertyInfo.GetSetMethod(true).Invoke(dom, new object[] { value });
 | 
			
		||||
#else
 | 
			
		||||
                PropertyInfo.SetValue(dom, value);
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            object val;
 | 
			
		||||
            INullableValue ival;
 | 
			
		||||
            if (FieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                val = FieldInfo.GetValue(dom);
 | 
			
		||||
                ival = (INullableValue)val;
 | 
			
		||||
                ival.SetNull();
 | 
			
		||||
                FieldInfo.SetValue(dom, ival);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                val = PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
                val = PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
                ival = (INullableValue)val;
 | 
			
		||||
                ival.SetNull();
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                PropertyInfo.GetSetMethod(true).Invoke(dom, new object[] { ival });
 | 
			
		||||
#else
 | 
			
		||||
                PropertyInfo.SetValue(dom, ival);
 | 
			
		||||
#endif
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether the given DocumentObject is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool IsNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetGetMethod(true).Invoke(dom, null);
 | 
			
		||||
#else
 | 
			
		||||
            object val = FieldInfo != null ? FieldInfo.GetValue(dom) : PropertyInfo.GetValue(dom);
 | 
			
		||||
#endif
 | 
			
		||||
            INullableValue ival = val as INullableValue;
 | 
			
		||||
            if (ival != null)
 | 
			
		||||
                return ival.IsNull;
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Value descriptor of DocumentObject.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class DocumentObjectDescriptor : ValueDescriptor
 | 
			
		||||
    {
 | 
			
		||||
        public DocumentObjectDescriptor(string valueName, Type valueType, Type fieldType, MemberInfo memberInfo, VDFlags flags)
 | 
			
		||||
            : base(valueName, valueType, fieldType, memberInfo, flags)
 | 
			
		||||
        { }
 | 
			
		||||
 | 
			
		||||
        public override object GetValue(DocumentObject dom, GV flags)
 | 
			
		||||
        {
 | 
			
		||||
            if (!Enum.IsDefined(typeof(GV), flags))
 | 
			
		||||
                throw new /*InvalidEnum*/ArgumentException(DomSR.InvalidEnumValue(flags), "flags");
 | 
			
		||||
 | 
			
		||||
            FieldInfo fieldInfo = FieldInfo;
 | 
			
		||||
            DocumentObject val;
 | 
			
		||||
            if (fieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                // Member is a field
 | 
			
		||||
                val = FieldInfo.GetValue(dom) as DocumentObject;
 | 
			
		||||
                if (val == null && flags == GV.ReadWrite)
 | 
			
		||||
                {
 | 
			
		||||
                    val = (DocumentObject)CreateValue();
 | 
			
		||||
                    val._parent = dom;
 | 
			
		||||
                    FieldInfo.SetValue(dom, val);
 | 
			
		||||
                    return val;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                // Member is a property
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                val = PropertyInfo.GetGetMethod(true).Invoke(dom, null) as DocumentObject;
 | 
			
		||||
#else
 | 
			
		||||
                val = PropertyInfo.GetValue(dom) as DocumentObject;
 | 
			
		||||
#endif
 | 
			
		||||
            }
 | 
			
		||||
            if (val != null && (val.IsNull() && flags == GV.GetNull))
 | 
			
		||||
                return null;
 | 
			
		||||
 | 
			
		||||
            return val;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetValue(DocumentObject dom, object val)
 | 
			
		||||
        {
 | 
			
		||||
            FieldInfo fieldInfo = FieldInfo;
 | 
			
		||||
            // Member is a field
 | 
			
		||||
            if (fieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                fieldInfo.SetValue(dom, val);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            throw new InvalidOperationException("This value cannot be set.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            FieldInfo fieldInfo = FieldInfo;
 | 
			
		||||
            DocumentObject val;
 | 
			
		||||
            // Member is a field.
 | 
			
		||||
            if (fieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                val = FieldInfo.GetValue(dom) as DocumentObject;
 | 
			
		||||
                if (val != null)
 | 
			
		||||
                    val.SetNull();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Member is a property.
 | 
			
		||||
            if (PropertyInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                PropertyInfo propInfo = PropertyInfo;
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
                val = propInfo.GetGetMethod(true).Invoke(dom, null) as DocumentObject;
 | 
			
		||||
#else
 | 
			
		||||
                val = propInfo.GetValue(dom) as DocumentObject;
 | 
			
		||||
#endif
 | 
			
		||||
                if (val != null)
 | 
			
		||||
                    val.SetNull();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether the given DocumentObject is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool IsNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            FieldInfo fieldInfo = FieldInfo;
 | 
			
		||||
            DocumentObject val;
 | 
			
		||||
            // Member is a field
 | 
			
		||||
            if (fieldInfo != null)
 | 
			
		||||
            {
 | 
			
		||||
                val = FieldInfo.GetValue(dom) as DocumentObject;
 | 
			
		||||
                if (val == null)
 | 
			
		||||
                    return true;
 | 
			
		||||
                return val.IsNull();
 | 
			
		||||
            }
 | 
			
		||||
            // Member is a property
 | 
			
		||||
            PropertyInfo propInfo = PropertyInfo;
 | 
			
		||||
#if !NETFX_CORE
 | 
			
		||||
            val = propInfo.GetGetMethod(true).Invoke(dom, null) as DocumentObject;
 | 
			
		||||
#else
 | 
			
		||||
            val = propInfo.GetValue(dom) as DocumentObject;
 | 
			
		||||
#endif
 | 
			
		||||
            if (val != null)
 | 
			
		||||
                val.IsNull();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Value descriptor of DocumentObjectCollection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class DocumentObjectCollectionDescriptor : ValueDescriptor
 | 
			
		||||
    {
 | 
			
		||||
        public DocumentObjectCollectionDescriptor(string valueName, Type valueType, Type fieldType, MemberInfo memberInfo, VDFlags flags)
 | 
			
		||||
            : base(valueName, valueType, fieldType, memberInfo, flags)
 | 
			
		||||
        { }
 | 
			
		||||
 | 
			
		||||
        public override object GetValue(DocumentObject dom, GV flags)
 | 
			
		||||
        {
 | 
			
		||||
            if (!Enum.IsDefined(typeof(GV), flags))
 | 
			
		||||
                throw new /*InvalidEnum*/ArgumentException(DomSR.InvalidEnumValue(flags), "flags");
 | 
			
		||||
 | 
			
		||||
            Debug.Assert(MemberInfo is FieldInfo, "Properties of DocumentObjectCollection not allowed.");
 | 
			
		||||
            DocumentObjectCollection val = FieldInfo.GetValue(dom) as DocumentObjectCollection;
 | 
			
		||||
            if (val == null && flags == GV.ReadWrite)
 | 
			
		||||
            {
 | 
			
		||||
                val = (DocumentObjectCollection)CreateValue();
 | 
			
		||||
                val._parent = dom;
 | 
			
		||||
                FieldInfo.SetValue(dom, val);
 | 
			
		||||
                return val;
 | 
			
		||||
            }
 | 
			
		||||
            if (val != null && val.IsNull() && flags == GV.GetNull)
 | 
			
		||||
                return null;
 | 
			
		||||
            return val;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetValue(DocumentObject dom, object val)
 | 
			
		||||
        {
 | 
			
		||||
            FieldInfo.SetValue(dom, val);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override void SetNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            DocumentObjectCollection val = FieldInfo.GetValue(dom) as DocumentObjectCollection;
 | 
			
		||||
            if (val != null)
 | 
			
		||||
                val.SetNull();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Determines whether the given DocumentObject is null (not set).
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public override bool IsNull(DocumentObject dom)
 | 
			
		||||
        {
 | 
			
		||||
            DocumentObjectCollection val = FieldInfo.GetValue(dom) as DocumentObjectCollection;
 | 
			
		||||
            if (val == null)
 | 
			
		||||
                return true;
 | 
			
		||||
            return val.IsNull();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,57 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
// ReSharper disable InconsistentNaming
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Indicates how to retrieve a value from a DocumentObject.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum GV
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the value for reading and writing. If the value does not exist, it is created.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ReadWrite = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the value for reading. If the value does not exist, it is not created.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ReadOnly = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Returns null if value is Null or does not exist.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        GetNull = 2,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,45 @@
 | 
			
		||||
#region MigraDoc - Creating Documents on the Fly
 | 
			
		||||
//
 | 
			
		||||
// Authors:
 | 
			
		||||
//   Stefan Lange
 | 
			
		||||
//   Klaus Potzesny
 | 
			
		||||
//   David Stephensen
 | 
			
		||||
//
 | 
			
		||||
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
 | 
			
		||||
//
 | 
			
		||||
// http://www.pdfsharp.com
 | 
			
		||||
// http://www.migradoc.com
 | 
			
		||||
// http://sourceforge.net/projects/pdfsharp
 | 
			
		||||
//
 | 
			
		||||
// Permission is hereby granted, free of charge, to any person obtaining a
 | 
			
		||||
// copy of this software and associated documentation files (the "Software"),
 | 
			
		||||
// to deal in the Software without restriction, including without limitation
 | 
			
		||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
 | 
			
		||||
// and/or sell copies of the Software, and to permit persons to whom the
 | 
			
		||||
// Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
//
 | 
			
		||||
// The above copyright notice and this permission notice shall be included
 | 
			
		||||
// in all copies or substantial portions of the Software.
 | 
			
		||||
//
 | 
			
		||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 | 
			
		||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 | 
			
		||||
// DEALINGS IN THE SOFTWARE.
 | 
			
		||||
#endregion
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
// ReSharper disable InconsistentNaming
 | 
			
		||||
 | 
			
		||||
namespace MigraDoc.DocumentObjectModel.publics
 | 
			
		||||
{
 | 
			
		||||
    [Flags]
 | 
			
		||||
    public enum VDFlags
 | 
			
		||||
    {
 | 
			
		||||
        None = 0,
 | 
			
		||||
        RefOnly = 0x0001
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user