using Microsoft.Xaml.Behaviors;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace FLY.ControlLibrary
{
    /// <summary>
    /// 后台添加功能，按钮 click事件 属性=true
    /// </summary>
    public class Set1Action : IDisposable
    {
        /// <summary>
        /// 对象
        /// </summary>
        public object obj;
        /// <summary>
        /// bool 属性
        /// </summary>
        public string propertyname;
        /// <summary>
        /// 按下时为 true
        /// </summary>
        public bool pressIsTrue;
        UIElement uIElement;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="uIElement"></param>
        /// <param name="obj"></param>
        /// <param name="propertyname"></param>
        public Set1Action(UIElement uIElement, object obj, string propertyname)
        {
            this.uIElement = uIElement;
            this.obj = obj;
            this.propertyname = propertyname;

            uIElement.PreviewMouseDown += UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown += UIElement_PreviewTouchDown;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="uIElement"></param>
        /// <param name="propertyname"></param>
        public Set1Action(UIElement uIElement, string propertyname) : this(uIElement, null, propertyname)
        {

        }
        public void Dispose()
        {
            uIElement.PreviewMouseDown -= UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown -= UIElement_PreviewTouchDown;
        }



        private void UIElement_PreviewTouchDown(object sender, TouchEventArgs e)
        {
            Down();
        }

        private void UIElement_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            Down();
        }

        bool IsObjNull()
        {
            if (obj == null)
            {
                if (uIElement is FrameworkElement)
                {
                    obj = (uIElement as FrameworkElement).DataContext;
                    if (obj == null)
                        return true;
                }
                else
                {
                    return true;
                }
            }
            return false;
        }
        void Down()
        {
            if (IsObjNull()) return;

            Misc.PropertiesManager.SetValue(obj, propertyname, true);
        }

    }


    /// <summary>
    /// Set1Action 的 XAML 版 ，附加行为。
    /// </summary>
    public class Set1Behavior : Behavior<UIElement>
    {
        public System.Windows.Data.Binding Binding { get; set; }
        Set1Action set1Action = null;
        public Set1Behavior()
        {
        }

        protected override void OnAttached()
        {
            base.OnAttached();
            UIElement dobj = AssociatedObject;
            if (Binding != null && Binding.Path != null)
            {
                if (Binding.Source != null)
                {
                    set1Action = new Set1Action(dobj, Binding.Source, Binding.Path.Path);
                }
                else
                {
                    var obj = COMMON.GetDataContext(dobj);
                    if (obj == null)
                    {
                        set1Action = new Set1Action(dobj, Binding.Path.Path);
                    }
                    else
                    {
                        set1Action = new Set1Action(dobj, obj, Binding.Path.Path);
                    }
                }
            }
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            if (set1Action != null)
            {
                set1Action.Dispose();
                set1Action = null;
            }

        }
    }
}
