ユーザーがある場所からウィジェットをドラッグして別の場所にドロップできるように、コードを作成することができます。さらに広範囲に、ユーザーが位置を保持している場合のシングル・マウスダウン・イベント、その後のマウス移動イベント、およびシングル・マウスアップ・イベントなどのユーザー・イベントに、コードで応答できます。ドラッグ・アンド・ドロップで表現されるすべてのランタイム・タスクを実現できます。Rich UI では動作は定義されません。
b1 Button {
text = "Button 1", position="absolute", x=10, y=10,
onStartDrag = start, onDrag = drag, onDropOnTarget = drop};
以下に、ドラッグ・アンド・ドロップを可能にする 3 つのプロパティーを示します。
Delegate StartDragFunction(widget Widget in,
x int in, y int in) returns (Boolean)
この関数は、ウィジェットへの参照を受け取り、さらにマウス・ポインターの絶対 x および y 座標を受け取ります。その後、ドラッグ・オペレーションを続行するかどうかを示すブール値を戻します。
Delegate DragFunction(widget Widget in,
dropTarget Widget in,
x int in, y int in)
この関数は、ドラッグされているウィジェットへの参照と、マウス・ポインターがその上を通過するウィジェット (ある場合) への参照を受け取ります。マウス・ポインターがいずれのウィジェット上も通過しない場合、2 番目の引数はヌルです。この関数はまた、マウス・ポインターの絶対 x および y 座標を受け取り、戻り値はありません。関数自体が、マウスの動きに応答してウィジェット (または他の何らかのイメージ) の位置を更新します。
Delegate DropOnTargetFunction(widget Widget in,
dropTarget Widget in,
x int in, y int in)
この関数は、ドロップされるウィジェットへの参照と、マウス・ポインター下のウィジェット (ある場合) への参照を受け取ります。マウス・ポインター下にウィジェットがない場合、2 番目の引数はヌルです。この関数はまた、マウス・ポインターの絶対 x および y 座標を受け取り、戻り値はありません。
import com.ibm.egl.rui.widgets.TextField;
handler MyHandler type RUIHandler{initialUI =[myTextField]}
myTextField TextField{text =
"What a drag!", position = "absolute", x = 110, y = 210, width = 120,
onStartDrag = start, onDrag = drag, onDropOnTarget = drop};
dx, dy int;
function start(myWidget Widget in, x int in, y int in) returns(boolean)
dx = x - myWidget.x;
dy = y - myWidget.y;
return(true);
end
function drag(myWidget Widget in, drop Widget in, x int in, y int in)
myWidget.x = x - dx;
myWidget.y = y - dy;
end
function drop(widget Widget in, drop Widget in, x int in, y int in)
end
end
myWidget.x = x;
myWidget.y = y;
追加の例が、『Rich UI Shadow』にあります。