org.eclipse.swt.widgets.Textおよび、org.eclipse.swt.custom.StyledTextで、SWT.DragDetectイベントが扱えるようになりテキストのドラッグ&ドロップの実装が可能となりました。
ドラッグ&ドロップの実装方法は、各ウィジェットに対して、次のようなアダプタをリスナとしてセットします。
org.eclipse.swt.dnd.DragSourceAdapter(ドラッグ操作)
org.eclipse.swt.dnd.DropTargetAdapter(ドロップ操作)
次に示すのは、styledText1に対してドラッグ機能を実装したサンプルコードです。
// ドラッグ機能
DragSource source = new DragSource(styledText1, DND.DROP_COPY | DND.DROP_MOVE);
source.setTransfer(new Transfer[] {TextTransfer.getInstance()});
source.addDragListener(new DragSourceAdapter() {
// 選択範囲
Point selection;
// ドラッグ開始処理
public void dragStart(DragSourceEvent e) {
// 選択範囲を記憶
selection = getText1().getSelection();
// 選択範囲が無ければ処理せず
e.doit = selection.x != selection.y;
}
// ドラッグされたテキストをイベントにセット
public void dragSetData(DragSourceEvent e) {
e.data = getText1().getText(selection.x, selection.y-1);
}
// ドロップ時の処理
public void dragFinished(DragSourceEvent e) {
// ドロップ先へ移動の場合はドラッグ箇所をクリア
if (e.detail == DND.DROP_MOVE) {
getText1().replaceTextRange(selection.x, selection.y - selection.x, "");
}
// 選択範囲をクリア
selection = null;
}
});
次に示すのは、styledText2に対してドロップ機能を実装したサンプルコードです。
// ドロップ機能
int style = DND.DROP_DEFAULT | DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
DropTarget target = new DropTarget(styledText2, style);
target.setTransfer(new Transfer[] {TextTransfer.getInstance()});
target.addDropListener(new DropTargetAdapter() {
// ドラッグ中のカーソルが入ってきた時の処理
public void dragEnter(DropTargetEvent e) {
// 修飾キーを押さない場合のドラッグ&ドロップはコピー
if (e.detail == DND.DROP_DEFAULT)
e.detail = DND.DROP_COPY;
}
// ドラッグ中に修飾キーが押されて処理が変更された時の処理
public void dragOperationChanged(DropTargetEvent e) {
// 修飾キーを押さない場合のドラッグ&ドロップはコピー
if (e.detail == DND.DROP_DEFAULT)
e.detail = DND.DROP_COPY;
}
// カーソル位置にテキストをドロップ
public void drop(DropTargetEvent e) {
getText2().insert((String)e.data);
}});
図4:上部StyledTextから下部StyledTextへテキストをドラッグ中
図5:上部StyledTextから下部StyledTextへテキストをドロップ
|