#!/usr/local/bin/wish -f
#
# Copyright (c) 1993 - The Ohio State University
# All Rights Reserved
# 

proc prefs_init {prefs_file interp cmd} {
    global Preferences PrefsPage NumPreferences
    global HomeInterp ApplyCmd
    
    set HomeInterp $interp
    set ApplyCmd $cmd
    set i [catch {set file [open $prefs_file "r"]}]
    if {!$i} {
	set page 0
	while {[gets $file line] != -1} {
	    if {[llength $line] == 4} {  
		set Preferences($page,title) [lindex $line 0]
		set Preferences($page,pattern) [lindex $line 1]
		set Preferences($page,class) [lindex $line 2]
		set Preferences($page,value) \
		    [send $HomeInterp option get . \
		     $Preferences($page,pattern) $Preferences($page,class)]
		set Preferences($page,description) [lindex $line 3]
		incr page
	    }
	}
	puts stdout "$page Pages of preferences"
	set NumPreferences $page
	close $file
    } else {
	return -1
    }
    set PrefsPage 0
}

proc prefs_build_widgets {} {
    global Preferences

    wm title . "Preferences"
    wm positionfrom . user

    frame .header 
    label .header.label -anchor center
    button .header.prev -text "<--" -command prefs_prev -relief raised
    button .header.next -text "-->" -command prefs_next -relief raised
    pack append .header \
	.header.prev {left} \
	.header.label {left fillx expand} \
	.header.next {right}

    frame .item -borderwidth 0
    label .item.label -anchor w -relief raised
    entry .item.entry  -relief sunken 
    bind .item.entry <Return> "prefs_next"
    bind .item.entry <KP_Enter> "prefs_next"
    bind .item.entry <Up> "prefs_prev"
    bind .item.entry <Down> "prefs_next"
    pack append .item \
	.item.label {left} \
	.item.entry {right fillx expand}

    frame .desc
    text .desc.text -width 80 -height 10 -wrap word \
	-yscrollcommand ".desc.sb set" -relief raised
    scrollbar .desc.sb -command ".desc.text yview"
    pack append .desc \
	.desc.sb {left filly expand} \
	.desc.text {left fillx filly expand}
    
    .desc.text configure -state disabled
    frame .comm
    button .comm.save -text "Save" -command prefs_save
    button .comm.quit -text "Quit" \
	-command "prefs_save ; prefs_quit"
    button .comm.abort -text "Abort (don't save)" \
	-command "prefs_quit"
    pack append .comm \
	.comm.save {left fillx expand} \
	.comm.quit {left fillx expand} \
	.comm.abort {left fillx expand}

    pack append . \
	.header {top frame center fillx expand} \
	.item {top frame center fillx expand} \
	.desc {top frame center fillx filly expand} \
	.comm {bottom frame center fillx expand} 

    focus .item.entry
    prefs_showpage 0
}

proc prefs_quit {} {
    global Preferences
    
    unset Preferences
    grab release .
    destroy .
}

proc prefs_save {} {
    global Preferences NumPreferences ApplyCmd HomeInterp

    prefs_setval
    set i [catch {set postfix [exec /usr/bin/sh -c date]}]
    if {!$i} {
	if {[regexp " (\[0-9]+):(\[0-9]+):(\[0-9]+) " $postfix junk a b c]} {
	    set postfix $a$b$c
	}  else {
	    set i 1
	}
    }
    if {$i} {
	puts stdout "Cannot open $filename for temporary use..."
	puts stdout "Changes not saved..."
	return
    }	
    
    set filename "/tmp/resedit-$postfix"
    set i [catch {set file [open $filename "w"]}]
    if {$i} {
	puts stdout "Cannot open $filename for temporary use..."
	puts stdout "Changes not saved..."
	return
    }
    for {set i 0} {$i < $NumPreferences} {incr i} {
	set val $Preferences($i,value)
	if {$val != ""} {
	    puts $file "*$Preferences($i,pattern): $val"
	}
    }
    close $file
    send $HomeInterp $ApplyCmd $filename
}


proc prefs_showpage {page} {
    global PrefsPage Preferences NumPreferences

    if {$page < 0} {set page [expr $NumPreferences-1]}
    if {$page >= $NumPreferences} {set page 0}
    set PrefsPage $page
    .header.label configure -text $Preferences($page,title)
    .item.label configure -text $Preferences($page,pattern)
    .item.entry delete 0 end
    .item.entry insert 0 $Preferences($page,value)
    .desc.text configure -state normal
    .desc.text delete 0.0 end
    .desc.text insert 0.0 $Preferences($page,description)
    .desc.text configure -state disabled
}

proc prefs_setval {} {
    global PrefsPage Preferences
    
    set Preferences($PrefsPage,value) [.item.entry get]
}

proc prefs_prev {} {
    global PrefsPage NumPreferences Preferences
    
    set Preferences($PrefsPage,value) [.item.entry get]
    prefs_showpage [expr $PrefsPage-1]
}

proc prefs_next {} {
    global PrefsPage NumPreferences Preferences

    set Preferences($PrefsPage,value) [.item.entry get]
    prefs_showpage [expr $PrefsPage+1]
}

if {$argc != 3} {
    puts stdout "Invalid argument count.."
    exit
}
if {[prefs_init [lindex $argv 0] [lindex $argv 1] [lindex $argv 2]] != -1} {
    prefs_build_widgets
}
