/// enumを指定してレイアウト要素の内容を訂正後に変更する
        private void Correct(SWScale target)
        {
            // Parse
            float value;

            if (!float.TryParse(this.GetTextBox(target).Text, out value))
            {
                this.OverwriteText(target);
                return;
            }

            // Correct
            float changed;
            var   result = SWScaleInputCorrector.TryChange(target, value, out changed);

            // 訂正の必要がない=TextChangedで設定済み
            if (result)
            {
                return;
            }

            // Update Profile
            App.Profile.Open();
            this.SetSWScaleValue(target, changed);
            App.Profile.Close();

            //---------------------------------------------------------------
            // Notify self
            this.OverwriteText(target);
            // Notify other controls
            Commands.CurrentLayoutElementVisualChanged.Execute(null, this);
            //---------------------------------------------------------------
        }
        //===================================================================
        // IBindingProfileの実装
        //===================================================================

        /// enumを指定して、イベントハンドラの実行なしにTextBox.Textを置き換える
        private void OverwriteText(SWScale name)
        {
            this.CanChangeProfile = false;

            var textBox = this.GetTextBox(name);

            textBox.Text = this.GetSWScaleValueString(name);
            if (textBox.IsKeyboardFocused)
            {
                textBox.Select(textBox.Text.Length, 0);
            }
            this.ResetError(name);

            this.CanChangeProfile = true;
        }
        //-------------------------------------------------------------------

        /// enum->文字列
        private string GetSWScaleValueString(SWScale name)
        {
            switch (name)
            {
            case SWScale.LumaGBlur: return(StringConverter.GetSWScaleLumaGBlurString(App.Profile.Current));

            case SWScale.LumaSharpen: return(StringConverter.GetSWScaleLumaSharpenString(App.Profile.Current));

            case SWScale.ChromaHShift: return(StringConverter.GetSWScaleChromaHShiftString(App.Profile.Current));

            case SWScale.ChromaGBlur: return(StringConverter.GetSWScaleChromaGBlurString(App.Profile.Current));

            case SWScale.ChromaSharpen: return(StringConverter.GetSWScaleChromaSharpenString(App.Profile.Current));

            case SWScale.ChromaVShift: return(StringConverter.GetSWScaleChromaVShiftString(App.Profile.Current));

            default: Debug.Fail("switch"); throw new System.ArgumentException();
            }
        }
        /// enum->ToolTip
        private ToolTip GetToolTip(SWScale name)
        {
            switch (name)
            {
            case SWScale.LumaGBlur: return(this.SWScaleLumaGBlurToolTip);

            case SWScale.LumaSharpen: return(this.SWScaleLumaSharpenToolTip);

            case SWScale.ChromaHShift: return(this.SWScaleChromaHShiftToolTip);

            case SWScale.ChromaGBlur: return(this.SWScaleChromaGBlurToolTip);

            case SWScale.ChromaSharpen: return(this.SWScaleChromaSharpenToolTip);

            case SWScale.ChromaVShift: return(this.SWScaleChromaVShiftToolTip);

            default: Debug.Fail("switch"); throw new System.ArgumentException();
            }
        }
        /// enumと値を指定してProfileを変更
        private void SetSWScaleValue(SWScale name, float value)
        {
            switch (name)
            {
            case SWScale.LumaGBlur: App.Profile.Current.SWScaleLumaGBlur = value; break;

            case SWScale.LumaSharpen: App.Profile.Current.SWScaleLumaSharpen = value; break;

            case SWScale.ChromaHShift: App.Profile.Current.SWScaleChromaHShift = value; break;

            case SWScale.ChromaGBlur: App.Profile.Current.SWScaleChromaGBlur = value; break;

            case SWScale.ChromaSharpen: App.Profile.Current.SWScaleChromaSharpen = value; break;

            case SWScale.ChromaVShift: App.Profile.Current.SWScaleChromaVShift = value; break;

            default: Debug.Fail("switch"); throw new System.ArgumentException();
            }
        }
        //-------------------------------------------------------------------

        /// enumを指定してレイアウト要素の内容を変更する
        private void Change(SWScale target)
        {
            // Parse
            float value;

            if (!float.TryParse(this.GetTextBox(target).Text, out value))
            {
                this.SetError(target, "must be float");
                return;
            }

            // Correct
            float changed;
            var   result = SWScaleInputCorrector.TryChange(target, value, out changed);

            // Error表示
            if (result)
            {
                // 成功
                this.ResetError(target);
            }
            else
            {
                // 失敗
                this.SetWarning(target, "Return/Enter: Correct Value");
                return;
            }

            // 成功: そのまま書き換え(Textは変更しない)
            App.Profile.Open();
            this.SetSWScaleValue(target, value);
            App.Profile.Close();

            //---------------------------------------------------------------
            // Notify self
            // Notify other controls
            Commands.CurrentLayoutElementVisualChanged.Execute(null, this);
            //---------------------------------------------------------------
        }
        /// enumを指定してレイアウト要素の内容を訂正後に変更する
        private void Correct(SWScale target)
        {
            // Parse
            float value;
            if (!float.TryParse(this.GetTextBox(target).Text, out value)) {
              this.OverwriteText(target);
              return;
            }

            // Correct
            float changed;
            var result = SWScaleInputCorrector.TryChange(target, value, out changed);

            // 訂正の必要がない=TextChangedで設定済み
            if (result) return;

            // Update Profile
            App.Profile.Open();
            this.SetSWScaleValue(target, changed);
            App.Profile.Close();

            //---------------------------------------------------------------
            // Notify self
            this.OverwriteText(target);
            // Notify other controls
            Commands.CurrentLayoutElementVisualChanged.Execute(null, this);
            //---------------------------------------------------------------
        }
        //===================================================================
        // SWScaleをキーとしたメソッド群
        //===================================================================

        /// TextBoxとToolTipの位置的な関連付け
        private void SetPlacementTarget(SWScale name)
        {
            this.GetToolTip(name).PlacementTarget = this.GetTextBox(name);
        }
 /// enum->ToolTip
 private ToolTip GetToolTip(SWScale name)
 {
     switch (name) {
       case SWScale.LumaGBlur: return this.SWScaleLumaGBlurToolTip;
       case SWScale.LumaSharpen: return this.SWScaleLumaSharpenToolTip;
       case SWScale.ChromaHShift: return this.SWScaleChromaHShiftToolTip;
       case SWScale.ChromaGBlur: return this.SWScaleChromaGBlurToolTip;
       case SWScale.ChromaSharpen: return this.SWScaleChromaSharpenToolTip;
       case SWScale.ChromaVShift: return this.SWScaleChromaVShiftToolTip;
       default: Debug.Fail("switch"); throw new System.ArgumentException();
     }
 }
        //===================================================================
        // IBindingProfileの実装
        //===================================================================
        /// enumを指定して、イベントハンドラの実行なしにTextBox.Textを置き換える
        private void OverwriteText(SWScale name)
        {
            this.CanChangeProfile = false;

            var textBox = this.GetTextBox(name);
            textBox.Text = this.GetSWScaleValueString(name);
            if (textBox.IsKeyboardFocused) {
              textBox.Select(textBox.Text.Length, 0);
            }
            this.ResetError(name);

            this.CanChangeProfile = true;
        }
 /// enumを指定してTextBoxの警告状態設定
 private void SetWarning(SWScale name, string message = null)
 {
     TextBoxError.SetWarning(this.GetTextBox(name), this.GetToolTip(name), message);
 }
        //===================================================================
        // 入力エラー処理
        //===================================================================

        /// enumを指定してTextBoxのエラー状態解除
        private void ResetError(SWScale name)
        {
            TextBoxError.ResetError(this.GetTextBox(name), this.GetToolTip(name));
        }
 //-------------------------------------------------------------------
 /// enum->文字列
 private string GetSWScaleValueString(SWScale name)
 {
     switch (name) {
       case SWScale.LumaGBlur: return StringConverter.GetSWScaleLumaGBlurString(App.Profile.Current);
       case SWScale.LumaSharpen: return StringConverter.GetSWScaleLumaSharpenString(App.Profile.Current);
       case SWScale.ChromaHShift: return StringConverter.GetSWScaleChromaHShiftString(App.Profile.Current);
       case SWScale.ChromaGBlur: return StringConverter.GetSWScaleChromaGBlurString(App.Profile.Current);
       case SWScale.ChromaSharpen: return StringConverter.GetSWScaleChromaSharpenString(App.Profile.Current);
       case SWScale.ChromaVShift: return StringConverter.GetSWScaleChromaVShiftString(App.Profile.Current);
       default: Debug.Fail("switch"); throw new System.ArgumentException();
     }
 }
        //-------------------------------------------------------------------
        /// enumを指定してレイアウト要素の内容を変更する
        private void Change(SWScale target)
        {
            // Parse
            float value;
            if (!float.TryParse(this.GetTextBox(target).Text, out value)) {
              this.SetError(target, "must be float");
              return;
            }

            // Correct
            float changed;
            var result = SWScaleInputCorrector.TryChange(target, value, out changed);

            // Error表示
            if (result) {
              // 成功
              this.ResetError(target);
            } else {
              // 失敗
              this.SetWarning(target, "Return/Enter: Correct Value");
              return;
            }

            // 成功: そのまま書き換え(Textは変更しない)
            App.Profile.Open();
            this.SetSWScaleValue(target, value);
            App.Profile.Close();

            //---------------------------------------------------------------
            // Notify self
            // Notify other controls
            Commands.CurrentLayoutElementVisualChanged.Execute(null, this);
            //---------------------------------------------------------------
        }
 /// enumを指定してTextBoxの警告状態設定
 private void SetWarning(SWScale name, string message = null)
 {
     TextBoxError.SetWarning(this.GetTextBox(name), this.GetToolTip(name), message);
 }
 /// enumと値を指定してProfileを変更
 private void SetSWScaleValue(SWScale name, float value)
 {
     switch (name) {
       case SWScale.LumaGBlur: App.Profile.Current.SWScaleLumaGBlur = value; break;
       case SWScale.LumaSharpen: App.Profile.Current.SWScaleLumaSharpen = value; break;
       case SWScale.ChromaHShift: App.Profile.Current.SWScaleChromaHShift = value; break;
       case SWScale.ChromaGBlur: App.Profile.Current.SWScaleChromaGBlur = value; break;
       case SWScale.ChromaSharpen: App.Profile.Current.SWScaleChromaSharpen = value; break;
       case SWScale.ChromaVShift: App.Profile.Current.SWScaleChromaVShift = value; break;
       default: Debug.Fail("switch"); throw new System.ArgumentException();
     }
 }
 //===================================================================
 // SWScaleをキーとしたメソッド群
 //===================================================================
 /// TextBoxとToolTipの位置的な関連付け
 private void SetPlacementTarget(SWScale name)
 {
     this.GetToolTip(name).PlacementTarget = this.GetTextBox(name);
 }
 //===================================================================
 // 入力エラー処理
 //===================================================================
 /// enumを指定してTextBoxのエラー状態解除
 private void ResetError(SWScale name)
 {
     TextBoxError.ResetError(this.GetTextBox(name), this.GetToolTip(name));
 }