File: src\Framework\System\Windows\Markup\ReaderContextStackData.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
/***************************************************************************\
*
* File: ReaderContextStackData.cs
*
* Copyright (C) 2003 by Microsoft Corporation.  All rights reserved.
*
\***************************************************************************/
 
using System;
using System.Collections;
using System.Reflection;
using System.Diagnostics;
 
namespace System.Windows.Markup
{
    // Data maintained on the reader's context stack.  The root of the tree is at the bottom
    // of the stack.
    internal class ReaderContextStackData
    {
 
        //
        // NOTE:  If you add a field here, be sure to update ClearData
        //
        ReaderFlags  _contextFlags;
        object       _contextData;
        object       _contextKey;
        string        _uid;
        string        _name;
        object       _contentProperty;
        Type         _expectedType;
        short        _expectedTypeId;
        bool         _createUsingTypeConverter;
        //
        // NOTE:  If you add a field here, be sure to update ClearData
        //
        
 
 
 
        // Returns just the part of the flags field corresponding to the context type
        internal ReaderFlags ContextType
        {
            get { return (ReaderFlags)(_contextFlags & ReaderFlags.ContextTypeMask); }
        }
 
        // The data object for this point in the stack.  Typically the element at
        // this scoping level
        internal object ObjectData
        {
            get { return _contextData; }
            set { _contextData = value; }
        }
 
        // The key attribute defined for the current context, whose parent context is expected
        // to be an IDictionary
        internal object Key
        {
            get { return _contextKey; }
            set { _contextKey = value; }
        }
 
        // The x:Uid of this object, if it has one and has been read yet.
        internal string Uid
        {
            get { return _uid; }
            set { _uid = value; }
        }
 
        // The x:Name (or Name) of this object, if it has one and has been read yet.
        // Alternatively if this context object represents a property this member 
        // gives you the name of the property. This is used to find a fallback value 
        // for this property in the event of an exception during property parsing.
        internal string ElementNameOrPropertyName
        {
            get { return _name; }
            set { _name = value; }
        }
 
        internal object ContentProperty
        {
            get { return _contentProperty; }
            set { _contentProperty = value; }
        }
 
        // If an object has not yet been created at this point, this is the type of
        // element to created
        internal Type ExpectedType
        {
            get { return _expectedType; }
            set { _expectedType = value; }
        }
 
        // If an object has not yet been created at this point, this is the Baml type id
        // of the element.  This is used for faster creation of known types.
        internal short ExpectedTypeId
        {
            get { return _expectedTypeId; }
            set { _expectedTypeId = value; }
        }
 
        // This object is expected to be created using a TypeConverter.  If this
        //  is true, the following are also expected to be true:
        // -ObjectData is null
        // -ExpectedType is non-null
        // -ExpectedTypeId is non-null
        internal bool CreateUsingTypeConverter
        {
            get { return _createUsingTypeConverter; }
            set { _createUsingTypeConverter = value; }
        }
 
        // Context identifying what this reader stack item represents
        internal ReaderFlags ContextFlags
        {
            get { return _contextFlags; }
            set { _contextFlags = value; }
        }
 
        // True if this element has not yet been added to the tree, but needs to be.
        internal bool NeedToAddToTree
        {
            get { return CheckFlag(ReaderFlags.NeedToAddToTree); }
        }
 
        // simple helper method to remove the NeedToAddToTree flag and add the AddedToTree flag
        internal void MarkAddedToTree()
        {
            ContextFlags = ((ContextFlags | ReaderFlags.AddedToTree) & ~ReaderFlags.NeedToAddToTree);
        }
 
        // simple helper method that returns true if the context contains the given flag or flags.
        // If multiple flags are passed in, the context must contain all the flags.
        internal bool CheckFlag(ReaderFlags flag)
        {
            return (ContextFlags & flag) == flag;
        }
 
        // simple helper method adds the flag to the context
        internal void SetFlag(ReaderFlags flag)
        {
            ContextFlags |= flag;
        }
 
        // simple helper method that removes the flag from the context
        internal void ClearFlag(ReaderFlags flag)
        {
            ContextFlags &= ~flag;
        }
 
        // Helper to determine if this represents an object element.
        internal bool IsObjectElement
        {
            get
            {
                return ContextType == ReaderFlags.DependencyObject
                       ||
                       ContextType == ReaderFlags.ClrObject;
            }
        }
 
        // Clear all the fields on this instance before it put into the factory cache
        internal void ClearData()
        {
            _contextFlags = 0;
            _contextData = null;
            _contextKey = null;
            _contentProperty = null;
            _expectedType = null;
            _expectedTypeId = 0;
            _createUsingTypeConverter = false;
            _uid = null;
            _name = null;
        }
 
    }
 
}