# Plugin: vorhandene EditorParts einbinden



## Guest (12. Nov 2007)

Hallo zusammen,
in meinem Editor (erbt von EditorPart) muss ich mehrere Modelle gleichen Typs darstellen. Für diese Modellart existiert bereits ein Editor (erbt auch von der Klasse EditorPart).
Ist es möglich mehrere dieser bereits existierenden Editoren in meinem Editor anzuzeigen? Am besten wäre es, wenn jeder EditorPart auf einer Section angezeigt werden würde.

Es geht mir hier nur darum, ob mein Vorhaben überhaupt möglich ist, da ich beim bisherigen googeln nicht wirklich weiter gekommen bin.


----------



## Wildcard (13. Nov 2007)

Grundsätzlich wohl mit 
	
	
	
	





```
IWorkbenchpart#createPartControl(Compoiste parent)
```
Ob alle Editoren damit klar kommen ist wieder eine andere Frage.


----------



## Guest (13. Nov 2007)

Hallo nochmal,

erstmal danke für die Antwort. Ist es denn überhaupt üblich so etwas zu tun, also bereits vorhandene Editoren einzubinden? Oder macht man sowas eigentlich nicht?

Ich hab das nun mal versucht. Es werden zwar keine Fehler ausgegeben, allerdings haben die Sections keinen Inhalt.
Evtl ist ja gleich auf den ersten Blick ein Fehler zu sehen?!


```
@Override
	public void createPartControl(Composite parent) {
		FormToolkit toolkit = new FormToolkit(parent.getDisplay());
		ScrolledForm form = toolkit.createScrolledForm(parent);
		Composite body = form.getBody();
		GridLayout gridLayout = new GridLayout();
		gridLayout.makeColumnsEqualWidth = false;
		gridLayout.numColumns = 3;
		body.setLayout(gridLayout);
		IWorkbench workbench = PlatformUI.getWorkbench();
		IProject project = emsFile.getProject();
		for (MyModel modelInstance : anotherModel.getList()){
			try {
				String tmsFilePath = createPath(emsFile.getLocation(), tmsInstance);
				IFile tmsFile = project.getFile(tmsFilePath);
				Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
				section.setText(modelInstance.getName());
				SimulationEditor editor = new SimulationEditor(); //der vorhandene Editor
				editor.init(this.getEditorSite(), new FileEditorInput(tmsFile));
				editor.createPartControl(section);
				section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
			} catch (PartInitException e) {
				e.printStackTrace();
			}
		}
	}
```


----------



## Wildcard (14. Nov 2007)

Anonymous hat gesagt.:
			
		

> Ist es denn überhaupt üblich so etwas zu tun, also bereits vorhandene Editoren einzubinden? Oder macht man sowas eigentlich nicht?


Ich hab das bisher nur bei VE gesehen und dort würde ich auch mal schauen (der Java Editor wird in die Visual Class eingebunden).
Die Error Log zeigt auch keine Fehler an? Was spuckt dir der Debugger über die EditorParts aus?
Liegt SimulationEditor im Quellcode vor, so das du mal nachsehen kannst was da passiert bzw. nicht passiert?


----------



## Guest (14. Nov 2007)

Hallo,
der SimulationEditor liegt im Quellcode vor und ich habe nun auch schon eine ganze Weile debuggt. Es treten keine Fehler auf.
Beim VE hab ich jetzt noch nicht reingeguckt, aber müsste ich nicht noch der Section mitteilen, dass die Instanz vom SimulationEditor der Client der Section ist?
Wenn man einen Viewer auf der Section platziert muss man ja auch Section#setClient(Control control) aufrufen. Etwas in dieser Art müsste ich doch sicher auch für den EditorPart machen oder?
Vielleicht liegt da ja der Fehler, nur habe ich keine Methode gefunden um den EditorPart als Client zu setzen.


----------



## Wildcard (15. Nov 2007)

Hol dir die Children der Section, dann hast du dein Control...
Es ist übrigens immer besser im Kleinen zu testen, d.h. ohne Section, nur mit Composite.


----------



## Guest (20. Nov 2007)

Hallo,
die Hoffnung den fertigen Editor einbinden zu können habe ich nun aufgegeben. Ich versuche nun meine Models in TreeViewern darzustellen. Dabei sollen die Views unabhängig voneinander auf SelectionEvents reagieren können, d.h. jeder View reagiert/ändert seinen Zustand wenn ein Element aus ihm selbst angeklickt wurde.
Allerdings läuft das noch nicht wie gewünscht  :cry:


```
public class MyEditor extends EditorPart implements ISelectionListener {
private RunTaskAction runtaskaction;
...

@Override
   public void createPartControl(Composite parent) {
      FormToolkit toolkit = new FormToolkit(parent.getDisplay());
      ScrolledForm form = toolkit.createScrolledForm(parent);
      Composite body = form.getBody();
      GridLayout gridLayout = new GridLayout();
      gridLayout.makeColumnsEqualWidth = false;
      gridLayout.numColumns = 3;
      body.setLayout(gridLayout);
      for (MyModel modelInstance : anotherModel.getList()){
         try {
            EditPartFactory editpartfactory = new TaskModelSimulationEditPartFactory();
				Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
				section.setText(tmsInstance.getName());
				TreeViewer treeViewer = new TreeViewer();
				treeViewer.createControl(section);
				DefaultEditDomain editDomain = new DefaultEditDomain(this);
				editDomain.addViewer(treeViewer);
				treeViewer.setEditPartFactory(editpartfactory);
				getSite().setSelectionProvider(treeViewer); //hier muss irgendetwas anderes passieren
				treeViewer.setContents(modelInstance.getSimulation().get(0));
				section.setClient(treeViewer.getControl());
				section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
				editDomain.setActiveTool(new RunTaskTool(runtaskaction));
         } catch (PartInitException e) {
            e.printStackTrace();
         }
      }
   }

public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        if (this.equals(getSite().getPage().getActiveEditor())) {
    		runtaskaction.update();
        }
	}

@Override
	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
		if (!(input instanceof IFileEditorInput)){
			throw new PartInitException("Input must be from type IFileEditorInput");
		}
		simulation = createEnsembleModelSimulation(((IFileEditorInput) input).getFile());
		setSite(site);
		setInput(input);
		updateTitle();
		createActions();
		getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this);
	}
```

Hier wird nun der TreeViewer erstellt. Als Tool wird ein RunTaskTool übergeben, welches z.B. auf einen Doppelklick reagiert. Allerdings funktioniert dies nur für den zuletzt erstellten TreeViewer, was auch logisch ist, weil er ja als SelectionProvider angemeldet ist. Alle anderen TreeViewer reagieren nicht auf Events.
Gibt es eine Möglichkeit, das jeder Viewer auf seine eigenen Events reagiert und nicht nur der zuletzt erstellte Viewer? Ich habe bereits überlegt einen eigenen SelectionProvider zu schreiben, der alle TreeViewer verwaltet und dann dem selektierten Viewer die Selection übergibt. Könnte das klappen und wenn ja wie müsste das ungefähr aussehen?

Ich hoffe es ist ungefähr klar geworden, was ich möchte  :bahnhof: 

Schon mal danke und schönen Gruß!!


----------

