File: System.Activities.Presentation\System\Activities\Presentation\Base\Core\Internal\PropertyEditing\CiderStandardCategoryLayout.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.Internal.PropertyEditing 
{
    using System.Diagnostics.CodeAnalysis;
    using System.Windows;
 
    using System.Activities.Presentation.PropertyEditing;
 
    using Blend = System.Activities.Presentation.Internal.PropertyEditing.FromExpression.Framework.PropertyInspector;
    using System.Activities.Presentation.Internal.PropertyEditing.Selection;
    using System.Activities.Presentation.Internal.PropertyEditing.State;
 
    // <summary>
    // Container for PropertyContainers - fancy wrapper for ItemsControl that eliminates the need
    // for intermediate ContentControls.
    //
    // This class is referenced from XAML
    // </summary>
    [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")]
    internal class CiderStandardCategoryLayout : Blend.StandardCategoryLayout 
    {
 
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
        {
            base.PrepareContainerForItemOverride(element, item);
 
            if (element != null) 
            {
                PropertyEntry property = ((PropertyContainer)element).PropertyEntry;
 
                if (property != null) 
                {
                    // Make each PropertyContainer its own selection stop
                    PropertySelection.SetSelectionStop(element, new PropertySelectionStop(property));
                }
 
                PropertyContainer container = element as PropertyContainer;
                if (container != null)
                {
                    container.Loaded += new RoutedEventHandler(OnPropertyContainerLoaded);
                }
            }
        }
 
        private void OnPropertyContainerLoaded(object sender, RoutedEventArgs e) 
        {
            PropertyContainer container = sender as PropertyContainer;
            if (container != null) 
            {
 
                // When each PropertyContainer gets loaded, restore its ActiveEditMode
                // based on stored state
                //
                container.ActiveEditMode = PropertyActiveEditModeStateContainer.Instance.GetActiveEditMode(container.PropertyEntry);
 
                // HACK: Here, we would want to hook into the ActiveEditModeChanged
                // event to store (and restore) the correct expaded state to each
                // value editor across domain reloads.  However, we already shipped
                // System.Activities.Presentation.dll which contains the PropertyContainer
                // class and it's dangerous to add new events to this assembly at this
                // point.  Once we refactor MWD, we need to add this new event and
                // simplify this code.  In the meanwhile, we can cheat and accomplish
                // the same effect by listening to SizeChanged event, which _will_
                // change when the expanded value editor is pinned down.  It will also
                // change at other times (user-triggered resize events, etc.), but
                // it shouldn't cause any noticeable perf degradation.
                //
                container.SizeChanged += new SizeChangedEventHandler(OnPropertyContainerSizeChanged);
                container.Unloaded += new RoutedEventHandler(OnPropertyContainerUnloaded);
            }
        }
 
        // When the size of each PropertyContainer changes, assume that ActiveEditMode
        // may have been changed and record its current state
        //
        private void OnPropertyContainerSizeChanged(object sender, SizeChangedEventArgs e) 
        {
            PropertyContainer container = sender as PropertyContainer;
            if (container != null && container.IsLoaded)
            {
                PropertyActiveEditModeStateContainer.Instance.StoreActiveEditMode(container.PropertyEntry, container.ActiveEditMode);
            }
        }
 
        // When each PropertyContainer gets unloaded, stop listening to all events so
        // that it can be garbage collected
        //
        private void OnPropertyContainerUnloaded(object sender, RoutedEventArgs e) 
        {
            PropertyContainer container = sender as PropertyContainer;
 
            if (container != null) 
            {
                container.SizeChanged -= new SizeChangedEventHandler(OnPropertyContainerSizeChanged);
                container.Loaded -= new RoutedEventHandler(OnPropertyContainerLoaded);
                container.Unloaded -= new RoutedEventHandler(OnPropertyContainerUnloaded);
            }
        }
    }
}