# Dialogboxen

Ein Frage-Anwort-Spiel auf der Konsole verleitet zu leicht zu Fehleingaben durch den Benutzer. Und um diese im Programm zu behandeln, bedarf es oft umständlicher Programmkonstrukte...
Viel besser wäre es z.B. dem Nutzer durch Vorgabe eines Menüs die möglichen Optionen eines Programmes zu präsentieren. Die Lösung liegt in der Realisierung von Dialogboxen mit Hilfe von `dialog`.

Das Kommando `dialog` wird durch Optionen gesteuert:

Option | Wirkung
`--checklist` | Dient der Auswahl von Optionen.
`--clear` | Löscht bei Beendigung des Dialogs den Bildschirm (der allerdings blau bleibt, ein Aufruf von `setterm -clear` hilft).
`--infobox` | Eine Nachricht wird eingeblendet.
`--inputbox` | Dient der Eingabe von Daten.
`--menu` | Dient zur Auswahl von einem aus mehreren Menüpunkten.
`--msgbox` | Wie `--infobox`, allerdings muss der Nutzer die Nachricht mit "OK" bestätigen.
`--textbox` | Eine als Parameter übergebene Datei wird angezeigt. Kann diese nicht vollständig im Fenster dargestellt werden, werden Scrollbars eingefügt.
`--title` | In der ersten Zeile des Dialogs wird ein Titel angezeigt.
`--yesno` | Ein Ja/Nein-Dialog erscheint.

## Aufgabenstellung

Als Beispiel wollen wir das vorherige Shellskript zum Löschen von Dateien durch die Verwendung von Dialogboxen verbessern.

## Eine mögliche Lösung

Das Löschen der Dateien aus Ein komplexes Beispiel erfolgt nun menügesteuert.

`#!/bin/sh object= tilde= core= inter= 1 dialog --clear --checklist \ 2 'Make clean your file system' 10 70 4 \ 3 '1' 'Core-Files' off \ 4 '2' 'Object-Files' off \ 5 '3' 'Backups' off \ 6 '4' 'Prompt whether to remove each file?' on 2> ~/tmp.$$ 7 options=$(cat ~/tmp.$$) 8 rm ~/tmp.$$ 9 for i in $options; do 10 case "$i" in 11 \"1\" ) core=core;; 12 \"2\" ) object=.o;; 13 \"3\" ) tilde=\~;; 14 \"4\" ) inter=1;; 15 esac 16 done for i in $core $object $tilde; do for x in $(find $(pwd) -name "*$i"); do 17 if [ $inter ]; then 18 dialog --yesno "Removing $x?" 5 70 19 if [ $? = 0 ]; then 20 rm $x 21 fi 22 else 23 dialog --infobox "Removing $x" 5 70 24 rm $x 25 fi done done 26 setterm -clear`

## Erläuterungen:

Zeile | Bemerkung
1-6 | Ein `checklist`-Dialog wird begonnen. Alle Zeilen müssten eigentlich auf einer einzigen Zeile stehen, durch das Fortsetzungszeichen `\` lassen sich derartige lange Zeilen aber splitten. Der Dialog erhält einen Titel (Zeile 2), Höhe (10 Zeilen), Breite (70 Spalten) und Anzahl der Einträge (4) werden vereinbart. Die vier Schalter werden beschriftet (Zeilen 3-6), die letzte Box wird vorbelegt (on / Abbildung). Bei Dialogende muss die Auswahl explitzit gespeichert werden. Eine Umlenkung in eine temporäre Datei ist sinnvoll. Als (hoffentlich) eindeutiger Name dient die PID des Shellskripts (`$$`). Waren alle Optionen gesetzt, steht in der Datei `tmp.PID` Folgendes:
    "1" "2" "3" "4"
7, 8 | Die Optionen werden aus der temporären Datei ausgelesen, in der Variable `options` gespeichert und die temporäre Datei gelöscht.
9-16 | Analog zum vorherigen Abschnitt. Um ein Muster wie `"1"` zu vergleichen, müssen die Doppelanführungszeichen als solche gekennzeichnet werden.
17 | Im interaktiven Fall soll die Abfrage vor dem Löschen als Ja/Nein-Dialog erfolgen.
18 | Abfrage, ob Datei gelöscht werden soll.
19, 20 | Der yesno-Dialog kehrt mit Status "0" zurück, falls der yes-Button gewählt wurde; Löschen!
23 | Das Löschen einer jeden Datei wird kurz in einer Infobox angezeigt.
26 | Der Bildschirm wird gelöscht (bleibt sonst blau).