#!/bin/bash

# fbumenu_gen 0.5.2 'FluxBox Usermenu GENerator (ROX-Filer AppDir Support)'
# Copyright(C) 2008 m.kato <mkato@par.odn.ne.jp>

# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

version=0.5.5

mk_umenu() {

    local FBDIR=$HOME/.fluxbox
    local USERMENUDIR=$FBDIR/UserMenu
    local CURDIR

    for item in * .fluxbox  ; do
        if [ -d "$item" ] ; then
            # avoid infinite loop
            check_realpath
            if [ "$realname" == "$HOME" ] ; then
                continue
            elif [ "$realname" == "$FBDIR" ] ; then
                continue
            elif [ "$realname" == "$USERMENUDIR" ] ; then
                continue
            fi
            # if directory
            CURDIR=`pwd`
            if [ -x "$item"/AppRun ] ; then
                # if ROX AppDir
                line="$INDENT""[exec] ($item) {$CURDIR/$item/AppRun}"
                if [ $ICONMODE == true ] ; then
                    pushd "$item" > /dev/null
                    if [ -a .DirIcon ] ; then
                        rm .DirIcon.png
                        ln -s .DirIcon .DirIcon.png
                        line="$line <$CURDIR/$item/.DirIcon.png>"
                    elif [ -a "AppIcon.xpm" ] ; then
                        line="$line <$CURDIR/$item/AppIcon.xpm>"
                    fi
                    popd > /dev/null
                fi
                echo -e "$line" | sed s/\\/home\\/`whoami`/~/g >> $OUTFILE
                # end ROX AppDir
            else
                # if normal directory
                cd $item
                line="$INDENT""[submenu] ("$item")"
                if [ $ICONMODE == true ] ; then
                    if [ -a .DirIcon ] ; then
                        rm .DirIcon.png
                        ln -s .DirIcon .DirIcon.png
                        line="$line <$CURDIR/$item/.DirIcon.png>"
                    fi
                fi
                echo -e "$line" | sed s/\\/home\\/`whoami`/~/g >> $OUTFILE
                INDENT="$INDENT""    "
                mk_umenu
                INDENT=`echo "$INDENT" | sed 's/    //'`
                echo -e "$INDENT""[end]"  >> $OUTFILE
                # end normal directory
            fi
            # end directory
        elif [ -x "$item" ] ; then
            # if executable
            line="$INDENT""[exec] ("$item") "{`pwd`/\""$item\""}
            if [ $ICONMODE == true ] ; then
                if [ -a ./"$item".png ] ; then
                    line="$line"" <`pwd`/"$item".png>"
                elif [ -a ./."$item".png ] ; then
                    line="$line"" <`pwd`/."$item".png>"
                elif [ -a ~/.fluxbox/icons/"$item".png ] ; then
                    line="$line"" <~/.fluxbox/icons/"$item".png>"
                fi
            fi
            echo -e "$line" | sed s/\\/home\\/`whoami`/~/g >> $OUTFILE
            # end executable
        elif $ROXUSR ; then
            # if rox user
            if [ -f "$item" ] ; then
                # if normal file
                line="$INDENT""[submenu] ($item)"
                if [ $ICONMODE == true ] ; then
                    # if icon mode
                    if [ -a ./"$item".png ] ; then
                        line="$line"" <`pwd`/"$item".png>"
                    elif [ -a ./."$item".png ] ; then
                        line="$line"" <`pwd`/."$item".png>"
                    elif [ -a ~/.fluxbox/icons/"$item".png ] ; then
                        line="$line"" <~/.fluxbox/icons/"$item".png>"
                    else
                        if [ $THMBMODE == true ] ; then
                            # if thumbnail mode
                            check_pix
                            case $ext in
                                png|xpm|jpg|ppm)
                                    line="$line <`pwd`/"$item">"
                                    ;;
                            esac
                            # end thumbnail mode
                        fi
                    fi
                    # end icon mode
                fi
                echo -e "$line" | sed s/\\/home\\/`whoami`/~/g >> $OUTFILE

                INDENT="$INDENT""    "
                line="$INDENT""[exec] (Open $item) {rox "`pwd`/"$item"}
                echo -e "$line" | sed s/\\/home\\/`whoami`/~/g >> $OUTFILE

                check_realpath
                pathname=$realpath
                if [ $FULLPATH == false ] ; then
                    pathname=`basename $realpath`
                fi
                line="$INDENT""[exec] (Open $pathname/) {rox ""$realpath}"
                echo -e "$line" | sed s/\\/home\\/`whoami`/~/g >> $OUTFILE
		INDENT=`echo "$INDENT" | sed 's/    //'`
                echo -e "$INDENT[end]" >> $OUTFILE
                # end normal file
            fi
            # end rox user
        fi
    done
    cd ..
    CURDIR=`pwd`
}

check_realpath () {

    local tmpname
    local string

    realpath=`pwd`
    realname=""

    for string in `ls -l "$item"` ; do
        tmpname=$string
    done
    if ! [ $tmpname == "$item" ] ; then
        realpath=`dirname $tmpname`
        realname=$tmpname
    fi
}

check_pix () {

    local string

    ext=""
    for string in `echo "$item" | sed s/\\\./' '/g` ; do
        ext=$string
    done
}

term_search() {

    local term

    for term in mlterm kterm rxvt xterm Eterm ; do
        if `type $term 1>& /dev/null` ; then
            MY_TERM=$term
            break
        fi
    done
}

help() {
    help_msg=$HOME/.fluxbox/fbumenu_gen_help
    cat << EOF > "$help_msg"
FluxBox User MENU GENerator $version (C) 2006-2008 m.kato
fbumenu_gen {[-o out_file] [-t|ni|h]} 
  オプション:
    -o  : out_file : out_file に出力.(デフォルト:usermenu)
    -i  : submenu_file : submenu_file を取り込む.(デフォルト:usersubmenu)
    -t  : 標準出力に出力.
    -T "title name"    : ユーザーメニューのタイトルを "title name" にする.
                                         (デフォルト:"ユーザーメニュー")
    -b  : 出力ファイルのバックアップを作る.(デフォルト:オフ)
    -ni : アイコンなしメニューを生成.(デフォルト:オフ)
    -th : メニュー項目が画像である場合、サムネイル表示させる.(デフォルト:オフ)
    -fp : フルパスモード.(デフォルト:オフ)
    -h  : このヘルプを表示.

  使用例:
    fbumenu_gen
        アイコン付きメニューを~/.fluxbox/usermenu に書き出します.
    fbumenu_gen -ni
        アイコンなしメニューを~/.fluxbox/usermenu に書き出します.
    fbumenu_gen -th
        メニュー項目に画像ファイルを含む場合、メニューにサムネイル表示します.
        対応画像フォーマット png、xpm、jpg、ppm
EOF

    case $LANG in
        ja_JP.eucJP)
            echo $LANG
            nkf -e "$help_msg"
            ;;
        ja_JP.UTF-8)
            echo $LANG
            cat "$help_msg"
            ;;
        *)
            echo "usage fbumenu_gen {[-o out_file] [-t|ni|h]} "
            echo "Options:"
            echo "    -o out_file : output to out_file.(default:usermenu)"
            echo "    -i submenu_file : include submenu_file.(default:usersubmenu)"
            echo "    -t  : output to stdout."
            echo "    -T \"title name\"  : set usermenu title."
            echo "    -b  : make outfile.backup"
            echo "    -ni : generate without icon."
            echo "    -th : thumbnail mode."
            echo "    -fp : fullpath mode."
            echo "    -h  : display this message."
            echo
            echo "example:"
            echo "    fbumenu_gen"
            echo "        output usermenu to ~/.fluxbox/usermenu (with icons) :default"
            echo "    fbumenu_gen -ni"
            echo "        output usermenu to ~/.fluxbox/usermenu (without icons)"
            echo "    fbumenu_gen -th"
            echo "        generate thumbnail for Image file"
            echo "            corresponding Image format: png, xpm, jpg, ppm"
            echo
            ;;
    esac
    rm "$help_msg"
}

error_check() {
    case "$checkstr" in
        -*|"")
            help
            echo "fbumenu_gen:" $error_message
            exit 1
            ;;
    esac
}

# Start user menu generate -----------------------------

FBDIR=$HOME/.fluxbox
OUTFILE=$FBDIR/usermenu
INFILE=$FBDIR/usersubmenu
UMDIR=$FBDIR/UserMenu
ICONMODE=true
THMBMODE=false
BACKUP=false
FULLPATH=false
ROXUSR=false
PROTODIR="/usr/share/fluxbox/UserMenu"

case $LANG in
    ja_JP.eucJP|ja_JP.UTF-8)
        TITLE="ユーザーメニュー"
        ;;
    *)
        TITLE="User Menu"
        ;;
esac

GENERATE_ENGMENU=no
if [ -f ${HOME}/.fluxbox/langset ]; then
    . ${HOME}/.fluxbox/langset
    if [ "$GENERATE_ENGMENU" == "yes" ]; then
        TITLE="User Menu"
    fi
fi

if `type rox 1>& /dev/null` ; then 
    ROXUSR=true
fi

# set options
for i in $@; do
    case $i in
        -o)
            error_message="Output filename is missing."
            checkstr=$2
            error_check
            OUTFILE="$2"
            if [ "`dirname $2`" == "." ]; then
                OUTFILE=`pwd`/`basename $2`
            fi
            ;;
        -i)
            error_message="Input filename is missing."
            checkstr=$2
            error_check
            INFILE="$2"
            if [ "`dirname $2`" == "." ]; then
                INFILE=`pwd`/`basename $2`
            fi
            ;;
        -t)
            OUTFILE=/dev/stdout
            ;;
        -T)
            error_message="Title name is missing."
            checkstr=$2
            error_check
            TITLE="$2"
            while [ -n "$3" ]; do
                case $3 in
                    -*|"")
                        break;;
                    *)
                        TITLE="$TITLE ""$3"
                        shift
                        ;;
                esac
            done
            ;;
        -b)
            BACKUP=true
            ;;
        -ni)
            ICONMODE=false
            ;;
        -th)
            THMBMODE=true
            ;;
        -fp)
            FULLPATH=true
            ;;
        -h)
            help
            exit 0
            ;;
        -*)
            help                        
            echo -e fbumenu_gen: unknown option \'$i\'.
            exit 1
            ;;
    esac
    shift
done

# check UserMenu dir
if ! [ -d $UMDIR ] ; then
#    mk_prototype
    cp -a "$PROTODIR" "$FBDIR/"
fi

# make backup
if [ -a $OUTFILE ] ; then
    if [ $BACKUP == true ] ; then
        cp $OUTFILE $OUTFILE.backup
    fi
    T=`date +%Y_%m_%d`
    mv $OUTFILE $OUTFILE.$T
fi

cd $UMDIR

line="[submenu] (${TITLE})"
echo "$line"  > $OUTFILE
if [ -f "$INFILE" ] ; then
    echo -e Submenu file \[$INFILE\] found.
    cat $INFILE | nkf -w >> $OUTFILE
fi
INDENT="    "

mk_umenu

echo "[end]" >> $OUTFILE

exit 0

