ドラッグ&ドロップによるBoxの伸縮

【ご質問】
ドラッグ&ドロップでBoxオブジェクトのサイズ変更することは可能でしょうか。

【回答】
PointerPress、PointerMotion、PointerReleaseのイベントを使用することで実現可能です。

サイズを変えたいオブジェクト上でPointerPressイベントが発生したタイミングで
PointerMotionイベントを貼り付けます。
そのPointerMotionイベントではマウスの動きに合わせてオブジェクトのサイズを変更します。
そして、PointerReleaseイベントで貼り付けたPointerMotionイベントを取り除きます。

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

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

{value
    let frame:#Frame
    let start-x:Distance
    let start-width :Distance
   
    let p-mo:EventHandler = {on e:PointerMotion at canvas:Canvas do
                                             set frame.width = start-width + (e.x – start-x)
                                         }
    let canvas:Canvas = {Canvas width = 15cm, height = 10cm,
                                      background = “silver”,
                                     {on e:PointerRelease at canvas:Canvas do
                                         {try
                                             {canvas.remove-event-handler p-mo}
                                          catch e:Exception do
                                             ||do nothing
                                         }
                                     }
                                 }
    set frame = {Frame width = 3cm, height = 3cm, background = “#D4D0C8”,
                          border-width = 1pt, border-color = “black”,
                          {VBox {Fill},
                              {HBox {Fill},
                                  {Frame width = 10pt, height = 10pt, background = “red”,
                                      {on e:PointerPress at f:Frame do
                                          let (canvas-x:Distance, canvas-y:Distance) =
                                               {frame.get-origin-in-graphical-ancestor canvas}
                                          set start-x = canvas-x + e.x
                                   
                                          set start-width = f.width
                                          {canvas.add-event-handler p-mo}
                                          {e.continue-implicit-pointer-grab canvas}
                                     }
                                 }
                             }
                         }
                     }

    {canvas.add frame, x = 4cm, y = 4cm}
    canvas
}