RCP Eclipse RCP: Wo/wann im Plugin ist workbench initialisiert?

T

tuxedo

Gast
Hallo zusammen,

hab hier eine Eclipse RCP Anwendung die aus mehreren Plugins besteht. Eines der Plugins soll ein Untermenü in der Menüleiste dynamisch erweitern können. Hab das mal experimentell aufgebaut, und das geht auch recht gut.

Das Problem das ich nun habe ist folgendes:

Der Inhalt des Untermenüs ist abhängig von der Selektion im Editor (der aus einem anderen Plugin stammt) bzw. der Selektion in einem View (welcher ebenfalls aus einem anderen Plugin stammt).

Meine Aktuelle Lösung würde so aussehen:

Java:
			IWorkbench workbench = PlatformUI.getWorkbench();
			IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();

			window.getSelectionService().addSelectionListener(new ISelectionListener() {
				
				@Override
				public void selectionChanged(IWorkbenchPart part, ISelection selection) {
					System.out.println("part="+part+" selection="+selection);				
				}
			});
			System.err.println("SelectionListener registered!");

Ich regsitriere also global einen Selection-Listener. In dessen Implementierung muss ich dann nur noch auswerten was selektiert wurde und dann ggf. das Menü aktualisieren. Dieser Listener soll in dem Plugin laufen, von dem auch das Menü angepasst wird. Nur brauche ich dazu die workbench-Instanz.

Und ich hab aktuell keinen Schimmer, wie ich von einem Plugin aus so früh wie möglich an eine gültige workbench-Instanz komme. Über die Activator-Klasse des Plugins hab ich's schon mit der start() Methode probiert. Doch start() wird aufgerufen bevor es eine Workbench-Instanz gibt.

Hat jemand nen Tiopp für mich an welcher Stelle ich im Plugin den Listener registrieren kann, es also schon eine Workbench-Instanz gibt?

Gruß
Alex
 

Atze

Top Contributor
hm? läuft das plugin nicht in einer workbench? muss es die workbench nicht vor dem plugin geben?

edith:
Java:
	public Activator() {
		IWorkbench wb = PlatformUI.getWorkbench();
		System.out.println(wb);
	}

ausgabe: org.eclipse.ui.internal.Workbench@15b25a1
habs gerade probiert, also in constructor vom Activator hat der die workbench doch schon

oder versteh ich was falsch?
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Wenn ich das in der Activator-Klasse mache, die im "hauptprojekt" neben der "ApplicationWorkbenchAdvisor" Klasse liegt, dann ja. Aber nicht wenn ich das in der Activator-Klasse des anderen Plugins, welches aber in der gleichen Workbench laufen soll mache...

Hab jetzt mehrfach gelesen, dass man mit

Java:
UIJob job = new UIJob("RegisterListener") {
			
			@Override
			public IStatus runInUIThread(IProgressMonitor monitor) {
				WallColorBrightnessProfilesHandler.registerListener();
				return Status.OK_STATUS;
			}
		};

innerhalt vom
Code:
Activator#start()
das ganze im UI Thread ausführen kann, und das dann logischerweise erst ausgeführt wird, wenn Workbench mit dem UI da ist. Nur dummerweise wird das bei mir gar nie ausgeführt?!

*rätsel*

- Alex
 
T

tuxedo

Gast
Also die ganzen "führ's doch im UI aus" Tipps von Stackoverflow.com helfen kein bisschen. Hab das ganze jetzt mal debugged:

Der UIJob wird gecancelled, eben weil noch kein UI da ist... Man, ich krieg noch nen Vogel :shock: .. Kann doch nicht so schwer sein ein Plugin erst dann zu starten/aktivieren wenn das Workbench da ist???:L Aber ich komm nicht drauf...

- Alex
 
T

tuxedo

Gast
Als ob ich da nicht auch schon drauf gekommen wäre. Aber wenn du mir erklären kannst (link oder stichwort wäre schonmal hilfreich) wie ich deklarativ ein Untermenü anlege, dessen weitere Verzweigung und Kommandos abhängig von der Selektion eines View/Editors sind, dann würde mich das auch zur Lösung bringen.

Gruß
Alex

[update]
Das bringt mich ein kleines Stückchen weiter:
Help - Eclipse SDK

Damit hab ich jetzt schonmal ein initialisiertes Workbench-Objekt. Jetzt muss ich nur noch den Listener registrieren können. Bis dato hab ich das über

Java:
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
window.getSelectionService().addSelectionListener(new ISelectionListener() {
...

gemacht. Aber das Window scheint noch nicht dazu sein sein :autsch:

[update2]

So, hab das erste Teilproblem tatsächlich lösen können:

1) Startup Expenstion Point einrichten und auf Klasse zeigen lassen, die IStartup implementiert
2)
Java:
@Override
	public void earlyStartup() {
		mLogger.info("Early Startup");

		final IWorkbench workbench = PlatformUI.getWorkbench();
		mLogger.info("Workbench=" + workbench);
		
		
		UIJob job = new UIJob("RegisterSelectionListenerForDynamicCBPMenu") {
			
			@Override
			public IStatus runInUIThread(IProgressMonitor monitor) {
				IWorkbenchWindow activeWindow = workbench.getActiveWorkbenchWindow();
				mLogger.info("UI activeWindow=" + activeWindow);
				
				activeWindow.getSelectionService().addSelectionListener(new ISelectionListener() {
					@Override
					public void selectionChanged(IWorkbenchPart part, ISelection selection) {
						System.err.println("part=" + part + " selection=" + selection+" class="+selection.getClass());
					}
				});
				mLogger.info("SelectionListener registered!");
				
				return Status.OK_STATUS;
			}
		};
		job.schedule();
	}
 
Zuletzt bearbeitet von einem Moderator:

fifo

Mitglied
Ich würde es mit den Command Core Expressions versuchen. Hier ist der Link Command Core Expressions - Eclipsepedia

Hier ein auszug aus der plugin.xml:

[XML]
<extension
id=""
name=""
point="org.eclipse.ui.handlers">
<handler
class="com.commands.OpenInEditor"
commandId="com.commands.OpenInEditor">
<activeWhen>
<with
variable="selection">
<iterate
ifEmpty="false">
<instanceof
value="org.eclipse.jdt.ui.CompilationUnitEditor">
</instanceof>
</iterate>
</with>
</activeWhen>
</handler>
</extension>
[/XML]
 
T

tuxedo

Gast
Und wie krieg ich damit dynamisch, in abhängigkeit von der Selektion in diversen Views/Editoren Sub-Menü's (deren Anzahl ist abhängig von der Selektion) erzeugt/entfernt und nicht nur aktiviert/deaktiviert/sichtbar/unsichtbar gemacht?

Um es etwas präziser zu umschreiben:

Es ist ein Konfig-Menü in dem es ein Sub-menü "Presets" gibt. Darin gibt es dann bis zu 5 Presets und eine "Save current as" Aktion die ein neues Preset anlegt. Jeder Preset-Menü-Eintrag lässt sich nochmal aufklappen, und darin befinden sich verschiedene Commandos.

Die im Menü anzuzeigenden Presets hängen von der Selektion in einem View, bzw. der Selektion in einem Editor ab. Klickt man auf das eine, kann es z.b. 3 Presets geben, klickt man auf das andere gibt vielleicht keinen, und beim nächsten gibts 5.

Mit meiner Lösung geht das nun. Ich hab im Plugin einen SelectionListener registriert, der global alle Selektionen mitbekommt und basierend auf der Selektion das Menü umbaut.

- Alex
 
Zuletzt bearbeitet von einem Moderator:

fifo

Mitglied
Das aktiveWhen reagiert auf eine Variable in dem gezeigten Beispiel ist es selektion. Es kann aber auch die Variable activeEditor verwendet werden. Dann musst du noch angeben bei welchen Editor der Menüpunkt aktiv sein soll. Ist der entsprechende Editor aktiv wird Menüpunkt aktiviert oder deaktiviert.
Anstelle von aktiveWhen kannst du auch enabledWhen verwenden, dann wird der Menüpunkt nur angezeigt wenn der entsprechende Editor aktiv ist.

Du musst für jedes Command einen Handler definieren und dann entsprechend die Bedingungen definieren.

Das ganze ist etwas kompliziert, aber wenn man es verstanden hat ist es sehr mächtig und auch leicht zu verwenden.
 
T

tuxedo

Gast
Ja, das leuchtet mir schon ein. Ich kann menupunkte/Unterpunkte haben die basierend auf Variablen und folglich auch Selektionen aktiviert/deaktiviert oder sichtbar/unsichtbar sind. Aber bei mir änder sich ja die Anzahl der Menüpunkte und die dahinterliegende Referenz je nach Selektion. Heute sinds bis zu 5 Presets die ich so über's Menu abfahren muss. Das würde ggf. noch statisch gehen. Würde man dann einfach 5 Einträge anlegen und nur die Aktivierung/Sichtbarkeit steuern und über andere Variablen im Handler die dahinterliegende Referenz abbilden. Aber morgen brauch ich evtl schon 10 solcher dynamischer Untermenüs's oder sogar im Worstcase unbegrenzt viele. In dem Fall ist es wohl flexibler und (jetzt auch) einfacher das programmatisch zu fahren, als mit aller Gewalt das pseudo-dynamisch deklarativ zu lösen.
 

Wildcard

Top Contributor
Die Argumentation verstehe ich nicht. Wenn sich die Anzahl der Menüs ändert, musst du derzeit doch auch Code ändern. Inwiefern ist das also dynamischer?
Ich denke der deklarative Ansatz ist dynamischer, denn du kannst neue Menüs dann auch durch neue Bundles oder Fragmente bereitstellen.
Ausserdem hat der deklarative Ansatz den großen Vorteil das dein Bundle nicht gestartet werden muss, bis es wirklich benötigt wird, also Code zur Ausführung kommt.
 
T

tuxedo

Gast
Die Argumentation verstehe ich nicht. Wenn sich die Anzahl der Menüs ändert, musst du derzeit doch auch Code ändern.

Nö, muss ich nicht. Die Menüeintrage und die Anzahl sind Laufzeitabhängig. Kommt drauf an was ich selektiere.

Inwiefern ist das also dynamischer?
Ich denke der deklarative Ansatz ist dynamischer, denn du kannst neue Menüs dann auch durch neue Bundles oder Fragmente bereitstellen.

Dynamischer deshalb, weil es davon abhängt was ich wann anklicke. Wenn ich das deklarativ mache, dann ist das solange statisch, bis ich das deklarierte anfasse. Okay, es auch auch ein klein wenig dynamisch, da ich in Abhängigkeit von Variablen im System Menüpunkte ein/ausblenden aktivieren/deaktivieren kann. Aber ich bin damit immernoch auf das, was ich mal deklariert habe eingegrenzt. Ich kann nicht dynamisch beliebiug viele Menüpunkte hinzufügen wenn ich das statisch deklariert habe.

Ausserdem hat der deklarative Ansatz den großen Vorteil das dein Bundle nicht gestartet werden muss, bis es wirklich benötigt wird, also Code zur Ausführung kommt.

Das ist für mich irrelevant.

Ich versuchs meine Requirements nochmal genauer zu formulieren:

Die Anwendung soll Displaywände, die aus mehreren Displays besteht steuern. Steuern im Sinne von Helligkeit, Farbabgleich, welcher Eingang an jeweiligen Display, ...

Die Anwendung kann viele Displaywände ansteuern. Und jede Displaywand hat 0..n Profile für Helligkeit+Kontrast+Farbe.

Je nachdem welche Displaywand ich in der Anwendung in einem View oder im Editor selektiere, soll in der Menüleiste "Konfiguration" im Untermenu "Profile" die einzelnen Profile der jeweils selektierten Displaywand als weiteres Untermenü von "Profile" auftauchen. Und dieses Untermenü hat dann Kommandos wie "löschen", "anwenden", "umbenennen", ...

Code:
Menüleiste
         +-----------[Konfigurieren]
                                   +-----------[Profile]
                                                       +--------[Profil 1]
                                                       |                 +------löschen
                                                       |                 +------anwenden
                                                       |                 +------umbenennen
                                                       |                 +------....
                                                       +--------[Profil ...]
                                                       |                   +------löschen
                                                       |                   +------anwenden
                                                       |                   +------umbenennen
                                                       |                   +------....
                                                       +--------[Profil n]
                                                                         +------löschen
                                                                         +------anwenden
                                                                         +------umbenennen
                                                                         +------....

Je nachdem ob ich jetzt die eine, oder andere Wand selektiere, hab ich eine unterschiedliche Anzahl an Profilen im Menü sichtbar. ich wüsste nicht wie ich das deklarativ festlegen, und wie das dann noch dynamisch sein soll.

Deklarativ hab ich festgelegt dass es ein Menu "Profile" gibt. Aber dynamisch, per Code generiert, sind die Untermenüs "Profil x" (die natürlich beliebig heissen können).
 

Wildcard

Top Contributor
Ach, jetzt hab ich dich verstanden. Die Anzahl der Menüs bestimmt sich nicht alleine aus Code, sondern wird aus Nutzdaten berechnet. Ja, da hast du tatsächlich keine andere Wahl als programmatisch vorzugehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E OSGi Eclipse Plug-in programmierung: java.lang.NullPointerException: Cannot enter synchronized block because "profile" is null Plattformprogrammierung 4
R Eclipse Bundles Plattformprogrammierung 2
Robertop RCP Command in bereits bestehendes Eclipse-Menü einbauen Plattformprogrammierung 4
T Java Projekt läuft nur in Eclipse Plattformprogrammierung 6
M Eclipse Plugin PreferencePage BooleanFieldEditor Plattformprogrammierung 1
F OSGi Plugin unter Eclipse arbeitet anders als wenn veröffentlicht Plattformprogrammierung 2
D RCP P2-Repository für Eclipse-Plugins Plattformprogrammierung 0
M Debuging in Eclipse Annotations Processor Plattformprogrammierung 0
D Nach Sprachpaket Installation kann eclipse nicht mehr gestartet werden Plattformprogrammierung 4
L0MiN Wie kann ich ein Klassendiagramm aus Eclipse heraus erstellen? Plattformprogrammierung 5
M Eclipse Probleme beim Ausführen eines Programms Plattformprogrammierung 3
feinperligekohlensaeure Eclipse Workspace gemeinsam Nutzen -> keine .project Datei Plattformprogrammierung 1
F Eclipse Build Path auf benötigte Projekte Plattformprogrammierung 4
B Daten von Eclipse extern sichern Plattformprogrammierung 2
B Eclipse zeigt Fehler nach Java-Update auf 1.8.0_40 Plattformprogrammierung 3
VfL_Freak [Eclipse] Fehleranzeige im Reiter "Problems" Plattformprogrammierung 1
S Errors in workspace bei eclipse Plattformprogrammierung 3
T eclipse bietet keine META-INF an Plattformprogrammierung 1
N Eclipse wo starten Plattformprogrammierung 6
A Eclipse schließt einfach ohne Fehlermeldung Plattformprogrammierung 4
W Eclipse vergißt beim Exportieren Resources-Ordner Plattformprogrammierung 11
A RCP Eclipse e4 und Injection-Contexts Plattformprogrammierung 0
K Eclipse fährt nicht mehr hoch. Metadatendatei schuld? Plattformprogrammierung 7
C [Eclipse RCP E4]InjectionException: no actual value was found for the argument "MDirtyable" Plattformprogrammierung 8
T Eclipse Eigenschaften hinzufügen Plattformprogrammierung 2
M RCP [Eclipse RCP 3.4] ViewTab Kontextmenu "Alle schließen" Plattformprogrammierung 0
D Problem mit eclipse Plattformprogrammierung 2
S Verschieben des Verzeichnis .eclipse aus Userprofile Plattformprogrammierung 3
A RCP Kann kein Eclipse 4 Projekt anlegen Plattformprogrammierung 0
S RCP Exportiertes RCP Produkt lädt Datei nicht, bei Start aus Eclipse wird Datei jedoch gefunden Plattformprogrammierung 6
G Eine Library in Eclipse zur Verfügung stellen Plattformprogrammierung 14
Gregorrr Eclipse RCP Product Build-Nummer + Jenkins Plattformprogrammierung 6
R Einfaches Eclipse-Plugin-Beispiel funktioniert nicht Plattformprogrammierung 5
H OSGi OSGi + Logback + slf4j - Eclipse Run Configuration Plattformprogrammierung 7
C plugin development environment eclipse Plattformprogrammierung 4
R RCP Commands nutzen / org.eclipse.ui.file.save Plattformprogrammierung 7
O Installiere externe Methode "containsNone" in Eclipse Plattformprogrammierung 2
M Keybinding in Eclipse Plugin Plattformprogrammierung 3
TheWhiteShadow RCP Konstrukt für Editor in Eclipse gesucht. Plattformprogrammierung 3
B Eclipse Probleme mit build Plattformprogrammierung 8
H Keine Hilfe/API mehr in Eclipse Juno? Plattformprogrammierung 4
B Neue SuppressWarning in Eclipse Juno Plattformprogrammierung 6
B Eclipse Property Page Plattformprogrammierung 6
B Eclipse PreferencePage Plattformprogrammierung 3
B Eclipse Plugin Einstellungsleiste Plattformprogrammierung 2
B Birt-Previewer über Eclipse Plattformprogrammierung 14
J Eclipse Plug-In für UML-Diagramme Problem Plattformprogrammierung 4
O Eclipse Plugin - Einfachstes Problem, das es gibt. Plattformprogrammierung 2
R Eclipse RCP Tabellen-View (Anfängerfrage) Plattformprogrammierung 3
C Eclipse: Notification beim umbennen von Methoden? Plattformprogrammierung 4
schalentier Eclipse Sourcecode Plattformprogrammierung 4
A Eclipse undo/redo button reagiert nicht auf Änderungen in der OperationHistory Plattformprogrammierung 5
P Eclipse M2_REPO (NON MODIFIABLE) Plattformprogrammierung 8
B Eclipse: Contextmenu id erhalten? Plattformprogrammierung 9
H Datei in eclipse wird nicht erkannt Plattformprogrammierung 3
O Neues Tastenkürzel für Eclipse Editorfenster registrieren Plattformprogrammierung 2
3 Eclipse Editor Plugin selektiert Projekt nicht Plattformprogrammierung 10
Madlip RCP eclipse.ui.bindings (Key-Problematik) Plattformprogrammierung 2
S Eclipse vs. JavaMail vs. Ubuntu vs. Windows Plattformprogrammierung 3
M eclipse führt applikationen nicht mehr aus Plattformprogrammierung 6
S Eclipse: Auf CTRL-C/CTRL-V im Package Explorer? Plattformprogrammierung 4
M Eclipse und Hilfen Plattformprogrammierung 5
G Eclipse buggt rum!!! Plattformprogrammierung 4
B Eclipse RCP und Java 7 Plattformprogrammierung 7
G RCP Eclipse Editor + Guice Plattformprogrammierung 8
G Eclipse Plug-in: wie refreshe ich eine combobox? Plattformprogrammierung 4
M Eclipse Plug-in: Wie eine Grafik einfügen? Plattformprogrammierung 20
M RCP [Eclipse RCP] Feature Export und "Fehler"... Plattformprogrammierung 3
P Eclipse speichert keine Änderungen Plattformprogrammierung 5
M Eclipse - Dokumentation nicht über das Internet benutzen Plattformprogrammierung 3
C Eclipse Plugin NoClassDefFoundError Plattformprogrammierung 4
E org.eclipse.ui.dialogs.ListSelectionDialog erzeugt ClassNotFoundException zur Laufzeit Plattformprogrammierung 4
M Eclipse Plugin Entwicklung - NoClassDefFoundError Plattformprogrammierung 10
C RCP Verständnisfrage Eclipse/Equinox Plattformprogrammierung 4
D eclipse-RCP von der Konsole baut nicht Plattformprogrammierung 3
L RCP Eclipse Popupmenu im PackageExplorer erweitern? Plattformprogrammierung 7
C Eclipse Plugin Entwicklung: Editor für Flussdiagramme Plattformprogrammierung 6
S (OSGI - EQUINOX) Welche Eclipse IDE? Plattformprogrammierung 3
C Pdf in jar datei einbinden mit eclipse Plattformprogrammierung 23
G neuer branch in SVN mit Eclipse Plattformprogrammierung 6
F RCP eclipse rcp ohne eclipse? Plattformprogrammierung 15
dzim RCP Eclipse Provisioning Plattformprogrammierung 3
G RCP Abhängigkeiten von Eclipse Plugins Plattformprogrammierung 9
K Eclipse RCP, EMF, Hibernate Problem Plattformprogrammierung 7
B RCP eigenes Eclipse Plugin wird nicht aufgelöst Plattformprogrammierung 7
T Eclipse Helios XMLUnit importieren Plattformprogrammierung 6
R Verwendung pdfbox in Maven-Projekt in Eclipse Plattformprogrammierung 3
lumo RCP wechseln der Font von Eclipse per code Plattformprogrammierung 10
lumo RCP Eclipse internationalisierung Plattformprogrammierung 5
jemandzehage Kurze Fehlernachricht beim starten in Eclipse Plattformprogrammierung 5
A RCP java.lang.ClassNotFoundException: org.eclipse.core.runtime.adaptor.EclipseStarter Plattformprogrammierung 7
P Wie bekomme ich ICompilationUnit aus dem event? bei Eclipse-Plugin Plattformprogrammierung 3
Rudolf External Libs dauerhaft in Eclipse einbinden Plattformprogrammierung 3
G RCP Eclipse UI Forms Plattformprogrammierung 10
musiKk RCP Eclipse: Speichern von Spaltenbreiten Plattformprogrammierung 9
X Datei in einem Eclipse Projekt über Plugin zugreifen Plattformprogrammierung 2
P Eclipse Help: Wie Links zu anderer Hilfeseite setzen ? Plattformprogrammierung 5
F Eclipse EMF Modelltransformation Plattformprogrammierung 3
tfa RCP Compilereinstellungen festlegen bei Eclipse-Batch-Build Plattformprogrammierung 9
Rudolf Eclipse stürzt bei nebenläufigen Programmen ab! Plattformprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben