#!/usr/local/bin/wish -file

#
# $Id: sortDialog,v 1.4 1993/07/13 21:04:33 mh Exp $
#
# A dialog for making criteria for the sort(1) cmd
#

#
# -- Globals
#
set sortDialog(fieldnames) [lindex $argv 0]
set sortDialog(fieldflgs) [lindex $argv 1]
set sortDialog(msg_strings) {}

set sortDialog(sortcmd)  "sort -fb"
set sortDialog(tabcharacteropt) "-t|"

#
# -- Procs
#
proc Exit {x} {
    # destroy; # use if before tk3.3
    exit $x
}

#
# -- Callbacks
#
proc reset_cmd {} {
    global sortDialog
    clear_lists .sort.fields
    foreach fname $sortDialog(fieldnames) {
	make_lists .sort.fields $fname
    }
}
proc cancel_cmd {} {
    Exit 1
}

proc apply_cmd {lbname} {
    global sortDialog
    set sz [$lbname size]
    set rval "$sortDialog(sortcmd) $sortDialog(tabcharacteropt)"
    for {set x 0} {$x < $sz} {incr x 1} {
	set fname [$lbname get $x]
	set idx [lsearch $sortDialog(fieldnames) $fname]
	if {[llength $sortDialog(fieldflgs)] > $idx} {
	    set flgs [lindex $sortDialog(fieldflgs) $idx]
	} else {
	    set flgs ""
	}
	append rval [format " +%d%s -%d" $idx $flgs [expr $idx+1]]
    }
    puts stdout "$rval"
    Exit 0
}

proc fld_cmd {srcw y destw} {
    set idx [$srcw nearest $y]
    set ln [$srcw get $idx]
    if {"$ln" != ""} {
	$srcw delete $idx
	$destw insert end $ln
    }
}

#
# -- widget section
#

### -- root frame
frame .sort
pack append . .sort {}

### -- msg area
message .sort.msg -aspect 99999 \
  -text {Click on a item to move it from one box to another}
pack append .sort .sort.msg {top padx 4 pady 8}

### -- fields
frame .sort.fields
proc make_lists {parent fname} {
  global sortDialog

  if {![winfo exists $parent.l]} {
    frame $parent.l
    frame $parent.r
    pack append $parent $parent.l {left} $parent.r {right}

    set lbl(l) "Field Choices"
    set lbl(r) "Sorted as"
    foreach side {l r} {
	set p $parent.$side
	message $p.msg -anchor w -text $lbl($side): -aspect 10000
	scrollbar $p.sb -command "$p.list yview" -borderwidth 2 \
		-relief sunken
	listbox $p.list -yscroll "$p.sb set" -setgrid 1 \
		-relief sunken -borderwidth 2 \
		-geometry 30x6
	pack append $p \
		$p.msg {top fillx} \
		$p.sb {left filly} \
		$p.list {right expand fill}
	tk_listboxSingleSelect $p.list
    }
    bind $parent.l.list <B1-ButtonRelease> "fld_cmd %W %y $parent.r.list"
    bind $parent.r.list <B1-ButtonRelease> "fld_cmd %W %y $parent.l.list"
  }

  $parent.l.list insert end $fname
}

proc clear_lists {parent} {
    $parent.l.list delete 0 end
    $parent.r.list delete 0 end
}

foreach fname $sortDialog(fieldnames) {
    make_lists .sort.fields $fname
}

pack append .sort .sort.fields {top padx 4 pady 8}

### -- buttons
frame .sort.buttons
button .sort.buttons.reset -text Reset -command reset_cmd
button .sort.buttons.cancel -text Cancel -command cancel_cmd
button .sort.buttons.apply \
    -text Apply \
    -command "apply_cmd .sort.fields.r.list"

pack append .sort.buttons \
    .sort.buttons.reset {left} \
    .sort.buttons.cancel {left} \
    .sort.buttons.apply  {left}
pack append .sort .sort.buttons {}

#
# -- "main"
#
wm title . "Sort Dialog"
