using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
namespace MECF.Framework.UI.Client.ClientBase.AttachedProperties
{
    /// 
    /// Adorner for the watermark
    /// 
    internal class WatermarkAdorner : Adorner
    {
        #region Private Fields
        /// 
        ///  that holds the watermark
        /// 
        private readonly ContentPresenter _contentPresenter;
        #endregion
        #region Constructor
        /// 
        /// Initializes a new instance of the  class
        /// 
        ///  to be adorned
        /// The watermark
        public WatermarkAdorner(UIElement adornedElement, object watermark) :
            base(adornedElement)
        {
            IsHitTestVisible = false;
            _contentPresenter = new ContentPresenter
            {
                Content = watermark,
                Opacity = 0.3,
                Margin = new Thickness(Control.Margin.Left + Control.Padding.Left,
                    Control.Margin.Top + Control.Padding.Top, 0, 0)
            };
            if (Control is ItemsControl && !(Control is ComboBox))
            {
                _contentPresenter.VerticalAlignment = VerticalAlignment.Center;
                _contentPresenter.HorizontalAlignment = HorizontalAlignment.Center;
            }
            // Hide the control adorner when the adorned element is hidden
            var binding = new Binding("IsVisible")
            {
                Source = adornedElement,
                Converter = new BooleanToVisibilityConverter()
            };
            SetBinding(VisibilityProperty, binding);
        }
        #endregion
        #region Protected Properties
        /// 
        /// Gets the number of children for the .
        /// 
        protected override int VisualChildrenCount => 1;
        #endregion
        #region Private Properties
        /// 
        /// Gets the control that is being adorned
        /// 
        private Control Control => (Control)AdornedElement;
        #endregion
        #region Protected Overrides
        /// 
        /// Returns a specified child  for the parent .
        /// 
        /// A 32-bit signed integer that represents the index value of the child . The value of index must be between 0 and  - 1.
        /// The child .
        protected override Visual GetVisualChild(int index)
        {
            return _contentPresenter;
        }
        /// 
        /// Implements any custom measuring behavior for the adorner.
        /// 
        /// A size to constrain the adorner to.
        /// A  object representing the amount of layout space needed by the adorner.
        protected override Size MeasureOverride(Size constraint)
        {
            // Here's the secret to getting the adorner to cover the whole control
            _contentPresenter.Measure(Control.RenderSize);
            return Control.RenderSize;
        }
        /// 
        /// When overridden in a derived class, positions child elements and determines a size for a  derived class. 
        /// 
        /// The final area within the parent that this element should use to arrange itself and its children.
        /// The actual size used.
        protected override Size ArrangeOverride(Size finalSize)
        {
            _contentPresenter.Arrange(new Rect(finalSize));
            return finalSize;
        }
        #endregion
    }
}