Hinweis
Wenn bei der Einrichtung deines Bank-Zugangs (PIN/TAN, Chipkarte, Schlüsseldatei) Fehler auftreten, lege bitte keinen Bug-Report an. In aller Regel ist die Ursache kein Bug in Hibiscus sondern ein Fehler in der Konfiguration des Bank-Zugangs. Im Wiki findest du Anleitungen zu Kartenlesern und getesteten Banken. Im onlinebanking-forum.de findest du ebenfalls hilfreiche Tipps.
Bug 1688 - zurück kann History "zerstören"
Summary: zurück kann History "zerstören"
Status: RESOLVED FIXED
Alias: None
Product: Jameica
Classification: Unclassified
Component: GUI (show other bugs)
Version: Nightly Build
Hardware: All All
: P2 normal
Assignee: Olaf Willuhn
URL:
Depends on:
Blocks:
 
Reported: 2016-01-26 23:59 CET by Thomas Laubrock
Modified: 2016-01-31 16:06 CET (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Laubrock 2016-01-26 23:59:14 CET
Hallo Olaf,
Ich versuche gerade beim Verlassen eines Views ein "autosave" auszulösen.
Dazu überschreibe ich in den views die unbind() Methode. 
Diese kann laut Dokumentation eine ApplicationException werfen, um das Schließen zu verhindern.
Das funktioniert auch soweit. 
Wenn allerdings der view durch den Zurück-Button verlassen wird, wird folgender Code vor dem unbind() ausgeführt:

Aus GUI.java
  public static void startPreviousView()
  {
    // BUGZILLA 247
    if (gui == null || gui.history == null || gui.history.size() == 0)
    {
      Logger.debug("unable to start previous view. you are already at the first page in this session ;)");
      return;
    }
    HistoryEntry entry = gui.history.pop();
    if (entry == null) return;
    gui.skipHistory = true;
    startView(entry.view.getClass(), entry.view.getCurrentObject());
  }

Die Zeile:
HistoryEntry entry = gui.history.pop();
manipuliert die History und holt sich den zu öffnenden View heraus.
Wenn später dann in startView() das unbind() des zu schließenden Views eine ApplicationException wirft, dann bleibt der alte View bestehen und der neue wird nicht geladen. 
Die History hat aber den View der angezeigt werden sollte vergessen.
Behebt man jetzt den Fehler, der ordentliche unbind() verhindert hat und klickt wieder "zurück", dann wird ein view in der History übersprungen.

Ein Workaround könnte sein, den Eintrag wieder auf den Stack zu legen, wenn unbind() fehl schläg. Und zwar immer nur dann, wenn skipHistory gesetzt ist.

ab Zeile 579 einfügen:
            if (gui.skipHistory){
              HistoryEntry entry = new HistoryEntry(view);
              gui.history.push(entry);            }
            return;
Ich weiss nicht, ob das Abfragen von skipHistory nicht ein bisschen zu unsauber ist.
Gruß
 Thomas
Comment 1 Thomas Laubrock 2016-01-27 00:57:00 CET
Korrekt muss es es lauten:

ab Zeile 579 einfügen:
            if (gui.skipHistory){
              HistoryEntry entry = new HistoryEntry(view);
              gui.history.push(entry);            
            }
            gui.skipHistory = false;
            return;

oder das return muss weg.
Comment 2 Olaf Willuhn 2016-01-31 16:06:41 CET
Guter Fund!

Das Benutzen des "skipHistory"-Flag hat mir in der Tat nicht so gut gefallen. Ich habe es daher per Messaging geloest.

Siehe https://github.com/willuhn/jameica/commit/a8e1b55b51d7ecede7e10efd72b6f68a6b9d781b

Das ist generisch und ermoeglicht es auch anderen Plugins, das Event zu beruecksichtigen. Ich habe den "SimpleDialog" mit dem Fehlertext bei der Gelegenheit gleich noch gegen eine weniger stoerende Fehlermeldung ersetzt. Das erspart den nervigen Klick auf den OK-Button, um den Dialog wieder zu schliessen.