RCP e4 Anwendung - Schließen der Anwendung (ALT-F4, rotes X) ==> event?

Hallo Zusammen,

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.

Jemand eine Idee, wie man hier verfahren kann?

Gruß,
Martin

Wenn du für deine Anwendung einen WorkbenchAdvisor hast, dann kannst du dort die preShutdown() überschreiben. :slight_smile:

Hi,

leider ist ein Workbenchadivisor eine Methode aus RCP 3.0. Wir haben hier eine 4.2 Anwendung.

Komisch, dass man da im Inet nichts zu findet. Entweder ist die Lösung trivial oder schlicht nicht Verfügbar.

Gruß,

Martin

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.

Hi,

man kann IApplication implementieren. Hier gibt es eine “close” Methode, die jedoch beim Beenden nicht ausgeführt wird.

Siehe diesen Vorschlag: http://stackoverflow.com/questions/12869859/howto-restart-an-e4-rcp-application

Da geht es zwar um Restart wäre aber ein Ansatz.Jedoch wüsste ich nicht, ob es eine andere Application gäbe, die man hier Einsetzen könnte.

Gruß,

Martin

Musst doch einen Handler dazu haben und in dem Kannst du doch die Abfrage starten und je nachdem schließen oder nicht?

Hallo,

ich habe noch etwas rumgetestet.

@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

Schau mal hier wird ein exit Handler gemacht.
http://www.vogella.com/articles/EclipseRCP/article.html

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

Hi,

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.

Gruß,

Martin

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