Enterキー長押し時のイベント制御

【ご質問】
TextFieldのValueFinishedイベントやCommandButtonのActionイベントで
Enterキーの長押しやCommandButtonを連続ボタン押下された際に、
TextFieldやCommandButtonでイベントを一回のみ発生するようにしたいのですが、可能でしょうか。

【回答】
各コントロールでhandle-eventをオーバーライドして
各イベントを制御すれば宜しいのではないでしょうか。

詳細は以下のサンプルをご参照ください。 

{curl 6.0,7.0,8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

||連続押しができないボタン
{define-class public MyCommandButton {inherits CommandButton}

  {constructor public {default …}
    {construct-super …}
  }
 
  {method public {handle-event event:Event}:void
    {if event isa Action then
        set self.enabled? = false
       
        {dispatch-events true}
        {super.handle-event event}
        {dispatch-events true}
        set self.enabled? = true
     else
        {super.handle-event event}
    }
  }
}

{define-class public MyStandardTextFieldUI {inherits StandardTextFieldUI}

  field public fire?:bool = true
 
  {constructor public {default …}
    {construct-super …}
  }
 
  {method public {on-raw-key-release e:RawKeyRelease}:void
    set self.fire? = true
  }
 
  {method public {on-pointer-press e:PointerPress}:void
    set self.fire? = true
  }

}
||ValueFinishedイベント抑制TextField
{define-class public MyTextField {inherits TextField}

  {constructor public {default …}
    {construct-super …}
    set self.ui-object = {MyStandardTextFieldUI}
  }

  {method public {handle-event event:Event}:void
    {if event isa ValueFinished and (self.ui-object asa MyStandardTextFieldUI).fire? then
        {super.handle-event event}
        set (self.ui-object asa MyStandardTextFieldUI).fire? = false
     elseif not event isa ValueFinished then
        {super.handle-event event}
     elseif not (self.ui-object asa MyStandardTextFieldUI).fire? then
        ||
     else
        {super.handle-event event}
        set (self.ui-object asa MyStandardTextFieldUI).fire? = true
    }
  }
}

{value
    {VBox spacing = 10pt,
        {MyTextField width = 100pt,
            {on e:ValueFinished at tf:TextField do
                {dump e}
            }
        },
        {MyCommandButton label = “二度押し禁止”,
            {on e:Action do
                {dump e}
                ||時間の掛かる処理の代わり
                {sleep 3s}
            }
        }
    }
}