using Microsoft.Xaml.Behaviors;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;

namespace FLY.ControlLibrary
{
    /// <summary>
    /// 后台添加功能，按钮按下 时 属性=true， 抬起属性=false
    /// </summary>
    public class ResetAction2 : 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>
        /// <param name="pressIsTrue"></param>
        public ResetAction2(UIElement uIElement, object obj, string propertyname, bool pressIsTrue = true)
        {
            this.uIElement = uIElement;
            this.obj = obj;
            this.propertyname = propertyname;
            this.pressIsTrue = pressIsTrue;


            uIElement.PreviewMouseDown += UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown += UIElement_PreviewTouchDown;
            uIElement.PreviewMouseUp += UIElement_PreviewMouseUp;
            uIElement.PreviewTouchUp += UIElement_PreviewTouchUp;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="uIElement"></param>
        /// <param name="obj"></param>
        /// <param name="propertyname"></param>
        /// <param name="pressIsTrue"></param>
        public ResetAction2(UIElement uIElement, string propertyname, bool pressIsTrue = true)
        {
            this.uIElement = uIElement;

            this.propertyname = propertyname;
            this.pressIsTrue = pressIsTrue;


            uIElement.PreviewMouseDown += UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown += UIElement_PreviewTouchDown;
            uIElement.PreviewMouseUp += UIElement_PreviewMouseUp;
            uIElement.PreviewTouchUp += UIElement_PreviewTouchUp;
        }
        public void Dispose()
        {
            uIElement.PreviewMouseDown -= UIElement_PreviewMouseDown;
            uIElement.PreviewTouchDown -= UIElement_PreviewTouchDown;
            uIElement.PreviewMouseUp -= UIElement_PreviewMouseUp;
            uIElement.PreviewTouchUp -= UIElement_PreviewTouchUp;
        }

        private void UIElement_PreviewTouchUp(object sender, TouchEventArgs e)
        {
            Up();
        }

        private void UIElement_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            Up();
        }
        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;

            if (pressIsTrue)
                Misc.PropertiesManager.SetValue(obj, propertyname, true);
            else
                Misc.PropertiesManager.SetValue(obj, propertyname, false);
        }
        void Up()
        {
            if (IsObjNull()) return;

            if (pressIsTrue)
                Misc.PropertiesManager.SetValue(obj, propertyname, false);
            else
                Misc.PropertiesManager.SetValue(obj, propertyname, true);
        }

    }


    /// <summary>
    /// ResetAction2 的 XAML 版 ，附加行为。
    /// 与 NoToggleButton 控件 一起使用
    /// </summary>
    public class ResetBehavior : Behavior<UIElement>
    {
        public System.Windows.Data.Binding Binding { get; set; }
        ResetAction2 resetAction = null;
        public ResetBehavior()
        {
        }

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

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

        }
    }
}
