#!/bin/bash   
# Valikko_funktiot rullahiirelle   16.5.2012 petteriIII
# Valikko_funktion parametrit: Otsikko1=koko 2. rivi. Jos se on annettu sitä käytetään mutta jos ei ole niin Otsikko1 muodostetaan automaattisesti. Otsikko1:stä otetaan CRC-32 ja se yksilöikin kutsujan hyvin. Ulkopuolinen ohjelma saattaa käyttää sitä. Otsikko2=merkit 38-157 rivillä 1.
# muu "dokumentointi" on skriptissä nimeltä: Valikonesittely.

function AsetaPaate {  #kbdrate -r 40 80 # -> X environment: xset r rate 240 60 # paketti wmctrl ?
#reset # varmistetaan että aloitetaan puhtaalta pöydältä; toimii paremmin skriptiajurissa && sleep .1
RivienLuku=$(($(tput lines)-5)) # näytön riviluku. 5 on otsikon+yläpalkin viemä tila
RivinPituus=$(tput cols)        # näyttörivin merkkiluku.
echo 'Näyttö-funktio kirjastoa kutsuva ohjelma: ' $(basename $0)'  Riviluku:'$RivienLuku'   rivinpituus:'$RivinPituus
gconftool -s /apps/gnome-terminal/profiles/Default/title --type string $(basename $0)
apu=$(gconftool -g /apps/gnome-terminal/profiles/Default/default_size_columns)
gconftool -s /apps/gnome-terminal/profiles/Default/use_custom_default_size --type bool true
gconftool -s /apps/gnome-terminal/profiles/Default/default_size_columns --type integer 240 # Näyttörivin maximi pituus
gconftool -s /apps/gnome-terminal/profiles/Default/default_size_rows --type integer 60     # Näyttörivien maximi määrä
gconftool -s /apps/gnome-terminal/profiles/Default/use_theme_colors --type bool false
gconftool -s /apps/gnome-terminal/profiles/Default/scrollback_unlimited --type bool true
gconftool -s /apps/gnome-terminal/profiles/Default/default_show_menubar --type bool true   # tulee voimaan vasta toisella ajokerralla
gconftool -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true
raja=112\101\116\116\101\114\105\73\73\73
[[ ! "$apu" = 240 ]] && killall gnome-terminal
}

function tilastoa {
tput cup 0 0; tput setf 3
apu=$kanta/"$KansionNimi"/'ARKISTO/skriptit/'"${Valittavat[ValitunNumero-1]}" 
[[ -d "$apu" ]] && [[ $(ls "$apu") ]] && echo -n "Editointikopioita:"$(ls "$apu" | sort -g | tail -n 1) || echo -n '    editointikopioita ei ole'
apu=$kanta/"$KansionNimi"/'ARKISTO/dokumentit/'"${Valittavat[ValitunNumero-1]}" 
[[ -d "$apu" ]] && [[ $(ls "$apu") ]] && echo -n "  Dokumenttikopioita:"$(ls "$apu" | sort -g | tail -n 1) || echo -n '    dokumenttikopioita  ei ole'
apu=$kanta/"$KansionNimi"/'ARKISTO/HISTORIAT/'* 
[[ -d "$apu" ]] && [[ $(ls "$apu") ]] && echo -n "  historiatietoja: "$(wc -l $apu | awk {'print $1'}) | tail -1 || echo -n '    historiatietoja ei ole'
echo -n "      paina enter jatkaakseesi "; read  # 
tput cup 0 0; echo -en "\r\033[K$Otsikko2"
key=''; echo 'näpäytä hiiren vasenta jatkaakseesi'; until [[ ${key:3:1} = "#" ]]; do echo -en "\e[?1000h"; read -n6 -s -t0.02 key ; echo -en "\e[?1001h"; done 
}

  
function MuutaValittuPunaiseksi {
tput cup 2 $(($RivinPituus-45))  
apu=$kanta/$KansionNimi/'ARKISTO/skriptit/'"${Valittavat[ValitunNumero-1]}" 
tput setf 3;echo "näpäytä_tästä_käyttöohjeet    erikoistoimet" #Editointeja:"$(ls "$apu" | sort -g | tail -n 1)"                   "
#tput cup 0 0; cat $kanta/$KansionNimi/"${Valittavat[ValitunNumero-1]}"  | head -2 # esimerkiksi tutkittaessa historioita 
Xkoordinaatti=$(((ValitunNumero - 1 - $(((ValitunNumero - 1) / RivienLuku))) / RivienLuku)); Ykoordinaatti=$((ValitunNumero - $((RivienLuku * Xkoordinaatti -1))+3));tput cup $((Ykoordinaatti - Xkoordinaatti - 2)) $((Xkoordinaatti * SarakkeenPituus));  tput setf 4; echo "${Valittavat[ValitunNumero-1])}"
}

function MuutaValittuVihreaksi {
  Xkoordinaatti=$(((ValitunNumero - 1 - $(((ValitunNumero - 1) / RivienLuku))) / RivienLuku)); Ykoordinaatti=$((ValitunNumero - $((RivienLuku * Xkoordinaatti - 1))+3));tput cup $((Ykoordinaatti - Xkoordinaatti - 2)) $((Xkoordinaatti * SarakkeenPituus));  tput setf 3; echo "${Valittavat[ValitunNumero-1])}" 
}

function TulostaValittavat {
clear 
tput setf 3
echo -e $Otsikko2'\n'$Otsikko1'\n'                      
ValittavienLuku=${#Valittavat[@]} 
SarakkeidenLuku=$(($((ValittavienLuku-2))/RivienLuku+1))
SarakkeenPituus=$((RivinPituus/SarakkeidenLuku))
for (( Rivi=0; Rivi<=RivienLuku; Rivi++ ))  
do
  nayttoRivi='' # koe, ettei nayttoRivi olisi koskaan määrittelemätön
  for (( Sarake=0; Sarake<=SarakkeidenLuku-1; Sarake++ ))   
  do    
    naytettava=${Valittavat[Sarake*RivienLuku+Sarake+Rivi]}"                                                                                           " 
    nayttoRivi="$nayttoRivi"${naytettava:0:$SarakkeenPituus}  # mitä sarakkeita näyttörivillä ennestään onkin ja uusi sarake lisää
  done
  echo "${nayttoRivi:0:$RivinPituus}"; nayttoRivi=''
done  
}

function MuutaValittuNuolinappaimilla {
MuutaValittuPunaiseksi 
 echo -en "\e[?1000h"; read -n6 -s -t0.02 key ; echo -en "\e[?1001h" 
stty -echo
# echo ${key:3:1}; read
if [[ ${key:3:1} = "a" ]]; then MuutaValittua -1; fi  # rullaus ylös
if [[ ${key:3:1} = "\`" ]]; then MuutaValittua 1; fi  # rullaus alas
if [[ ${key:3:1} = "!" ]]; then tilastoa; fi          # hiiren rullan näpäytys
if [[ ${key:3:1} = "#" ]]; then valintatehty=1; x=$(LC_CTYPE=C printf '%d' "'${key:4:1}"); y=$(LC_CTYPE=C printf '%d' "'${key:5:1}")
  [[ $y = 35 ]] && [[ $x > $(($RivinPituus+15)) ]] && Tapahtuma=erikoistoimet && valintatehty=1 && return
  [[ $y = 35 ]] && [[ $x > $(($RivinPituus-12)) ]] && Tapahtuma=käyttöohjeet && valintatehty=1 && return 
  [[ $y > 35 ]] && MuutaValittuVihreaksi && ValitunNumero=$((y-35+((x-30)*(SarakkeidenLuku+0))/RivinPituus*(RivienLuku+8))) && MuutaValittuPunaiseksi && return
valintatehty=0                                            #oli 35     33                  +0                           1                        
fi                                                          
}

function MuutaValittua () {
MuutaValittuVihreaksi
ValitunNumero=$(($ValitunNumero+$1)) 
[[ $ValitunNumero -lt 1 ]] && TulostaValittavat && ValitunNumero=1 # TulostaValittavat lisätty
[[ $ValitunNumero -gt $ValittavienLuku ]] && ValitunNumero=$ValittavienLuku # apu->ValittavienLuku; -2 lisätty poistettu
} 
 
function ValitseValittavistaYksi () {
[[ ${#Valittavat} == 0 ]] && echo 'ei ole valittavaa' && sleep 2 && valintatehty=1 && break 
AsetaPaate 
local Otsikko1 Otsikko2 key valintatehty=0 Xkoordinaatti Ykoordinaatti   
[[ ! $ValitunNumero || $ValitunNumero -lt 1 || $ValitunNumero -gt ${#Valittavat[@]} ]] && ValitunNumero=1
setterm -cursor off  
Otsikko1="$1"; [[ ! "$Otsikko1" ]] && Otsikko1='Ohjelma: '$0' pyytää valitsemaan näistä'
Otsikko2="$2" 
crc=$(echo $Otsikko1 | cksum | awk {'print $1'}) # cksum=32bittinen crc, sha1sum ->160bittinen ...
TulostaValittavat
valintatehty=0
Tapahtuma=""
while [ $valintatehty -lt 1 ] ; do MuutaValittuNuolinappaimilla;  done 
tput setf 0; setterm -reset; stty echo
ValitunTeksti=${Valittavat[ValitunNumero-1]}
[[ ! ${ValittavanArvo[ValitunNumero-1]} ]] && ValitunArvo='ei määritelty' || ValitunArvo=${ValittavanArvo[ValitunNumero-1]}
}

function lue_näppäimistöltä () { 
# Tämä rutiini tuo sen että vanhoja rivejä voi selata ja riviä voi editoida. Historiatiedosto on kansio- ja kysyttävän muutujan nimi-kohtainen.
# kutsu: lue_näppäimistöltä <kysyttävän muuttujan nimi> <kysymysteksti jonka merkkivalikoimaa ei ole rajoitettu>
historia_tiedoston_nimi="$1" # "$2" oli $1
# echo kkk$historia_tiedoston_nimi;read
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTekstiTalteen" ]] && mkdir -p $kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTekstiTalteen"  
historiatiedosto=$kanta/"$KansionNimi"/ARKISTO/HISTORIAT/"$ValitunTekstiTalteen"/"$historia_tiedoston_nimi" # ValitunTekstiTalteen ?
[[ ! -f "$historiatiedosto" ]] && echo 'historian alku' > "$historiatiedosto"   # kysymykselle luodaan kysymyksen tekstin mukainen historia-tiedosto
apu=$(eval echo \$$1)
[[ "$apu" != $(tail -1  "$historiatiedosto") ]] &&  echo "$apu" >>  "$historiatiedosto" # kysytty arvo viedään heti historiaan josta sitä voi siis kutsua jo ensimmäisellä kerralla # koe lisäys
history -r  "$historiatiedosto"
echo -e "\nEdellisiä vastauksia voi selailla nuolinäppäimillä. Näytöä voi vierittää hiirellä. Myös editointi toimii. Kirjoita vaikkei kysymysmerkkiä näykään\n\n"$2
read -e $1 # apu oli 1 myös seuraavassa lauseessa
eval echo \$$1 >>  "$historiatiedosto"
}
 
function muuta_uusi_nimi_valituksi {
täytä_valittavat $kanta/"$KansionNimi"
for (( n=1; n<=${#Valittavat[@]}; n++ )); do [[ $SkriptinNimi = ${Valittavat[n-1]} ]] && break; done 
echo $n > $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa # kokeiltava toimiiko
}

function täytä_valittavat () {
kansio=$@ # kun listattavaksi tulee kansio jonka nimessä on välilyöntejä siirtyy jokainen sana omassa parametrissaan ja ne täytyy liittää yhteen 
find "$kansio" -size 0b -delete; find "$kansio" -type f -name \*~ -delete; find "$kansio" -type f -name .~lock* -delete; find "$kansio" -type f -name delme -delete
eval Valittavat=(".edellinen_kansio." " "     $(ls "$kansio" -Q --group-directories-first))
}

function synkronoida_kovalevyn_ja_tikun_omatskriptit {
lue_näppäimistöltä kansio "mikä on kansion nimi tikulla (tyhjä nimi käy myös): " 
rsync --existing -arcuv /media/tikku/$kansio/omatskriptit ~
rsync --existing -arcuv ~/omatskriptit /media/tikku/$kansio
read -p 'paina enter jatkaakseesi'
}

function HaeSenRinvinNumeroJollaViimeksiTyöskenneltiinTässäKansiossa() { 
ValitunNumero=3
[[ -f $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa ]] && ValitunNumero=$(cat $kanta/"$KansionNimi"/ARKISTO/ViimeksiValittuSkriptiTässäKansiossa)
} 

function TalletaMistäKansiostaEnsikerrallaAloitetaan {
apu=${KansionNimi%%[[:alnum:]]*}; KansionNimi=${KansionNimi:${#apu}} # siistitään kansionnimi alkamaan aakkosnumerolla
apu=${KansionNimi%[[:alnum:]]*}; KansionNimi=${KansionNimi:0:$((${#apu}+1))} # siistitään kansionnimi päättymään aakkosnumeroon
echo "$KansionNimi">$kanta/omatskriptit/ARKISTO/asetukset/KansionNimiAloituksessa
} 

function command_not_found_handle () {
# tämännimistä funktiota kutsutaan käyttöjärjestelmän toimesta automaattisesti mikäli skriptissä viitataan käskyyn jollaista ei löydy.
komennon_nimi=$1
shift
echo "ohjelma:"${BASH_SOURCE}" Rivino:"${BASH_LINENO}
echo "seuraavaa käskyä ei löydy: \""$komennon_nimi\"""
echo "käskyn argumentit ovat: ""$@"
echo
kaskysta_on_puhuttu_paketeissa=$(apt-cache search $komennon_nimi) 
[[ $(echo $kaskysta_on_puhuttu_paketeissa | grep ^$1) ]] && paketin_nimi=$(echo $kaskysta_on_puhuttu_paketeissa | grep ^$1) || 
paketin_nimi= $(echo $kaskysta_on_puhuttu_paketeissa | awk {'print $1'}) 
echo " paketin määrittelyä: "$paketin_nimi 
sudo apt-get install ${komennon_nimi} || echo "siitä on puhuttu paketeissa: "$kaskysta_on_puhuttu_paketeissa
exit
}
 
