text: ﻿using System.Collections;
  using System.Linq;
  
  namespace Stylet
  {
      // Don't name ConductorExtensions, otherwise it's too obvious when someone types 'Conductor'
  
      /// <summary>
      /// Extension methods used by the Conductor classes
      /// </summary>
      public static class StyletConductorExtensions
      {
          /// <summary>
          /// For each item in a list, set the parent to the current conductor
          /// </summary>
          /// <typeparam name="T">Type of conductor</typeparam>
          /// <param name="parent">Parent to set the items' parent to</param>
          /// <param name="items">Items to manipulate</param>
          /// <param name="active">True to active the item, false to deactive it</param>
          public static void SetParentAndSetActive<T>(this IConductor<T> parent, IEnumerable items, bool active)
          {
              foreach (var item in items)
              {
                  var itemAsChild = item as IChild;
                  if (itemAsChild != null)
                      itemAsChild.Parent = parent;
  
                  if (active)
                      ScreenExtensions.TryActivate(item);
                  else
                      ScreenExtensions.TryDeactivate(item);
              }
          }
  
          /// <summary>
          /// Close an item, and clear its parent if it's set to the current parent
          /// </summary>
          /// <typeparam name="T">Type of conductor</typeparam>
          /// <param name="parent">Parent</param>
          /// <param name="item">Item to close and clean up</param>
          /// <param name="dispose">True to dispose children as well as close them</param>
          public static void CloseAndCleanUp<T>(this IConductor<T> parent, T item, bool dispose)
          {
              ScreenExtensions.TryClose(item);
  
              var itemAsChild = item as IChild;
              if (itemAsChild != null && itemAsChild.Parent == parent)
                  itemAsChild.Parent = null;
  
              if (dispose)
                  ScreenExtensions.TryDispose(item);
          }
          
          /// <summary>
          /// For each item in a list, close it, and if its parent is set to the given parent, clear that parent
          /// </summary>
          /// <typeparam name="T">Type of conductor</typeparam>
          /// <param name="parent">Parent</param>
          /// <param name="items">List of items to close and clean up</param>
          /// <param name="dispose">True to dispose children as well as close them</param>
          public static void CloseAndCleanUp<T>(this IConductor<T> parent, IEnumerable items, bool dispose)
          {
              foreach (var item in items.OfType<T>())
              {
                  parent.CloseAndCleanUp(item, dispose);
              }
          }
      }
  }
  