{curl 8.0 applet}
{curl-file-attributes character-encoding = "utf8"}
{applet manifest = "manifest.mcurl",
	{compiler-directives careful? = true}
}

{define-class public NumericTextField {inherits TextField}

  {constructor public {default ...}

    {construct-super {splice ...}}
    {self.ui-object.add-event-handler
        {on e:KeyPress do
            {if not {self.is-regal-key? e.value}
             then
                {if not {self.is-regal-shortcut-key? e.value,e.ctrl?}
                 then
                    {e.consume}
                }
            }
        }
    }

    set self.halign = "right"
  }

  {method public {set-value-with-events val:String}:void
    {for c:char in val do
        {if not {self.is-regal-key? c}
         then
            {return}
        }
    }

    {super.set-value-with-events val}
  }

  let private constant regal-chars:{Set-of char} =
      {{Set-of char}
        '1','2','3','4','5','6','7','8','9','0','-',','
        ,KeyPressValue.backspace
        ,KeyPressValue.delete
        ,KeyPressValue.tab
        ,KeyPressValue.enter
        ,KeyPressValue.left
        ,KeyPressValue.right
      }

  let private constant regal-shortcut-chars:{Set-of char} =
      {{Set-of char}
        'c','C','v','V','z','Z'
      }


  {method private {is-regal-key? c:char}:bool
    {return {NumericTextField.regal-chars.member? c}}
  }

  {method private {is-regal-shortcut-key? c:char,ctrl?:bool}:bool
    {if not ctrl?
     then
        {return false}
    }

    {return {NumericTextField.regal-shortcut-chars.member? c}}

  }

}

{NumericTextField value = "150"}