#!/bin/bash   
# Valikkohiirelle (rullahiirelle)  petteriIII 30.5.2016 2 toimi
# Selostus tunnetuista funktioista ja niiden parametreista:
# 1. ValitseValittavistaYksi: [otsikko [avaimet [ValitunNumero]]] . Erittely:
# otsikko=vapaata tekstiä koko toinen rivi näytöllä. Jos se on annettu sitä käytetään mutta jos ei ole niin otsikko muodostetaan automaattisesti. otsikko:sta otetaan CRC-32 muuttujaan crc ja se yksilöikin kutsujan hyvin. Ulkopuolinen ohjelma saattaa käyttää sitä. 
# avaimet= merkit 38-157 rivillä 1. Valikkohiirelle ohjelmassa ne eivät ole varsinaisia avaimia, vaan lisä-otsikko 
# ValitunNumero= valittuna olevan järjestysnumero. 

# 2. ohjeet: kaikki ~/OMATSKRIPTIT/OHJEITA/"Skriptiajuri, hiiriversio tai: Skriptiajuri, näppäinversio" ohje-kansion tiedostot viedään editoriin. Tiedostoja voi lisätä tai poistaa ja Skriptiajuri ottaa muutoksen automaattisesti huomioon.
# ohjeista ei voi esittää akrkistokappaleita editorissa. Arkistokappaleet kuitenkin tehdään paikkaan: ~/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/tiedoston nimi/monotonisesti kasvava arkistonumero 

# 3. etsiä_missä_skripti_on_kun_muistaa_sen_nimestä_jotakin                  
# 4. etsiä_kysyttävää_ilmaisua_skriptien_tekstistä
# 5. etsiä_esimerkkirivejä_kuinka_jotakin_käskyä_käytetään
# 6. ajaa_valitun_skriptin

echo -e "funktiot paikasta:"${0%/OMATSKRIPTIT*}"/OMATSKRIPTIT/FUNKTIOKIRJASTO/valikkohiirelle  liitetään koodiin" 

function LopetaSkriptiJaPalaaSkriptiajuriin () { $kanta/OMATSKRIPTIT/Skriptiajurihiirelle; }

function ValitseValittavistaYksi () {
function AsetaPaate {  
RivienLuku=$(($(tput lines)-6)) # näytön riviluku. 6 on otsikon+yläpalkin viemä tila
RivinPituus=$(tput cols)        # näyttörivin merkkiluku.
echo -e 'Näyttö-funktio kirjastoa kutsuva ohjelma: ' $(basename "$0")'\nnäytön riviluku:'$RivienLuku'   rivinpituus:'$RivinPituus
# gconftool ja gnome-terminal ovat gnomessa, mate:ssa on mateconftool-2 ja mate-terminal. Seuraava on testi onko mate vai joku muu 
[[ $(cat /var/lib/dpkg/status  | grep \ mate-terminal) ]] && (
apu=$(mateconftool-2 -g /apps/mate-terminal/profiles/Default/default_size_columns)
mateconftool-2 -s /apps/mate-terminal/profiles/Default/use_custom_default_size --type bool true
mateconftool-2 -s /apps/mate-terminal/profiles/Default/default_size_columns --type integer 240 
mateconftool-2 -s /apps/mate-terminal/profiles/Default/default_size_rows --type integer 60     
mateconftool-2 -s /apps/mate-terminal/profiles/Default/scrollback_unlimited --type bool true # rajoittamaton vieritys  
mateconftool-2 -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true 
[[ $apu = 240 ]] || (echo 'avaa uusi pääte ja käynnistä siinä uudelleen'; sleep 3; killall mate-terminal)
)

[[ $(cat /var/lib/dpkg/status  | grep \ gnome-terminal) ]] && (
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/scrollback_unlimited --type bool true
gconftool -s /apps/gedit-2/preferences/editor/line_numbers/display_line_numbers --type bool true
[[ "$apu" = 240 ]] || (echo 'avaa uusi pääte ja käynnistä siinä uudelleen'; sleep 3; killall gnome-terminal)
)
valintalukko=1   # negatiivinen logiikka, valinta on nyt mahdollista suorittaa
# avaimet=''     # ohjelma perisi muuten avaimet edelliseltä ohjelmalta
raja=112\101\116\116\101\114\105\73\73\73
}

function MuutaValittuPunaiseksi { 
tput cup 2 $(($RivinPituus-95)) 
# tput sgr0; echo "näpäytä_tästä_käyttöohjeet erikoistoimet  dokumentoi koodaa"
tput cup 0 $(($RivinPituus-45)) #; tput el tyhjää loppurivi 
apu=$kanta/"$KansionNimi"/'ARKISTO/SKRIPTIT/'"${Valittavat[ValitunNumero-1]}" # dokumenttien määrää ei pitäisikään näyttää 
[[ $ValitunNumero>1 ]] && Tiedostonaika="" && [[ -a $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && Tiedostonaika=$(stat --printf %y $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}"  | awk '{ print $1" "$2"  "}' | tr -d '\n')           
[[ -f $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && echo -n ${Tiedostonaika:0:16} && [[ -d $apu ]] && echo -n " Koodeja:"$(ls "$apu" | sort -g | tail -n 1) && tput el
[[ -d $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" ]] && echo "kansiossa tiedostoja:"$(ls $kanta/"$KansionNimi"/"${Valittavat[ValitunNumero-1]}" | wc -l)"          "  
[[ ${Valittavat[ValitunNumero-1]} = .edellinen_kansio. ]] && tput el
Xkoordinaatti=$(((ValitunNumero - 1 - $(((ValitunNumero - 1) / RivienLuku))) / RivienLuku)); Ykoordinaatti=$((ValitunNumero - $((RivienLuku * Xkoordinaatti -1))+3));tput cup $((Ykoordinaatti - Xkoordinaatti - 2)) $((Xkoordinaatti * SarakkeenPituus));  tput rev; echo "${Valittavat[ValitunNumero-1])}"; tput sgr0
}

function MuutaKaikkiValintarivitVihreiksi {
tput cup 3 0 #; tput clear oli: tput cup 3 0
cat /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö
}

function TulostaValittavat {
  # clear \
rm /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö
tput sgr0 
echo -e 'näpäytä tästä:  kirjanmerkit        käyttöohjeet\n'$otsikko'\n' 
tput cup 3 0 # uusikoe                     
ValittavienLuku=${#Valittavat[@]}
SarakkeidenLuku=$(($((ValittavienLuku-3))/RivienLuku+1))  # oli:SarakkeidenLuku=$(($((ValittavienLuku-2))/RivienLuku+1))
SarakkeenPituus=$((RivinPituus/SarakkeidenLuku))
# tput clear
for (( Rivi=0; Rivi<=RivienLuku; Rivi++ )) # -1 ei vissiin onnistunut
do
  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}"; echo -e "${nayttoRivi}" >> /home/petteri/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/näyttö; naytto[$Rivi]=${nayttoRivi:0:$RivinPituus}; nayttoRivi=''  
done  
}

function MuutaValittuNuolinappaimilla {
MuutaValittuPunaiseksi 
 echo -en "\e[?1000h"; read -n6 -s -t0.02 key ; echo -en "\e[?1001h" 
stty -echo
[[ ${key:3:1} = "a" ]] && MuutaValittua -1  # rullaus ylös
[[ ${key:3:1} = "\`" ]] && MuutaValittua 1  # rullaus alas
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 = 33 ]] && [[ $x > 64 ]] && Tapahtuma=käyttöohjeet && valintatehty=1 && return
[[ $y = 33 ]] && [[ $x < 64 ]] && Tapahtuma=kirjanmerkit && valintatehty=1 && return
[[ $y > 35 ]] && MuutaKaikkiValintarivitVihreiksi && ValitunNumero=$((y-34+(((RivienLuku+1)*((x-34)/SarakkeenPituus)))-1)) && MuutaValittuPunaiseksi && return
valintatehty=0
fi                                                          
}

function MuutaValittua () {
MuutaKaikkiValintarivitVihreiksi
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 () {
[[ $3 ]] && ValitunNumero=$3 
[[ ${#Valittavat} == 0 ]] && echo 'ei ole valittavaa' && sleep 2 && valintatehty=1 && break 
AsetaPaate 
local otsikko key valintatehty=0 Xkoordinaatti Ykoordinaatti   
[[ ! $ValitunNumero || $ValitunNumero -lt 1 || $ValitunNumero -gt ${#Valittavat[@]} ]] && ValitunNumero=1
setterm -cursor off  
otsikko="$1"; [[ ! "$otsikko" ]] && otsikko='Ohjelma: '$0' pyytää valitsemaan näistä' 
crc=$(echo $otsikko | cksum | awk {'print $1'}) # cksum=32bittinen crc, sha1sum ->160bittinen ...
TulostaValittavat
valintatehty=0
Tapahtuma=""
while [ $valintatehty -lt 1 ] ; do MuutaValittuNuolinappaimilla;  done 
tput sgr0; stty echo # setterm -reset # värit normaaleiksi #   # clearlisätty poistettu
ValitunTeksti=${Valittavat[ValitunNumero-1]}
[[ ! ${ValitunArvo[ValitunNumero-1]} ]] && ValitunArvo='ei määritelty' || ValitunArvo=${ValitunArvo[ValitunNumero-1]}
}

# loput funktiot ovat Skriptiajuri:n hiiriversiota varten eivätkä sotke mitään. Näppäinversiossa paremmat funktiot?
function etsiä_missä_skripti_on_kun_muistaa_sen_nimestä_jotakin () { 
avaimet='palaa Skriptiajuri:en        uusi hakutermi'
while true
do
  cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo 
  lue_näppäimistöltä hakusana "mitä ilmausta etsit kansioiden tai skriptien nimistä (teksti voi olla keskelläkin sanaa)?"
  eval Valittavat=(" "$(find /home/petteri/OMATSKRIPTIT |  grep "$hakusana" | grep -v /ARKISTO/ | grep -v *sgml | sed 's/^ */"/g;s/ *$/"/g')) 
  ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2) 
  ValitseValittavistaYksi "ilmaus löytyi näiden skriptien nimistä: tutki valittu painamalla enter sen kohdalla" "$avaimet" 
  [[ $Tapahtuma = "palaa" ]] && break 
  [[ $Tapahtuma = "uusi" ]] ||  echo 'editoin tiedostoa: '/home/petteri/OMATSKRIPTIT/palautuspiste "$ValitunTeksti" && gedit "$ValitunTeksti" && break
done 
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2 
} 

function etsiä_kysyttävää_ilmaisua_skriptien_tekstistä {
kansio_josta_ei_haeta='\/ARKISTO\/'
cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo ; echo
lue_näppäimistöltä hakusana "mitä ilmausta etsit kaikista omista skripteistä ?"
optiot="-lr"  
apu=${hakusana%% *} 
[[ ${hakusana:0:1} = "-" ]] && optiot="-lr"${apu:1} && hakusana=${hakusana#* }
[[ $(echo $hakusana | grep ^man) ]] && $hakusana > ${hakusana:4} && gedit ${hakusana:4} haku=CTRL-f && rm ${hakusana:4} && return
eval Valittavat=($(grep $optiot "$hakusana" $kanta/OMATSKRIPTIT | grep -v $kansio_josta_ei_haeta | grep -v kopio | sed 's/\/home\/petteri\/OMATSKRIPTIT\///g' | sed 's/^ */"/g;s/ *$/"/g'  ))
[[ -f $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2 ]] && ValitunNumero=$(cat $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2) 
while true
do 
  avaimet='palaa Skriptiajuri:een  uusi hakutermi' # end=palaa Skriptiajuri:en   f2=anna uusi hakutermi
  ValitseValittavistaYksi "ilmaus löytyi näistä skripteistä: valitse editoitava valitsemalla se ja painamalla enter" "$avaimet"  
  [[ $Tapahtuma = "palaa" ]] && break 
  [[ $Tapahtuma = "uusi" ]] && etsiä_kysyttävää_ilmaisua_skriptien_tekstistä 
  gedit /home/$(whoami)/OMATSKRIPTIT/"$ValitunTeksti" 
done 
echo $ValitunNumero > $kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/haku2 
}

function etsiä_esimerkkirivejä_kuinka_jotakin_käskyä_käytetään { # lisätty
cat $kanta/OMATSKRIPTIT/ARKISTO/APUTIEDOSTOT/grepin_määreet; echo; echo 
lue_näppäimistöltä hakusana "millaisia esimerkkirivejä etsit kaikista omista skripteistä ?"
find ~/OMATSKRIPTIT ! -path '*ARKISTO*' ! -path *sgml -type f  -exec grep "$hakusana" {} \;
read -p 'hiirellä voi vieritää näyttöä. paina enter jatkaakseesi'
}

# tarvitaanko seuraavia? Funktionimiin lisätty: _old
function ohjeet_old { # kaikkia ohjekansion tiedostot luetaan. Tiedostoja voi lisätä tai poistaa ja Skriptiajuri ottaa muutoksen automaattisesti huomioon.
# gedit & # tämä käsky aiheuttaa sen että pääohjelma ei pysähdy tuleviin gedit-käskyihin vaan jatkaa taustalla ilman näppäimiä ja fyysistä näyttöä
eval Valittavat=(".edellinen_kansio." $(ls $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajurihiirelle" -Q --hide=?*'\~' --hide=?*kopio?* --group-directories-first))
for (( n=2; n<=${#Valittavat[@]}-1; n++ )); do  
TiedostonAikaleimaAlussa[$n]=$(stat --printf %y $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajurihiirelle"/"${Valittavat[$n]}" | awk '{ print $2 }')
gedit $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajurihiirelle"/"${Valittavat[$n]}" &
done
# reset #; read -p 'paina enter'
# sen varalta että joku ohje on muuttunut lisätään sen kopio arkistoon. Luettaessa ohjeita seuraavan kerran poistuvat tyhjätyt ohje-tiedostot
for (( n=2; n<=${#Valittavat[@]}-1; n++ )); do 
  [[ ! -d $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajurihiirelle"/"${Valittavat[$n]}" ]] && mkdir -p $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajurihiirelle"/"${Valittavat[$n]}" && touch $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajurihiirelle"/"${Valittavat[$n]}"/0
  [[ ${TiedostonAikaleimaAlussa[$n]} = $(stat --printf %y $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajurihiirelle"/"${Valittavat[$n]}" | awk '{ print $2 }' ) ]] && continue
  Suurin_numero_ohjeissa=$(ls $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajurihiirelle"/"${Valittavat[$n]}" | sort -g | tail -n 1)
  cp $kanta/OMATSKRIPTIT/OHJEITA/"Skriptiajurihiirelle"/"${Valittavat[$n]}"  $kanta/OMATSKRIPTIT/OHJEITA/ARKISTO/SKRIPTIT/"Skriptiajurihiirelle"/"${Valittavat[$n]}"/$(($Suurin_numero_ohjeissa+1)) 
done 
}

function ajaa_valitun_skriptin_old { 
[[ $ValitunTeksti = '.edellinen_kansio.' ]] && KansionNimi=$(dirname "$KansionNimi") && echo "$KansionNimi">$kanta/OMATSKRIPTIT/ARKISTO/ASETUKSET/KansionNimiAloituksessa && HaeSenRinvinNumeroJollaViimeksiTyöskenneltiinTässäKansiossa "$KansionNimi" && return 
[[ -d $kanta/"$KansionNimi"/"$ValitunTeksti" ]] && KansionNimi="$KansionNimi"/"$ValitunTeksti" && return 
[[ $(echo "$ValitunTeksti" | grep -e '.PDF' -e '.pdf') ]] && evince $kanta/"$KansionNimi"/"$ValitunTeksti" && return # html:lle myös
[[ $(echo "$ValitunTeksti" | grep -e '\.doc' -e .html -e .odt -e .sgml -e .xml) ]] && /usr/bin/libreoffice $kanta/"$KansionNimi"/"$ValitunTeksti" && return
[[ ! -d $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" ]] && mkdir -p $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti" #?
bash -n $kanta/"$KansionNimi"/"$ValitunTeksti" &>$kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe
[[ ! -f $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe ]] && echo "" > $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe 
[[ $(cat -b $kanta/"$KansionNimi"/ARKISTO/SKRIPTIT/"$ValitunTeksti"/virhe) > 0 ]] && echo 'tulkkauskelvoton, mennään koodaamaan' && sleep 0.2 && koodaa && return 
[[ $(cat $kanta/"$KansionNimi"/"$ValitunTeksti" | grep \$1) ]] && LueParametrit # jos skriptissä on viittauksia parametreihin käydään lukemassa niitä
# clear&& echo -e 'suoritan skriptin: '$kanta/"$KansionNimi"/$ValitunTeksti'\n' && bash $kanta/"$KansionNimi"/"$ValitunTeksti" $Parametrit && read -p 'jatkaakseesi paina enter' || ( reset; echo "skriptisi päätyi virheeseen virhe-statuksella: "$? ; read -p "jatkaakseesi paina enter"; /home/petteri/OMATSKRIPTIT/"Skriptiajurihiirelle" )
}
