0

私は dropListener を追加しようとしているので、GEf Editor で draw2d Label にドロップしてテキストを入れることができます。例は素晴らしいでしょう。

4

1 に答える 1

0

GEF 編集パーツ ビューアーでドロップ イベントに応答するには、ビューアー自体に の実装をインストールする必要があります。この実装はorg.eclipse.jface.util.TransferDropTargetListener、型の転送を理解し、ターゲットにインストールされているによって処理できるorg.eclipse.swt.dnd.TextTransfer何らかの種類のものを作成します。org.eclipse.gef.Requestorg.eclipse.gef.EditPolicyorg.eclipse.gef.EditPart

Requestと の両方EditPolicyで、基本的にドロップ動作をカスタマイズできることを理解する必要がありEditPartます。結果として、実際に完全に機能する例を紹介できますが、実際のニーズに合わせて自由にカスタマイズしてください。

最初に次を作成しますTransferDropTargetListener

public class TextTransferDropTargetListener extends AbstractTransferDropTargetListener {

    public TextTransferDropTargetListener(EditPartViewer viewer) {
        super(viewer, TextTransfer.getInstance());
    }

    @Override
    protected void handleDragOver() {
        getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
        super.handleDragOver();
    }

    @Override
    protected Request createTargetRequest() {
        return new ChangeBoundsRequest(REQ_ADD);
    }

    @Override
    protected void updateTargetRequest() {
        ChangeBoundsRequest request = (ChangeBoundsRequest) getTargetRequest();
        request.setEditParts(Collections.EMPTY_LIST);
        request.setLocation(getDropLocation());
    }

    @Override
    protected void handleDrop() {
        super.handleDrop();
        if (getCurrentEvent().detail != DND.DROP_NONE) {
            getViewer().setSelection(StructuredSelection.EMPTY);
            getViewer().getControl().setFocus();
        }
    }

    @Override
    protected Command getCommand() {
        String text = (String) getCurrentEvent().data; 
        List<IEntityPart> editParts = new ArrayList<IEntityPart>();

        //
        // using the 'text' variable you have to create
        // a new EditPart that would eventually replace the old one.
        //
        editParts.add(createNewLabelPart());

        ChangeBoundsRequest request = (ChangeBoundsRequest) getTargetRequest();
        request.setEditParts(editParts);

        return super.getCommand();
    }
}

次に、次のステートメントを使用してグラフィカル ビューアー コンストラクターにリスナーをインストールします。

addDropTargetListener(new TextTransferDropTargetListener(this));

最後にEditPolicy、タイプのリクエストを理解する がターゲットにインストールされていることを確認します (またはREQ_ADDを拡張するものをすでに追加している可能性があります)。これは通常、 で行われます。LayoutEditPolicyContainerEditPolicyEditPartAbstractEditPart.createEditPolicies()

一連の責任をよりよく理解するために、TransferDropTargetListener.getCommand()メソッドのスーパー実装を確認することをお勧めします。

于 2013-07-24T11:28:28.007 に答える