File: System.Activities.Presentation\System\Activities\Presentation\ErrorActivity.cs
Project: ndp\cdf\src\NetFx40\Tools\System.Activities.Presentation.csproj (System.Activities.Presentation)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
 
 
namespace System.Activities.Presentation
{
    using System;
    using System.Activities;
    using System.Activities.Presentation.View;
    using System.ComponentModel;
    using System.Runtime;
    using System.Xaml;
    using XamlDeferLoad = System.Windows.Markup.XamlDeferLoadAttribute;
 
    [Designer(typeof(ErrorActivity.ErrorActivityView))]
    internal class ErrorActivity : Activity
    {
        static readonly AttachableMemberIdentifier HasErrorActivitiesProperty =
            new AttachableMemberIdentifier(typeof(ErrorActivity), "HasErrorActivities");
        internal const string ErrorNodesProperty = "ErrorNodes";
 
        [Browsable(false)]
        [XamlDeferLoad(typeof(NodeListLoader), typeof(object))]
        public XamlNodeList ErrorNodes { get; set; }
 
        internal static bool GetHasErrorActivities(object target)
        {
            object result;
            if (AttachablePropertyServices.TryGetProperty(target, HasErrorActivitiesProperty, out result))
            {
                return (bool)result;
            }
            return false;
        }
 
        internal static void SetHasErrorActivities(object target, bool value)
        {
            AttachablePropertyServices.SetProperty(target, HasErrorActivitiesProperty, value);
        }
 
        internal static void WriteNodeList(XamlWriter writer, XamlNodeList nodeList)
        {
            // We need to pass the ErrorNodes contents through as a NodeList, because XOW doesn't
            // currently support unknown types, even inside a DeferLoad block.
            // But if a NodeList is written to XOW as a Value, XOW will unpack, forcing us to re-buffer
            // the nodes in our deferring loader. So we wrap the NodeList value inside a dummy StartObject.
            writer.WriteStartObject(XamlLanguage.Object);
            writer.WriteStartMember(XamlLanguage.Initialization);
            writer.WriteValue(nodeList);
            writer.WriteEndMember();
            writer.WriteEndObject();
        }
 
        internal class NodeListLoader : XamlDeferringLoader
        {
            public override object Load(XamlReader xamlReader, IServiceProvider serviceProvider)
            {
                // Expects a nodestream produced by WriteNodesList
                xamlReader.Read();
                xamlReader.Read();
                xamlReader.Read();
                Fx.Assert(xamlReader.NodeType == XamlNodeType.Value, "Expected Value node");
                return (XamlNodeList)xamlReader.Value;
            }
 
            public override XamlReader Save(object value, IServiceProvider serviceProvider)
            {
                return ((XamlNodeList)value).GetReader();
            }
        }
 
        internal class ErrorActivityView : WorkflowViewElement
        {
            public ErrorActivityView()
            {
                WorkflowViewService.ShowErrorInViewElement(this, SR.ActivityLoadError, null);
            }
        }
    }
 
    [Designer(typeof(ErrorActivity.ErrorActivityView))]
    internal class ErrorActivity<T> : Activity<T>
    {
        [Browsable(false)]
        [XamlDeferLoad(typeof(ErrorActivity.NodeListLoader), typeof(object))]
        public XamlNodeList ErrorNodes { get; set; }
    }
}