Tastatur Navigation - minova-afis/aero.minova.rcp GitHub Wiki
Bei der Umsetzung des Tab-Verhaltens verwenden wir das Verhalten, dass Eclipse schon standardmäßig implementiert hat. Das Enter-Verhalten wird in einem Handler mit Key Binding umgesetzt. Wir haben uns aus folgenden Gründen gegen den TraverseListener entschieden:
-
Wir möchten dem Benutzer ein für ihn gewohntes Verhalten bieten. Er soll sich nicht umgewöhnen und es trägt zu einer einfacheren Bedienung der Anwendung bei.
-
Es ist weniger Code für uns zum Pflegen. Der Code wird durch Eclipse aktuell gehalten.
-
Die Funktionalität des Verhaltens ist vielseitiger einsetzbar, da sie nicht an eine Klasse gebunden ist. Zum Beispiel, durch die Umsetzung des Enter Verhaltens in einem Handler, können wir diesen von verschiedenen Stellen in der Anwendung aufrufen.
EnterSelectsFirstRequired (ESFR) - Genaue Beschreibung hier: EnterSelectsFirstRequired
LookupEnterSelectsNextRequired (LESNR) - Genaue Beschreibung hier: LookupEnterSelectsNextRequired
SelectAllControls (SAC) - Genaue Beschreibung hier: SelectAllControls
Da das Tab-Verhalten durch Eclipse vorgegeben ist, müssen wir nur noch die Tab-Reihenfolge bestimmen. Folgende Bedingungen gelten für die Tab-Reihenfolge:
-
Dabei werden in den Sections nur die Felder in die Tab-Liste hinzugefügt, die nicht Read Only sind.
-
Wenn die Preference SelectAllControls gesetzt ist, werden die Controls des Detail Parts ebenfalls der Tab-Reihenfolge hinzugefügt. Dies ermöglicht die Selektion der Toolbar und der Sections.
-
Bei einem Grid selektiert Tab nur das erste Feld und springt danach ins nächste Element (Control/Field). Tab selektiert nicht die nächste Zelle aus der Tabelle. Innerhalb der Tabelle muss mit den Pfeiltasten navigiert werden.
Verhalten für die Eingabe von Tab:
Eingabe |
Verhalten |
Tab |
Benutzer springt ins nächste Feld. |
Shift + Tab |
Benutzer springt ins vorherige Feld. |
Tab + SAC / Shift + Tab + SAC = true |
Beim Wechseln der Section/Page wird die Registerkarte der Section/Page selektiert |
Tab + SAC/ Shift + Tab + SAC = false |
Beim Wechseln der Section/Page wird die Registerkarte der Section/Page nicht selektiert |
Mit Tab verlässt man nie den ausgewählten Part. Wenn der Benutzer im letzten Feld Tab betätigt und SAC = false ist, wird das erste Feld im Part selektiert. Bei SAC = true wird das Label des Parts selektiert. Umgekehrt gilt dasselbe. Wenn sich der Benutzer im erste Feld befindet und Shift + Tab betätigt, wird bei SAC = false das letzte Feld selektiert und bei SAC = true die Toolbar des Parts. Nach der Toolbar folgt das Label und danach wird das letzte Feld selektiert.
Die Eingabe von Enter wird mit einem Key-Binding im DetailPart erkannt und führt daraufhin die entsprechenden Handler aus. Dabei wir wie anschließend beschrieben vorgegangen:
-
In der execute Methode des TraverseEnterHandlers holen wir uns zuerst das selektierte Feld. Bei einem LookupField schließen wir, falls offen, das PopupMenu.
-
Danach wird das nächste leere Pflichtfeld, mit leeren WrittenText, ermittelt.
-
Wenn ein Feld gefunden wurde, wird es fokussiert. Falls kein Feld gefunden wurde, beleibt der Benutzer im gleichen Feld.
-
Nach der Ermittlung wird geprüft, ob der SaveDetailHandler enabled ist.
-
Bei True wird dieser direkt ausgeführt. Bei False wird nichts gemacht.
-
Bei einem Grid selektiert Enter das erste leere Pflichtfeld. Für Lookupvalues innerhalb der Tabelle gilt das Standardverhalten bei Lookups.
Festgelegtes Verhalten für die Eingabe von Enter:
Eingabe |
Verhalten |
Enter |
Benutzer springt ins nächste Pflichtfeld. |
Enter + ESFR = true |
Der Benutzer springt in das Erste nicht ausgefüllte Pflichtfeld. |
Enter + ESFR = false |
Der Benutzer springt ins nächste Pflichtfeld. |
Festgelegtes Verhalten bei der Selektion von Button im oberen Bericht oberhalb der Maske:
Wird durch die Selektion mittels Tab einer der Schaltflächen selektiert, kann man mit Hilfe der Pfeiltasten (links, rechts) innerhalb der verfügbaren Schaltflächen navigiert werden:
Zum Beispiel 1 x nach rechts:
Diese Verhalten ist für alle Betriebsysteme gleich.
Für Mac gilt folgendes spezifisches Verhalten:
-
Beim Mac kann die Selektion von Schaltflächen in den Systemeinstellungen aktiviert werden. Dafür muss unter Kurzbefehle in den Tastatureinstellungen der Haken bei "Bewege den Fokus mittels Tastaturnavigation zu Steuerelementen" gesetzt sein.
-
Standardverhalten für die Eingaben von Tab und Enter mit Modifier im Textfeld:
Tab + Modifier:
Ctrl + Tab |
Benutzer bleibt im Feld und es wird ein Tab erstellt |
Alt + Tab |
Benutzer springt ins nächste Feld. Es wird kein Tab erstellt. |
Cmd + Tab |
Unter den geöffneten Apps zur zuletzt verwendeten wechseln. |
Enter + Modifier:
Eingabe |
Verhalten |
Ctrl + Enter |
Benutzer bleibt im Feld und es wird ein Zeilenumbruch erstellt |
Alt + Enter |
Benutzer bleibt im Feld und es wird ein Zeilenumbruch erstellt |
Cmd + Enter |
Benutzer bleibt im Feld es wird kein Zeilenumbruch erstellt, es kommt ein Fehlersound |
Für Windows gilt folgendes spezifisches Verhalten:
-
Standardverhalten für die Eingaben von Tab und Enter mit Modifier im Textfeld:
Tab + Modifier:
Eingabe |
Verhalten |
Strg + Tab |
Benutzer bleibt im Feld und es wird ein Tab erstellt. |
Alt + Tab |
Windows spezifisches Verhalten wechseln zur letzten Anwendung. |
Win + Tab |
Windows spezifisches Verhalten Übersicht aller offenen Fenster. |
Enter + Modifier:
Eingabe |
Verhalten |
Strg + Enter |
Benutzer bleibt im Feld und es wird ein Zeilenumbruch erstellt |
Alt + Enter |
Benutzer bleibt im Feld und es wird kein Zeilenumbruch erstellt |
Win + Enter |
Benutzer bleibt im Feld und es wird kein Zeilenumbruch erstellt |
Die KeyBindings sind so gelegt, dass dasselbe Verhalten gewährleistet ist, wie bei der Bedienung der Toolbar mit Maus.
Eingabe |
Verhalten |
F1 |
Help |
F3 |
Datensatz mit dem Matchcode laden |
F4 |
Die erste Zelle im SearchPart wird selektiert |
F5 |
Der IndexPart wird aktualisiert |
F6 |
Das erste Feld im DetailPart wird selektiert |
M1 + Q |
Anwendung schließen |
M1 + R |
Optimieren (Resize) |
Eingabe |
Verhalten |
CR |
Nächstes leeres Pflichtfeld wird selektiert oder es wird gespeichert |
M1 + S |
Speichern des aktuellen Datensatzes |
M1 + N |
Detail leeren |
M1 + Z |
Setzt die letzte Änderung im TexFeld zurück |
Eingabe |
Verhalten |
M1 + N |
Alle Einträge aus den Suchzeilen werden gelöscht. Es werden alle Zeilen bis auf eine entfernt. |
M1 + D |
Selektierte Zeile löschen (Delete) |
M1 + S |
Default Suchkriterien speichern (Save) |
SHIFT + M1 + S |
Suchkriterien speichern unter <Bezeichnung> |
SHIFT + M1 + D |
Löschen von gespeicherten Suchkriterien |
M1 + L |
Default Suchkriterien laden (Load) |
SHIFT + M1 + H |
Optimieren (Resize Horizontal) |
Beim Speichern der Suchkriterien im SearchPart wird zwischen "Speichern" und "Speichern unter" unterschieden. Dabei speichert das normale "Speichern" nur das Default und überschreibt dieses und "Speichern unter" ermöglicht das Speichern unter einer anderen Bezeichnung.
Beispiel für KeyBinding M1+S und SHIFT+M1+S:
Benutzer gibt Suchkriterien ein, betätigt SHIFT+M1+S und speichert diese unter der Bezeichnung "Wochenstunden".
Später lädt er diese Suchkriterien und bearbeitet sie. Dabei speichert er diesmal mit M1+S. Dabei überschreibt er nicht die Suchkriterien mit der Bezeichnung "Wochenstunden", sondern die Default-Suchkriterien.
Um die bearbeiteten Suchkriterien wieder unter "Wochenstunden" zu speichern, betätigt der Benutzer SHIFT+M1+S und gibt "Wochenstunden" wieder als Bezeichnung an. Über der Eingabe ändert sich der Text zu "Sucheinstellung besteht und wird überschrieben". Dies weist darauf hin, dass es schon ein Suchkriterium mit der Bezeichnung existiert und dieses überschrieben wird.
Sobald der Benutzer die Eingabe bestätigt, werden die neuen Suchkriterien unter "Wochenstunden" überschrieben.