ich suche eine Möglichkeit, wie ich vor dem „nativen“ beenden vorher abfragen kann, ob wirklich die Anwendung beendet werden soll.
Die gängsite Methode ist es in der Shell einen Close-Listner zu verwenden.
Das Problem hierbei ist, dass selbst dann dieses Event nicht bearbeitet wird. Scheinbar ist es so, dass dieser Listner ständig entfernt wird. Oder ich füge es zu der falschen Shell hinzu.
Oh stimmt, da hatte ich jetzt überhaupt nicht weiter drauf geachtet. Wenn man mit e4 keine eigene Application-Klasse mehr hat, dann weiß ich ehrlich gesagt auch nicht, wo der nächste Ansatz wäre.
@SirWayne : Ja so hätte ich es mir auch vorgestellt. Habe mit dem Application Inspector geschaut wie die Eclipse IDE das macht, wurde aber nicht fündig.
Also dafür gibt es definitiv weder ein Command noch den dazugehörigen Handler.
Ich habe das nun folgendermaßen gelöst:
if (myShell != null) {
Listener[] listeners = myShell.getListeners(SWT.Close);
for (Listener listener : listeners) {
myShell.removeListener(SWT.Close, listener);
}
myShell.addListener(SWT.Close, new Listener() {
@Override
public void handleEvent(Event event) {
ParameterizedCommand createCommand = commandService.createCommand("org.eclipse.ui.file.exit", new HashMap<String, String>());
handlerService.executeHandler(createCommand);
}
});
}```
1. Wir haben ein Event, dass den "DirtyState" der Anwendung reguliert. Hier habe ich den o.s. Code implementiert.
2. Es wird geprüft, ob es eine active Shell gibt (Also ist das Fenster schon offen?)
3. Der vorhandene Close Listener muss entfernt werden, da sonst neue einfach nicht mehr zum Zuge kommen.
4. Den Command werfen mittels ECommandService und EHandlerService (werden injectet).
Etwas unschön ist es. Und eine weitere unschönheit ist natürlich, dass man keinen Event hat, wenn die Shell "aktiviert" wird. Momentan muss man raten bis diese aktiviert wird und hoffen, dass man nicht zu spät kommt ^^.
(Wir haben hier Glück, da schon beim Laden der Anwendung diese dirty wird).
Gruß,
Martin
Du machst aber schon eine e4 Anwendung? Aber soweit ich mich erinnere, ist das was du vor hast ein default Verhalten von e4 sobald ein Party Dirty ist wird, wird abegefragt ob gespeichert werden soll.
Ich teste das mal mit der Contact Demo
EDIT:
Also in der e4 contact Demo ist es definitiv so, dass die Abfrage kommt, sobald der Part dirty ist. Dafür benötigst du in e4 ein @Inject
private MDirtyable dirtyable;
Lads dir runter unter example.
Clone
git://git.eclipse.org/gitroot/platform/eclipse.platform.ui.git
ssh://git.eclipse.org/gitroot/platform/eclipse.platform.ui.git http://git.eclipse.org/gitroot/platform/eclipse.platform.ui.git
thx. Ich hatte mir diese Seite mehrfach bereits durchgelesen, weil ich zu diesem Thema einfach so wenig finde.
Ich musste also irgentwas essentielles überlesen haben ^^
Aber in einer plain vanilla rcp anwendung, kann ich keinen handler definieren der mir beim Speichern meine gewünschten Aktionen durchführt.
Grund hierfür wird wohl sein, dass man beim beenden eben nicht mehr machen sollte. Dies macht auch hochgradig sinn.
Aber ich muss die Fälle, die aktuell bearbeitet werden, für ein Fremdsystem freigeben nach dem Beenden der RCP Anwendung und weitere Aufräumarbeiten durchführen.
Ich versteh nicht was du vor hast? Parts die Dirty sind werden doch abgespeichert, das reicht dir nicht?
Ansonsten kannst du in den Activator in die deactivate Methode beim runterfahren des Frameworks dich einhängen oder aber einen Shutdown Hook registrieren