#!/bin/bash

##################################################
#
#  The src gather dialog
#
##################################################

#
#  Data model
#
typeset src_gather_dlg_title
typeset src_gather_dlg_action
typeset src_gather_dlg_action_desc

typeset src_gather_dlg_get_data_ex
typeset src_gather_dlg_load_ui_ex
typeset src_gather_dlg_action_ex

typeset src_list_height=13
typeset src_list_sel_index=0
typeset src_list_top_index=0
typeset -a src_list_array
typeset -a src_dir_array

typeset recent_dir

typeset -i src_total_size

load_src_gather_dialog_ui() {
    if [ "$src_gather_dlg_load_ui_ex" != "" ]; then
        $src_gather_dlg_load_ui_ex
    else
        load_ui_res << EOF
[A=[&(A)
[R=[&(R)
[U=[&(U)
[D=[&(D)
[[]K -- Action[]]=[<?key,1?> -- <?action,-7?>
[X=[&(X)
(fff-fff/fff)=<?range,13?>
~
~    <?title,-#?>############################
~    +-----------------------------------------+
~    | <?list[0],-#?>######### |               |
~    | <?list[1],-#?>######### | [A -- Add]    |
~    | <?list[2],-#?>######### |               |
~    | <?list[3],-#?>######### | [R -- Remove] |
~    | <?list[4],-#?>######### |               |
~    | <?list[5],-#?>######### | [U -- Up]     |
~    | <?list[6],-#?>######### |               |
~    | <?list[7],-#?>######### | [D -- Down]   |
~    | <?list[8],-#?>######### |               |
~    | <?list[9],-#?>######### | [K -- Action] |
~    | <?list[10],-#?>######## |               |
~    | <?list[11],-#?>######## | [X -- Exit]   |
~    | <?list[12],-#?>######## |               |
~    |-----(fff-fff/fff)-----------------------|
~    |                                         |
~    | Total size: <?size,-#?>####             |
~    |                                         |
~    +-----------------------------------------+
~    
~      Press &(?) for help
EOF
    fi
}

load_src_gather_dialog_help() {
    load_ui_res << EOF
|    K=|    <?hkey,1?>
~
~    &([Help])
~    +-----------------------------------------+
~    |     Key        |      Function          |
~    |-----------------------------------------|
~    |    Up arrow    |   Scroll up            |
~    |    Down arrow  |   Scroll down          |
~    |    Page up     |   Scroll page up       |
~    |    Page down   |   Scroll page down     |
~    |    Home        |   Scroll to first      |
~    |    End         |   Scroll to end        |
~    |    A           |   Add a file           |
~    |    R           |   Remove a file        |
~    |    U           |   Move up              |
~    |    D           |   Move down            |
~    |    K           |   <?desc,-#?>######### |
~    |    X           |   Exit the program     |
~    +-----------------------------------------+
~       Press 'x' to return
EOF
}

src_gather_dialog_get_data() {
    local name=$1
    local -i index=$2
    _DATA_="???"
    case $1 in
        title)
            _DATA_="$src_gather_dlg_title"
            _DATA_ATTR_=1
            ;;
        hkey)
            _DATA_="${src_gather_dlg_action:0:1}"
            ;;
        key)
            _DATA_="${src_gather_dlg_action:0:1}"
            _DATA_ATTR_=1
            ;;
        action)
            _DATA_="${src_gather_dlg_action}]"
            ;;
        desc)
            _DATA_="$src_gather_dlg_action_desc"
            ;;
        list)
            get_list_data "src_list" $index
            ;;
        range)
            get_list_range "src_list" 13
            ;;
        size)
            _DATA_="${src_total_size} K"
            ;;
        *)
            if [ "$src_gather_dlg_get_data_ex" != "" ]; then
                $src_gather_dlg_get_data_ex $*
            fi
            ;;
    esac
}

#
# $1 -- array name
# $2 -- index
#
del_array_element() {
    local array_name="$1"
    local -i i=$2
    local -i size
    eval 'size=${#'"$array_name"'[*]}'
    while [ $i -lt $(($size-1)) ]; do
        eval "$array_name[$i]="'${'"$array_name[$(($i+1))]"'}'
        let i++
    done
    eval "unset $array_name[$(($size-1))]"
}

#
# $1 -- array name
# $2 -- index
# $3 -- n
#
mv_array_element() {
    local array_name="$1"
    local -i i=$2
    local -i j=$(($i$3))
    local -i size
    local tmp
    eval 'size=${#'"$array_name"'[*]}'
    if [ $j -ge 0 ] && [ $j -lt $size ]; then
        eval "tmp="'${'"$array_name[$i]"'}'
        eval "$array_name[$i]="'${'"$array_name[$j]"'}'
        eval "$array_name[$j]=""$tmp"
    fi
}

#
# get the file size in (K)
# 
# $1 -- file name
#
fsize() {
    du_info="$(du -k "$1")"
    echo "${du_info%%[^0123456789]*}"
}

#
#  run the source gather dialog
# 
#  $1 -- title
#  $2 -- action
#  $3 -- action_desc
#  $4 -- filter
#  $5 -- filter_desc
#
run_src_gather_dialog() {

    src_gather_dlg_title="$1"
    src_gather_dlg_action="$2"
    src_gather_dlg_action_desc="$3"
    src_gather_dlg_filter="$4"

    src_total_size=0
#    recent_dir=`pwd`
#    if [ -f .recent_dir ]; then
#        recent_dir=$(< .recent_dir)
#    fi
    load_src_gather_dialog_ui
    _FOCUS_="src_list"
    local close="false"
    while [ "$close" != "true" ]; do
        update_ui "src_gather_dialog_get_data"
        read_key
        case "$_KEY_" in
            X|x)
                close="true"
                ;;
            up|down|pgup|pgdown|home|end)
                scroll_list "src_list" $_KEY_ 
                ;;
            A|a)
                run_file_dialog "$src_gather_dlg_title --> add new file($5)" "$recent_dir" "$4"
                if [ "$_KEY_" == "O" ] || [ "$_KEY_" == "o" ]; then
                    count=${#src_list_array[*]}
                    src_list_array[$count]="$file_dialog_file"
                    src_dir_array[$count]="$file_dialog_dir"
                    recent_dir="$file_dialog_dir"
                    let src_total_size+=$(fsize "${file_dialog_dir}/${file_dialog_file}")
                fi
                load_src_gather_dialog_ui
                _FOCUS_="src_list"
                ;;
            R|r)
                if [ ${#src_list_array[*]} -gt 0 ]; then
                    let src_total_size-=$(fsize "${src_dir_array[$src_list_sel_index]}/${src_list_array[$src_list_sel_index]}")
                    del_array_element "src_list_array" $src_list_sel_index
                    del_array_element "src_dir_array" $src_list_sel_index
                    scroll_list "src_list" "valid"
                    _UI_UPDATED_="false"
                fi
                ;;
            U|u)
                if [ $src_list_sel_index -gt 0 ]; then
                    mv_array_element "src_list_array" $src_list_sel_index "-1"
                    mv_array_element "src_dir_array" $src_list_sel_index "-1"
                    scroll_list "src_list" "up"
                    _UI_UPDATED_="false"
                fi
                ;;
            D|d)
                if [ $src_list_sel_index -lt $((${#src_list_array[*]}-1)) ]; then
                    mv_array_element "src_list_array" $src_list_sel_index "+1"
                    mv_array_element "src_dir_array" $src_list_sel_index "+1"
                    scroll_list "src_list" "down"
                    _UI_UPDATED_="false"
                fi
                ;;
            ${src_gather_dlg_action:0:1}|$(echo ${src_gather_dlg_action:0:1} | dd bs=1 conv=lcase <&0 2> /dev/null))
                if [ ${#src_list_array[*]} -gt 0 ]; then
                    close="true"
                fi
                ;;
            '?')
                load_src_gather_dialog_help
                update_ui "src_gather_dialog_get_data"
                while [ "$_KEY_" != "x" ]; do read_key; done
                load_src_gather_dialog_ui
                ;;
            *)
                if ! [ -z "$src_gather_dlg_action_ex" ]; then
                    $src_gather_dlg_action_ex
                fi
        esac
    done
#    echo "$recent_dir" > .recent_dir
}

