5

全て、

コンテキストメニューからカスタムエディターに図を追加する、パレットレスエクリプスプラグインを作成していますが、それを行う方法が見つかりません。コンテキストメニューを介してエディターに図を動的に追加する方法、つまりアクション/コマンドを追加する方法について、誰かに教えてもらえますか?


Eclipse GEFプラグインの開発では、見るべき例が非常に少ないため、他の人が役立つようにソリューションを追加しています。このコードは、ノードをエディターにレンダリングするのに役立ちます。

エディターに図をレンダリングするためのActionクラスのソースコード:

public class AddNodeAction extends EditorPartAction
{
 public static final String ADD_NODE = "ADDNODE";

 public AddNodeAction(IEditorPart editor) {
  super(editor);
            setText("Add a Node");
            setId(ADD_NODE);     // Important to set ID
 }

 public void run()
 {
  <ParentModelClass> parent=  (<ParentModelClass>)getEditorPart().getAdapter(<ParentModelClass>.class);

  if (parent== null)
   return;
  CommandStack command = (CommandStack)getEditorPart().getAdapter(CommandStack.class);

  if (command != null)
  {
   CompoundCommand totalCmd = new CompoundCommand();
   <ChildModelToRenderFigureCommand>cmd = new <ChildModelToRenderFigureCommand>(parent);
   cmd.setParent(parent);
   <ChildModelClass> newNode = new <ChildModelClass>();
   cmd.setNode(newNode);
   cmd.setLocation(getLocation()); // Any location you wish to set to
   totalCmd.add(cmd);
   command.execute(totalCmd);
  }
 }

 @Override
 protected boolean calculateEnabled() 
 {
  return true;
 }
}
4

1 に答える 1

7

ここには複数の異なるものが必要だと思います。GEFでは、適切なMVCパターンが必要であり、独自のモデル、ビューとしてのフィギュア、コントローラーとしてのEditPartsがあることを忘れないでください。

私の頭のてっぺんから、私はあなたが少なくともこれらのものを必要としていると言うでしょう:

  • CreateCommand
    • 新しいデータをデータモデルに追加するために実行する必要のあるすべてのモデルレベルの変更が含まれています(元に戻せないトランザクション)
  • CreateAction
    • そのCreateCommandインスタンスを作成し、現在の選択で初期化し、editdomainでそのコマンドを実行します
  • ContextMenuProvider
    • そのCreateActionをコンテキストメニューに提供します

GMFを使用している場合、コマンド内でモデルを変更すると、正規のメカニズムによって編集パーツが自動的に生成されますが、GMFを使用していない場合は、独自のモデルと編集パーツが処理および更新されていることを確認する必要があります。新しいアイテムが適切に追加されます。

編集:わかりました、ここにリクエストをいじってみることに関するいくつかのコード提案があります。

public void run() {
   // Fetch viewer from editor part (might not work, if not, try some other way)
   EditPartViewer viewer = (EditPartViewer) part.getAdapter(EditPartViewer.class);
   // get Target EditPart that is under the mouse
   EditPart targetEditPart = viewer.findObjectAt(getLocation());
   // If nothing under mouse, set root item as target (just playing safe)
   if(targetEditPart == null)
       targetEditPart = viewer.getContents();

   // Make and initialize create request with proper information
   CreateRequest createReq = new CreateRequest();
   createReq.setLocation(getLocation());
   createReq.setFactory(new OwnFactoryImplementation());

   // Ask from target editpart command for this request
   Command command = targetEditPart.getCommand(createReq);

   // If command is ok, and it can be executed, go and execute it on commandstack
  if(command != null && command.canExecute()) {
      viewer.getEditDomain().getCommandStack().execute(command);
  }
}

これで、editpartの作成が要求されるため、アクション自体はコマンドがどのように機能するかを認識せず、コマンドに対して客観的になります。

したがって、物事を機能させるには、EditPartに新しいEditPolicyをインストールする必要があります。EditPoliciesは、EditParts createDefaultEditPolicies()関数にインストールできます。このEditPolicyは、CreateRequestがある場合に反応し、コマンドを返す必要があります。このようにして、どの子も自分自身のために子を作成するための独自の種類のコマンドを提供できます。

これがどのように機能するかを示す良い画像です(コントローラーはEditPartです): ダイアグラム

もう少しお手伝いできますか?これは少し複雑に見えることは知っていますが、これによりあなた自身の生活がはるかに楽になります。それを実行した後は、実際にCommand-Request Patternをよく理解し、さまざまな場所で再利用できます。

于 2011-01-13T23:07:52.620 に答える