r3557@krups: intrigeri | 2005-11-15 14:41:32 +0100
[matthijs/upstream/backupninja.git] / lib / easydialog.in
diff --git a/lib/easydialog.in b/lib/easydialog.in
new file mode 100644 (file)
index 0000000..59b0efa
--- /dev/null
@@ -0,0 +1,255 @@
+#!@BASH@
+
+# copyright 2002 lmoore@tump.com under the terms of the GNU LGPL.
+# additions 2005 collective@riseup.net
+
+# 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" \
+        `[ "$3" == no ] && echo '--defaultno'` --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 $_DEFAULT --backtitle "$BACKTITLE" --title "$title" \
+        $box "$text" $HEIGHT $WIDTH 10 \
+       "$@" 2> $temp
+    local status=$?
+    [ $status = 0 ] && REPLY=$(_listReplyHook $temp $box)
+    rm -f $temp
+    _DEFAULT=
+    return $status
+}
+
+setDefault() {
+  _DEFAULT="--default-item $1"
+}
+
+menuBox() {
+    _genericListBox --menu "$@"
+}
+
+## a menu box with additional help info displayed
+## at the bottom of the window when an item is selected
+menuBoxHelp() {
+       HELP="--item-help"
+       _genericListBox --menu "$@"
+       status=$?
+       HELP=
+       return $status
+}
+
+## a menu box with an addition button 'help'
+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
+}
+
+
+#########################################################
+## begin-item-display style lists
+## 
+## these lists are built by calling fuctions multiple times.
+## this can make it easier to build your list in a loop
+##
+
+listBegin() {
+   _menu_title=$1
+   _menu_msg=$2
+   _menu_items=0
+   _menu_text=
+   _menu_labels=
+   _menu_status=
+}
+
+listItem() {
+   _menu_labels[$_menu_items]=$1
+   _menu_text[$_menu_items]=$2
+   _menu_status[$_menu_items]=$3 # available only for checklist
+   let "_menu_items += 1"
+}
+
+
+##
+## takes one of:
+## menu, checklist, radiolist
+##
+listDisplay() {
+   boxtype=$1
+   local temp=$(mktemp -t) || exit 1
+   trap "rm -f $temp" 0
+   
+   local label
+   local text
+   local status
+   (
+      echo -ne " $HELP $_DEFAULT "
+      echo -ne " --backtitle '$BACKTITLE' "
+      echo -ne " --title '$_menu_title' "
+      echo -ne " --$boxtype '$_menu_msg' "
+      echo -ne " $HEIGHT $WIDTH 10 "
+      for ((i=0; i < $_menu_items ; i++)); do
+        label=${_menu_labels[$i]}
+        text=${_menu_text[$i]}
+       status=${_menu_status[$i]}
+        echo -ne " $label '$text' $status "
+      done
+   ) | xargs $DIALOG 2> $temp
+   
+   local status=$?
+   REPLY=""
+   [ $status = 0 ] && REPLY=`cat $temp`
+   rm -f $temp
+   _DEFAULT=
+   return $status
+}
+
+####################################################
+## FORM
+
+_form_gap=2
+formBegin() {
+   _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"
+}
+    
+formDisplay() {
+   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 xpos=1
+   (
+      echo -n -e "--form '$_form_title' 0 0 20"
+      for ((i=0; i < $_form_items ; i++)); do
+        label=${_form_labels[$i]}
+        text=${_form_text[$i]}
+        echo -n -e " $label $xpos 1 '$text' $xpos $max_length 30 30"
+        let "xpos += _form_gap"
+      done
+   ) | xargs $DIALOG 2> $temp
+   local status=$?
+   
+   REPLY=
+   if [ $status = 0 ]; then
+      IFS=$''
+      REPLY=`cat $temp`
+      IFS=$' \t\n'
+   fi
+   rm -f $temp
+   return $status
+}