# Jeden z projektów z laboratorium z programowania na drugim semestrze
# stanowiło mało ambitne zadanie utworzenia Klasy kontenerowej w C++
# opartej na wzorcach z pewnymi zadanymi regułami ;-)
# 
# Do celów prezentacji utworzyłem graficzny interfejs użytkownika
# oparty na Tcl/Tk. Ponieważ na serwerze na którym pracowaliśmy nie
# było bibliotek *.h dla Tcl/Tk opracowałem komunikację pomiędzy
# programem w C++ a graficznym interfejsem poprzez potok nazwany
# (nazwa w zmiennej TMP_FILE).  Komunikacja operała się na protokole
# tekstowym typu pytanie/odpowiedź.
# 
# Nie mogło to już podnieść mi oceny projektu, ale poznałem wtedy
# lepiej managery ułożenia zaimplementowane w Tk, co przydało się
# później w projekcie z administracji systemem UNIX, gdzie należało
# utworzyć w Perl+Tk interfejs do zarządznia użytkownikami i grupami.

#!/usr/bin/wish
# aplikajca do testowania PairSet

set TMP_FILE a.tmp
set LOG_FILE pair.log

# numer aktualnej zmiennej
set varNumber 0

# typ dla danej zmiennej
# typeOfA typeOfB

# wybranie zmiennej
# name - pod jaka zmienna przypisac numer ?
proc var_choose {w name} {
	set w $w

	tk_optionMenu $w $name A B C D E F
	pack $w -side left
}

# wybranie zmiennej
# name - pod jaka zmienna przypisac nazwe ?
proc typ_choose {w name} {
	tk_optionMenu $w $name\
	PairSet PairSetSorted PairSetParityDigits PairSetEqDigits\
	PairSet5 PairSet6
	pack $w -side left
}

proc lbl_print {w text} {
	label $w -text $text
	pack $w -side left
}

proc edit_print {w} {
	entry $w -width 5
	pack $w -side left
}

proc edit2_print {w} {
	entry $w -width 12
	pack $w -side left
}

proc btn_cmd {w txt cmd} {
	button $w -relief flat -text $txt -command $cmd
	pack $w -side left
}

proc btn_show_var {w var} {
	button $w -relief groove -text $var -command "model show $var"
	pack $w -side left
}

proc model args {
	global tmp_file log prog
	.d.output configure -text $args
	puts $prog $args
	flush $prog
	puts $log $args
	after 300 {
		gets $tmp_file tmp
		.d.output configure -text $tmp
		puts $log $tmp
	}
}

# gora
frame .u
pack .u -side top -fill x -expand false

# dol
frame .d -relief ridge -borderwidth 2
pack .d -side top -fill both -expand true

# operacje - metody klas
frame .u.ops -relief ridg -borderwidth 2
pack .u.ops -side left -expand true -fill x

#----------------------------------------------------------------------
set w .u.ops.konstr
frame $w
pack $w -fill x
var_choose $w.a1 ret1
btn_cmd $w.b1 {= new} {model new $ret1 $typ1}
typ_choose $w.tc1 typ1
lbl_print $w.l2 {();}

#----------------------------------------------------------------------
set w .u.ops.sum
frame $w
pack $w -fill x
var_choose $w.ret ret2
lbl_print $w.l1 {=}
var_choose $w.self self2
btn_cmd $w.b1 {.operator+(} {model + $ret2 $self2 $op2}
var_choose $w.op2 op2
lbl_print $w.l2 {);}


#----------------------------------------------------------------------
set w .u.ops.isec
frame $w
pack $w -fill x
var_choose $w.ret ret3
lbl_print $w.l1 {=}
var_choose $w.self self3
btn_cmd $w.b1 {.operator&(} {model & $ret3 $self3 $op3}
var_choose $w.op2 op3
lbl_print $w.l2 {);}

#----------------------------------------------------------------------
set w .u.ops.setter
frame $w
pack $w -fill x
var_choose $w.self self4
btn_cmd $w.b1 {.operator=(} {model = $self4 $op4}
var_choose $w.op2 op4
lbl_print $w.l2 {);}

#----------------------------------------------------------------------
set w .u.ops.idx
frame $w
pack $w -fill x
var_choose $w.self self5
btn_cmd $w.b1 {.operator[](} "model {idx} \$self5 \[$w.idx get\]"
edit_print $w.idx
lbl_print $w.l2 {);}

#----------------------------------------------------------------------
set w .u.ops.bool
frame $w
pack $w -fill x
var_choose $w.self self6
btn_cmd $w.b1 {.operator bool()} {model bool $self6}

#----------------------------------------------------------------------
set w .u.ops.size
frame $w
pack $w -fill x
var_choose $w.self self7
btn_cmd $w.b1 {.operator*();} {model * $self7}

#----------------------------------------------------------------------
set w .u.ops.clear
frame $w
pack $w -fill x
var_choose $w.self self8
btn_cmd $w.b1 {.clear();} {model clear $self8}

#----------------------------------------------------------------------
set w .u.ops.add
frame $w
pack $w -fill x
var_choose $w.self self9
btn_cmd $w.b1 {.operator+=} "model += \$self9 \[$w.a get\] \[$w.b get\]"
lbl_print $w.l1 {(Pair(}
edit_print $w.a
lbl_print $w.l2 {,}
edit_print $w.b
lbl_print $w.l3 {)}

#----------------------------------------------------------------------
set w .u.ops.load
frame $w
pack $w -fill x
var_choose $w.self self10
btn_cmd $w.b1 {wczytaj z pliku:} "model load \$self10 \[$w.name get\]"
edit2_print $w.name

#----------------------------------------------------------------------
set w .u.ops.save
frame $w
pack $w -fill x
var_choose $w.self self11
btn_cmd $w.b1 {zapisz do pliku:} "model save \$self11 \[$w.name get\]"
edit2_print $w.name

#----------------------------------------------------------------------
set w .u.ops.show
frame $w
pack $w -fill x

lbl_print $w.l3 {pokaż: }
foreach i {A B C D E F} {
	btn_show_var $w.window$i $i
}

#----------------------------------------------------------------------
# komendy np. Exit
frame .u.cmds -relief ridge -borderwidth 2
pack .u.cmds -side left -expand false -anchor ne -fill y
button .u.cmds.exit -text {Wyjście} -command {exit}
pack .u.cmds.exit

# wyjsciowy tekst
label .d.output -text {EMPTY} -justify right -background white -anchor nw\
	-height 4

pack .d.output -fill both -expand true

# exec mknod $TMP_FILE p

# set prog [open "|./exe $TMP_FILE" w]
# set tmp_file [open $TMP_FILE]

# set log [open $LOG_FILE w]

# exec rm $TMP_FILE

