RCP SelectionProvider-Listener

dzim

Top Contributor
Hallo zusammen,

im letzten Thread von mir (siehe hier) habe ich mein Problem mit einem seltsamen Fehler versucht zu erklären und (erfolgreich) zu lösen.
Ich habe, um auf ein SelectionChanged-Event zu hören, das von einem SelectionProvider geliefert wurde, einen View programmiert, das das auch soweit ganz gut macht.

Einziger Wermutstropfen ist folgender:
Wenn ich meinen SelectionProvider (ein Composite) öffne, und dort eine Auswahl vornehme, dann den View öffne, der auf die Änderungen hören soll, so wird letzter - obwohl korrekt an die Worbench angefügt - kein Event fangen. Egal wie viel ich im SelectionProvider herumklicke. Es sei noch einmal angemerkt, das ich ausschließlich auf die ID des Editors höre, der den SelectionProvider hinzugefügt hat.

Einziger mir bekannter Workaround ist, den View offen zu lassen, den Editor zu schließen und wieder zu öffnen, dann klappt alles wie es soll. Danach kann ich auch den View schließen und öffnen und er hört immer noch auf Änderungen.
Im Log sind keine Exception aufgetaucht, daher weiß ich nicht, ob es da was zu entdecken gäbe...

Ein (verzweifelter) Versuch, den starken Bezug beim Anmelden des Listeners im View zum Editor auzuheben (also keine Editor.ID anzugeben, sondern nur den Listener) führte zu anderem kuriosen, mir nicht erklärlichen Verhalten (nach einem klick irgendwo - ganz egal wo - in den View, schlossen sich meine Forms-Sections, es flogen WidgetDisposedExceptions, obwohl alles offen war, u.ä - ich denke es könnte an den vielen komplexen Listener-Verschachtelungen dort liegen, bin mir aber absolut unsicher).

Habt ihr wenigstens zu oben genannten Problem (mit Bezug zur Editor.ID) eine Ahnung oder könntet ihr mich irgendwie auf die richtige Fährte schicken?
Ich hoffe ja speziell auf den ein oder anderen Guru hier ;-)

Viele Grüße,
Daniel
 

Wildcard

Top Contributor
Einziger Wermutstropfen ist folgender:
Wenn ich meinen SelectionProvider (ein Composite) öffne, und dort eine Auswahl vornehme, dann den View öffne, der auf die Änderungen hören soll, so wird letzter - obwohl korrekt an die Worbench angefügt - kein Event fangen. Egal wie viel ich im SelectionProvider herumklicke. Es sei noch einmal angemerkt, das ich ausschließlich auf die ID des Editors höre, der den SelectionProvider hinzugefügt hat.
Wie registrierst du denn den selection listener?
 

dzim

Top Contributor
Hi Wildcard (auf jemanden wie dich hab ich gesetzt ;-) )

ich registriere mich in der init des Views (habe es aber auch schon in der createPartControl versucht):
Java:
	@Override
	public void init(IViewSite site) throws PartInitException {
		super.init(site);
		getSite().getWorkbenchWindow().getSelectionService()
				.addSelectionListener(MyEditor.ID, this);
	}

Ich dachte, das wäre die einzige Methode...

Daniel
 

dzim

Top Contributor
mir stellt sich allerdings die frage, was der unterschied ziwschen "getSite().getWorkbenchWindow().getSelectionService()" und "getSite().getSelectionService()" ist - ausser das für das erste ein ISelectionListener oder INullSelectionListener implementiert werden muss und für das Zweite ein ISelectionChangedListener (wie ja sonst auch für TableViewer, wenn ich auf deren SelectionChanged Event warte).
 

Wildcard

Top Contributor
Bist du ganz sicher das nicht einfach irgendwo ein Absturz passiert? Hast du dir das Log angesehen? Zur Not könntest du auch mal im Debugger nachgehen wenn sich die Selection des SelectionProviders ändert um herauszufinden wo das Event versickert.
mir stellt sich allerdings die frage, was der unterschied ziwschen "getSite().getWorkbenchWindow().getSelectionService()" und "getSite().getSelectionService()" ist - ausser das für das erste ein ISelectionListener oder INullSelectionListener implementiert werden muss und für das Zweite ein ISelectionChangedListener (wie ja sonst auch für TableViewer, wenn ich auf deren SelectionChanged Event warte).
Siehe hier:
Eclipse Workbench: Using the Selection Service
 

dzim

Top Contributor
Ich kannte das Tutorial schon und hab auch anhand dessen mein Modell hier erstellt.
Das Log hat mir leider nicht weitergeholfen, dort ist nichts drin... Ich werd mal debuggen, dass ist wirklich das Beste!

Danke dennoch, wenn ich was erreichen sollte, kann ich ja mal Ursache und Lösung schreiben.

Viele Grüße,
Daniel
 

dzim

Top Contributor
da bei mir ein Composite der SelectionProvider ist und habe ich dort eine Liste von ISelectionChangedListenern und eine private Methode propagiert die Änderungen an die Listener über
Java:
	private void fireSelectionChanged() {
		for (ISelectionChangedListener l : this.selectionChangedListenerList) {
			SelectionChangedEvent event = new SelectionChangedEvent(this,
					this.getSelection());
			l.selectionChanged(event);
		}
	}
Ich weiß ja nicht: Hier gebe ich den konkreten SelectionProvider an, in dem View, der das Event dann fangen soll aber, wird nur die PartID-überprüft - ob das irgendwelche Probleme macht?
 

dzim

Top Contributor
soweit ich das sehen kann beim debuggen, ist der Listener (mein View) in dem Problem-Fall einfach nicht in der "Empäfgerliste" eines PagePartSelectionTrackers... Nach beschriebenen Workaournd schon.
 

Wildcard

Top Contributor
soweit ich das sehen kann beim debuggen, ist der Listener (mein View) in dem Problem-Fall einfach nicht in der "Empäfgerliste" eines PagePartSelectionTrackers... Nach beschriebenen Workaournd schon.

Eigentlich sollte die Art wie du den Listener anhängst funktionieren egal ob der Editor schon offen ist, oder noch nicht. Könnte evtl. ein Bug in der Platform sein, ich weiß da spontan auch nicht weiter.
Du könnest vielleicht als Workaround im init der View prüfen ob der Editor mit ID X zurzeit der aktive Editor ist und wenn ja, dich auf dem Selection Provider des Editors einhängen. Falls nicht, führst du deinen bisherigen Code aus.
 

dzim

Top Contributor
Grundsätzlich ist das eine gute Idee, in der Praxis allerdings, lief es dann so, dass der View dann zwar funktionierte, wenn er schon offen war, bevor man den Editor öffnete (*jubel*) und auch, wenn man ihn danach öffnete (gut!), aber sobald man ihn schloss und wieder öffnete, hat er nicht mehr auf Änderungen reagiert :-( - das könnte jetzt vielleicht an dem View selbst liegen, das da irgendwo eine unsaubere Stelle ist.
Ich werde es erst einmal so lassen und später mal mit Eclipse 3.6 probieren - vielleicht geht es ja da. Wenn nicht, werd ich wohl mal nen Bug aufmachen.
 

dzim

Top Contributor
ok, kleine korrektur hintenan: es funktioniert in fast allen kombinationen, aber es gibt einige (editor auf, view zu, wieder auf, u.ä.) bei denen geht es nicht - da bleib ich dann doch lieber bei dem mir bekannten problem ;-)
 

Ähnliche Java Themen


Oben