using System.Windows;
using System.Windows.Input;
namespace OpenSEMI.ClientBase.Command
{
    public abstract class CommandTrigger : Freezable, ICommandTrigger
    {
        public bool IsInitialized { get; set; }
        #region Dependency Properties
        #region Command Property
        /// Identifies the Command dependency property
        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandTrigger),
            new FrameworkPropertyMetadata(null));
        /// description for Command property
        public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }
        #endregion
        #region CustomParameter Property
        /// Identifies the CustomParameterProperty dependency property
        public static readonly DependencyProperty CustomParameterProperty =
            DependencyProperty.Register("CustomParameter", typeof(object), typeof(CommandTrigger),
            new FrameworkPropertyMetadata(null));
        /// description for CustomParameter property
        public object CustomParameter
        {
            get { return (object)GetValue(CustomParameterProperty); }
            set { SetValue(CustomParameterProperty, value); }
        }
        #endregion
        #region CommandTarget Property
        /// Identifies the CommandTarget dependency property
        public static readonly DependencyProperty CommandTargetProperty =
            DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(CommandTrigger),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));
        /// description for CommandTarget property
        public IInputElement CommandTarget
        {
            get { return (IInputElement)GetValue(CommandTargetProperty); }
            set { SetValue(CommandTargetProperty, value); }
        }
        #endregion
        #endregion
        #region Internals
        void ICommandTrigger.Initialize(FrameworkElement source)
        {
            if (IsInitialized)
                return;
            InitializeCore(source);
            IsInitialized = true;
        }
        protected abstract void InitializeCore(FrameworkElement source);
        protected void ExecuteCommand(CommandParameter