Frage

Alle,

Ich erstelle eine Palette weniger Eclipse -Plugin, in der ich dem benutzerdefinierten Editor im Kontextmenü Zahlen hinzufüge, finde aber keinen Weg, dies zu tun. Kann mich jemand bitte leiten, wie Sie im Kontextmenü dynamisch Zahlen zum Editor hinzufügen können, dh das Hinzufügen von Aktionen/Befehlen.


Da Eclipse GEF -Plugin -Entwicklung so weniger Beispiele findet, füge ich meine Lösung hinzu, damit andere sie nützlich finden. Dieser Code hilft, dem Editor einen Knoten zu übermitteln.

Quellcode für Aktionsklassen zum Rendern von Zahlen an den Editor:

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;
 }
}
War es hilfreich?

Lösung

Ich denke, Sie brauchen hier mehrere verschiedene Dinge. Bitte denken Sie daran, dass GEF möchte, dass Sie ein ordnungsgemäßes MVC -Muster haben, bei dem Sie über Ihr eigenes Modell, Zahlen als Ansicht und Bearbeiten als Controller verfügen.

Von der Spitze meines Kopfes würde ich sagen, dass Sie zumindest diese Dinge brauchen:

  • CreateCommand
    • Enthält alle Modifikationen der Modellebene, die Sie durchführen müssen, um Ihre neuen Daten zu Ihrem Datenmodell hinzuzufügen (unauffällig und Transaktions).
  • Kreatur
    • Erstellt diese CreateCommand -Instanz, initialisiert sie mit der aktuellen Auswahl und führt diesen Befehl in Editdomain aus
  • Kontextmenuprovider
    • Bietet diese Kreation zum Kontextmenü

Wenn Sie GMF verwenden, generiert der kanonische Mechanismus die EditParts automatisch für Sie, wenn Sie die Modelländerungen in einem Befehl vornehmen. Wenn Sie jedoch nicht GMF verwenden, müssen Sie sicherstellen neuer Artikel ordnungsgemäß hinzuzufügen.

Bearbeiten: OK, hier ist ein Code -Vorschlag beim Herumspielen mit Anfragen.

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);
  }
}

Nun ist, dass EditPart für die Erstellung angefordert wird, sodass die Aktion selbst nicht weiß, wie der Befehl funktioniert, was ihn objektiv macht, um den Befehl zu beantragen.

Um die Dinge zum Laufen zu bringen, müssen Sie neue EditPolicy in Ihrem EditPart installieren. EditPolicies können in editParts erstellte FunktioneditPolicies () -Funktion installiert werden. Diese editPolicy muss reagieren und den Befehl zurückgeben, wenn CreateRequest vorhanden ist. Auf diese Weise kann jedes Kind eine eigene Art von Befehl geben, um Kinder für sich selbst zu schaffen.

Hier ist ein gutes Bild, wie es funktioniert (Controller ist EditPart):Diagram

Bitte fragen Sie, ob ich Ihnen noch mehr helfen kann. Ich weiß, dass dies etwas komplexer aussieht, aber das macht Ihr eigenes Leben viel einfacher, und nachdem Sie das getan haben, verstehen Sie das Befehls-Request-Muster ziemlich gut und es kann an vielen verschiedenen Orten wiederverwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top