# Editor nicht in der 'EditorArea' öffnen, sondern in einem Folder(Layout).



## Koringar (13. Mai 2009)

Hi liebe Gemeinde,

ich habe vor kurzem angefangen mich mit SWT/JFace auseinander zusetzen und nun bin ich auf RCP umgestiegen. Ich konnte in RCP soweit alles erreichen was ich in SWT auch hatte, blos noch etwas besser .

Nun bin ich aber an ein Prolem gestoßen. Und zwar wenn ich ein Editor öffne mit 'IPageLyout.openEditor' öffnet sich der Editor ja, in der Vordefinierten 'EditorArea'. Aber das will ich nicht, ich will die Position des Editors selbst bestimmen.
Bei Views kann man es ja mit dem 'IPageLyout.createFolder' ganz gut, kann man das auch auf den Editor anwenden?


----------



## Wildcard (13. Mai 2009)

Was heißt selbst bestimmen? Ein Editor ist keine View und kann nicht mit Views gemischt werden.
Wie soll es denn aussehen?


----------



## Koringar (14. Mai 2009)

Ja das ist mir klar, aber sie sind ja fast gleich aufgebaut.

Also im Grunde ist es nicht viel was es machen soll, es bekommt ein Objekt mit Variabel
und diese soll es Anzeigen. Mir ist im Grunde egal ob es eine View oder Editor ist, blos so wie ich es gesehen habe kann einer View kein Objekt übergeben werden.

Ich habe mal davon gelesen das man den Editor über eine View aufruft und es würde gehen, habe es aber noch nicht hinbekommen.

Kann man eigentlich general die Position des Editors bestimmen?


----------



## Wildcard (14. Mai 2009)

Nochmal: Ein Editor erscheint in der Editor Area. Was meinst du mit man einer View kein Objekt übergeben. Mit einer View kann man machen was man will, du kannst dir vom Window zB eine bestimmte View hohlen, sie auf deinen konkreten Typ casten und dort was auch immer für Methoden aufrufen, es ist doch dein Code. Ich sehe das Problem nicht ganz.


----------



## Koringar (15. Mai 2009)

Ok,
naja in den Tutorials die ich bis jetzt gelesen habe, stand das nie so drin. Da sollte man sobald eine View von was Abhängig ist, einen Editor verwenden. Geht aber auch so wie du es beschrieben hast, danke. Dann hätte ich dazu aber noch zwei Fragen:

1. Ich habe die View über 'IWorkbenchPage.ShowView( , , )' geöffnet, da es eine View ist die mehrmals geöffnet werden kann geht es über addView ja nicht. Wie kann ich der View mit übergeben in welchen Folder sie sich öffnen soll?

2. Ich habe dem View eben die Methode 'setInput()' gegen, in der fülle ich meine Felder (Text) jetzt mit den Inhalten. Jedoch sind die als Default mir zu klein, ich kann sie jedoch auch nicht beim erstellen einfach größer machen, da ich die Größe des Inhaltes da noch nicht kenne.
Kann man die Größe der Felder in Nachhinein ändern? Ein 'setSize', 'redraw', 'insert' in mal Möglichen kombinationen hat nichts gebracht.


----------



## Wildcard (15. Mai 2009)

> 1. Ich habe die View über 'IWorkbenchPage.ShowView( , , )' geöffnet, da es eine View ist die mehrmals geöffnet werden kann geht es über addView ja nicht. Wie kann ich der View mit übergeben in welchen Folder sie sich öffnen soll?


Das bestimmst du im IPageLayout der Perspective. Entweder direkt hinzufügen, oder, wenn die View nicht direkt sichtbar sein soll, per placeholder.


> 2. Ich habe dem View eben die Methode 'setInput()' gegen, in der fülle ich meine Felder (Text) jetzt mit den Inhalten. Jedoch sind die als Default mir zu klein, ich kann sie jedoch auch nicht beim erstellen einfach größer machen, da ich die Größe des Inhaltes da noch nicht kenne.
> Kann man die Größe der Felder in Nachhinein ändern? Ein 'setSize', 'redraw', 'insert' in mal Möglichen kombinationen hat nichts gebracht.


Entweder du verwendest direkt sinnvolle preferred sizes, oder du musst nochmal layout aufrufen wenn du den Inhalt hast.


----------



## Koringar (18. Mai 2009)

Wildcard hat gesagt.:


> Das bestimmst du im IPageLayout der Perspective. Entweder direkt hinzufügen, oder, wenn die View nicht direkt sichtbar sein soll, per placeholder.



Jo, aber wie bekomme ich das IPageLayout und zweitens soll die View mehrmals verwendet werden und das geht mit addView nicht. Deswegen verwende ich auch showView, aber da kann man die Position nicht bestimmen (auch wenn man vorher ein Placeholder gesetzt hat geht es nicht).
EDIT: Also geht nur bedingt nicht, da wenn man den Placeholder verwendet und die normale Funktion von showView, dann macht es in den Folder. Aber sobald man die Erweiterte Funktion benutzt, um multiple Views anzuzeigen macht er das nicht mehr -.-. Das doch dumm!!!



Wildcard hat gesagt.:


> Entweder du verwendest direkt sinnvolle preferred sizes, oder du musst nochmal layout aufrufen wenn du den Inhalt hast.



Also das mit dem preferred sizes geht nicht ganz, da es ein Feld gibt was 2 Zeichen oder dann vielleicht 500 Zeichen lang sein kann.
Wie meiste das mit dem Layout nochmacl aufrufen? Einfach noch mal das Layout neu zuweisen oder wie?


----------



## Koringar (18. Mai 2009)

Koringar hat gesagt.:


> Jo, aber wie bekomme ich das IPageLayout und zweitens soll die View mehrmals verwendet werden und das geht mit addView nicht. Deswegen verwende ich auch showView, aber da kann man die Position nicht bestimmen (auch wenn man vorher ein Placeholder gesetzt hat geht es nicht).
> EDIT: Also geht nur bedingt nicht, da wenn man den Placeholder verwendet und die normale Funktion von showView, dann macht es in den Folder. Aber sobald man die Erweiterte Funktion benutzt, um multiple Views anzuzeigen macht er das nicht mehr -.-. Das doch dumm!!!



Gut, kannst mich ein Trottel nennen, wenn man die erweiterte Funktion von showView für Multiple Views niehmt muss man bei Placeholder an die ID noch ':*' anhängen und schon funktioniert.

Für das zweite Problem habe ich immer noch keine Lösung . Aber Danke schon mal.


----------



## Koringar (19. Mai 2009)

Jaha, habe das zweite Problem dann auch gelöst . Da ich GridLayout in der View verwende kann man bei jedem Text, 'setLayoutData(new GridData(GridData.FILL_HORIZONTAL))' verwenden und er passt die Größe dann immer automatisch an den Inhalt an.

Ich werde dann auch mal gleich noch eine Zusammenfassung schreiben, wie ich das Thema gelöst habe. Damit andere auch was damit anfangen können.


----------



## Koringar (19. Mai 2009)

Zusammenfassung zum Thema:

Es ist nicht möglich den Editor (extends EditorPart) in einen anderem Folder oder Position zu platzieren, er packt in immer in die 'EditorArea'.

Wer jedoch die Position bestimmen will, muss eine View dafür verwenden. Dies ist jedoch ganz einfach, wenn man weis wie .

1. Erstellen der View mit ihren ganzen Feldern, auch die Felder die dann später gefüllt werden soll. Der View gibt man dann das GridLayout (parent.setLayout(new GridLayout())) mit und bei jedem Feld was man später füllen will muss man 'setLayoutData(new GridData(GridData.FILL_HORIZONTAL))' verwenden (dann passt er die horizontale Größe automatisch dem Inhalt an).

2. Man implementiert der View noch eine extra Mehtode(ich habe sie 'setInput' genannt, wie bei einem Editor) der ein Objekt übergeben wird (es ist euch überlassen welches). In dieser setzt ihr dann euren Inhalt der Felder mit den Sachen aus dem Objekt.

3. Erstell ein Commando zum öffnen der View, ihr könnt euch daran orientrieren editor_command (wirklich gutes Tutorial). Blos anstellen des Code 'page.openEditor(input, MyPersonEditor.ID)' verwendet ihr 'page.showView(MyPersonEditor.ID)' (jenach dem ob ihr eine normale View öffnen wollt oder die erweiterte, wenn ihr die View mehrmals anzeigen wollt). Danach lasst euch eine Referenc auf die View wiedergeben mit 'page.findViewReference(ID, SecondaryID)'
und über diese Reference könnt ihr euch die View holen 'getView(true)'. Die View müsst ihr dann natürlich noch auf euren ViewTyp casten und dann könnt ihr die Mehtode 'setInput(Object)' (in meine Fall) ausführen.

4. Dann müsst ihr natürlich noch die Position definieren, wo es angezeigt werden soll. Das macht ihr in der 'Perpective.java', erstellt euch vom IPageLayout einen Folder über 'createFolder' und fügt diesem Folder mit 'addPlaceholder' die View hinzu (bitte beachten, wenn die View mehrmals existieren soll muss ':*' angehangen werden).
Ihr Könnt auch gleich dem IPageLayout den Placeholder geben ohne einen Folder, wenn euch das lieber ist.

Und schon sollte alles Funktionieren , vielen Dank auch an Wildcard für die Hilfe.

Tipp für MultipleViews:
Beim erstellen des Commando für Anzeigen könnt ihr noch eine zusätzlich Prüfung rein machen, damit diese View mit ihrere ID und SecondaryID einzigartig ist.
Lasst euch dazu einfach eine Referenc auf die View wieder geben mit 'page.findViewReference(ID, SecondaryID)' und wenn diese null ist, könnt ihr eine neue View erstellen. Wenn nicht könnt ihr über 'page.activate(IViewReference.getView(true))' den Focus auf die View setzen. Nützlich falls ihr mit einer Tabele arbeite und ihr jedes Element nochmal anzeigen wollt in einer View.


----------



## Wildcard (19. Mai 2009)

Noch ein Tipp: schau dir mal die GridDataFactory an. Ist ein Segen 

```
GridDataFactory.fillDefaults().grab(true, true).hint(150, 150).applyTo(listBox);
```
statt:

```
GridData listBoxData = new GridData(GridData.FILL_BOTH); 
listBoxData.widthHint = 150; 
listBoxData.heightHint = 150; 
listBoxData.minimumWidth = 1; 
listBoxData.minimumHeight = 1; 
listBox.setLayoutData(listBoxData);
```


----------

