#!/usr/local/bin/wish
# -*- tcl -*-
# Use tcl/tk 8.x

wm withdraw .

catch {parray}

package require Tix
package require Pool_Base
package require Pool_GuiBase
package require Makedist

# for testing
#lappend auto_path [file join [::pool::file::here] lib]
#lappend auto_path [file join [::pool::file::here] support]



namespace eval ::makedist {
    namespace export *
}

proc ::makedist::usage {} {
    global argv0

    set rl [::makedist::retrievers]
    set pl [::makedist::packers]
    set tl [::makedist::transports]

    regsub -all { } $rl {|} rl
    regsub -all { } $pl {|} pl
    regsub -all { } $tl {|} tl

    puts stdout ""
    puts stdout "usage: $argv0 ?-retriever $rl? ?-packer 'list of $pl'? ?-transport $tl? ?-version version? ?module?"
    puts stdout ""

    exit -1
}


::pool::array::def        oDef
::pool::getopt::defOption oDef version
::pool::getopt::defOption oDef builddir  -d [file join $env(HOME) .mkd[pid]]
::pool::getopt::defOption oDef retriever -d cvs -t ::makedist::isRetriever
::pool::getopt::defOption oDef packer    -d tgz -t ::makedist::isPackerList
::pool::getopt::defOption oDef transport -d pwd -t ::makedist::isTransport

foreach opt {
    retriever packer transport
} {
    proc $opt {v} "global oDef; ::pool::getopt::changeDefault oDef $opt \$v"
}

# user dependent configuration
catch {source [file join $env(HOME) .makedistrc]}

# caller configuration
::pool::array::def                             opt
set argv   [::pool::getopt::process oDef $argv opt]
set module [lindex $argv 0]


# -- interface utilities --

::pool::array::def chosenPackers


proc do_make {} {
    # callback to 'make' button.

    global module opt retriever packer transport

    .t clear

    .a subwidget exit configure -state disabled
    .a subwidget make configure -state disabled
    update

    set opt(-retriever) [::makedist::retrieverCode $retriever]
    set opt(-transport) [::makedist::transportCode $transport]
    set opt(-packer)    $packer

    ::makedist::do \
	    -retriever $opt(-retriever) \
	    -packer    $opt(-packer)    \
	    -transport $opt(-transport) \
	    -version   $opt(-version)   \
	    -builddir  $opt(-builddir)  \
	    $module

    .a subwidget exit configure -state normal
    .a subwidget make configure -state normal
    update

    return
}


proc log_do {level message} {
    # logger callback, route information into log widget.
    #    puts stdout "$level\t$message"

    if {[string match *autodoc* $message]} {
	regsub -- {^makedist autodoc: } $message {makedist autodoc:         } message
    }

    .t log $level $message
    return
}


::pool::syslog::def log_do


proc onoff {p} {
    global chosenPackers packer

    if {$chosenPackers($p)} {
	lappend packer $p
    } else {
	::pool::list::delete packer $p
    }

    return
}


proc check_make {args} {
    global opt packer module

    .a subwidget make configure -state disabled

    if {$module == {}}         {return}
    if {$packer == {}}         {return}
    if {$opt(-builddir) == {}} {return}

    .a subwidget make configure -state normal
}


# -- interface --
frame     .log
frame     .input  -relief sunken -bd 2
frame     .choser -relief sunken -bd 2

tixButtonBox .a -orient horizontal -relief raised -bd 1

.a add exit -text Exit -command exit
.a add make -text Make -command do_make

frame .module
label .module.l -text Module: -anchor w
entry .module.e -relief sunken -bd 2 -textvariable module -width 80

frame .build
label .build.l -text "Build directory:" -anchor w
entry .build.e -relief sunken -bd 2 -textvariable opt(-builddir) -width 80

eval tk_optionMenu .retr  retriever [::makedist::retrieverNames]
eval tk_optionMenu .trans transport [::makedist::transportNames]


foreach p [::makedist::packers] {
    checkbutton .p$p \
	    -text     [::makedist::packerName $p] \
	    -variable chosenPackers($p) \
	    -command  [list onoff $p] \
	    -anchor   w
}

logger .t -slow 1


set retriever [::makedist::retrieverName $opt(-retriever)]
set transport [::makedist::transportName $opt(-transport)]

set packer $opt(-packer)
foreach p  $opt(-packer) {
    set chosenPackers($p) 1
}


check_make
trace variable packer         w check_make
trace variable module         w check_make
trace variable opt(-builddir) w check_make


# -- generate layout --

pack  .input -side top -fill both -expand 0
pack  .log   -side top -fill both -expand 1
pack  .a     -side top -fill both -expand 0

pack .module.l -side left  -fill both -expand 1
pack .module.e -side right -fill both -expand 0

pack .build.l  -side left  -fill both -expand 1
pack .build.e  -side right -fill both -expand 0

pack .module -side top -fill both -expand 0 -in .input
pack .build  -side top -fill both -expand 0 -in .input

pack .retr  -side top -fill both -expand 0 -anchor w -in .choser
pack .trans -side top -fill both -expand 0 -anchor w -in .choser

foreach p [::makedist::packers] {
    pack .p$p -side top -fill both -expand 0 -anchor w -in .choser
}

pack .choser -side left -expand 1 -fill both -in .log
pack .t      -side left -expand 1 -fill both -in .log

# make interface visible, allow interaction.
wm deiconify .

