|
/***************************************************************************\
*
* File: InheritanceContextHelper.cs
*
* This file holds a helper class for DO subclasses that implement an
* inheritance context.
*
* Copyright (C) by Microsoft Corporation. All rights reserved.
*
\***************************************************************************/
using System;
using System.Windows;
using MS.Internal.WindowsBase;
namespace MS.Internal
{
internal static class InheritanceContextHelper
{
//--------------------------------------------------------------------
//
// ProvideContextForObject
//
// Tell a DO that it has a new inheritance context available.
//
//--------------------------------------------------------------------
[FriendAccessAllowed] // Built into Core, also used by Framework.
internal static void ProvideContextForObject(
DependencyObject context,
DependencyObject newValue )
{
if (context != null)
{
context.ProvideSelfAsInheritanceContext(newValue, null);
}
}
//--------------------------------------------------------------------
//
// RemoveContextFromObject
//
// Tell a DO that it has lost its inheritance context.
//
//--------------------------------------------------------------------
[FriendAccessAllowed] // Built into Base, also used by Framework.
internal static void RemoveContextFromObject(
DependencyObject context,
DependencyObject oldValue )
{
if (context != null && oldValue.InheritanceContext == context)
{
context.RemoveSelfAsInheritanceContext(oldValue, null);
}
}
//--------------------------------------------------------------------
//
// AddInheritanceContext
//
// Implementation to receive a new inheritance context
//
//--------------------------------------------------------------------
[FriendAccessAllowed] // Built into Base, also used by Framework.
internal static void AddInheritanceContext(DependencyObject newInheritanceContext,
DependencyObject value,
ref bool hasMultipleInheritanceContexts,
ref DependencyObject inheritanceContext )
{
// ignore the request when the new context is the same as the old,
// or when there are already multiple contexts
if (newInheritanceContext != inheritanceContext &&
!hasMultipleInheritanceContexts)
{
if (inheritanceContext == null || newInheritanceContext == null)
{
// Pick up the new context
inheritanceContext = newInheritanceContext;
}
else
{
// We are now being referenced from multiple
// places, clear the context
hasMultipleInheritanceContexts = true;
inheritanceContext = null;
}
value.OnInheritanceContextChanged(EventArgs.Empty);
}
}
//--------------------------------------------------------------------
//
// RemoveInheritanceContext
//
// Implementation to remove an old inheritance context
//
//--------------------------------------------------------------------
[FriendAccessAllowed] // Built into Base, also used by Framework.
internal static void RemoveInheritanceContext(DependencyObject oldInheritanceContext,
DependencyObject value,
ref bool hasMultipleInheritanceContexts,
ref DependencyObject inheritanceContext )
{
// ignore the request when the given context doesn't match the old one,
// or when there are already multiple contexts
if (oldInheritanceContext == inheritanceContext &&
!hasMultipleInheritanceContexts)
{
// clear the context
inheritanceContext = null;
value.OnInheritanceContextChanged(EventArgs.Empty);
}
}
}
}
|