diff options
| author | intrigeri <intrigeri@boum.org> | 2005-11-29 10:09:04 +0000 | 
|---|---|---|
| committer | intrigeri <intrigeri@boum.org> | 2005-11-29 10:09:04 +0000 | 
| commit | 13149b96008227bb11582fa0e0d59b727fd8d1bd (patch) | |
| tree | 51082e8ce3f52cb6381db6ec70d7b96927561dd2 /lib/easydialog.in | |
| parent | a9074a138cade6e66e8d7a0e5f18cdb7c42ad169 (diff) | |
| download | backupninja-13149b96008227bb11582fa0e0d59b727fd8d1bd.tar.gz backupninja-13149b96008227bb11582fa0e0d59b727fd8d1bd.tar.bz2  | |
 r3557@krups:  intrigeri | 2005-11-15 14:41:32 +0100
 Start to move common functions (maketemp) to lib/tools, and better use autotools for lib/{easydialog,tools}.
Diffstat (limited to 'lib/easydialog.in')
| -rw-r--r-- | lib/easydialog.in | 255 | 
1 files changed, 255 insertions, 0 deletions
diff --git a/lib/easydialog.in b/lib/easydialog.in new file mode 100644 index 0000000..59b0efa --- /dev/null +++ b/lib/easydialog.in @@ -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 +}  | 
