aboutsummaryrefslogtreecommitdiff
path: root/handlers/easydialog.sh
diff options
context:
space:
mode:
Diffstat (limited to 'handlers/easydialog.sh')
-rw-r--r--handlers/easydialog.sh182
1 files changed, 182 insertions, 0 deletions
diff --git a/handlers/easydialog.sh b/handlers/easydialog.sh
new file mode 100644
index 0000000..ce7d31e
--- /dev/null
+++ b/handlers/easydialog.sh
@@ -0,0 +1,182 @@
+#!/bin/bash
+
+# copyright 2002 lmoore@tump.com under the terms of the GNU LGPL.
+
+# whiptail has trouble being called in the foo=$(whiptail ...) fashion for
+# some reason. this is very annoying. this means that we need to use
+# temporary files to store the answers from the input and list based boxes
+# and then read the answers into a REPLY variable. that just really
+# stinks, oh well, that's what you get when you have a weak link
+# implementation...
+#
+# inputBox and passwordBox could be refactored to use a common function
+
+test -z "$WIDTH" && WIDTH=0
+test -z "$HEIGHT" && HEIGHT=0
+BACKTITLE=""
+DIALOG=dialog
+HELP=
+
+setApplicationTitle() {
+ BACKTITLE=$*
+}
+
+setHelp() {
+ HELP="$@"
+}
+
+setDimension() {
+ WIDTH=$1
+ HEIGHT=$2
+}
+
+booleanBox() {
+ $DIALOG --backtitle "$BACKTITLE" --title "$1" \
+ --yesno "$2" $HEIGHT $WIDTH
+}
+
+msgBox() {
+ $DIALOG --backtitle "$BACKTITLE" --title "$1" \
+ --msgbox "$2" $HEIGHT $WIDTH
+}
+
+gaugeBox() {
+ $DIALOG --backtitle "$BACKTITLE" --title "$1" \
+ --gauge "$2" $HEIGHT $WIDTH 0
+}
+
+inputBox() {
+ local temp=$(mktemp -t) || exit 1
+ trap "rm -f $temp" 0
+ REPLY=
+ $DIALOG --backtitle "$BACKTITLE" --title "$1" \
+ --inputbox "$2" $HEIGHT $WIDTH "$3" 2> $temp
+ local status=$?
+ [ $status = 0 ] && REPLY=$(cat $temp)
+ rm -f $temp
+ return $status
+}
+
+# Xdialog and {dialog,whiptail} use different mechanism to "qoute" the
+# values from a checklist. {dialog,whiptail} uses standard double quoting
+# while Xdialog uses a "/" as the separator. the slash is arguably better,
+# but the double quoting is more standard. anyway, this function can be
+# overridden to allow a derived implementation to change it's quoting
+# mechanism to the standard double-quoting one. it receives two
+# arguements, the file that has the data and the box type.
+_listReplyHook() {
+ cat $1
+}
+
+# this is the base implementation of all the list based boxes, it works
+# out nicely that way. the real function just passes it's arguments to
+# this function with an extra argument specifying the actual box that
+# needs to be rendered.
+_genericListBox() {
+ local box=$1
+ shift 1
+ local title=$1
+ local text=$2
+ shift 2
+ local temp=$(mktemp -t) || exit 1
+ trap "rm -f $temp" 0
+ REPLY=
+ $DIALOG $HELP --backtitle "$BACKTITLE" --title "$title" \
+ $box "$text" $HEIGHT $WIDTH 10 \
+ "$@" 2> $temp
+ local status=$?
+ [ $status = 0 ] && REPLY=$(_listReplyHook $temp $box)
+ rm -f $temp
+ return $status
+}
+
+menuBox() {
+ _genericListBox --menu "$@"
+}
+
+menuBoxHelp() {
+ HELP="--item-help"
+ _genericListBox --menu "$@"
+ status=$?
+ HELP=
+ return $status
+}
+
+menuBoxHelpFile() {
+ HELP="--help-button"
+ _genericListBox --menu "$@"
+ status=$?
+ HELP=
+ return $status
+}
+
+
+checkBox() {
+ _genericListBox --checklist "$@"
+}
+
+radioBox() {
+ _genericListBox --radiolist "$@"
+}
+
+textBox() {
+ $DIALOG --backtitle "$BACKTITLE" --title "$1" --textbox "$2" $HEIGHT $WIDTH
+}
+
+passwordBox() {
+ local temp=$(mktemp -t) || exit 1
+ trap "rm -f $temp" 0
+ REPLY=
+ $DIALOG --backtitle "$BACKTITLE" --title "$1" \
+ --passwordbox "$2" $HEIGHT $WIDTH 2> $temp
+ local status=$?
+ [ $status = 0 ] && REPLY=$(cat $temp)
+ rm -f $temp
+ return $status
+}
+
+_form_gap=2
+startForm() {
+ _form_title=$1
+ _form_items=0
+ _form_labels=
+ _form_text=
+}
+
+formItem() {
+ _form_labels[$_form_items]=$1
+ _form_text[$_form_items]=$2
+ let "_form_items += 1"
+}
+
+displayForm() {
+ local temp=$(mktemp -t) || exit 1
+
+ max_length=0
+ for ((i=0; i < ${#_form_labels[@]} ; i++)); do
+ label=${_form_labels[$i]}
+ length=`expr length $label`
+ if [ $length -gt $max_length ]; then
+ max_length=$length
+ fi
+ done
+ let "max_length += 2"
+
+ local form=
+ local xpos=1
+ for ((i=0; i < $_form_items ; i++)); do
+ label=${_form_labels[$i]}
+ text=${_form_text[$i]}
+ if [ "$text" == "" ]; then
+ text='_empty_'
+ fi
+ form=`echo -e "$form $label $xpos 1" $text "$xpos $max_length 30 30"`
+ let "xpos += _form_gap"
+ done
+
+ $DIALOG --form "$_form_title" 0 0 20 $form 2> $temp
+ local status=$?
+ [ $status = 0 ] && REPLY=$(cat $temp)
+ rm -f $temp
+ return $status
+}