#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

global widget;

image create bitmap dnarw -data  {
#define down_arrow_width 15
#define down_arrow_height 15
static char down_arrow_bits[] = {
	0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
	0x00,0x80,0xf8,0x8f,0xf0,0x87,0xe0,0x83,
	0xc0,0x81,0x80,0x80,0x00,0x80,0x00,0x80,
	0x00,0x80,0x00,0x80,0x00,0x80
	}
}

proc {set_default_fonts} {} {
global pref tcl_platform
if {[string toupper $tcl_platform(platform)]=="WINDOWS"} {
	set pref(font_normal) {"MS Sans Serif" 8}
	set pref(font_bold) {"MS Sans Serif" 8 bold}
	set pref(font_fix) {Terminal 8}
	set pref(font_italic) {"MS Sans Serif" 8 italic}
} else {
	set pref(font_normal) -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*
	set pref(font_bold) -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-*
	set pref(font_italic) -Adobe-Helvetica-Medium-O-Normal-*-*-120-*-*-*-*-*
	set pref(font_fix) -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-*
}
}

proc {set_gui_pref} {} {
global pref
foreach wid {Label Text Button Listbox Checkbutton Radiobutton} {
	option add *$wid.font $pref(font_normal)
}
option add *Entry.background #fefefe
option add *Entry.foreground #000000
}

proc {load_pref} {} {
global pref
set_default_fonts
set_gui_pref
set retval [catch {set fid [open "~/.pgaccessrc" r]}]
if {$retval} {
	set pref(rows) 200
	set pref(tvfont) clean
	set pref(autoload) 1
	set pref(lastdb) {}
	set pref(lasthost) localhost
	set pref(lastport) 5432
	set pref(username) {}
	set pref(password) {}
} else {
	while {![eof $fid]} {
		set pair [gets $fid]
		set pref([lindex $pair 0]) [lindex $pair 1]
	}
	close $fid
	set_gui_pref
}
}

proc init {argc argv} {
global dbc host pport tablist mw fldval activetab qlvar mwcount pref
load_pref
set host localhost
set pport 5432
set dbc {}
set tablist [list Tables Queries Views Sequences Functions Reports Forms Scripts Users]
set activetab {}
set qlvar(yoffs) 360
set qlvar(xoffs) 50
set qlvar(reswidth) 150
set qlvar(resfields) {}
set qlvar(ressort) {}
set qlvar(resreturn) {}
set qlvar(rescriteria) {}
set qlvar(restables) {}
set qlvar(critedit) 0
set qlvar(links) {}
set qlvar(ntables) 0
set qlvar(newtablename) {}
set mwcount 0
}

init $argc $argv

proc {sqlw_display} {msg} {
	if {![winfo exists .sqlw]} {return}
	.sqlw.f.t insert end "$msg\n\n"
	.sqlw.f.t see end
	set nrlines [lindex [split [.sqlw.f.t index end] .] 0]
	if {$nrlines>50} {
		.sqlw.f.t delete 1.0 3.0
	}
}

proc {wpg_exec} {db cmd} {
global pgsql
	set pgsql(cmd) "never executed"
	set pgsql(status) "no status yet"
	set pgsql(errmsg) "no error message yet"
	if {[catch {
		sqlw_display $cmd
		set pgsql(cmd) $cmd
		set pgsql(res) [pg_exec $db $cmd]
		set pgsql(status) [pg_result $pgsql(res) -status]
		set pgsql(errmsg) [pg_result $pgsql(res) -error]
	} tclerrmsg]} {
		show_error "Tcl error executing pg_exec $cmd\n\n$tclerrmsg"
		return 0
	}
	return $pgsql(res)
}

proc {wpg_select} {args} {
	sqlw_display "[lindex $args 1]"
	uplevel pg_select $args
}

proc {anfw:add} {} {
global anfw pgsql tiw
	if {$anfw(name)==""} {
		show_error "Empty field name ?"
		focus .anfw.e1
		return
	}		
	if {$anfw(type)==""} {
		show_error "No field type ?"
		focus .anfw.e2
		return
	}
	if {![sql_exec quiet "alter table \"$tiw(tablename)\" add column \"$anfw(name)\" $anfw(type)"]} {
		show_error "Cannot add column\n\nPostgreSQL error: $pgsql(errmsg)"
		return
	}
	Window destroy .anfw
	sql_exec quiet "update pga_layout set colnames=colnames || ' {$anfw(name)}', colwidth=colwidth || ' 150',nrcols=nrcols+1 where tablename='$tiw(tablename)'"
	show_table_information $tiw(tablename)
}

proc {add_new_field} {} {
global ntw
if {$ntw(fldname)==""} {
	show_error "Enter a field name"
	focus .nt.e2
	return
}
if {$ntw(fldtype)==""} {
	show_error "The field type is not specified!"
	return
}
if {($ntw(fldtype)=="varchar")&&($ntw(fldsize)=="")} {
	focus .nt.e3
	show_error "You must specify field size!"
	return
}
if {$ntw(fldsize)==""} then {set sup ""} else {set sup "($ntw(fldsize))"}
if {[regexp $ntw(fldtype) "varchartextdatetime"]} {set supc "'"} else {set supc ""}
if {$ntw(defaultval)==""} then {set sup2 ""} else {set sup2 " DEFAULT $supc$ntw(defaultval)$supc"}
# Checking for field name collision
set inspos end
for {set i 0} {$i<[.nt.lb size]} {incr i} {
	set linie [.nt.lb get $i]
	if {$ntw(fldname)==[string trim [string range $linie 2 33]]} {
		if {[tk_messageBox -title Warning -parent .nt -message "There is another field with the same name: \"$ntw(fldname)\"!\n\nReplace it ?" -type yesno -default yes]=="no"} return
		.nt.lb delete $i
		set inspos $i
		break
	}	 
  }
.nt.lb insert $inspos [format "%1s %-32.32s %-14s%-16s" $ntw(pk) $ntw(fldname) $ntw(fldtype)$sup $sup2$ntw(notnull)]
focus .nt.e2
set ntw(fldname) {}
set ntw(fldsize) {}
set ntw(defaultval) {}
set ntw(pk) " "
}

proc {create_table} {} {
global dbc ntw
if {$ntw(newtablename)==""} then {
	show_error "You must supply a name for your table!"
	focus .nt.etabn
	return
}
if {[.nt.lb size]==0} then {
	show_error "Your table has no fields!"
	focus .nt.e2
	return
}
set fl {}
set pkf {}
foreach line [.nt.lb get 0 end] {
	set fldname "\"[string trim [string range $line 2 33]]\""
	lappend fl "$fldname [string trim [string range $line 35 end]]"
	if {[string range $line 0 0]=="*"} {
		lappend pkf "$fldname"
	}
}
set temp "create table \"$ntw(newtablename)\" ([join $fl ,]"
if {$ntw(constraint)!=""} then {set temp "$temp, constraint \"$ntw(constraint)\""}
if {$ntw(check)!=""} then {set temp "$temp check ($ntw(check))"}
if {[llength $pkf]>0} then {set temp "$temp, primary key([join $pkf ,])"}
set temp "$temp)"
if {$ntw(fathername)!=""} then {set temp "$temp inherits ($ntw(fathername))"}
cursor_clock
if {[sql_exec noquiet $temp]} {
	Window destroy .nt
	cmd_Tables
}
cursor_normal
}

proc {cmd_Delete} {} {
global dbc activetab
if {$dbc==""} return;
set objtodelete [get_dwlb_Selection]
if {$objtodelete==""} return;
set temp {}
switch $activetab {
	Tables {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete table:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec noquiet "drop table \"$objtodelete\""
			sql_exec quiet "delete from pga_layout where tablename='$objtodelete'"
			cmd_Tables
		}
	}
	Views {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete view:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec noquiet "drop view \"$objtodelete\""
			sql_exec quiet "delete from pga_layout where tablename='$objtodelete'"
			cmd_Views
		}
	}
	Queries {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete query:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec quiet "delete from pga_queries where queryname='$objtodelete'"
			sql_exec quiet "delete from pga_layout where tablename='$objtodelete'"
			cmd_Queries
		}
	}
	Scripts {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete script:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec quiet "delete from pga_scripts where scriptname='$objtodelete'"
			cmd_Scripts
		}
	}
	Forms {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete form:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec quiet "delete from pga_forms where formname='$objtodelete'"
			cmd_Forms
		}
	}
	Sequences {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete sequence:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec quiet "drop sequence \"$objtodelete\""
			cmd_Sequences
		}
	}
	Functions {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete function:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			delete_function $objtodelete
			cmd_Functions
		}
	}
	Reports {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete report:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec noquiet "delete from pga_reports where reportname='$objtodelete'"
			cmd_Reports
		}
	}
	Users {
		if {[tk_messageBox -title "FINAL WARNING" -parent .dw -message "You are going to delete user:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} {
			sql_exec noquiet "drop user \"$objtodelete\""
			cmd_Users
		}
	}
}
if {$temp==""} return;
}

proc {cmd_Design} {} {
global dbc activetab rbvar uw
if {$dbc==""} return;
if {[.dw.lb curselection]==""} return;
set objname [.dw.lb get [.dw.lb curselection]]
set tablename $objname
switch $activetab {
	Queries {open_query design}
	Views {open_view_design}
	Scripts {design_script $objname}
	Forms {fd_load_form $objname design}
	Reports {
		Window show .rb
		tkwait visibility .rb
		rb_init
		set rbvar(reportname) $objname
		rb_load_report
		set rbvar(justpreview) 0
	}
	Users {
		Window show .uw
		tkwait visibility .uw
		wm transient .uw .dw
		wm title .uw "Design user"
		set uw(username) $objname
		set uw(password) {} ; set uw(verify) {}
		pg_select $dbc "select *,date(valuntil) as valdata from pg_user where usename='$objname'" tup {
			if {$tup(usesuper)=="t"} {
				set uw(createuser) CREATEUSER
			} else {
				set uw(createuser) NOCREATEUSER
			}
			if {$tup(usecreatedb)=="t"} {
				set uw(createdb) CREATEDB
			} else {
				set uw(createdb) NOCREATEDB
			}
			if {$tup(valuntil)!=""} {
				set uw(valid) $tup(valdata)
			} else {
				set uw(valid) {}
			}
		}
		.uw.e1 configure -state disabled
		.uw.b1 configure -text Alter
		focus .uw.e2
	}
}
}

proc {cmd_Forms} {} {
global dbc
cursor_clock
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select formname from pga_forms order by formname" rec {
		.dw.lb insert end $rec(formname)
	}
}
cursor_normal
}

proc {cmd_Functions} {} {
global dbc
set maxim 16384
cursor_clock
catch {
	wpg_select $dbc "select oid from pg_database where datname='template1'" rec {
		set maxim $rec(oid)
	}
}
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select proname from pg_proc where prolang=14 and oid>$maxim order by proname" rec {
		.dw.lb insert end $rec(proname)
	}	
}
cursor_normal
}

proc {cmd_Import_Export} {how} {
global dbc ie_tablename ie_filename activetab
if {$dbc==""} return;
Window show .iew
set ie_tablename {}
set ie_filename {}
set ie_delimiter {}
if {$activetab=="Tables"} {
	set tn [get_dwlb_Selection]
	set ie_tablename $tn
	if {$tn!=""} {set ie_filename "$tn.txt"}
}
.iew.expbtn configure -text $how
}

proc {cmd_Information} {} {
global dbc tiw activetab
if {$dbc==""} return;
if {$activetab!="Tables"} return;
show_table_information [get_dwlb_Selection]
}

proc {cmd_New} {} {
global dbc activetab queryname queryoid cbv funcpar funcname funcret rbvar uw
if {$dbc==""} return;
switch $activetab {
	Tables {
		Window show .nt
		focus .nt.etabn
	}
	Queries {
		Window show .qb
		set queryoid 0
		set queryname {}
		set cbv 0
		.qb.cbv configure -state normal
	}
	Users {
		Window show .uw
		wm transient .uw .dw
		set uw(username) {}
		set uw(password) {}
		set uw(createdb) NOCREATEDB
		set uw(createuser) NOCREATEUSER
		set uw(verify) {}
		set uw(valid) {}
		focus .uw.e1
	}
	Views {
	set queryoid 0
	set queryname {}
		Window show .qb
		set cbv 1
		.qb.cbv configure -state disabled
	}
	Sequences {
	Window show .sqf
	focus .sqf.e1
	}
	Reports {
	Window show .rb ; tkwait visibility .rb ; rb_init ; set rbvar(reportname) {} ; set rbvar(justpreview) 0
	focus .rb.e2
	}
	Forms {
		Window show .fd
		Window show .fdtb
		Window show .fdmenu
		Window show .fda
		fd_init
	}
	Scripts {
		design_script {}
	}
	Functions {
	Window show .fw
	set funcname {}
	set funcpar {}
	set funcret {}
	place .fw.okbtn -y 255
	.fw.okbtn configure -state normal
	.fw.okbtn configure -text Define
	.fw.text1 delete 1.0 end
	focus .fw.e1
	}
}
}

proc {cmd_Open} {} {
global dbc activetab
if {$dbc==""} return;
set objname [get_dwlb_Selection]
if {$objname==""} return;
switch $activetab {
	Tables {open_table $objname}
	Forms {open_form $objname}
	Scripts {execute_script $objname}
	Queries {open_query view}
	Views {open_view}
	Sequences {open_sequence $objname}
	Functions {open_function $objname}
	Reports {open_report $objname}
}
}

proc {cmd_Preferences} {} {
Window show .pw
}

proc {cmd_Queries} {} {
global dbc
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select queryname from pga_queries order by queryname" rec {
		.dw.lb insert end $rec(queryname)
	}
}
}

proc {uw:create_user} {} {
global dbc uw
set uw(username) [string trim $uw(username)]
set uw(password) [string trim $uw(password)]
set uw(verify) [string trim $uw(verify)]
if {$uw(username)==""} {
	show_error "User without name!"
	focus .uw.e1
	return
}
if {$uw(password)!=$uw(verify)} {
	show_error "Passwords do not match!"
	set uw(password) {} ; set uw(verify) {}
	focus .uw.e2
	return
}
set cmd "[.uw.b1 cget -text] user \"$uw(username)\""
if {$uw(password)!=""} {
	set cmd "$cmd WITH PASSWORD \"$uw(password)\" "
}
set cmd "$cmd $uw(createdb) $uw(createuser)"
if {$uw(valid)!=""} {
	set cmd "$cmd VALID UNTIL '$uw(valid)'"
}
if {[sql_exec noquiet $cmd]} {
	Window destroy .uw
	cmd_Users
}
}

proc {cmd_Rename} {} {
global dbc oldobjname activetab
if {$dbc==""} return;
if {$activetab=="Views"} return;
if {$activetab=="Sequences"} return;
if {$activetab=="Functions"} return;
if {$activetab=="Users"} return;
set temp [get_dwlb_Selection]
if {$temp==""} {
	tk_messageBox -title Warning -parent .dw -message "Please select an object first !"
	return;
}
set oldobjname $temp
Window show .rf
}

proc {cmd_Reports} {} {
global dbc
cursor_clock
catch {
	wpg_select $dbc "select reportname from pga_reports order by reportname" rec {
	.dw.lb insert end "$rec(reportname)"
	}
}
cursor_normal
}

proc {cmd_Users} {} {
global dbc
cursor_clock
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select * from pg_user order by usename" rec {
		.dw.lb insert end $rec(usename)
	}
}
cursor_normal
}

proc {cmd_Scripts} {} {
global dbc
cursor_clock
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select scriptname from pga_scripts order by scriptname" rec {
	.dw.lb insert end $rec(scriptname)
	}
}
cursor_normal
}

proc {cmd_Sequences} {} {
global dbc

cursor_clock
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select relname from pg_class where (relname not like 'pg_%') and (relkind='S') order by relname" rec {
		.dw.lb insert end $rec(relname)
	}
}
cursor_normal
}

proc {cmd_Tables} {} {
global dbc
cursor_clock
.dw.lb delete 0 end
foreach tbl [get_tables] {.dw.lb insert end $tbl}
cursor_normal
}

proc {cmd_Views} {} {
global dbc
cursor_clock
.dw.lb delete 0 end
catch {
	wpg_select $dbc "select c.relname,count(c.relname) from pg_class C, pg_rewrite R where (relname !~ '^pg_') and (r.ev_class = C.oid) and (r.ev_type = '1') group by relname" rec {
		if {$rec(count)!=0} {
			set itsaview($rec(relname)) 1
		}
	}
	wpg_select $dbc "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') and (relhasrules) order by relname" rec {
		if {[info exists itsaview($rec(relname))]} {
			.dw.lb insert end $rec(relname)
		}
	}
}
cursor_normal
}

proc {create_drop_down} {base x y w} {
global pref
if {[winfo exists $base.ddf]} {
    return
}
frame $base.ddf -borderwidth 1 -height 75 -relief raised -width 55
listbox $base.ddf.lb -background #fefefe -foreground #000000 -selectbackground #c3c3c3 -borderwidth 1  -font $pref(font_normal)  -highlightthickness 0 -selectborderwidth 0 -yscrollcommand [subst {$base.ddf.sb set}]
scrollbar $base.ddf.sb -borderwidth 1 -command [subst {$base.ddf.lb yview}] -highlightthickness 0 -orient vert
place $base.ddf -x $x -y $y -width $w -height 185 -anchor nw -bordermode ignore
place $base.ddf.lb -x 1 -y 1 -width [expr $w-18] -height 182 -anchor nw -bordermode ignore
place $base.ddf.sb -x [expr $w-15] -y 1 -width 14 -height 183 -anchor nw -bordermode ignore
}

proc {cursor_normal} {} {
	foreach wn [winfo children .] {
		catch {$wn configure -cursor left_ptr}
	}
	update ; update idletasks 
}

proc {cursor_clock} {} {
	foreach wn [winfo children .] {
		catch {$wn configure -cursor watch}
	}
	update ; update idletasks 
}

proc {delete_function} {objname} {
global dbc
wpg_select $dbc "select proargtypes,pronargs from pg_proc where proname='$objname'" rec {
	set funcpar $rec(proargtypes)
	set nrpar $rec(pronargs)
}
set lispar {}
for {set i 0} {$i<$nrpar} {incr i} {
	lappend lispar [get_pgtype [lindex $funcpar $i]]
}
set lispar [join $lispar ,]
sql_exec noquiet "drop function $objname ($lispar)"
}

proc {design_script} {sname} {
global dbc scriptname
Window show .sw
set scriptname $sname
.sw.src delete 1.0 end
if {[string length $sname]==0} return;
wpg_select $dbc "select * from pga_scripts where scriptname='$sname'" rec {
	.sw.src insert end $rec(scriptsource)    
}
}

proc {drag_it} {w x y} {
global draglocation
	set dlo ""
	catch { set dlo $draglocation(obj) }
	if {$dlo != ""} {
		set dx [expr $x - $draglocation(x)]
		set dy [expr $y - $draglocation(y)]
		$w move $dlo $dx $dy
		set draglocation(x) $x
		set draglocation(y) $y
	}
}

proc {drag_start} {wn w x y} {
global draglocation
catch {unset draglocation}
set object [$w find closest $x $y]
if {[lsearch [$wn.c gettags $object] movable]==-1} return;
$wn.c bind movable <Leave> {}
set draglocation(obj) $object
set draglocation(x) $x
set draglocation(y) $y
set draglocation(start) $x
}

proc {drag_stop} {wn w x y} {
global draglocation mw dbc
	set dlo ""
	catch { set dlo $draglocation(obj) }
	if {$dlo != ""} {
		$wn.c bind movable <Leave> "$wn configure -cursor left_ptr"
		$wn configure -cursor left_ptr
		set ctr [get_tag_info $wn $draglocation(obj) v]
		set diff [expr $x-$draglocation(start)]
		if {$diff==0} return;
		set newcw {}
		for {set i 0} {$i<$mw($wn,colcount)} {incr i} {
			if {$i==$ctr} {
				lappend newcw [expr [lindex $mw($wn,colwidth) $i]+$diff]
			} else {
				lappend newcw [lindex $mw($wn,colwidth) $i]
			}
		}
		set mw($wn,colwidth) $newcw
		$wn.c itemconfigure c$ctr -width [expr [lindex $mw($wn,colwidth) $ctr]-5]
		mw_draw_headers $wn
		mw_draw_hgrid $wn
		if {$mw($wn,crtrow)!=""} {mw_show_record $wn $mw($wn,crtrow)}
		for {set i [expr $ctr+1]} {$i<$mw($wn,colcount)} {incr i} {
			$wn.c move c$i $diff 0
		}
		cursor_clock
		sql_exec quiet "update pga_layout set colwidth='$mw($wn,colwidth)' where tablename='$mw($wn,layout_name)'"
		cursor_normal
	}
}

proc {draw_tabs} {} {
global tablist activetab
set ypos 85
foreach tab $tablist {
	label .dw.tab$tab -borderwidth 1  -anchor w -relief raised -text $tab
	place .dw.tab$tab -x 10 -y $ypos -height 25 -width 82 -anchor nw -bordermode ignore
	lower .dw.tab$tab
	bind .dw.tab$tab <Button-1> {tab_click %W}
	incr ypos 25
}
set activetab ""
}

proc {execute_script} {scriptname} {
global dbc
	set ss {}
	wpg_select $dbc "select * from pga_scripts where scriptname='$scriptname'" rec {
		set ss $rec(scriptsource)
	}
    if {[string length $ss] > 0} {
		eval $ss
    }
}

proc {fd_change_coord} {} {
global fdvar fdobj
set i $fdvar(moveitemobj)
set c $fdobj($i,c)
set c [list $fdvar(c_left) $fdvar(c_top) [expr $fdvar(c_left)+$fdvar(c_width)] [expr $fdvar(c_top)+$fdvar(c_height)]]
set fdobj($i,c) $c
.fd.c delete o$i
fd_draw_object $i
fd_draw_hookers $i
}

proc {fd_delete_object} {} {
global fdvar
set i $fdvar(moveitemobj)
.fd.c delete o$i
.fd.c delete hook
set j [lsearch $fdvar(objlist) $i]
set fdvar(objlist) [lreplace $fdvar(objlist) $j $j]
}

proc {fd_draw_hook} {x y} {
.fd.c create rectangle [expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2] -fill black -tags hook
}

proc {fd_draw_hookers} {i} {
global fdobj
foreach {x1 y1 x2 y2} $fdobj($i,c) {}
.fd.c delete hook
fd_draw_hook $x1 $y1
fd_draw_hook $x1 $y2
fd_draw_hook $x2 $y1
fd_draw_hook $x2 $y2
}

proc {fd_draw_object} {i} {
global fdvar fdobj pref
set c $fdobj($i,c)
foreach {x1 y1 x2 y2} $c {}
.fd.c delete o$i
switch $fdobj($i,t) {
	button {
		fd_draw_rectangle $x1 $y1 $x2 $y2 raised #a0a0a0 o$i
		.fd.c create text [expr ($x1+$x2)/2] [expr ($y1+$y2)/2] -text $fdobj($i,l) -font $pref(font_normal) -tags o$i
	}
	text {
		fd_draw_rectangle $x1 $y1 $x2 $y2 sunken #a0a0a0 o$i
	}
	entry {
		fd_draw_rectangle $x1 $y1 $x2 $y2 sunken white o$i
	}
	label {
		.fd.c create text $x1 $y1 -text $fdobj($i,l) -font $pref(font_normal) -anchor nw -tags o$i
	}
	checkbox {
		fd_draw_rectangle [expr $x1+2] [expr $y1+5] [expr $x1+12] [expr $y1+15] raised #a0a0a0 o$i
		.fd.c create text [expr $x1+20] [expr $y1+3] -text $fdobj($i,l) -anchor nw -font $pref(font_normal) -tags o$i
	}
	radio {
		.fd.c create oval [expr $x1+4] [expr $y1+5] [expr $x1+14] [expr $y1+15] -fill white -tags o$i
		.fd.c create text [expr $x1+24] [expr $y1+3] -text $fdobj($i,l) -anchor nw -font $pref(font_normal) -tags o$i
	}
	query {
		.fd.c create oval $x1 $y1 [expr $x1+20] [expr $y1+20] -fill white -tags o$i
		.fd.c create text [expr $x1+5] [expr $y1+4] -text Q  -anchor nw -font $pref(font_normal) -tags o$i
	}
	listbox {
		fd_draw_rectangle $x1 $y1 [expr $x2-12] $y2 sunken white o$i
		fd_draw_rectangle [expr $x2-11] $y1 $x2 $y2 sunken gray o$i
		.fd.c create line [expr $x2-5] $y1 $x2 [expr $y1+10] -fill #808080 -tags o$i
		.fd.c create line [expr $x2-10] [expr $y1+9] $x2 [expr $y1+9] -fill #808080 -tags o$i
		.fd.c create line [expr $x2-10] [expr $y1+9] [expr $x2-5] $y1 -fill white -tags o$i
		.fd.c create line [expr $x2-5] $y2 $x2 [expr $y2-10] -fill #808080 -tags o$i
		.fd.c create line [expr $x2-10] [expr $y2-9] $x2 [expr $y2-9] -fill white -tags o$i
		.fd.c create line [expr $x2-10] [expr $y2-9] [expr $x2-5] $y2 -fill white -tags o$i
	}
}
.fd.c raise hook
}

proc {fd_draw_rectangle} {x1 y1 x2 y2 relief color tag} {
if {$relief=="raised"} {
	set c1 white
	set c2 #606060
} else {
	set c1 #606060
	set c2 white
}
if {$color != "none"} {
	.fd.c create rectangle $x1 $y1 $x2 $y2 -outline "" -fill $color -tags $tag
}
.fd.c create line $x1 $y1 $x2 $y1 -fill $c1 -tags $tag
.fd.c create line $x1 $y1 $x1 $y2 -fill $c1 -tags $tag
.fd.c create line $x1 $y2 $x2 $y2 -fill $c2 -tags $tag
.fd.c create line $x2 $y1 $x2 [expr 1+$y2] -fill $c2 -tags $tag
}

proc {fd_init} {} {
global fdvar fdobj
catch {unset fdvar}
catch {unset fdobj}
catch {.fd.c delete all}
set fdvar(forminame) {udf0}
set fdvar(formname) "New form"
set fdvar(objnum) 0
set fdvar(objlist) {}
set fdvar(oper) none
set fdvar(tool) point
}

proc {fd_item_click} {x y} {
global fdvar fdobj
set fdvar(oper) none
set fdvar(moveitemobj) {}
set il [.fd.c find overlapping $x $y $x $y]
if {[llength $il]==0} return
set tl [.fd.c gettags [lindex $il 0]]
set i [lsearch -glob $tl o*]
if {$i==-1} return
set objnum [string range [lindex $tl $i] 1 end]
set fdvar(moveitemobj) $objnum
set fdvar(moveitemx) $x
set fdvar(moveitemy) $y
set fdvar(oper) move
fd_show_attributes $objnum
fd_draw_hookers $objnum
}

proc {fd_load_form} {name mode} {
global fdvar fdobj dbc
fd_init
set fdvar(formname) $name
if {$mode=="design"} {
	Window show .fd
	Window show .fdmenu
	Window show .fda
	Window show .fdtb
}
#set fid [open "$name.form" r]
#set info [gets $fid]
#close $fid
set res [wpg_exec $dbc "select * from pga_forms where formname='$fdvar(formname)'"]
set info [lindex [pg_result $res -getTuple 0] 1]
pg_result $res -clear
set fdvar(forminame) [lindex $info 0]
set fdvar(objnum) [lindex $info 1]
set fdvar(objlist) [lindex $info 2]
set fdvar(geometry) [lindex $info 3]
set j 0
foreach objinfo [lrange $info 4 end] {
	foreach {t n c x l v} $objinfo {}
	set i [lindex $fdvar(objlist) $j]
	set fdobj($i,t) $t
	set fdobj($i,n) $n
	set fdobj($i,c) $c
	set fdobj($i,l) $l
	set fdobj($i,x) $x
	set fdobj($i,v) $v
	if {$mode=="design"} {fd_draw_object $i}
	incr j
}
if {$mode=="design"} {wm geometry .fd $fdvar(geometry)}
}

proc {fd_mouse_down} {x y} {
global fdvar
set x [expr 3*int($x/3)]
set y [expr 3*int($y/3)]
set fdvar(xstart) $x
set fdvar(ystart) $y
if {$fdvar(tool)=="point"} {
	fd_item_click $x $y
	return
}
set fdvar(oper) draw
}

proc {fd_mouse_move} {x y} {
global fdvar
#set fdvar(msg) "x=$x y=$y"
set x [expr 3*int($x/3)]
set y [expr 3*int($y/3)]
set oper ""
catch {set oper $fdvar(oper)}
if {$oper=="draw"} {
	catch {.fd.c delete curdraw}
	.fd.c create rectangle $fdvar(xstart) $fdvar(ystart) $x $y -tags curdraw
	return
}
if {$oper=="move"} {
	set dx [expr $x-$fdvar(moveitemx)]
	set dy [expr $y-$fdvar(moveitemy)]
	.fd.c move o$fdvar(moveitemobj) $dx $dy
	.fd.c move hook $dx $dy
	set fdvar(moveitemx) $x
	set fdvar(moveitemy) $y
}
}

proc {fd_mouse_up} {x y} {
global fdvar fdobj
set x [expr 3*int($x/3)]
set y [expr 3*int($y/3)]
if {$fdvar(oper)=="move"} {
	set fdvar(moveitem) {}
	set fdvar(oper) none
	set oc $fdobj($fdvar(moveitemobj),c)
	set dx [expr $x - $fdvar(xstart)]
	set dy [expr $y - $fdvar(ystart)]
	set newcoord [list [expr $dx+[lindex $oc 0]] [expr $dy+[lindex $oc 1]] [expr $dx+[lindex $oc 2]] [expr $dy+[lindex $oc 3]]]
	set fdobj($fdvar(moveitemobj),c) $newcoord
	fd_show_attributes $fdvar(moveitemobj)
	fd_draw_hookers $fdvar(moveitemobj)
	return
}
if {$fdvar(oper)!="draw"} return
set fdvar(oper) none
.fd.c delete curdraw
# Check for x2<x1 or y2<y1
if {$x<$fdvar(xstart)} {set temp $x ; set x $fdvar(xstart) ; set fdvar(xstart) $temp}
if {$y<$fdvar(ystart)} {set temp $y ; set y $fdvar(ystart) ; set fdvar(ystart) $temp}
# Check for too small sizes
if {[expr $x-$fdvar(xstart)]<20} {set x [expr $fdvar(xstart)+20]}
if {[expr $y-$fdvar(ystart)]<10} {set y [expr $fdvar(ystart)+10]}
incr fdvar(objnum)
set i $fdvar(objnum)
lappend fdvar(objlist) $i
# t=type , c=coords , n=name , l=label
set fdobj($i,t) $fdvar(tool)
set fdobj($i,c) [list $fdvar(xstart) $fdvar(ystart) $x $y]
set fdobj($i,n) $fdvar(tool)$i
set fdobj($i,l) $fdvar(tool)$i
set fdobj($i,x) {}
set fdobj($i,v) {}
fd_draw_object $i
fd_show_attributes $i
set fdvar(moveitemobj) $i
fd_draw_hookers $i
set fdvar(tool) point
}

proc {fd_save_form} {name} {
global fdvar fdobj dbc
if {[tk_messageBox -title Warning -message "Do you want to save the form into the database ?" -type yesno -default yes]=="no"} {return 1}
if {[string length $fdvar(forminame)]==0} {
	tk_messageBox -title Warning -message "Forms need an internal name, only literals, low case"
	return 0
}
if {[string length $fdvar(formname)]==0} {
	tk_messageBox -title Warning -message "Form must have a name"
	return 0
}
set info [list $fdvar(forminame) $fdvar(objnum) $fdvar(objlist) [wm geometry .fd]]
foreach i $fdvar(objlist) {
	lappend info [list $fdobj($i,t) $fdobj($i,n) $fdobj($i,c) $fdobj($i,x) $fdobj($i,l) $fdobj($i,v)]
}
sql_exec noquiet "delete from pga_forms where formname='$fdvar(formname)'"
regsub -all "'" $info "''" info
sql_exec noquiet "insert into pga_forms values ('$fdvar(formname)','$info')"
cmd_Forms
return 1
}

proc {fd_set_command} {} {
global fdobj fdvar
set i $fdvar(moveitemobj)
set fdobj($i,x) $fdvar(c_cmd)
}

proc {fd_set_name} {} {
global fdvar fdobj
set i $fdvar(moveitemobj)
foreach k $fdvar(objlist) {
	if {($fdobj($k,n)==$fdvar(c_name)) && ($i!=$k)} {
		tk_messageBox -title Warning -message "There is another object (a $fdobj($k,t)) with the same name. Please change it!"
		return
	}
}
set fdobj($i,n) $fdvar(c_name)
fd_show_attributes $i
}

proc {fd_set_text} {} {
global fdvar fdobj
set fdobj($fdvar(moveitemobj),l) $fdvar(c_text)
fd_draw_object $fdvar(moveitemobj)
}

proc {fd_show_attributes} {i} {
global fdvar fdobj
set fdvar(c_info) "$fdobj($i,t) .$fdvar(forminame).$fdobj($i,n)"
set fdvar(c_name) $fdobj($i,n)
set c $fdobj($i,c)
set fdvar(c_top) [lindex $c 1]
set fdvar(c_left) [lindex $c 0]
set fdvar(c_width) [expr [lindex $c 2]-[lindex $c 0]]
set fdvar(c_height) [expr [lindex $c 3]-[lindex $c 1]]
set fdvar(c_cmd) {}
catch {set fdvar(c_cmd) $fdobj($i,x)}
set fdvar(c_var) {}
catch {set fdvar(c_var) $fdobj($i,v)}
set fdvar(c_text) {}
catch {set fdvar(c_text) $fdobj($i,l)}
}

proc {fd_test} {} {
global fdvar fdobj dbc datasets pref
set basewp $fdvar(forminame)
set base .$fdvar(forminame)
if {[winfo exists $base]} {
   wm deiconify $base; return
}
toplevel $base -class Toplevel
wm focusmodel $base passive
wm geometry $base $fdvar(geometry)
wm maxsize $base 785 570
wm minsize $base 1 1
wm overrideredirect $base 0
wm resizable $base 1 1
wm deiconify $base
wm title $base $fdvar(formname)
foreach item $fdvar(objlist) {
set coord $fdobj($item,c)
set name $fdobj($item,n)
set wh "-width [expr 3+[lindex $coord 2]-[lindex $coord 0]]  -height [expr 3+[lindex $coord 3]-[lindex $coord 1]]"
set visual 1
switch $fdobj($item,t) {
	button {
		set cmd {}
		catch {set cmd $fdobj($item,x)}
		button $base.$name  -borderwidth 1 -padx 0 -pady 0 -text "$fdobj($item,l)" -font $pref(font_normal) -command [subst {$cmd}]
	}
	checkbox {
		checkbutton  $base.$name -onvalue t -offvalue f -font $pref(font_normal) -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -borderwidth 1
		set wh {}
	}
	query {
		set visual 0
	set datasets($base.$name,sql) $fdobj($item,x)
		eval "proc $base.$name:open {} {\
			global dbc datasets tup$basewp$name ;\
			catch {unset tup$basewp$name} ;\
			set wn \[focus\] ; cursor_clock ;\
			set res \[wpg_exec \$dbc \"\$datasets($base.$name,sql)\"\] ;\
			pg_result \$res -assign tup$basewp$name ;\
			set fl {} ;\
			foreach fd \[pg_result \$res -lAttributes\] {lappend fl \[lindex \$fd 0\]} ;\
			set datasets($base.$name,fields) \$fl ;\
			set datasets($base.$name,recno) 0 ;\
			set datasets($base.$name,nrecs) \[pg_result \$res -numTuples\] ;\
			cursor_normal ;\
		}"
		eval "proc $base.$name:setsql {sqlcmd} {\
			global datasets ;\
			set datasets($base.$name,sql) \$sqlcmd ;\
		}"
		eval "proc $base.$name:nrecords {} {\
			global datasets ;\
			return \$datasets($base.$name,nrecs) ;\
		}"
		eval "proc $base.$name:crtrecord {} {\
			global datasets ;\
			return \$datasets($base.$name,recno) ;\
		}"
		eval "proc $base.$name:moveto {newrecno} {\
			global datasets ;\
			set datasets($base.$name,recno) \$newrecno ;\
		}"
		eval "proc $base.$name:close {} {
			global tup$basewp$name ;\
			catch {unset tup$basewp$name };\
		}"
		eval "proc $base.$name:fields {} {\
			global datasets ;\
			return \$datasets($base.$name,fields) ;\
		}"
		eval "proc $base.$name:fill {lb fld} {\
			global datasets tup$basewp$name ;\
			\$lb delete 0 end ;\
			for {set i 0} {\$i<\$datasets($base.$name,nrecs)} {incr i} {\
				\$lb insert end \$tup$basewp$name\(\$i,\$fld\) ;\
			}
		}"
		eval "proc $base.$name:movefirst {} {global datasets ; set datasets($base.$name,recno) 0}"
		eval "proc $base.$name:movenext {} {global datasets ; incr datasets($base.$name,recno) ; if {\$datasets($base.$name,recno)==\[$base.$name:nrecords\]} {$base.$name:movelast}}"
		eval "proc $base.$name:moveprevious {} {global datasets ; incr datasets($base.$name,recno) -1 ; if {\$datasets($base.$name,recno)==-1} {$base.$name:movefirst}}"
		eval "proc $base.$name:movelast {} {global datasets ; set datasets($base.$name,recno) \[expr \[$base.$name:nrecords\] -1\]}"
		eval "proc $base.$name:updatecontrols {} {\
			global datasets tup$basewp$name ;\
			set i \$datasets($base.$name,recno) ;\
			foreach fld \$datasets($base.$name,fields) {\
				catch {\
					upvar $basewp$name\(\$fld\) dbvar ;\
					set dbvar \$tup$basewp$name\(\$i,\$fld\) ;\
				}\
			}\
		}"
		eval "proc $base.$name:clearcontrols {} {\
			global datasets ;\
			catch { foreach fld \$datasets($base.$name,fields) {\
				catch {\
					upvar $basewp$name\(\$fld\) dbvar ;\
					set dbvar {} ;\
				}\
			}}\
		}"
	}
	radio {
		radiobutton  $base.$name -font $pref(font_normal) -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -value "$name" -borderwidth 1
		set wh {}
	}
	entry {
		set var {} ; catch {set var $fdobj($item,v)}
		entry $base.$name -bo 1 -ba white -selectborderwidth 0  -highlightthickness 0 
		if {$var!=""} {$base.$name configure -textvar $var}
	}
	text {
		text $base.$name -font $pref(font_normal) -borderwidth 1
	}
	label {
		set wh {}
		label $base.$name -font $pref(font_normal) -anchor nw -padx 0 -pady 0 -text $fdobj($item,l)
	set var {} ; catch {set var $fdobj($item,v)}
	if {$var!=""} {$base.$name configure -textvar $var}
	}
	listbox {
		listbox $base.$name -borderwidth 1 -background white  -highlightthickness 0 -selectborderwidth 0 -font $pref(font_normal) -yscrollcommand [subst {$base.sb$name set}]
	scrollbar $base.sb$name -borderwidth 1 -command [subst {$base.$name yview}] -orient vert  -highlightthickness 0
	eval [subst "place $base.sb$name -x [expr [lindex $coord 2]-14] -y [expr [lindex $coord 1]-1] -width 16 -height [expr 3+[lindex $coord 3]-[lindex $coord 1]] -anchor nw -bordermode ignore"]
	}
}
if $visual {eval [subst "place $base.$name  -x [expr [lindex $coord 0]-1] -y [expr [lindex $coord 1]-1] -anchor nw $wh -bordermode ignore"]}
}
}



proc {get_dwlb_Selection} {} {
set temp [.dw.lb curselection]
if {$temp==""} return "";
return [.dw.lb get $temp]
}

proc {get_pgtype} {oid} {
global dbc
set temp "unknown"
wpg_select $dbc "select typname from pg_type where oid=$oid" rec {
	set temp $rec(typname)
}
return $temp
}

proc {get_tables} {} {
global dbc
set tbl {}
if {[catch {
	wpg_select $dbc "select c.relname,count(c.relname) from pg_class C, pg_rewrite R where (relname !~ '^pg_') and (r.ev_class = C.oid) and (r.ev_type = '1') group by relname" rec {
		if {$rec(count)!=0} {
			set itsaview($rec(relname)) 1
		}
	}
	wpg_select $dbc "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') order by relname" rec {
		if {![regexp "^pga_" $rec(relname)]} then {
			if {![info exists itsaview($rec(relname))]} {
				lappend tbl $rec(relname)
			}
		}
	}
} gterrmsg]} {
	show_error $gterrmsg
}
return $tbl
}

proc {get_tag_info} {wn itemid prefix} {
set taglist [$wn.c itemcget $itemid -tags]
set i [lsearch -glob $taglist $prefix*]
set thetag [lindex $taglist $i]
return [string range $thetag 1 end]
}

proc {mw_canvas_click} {wn x y} {
global mw
if {![mw_exit_edit $wn]} return
# Determining row
for {set row 0} {$row<$mw($wn,nrecs)} {incr row} {
	if {[lindex $mw($wn,rowy) $row]>$y} break
}
incr row -1
if {$y>[lindex $mw($wn,rowy) $mw($wn,last_rownum)]} {set row $mw($wn,last_rownum)}
if {$row<0} return
set mw($wn,row_edited) $row
set mw($wn,crtrow) $row
mw_show_record $wn $row
if {$mw($wn,errorsavingnew)} return
# Determining column
set posx [expr -$mw($wn,leftoffset)]
set col 0
foreach cw $mw($wn,colwidth) {
	incr posx [expr $cw+2]
	if {$x<$posx} break
	incr col
}
set itlist [$wn.c find withtag r$row]
foreach item $itlist {
	if {[get_tag_info $wn $item c]==$col} {
		mw_start_edit $wn $item $x $y
		break
	}
}
}

proc {mw_delete_record} {wn} {
global dbc mw
if {!$mw($wn,updatable)} return;
if {![mw_exit_edit $wn]} return;
set taglist [$wn.c gettags hili]
if {[llength $taglist]==0} return;
set rowtag [lindex $taglist [lsearch -regexp $taglist "^r"]]
set row [string range $rowtag 1 end]
set oid [lindex $mw($wn,keylist) $row]
if {[tk_messageBox -title "FINAL WARNING" -icon question -parent $wn -message "Delete current record ?" -type yesno -default no]=="no"} return
if {[sql_exec noquiet "delete from \"$mw($wn,tablename)\" where oid=$oid"]} {
	$wn.c delete hili
}
}

proc {mw_draw_headers} {wn} {
global mw pref
$wn.c delete header
set posx [expr 5-$mw($wn,leftoffset)]
for {set i 0} {$i<$mw($wn,colcount)} {incr i} {
	set xf [expr $posx+[lindex $mw($wn,colwidth) $i]]
	$wn.c create rectangle $posx 1 $xf 22 -fill #CCCCCC -outline "" -width 0 -tags header
	$wn.c create text [expr $posx+[lindex $mw($wn,colwidth) $i]*1.0/2] 14 -text [lindex $mw($wn,colnames) $i] -tags header -fill navy -font $pref(font_normal)
	$wn.c create line $posx 22 [expr $xf-1] 22 -fill #AAAAAA -tags header
	$wn.c create line [expr $xf-1] 5 [expr $xf-1] 22 -fill #AAAAAA -tags header
	$wn.c create line [expr $xf+1] 5 [expr $xf+1] 22 -fill white -tags header
	$wn.c create line $xf -15000 $xf 15000 -fill #CCCCCC -tags [subst {header movable v$i}]
	set posx [expr $xf+2]
}
set mw($wn,r_edge) $posx
$wn.c bind movable <Button-1> "drag_start $wn %W %x %y"
$wn.c bind movable <B1-Motion> {drag_it %W %x %y}
$wn.c bind movable <ButtonRelease-1> "drag_stop $wn %W %x %y"
$wn.c bind movable <Enter> "$wn configure -cursor left_side"
$wn.c bind movable <Leave> "$wn configure -cursor left_ptr"
}

proc {mw_draw_hgrid} {wn} {
global mw
$wn.c delete hgrid
set posx 10
for {set j 0} {$j<$mw($wn,colcount)} {incr j} {
	set ledge($j) $posx
	incr posx [expr [lindex $mw($wn,colwidth) $j]+2]
	set textwidth($j) [expr [lindex $mw($wn,colwidth) $j]-5]
}
incr posx -6
for {set i 0} {$i<$mw($wn,nrecs)} {incr i} {
	$wn.c create line [expr -$mw($wn,leftoffset)] [lindex $mw($wn,rowy) [expr $i+1]] [expr $posx-$mw($wn,leftoffset)] [lindex $mw($wn,rowy) [expr $i+1]] -fill gray -tags [subst {hgrid g$i}]
}
if {$mw($wn,updatable)} {
	set i $mw($wn,nrecs)
	set posy [expr 14+[lindex $mw($wn,rowy) $mw($wn,nrecs)]]
	$wn.c create line [expr -$mw($wn,leftoffset)] $posy [expr $posx-$mw($wn,leftoffset)] $posy -fill gray -tags [subst {hgrid g$i}]
}
}

proc {mw_draw_new_record} {wn} {
global mw pref
set posx [expr 10-$mw($wn,leftoffset)]
set posy [lindex $mw($wn,rowy) $mw($wn,last_rownum)]
if {$pref(tvfont)=="helv"} {
	set tvfont $pref(font_normal)
} else {
	set tvfont $pref(font_fix)
}
if {$mw($wn,updatable)} {
  for {set j 0} {$j<$mw($wn,colcount)} {incr j} {
	$wn.c create text $posx $posy -text * -tags [subst {r$mw($wn,nrecs) c$j q new unt}]  -anchor nw -font $tvfont -width [expr [lindex $mw($wn,colwidth) $j]-5]
	incr posx [expr [lindex $mw($wn,colwidth) $j]+2]
  }
  incr posy 14
  $wn.c create line [expr -$mw($wn,leftoffset)] $posy [expr $mw($wn,r_edge)-$mw($wn,leftoffset)] $posy -fill gray -tags [subst {hgrid g$mw($wn,nrecs)}]
}
}

proc {mw_edit_text} {wn c k} {
global mw
set bbin [$wn.c bbox r$mw($wn,row_edited)]
switch $k {
	BackSpace { set dp [expr [$wn.c index $mw($wn,id_edited) insert]-1];if {$dp>=0} {$wn.c dchars $mw($wn,id_edited) $dp $dp; set mw($wn,dirtyrec) 1}}
	Home {$wn.c icursor $mw($wn,id_edited) 0}
	End {$wn.c icursor $mw($wn,id_edited) end}
	Left {$wn.c icursor $mw($wn,id_edited) [expr [$wn.c index $mw($wn,id_edited) insert]-1]}
	Delete {}
	Right {$wn.c icursor $mw($wn,id_edited) [expr [$wn.c index $mw($wn,id_edited) insert]+1]}
	Return {if {[mw_exit_edit $wn]} {$wn.c focus {}}}
	Escape {set mw($wn,dirtyrec) 0; $wn.c itemconfigure $mw($wn,id_edited) -text $mw($wn,text_initial_value); $wn.c focus {}}
	default {if {[string compare $c " "]>-1} {$wn.c insert $mw($wn,id_edited) insert $c;set mw($wn,dirtyrec) 1}}
}
set bbout [$wn.c bbox r$mw($wn,row_edited)]
set dy [expr [lindex $bbout 3]-[lindex $bbin 3]]
if {$dy==0} return
set re $mw($wn,row_edited)
$wn.c move g$re 0 $dy
for {set i [expr 1+$re]} {$i<=$mw($wn,nrecs)} {incr i} {
	$wn.c move r$i 0 $dy
	$wn.c move g$i 0 $dy
	set rh [lindex $mw($wn,rowy) $i]
	incr rh $dy
	set mw($wn,rowy) [lreplace $mw($wn,rowy) $i $i $rh]
}
mw_show_record $wn $mw($wn,row_edited)
# Delete is trapped by window interpreted as record delete
#    Delete {$wn.c dchars $mw($wn,id_edited) insert insert; set mw($wn,dirtyrec) 1}
}

proc {mw_exit_edit} {wn} {
global mw dbc
# User has edited the text ?
if {!$mw($wn,dirtyrec)} {
	# No, unfocus text
	$wn.c focus {}
	# For restoring * to the new record position
	if {$mw($wn,id_edited)!=""} {
		if {[lsearch [$wn.c gettags $mw($wn,id_edited)] new]!=-1} {
			$wn.c itemconfigure $mw($wn,id_edited) -text $mw($wn,text_initial_value)
		}
	}
	set mw($wn,id_edited) {};set mw($wn,text_initial_value) {}
	return 1
}
# Trimming the spaces
set fldval [string trim [$wn.c itemcget $mw($wn,id_edited) -text]]
$wn.c itemconfigure $mw($wn,id_edited) -text $fldval
if {[string compare $mw($wn,text_initial_value) $fldval]==0} {
	set mw($wn,dirtyrec) 0
	$wn.c focus {}
	set mw($wn,id_edited) {};set mw($wn,text_initial_value) {}
	return 1
}
cursor_clock
set oid [lindex $mw($wn,keylist) $mw($wn,row_edited)]
set fld [lindex $mw($wn,colnames) [get_tag_info $wn $mw($wn,id_edited) c]]
set fillcolor black
if {$mw($wn,row_edited)==$mw($wn,last_rownum)} {
	set fillcolor red
	set sfp [lsearch $mw($wn,newrec_fields) "\"$fld\""]
	if {$sfp>-1} {
		set mw($wn,newrec_fields) [lreplace $mw($wn,newrec_fields) $sfp $sfp]
		set mw($wn,newrec_values) [lreplace $mw($wn,newrec_values) $sfp $sfp]
	}			
	lappend mw($wn,newrec_fields) "\"$fld\""
	lappend mw($wn,newrec_values) '$fldval'
	# Remove the untouched tag from the object
	$wn.c dtag $mw($wn,id_edited) unt
		$wn.c itemconfigure $mw($wn,id_edited) -fill red
	set retval 1
} else {
	set mw($wn,msg) "Updating record ..."
	after 1000 "set mw($wn,msg) {}"
	regsub -all ' $fldval  \\' sqlfldval
	set retval [sql_exec noquiet "update \"$mw($wn,tablename)\" set \"$fld\"='$sqlfldval' where oid=$oid"]
}
cursor_normal
if {!$retval} {
	set mw($wn,msg) ""
	focus $wn.c
	return 0
}
set mw($wn,dirtyrec) 0
$wn.c focus {}
set mw($wn,id_edited) {};set mw($wn,text_initial_value) {}
return 1
}

proc {mw_load_layout} {wn layoutname} {
global dbc mw
cursor_clock
set mw($wn,layout_name) $layoutname
catch {unset mw($wn,colcount) mw($wn,colnames) mw($wn,colwidth)}
set mw($wn,layout_found) 0
set pgres [wpg_exec $dbc "select *,oid from pga_layout where tablename='$layoutname' order by oid desc"]
set pgs [pg_result $pgres -status]
if {$pgs!="PGRES_TUPLES_OK"} {
	# Probably table pga_layout isn't yet defined
	sql_exec noquiet "create table pga_layout (tablename varchar(64),nrcols int2,colnames text,colwidth text)"
	sql_exec quiet "grant ALL on pga_layout to PUBLIC"
} else {
	set nrlay [pg_result $pgres -numTuples]
	if {$nrlay>=1} {
		set layoutinfo [pg_result $pgres -getTuple 0]
		set mw($wn,colcount) [lindex $layoutinfo 1]
		set mw($wn,colnames)  [lindex $layoutinfo 2]
		set mw($wn,colwidth) [lindex $layoutinfo 3]
		set goodoid [lindex $layoutinfo 4]
		set mw($wn,layout_found) 1
	}
	if {$nrlay>1} {
		show_error "Multiple ($nrlay) layout info found\n\nPlease report the bug!"
		sql_exec quiet "delete from pga_layout where (tablename='$mw($wn,tablename)') and (oid<>$goodoid)"
	}
}
pg_result $pgres -clear
}

proc {mw_pan_left} {wn } {
global mw
if {![mw_exit_edit $wn]} return;
if {$mw($wn,leftcol)==[expr $mw($wn,colcount)-1]} return;
set diff [expr 2+[lindex $mw($wn,colwidth) $mw($wn,leftcol)]]
incr mw($wn,leftcol)
incr mw($wn,leftoffset) $diff
$wn.c move header -$diff 0
$wn.c move q -$diff 0
$wn.c move hgrid -$diff 0
}

proc {mw_pan_right} {wn} {
global mw
if {![mw_exit_edit $wn]} return;
if {$mw($wn,leftcol)==0} return;
incr mw($wn,leftcol) -1
set diff [expr 2+[lindex $mw($wn,colwidth) $mw($wn,leftcol)]]
incr mw($wn,leftoffset) -$diff
$wn.c move header $diff 0
$wn.c move q $diff 0
$wn.c move hgrid $diff 0
}

proc {mw_save_new_record} {wn} {
global dbc mw
if {![mw_exit_edit $wn]} {return 0}
if {$mw($wn,newrec_fields)==""} {return 1}
set mw($wn,msg) "Saving new record ..."
after 1000 "set mw($wn,msg) {}"
set pgres [wpg_exec $dbc "insert into \"$mw($wn,tablename)\" ([join $mw($wn,newrec_fields) ,]) values ([join $mw($wn,newrec_values) ,])" ]
if {[pg_result $pgres -status]!="PGRES_COMMAND_OK"} {
	set errmsg [pg_result $pgres -error]
	show_error "Error inserting new record\n\n$errmsg"
	return 0
}
set oid [pg_result $pgres -oid]
lappend mw($wn,keylist) $oid
pg_result $pgres -clear
# Get bounds of the last record
set lrbb [$wn.c bbox new]
lappend mw($wn,rowy) [lindex $lrbb 3]
$wn.c itemconfigure new -fill black
$wn.c dtag q new
# Replace * from untouched new row elements with "  "
foreach item [$wn.c find withtag unt] {
	$wn.c itemconfigure $item -text "  "
}
$wn.c dtag q unt
incr mw($wn,last_rownum)
incr mw($wn,nrecs)
mw_draw_new_record $wn
set mw($wn,newrec_fields) {}
set mw($wn,newrec_values) {}
return 1
}

proc {mw_scroll_window} {wn par1 args} {
global mw
if {![mw_exit_edit $wn]} return;
if {$par1=="scroll"} {
	set newtop $mw($wn,toprec)
	if {[lindex $args 1]=="units"} {
		incr newtop [lindex $args 0]
	} else {
		incr newtop [expr [lindex $args 0]*25]
		if {$newtop<0} {set newtop 0}
		if {$newtop>=[expr $mw($wn,nrecs)-1]} {set newtop [expr $mw($wn,nrecs)-1]}
	}
} elseif {$par1=="moveto"} {
	set newtop [expr int([lindex $args 0]*$mw($wn,nrecs))]
} else {
	return
}
if {$newtop<0} return;
if {$newtop>=[expr $mw($wn,nrecs)-1]} return;
set dy [expr [lindex $mw($wn,rowy) $mw($wn,toprec)]-[lindex $mw($wn,rowy) $newtop]]
$wn.c move q 0 $dy
$wn.c move hgrid 0 $dy
set newrowy {}
foreach y $mw($wn,rowy) {lappend newrowy [expr $y+$dy]}
set mw($wn,rowy) $newrowy
set mw($wn,toprec) $newtop
mw_set_scrollbar $wn
}

proc {mw_select_records} {wn sql} {
global dbc field mw pgsql pref
set mw($wn,newrec_fields) {}
set mw($wn,newrec_values) {}
if {![mw_exit_edit $wn]} return;
$wn.c delete q
$wn.c delete header
$wn.c delete hgrid
$wn.c delete new
set mw($wn,leftcol) 0
set mw($wn,leftoffset) 0
set mw($wn,crtrow) {}
set mw($wn,msg) "Accessing data. Please wait ..."
$wn.f1.b1 configure -state disabled
cursor_clock
set is_error 1
if {[sql_exec noquiet "BEGIN"]} {
	if {[sql_exec noquiet "declare mycursor cursor for $sql"]} {
		set pgres [wpg_exec $dbc "fetch $pref(rows) in mycursor"]
		if {$pgsql(status)=="PGRES_TUPLES_OK"} {
			set is_error 0
		}
	}
}
if {$is_error} {
	sql_exec quiet "END"
	set mw($wn,msg) {}
	$wn.f1.b1 configure -state normal
	cursor_normal
	set mw($wn,msg) "Error executing : $sql"
	return
}
if {$mw($wn,updatable)} then {set shift 1} else {set shift 0}
#
# checking at least the numer of fields
set attrlist [pg_result $pgres -lAttributes]
if {$mw($wn,layout_found)} then {
	if {  ($mw($wn,colcount) != [expr [llength $attrlist]-$shift]) ||
		  ($mw($wn,colcount) != [llength $mw($wn,colnames)]) ||
		  ($mw($wn,colcount) != [llength $mw($wn,colwidth)]) } then {
		# No. of columns don't match, something is wrong
		# tk_messageBox -title Information -message "Layout info changed !\nRescanning..."
		set mw($wn,layout_found) 0
		sql_exec quiet "delete from pga_layout where tablename='$mw($wn,layout_name)'"
	}
}
# Always take the col. names from the result
set mw($wn,colcount) [llength $attrlist]
if {$mw($wn,updatable)} then {incr mw($wn,colcount) -1}
set mw($wn,colnames) {}
# In defmw($wn,colwidth) prepare mw($wn,colwidth) (in case that not layout_found)
set defmw($wn,colwidth) {}
for {set i 0} {$i<$mw($wn,colcount)} {incr i} {
	lappend mw($wn,colnames) [lindex [lindex $attrlist [expr {$i+$shift}]] 0]
	lappend defmw($wn,colwidth) 150
}
if {!$mw($wn,layout_found)} {
	set mw($wn,colwidth) $defmw($wn,colwidth)
	sql_exec quiet "insert into pga_layout values ('$mw($wn,layout_name)',$mw($wn,colcount),'$mw($wn,colnames)','$mw($wn,colwidth)')"
	set mw($wn,layout_found) 1
}
set mw($wn,nrecs) [pg_result $pgres -numTuples]
if {$mw($wn,nrecs)>$pref(rows)} {
	set mw($wn,msg) "Only first $pref(rows) records from $mw($wn,nrecs) have been loaded"
	set mw($wn,nrecs) $pref(rows)
}
set tagoid {}
if {$pref(tvfont)=="helv"} {
	set tvfont $pref(font_normal)
} else {
	set tvfont $pref(font_fix)
}
# Computing column's left edge
set posx 10
for {set j 0} {$j<$mw($wn,colcount)} {incr j} {
	set ledge($j) $posx
	incr posx [expr {[lindex $mw($wn,colwidth) $j]+2}]
	set textwidth($j) [expr {[lindex $mw($wn,colwidth) $j]-5}]
}
incr posx -6
set posy 24
mw_draw_headers $wn
set mw($wn,updatekey) oid
set mw($wn,keylist) {}
set mw($wn,rowy) {24}
set mw($wn,msg) "Loading maximum $pref(rows) records ..."
set wupdatable $mw($wn,updatable)
for {set i 0} {$i<$mw($wn,nrecs)} {incr i} {
	set curtup [pg_result $pgres -getTuple $i]
	if {$wupdatable} then {lappend mw($wn,keylist) [lindex $curtup 0]}
	for {set j 0} {$j<$mw($wn,colcount)} {incr j} {
		$wn.c create text $ledge($j) $posy -text [lindex $curtup [expr {$j+$shift}]] -tags [subst {r$i c$j q}] -anchor nw -font $tvfont -width $textwidth($j) -fill black
	}
	set bb [$wn.c bbox r$i]
	incr posy [expr {[lindex $bb 3]-[lindex $bb 1]}]
	lappend mw($wn,rowy) $posy
	$wn.c create line 0 [lindex $bb 3] $posx [lindex $bb 3] -fill gray -tags [subst {hgrid g$i}]
	if {$i==25} {update; update idletasks}
}
after 3000 "set mw($wn,msg) {}"
set mw($wn,last_rownum) $i
# Defining position for input data
mw_draw_new_record $wn
pg_result $pgres -clear
sql_exec quiet "END"
set mw($wn,toprec) 0
mw_set_scrollbar $wn
if {$mw($wn,updatable)} then {
	$wn.c bind q <Key> "mw_edit_text $wn %A %K"
} else {
	$wn.c bind q <Key> {}
}
set mw($wn,dirtyrec) 0
$wn.c raise header
$wn.f1.b1 configure -state normal
cursor_normal
}

proc {mw_set_scrollbar} {wn} {
global mw
if {$mw($wn,nrecs)==0} return;
$wn.sb set [expr $mw($wn,toprec)*1.0/$mw($wn,nrecs)] [expr ($mw($wn,toprec)+27.0)/$mw($wn,nrecs)]
}

proc {mw_reload} {wn} {
global mw
set nq $mw($wn,query)
if {($mw($wn,isaquery)) && ("$mw($wn,filter)$mw($wn,sortfield)"!="")} {
	show_error "Sorting and filtering not (yet) available from queries!\n\nPlease enter them in the query definition!"
	set mw($wn,sortfield) {}
	set mw($wn,filter) {}
} else {
	if {$mw($wn,filter)!=""} {
		set nq "$mw($wn,query) where ($mw($wn,filter))"
	} else {
		set nq $mw($wn,query)
	}
	if {$mw($wn,sortfield)!=""} {
		set nq "$nq order by $mw($wn,sortfield)"
	}
}
if {[mw_save_new_record $wn]} {mw_select_records $wn $nq}
}

proc {mw_show_record} {wn row} {
global mw
set mw($wn,errorsavingnew) 0
if {$mw($wn,newrec_fields)!=""} {
	if {$row!=$mw($wn,last_rownum)} {
		if {![mw_save_new_record $wn]} {
					set mw($wn,errorsavingnew) 1
					return
				}
	}
}
set y1 [lindex $mw($wn,rowy) $row]
set y2 [lindex $mw($wn,rowy) [expr $row+1]]
if {$y2==""} {set y2 [expr $y1+14]}
$wn.c dtag hili hili
$wn.c addtag hili withtag r$row
# Making a rectangle arround the record
set x 3
foreach wi $mw($wn,colwidth) {incr x [expr $wi+2]}
$wn.c delete crtrec
$wn.c create rectangle [expr -1-$mw($wn,leftoffset)] $y1 [expr $x-$mw($wn,leftoffset)] $y2 -fill #EEEEEE -outline {} -tags {q crtrec}
$wn.c lower crtrec
}

proc {mw_start_edit} {wn id x y} {
global mw
if {!$mw($wn,updatable)} return
set mw($wn,id_edited) $id
set mw($wn,dirtyrec) 0
set mw($wn,text_initial_value) [$wn.c itemcget $id -text]
focus $wn.c
$wn.c focus $id
$wn.c icursor $id @$x,$y
if {$mw($wn,row_edited)==$mw($wn,nrecs)} {
	if {[$wn.c itemcget $id -text]=="*"} {
		$wn.c itemconfigure $id -text ""
		$wn.c icursor $id 0
	}
}
}

proc {open_database} {} {
global dbc host pport dbname username password newusername newpassword sdbname newdbname newhost newpport pref pgsql
cursor_clock
if {$newusername!=""} {
	set connres [catch {set newdbc [pg_connect -conninfo "host=$newhost port=$newpport dbname=$newdbname user=$newusername password=$newpassword"]} msg]
} else {
	set connres [catch {set newdbc [pg_connect $newdbname -host $newhost -port $newpport]} msg]
}
if {$connres} {
	cursor_normal
	show_error "Error trying to connect to database \"$newdbname\" on host $newhost\n\nPostgreSQL error message: $msg"
	return $msg
} else {
	catch {pg_disconnect $dbc}
	set dbc $newdbc
	set host $newhost
	set pport $newpport
	set dbname $newdbname
	set username $newusername
	set password $newpassword
	set sdbname $dbname
	set pref(lastdb) $dbname
	set pref(lasthost) $host
	set pref(lastport) $pport
	set pref(lastusername) $username
	save_pref
	catch {cursor_normal ; Window hide .dbod}
	tab_click .dw.tabTables
	# Check for pga_ tables
	foreach {table structure} { pga_queries {queryname varchar(64),querytype char(1),querycommand text} pga_forms {formname varchar(64),formsource text} pga_scripts {scriptname varchar(64),scriptsource text} pga_reports {reportname varchar(64),reportsource text,reportbody text,reportprocs text,reportoptions text}} {
		set pgres [wpg_exec $dbc "select relname from pg_class where relname='$table'"]
		if {$pgsql(status)!="PGRES_TUPLES_OK"} {
			show_error "FATAL ERROR searching for PgAccess system tables : $pgsql(errmsg)\nStatus:$pgsql(status)"
			catch {pg_disconnect $dbc}
			exit
		} elseif {[pg_result $pgres -numTuples]==0} {
			pg_result $pgres -clear
			sql_exec quiet "create table $table ($structure)"
			sql_exec quiet "grant ALL on $table to PUBLIC"
		}
		catch {pg_result $pgres -clear}
	}
	# searching for autoexec script
	wpg_select $dbc "select * from pga_scripts where scriptname ~* '^autoexec$'" recd {
		eval $recd(scriptsource)
	}
	return ""
}
}

proc {open_form} {formname} {
	 fd_load_form $formname run
	 fd_test
}

proc {open_function} {objname} {
global dbc funcname funcpar funcret
Window show .fw
place .fw.okbtn -y 400
.fw.okbtn configure -state disabled
.fw.text1 delete 1.0 end
wpg_select $dbc "select * from pg_proc where proname='$objname'" rec {
	set funcname $objname
	set temppar $rec(proargtypes)
	set funcret [get_pgtype $rec(prorettype)]
	set funcnrp $rec(pronargs)
	.fw.text1 insert end $rec(prosrc)
}
set funcpar {}
for {set i 0} {$i<$funcnrp} {incr i} {
	lappend funcpar [get_pgtype [lindex $temppar $i]]
}
set funcpar [join $funcpar ,]
}

proc {open_report} {objname} {
global dbc rbvar
Window show .rb
#tkwait visibility .rb
Window hide .rb
Window show .rpv
rb_init
set rbvar(reportname) $objname
rb_load_report
tkwait visibility .rpv
set rbvar(justpreview) 1
rb_preview
}

proc {open_view_design} {} {
global dbc cbv queryname
set viewname [.dw.lb get [.dw.lb curselection]]
set vd {}
wpg_select $dbc "select pg_get_viewdef('$viewname')as vd" tup {
	set vd $tup(vd)
}
if {$vd==""} {
	show_error "Error retrieving view definition for '$viewname'!"
	return
}
Window show .qb
.qb.text1 delete 0.0 end
.qb.text1 insert end $vd
set cbv 1
.qb.cbv configure -state disabled
set queryname $viewname
}

proc {open_query} {how} {
global dbc queryname mw queryoid

if {[.dw.lb curselection]==""} return;
set queryname [.dw.lb get [.dw.lb curselection]]
if {[set pgres [wpg_exec $dbc "select querycommand,querytype,oid from pga_queries where queryname='$queryname'"]]==0} then {
	show_error "Error retrieving query definition"
	return
}
if {[pg_result $pgres -numTuples]==0} {
	show_error "Query $queryname was not found!"
	pg_result $pgres -clear
	return
}
set tuple [pg_result $pgres -getTuple 0]
set qcmd [lindex $tuple 0]
set qtype [lindex $tuple 1]
set queryoid [lindex $tuple 2]
pg_result $pgres -clear
if {$how=="design"} {
	Window show .qb
	.qb.text1 delete 0.0 end
	.qb.text1 insert end $qcmd
} else {
	if {$qtype=="S"} then {
		set wn [mw_get_new_name]
		set mw($wn,query) [subst $qcmd]
		set mw($wn,updatable) 0
		set mw($wn,isaquery) 1
		mw_create_window
		wm title $wn "Query result: $queryname"
		mw_load_layout $wn $queryname
		mw_select_records $wn $mw($wn,query)
	} else {
		set answ [tk_messageBox -title Warning -type yesno -message "This query is an action query!\n\n[string range $qcmd 0 30] ...\n\nDo you want to execute it?"]
		if {$answ} {
			if {[sql_exec noquiet $qcmd]} {
				tk_messageBox -title Information -message "Your query has been executed without error!"
			}
		}
	}
}
}

proc {mw_free_variables} {wn} {
global mw
	foreach varname [array names mw $wn,*] {
		unset mw($varname)
	}
}

proc {mw_get_new_name} {} {
global mw mwcount
incr mwcount
set wn .mw$mwcount
set mw($wn,dirtyrec) 0
set mw($wn,id_edited) {}
set mw($wn,filter) {}
set mw($wn,sortfield) {}
return .mw$mwcount
}

proc {open_sequence} {objname} {
global dbc seq_name seq_inc seq_start seq_minval seq_maxval
Window show .sqf
set flag 1
wpg_select $dbc "select * from \"$objname\"" rec {
	set flag 0
	set seq_name $objname
	set seq_inc $rec(increment_by)
	set seq_start $rec(last_value)
	.sqf.l3 configure -text "Last value"
	set seq_minval $rec(min_value)
	set seq_maxval $rec(max_value)
	.sqf.defbtn configure -state disabled
	place .sqf.defbtn -x 40 -y 300
}
if {$flag} {
	show_error "Sequence $objname not found!"
} else {
	for {set i 1} {$i<6} {incr i} {
		.sqf.e$i configure -state disabled
	}
	focus .sqf.closebtn
}
}

proc {open_table} {objname} {
global mw sortfield filter
set sortfield {}
set filter {}
set wn [mw_get_new_name]
mw_create_window
set mw($wn,tablename) $objname
mw_load_layout $wn $objname
set mw($wn,query) "select oid,\"$objname\".* from \"$objname\""
set mw($wn,updatable) 1
set mw($wn,isaquery) 0
mw_select_records $wn $mw($wn,query)
catch {wm title $wn "Table viewer : $objname"}
}

proc {open_view} {} {
global mw
set vn [get_dwlb_Selection]
if {$vn==""} return;
set wn [mw_get_new_name]
mw_create_window
set mw($wn,query) "select * from \"$vn\""
set mw($wn,isaquery) 0
set mw($wn,updatable) 0
mw_load_layout $wn $vn
mw_select_records $wn $mw($wn,query)
}

proc {rename_column} {} {
global dbc tiw
	if {[string length [string trim $tiw(new_cn)]]==0} {
		show_error "Field name not entered!"
		return
	}
	set old_name [string trim [string range $tiw(old_cn) 0 31]]
	set tiw(new_cn) [string trim $tiw(new_cn)]
	if {$old_name == $tiw(new_cn)} {
		show_error "New name is the same as the old one !"
		return
	}
	foreach line [.tiw.lb get 0 end] {
		if {[string trim [string range $line 0 31]]==$tiw(new_cn)} {
			show_error "Colum name \"$tiw(new_cn)\" already exists in this table!"
			return
		}
	}
	if {[sql_exec noquiet "alter table \"$tiw(tablename)\" rename column \"$old_name\" to \"$tiw(new_cn)\""]} {
		set temp $tiw(col_id)
		.tiw.lb delete $temp $temp
		.tiw.lb insert $temp "[format %-32.32s $tiw(new_cn)] [string range $tiw(old_cn) 33 end]"
		Window destroy .rcw
	}
}

proc {parameter} {msg} {
global gpw
Window show .gpw
focus .gpw.e1
set gpw(var) ""
set gpw(flag) 0
set gpw(msg) $msg
bind .gpw <Destroy> "set gpw(flag) 1"
grab .gpw
tkwait variable gpw(flag)
if {$gpw(result)} {
	return $gpw(var)
} else {
	return ""
}
}

proc {ql_add_new_table} {} {
global qlvar dbc

if {$qlvar(newtablename)==""} return
set fldlist {}
cursor_clock
wpg_select $dbc "select attnum,attname from pg_class,pg_attribute where (pg_class.relname='$qlvar(newtablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) order by attnum" rec {
		lappend fldlist $rec(attname)
}
cursor_normal
if {$fldlist==""} {
	show_error "Table $qlvar(newtablename) not found!"
	return
}
set qlvar(tablename$qlvar(ntables)) $qlvar(newtablename)
set qlvar(tablestruct$qlvar(ntables)) $fldlist
set qlvar(tablealias$qlvar(ntables)) "t$qlvar(ntables)"
set qlvar(ali_t$qlvar(ntables)) $qlvar(newtablename)
incr qlvar(ntables)
if {$qlvar(ntables)==1} {
   ql_draw_lizzard
} else {
   ql_draw_table [expr $qlvar(ntables)-1]
}
set qlvar(newtablename) {}
focus .ql.entt
}

proc {ql_compute_sql} {} {
global qlvar
set sqlcmd "select "
#rjr 8Mar1999 added logical return state for results
for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} {
	if {[lindex $qlvar(resreturn) $i]} {
	if {$sqlcmd!="select "} {set sqlcmd "$sqlcmd, "}
	set sqlcmd "$sqlcmd[lindex $qlvar(restables) $i].\"[lindex $qlvar(resfields) $i]\""
}
}
set tables {}
for {set i 0} {$i<$qlvar(ntables)} {incr i} {
	set thename {}
	catch {set thename $qlvar(tablename$i)}
	if {$thename!=""} {lappend tables "\"$qlvar(tablename$i)\" $qlvar(tablealias$i)"}
}
set sqlcmd "$sqlcmd from [join $tables ,] "
set sup1 {}
if {[llength $qlvar(links)]>0} {
	set sup1 "where "
	foreach link $qlvar(links) {
		if {$sup1!="where "} {set sup1 "$sup1 and "}
		set sup1 "$sup1 ([lindex $link 0].\"[lindex $link 1]\"=[lindex $link 2].\"[lindex $link 3]\")"
	}
}
for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} {
	set crit [lindex $qlvar(rescriteria) $i]
	if {$crit!=""} {
		if {$sup1==""} {set sup1 "where "}
		if {[string length $sup1]>6} {set sup1 "$sup1 and "}
		set sup1 "$sup1 ([lindex $qlvar(restables) $i].\"[lindex $qlvar(resfields) $i]\" $crit) "        
	}        
}
set sqlcmd "$sqlcmd $sup1"
set sup2 {}
for {set i 0} {$i<[llength $qlvar(ressort)]} {incr i} {
	set how [lindex $qlvar(ressort) $i]
	if {$how!="unsorted"} {
		if {$how=="Ascending"} {set how asc} else {set how desc}
		if {$sup2==""} {set sup2 " order by "} else {set sup2 "$sup2,"}
		set sup2 "$sup2 [lindex $qlvar(restables) $i].\"[lindex $qlvar(resfields) $i]\" $how "
	}
}
set sqlcmd "$sqlcmd $sup2"
set qlvar(sql) $sqlcmd
#tk_messageBox -message $sqlcmd
return $sqlcmd
}

proc {ql_delete_object} {} {
global qlvar
# Checking if there 
set obj [.ql.c find withtag hili]
if {$obj==""} return
# Is object a link ?
if {[ql_get_tag_info $obj link]=="s"} {
	if {[tk_messageBox -title WARNING -icon question -parent .ql -message "Remove link ?" -type yesno -default no]=="no"} return
	set linkid [ql_get_tag_info $obj lkid]
	set qlvar(links) [lreplace $qlvar(links) $linkid $linkid]
	.ql.c delete links
	ql_draw_links
	return
}
# Is object a result field ?
if {[ql_get_tag_info $obj res]=="f"} {
	set col [ql_get_tag_info $obj col]
	if {$col==""} return
	if {[tk_messageBox -title WARNING -icon question -parent .ql -message "Remove field from result ?" -type yesno -default no]=="no"} return
	set qlvar(resfields) [lreplace $qlvar(resfields) $col $col]
	set qlvar(ressort) [lreplace $qlvar(ressort) $col $col]
	set qlvar(resreturn) [lreplace $qlvar(resreturn) $col $col]
	set qlvar(restables) [lreplace $qlvar(restables) $col $col]
	set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $col $col]
	ql_draw_res_panel
	return
}
# Is object a table ?
set tablealias [ql_get_tag_info $obj tab]
set tablename $qlvar(ali_$tablealias)
if {"$tablename"==""} return
if {[tk_messageBox -title WARNING -icon question -parent .ql -message "Remove table $tablename from query ?" -type yesno -default no]=="no"} return
for {set i [expr [llength $qlvar(restables)]-1]} {$i>=0} {incr i -1} {
	if {"$tablename"==[lindex $qlvar(restables) $i]} {
	   set qlvar(resfields) [lreplace $qlvar(resfields) $i $i]
	   set qlvar(ressort) [lreplace $qlvar(ressort) $i $i]
	   set qlvar(resreturn) [lreplace $qlvar(resreturn) $i $i]
	   set qlvar(restables) [lreplace $qlvar(restables) $i $i]
	   set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $i $i]
	}
}
for {set i [expr [llength $qlvar(links)]-1]} {$i>=0} {incr i -1} {
	set thelink [lindex $qlvar(links) $i]
	if {($tablealias==[lindex $thelink 0]) || ($tablealias==[lindex $thelink 2])} {
		set qlvar(links) [lreplace $qlvar(links) $i $i]
	}
}
for {set i 0} {$i<$qlvar(ntables)} {incr i} {
	set temp {}
	catch {set temp $qlvar(tablename$i)}
	if {"$temp"=="$tablename"} {
		unset qlvar(tablename$i)
		unset qlvar(tablestruct$i)
		unset qlvar(tablealias$i)
		break
	}
}
#incr qlvar(ntables) -1
.ql.c delete tab$tablealias
.ql.c delete links
ql_draw_links
ql_draw_res_panel
}

proc {ql_dragit} {w x y} {
global draginfo
if {"$draginfo(obj)" != ""} {
	set dx [expr $x - $draginfo(x)]
	set dy [expr $y - $draginfo(y)]
	if {$draginfo(is_a_table)} {
		set taglist [.ql.c gettags $draginfo(obj)]
		set tabletag [lindex $taglist [lsearch -regexp $taglist "^tab"]]
		$w move $tabletag $dx $dy
		ql_draw_links
	} else {
		$w move $draginfo(obj) $dx $dy
	}
	set draginfo(x) $x
	set draginfo(y) $y
}
}

proc {ql_dragstart} {w x y} {
global draginfo
catch {unset draginfo}
set draginfo(obj) [$w find closest $x $y]
if {[ql_get_tag_info $draginfo(obj) r]=="ect"} {
	# If it'a a rectangle, exit
	set draginfo(obj) {}
	return
}
.ql configure -cursor hand1
.ql.c raise $draginfo(obj)
set draginfo(table) 0
if {[ql_get_tag_info $draginfo(obj) table]=="header"} {
	set draginfo(is_a_table) 1
	.ql.c itemconfigure [.ql.c find withtag hili] -fill black
	.ql.c dtag [.ql.c find withtag hili] hili
	.ql.c addtag hili withtag $draginfo(obj)
	.ql.c itemconfigure hili -fill blue
} else {
	set draginfo(is_a_table) 0
}
set draginfo(x) $x
set draginfo(y) $y
set draginfo(sx) $x
set draginfo(sy) $y
}

proc {ql_dragstop} {x y} {
global draginfo qlvar
# when click Close, ql window is destroyed but event ButtonRelease-1 is fired
if {![winfo exists .ql]} return;
.ql configure -cursor left_ptr
set este {}
catch {set este $draginfo(obj)}
if {$este==""} return
# Re-establish the normal paint order so
# information won't be overlapped by table rectangles
# or link linkes
.ql.c lower $draginfo(obj)
.ql.c lower rect
.ql.c lower links
set qlvar(panstarted) 0
if {$draginfo(is_a_table)} {
	set draginfo(obj) {}
	.ql.c delete links
	ql_draw_links
	return
}
.ql.c move $draginfo(obj) [expr $draginfo(sx)-$x] [expr $draginfo(sy)-$y]
if {($y>$qlvar(yoffs)) && ($x>$qlvar(xoffs))} {
	# Drop position : inside the result panel
	# Compute the offset of the result panel due to panning
	set resoffset [expr [lindex [.ql.c bbox resmarker] 0]-$qlvar(xoffs)]
	set newfld [.ql.c itemcget $draginfo(obj) -text]
	set tabtag [ql_get_tag_info $draginfo(obj) tab]
	set col [expr int(($x-$qlvar(xoffs)-$resoffset)/$qlvar(reswidth))]
	set qlvar(resfields) [linsert $qlvar(resfields) $col $newfld]
	set qlvar(ressort) [linsert $qlvar(ressort) $col unsorted]
	set qlvar(rescriteria) [linsert $qlvar(rescriteria) $col {}]
	set qlvar(restables) [linsert $qlvar(restables) $col $tabtag]
	set qlvar(resreturn) [linsert $qlvar(resreturn) $col yes]
	ql_draw_res_panel    
} else {
	# Drop position : in the table panel
	set droptarget [.ql.c find overlapping $x $y $x $y]
	set targettable {}
	foreach item $droptarget {
		set targettable [ql_get_tag_info $item tab]
		set targetfield [ql_get_tag_info $item f-]
		if {($targettable!="") && ($targetfield!="")} {
			set droptarget $item
			break
		}
	}
	# check if target object isn't a rectangle
	if {[ql_get_tag_info $droptarget rec]=="t"} {set targettable {}}
	if {$targettable!=""} {
		# Target has a table
		# See about originate table
		set sourcetable [ql_get_tag_info $draginfo(obj) tab]
		if {$sourcetable!=""} {
			# Source has also a tab .. tag
			set sourcefield [ql_get_tag_info $draginfo(obj) f-]
			if {$sourcetable!=$targettable} {
				lappend qlvar(links) [list $sourcetable $sourcefield $targettable $targetfield $draginfo(obj) $droptarget]
				ql_draw_links
			}
		}
	}
}
# Erase information about onbject beeing dragged
set draginfo(obj) {}
}

proc {ql_draw_links} {} {
global qlvar
.ql.c delete links
set i 0
foreach link $qlvar(links) {
	# Compute the source and destination right edge
	set sre [lindex [.ql.c bbox tab[lindex $link 0]] 2]
	set dre [lindex [.ql.c bbox tab[lindex $link 2]] 2]
	# Compute field bound boxes
	set sbbox [.ql.c bbox [lindex $link 4]]
	set dbbox [.ql.c bbox [lindex $link 5]]
	# Compute the auxiliary lines
	if {[lindex $sbbox 2] < [lindex $dbbox 0]} {
		# Source object is on the left of target object
		set x1 $sre
		set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2]
		.ql.c create line $x1 $y1 [expr $x1+10] $y1 -tags [subst {links lkid$i}] -width 3
		set x2 [lindex $dbbox 0]
		set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2]
		.ql.c create line [expr $x2-10] $y2 $x2 $y2 -tags [subst {links lkid$i}] -width 3
		.ql.c create line [expr $x1+10] $y1 [expr $x2-10] $y2 -tags [subst {links lkid$i}] -width 2
	} else {
		# source object is on the right of target object
		set x1 [lindex $sbbox 0]
		set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2]
		.ql.c create line $x1 $y1 [expr $x1-10] $y1 -tags [subst {links lkid$i}] -width 3
		set x2 $dre
		set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2]
		.ql.c create line $x2 $y2 [expr $x2+10] $y2 -width 3 -tags [subst {links lkid$i}]
		.ql.c create line [expr $x1-10] $y1 [expr $x2+10] $y2 -tags [subst {links lkid$i}] -width 2
	}
	incr i
}
.ql.c lower links
.ql.c bind links <Button-1> {ql_link_click %x %y}
}

proc {ql_draw_lizzard} {} {
global qlvar pref
.ql.c delete all
set posx 20
for {set it 0} {$it<$qlvar(ntables)} {incr it} {
	ql_draw_table $it
}
.ql.c lower rect
.ql.c create line 0 $qlvar(yoffs) 10000 $qlvar(yoffs) -width 3
.ql.c create rectangle 0 $qlvar(yoffs) 10000 5000 -fill #FFFFFF
for {set i [expr 15+$qlvar(yoffs)]} {$i<500} {incr i 15} {
	.ql.c create line $qlvar(xoffs) $i 10000 $i -fill #CCCCCC -tags {resgrid}
}    
for {set i $qlvar(xoffs)} {$i<10000} {incr i $qlvar(reswidth)} {
	.ql.c create line $i [expr 1+$qlvar(yoffs)] $i 10000 -fill #cccccc -tags {resgrid}
}
# Make a marker for result panel offset calculations (due to panning)
.ql.c create line $qlvar(xoffs) $qlvar(yoffs) $qlvar(xoffs) 500 -tags {resmarker resgrid}
.ql.c create rectangle 0 $qlvar(yoffs) $qlvar(xoffs) 5000 -fill #EEEEEE -tags {reshdr}
.ql.c create text 5 [expr 1+$qlvar(yoffs)] -text Field: -anchor nw -font $pref(font_normal) -tags {reshdr}
.ql.c create text 5 [expr 16+$qlvar(yoffs)] -text Table: -anchor nw -font $pref(font_normal) -tags {reshdr}
.ql.c create text 5 [expr 31+$qlvar(yoffs)] -text Sort: -anchor nw -font $pref(font_normal) -tags {reshdr}
.ql.c create text 5 [expr 46+$qlvar(yoffs)] -text Criteria: -anchor nw -font $pref(font_normal) -tags {reshdr}
.ql.c create text 5 [expr 61+$qlvar(yoffs)] -text Return: -anchor nw -font $pref(font_normal) -tags {reshdr}
.ql.c bind mov <Button-1> {ql_dragstart %W %x %y}
.ql.c bind mov <B1-Motion> {ql_dragit %W %x %y}
bind .ql <ButtonRelease-1> {ql_dragstop %x %y}
bind .ql <Button-1> {qlc_click %x %y %W}
bind .ql <B1-Motion> {ql_pan %x %y}
bind .ql <Key-Delete> {ql_delete_object}
}

proc {ql_draw_res_panel} {} {
global qlvar pref
# Compute the offset of the result panel due to panning
set resoffset [expr [lindex [.ql.c bbox resmarker] 0]-$qlvar(xoffs)]
.ql.c delete resp
for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} {
	.ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 1+$qlvar(yoffs)] -text [lindex $qlvar(resfields) $i] -anchor nw -tags [subst {resf resp col$i}] -font $pref(font_normal)
	.ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 16+$qlvar(yoffs)] -text $qlvar(ali_[lindex $qlvar(restables) $i]) -anchor nw -tags {resp rest} -font $pref(font_normal)
	.ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 31+$qlvar(yoffs)] -text [lindex $qlvar(ressort) $i] -anchor nw -tags {resp sort} -font $pref(font_normal)
	if {[lindex $qlvar(rescriteria) $i]!=""} {
		.ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)]  [expr $qlvar(yoffs)+46+15*0] -anchor nw -text [lindex $qlvar(rescriteria) $i]  -font $pref(font_normal) -tags [subst {resp cr-c$i-r0}]
	}
	.ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 61+$qlvar(yoffs)] -text [lindex $qlvar(resreturn) $i] -anchor nw -tags {resp retval} -font $pref(font_normal)
}
.ql.c raise reshdr
.ql.c bind resf <Button-1> {ql_resfield_click %x %y}
.ql.c bind sort <Button-1> {ql_swap_sort %W %x %y}
.ql.c bind retval <Button-1> {ql_toggle_return %W %x %y}
}

proc {ql_draw_table} {it} {
global qlvar pref

set posy 10
set allbox [.ql.c bbox rect]
if {$allbox==""} {set posx 10} else {set posx [expr 20+[lindex $allbox 2]]}
set tablename $qlvar(tablename$it)
set tablealias $qlvar(tablealias$it)
.ql.c create text $posx $posy -text "$tablename" -anchor nw -tags [subst {tab$tablealias f-oid mov tableheader}] -font $pref(font_bold)
incr posy 16
foreach fld $qlvar(tablestruct$it) {
   .ql.c create text $posx $posy -text $fld -fill #010101 -anchor nw -tags [subst {f-$fld tab$tablealias mov}] -font $pref(font_normal)
   incr posy 14
}
set reg [.ql.c bbox tab$tablealias]
.ql.c create rectangle [lindex $reg 0] [lindex $reg 1] [lindex $reg 2] [lindex $reg 3] -fill #EEEEEE -tags [subst {rect tab$tablealias}]
.ql.c create line [lindex $reg 0] [expr [lindex $reg 1]+15] [lindex $reg 2] [expr [lindex $reg 1]+15] -tags [subst {rect tab$tablealias}]
.ql.c lower tab$tablealias
.ql.c lower rect
}

proc {ql_get_tag_info} {obj prefix} {
set taglist [.ql.c gettags $obj]
set tagpos [lsearch -regexp $taglist "^$prefix"]
if {$tagpos==-1} {return ""}
set thattag [lindex $taglist $tagpos]
return [string range $thattag [string length $prefix] end]
}

proc {ql_init} {} {
global qlvar
catch {unset qlvar}
set qlvar(yoffs) 360
set qlvar(xoffs) 50
set qlvar(reswidth) 150
set qlvar(resfields) {}
set qlvar(resreturn) {}
set qlvar(ressort) {}
set qlvar(rescriteria) {}
set qlvar(restables) {}
set qlvar(critedit) 0
set qlvar(links) {}
set qlvar(ntables) 0
set qlvar(newtablename) {}
}

proc {ql_link_click} {x y} {
global qlvar

set obj [.ql.c find closest $x $y 1 links]
if {[ql_get_tag_info $obj link]!="s"} return
.ql.c itemconfigure [.ql.c find withtag hili] -fill black
.ql.c dtag [.ql.c find withtag hili] hili
.ql.c addtag hili withtag $obj
.ql.c itemconfigure $obj -fill blue
}

proc {ql_pan} {x y} {
global qlvar
set panstarted 0
catch {set panstarted $qlvar(panstarted) }
if {!$panstarted} return
set dx [expr $x-$qlvar(panstartx)]
set dy [expr $y-$qlvar(panstarty)]
set qlvar(panstartx) $x
set qlvar(panstarty) $y
if {$qlvar(panobject)=="tables"} {
	.ql.c move mov $dx $dy
	.ql.c move links $dx $dy
	.ql.c move rect $dx $dy
} else {
	.ql.c move resp $dx 0
	.ql.c move resgrid $dx 0
	.ql.c raise reshdr
}
}

proc {ql_resfield_click} {x y} {
global qlvar

set obj [.ql.c find closest $x $y]
if {[ql_get_tag_info $obj res]!="f"} return
.ql.c itemconfigure [.ql.c find withtag hili] -fill black
.ql.c dtag [.ql.c find withtag hili] hili
.ql.c addtag hili withtag $obj
.ql.c itemconfigure $obj -fill blue
}

proc {ql_show_sql} {} {
global qlvar pref

set sqlcmd [ql_compute_sql]
.ql.c delete sqlpage
.ql.c create rectangle 0 0 2000 [expr $qlvar(yoffs)-1] -fill #ffffff -tags {sqlpage}
.ql.c create text 10 10 -text $sqlcmd -anchor nw -width 550 -tags {sqlpage} -font $pref(font_normal)
.ql.c bind sqlpage <Button-1> {.ql.c delete sqlpage}
}

proc {ql_swap_sort} {w x y} {
global qlvar
set obj [$w find closest $x $y]
set taglist [.ql.c gettags $obj]
if {[lsearch $taglist sort]==-1} return
set cum [.ql.c itemcget $obj -text]
if {$cum=="unsorted"} {
	set cum Ascending
} elseif {$cum=="Ascending"} {
	set cum Descending
} else {
	set cum unsorted
}
set col [expr int(($x-$qlvar(xoffs))/$qlvar(reswidth))]
set qlvar(ressort) [lreplace $qlvar(ressort) $col $col $cum]
.ql.c itemconfigure $obj -text $cum
}

#rjr 8Mar1999 toggle logical return state for result
proc {ql_toggle_return} {w x y} {
global qlvar
set obj [$w find closest $x $y]
set taglist [.ql.c gettags $obj]
if {[lsearch $taglist retval]==-1} return
set cum [.ql.c itemcget $obj -text]
if {$cum} {
	set cum no
} else {
	set cum yes
} 
set col [expr int(($x-$qlvar(xoffs))/$qlvar(reswidth))]
set qlvar(resreturn) [lreplace $qlvar(resreturn) $col $col $cum]
.ql.c itemconfigure $obj -text $cum
}

proc {qlc_click} {x y w} {
global qlvar pref
set qlvar(panstarted) 0
if {$w==".ql.c"} {
	set canpan 1
	if {$y<$qlvar(yoffs)} {
		if {[llength [.ql.c find overlapping $x $y $x $y]]!=0} {set canpan 0}
			set qlvar(panobject) tables
	} else {
		set qlvar(panobject) result
	}
	if {$canpan} {
		.ql configure -cursor hand1
		set qlvar(panstartx) $x
		set qlvar(panstarty) $y
		set qlvar(panstarted) 1
	}
}
set isedit 0
catch {set isedit $qlvar(critedit)}
# Compute the offset of the result panel due to panning
set resoffset [expr [lindex [.ql.c bbox resmarker] 0]-$qlvar(xoffs)]
if {$isedit} {
	set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $qlvar(critcol) $qlvar(critcol) $qlvar(critval)]
	.ql.c delete cr-c$qlvar(critcol)-r$qlvar(critrow)
	.ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$qlvar(critcol)*$qlvar(reswidth)] [expr $qlvar(yoffs)+46+15*$qlvar(critrow)] -anchor nw -text $qlvar(critval) -font $pref(font_normal) -tags [subst {resp cr-c$qlvar(critcol)-r$qlvar(critrow)}]
	set qlvar(critedit) 0
}
catch {destroy .ql.entc}
if {$y<[expr $qlvar(yoffs)+46]} return
if {$x<[expr $qlvar(xoffs)+5]} return
set col [expr int(($x-$qlvar(xoffs)-$resoffset)/$qlvar(reswidth))]
if {$col>=[llength $qlvar(resfields)]} return
set nx [expr $col*$qlvar(reswidth)+8+$qlvar(xoffs)+$resoffset]
set ny [expr $qlvar(yoffs)+76]
# Get the old criteria value
set qlvar(critval) [lindex $qlvar(rescriteria) $col]
entry .ql.entc -textvar qlvar(critval) -borderwidth 0 -background #FFFFFF -highlightthickness 0 -selectborderwidth 0  -font $pref(font_normal)
place .ql.entc -x $nx -y $ny -height 14
focus .ql.entc
bind .ql.entc <Button-1> {set qlvar(panstarted) 0}
set qlvar(critcol) $col
set qlvar(critrow) 0
set qlvar(critedit) 1
}

proc {rb_add_field} {} {
global rbvar pref
set fldname [.rb.lb get [.rb.lb curselection]]
set newid [.rb.c create text $rbvar(xf_auto) [expr $rbvar(y_rpthdr)+5] -text $fldname -tags [subst {t_l mov ro}] -anchor nw -font $pref(font_normal)]
.rb.c create text $rbvar(xf_auto) [expr $rbvar(y_pghdr)+5] -text $fldname -tags [subst {f-$fldname t_f rg_detail mov ro}] -anchor nw -font $pref(font_normal)
set bb [.rb.c bbox $newid]
incr rbvar(xf_auto) [expr 5+[lindex $bb 2]-[lindex $bb 0]]
}

proc {rb_add_label} {} {
global rbvar pref
set fldname $rbvar(labeltext)
set newid [.rb.c create text $rbvar(xl_auto) [expr $rbvar(y_rpthdr)+5] -text $fldname -tags [subst {t_l mov ro}] -anchor nw -font $pref(font_normal)]
set bb [.rb.c bbox $newid]
incr rbvar(xl_auto) [expr 5+[lindex $bb 2]-[lindex $bb 0]]
}

proc {rb_change_object_font} {} {
global rbvar
.rb.c itemconfigure hili -font -Adobe-[.rb.bfont cget -text]-[rb_get_bold]-[rb_get_italic]-Normal--*-$rbvar(pointsize)-*-*-*-*-*-*
}

proc {rb_delete_object} {} {
if {[tk_messageBox -title Warning -parent .rb -message "Delete current report object?" -type yesno -default no]=="no"} return;
.rb.c delete hili
}

proc {rb_dragit} {w x y} {
global draginfo rbvar
# Showing current region
foreach rg $rbvar(regions) {
	set rbvar(msg) $rbvar(e_$rg)
	if {$rbvar(y_$rg)>$y} break;
}
set temp {}
catch {set temp $draginfo(obj)}
if {"$temp" != ""} {
	set dx [expr $x - $draginfo(x)]
	set dy [expr $y - $draginfo(y)]
	if {$draginfo(region)!=""} {
		set x $draginfo(x) ; $w move bg_$draginfo(region) 0 $dy
	} else {
		$w move $draginfo(obj) $dx $dy
	}
	set draginfo(x) $x
	set draginfo(y) $y
}
}

proc {rb_dragstart} {w x y} {
global draginfo rbvar
focus .rb.c
catch {unset draginfo}
set obj {}
# Only movable objects start dragging
foreach id [$w find overlapping $x $y $x $y] {
	if {[rb_has_tag $id mov]} {
		set obj $id
		break
	}
}
if {$obj==""} return;
set draginfo(obj) $obj
set taglist [.rb.c itemcget $obj -tags]
set i [lsearch -glob $taglist bg_*]
if {$i==-1} {
	set draginfo(region) {}
} else {
	set draginfo(region) [string range [lindex $taglist $i] 3 64]
} 
.rb configure -cursor hand1
.rb.c itemconfigure [.rb.c find withtag hili] -fill black
.rb.c dtag [.rb.c find withtag hili] hili
.rb.c addtag hili withtag $draginfo(obj)
.rb.c itemconfigure hili -fill blue
set draginfo(x) $x
set draginfo(y) $y
set draginfo(sx) $x
set draginfo(sy) $y
# Setting font information
if {[.rb.c type hili]=="text"} {
	set fnta [split [.rb.c itemcget hili -font] -]
	.rb.bfont configure -text [lindex $fnta 2]
	if {[lindex $fnta 3]=="Medium"} then {.rb.lbold configure -relief raised} else {.rb.lbold configure -relief sunken}
	if {[lindex $fnta 4]=="R"} then {.rb.lita configure -relief raised} else {.rb.lita configure -relief sunken}
	set rbvar(pointsize) [lindex $fnta 8]
	if {[rb_has_tag $obj t_f]} {set rbvar(info) "Database field"}
	if {[rb_has_tag $obj t_l]} {set rbvar(info) "Label"}
	if {[.rb.c itemcget $obj -anchor]=="nw"} then {.rb.balign configure -text left} else {.rb.balign configure -text right}
}
}

proc {rb_dragstop} {x y} {
global draginfo rbvar
# when click Close, ql window is destroyed but event ButtonRelease-1 is fired
if {![winfo exists .rb]} return;
.rb configure -cursor left_ptr
set este {}
catch {set este $draginfo(obj)}
if {$este==""} return
# Erase information about object beeing dragged
if {$draginfo(region)!=""} {
	set dy 0
	foreach rg $rbvar(regions) {
		.rb.c move rg_$rg 0 $dy
		if {$rg==$draginfo(region)} {
			set dy [expr $y-$rbvar(y_$draginfo(region))]
		}
		incr rbvar(y_$rg) $dy
	}
#    .rb.c move det 0 [expr $y-$rbvar(y_$draginfo(region))]
	set rbvar(y_$draginfo(region)) $y
	rb_draw_regions
} else {
	# Check if object beeing dragged is inside the canvas
	set bb [.rb.c bbox $draginfo(obj)]
	if {[lindex $bb 0] < 5} {
		.rb.c move $draginfo(obj) [expr 5-[lindex $bb 0]] 0
	}
}
set draginfo(obj) {}
unset draginfo
}

proc {rb_draw_regions} {} {
global rbvar
foreach rg $rbvar(regions) {
	.rb.c delete bg_$rg
	.rb.c create line 0 $rbvar(y_$rg) 5000 $rbvar(y_$rg) -tags [subst {bg_$rg}]
	.rb.c create rectangle 6 [expr $rbvar(y_$rg)-3] 12 [expr $rbvar(y_$rg)+3] -fill black -tags [subst {bg_$rg mov reg}]
	.rb.c lower bg_$rg
}
}

proc {rb_flip_align} {} {
set bb [.rb.c bbox hili]
if {[.rb.balign cget -text]=="left"} then {
	.rb.balign configure -text right
	.rb.c itemconfigure hili -anchor ne
	.rb.c move hili [expr [lindex $bb 2]-[lindex $bb 0]-3] 0
} else {
	.rb.balign configure -text left
	.rb.c itemconfigure hili -anchor nw
	.rb.c move hili [expr [lindex $bb 0]-[lindex $bb 2]+3] 0
}
}

proc {rb_get_bold} {} {
if {[.rb.lbold cget -relief]=="raised"} then {return Medium} else {return Bold}
}

proc {rb_get_italic} {} {
if {[.rb.lita cget -relief]=="raised"} then {return R} else {return O}
}

proc {rb_get_report_fields} {} {
global dbc rbvar
.rb.lb delete 0 end
if {$rbvar(tablename)==""} return ;
#cursor_clock
wpg_select $dbc "select attnum,attname from pg_class,pg_attribute where (pg_class.relname='$rbvar(tablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) order by attnum" rec {
	.rb.lb insert end $rec(attname)
}
#cursor_normal
}

proc {rb_has_tag} {id tg} {
if {[lsearch [.rb.c itemcget $id -tags] $tg]==-1} then {return 0 } else {return 1}
}

proc {rb_init} {} {
global rbvar
set rbvar(xl_auto) 10
set rbvar(xf_auto) 10
set rbvar(regions) {rpthdr pghdr detail pgfoo rptfoo}
set rbvar(y_rpthdr) 30
set rbvar(y_pghdr) 60
set rbvar(y_detail) 90
set rbvar(y_pgfoo) 120
set rbvar(y_rptfoo) 150
set rbvar(e_rpthdr) {Report header}
set rbvar(e_pghdr) {Page header}
set rbvar(e_detail) {Detail record}
set rbvar(e_pgfoo) {Page footer}
set rbvar(e_rptfoo) {Report footer}
rb_draw_regions
}

proc {rb_load_report} {} {
global rbvar dbc
.rb.c delete all
wpg_select $dbc "select * from pga_reports where reportname='$rbvar(reportname)'" rcd {
	eval $rcd(reportbody)
}
rb_get_report_fields
rb_draw_regions
}

proc {rb_preview} {} {
global dbc rbvar
Window show .rpv
.rpv.fr.c delete all
set ol [.rb.c find withtag ro]
set fields {}
foreach objid $ol {
	set tags [.rb.c itemcget $objid -tags]
	lappend fields [string range [lindex $tags [lsearch -glob $tags f-*]] 2 64]
	lappend fields [lindex [.rb.c coords $objid] 0]
	lappend fields [lindex [.rb.c coords $objid] 1]
	lappend fields $objid
	lappend fields [lindex $tags [lsearch -glob $tags t_*]]
}
# Parsing page header
set py 10
foreach {field x y objid objtype} $fields {
	if {$objtype=="t_l"} {
		.rpv.fr.c create text $x [expr $py+$y] -text [.rb.c itemcget $objid -text]  -font [.rb.c itemcget $objid -font] -anchor nw
	}
}
incr py [expr $rbvar(y_pghdr)-$rbvar(y_rpthdr)]
# Parsing detail group
set di [lsearch $rbvar(regions) detail]
set y_hi $rbvar(y_detail)
set y_lo $rbvar(y_[lindex $rbvar(regions) [expr $di-1]])
wpg_select $dbc "select * from \"$rbvar(tablename)\"" rec {
	foreach {field x y objid objtype} $fields {
		if {($y>=$y_lo) && ($y<=$y_hi)} then {
		if {$objtype=="t_f"} {
			.rpv.fr.c create text $x [expr $py+$y] -text $rec($field) -font [.rb.c itemcget $objid -font] -anchor [.rb.c itemcget $objid -anchor]
		}
		if {$objtype=="t_l"} {
			.rpv.fr.c create text $x [expr $py+$y] -text [.rb.c itemcget $objid -text]  -font [.rb.c itemcget $objid -font] -anchor nw
		}
		}
	}
	incr py [expr $rbvar(y_detail)-$rbvar(y_pghdr)]
}
.rpv.fr.c configure -scrollregion [subst {0 0 1000 $py}]
}

proc {rb_print_report} {} {
set bb [.rpv.fr.c bbox all]
.rpv.fr.c postscript -file "pgaccess-report.ps" -width [expr 10+[lindex $bb 2]-[lindex $bb 0]] -height [expr 10+[lindex $bb 3]-[lindex $bb 1]]
tk_messageBox -title Information -parent .rb -message "The printed image in Postscript is in the file pgaccess-report.ps"
}

proc {rb_save_report} {} {
global rbvar
set prog "set rbvar(tablename) \"$rbvar(tablename)\""
foreach region $rbvar(regions) {
	set prog "$prog ; set rbvar(y_$region) $rbvar(y_$region)"
}
foreach obj [.rb.c find all] {
	if {[.rb.c type $obj]=="text"} {
		set bb [.rb.c bbox $obj]
		if {[.rb.c itemcget $obj -anchor]=="nw"} then {set x [expr [lindex $bb 0]+1]} else {set x [expr [lindex $bb 2]-2]}
		set prog "$prog ; .rb.c create text $x [lindex $bb 1] -font [.rb.c itemcget $obj -font] -anchor [.rb.c itemcget $obj -anchor] -text {[.rb.c itemcget $obj -text]} -tags {[.rb.c itemcget $obj -tags]}"
	}
}
sql_exec noquiet "delete from pga_reports where reportname='$rbvar(reportname)'"
sql_exec noquiet "insert into pga_reports (reportname,reportsource,reportbody) values ('$rbvar(reportname)','$rbvar(tablename)','$prog')"
}

proc {save_pref} {} {
global pref
catch {
	set fid [open "~/.pgaccessrc" w]
	foreach {opt val} [array get pref] { puts $fid "$opt {$val}" }
	close $fid
}
}

proc {show_error} {emsg} {
   bell ; tk_messageBox -title Error -icon error -message $emsg
}

proc {show_table_information} {tblname} {
global dbc tiw activetab indexlist
set tiw(tablename) $tblname
if {$tiw(tablename)==""} return;
Window show .tiw
.tiw.lb delete 0 end
.tiw.ilb delete 0 end
set tiw(isunique) {}
set tiw(isclustered) {}
set tiw(indexfields) {}
wpg_select $dbc "select attnum,attname,typname,attlen,atttypmod,usename,pg_class.oid from pg_class,pg_user,pg_attribute,pg_type where (pg_class.relname='$tiw(tablename)') and (pg_class.oid=pg_attribute.attrelid) and (pg_class.relowner=pg_user.usesysid) and (pg_attribute.atttypid=pg_type.oid) order by attnum" rec {
	set fsize $rec(attlen)
	set fsize1 $rec(atttypmod)
	set ftype $rec(typname)
	if { $fsize=="-1" && $fsize1!="-1" } {
		set fsize $rec(atttypmod)
		incr fsize -4
	}
	if { $fsize1=="-1" && $fsize=="-1" } {
		set fsize ""
	}
	if {$rec(attnum)>0} {.tiw.lb insert end [format "%-33s %-14s %-4s" $rec(attname) $ftype $fsize]}
	set tiw(owner) $rec(usename)
	set tiw(tableoid) $rec(oid)
	set tiw(f$rec(attnum)) $rec(attname)
}
set tiw(indexlist) {}
wpg_select $dbc "select oid,indexrelid from pg_index where (pg_class.relname='$tiw(tablename)') and (pg_class.oid=pg_index.indrelid)" rec {
	lappend tiw(indexlist) $rec(oid)
	wpg_select $dbc "select relname from pg_class where oid=$rec(indexrelid)" rec1 {
		.tiw.ilb insert end $rec1(relname)
	}
}
}

proc {sql_exec} {how cmd} {
global dbc pgsql
if {[set pgr [wpg_exec $dbc $cmd]]==0} {
	return 0
}
if {($pgsql(status)=="PGRES_COMMAND_OK") || ($pgsql(status)=="PGRES_TUPLES_OK")} {
	pg_result $pgr -clear
	return 1
}	
if {$how != "quiet"} {
	show_error "Error executing query\n\n$cmd\n\nPostgreSQL error message:\n$pgsql(errmsg)\nPostgreSQL status:$pgsql(status)"
}
pg_result $pgr -clear
return 0
}

proc {tab_click} {w} {
global dbc tablist activetab pref
if {$dbc==""} return;
set curtab [$w cget -text]
#if {$activetab==$curtab} return;
.dw.btndesign configure -state disabled
if {$activetab!=""} {
	place .dw.tab$activetab -x 10
	.dw.tab$activetab configure -font $pref(font_normal)
}
$w configure -font $pref(font_bold)
place $w -x 7
place .dw.lmask -x 80 -y [expr 86+25*[lsearch -exact $tablist $curtab]]
set activetab $curtab
# Tabs where button Design is enabled
if {[lsearch {Scripts Queries Views Reports Forms Users} $activetab]!=-1} {
	.dw.btndesign configure -state normal
}
.dw.lb delete 0 end
cmd_$curtab
}

proc {tiw_show_index} {} {
global tiw dbc
set cs [.tiw.ilb curselection]
if {$cs==""} return
set idxname [.tiw.ilb get $cs]
wpg_select $dbc "select pg_index.*,pg_class.oid from pg_index,pg_class where pg_class.relname='$idxname' and pg_class.oid=pg_index.indexrelid" rec {
	if {$rec(indisunique)=="t"} {
		set tiw(isunique) Yes
	} else {
		set tiw(isunique) No
	}
	if {$rec(indisclustered)=="t"} {
		set tiw(isclustered) Yes
	} else {
		set tiw(isclustered) No
	}
	set tiw(indexfields) {}
	foreach field $rec(indkey) {
		if {$field!=0} {
#            wpg_select $dbc "select attname from pg_attribute where attrelid=$tiw(tableoid) and attnum=$field" rec1 {
#                set tiw(indexfields) "$tiw(indexfields) $rec1(attname)"
#            }
		set tiw(indexfields) "$tiw(indexfields) $tiw(f$field)"
		}

	}
}
set tiw(indexfields) [string trim $tiw(indexfields)]
}

proc {vacuum} {} {
global dbc dbname sdbname pgsql
if {$dbc==""} return;
set sdbname "vacuuming database $dbname ..."
cursor_clock
set pgres [wpg_exec $dbc "vacuum;"]
catch {pg_result $pgres -clear}
cursor_normal
set sdbname $dbname
}

proc {main} {argc argv} {
global pref newdbname newpport newhost newusername newpassword dbc tcl_platform
if {[string toupper $tcl_platform(platform)]=="WINDOWS"} {
	load libpgtcl.dll
} else {
	load libpgtcl.so
}
catch {draw_tabs}
set newusername {}
set newpassword {}
if {$argc>0} {
	set newdbname [lindex $argv 0]
	set newhost localhost
	set newpport 5432
	open_database
} elseif {$pref(autoload) && ($pref(lastdb)!="")} {
	set newdbname $pref(lastdb)
	set newhost $pref(lasthost)
	set newpport $pref(lastport)
	catch {set newusername $pref(lastusername)}
	if {[set openmsg [open_database]]!=""} {
		if {[regexp "no password supplied" $openmsg]} {
			Window show .dbod
			focus .dbod.epassword
			wm transient .dbod .dw
		}
	}
	
}
wm protocol .dw WM_DELETE_WINDOW {
	catch {pg_disconnect $dbc}
	exit }
}

proc {Window} {args} {
global vTcl
	set cmd [lindex $args 0]
	set name [lindex $args 1]
	set newname [lindex $args 2]
	set rest [lrange $args 3 end]
	if {$name == "" || $cmd == ""} {return}
	if {$newname == ""} {
		set newname $name
	}
	set exists [winfo exists $newname]
	switch $cmd {
		show {
			if {$exists == "1" && $name != "."} {wm deiconify $name; return}
			if {[info procs vTclWindow(pre)$name] != ""} {
				eval "vTclWindow(pre)$name $newname $rest"
			}
			if {[info procs vTclWindow$name] != ""} {
				eval "vTclWindow$name $newname $rest"
			}
			if {[info procs vTclWindow(post)$name] != ""} {
				eval "vTclWindow(post)$name $newname $rest"
			}
		}
		hide    { if $exists {wm withdraw $newname; return} }
		iconify { if $exists {wm iconify $newname; return} }
		destroy { if $exists {destroy $newname; return} }
	}
}

proc vTclWindow. {base} {
	if {$base == ""} {
		set base .
	}
	wm focusmodel $base passive
	wm geometry $base 1x1+0+0
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm withdraw $base
	wm title $base "vt.tcl"
}

proc vTclWindow.about {base} {
	if {$base == ""} {
		set base .about
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 471x177+168+243
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm title $base "About"
	label $base.l1  -borderwidth 3 -font -Adobe-Helvetica-Bold-R-Normal-*-*-180-*-*-*-*-*  -relief ridge -text PgAccess 
	label $base.l2  -relief groove  -text {A Tcl/Tk interface to
PostgreSQL
by Constantin Teodorescu} 
	label $base.l3  -borderwidth 0 -relief sunken -text {v 0.96}
	label $base.l4  -relief groove  -text {You will always get the latest version at:
http://www.flex.ro/pgaccess

Suggestions : teo@flex.ro} 
	button $base.b1  -borderwidth 1 -command {Window destroy .about} -text Ok 
	place $base.l1  -x 10 -y 10 -width 196 -height 103 -anchor nw -bordermode ignore 
	place $base.l2  -x 10 -y 115 -width 198 -height 55 -anchor nw -bordermode ignore 
	place $base.l3  -x 145 -y 80 -anchor nw -bordermode ignore 
	place $base.l4  -x 215 -y 10 -width 246 -height 103 -anchor nw -bordermode ignore 
	place $base.b1  -x 295 -y 130 -width 105 -height 28 -anchor nw -bordermode ignore
}

proc vTclWindow.dbod {base} {
	if {$base == ""} {
		set base .dbod
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel \
		-cursor left_ptr
	wm focusmodel $base passive
	wm geometry $base 282x180+358+333
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm deiconify $base
	wm title $base "Open database"
	label $base.lhost \
		-borderwidth 0 -text Host 
	entry $base.ehost \
		-background #fefefe -borderwidth 1 -highlightthickness 1 \
		-selectborderwidth 0 -textvariable newhost 
	bind $base.ehost <Key-Return> {
		focus .dbod.epport
	}
	label $base.lport \
		-borderwidth 0 -text Port 
	entry $base.epport \
		-background #fefefe -borderwidth 1 -highlightthickness 1 \
		-selectborderwidth 0 -textvariable newpport 
	bind $base.epport <Key-Return> {
		focus .dbod.edbname
	}
	label $base.ldbname \
		-borderwidth 0 -text Database 
	entry $base.edbname \
		-background #fefefe -borderwidth 1 -highlightthickness 1 \
		-selectborderwidth 0 -textvariable newdbname 
	bind $base.edbname <Key-Return> {
		focus .dbod.eusername
	.dbod.eusername selection range 0 end
	}
	label $base.lusername \
		-borderwidth 0 -text Username 
	entry $base.eusername \
		-background #fefefe -borderwidth 1 -highlightthickness 1 \
		-selectborderwidth 0 -textvariable newusername 
	bind $base.eusername <Key-Return> {
		focus .dbod.epassword
	}
	label $base.lpassword \
		-borderwidth 0 -text Password 
	entry $base.epassword \
		-background #fefefe -borderwidth 1 -highlightthickness 1 \
		-selectborderwidth 0 -textvariable newpassword -show "*"
	bind $base.epassword <Key-Return> {
		focus .dbod.opbtu
	}
	button $base.opbtu \
		-borderwidth 1 -command open_database -text Open 
	bind $base.opbtu <Key-Return> {
		open_database
	}
	button $base.canbut \
		-borderwidth 1 -command {Window hide .dbod} -text Cancel 
	place $base.lhost \
		-x 35 -y 7 -anchor nw -bordermode ignore 
	place $base.ehost \
		-x 100 -y 5 -anchor nw -bordermode ignore 
	place $base.lport \
		-x 35 -y 32 -anchor nw -bordermode ignore 
	place $base.epport \
		-x 100 -y 30 -anchor nw -bordermode ignore 
	place $base.ldbname \
		-x 35 -y 57 -anchor nw -bordermode ignore 
	place $base.edbname \
		-x 100 -y 55 -anchor nw -bordermode ignore 
	place $base.lusername \
		-x 35 -y 82 -anchor nw -bordermode ignore 
	place $base.eusername \
		-x 100 -y 80 -anchor nw -bordermode ignore 
	place $base.lpassword \
		-x 35 -y 107 -anchor nw -bordermode ignore 
	place $base.epassword \
		-x 100 -y 105 -anchor nw -bordermode ignore 
	place $base.opbtu \
		-x 70 -y 140 -width 60 -height 26 -anchor nw -bordermode ignore 
	place $base.canbut \
		-x 150 -y 140 -width 60 -height 26 -anchor nw -bordermode ignore 
}

proc vTclWindow.dw {base} {
global pref
	if {$base == ""} {
		set base .dw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel \
		-background #efefef -cursor left_ptr
	wm focusmodel $base passive
	wm geometry $base 322x355+96+172
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm deiconify $base
	wm title $base "PostgreSQL access"
	label $base.labframe \
		-relief raised 
	listbox $base.lb \
		-background #fefefe \
		-selectbackground #c3c3c3 \
		-foreground black -highlightthickness 0 -selectborderwidth 0 \
		-yscrollcommand {.dw.sb set} 
	bind $base.lb <Double-Button-1> {
		cmd_Open
	}
	button $base.btnnew \
		-borderwidth 1 -command cmd_New -text New 
	button $base.btnopen \
		-borderwidth 1 -command cmd_Open -text Open 
	button $base.btndesign \
		-borderwidth 1 -command cmd_Design -text Design 
	label $base.lmask \
		-borderwidth 0 \
		-text {  } 
	label $base.label22 \
		-borderwidth 1 \
		-relief raised 
	menubutton $base.menubutton23 \
		-borderwidth 1 -font $pref(font_normal) \
		-menu .dw.menubutton23.01 -padx 4 -pady 3 -text Database 
	menu $base.menubutton23.01 \
		-borderwidth 1 -font $pref(font_normal) \
		-tearoff 0 
	$base.menubutton23.01 add command \
		\
		-command {
Window show .dbod
set newhost $host
set newpport $pport
focus .dbod.edbname
.dbod.edbname selection range 0 end} \
		-label Open -font $pref(font_normal)
	$base.menubutton23.01 add command \
		\
		-command {.dw.lb delete 0 end
set dbc {}
set dbname {}
set sdbname {}} \
		-label Close 
	$base.menubutton23.01 add command \
		-command vacuum -label Vacuum 
	$base.menubutton23.01 add separator
	$base.menubutton23.01 add command \
		-command {cmd_Import_Export Import} -label {Import table} 
	$base.menubutton23.01 add command \
		-command {cmd_Import_Export Export} -label {Export table} 
	$base.menubutton23.01 add separator
	$base.menubutton23.01 add command \
		-command cmd_Preferences -label Preferences 
	$base.menubutton23.01 add command \
		-command "Window show .sqlw" -label "SQL window" 
	$base.menubutton23.01 add separator
	$base.menubutton23.01 add command \
		-command {catch {pg_disconnect $dbc}
save_pref
exit} -label Exit 
	label $base.lshost \
		-relief groove -text localhost -textvariable host 
	label $base.lsdbname \
		-anchor w \
		-relief groove -textvariable sdbname 
	scrollbar $base.sb \
		-borderwidth 1 -command {.dw.lb yview} -orient vert 
	menubutton $base.mnob \
		-borderwidth 1 \
		-menu .dw.mnob.m -font $pref(font_normal) -text Object 
	menu $base.mnob.m \
		-borderwidth 1 -font $pref(font_normal) \
		-tearoff 0 
	$base.mnob.m add command \
		-command cmd_New -font $pref(font_normal) -label New 
	$base.mnob.m add command \
		-command {cmd_Delete } -label Delete 
	$base.mnob.m add command \
		-command {cmd_Rename } -label Rename 
	$base.mnob.m add command \
		-command cmd_Information -label Information 
	menubutton $base.mhelp \
		-borderwidth 1 \
		-menu .dw.mhelp.m -font $pref(font_normal) -text Help 
	menu $base.mhelp.m \
		-borderwidth 1 -font $pref(font_normal) \
		-tearoff 0 
	$base.mhelp.m add command \
		-label Contents 
	$base.mhelp.m add command \
		-label PostgreSQL 
	$base.mhelp.m add separator
	$base.mhelp.m add command \
		-command {Window show .about} -label About 
	place $base.labframe \
		-x 80 -y 30 -width 236 -height 300 -anchor nw -bordermode ignore 
	place $base.lb \
		-x 90 -y 75 -width 205 -height 243 -anchor nw -bordermode ignore 
	place $base.btnnew \
		-x 90 -y 40 -width 60 -height 25 -anchor nw -bordermode ignore 
	place $base.btnopen \
		-x 165 -y 40 -width 60 -height 25 -anchor nw -bordermode ignore 
	place $base.btndesign \
		-x 235 -y 40 -width 60 -height 25 -anchor nw -bordermode ignore 
	place $base.lmask \
		-x 155 -y 45 -width 10 -height 23 -anchor nw -bordermode ignore 
	place $base.label22 \
		-x 0 -y 0 -width 396 -height 23 -anchor nw -bordermode ignore 
	place $base.menubutton23 \
		-x 0 -y 3 -width 63 -height 17 -anchor nw -bordermode ignore 
	place $base.lshost \
		-x 3 -y 335 -width 91 -height 20 -anchor nw -bordermode ignore 
	place $base.lsdbname \
		-x 95 -y 335 -width 223 -height 20 -anchor nw -bordermode ignore 
	place $base.sb \
		-x 295 -y 74 -width 18 -height 245 -anchor nw -bordermode ignore 
	place $base.mnob \
		-x 70 -y 2 -width 44 -height 19 -anchor nw -bordermode ignore 
	place $base.mhelp \
		-x 280 -y 1 -height 20 -anchor nw -bordermode ignore 
}

proc vTclWindow.fw {base} {
	if {$base == ""} {
		set base .fw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 306x288+233+130
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm title $base "Function"
	label $base.l1  -borderwidth 0 -text Name 
	entry $base.e1  -background #fefefe -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable funcname 
	label $base.l2  -borderwidth 0 -text Parameters 
	entry $base.e2  -background #fefefe -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable funcpar 
	label $base.l3  -borderwidth 0 -text Returns 
	entry $base.e3  -background #fefefe -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable funcret 
	text $base.text1  -background #fefefe -borderwidth 1  -highlightthickness 1 -selectborderwidth 0 -wrap word 
	button $base.okbtn  -borderwidth 1  -command {
			if {$funcname==""} {
				show_error "You must supply a name for this function!"
			} elseif {$funcret==""} {
				show_error "You must supply a return type!"
			} else {
				set funcbody [.fw.text1 get 1.0 end]
				regsub -all "\n" $funcbody " " funcbody
				if {[sql_exec noquiet "create function $funcname ($funcpar) returns $funcret as '$funcbody' language 'sql'"]} {
					Window destroy .fw
					tk_messageBox -title PostgreSQL -message "Function created!"
					tab_click .dw.tabFunctions
				}
								
			}
		}  -state disabled -text Define 
	button $base.cancelbtn  -borderwidth 1 -command {Window destroy .fw} -text Close 
	place $base.l1  -x 15 -y 18 -anchor nw -bordermode ignore 
	place $base.e1  -x 95 -y 15 -width 198 -height 22 -anchor nw -bordermode ignore 
	place $base.l2  -x 15 -y 48 -anchor nw -bordermode ignore 
	place $base.e2  -x 95 -y 45 -width 198 -height 22 -anchor nw -bordermode ignore 
	place $base.l3  -x 15 -y 78 -anchor nw -bordermode ignore 
	place $base.e3  -x 95 -y 75 -width 198 -height 22 -anchor nw -bordermode ignore 
	place $base.text1  -x 15 -y 105 -width 275 -height 141 -anchor nw -bordermode ignore 
	place $base.okbtn  -x 90 -y 400 -anchor nw -bordermode ignore 
	place $base.cancelbtn  -x 160 -y 255 -anchor nw -bordermode ignore
}

proc vTclWindow.iew {base} {
	if {$base == ""} {
		set base .iew
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 287x151+259+304
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm title $base "Import-Export table"
	label $base.l1  -borderwidth 0 -text {Table name} 
	entry $base.e1  -background #fefefe -borderwidth 1 -textvariable ie_tablename 
	label $base.l2  -borderwidth 0 -text {File name} 
	entry $base.e2  -background #fefefe -borderwidth 1 -textvariable ie_filename 
	label $base.l3  -borderwidth 0 -text {Field delimiter} 
	entry $base.e3  -background #fefefe -borderwidth 1 -textvariable ie_delimiter 
	button $base.expbtn  -borderwidth 1  -command {if {$ie_tablename==""} {
	show_error "You have to supply a table name!"
} elseif {$ie_filename==""} {
	show_error "You have to supply a external file name!"
} else {
	if {$ie_delimiter==""} {
		set sup ""
	} else {
		set sup " USING DELIMITERS '$ie_delimiter'"
	}
	if {[.iew.expbtn cget -text]=="Import"} {
		set oper "FROM"
	} else {
		set oper "TO"
	}
		if {$oicb} {
				set sup2 " WITH OIDS "
		} else {
				set sup2 ""
		}
	set sqlcmd "COPY $ie_tablename $sup2 $oper '$ie_filename'$sup"
	cursor_clock
	if {[sql_exec noquiet $sqlcmd]} {
		tk_messageBox -title Information -parent .iew -message "Operation completed!"
		Window destroy .iew
	}
	cursor_normal
}}  -text Export 
	button $base.cancelbtn  -borderwidth 1 -command {Window destroy .iew} -text Cancel 
	checkbutton $base.oicb  -borderwidth 1  -text {with OIDs} -variable oicb 
	place $base.l1  -x 25 -y 15 -anchor nw -bordermode ignore 
	place $base.e1  -x 115 -y 10 -height 22 -anchor nw -bordermode ignore 
	place $base.l2  -x 25 -y 45 -anchor nw -bordermode ignore 
	place $base.e2  -x 115 -y 40 -height 22 -anchor nw -bordermode ignore 
	place $base.l3  -x 25 -y 75 -height 18 -anchor nw -bordermode ignore 
	place $base.e3  -x 115 -y 74 -width 33 -height 22 -anchor nw -bordermode ignore 
	place $base.expbtn  -x 60 -y 110 -height 25 -width 75 -anchor nw -bordermode ignore 
	place $base.cancelbtn  -x 155 -y 110 -height 25 -width 75 -anchor nw -bordermode ignore 
	place $base.oicb  -x 170 -y 75 -anchor nw -bordermode ignore
}

proc {mw_canvas_paste} {wn x y} {
	   global mw
	   $wn.c insert $mw($wn,id_edited) insert [selection get]
	   set mw($wn,dirtyrec) 1
}

proc {mw_create_window} {} {
global mwcount
	set base .mw$mwcount
	set wn .mw$mwcount
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 550x400
	wm maxsize $base 1009 738
	wm minsize $base 550 400
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm deiconify $base
	wm title $base "Table browser"
	bind $base <Key-Delete> "mw_delete_record $wn"
	frame $base.f1  -borderwidth 2 -height 75 -relief groove -width 125 
	label $base.f1.l1  -borderwidth 0 -text {Sort field} 
	entry $base.f1.e1  -background #fefefe -borderwidth 1 -width 14  -highlightthickness 1 -textvariable mw($wn,sortfield)
	bind $base.f1.e1 <Key-Return> "mw_reload $wn"	
	bind $base.f1.e1 <Key-KP_Enter> "mw_reload $wn"	
	label $base.f1.lb1  -borderwidth 0 -text {     } 
	label $base.f1.l2  -borderwidth 0 -text {Filter conditions} 
	entry $base.f1.e2  -background #fefefe -borderwidth 1  -highlightthickness 1 -textvariable mw($wn,filter)
	bind $base.f1.e2 <Key-Return> "mw_reload $wn"	
	bind $base.f1.e2 <Key-KP_Enter> "mw_reload $wn"	
	button $base.f1.b1  -borderwidth 1 -text Close -command "
if {\[mw_save_new_record $wn\]} {
	$wn.c delete rows
	$wn.c delete header
	set sortfield {}
	set filter {}
	Window destroy $wn
	mw_free_variables $wn
}
	"
	button $base.f1.b2  -borderwidth 1 -text Reload -command "mw_reload $wn"
	frame $base.frame20  -borderwidth 2 -height 75 -relief groove -width 125 
	button $base.frame20.01  -borderwidth 1 -text < -command "mw_pan_right $wn"
	label $base.frame20.02  -anchor w -borderwidth 1 -height 1  -relief sunken -text {} -textvariable mw($wn,msg) 
	button $base.frame20.03  -borderwidth 1 -text > -command "mw_pan_left $wn"
	canvas $base.c  -background #fefefe -borderwidth 2 -height 207 -highlightthickness 0  -relief ridge -selectborderwidth 0 -takefocus 1 -width 295 
	scrollbar $base.sb  -borderwidth 1 -orient vert -width 12  -command "mw_scroll_window $wn"
	bind $base.c <Button-1> "mw_canvas_click $wn %x %y"
	bind $base.c <Button-2> "mw_canvas_paste $wn %x %y"
	bind $base.c <Button-3> "if {[mw_exit_edit $wn]} \"mw_save_new_record $wn\""
	pack $base.f1  -in $wn -anchor center -expand 0 -fill x -side top 
	pack $base.f1.l1  -in $wn.f1 -anchor center -expand 0 -fill none -side left 
	pack $base.f1.e1  -in $wn.f1 -anchor center -expand 0 -fill none -side left 
	pack $base.f1.lb1  -in $wn.f1 -anchor center -expand 0 -fill none -side left 
	pack $base.f1.l2  -in $wn.f1 -anchor center -expand 0 -fill none -side left 
	pack $base.f1.e2  -in $wn.f1 -anchor center -expand 0 -fill none -side left 
	pack $base.f1.b1  -in $wn.f1 -anchor center -expand 0 -fill none -side right 
	pack $base.f1.b2  -in $wn.f1 -anchor center -expand 0 -fill none -side right 
	pack $base.frame20  -in $wn -anchor s -expand 0 -fill x -side bottom 
	pack $base.frame20.01  -in $wn.frame20 -anchor center -expand 0 -fill none -side left 
	pack $base.frame20.02  -in $wn.frame20 -anchor center -expand 1 -fill x -side left 
	pack $base.frame20.03  -in $wn.frame20 -anchor center -expand 0 -fill none -side right 
	pack $base.c -in $wn -anchor w -expand 1 -fill both -side left 
	pack $base.sb -in $wn -anchor e -expand 0 -fill y -side right
}

proc vTclWindow.nt {base} {
global pref
    if {$base == ""} {
        set base .nt
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    toplevel $base -class Toplevel
    wm focusmodel $base passive
    wm geometry $base 614x392+78+181
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 0 0
    wm deiconify $base
    wm title $base "Create new table"
    entry $base.etabn \
        -background #fefefe -borderwidth 1 -selectborderwidth 0 \
        -textvariable ntw(newtablename) 
    bind $base.etabn <Key-Return> {
        focus .nt.einh
    }
    label $base.li \
        -anchor w -borderwidth 0 -text Inherits 
    entry $base.einh \
        -background #fefefe -borderwidth 1 -selectborderwidth 0 \
        -textvariable ntw(fathername) 
    bind $base.einh <Key-Return> {
        focus .nt.e2
    }
    button $base.binh \
        -borderwidth 1 \
        -command {if {[winfo exists .nt.ddf]} {
	destroy .nt.ddf
} else {
	create_drop_down .nt 386 23 220
	focus .nt.ddf.sb
	foreach tbl [get_tables] {.nt.ddf.lb insert end $tbl}
	bind .nt.ddf.lb <ButtonRelease-1> {
		set i [.nt.ddf.lb curselection]
		if {$i!=""} {
			if {$ntw(fathername)==""} {
				set ntw(fathername) "\"[.nt.ddf.lb get $i]\""
			} else {
				set ntw(fathername) "$ntw(fathername),\"[.nt.ddf.lb get $i]\""
			}
		}
		if {$i!=""} {focus .nt.e2}
		destroy .nt.ddf
		break
	}
}} \
        -highlightthickness 0 -takefocus 0 -image dnarw
    entry $base.e2 \
        -background #fefefe -borderwidth 1 -selectborderwidth 0 \
        -textvariable ntw(fldname) 
    bind $base.e2 <Key-Return> {
        focus .nt.e1
    }
    entry $base.e1 \
        -background #fefefe -borderwidth 1 -selectborderwidth 0 \
        -textvariable ntw(fldtype) 
    bind $base.e1 <Key-Return> {
        focus .nt.e5
    }
    entry $base.e3 \
        -background #fefefe -borderwidth 1 -selectborderwidth 0 \
        -textvariable ntw(fldsize) 
    bind $base.e3 <Key-Return> {
        focus .nt.e5
    }
    entry $base.e5 \
        -background #fefefe -borderwidth 1 -selectborderwidth 0 \
        -textvariable ntw(defaultval) 
    bind $base.e5 <Key-Return> {
        focus .nt.cb1
    }
    checkbutton $base.cb1 \
        -borderwidth 1 \
        -offvalue { } -onvalue { NOT NULL} -text {field cannot be null} \
        -variable ntw(notnull) 
    label $base.lab1 \
        -borderwidth 0 -text type 
    label $base.lab2 \
        -borderwidth 0 -anchor w -text {Field name} 
    label $base.lab3 \
        -borderwidth 0 -text size 
    label $base.lab4 \
        -borderwidth 0 -anchor w -text {Default value} 
    button $base.addfld \
        -borderwidth 1 -command add_new_field \
        -text {Add field} 
    button $base.delfld \
        -borderwidth 1 -command {catch {.nt.lb delete [.nt.lb curselection]}} \
        -text {Delete field} 
    button $base.emptb \
        -borderwidth 1 -command {.nt.lb delete 0 [.nt.lb size]} \
        -text {Delete all} 
    button $base.maketbl \
        -borderwidth 1 -command create_table \
        -text Create 
    listbox $base.lb \
        -background #fefefe -borderwidth 1 \
	-selectbackground #c3c3c3 \
        -font $pref(font_fix) \
        -selectborderwidth 0 -yscrollcommand {.nt.sb set} 
    bind $base.lb <ButtonRelease-1> {
        if {[.nt.lb curselection]!=""} {
	set fldname [string trim [lindex [split [.nt.lb get [.nt.lb curselection]]] 0]]
}
    }
    button $base.exitbtn \
        -borderwidth 1 -command {Window destroy .nt} \
        -text Cancel 
    label $base.l1 \
        -anchor w -borderwidth 1 \
        -relief raised -text {       field name} 
    label $base.l2 \
        -borderwidth 1 \
        -relief raised -text type 
    label $base.l3 \
        -borderwidth 1 \
        -relief raised -text options 
    scrollbar $base.sb \
        -borderwidth 1 -command {.nt.lb yview} -orient vert 
    label $base.l93 \
        -anchor w -borderwidth 0 -text {Table name} 
    button $base.mvup \
        -borderwidth 1 \
        -command {if {[.nt.lb size]>1} {
	set i [.nt.lb curselection]
	if {($i!="")&&($i>0)} {
		.nt.lb insert [expr $i-1] [.nt.lb get $i]
		.nt.lb delete [expr $i+1]
		.nt.lb selection set [expr $i-1]
	}
}} \
        -text {Move up} 
    button $base.mvdn \
        -borderwidth 1 \
        -command {if {[.nt.lb size]>1} {
	set i [.nt.lb curselection]
	if {($i!="")&&($i<[expr [.nt.lb size]-1])} {
		.nt.lb insert [expr $i+2] [.nt.lb get $i]
		.nt.lb delete $i
		.nt.lb selection set [expr $i+1]
	}
}} \
        -text {Move down} 
    button $base.button17 \
        -borderwidth 1 \
        -command {
if {[winfo exists .nt.ddf]} {
	destroy .nt.ddf
} else {
	create_drop_down .nt 291 80 97
	focus .nt.ddf.sb
	.nt.ddf.lb insert end char varchar text int2 int4 serial float4 float8 money abstime date datetime interval reltime time timespan timestamp boolean box circle line lseg path point polygon
	bind .nt.ddf.lb <ButtonRelease-1> {
		set i [.nt.ddf.lb curselection]
		if {$i!=""} {set ntw(fldtype) [.nt.ddf.lb get $i]}
		destroy .nt.ddf
		if {$i!=""} {focus .nt.e3}
		break
	}
}} \
        -highlightthickness 0 -takefocus 0 -image dnarw 
    label $base.lco \
        -borderwidth 0 -anchor w -text Constraint 
    entry $base.eco \
        -background #fefefe -borderwidth 1 -textvariable ntw(constraint) 
    label $base.lch \
        -borderwidth 0 -text check 
    entry $base.ech \
        -background #fefefe -borderwidth 1 -textvariable ntw(check) 
    label $base.ll \
        -borderwidth 1 \
        -relief raised 
    checkbutton $base.pk \
        -borderwidth 1 \
        -offvalue { } -onvalue * -text {primary key} -variable ntw(pk) 
    label $base.lpk \
        -borderwidth 1 \
        -relief raised -text K 
    place $base.etabn \
        -x 85 -y 5 -width 156 -height 20 -anchor nw -bordermode ignore 
    place $base.li \
        -x 245 -y 7 -width 42 -height 16 -anchor nw -bordermode ignore 
    place $base.einh \
        -x 290 -y 5 -width 318 -height 20 -anchor nw -bordermode ignore 
    place $base.binh \
        -x 590 -y 7 -width 16 -height 16 -anchor nw -bordermode ignore 
    place $base.e2 \
        -x 85 -y 60 -width 156 -height 20 -anchor nw -bordermode ignore 
    place $base.e1 \
        -x 291 -y 60 -width 98 -height 20 -anchor nw -bordermode ignore 
    place $base.e3 \
        -x 445 -y 60 -width 46 -height 20 -anchor nw -bordermode ignore 
    place $base.e5 \
        -x 85 -y 82 -width 156 -height 20 -anchor nw -bordermode ignore 
    place $base.cb1 \
        -x 245 -y 83 -width 131 -height 20 -anchor nw -bordermode ignore 
    place $base.lab1 \
        -x 247 -y 62 -width 26 -height 16 -anchor nw -bordermode ignore 
    place $base.lab2 \
        -x 4 -y 62 -width 64 -height 16 -anchor nw -bordermode ignore 
    place $base.lab3 \
        -x 410 -y 62 -width 24 -height 16 -anchor nw -bordermode ignore 
    place $base.lab4 \
        -x 5 -y 83 -width 76 -height 16 -anchor nw -bordermode ignore 
    place $base.addfld \
        -x 534 -y 60 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.delfld \
        -x 534 -y 190 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.emptb \
        -x 534 -y 220 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.maketbl \
        -x 534 -y 365 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.lb \
        -x 4 -y 121 -width 506 -height 269 -anchor nw -bordermode ignore 
    place $base.exitbtn \
        -x 534 -y 335 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.l1 \
        -x 18 -y 105 -width 195 -height 18 -anchor nw -bordermode ignore 
    place $base.l2 \
        -x 213 -y 105 -width 88 -height 18 -anchor nw -bordermode ignore 
    place $base.l3 \
        -x 301 -y 105 -width 225 -height 18 -anchor nw -bordermode ignore 
    place $base.sb \
        -x 509 -y 121 -width 18 -height 269 -anchor nw -bordermode ignore 
    place $base.l93 \
        -x 4 -y 7 -width 67 -height 16 -anchor nw -bordermode ignore 
    place $base.mvup \
        -x 534 -y 120 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.mvdn \
        -x 534 -y 150 -width 75 -height 26 -anchor nw -bordermode ignore 
    place $base.button17 \
        -x 371 -y 62 -width 16 -height 16 -anchor nw -bordermode ignore 
    place $base.lco \
        -x 5 -y 28 -width 58 -height 16 -anchor nw -bordermode ignore 
    place $base.eco \
        -x 85 -y 27 -width 156 -height 20 -anchor nw -bordermode ignore 
    place $base.lch \
        -x 245 -y 30 -anchor nw -bordermode ignore 
    place $base.ech \
        -x 290 -y 27 -width 318 -height 22 -anchor nw -bordermode ignore 
    place $base.ll \
        -x 5 -y 53 -width 603 -height 2 -anchor nw -bordermode ignore 
    place $base.pk \
        -x 407 -y 83 -width 93 -height 20 -anchor nw -bordermode ignore 
    place $base.lpk \
        -x 4 -y 105 -width 14 -height 18 -anchor nw -bordermode ignore 
}

proc vTclWindow.pw {base} {
global pref
	if {$base == ""} {
		set base .pw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 322x227+210+219
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm title $base "Preferences"
	label $base.l1  -borderwidth 0 -text {Max rows displayed in table/query view} 
	entry $base.e1  -background #fefefe -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable pref(rows) 
	label $base.l2  -borderwidth 0 -text "Table viewer font"
	radiobutton $base.tvf  -borderwidth 1 -text {fixed width} -value clean -variable pref(tvfont)
	radiobutton $base.tvfv  -borderwidth 1 -text proportional -value helv -variable pref(tvfont)
	label $base.lfn -borderwidth 0 -anchor w -text "Font normal"
	label $base.lfb -borderwidth 0 -anchor w -text "Font bold"
	label $base.lfi -borderwidth 0 -anchor w -text "Font italic"
	label $base.lff -borderwidth 0 -anchor w -text "Font fixed"
	entry $base.efn -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable pref(font_normal)
	entry $base.efb -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable pref(font_bold)
	entry $base.efi -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable pref(font_italic)
	entry $base.eff -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable pref(font_fix)
	label $base.ll  -borderwidth 1 -relief sunken 
	checkbutton $base.alcb  -borderwidth 1 -text {Auto-load the last opened database at startup}  -variable pref(autoload) 
	button $base.okbtn  -borderwidth 1  -command {
if {$pref(rows)>200} {
	tk_messageBox -title Warning -parent .pw -message "A big number of rows displayed in table view will take a lot of memory!"
}
save_pref
Window destroy .pw
tk_messageBox -title Warning -message "Changed fonts may appear in the next working session!"
} -text Ok 
	place $base.l1  -x 10 -y 10 -anchor nw -bordermode ignore 
	place $base.e1  -x 240 -y 8 -width 65 -height 20 -anchor nw -bordermode ignore 
	place $base.l2  -x 10 -y 38 -anchor nw -bordermode ignore 
	place $base.tvf  -x 115 -y 34 -anchor nw -bordermode ignore 
	place $base.tvfv  -x 205 -y 34 -anchor nw -bordermode ignore 
	place $base.lfn -x 10 -y 65 -anchor nw
	place $base.lfb -x 10 -y 86 -anchor nw
	place $base.lfi -x 10 -y 107 -anchor nw
	place $base.lff -x 10 -y 128 -anchor nw
	place $base.efn -x 80 -y 63 -width 230 -height 20
	place $base.efb -x 80 -y 84 -width 230 -height 20
	place $base.efi -x 80 -y 105 -width 230 -height 20
	place $base.eff -x 80 -y 126 -width 230 -height 20
	place $base.ll  -x 10 -y 150 -width 301 -height 2 -anchor nw -bordermode ignore 
	place $base.alcb  -x 10 -y 155 -anchor nw -bordermode ignore 
	place $base.okbtn  -x 125 -y 195 -width 80 -height 26 -anchor nw -bordermode ignore
}

proc vTclWindow.qb {base} {
global pref
	if {$base == ""} {
		set base .qb
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 442x344+150+150
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm deiconify $base
	wm title $base "Query builder"
	label $base.lqn  -borderwidth 0 -text {Query name} 
	entry $base.eqn  -background #fefefe -borderwidth 1 -foreground #000000  -highlightthickness 1 -selectborderwidth 0 -textvariable queryname 
	button $base.savebtn  -borderwidth 1  -command {if {$queryname==""} then {
	show_error "You have to supply a name for this query!"
	focus .qb.eqn
} else {
	set qcmd [.qb.text1 get 1.0 end]
	regsub -all "\n" $qcmd " " qcmd
	if {$qcmd==""} then {
	show_error "This query has no commands ?"
	} else {
		if { [lindex [split [string toupper [string trim $qcmd]]] 0] == "SELECT" } {
			set qtype S
		} else {
			set qtype A
		}
		if {$cbv} {
			wpg_select $dbc "select pg_get_viewdef('$queryname') as vd" tup {
				if {$tup(vd)!="Not a view"} {
					if {[tk_messageBox -title Warning -message "View '$queryname' already exists! Delete ?" -type yesno -default no]=="yes"} {
						set pg_res [wpg_exec $dbc "drop view \"$queryname\""]
						if {$pgsql(status)!="PGRES_COMMAND_OK"} {
							show_error "Error deleting view '$queryname'"
						}
					}
				}
			}
			set pgres [wpg_exec $dbc "create view \"$queryname\" as $qcmd"]
			if {$pgsql(status)!="PGRES_COMMAND_OK"} {
				show_error "Error defining view\n\n$pgsql(errmsg)"
			} else {
				tab_click .dw.tabViews
				Window destroy .qb
			}
			catch {pg_result $pgres -clear}
		} else {
			regsub -all "'" $qcmd "''" qcmd
			cursor_clock
			if {$queryoid==0} then {
				set pgres [wpg_exec $dbc "insert into pga_queries values ('$queryname','$qtype','$qcmd')"]
			} else {
				set pgres [wpg_exec $dbc "update pga_queries set queryname='$queryname',querytype='$qtype',querycommand='$qcmd' where oid=$queryoid"]
			}
			cursor_normal
			if {$pgsql(status)!="PGRES_COMMAND_OK"} then {
				show_error "Error executing query\n$pgres(errmsg)"
			} else {
				tab_click .dw.tabQueries
				if {$queryoid==0} {set queryoid [pg_result $pgres -oid]}
			}
		}
		catch {pg_result $pgres -clear}
	}
}}  -text {Save query definition} 
	button $base.execbtn  -borderwidth 1  -command {
set qcmd [.qb.text1 get 0.0 end]
regsub -all "\n" [string trim $qcmd] " " qcmd
if {[lindex [split [string toupper $qcmd]] 0]!="SELECT"} {
	if {[tk_messageBox -title Warning -parent .qb -message "This is an action query!\n\nExecute it?" -type yesno -default no]=="yes"} {
		sql_exec noquiet $qcmd
	}
} else {
	set wn [mw_get_new_name]
	set mw($wn,query) [subst $qcmd]
	set mw($wn,updatable) 0
	set mw($wn,isaquery) 1
	mw_create_window
	mw_load_layout $wn $queryname
	mw_select_records $wn $mw($wn,query)
}
} -text {Execute query} 
	button $base.termbtn  -borderwidth 1  -command {.qb.cbv configure -state normal
set cbv 0
set queryname {}
.qb.text1 delete 1.0 end
Window destroy .qb} -text Close 
	text $base.text1  -background #fefefe -borderwidth 1  -font $pref(font_normal) -foreground #000000 -highlightthickness 1 -wrap word 
	checkbutton $base.cbv  -borderwidth 1  -text {Save this query as a view} -variable cbv 
	button $base.qlshow  -borderwidth 1  -command {Window show .ql
ql_draw_lizzard
focus .ql.entt} -text {Visual designer} 
	place $base.lqn  -x 5 -y 5 -anchor nw -bordermode ignore 
	place $base.eqn  -x 80 -y 1 -width 355 -height 24 -anchor nw -bordermode ignore 
	place $base.savebtn  -x 5 -y 60 -height 25 -anchor nw -bordermode ignore 
	place $base.execbtn  -x 150 -y 60 -height 25 -anchor nw -bordermode ignore 
	place $base.termbtn  -x 375 -y 60 -width 50 -height 25 -anchor nw -bordermode ignore 
	place $base.text1  -x 5 -y 90 -width 430 -height 246 -anchor nw -bordermode ignore 
	place $base.cbv  -x 5 -y 30 -height 25 -anchor nw -bordermode ignore 
	place $base.qlshow  -x 255 -y 60 -height 25 -anchor nw -bordermode ignore
}

proc vTclWindow.ql {base} {
global pref
	if {$base == ""} {
		set base .ql
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 759x530+10+13
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm deiconify $base
	wm title $base "Visual query designer"
	bind $base <B1-Motion> {
		ql_pan %x %y
	}
	bind $base <Button-1> {
		qlc_click %x %y %W
	}
	bind $base <ButtonRelease-1> {
		ql_dragstop %x %y
	}
	bind $base <Key-Delete> {
		ql_delete_object
	}
	canvas $base.c  -background #fefefe -borderwidth 2 -height 207 -relief ridge  -takefocus 0 -width 295 
	button $base.exitbtn  -borderwidth 1 -command {
ql_init
Window destroy .ql} -text Close 
	button $base.showbtn  -borderwidth 1 -command ql_show_sql -text {Show SQL} 
	label $base.l12  -borderwidth 0 -text {Add table} 
	entry $base.entt  -background #fefefe -borderwidth 1 -highlightthickness 1  -selectborderwidth 0 -textvariable qlvar(newtablename) 
	bind $base.entt <Key-Return> {
		ql_add_new_table
	}
	button $base.execbtn  -borderwidth 1  -command {
set qcmd [ql_compute_sql]
set wn [mw_get_new_name]
set mw($wn,query) [subst $qcmd]
set mw($wn,updatable) 0
set mw($wn,isaquery) 1
mw_create_window
mw_load_layout $wn nolayoutneeded
mw_select_records $wn $mw($wn,query)} -text {Execute SQL} 
	button $base.stoqb  -borderwidth 1  -command {Window show .qb
.qb.text1 delete 1.0 end
.qb.text1 insert end [ql_compute_sql]
focus .qb} -text {Save to query builder} 
	button $base.bdd  -borderwidth 1  -command {if {[winfo exists .ql.ddf]} {
	destroy .ql.ddf
} else {
	create_drop_down .ql 70 27 200
	focus .ql.ddf.sb
	foreach tbl [get_tables] {.ql.ddf.lb insert end $tbl}
	bind .ql.ddf.lb <ButtonRelease-1> {
		set i [.ql.ddf.lb curselection]
		if {$i!=""} {
			set qlvar(newtablename) [.ql.ddf.lb get $i]
			ql_add_new_table
		}
		destroy .ql.ddf
		break
	}
}}  -image dnarw 
	place $base.c  -x 5 -y 30 -width 748 -height 500 -anchor nw -bordermode ignore 
	place $base.exitbtn  -x 695 -y 5 -height 25 -anchor nw -bordermode ignore 
	place $base.showbtn  -x 367 -y 5 -height 25 -anchor nw -bordermode ignore 
	place $base.l12  -x 10 -y 8 -width 53 -height 16 -anchor nw -bordermode ignore 
	place $base.entt  -x 70 -y 7 -width 126 -height 20 -anchor nw -bordermode ignore 
	place $base.execbtn  -x 452 -y 5 -height 25 -anchor nw -bordermode ignore 
	place $base.stoqb  -x 550 -y 5 -height 25 -anchor nw -bordermode ignore 
	place $base.bdd  -x 200 -y 7 -width 17 -height 20 -anchor nw -bordermode ignore
}


proc vTclWindow.rf {base} {
	if {$base == ""} {
		set base .rf
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 272x105+294+262
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm title $base "Rename"
	label $base.l1  -borderwidth 0 -text {New name} 
	entry $base.e1  -background #fefefe -borderwidth 1 -textvariable newobjname 
	button $base.b1  -borderwidth 1  -command {
			if {$newobjname==""} {
				show_error "You must give object a new name!"
			} elseif {$activetab=="Tables"} {
				set retval [sql_exec noquiet "alter table \"$oldobjname\" rename to \"$newobjname\""]
				if {$retval} {
					sql_exec quiet "update pga_layout set tablename='$newobjname' where tablename='$oldobjname'"
					cmd_Tables
					Window destroy .rf
				}			
			} elseif {$activetab=="Queries"} {
				set pgres [wpg_exec $dbc "select * from pga_queries where queryname='$newobjname'"]
				if {$pgsql(status)!="PGRES_TUPLES_OK"} {
					show_error "Error retrieving from pga_queries\n$pgsql(errmsg)\n$pgsql(status)"
				} elseif {[pg_result $pgres -numTuples]>0} {
					show_error "Query \"$newobjname\" already exists!"
				} else {
					sql_exec noquiet "update pga_queries set queryname='$newobjname' where queryname='$oldobjname'"
					sql_exec noquiet "update pga_layout set tablename='$newobjname' where tablename='$oldobjname'"
					cmd_Queries
					Window destroy .rf
				}
				catch {pg_result $pgres -clear}
			}
	   } -text Rename 
	button $base.b2  -borderwidth 1 -command {Window destroy .rf} -text Cancel 
	place $base.l1  -x 15 -y 28 -anchor nw -bordermode ignore 
	place $base.e1  -x 100 -y 25 -anchor nw -bordermode ignore 
	place $base.b1  -x 65 -y 65 -width 70 -anchor nw -bordermode ignore 
	place $base.b2  -x 145 -y 65 -width 70 -anchor nw -bordermode ignore
}

proc vTclWindow.rb {base} {
global pref
	if {$base == ""} {
		set base .rb
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 652x426+96+120
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm deiconify $base
	wm title $base "Report builder"
	label $base.l1 \
		-borderwidth 1 \
		-relief raised -text {Report fields} 
	listbox $base.lb \
		-background #fefefe -borderwidth 1 \
		-selectbackground #c3c3c3 \
		-highlightthickness 1 -selectborderwidth 0 \
		-yscrollcommand {.rb.sb set} 
	bind $base.lb <ButtonRelease-1> {
		rb_add_field
	}
	canvas $base.c \
		-background #fffeff -borderwidth 2 -height 207 -highlightthickness 0 \
		-relief ridge -takefocus 1 -width 295 
	bind $base.c <Button-1> {
		rb_dragstart %W %x %y
	}
	bind $base.c <ButtonRelease-1> {
		rb_dragstop %x %y
	}
	bind $base.c <Key-Delete> {
		rb_delete_object
	}
	bind $base.c <Motion> {
		rb_dragit %W %x %y
	}
	button $base.bt2 \
		-borderwidth 1 \
		-command {if {[tk_messageBox -title Warning -parent .rb -message "All report information will be deleted.\n\nProceed ?" -type yesno -default no]=="yes"} then {
.rb.c delete all
rb_init
rb_draw_regions
}} \
		-text {Clear all} 
	button $base.bt4 \
		-borderwidth 1 -command rb_preview \
		-text Preview 
	button $base.bt5 \
		-borderwidth 1 -command {Window destroy .rb} \
		-text Quit 
	scrollbar $base.sb \
		-borderwidth 1 -command {.rb.lb yview} -orient vert 
	label $base.lmsg \
		-anchor w \
		-relief groove -text {Report header} -textvariable rbvar(msg) 
	entry $base.e2 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-textvariable rbvar(tablename) 
	bind $base.e2 <Key-Return> {
		rb_get_report_fields
	}
	entry $base.elab \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-textvariable rbvar(labeltext) 
	button $base.badl \
		-borderwidth 1 -command rb_add_label \
		-text {Add label} 
	label $base.lbold \
		-borderwidth 1 -relief raised -text B 
	bind $base.lbold <Button-1> {
		if {[rb_get_bold]=="Bold"} {
   .rb.lbold configure -relief raised
} else {
   .rb.lbold configure -relief sunken
}
rb_change_object_font
	}
	label $base.lita \
		-borderwidth 1 \
		-font $pref(font_italic) \
		-relief raised -text i 
	bind $base.lita <Button-1> {
		if {[rb_get_italic]=="O"} {
   .rb.lita configure -relief raised
} else {
   .rb.lita configure -relief sunken
}
rb_change_object_font
	}
	entry $base.eps \
		-background #fefefe -highlightthickness 0 -relief groove \
		-textvariable rbvar(pointsize) 
	bind $base.eps <Key-Return> {
		rb_change_object_font
	}
	label $base.linfo \
		-anchor w  \
		-relief groove -text {Database field} -textvariable rbvar(info) 
	label $base.llal \
		-borderwidth 0 -text Align 
	button $base.balign \
		-borderwidth 0 -command rb_flip_align \
		-relief groove -text right 
	button $base.savebtn \
		-borderwidth 1 -command rb_save_report \
		-text Save 
	label $base.lfn \
		-borderwidth 0 -text Font 
	button $base.bfont \
		-borderwidth 0 \
		-command {set temp [.rb.bfont cget -text]
if {$temp=="Courier"} then {
  .rb.bfont configure -text Helvetica
} else {
  .rb.bfont configure -text Courier
}
rb_change_object_font} \
		-relief groove -text Courier 
	button $base.bdd \
		-borderwidth 1 \
		-command {if {[winfo exists .rb.ddf]} {
	destroy .rb.ddf
} else {
	create_drop_down .rb 405 22 200
	focus .rb.ddf.sb
	foreach tbl [get_tables] {.rb.ddf.lb insert end $tbl}
	bind .rb.ddf.lb <ButtonRelease-1> {
		set i [.rb.ddf.lb curselection]
		if {$i!=""} {set rbvar(tablename) [.rb.ddf.lb get $i]}
		destroy .rb.ddf
		rb_get_report_fields
		break
	}
}} \
		-highlightthickness 0 -image dnarw 
	label $base.lrn \
		-borderwidth 0 -text {Report name} 
	entry $base.ern \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-textvariable rbvar(reportname) 
	bind $base.ern <Key-F5> {
		rb_load_report
	}
	label $base.lrs \
		-borderwidth 0 -text {Report source} 
	label $base.ls \
		-borderwidth 1 -relief raised 
	entry $base.ef \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-textvariable rbvar(formula) 
	button $base.baf \
		-borderwidth 1 \
		-text {Add formula} 
	place $base.l1 \
		-x 5 -y 55 -width 131 -height 18 -anchor nw -bordermode ignore 
	place $base.lb \
		-x 5 -y 70 -width 118 -height 121 -anchor nw -bordermode ignore 
	place $base.c \
		-x 140 -y 75 -width 508 -height 345 -anchor nw -bordermode ignore 
	place $base.bt2 \
		-x 5 -y 365 -width 64 -height 26 -anchor nw -bordermode ignore 
	place $base.bt4 \
		-x 70 -y 365 -width 66 -height 26 -anchor nw -bordermode ignore 
	place $base.bt5 \
		-x 70 -y 395 -width 66 -height 26 -anchor nw -bordermode ignore 
	place $base.sb \
		-x 120 -y 70 -width 18 -height 122 -anchor nw -bordermode ignore 
	place $base.lmsg \
		-x 142 -y 55 -width 151 -height 18 -anchor nw -bordermode ignore 
	place $base.e2 \
		-x 405 -y 4 -width 129 -height 18 -anchor nw -bordermode ignore 
	place $base.elab \
		-x 5 -y 225 -width 130 -height 18 -anchor nw -bordermode ignore 
	place $base.badl \
		-x 5 -y 243 -width 132 -height 26 -anchor nw -bordermode ignore 
	place $base.lbold \
		-x 535 -y 55 -width 18 -height 18 -anchor nw -bordermode ignore 
	place $base.lita \
		-x 555 -y 55 -width 18 -height 18 -anchor nw -bordermode ignore 
	place $base.eps \
		-x 500 -y 55 -width 30 -height 18 -anchor nw -bordermode ignore 
	place $base.linfo \
		-x 295 -y 55 -width 91 -height 18 -anchor nw -bordermode ignore 
	place $base.llal \
		-x 575 -y 56 -anchor nw -bordermode ignore 
	place $base.balign \
		-x 610 -y 54 -width 35 -height 21 -anchor nw -bordermode ignore 
	place $base.savebtn \
		-x 5 -y 395 -width 64 -height 26 -anchor nw -bordermode ignore 
	place $base.lfn \
		-x 405 -y 56 -anchor nw -bordermode ignore 
	place $base.bfont \
		-x 435 -y 54 -width 65 -height 21 -anchor nw -bordermode ignore 
	place $base.bdd \
		-x 535 -y 4 -width 15 -height 20 -anchor nw -bordermode ignore 
	place $base.lrn \
		-x 5 -y 5 -anchor nw -bordermode ignore 
	place $base.ern \
		-x 80 -y 4 -width 219 -height 18 -anchor nw -bordermode ignore 
	place $base.lrs \
		-x 320 -y 5 -anchor nw -bordermode ignore 
	place $base.ls \
		-x 5 -y 30 -width 641 -height 2 -anchor nw -bordermode ignore 
	place $base.ef \
		-x 5 -y 280 -width 130 -height 18 -anchor nw -bordermode ignore 
	place $base.baf \
		-x 5 -y 298 -width 132 -height 26 -anchor nw -bordermode ignore 
}

proc vTclWindow.rpv {base} {
	if {$base == ""} {
		set base .rpv
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 495x500+230+50
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm title $base "Report preview"
	frame $base.fr \
		-borderwidth 2 -height 75 -relief groove -width 125 
	canvas $base.fr.c \
		-background #fcfefe -borderwidth 2 -height 207 -relief ridge \
		-scrollregion {0 0 1000 824} -width 295 \
		-yscrollcommand {.rpv.fr.sb set} 
	scrollbar $base.fr.sb \
		-borderwidth 1 -command {.rpv.fr.c yview} -highlightthickness 0 \
		-orient vert -width 12 
	frame $base.f1 \
		-borderwidth 2 -height 75 -width 125 
	button $base.f1.button18 \
		-borderwidth 1 -command {if {$rbvar(justpreview)} then {Window destroy .rb} ; Window destroy .rpv} \
		-text Close 
	button $base.f1.button17 \
		-borderwidth 1 -command rb_print_report \
		-text Print 
	pack $base.fr \
		-in .rpv -anchor center -expand 1 -fill both -side top 
	pack $base.fr.c \
		-in .rpv.fr -anchor center -expand 1 -fill both -side left 
	pack $base.fr.sb \
		-in .rpv.fr -anchor center -expand 0 -fill y -side right 
	pack $base.f1 \
		-in .rpv -anchor center -expand 0 -fill none -side top 
	pack $base.f1.button18 \
		-in .rpv.f1 -anchor center -expand 0 -fill none -side right 
	pack $base.f1.button17 \
		-in .rpv.f1 -anchor center -expand 0 -fill none -side left 
}

proc vTclWindow.sqf {base} {
	if {$base == ""} {
		set base .sqf
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 310x223+245+158
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm title $base "Sequence"
	label $base.l1  -anchor w -borderwidth 0 -text {Sequence name} 
	entry $base.e1  -borderwidth 1 -highlightthickness 1 -textvariable seq_name 
	label $base.l2  -borderwidth 0 -text Increment 
	entry $base.e2  -borderwidth 1 -highlightthickness 1 -selectborderwidth 0  -textvariable seq_inc 
	label $base.l3  -borderwidth 0 -text {Start value} 
	entry $base.e3  -borderwidth 1 -highlightthickness 1 -selectborderwidth 0  -textvariable seq_start 
	label $base.l4  -borderwidth 0 -text Minvalue 
	entry $base.e4  -borderwidth 1 -highlightthickness 1 -selectborderwidth 0  -textvariable seq_minval 
	label $base.l5  -borderwidth 0 -text Maxvalue 
	entry $base.e5  -borderwidth 1 -highlightthickness 1 -selectborderwidth 0  -textvariable seq_maxval 
	button $base.defbtn  -borderwidth 1  -command {
		if {$seq_name==""} {
			show_error "You should supply a name for this sequence"
		} else {
			set s1 {};set s2 {};set s3 {};set s4 {};
			if {$seq_inc!=""} {set s1 "increment $seq_inc"};
			if {$seq_start!=""} {set s2 "start $seq_start"};
			if {$seq_minval!=""} {set s3 "minvalue $seq_minval"};
			if {$seq_maxval!=""} {set s4 "maxvalue $seq_maxval"};
			set sqlcmd "create sequence \"$seq_name\" $s1 $s2 $s3 $s4"
			if {[sql_exec noquiet $sqlcmd]} {
				cmd_Sequences
				tk_messageBox -title Information -parent .sqf -message "Sequence created!"
			}
		}
	} -text {Define sequence} 
	button $base.closebtn  -borderwidth 1  -command {for {set i 1} {$i<6} {incr i} {
	.sqf.e$i configure -state normal
	.sqf.e$i delete 0 end
	.sqf.defbtn configure -state normal
	.sqf.l3 configure -text {Start value}
}
place .sqf.defbtn -x 40 -y 175
Window destroy .sqf
} -text Close 
	place $base.l1  -x 20 -y 20 -width 111 -height 18 -anchor nw -bordermode ignore 
	place $base.e1  -x 135 -y 19 -anchor nw -bordermode ignore 
	place $base.l2  -x 20 -y 50 -anchor nw -bordermode ignore 
	place $base.e2  -x 135 -y 49 -anchor nw -bordermode ignore 
	place $base.l3  -x 20 -y 80 -anchor nw -bordermode ignore 
	place $base.e3  -x 135 -y 79 -anchor nw -bordermode ignore 
	place $base.l4  -x 20 -y 110 -anchor nw -bordermode ignore 
	place $base.e4  -x 135 -y 109 -anchor nw -bordermode ignore 
	place $base.l5  -x 20 -y 140 -anchor nw -bordermode ignore 
	place $base.e5  -x 135 -y 139 -anchor nw -bordermode ignore 
	place $base.defbtn  -x 40 -y 175 -anchor nw -bordermode ignore 
	place $base.closebtn  -x 195 -y 175 -anchor nw -bordermode ignore
}

proc vTclWindow.sw {base} {
global pref
	if {$base == ""} {
		set base .sw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 594x416+192+152
	wm maxsize $base 1009 738
	wm minsize $base 300 300
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm title $base "Design script"
	frame $base.f1  -height 55 -relief groove -width 125 
	label $base.f1.l1  -borderwidth 0 -text {Script name} 
	entry $base.f1.e1  -background #fefefe -borderwidth 1 -highlightthickness 0  -textvariable scriptname -width 32 
	text $base.src  -background #fefefe  -font $pref(font_normal) -height 2  -highlightthickness 1 -selectborderwidth 0 -width 2 
	frame $base.f2  -height 75 -relief groove -width 125 
	button $base.f2.b1  -borderwidth 1 -command {Window destroy .sw} -text Cancel 
	button $base.f2.b2  -borderwidth 1  -command {if {$scriptname==""} {
	tk_messageBox -title Warning -parent .sw -message "The script must have a name!"
} else {
   sql_exec noquiet "delete from pga_scripts where scriptname='$scriptname'"
   regsub -all {\\} [.sw.src get 1.0 end] {\\\\} scriptsource
   regsub -all ' $scriptsource  \\' scriptsource
   sql_exec noquiet "insert into pga_scripts values ('$scriptname','$scriptsource')"
   cmd_Scripts
}}  -text Save -width 6 
	pack $base.f1  -in .sw -anchor center -expand 0 -fill x -pady 2 -side top 
	pack $base.f1.l1  -in .sw.f1 -anchor center -expand 0 -fill none -ipadx 2 -side left 
	pack $base.f1.e1  -in .sw.f1 -anchor center -expand 0 -fill none -side left 
	pack $base.src  -in .sw -anchor center -expand 1 -fill both -padx 2 -side top 
	pack $base.f2  -in .sw -anchor center -expand 0 -fill none -side top 
	pack $base.f2.b1  -in .sw.f2 -anchor center -expand 0 -fill none -side right 
	pack $base.f2.b2  -in .sw.f2 -anchor center -expand 0 -fill none -side right
}

proc vTclWindow.tiw {base} {
global pref
	if {$base == ""} {
		set base .tiw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 390x460+243+20
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm title $base "Table information"
	label $base.l1  -borderwidth 0 -text {Table name} 
	label $base.l2  -anchor w -borderwidth 0 -text conturi -textvariable tiw(tablename) 
	label $base.l3  -borderwidth 0 -text Owner 
	label $base.l4  -anchor w -borderwidth 1  -textvariable tiw(owner) 
	listbox $base.lb  -background #fefefe -selectbackground #c3c3c3 -borderwidth 1  -font $pref(font_fix)  -highlightthickness 1 -selectborderwidth 0  -yscrollcommand {.tiw.sb set} 
	scrollbar $base.sb  -activebackground #d9d9d9 -activerelief sunken -borderwidth 1  -command {.tiw.lb yview} -orient vert 
	button $base.closebtn  -borderwidth 1 -command {Window destroy .tiw}  -pady 3 -text Close
	button $base.renbtn -borderwidth 1 -command {
	if {[set tiw(col_id) [.tiw.lb curselection]]==""} then {bell} else {set tiw(old_cn) [.tiw.lb get [.tiw.lb curselection]] ; set tiw(new_cn) {} ; Window show .rcw ; tkwait visibility .rcw ; wm transient .rcw .tiw ; focus .rcw.e1}} -text {Rename field}
	button $base.addbtn -borderwidth 1 -command "Window show .anfw ; set anfw(name) {} ; set anfw(type) {} ; wm transient .anfw .tiw ; focus .anfw.e1" -text "Add new field"
	label $base.l10  -borderwidth 1  -relief raised -text {field name}
	label $base.l11  -borderwidth 1  -relief raised -text {field type}
	label $base.l12  -borderwidth 1  -relief raised -text size
	label $base.lfi  -borderwidth 0 -text {Field information}
	label $base.lii  -borderwidth 1  -relief raised -text {Indexes defined}
	listbox $base.ilb  -background #fefefe -borderwidth 1  -highlightthickness 1 -selectborderwidth 0 -selectbackground #c3c3c3
	bind $base.ilb <ButtonRelease-1> {
		tiw_show_index
	}
	label $base.lip  -borderwidth 1  -relief raised -text {index properties}
	frame $base.fr11  -borderwidth 1 -height 75 -relief sunken -width 125
	label $base.fr11.l9  -borderwidth 0 -text {Is clustered ?} 
	label $base.fr11.l2  -borderwidth 0 -text {Is unique ?} 
	label $base.fr11.liu  -anchor nw -borderwidth 0 -text Yes -textvariable tiw(isunique) 
	label $base.fr11.lic  -anchor nw -borderwidth 0 -text No -textvariable tiw(isclustered) 
	label $base.fr11.l5  -borderwidth 0 -text {Fields :} 
	label $base.fr11.lif  -anchor nw -borderwidth 1  -justify left -relief sunken -text cont  -textvariable tiw(indexfields) -wraplength 170 
	place $base.l1  -x 20 -y 15 -anchor nw -bordermode ignore 
	place $base.l2  -x 100 -y 14 -width 161 -height 18 -anchor nw -bordermode ignore 
	place $base.l3  -x 20 -y 35 -anchor nw -bordermode ignore 
	place $base.l4  -x 100 -y 34 -width 226 -height 18 -anchor nw -bordermode ignore 
	place $base.lb  -x 20 -y 91 -width 338 -height 171 -anchor nw -bordermode ignore 
	place $base.renbtn -x 20 -y 263 -height 25
	place $base.addbtn -x 120 -y 263 -height 25
	place $base.sb  -x 355 -y 90 -width 18 -height 173 -anchor nw -bordermode ignore 
	place $base.closebtn  -x 325 -y 5 -height 25 -anchor nw -bordermode ignore 
	place $base.l10  -x 21 -y 75 -width 204 -height 18 -anchor nw -bordermode ignore 
	place $base.l11  -x 225 -y 75 -width 90 -height 18 -anchor nw -bordermode ignore 
	place $base.l12  -x 315 -y 75 -width 41 -height 18 -anchor nw -bordermode ignore 
	place $base.lfi  -x 20 -y 55 -anchor nw -bordermode ignore 
	place $base.lii  -x 20 -y 290 -width 151 -height 18 -anchor nw -bordermode ignore 
	place $base.ilb  -x 20 -y 306 -width 150 -height 148 -anchor nw -bordermode ignore 
	place $base.lip  -x 171 -y 290 -width 198 -height 18 -anchor nw -bordermode ignore 
	place $base.fr11  -x 170 -y 307 -width 199 -height 147 -anchor nw -bordermode ignore 
	place $base.fr11.l9  -x 10 -y 30 -anchor nw -bordermode ignore 
	place $base.fr11.l2  -x 10 -y 10 -anchor nw -bordermode ignore 
	place $base.fr11.liu  -x 95 -y 10 -width 27 -height 16 -anchor nw -bordermode ignore 
	place $base.fr11.lic  -x 95 -y 30 -width 32 -height 16 -anchor nw -bordermode ignore 
	place $base.fr11.l5  -x 10 -y 55 -anchor nw -bordermode ignore 
	place $base.fr11.lif  -x 10 -y 70 -width 178 -height 68 -anchor nw -bordermode ignore
}

proc vTclWindow.fd {base} {
	if {$base == ""} {
		set base .fd
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 377x315+103+101
	wm maxsize $base 785 570
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm deiconify $base
	wm title $base "Form design"
	bind $base <Key-Delete> {
		fd_delete_object
	}
	canvas $base.c \
		-background #828282 -height 207 -highlightthickness 0 -relief ridge \
		-selectborderwidth 0 -width 295 
	bind $base.c <Button-1> {
		fd_mouse_down %x %y
	}
	bind $base.c <ButtonRelease-1> {
		fd_mouse_up %x %y
	}
	bind $base.c <Motion> {
		fd_mouse_move %x %y
	}
	pack $base.c \
		-in .fd -anchor center -expand 1 -fill both -side top 
}

proc vTclWindow.fda {base} {
	if {$base == ""} {
		set base .fda
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 225x197+561+0
	wm maxsize $base 785 570
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm deiconify $base
	wm title $base "Attributes"
	label $base.l1 \
		-anchor nw -borderwidth 0 \
		-justify left -text Name -width 8 
	entry $base.e1 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_name) 
	bind $base.e1 <Key-Return> {
		fd_set_name
	}
	label $base.l2 \
		-anchor nw -borderwidth 0 \
		-justify left -text Top -width 8 
	entry $base.e2 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_top) 
	bind $base.e2 <Key-Return> {
		fd_change_coord
	}
	label $base.l3 \
		-anchor w -borderwidth 0 \
		-text Left -width 8 
	entry $base.e3 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_left) 
	bind $base.e3 <Key-Return> {
		fd_change_coord
	}
	label $base.l4 \
		-anchor w -borderwidth 0 \
		-text Width \
		-width 8 
	entry $base.e4 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_width) 
	bind $base.e4 <Key-Return> {
		fd_change_coord
	}
	label $base.l5 \
		-anchor w -borderwidth 0 -padx 0 -text Height -width 8 
	entry $base.e5 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_height) 
	bind $base.e5 <Key-Return> {
		fd_change_coord
	}
	label $base.l6 \
		-borderwidth 0 -text Command 
	entry $base.e6 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_cmd) 
	bind $base.e6 <Key-Return> {
		fd_set_command
	}
	button $base.bcmd \
		-borderwidth 1 \
		-command {Window show .fdcmd
.fdcmd.f.txt delete 1.0 end
.fdcmd.f.txt insert end $fdvar(c_cmd)} \
		-text ... -width 1 
	label $base.l7 \
		-anchor w -borderwidth 0 \
		-text Variable -width 8 
	entry $base.e7 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_var) 
	bind $base.e7 <Key-Return> {
		set fdobj($fdvar(moveitemobj),v) $fdvar(c_var)
	}
	label $base.l8 \
		-anchor w -borderwidth 0 \
		-text Text -width 8 
	entry $base.e8 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(c_text) 
	bind $base.e8 <Key-Return> {
		fd_set_text
	}
	label $base.l0 \
		-borderwidth 1 -relief raised -text {checkbox .udf0.checkbox17} \
		-textvariable fdvar(c_info) -width 28 
	grid $base.l1 \
		-in .fda -column 0 -row 1 -columnspan 1 -rowspan 1 
	grid $base.e1 \
		-in .fda -column 1 -row 1 -columnspan 1 -rowspan 1 -pady 2 
	grid $base.l2 \
		-in .fda -column 0 -row 2 -columnspan 1 -rowspan 1 
	grid $base.e2 \
		-in .fda -column 1 -row 2 -columnspan 1 -rowspan 1 
	grid $base.l3 \
		-in .fda -column 0 -row 3 -columnspan 1 -rowspan 1 
	grid $base.e3 \
		-in .fda -column 1 -row 3 -columnspan 1 -rowspan 1 -pady 2 
	grid $base.l4 \
		-in .fda -column 0 -row 4 -columnspan 1 -rowspan 1 
	grid $base.e4 \
		-in .fda -column 1 -row 4 -columnspan 1 -rowspan 1 
	grid $base.l5 \
		-in .fda -column 0 -row 5 -columnspan 1 -rowspan 1 
	grid $base.e5 \
		-in .fda -column 1 -row 5 -columnspan 1 -rowspan 1 -pady 2 
	grid $base.l6 \
		-in .fda -column 0 -row 6 -columnspan 1 -rowspan 1 
	grid $base.e6 \
		-in .fda -column 1 -row 6 -columnspan 1 -rowspan 1 
	grid $base.bcmd \
		-in .fda -column 2 -row 6 -columnspan 1 -rowspan 1 
	grid $base.l7 \
		-in .fda -column 0 -row 7 -columnspan 1 -rowspan 1 
	grid $base.e7 \
		-in .fda -column 1 -row 7 -columnspan 1 -rowspan 1 
	grid $base.l8 \
		-in .fda -column 0 -row 8 -columnspan 1 -rowspan 1 
	grid $base.e8 \
		-in .fda -column 1 -row 8 -columnspan 1 -rowspan 1 -pady 2 
	grid $base.l0 \
		-in .fda -column 0 -row 0 -columnspan 2 -rowspan 1 
}

proc vTclWindow.fdcmd {base} {
global pref
	if {$base == ""} {
		set base .fdcmd
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 282x274+504+229
	wm maxsize $base 785 570
	wm minsize $base 1 19
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm title $base "Command"
	frame $base.f \
		-borderwidth 2 -height 75 -relief groove -width 125 
	scrollbar $base.f.sb \
		-borderwidth 1 -command {.fdcmd.f.txt yview} -orient vert -width 12 
	text $base.f.txt \
		-font $pref(font_fix) -height 1 \
		-width 115 -yscrollcommand {.fdcmd.f.sb set} 
	frame $base.fb \
		-height 75 -width 125 
	button $base.fb.b1 \
		-borderwidth 1 \
		-command {set fdvar(c_cmd) [.fdcmd.f.txt get 1.0 "end - 1 chars"]
Window hide .fdcmd
fd_set_command} \
		-text Ok -width 5 
	button $base.fb.b2 \
		-borderwidth 1 -command {Window hide .fdcmd} \
		-text Cancel 
	pack $base.f \
		-in .fdcmd -anchor center -expand 1 -fill both -side top 
	pack $base.f.sb \
		-in .fdcmd.f -anchor e -expand 1 -fill y -side right 
	pack $base.f.txt \
		-in .fdcmd.f -anchor center -expand 1 -fill both -side top 
	pack $base.fb \
		-in .fdcmd -anchor center -expand 0 -fill none -side top 
	pack $base.fb.b1 \
		-in .fdcmd.fb -anchor center -expand 0 -fill none -side left 
	pack $base.fb.b2 \
		-in .fdcmd.fb -anchor center -expand 0 -fill none -side top 
}

proc vTclWindow.fdmenu {base} {
	if {$base == ""} {
		set base .fdmenu
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 288x70+103+0
	wm maxsize $base 785 570
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm deiconify $base
	wm title $base "Commands"
	button $base.but17 \
		-borderwidth 1 \
		-command {if {[tk_messageBox -title Warning -message "Delete all objects ?" -type yesno -default no]=="no"} return
fd_init} \
		-text {Delete all} 
	button $base.but18 \
		-borderwidth 1 -command {set fdvar(geometry) [wm geometry .fd] ; fd_test } \
		-text {Test form} 
	button $base.but19 \
		-borderwidth 1 -command {destroy .$fdvar(forminame)} \
		-text {Close test form} 
	button $base.bex \
		-borderwidth 1 \
		-command {if {[fd_save_form $fdvar(formname)]==1} {
catch {Window destroy .fd}
catch {Window destroy .fdtb}
catch {Window destroy .fdmenu}
catch {Window destroy .fda}
catch {Window destroy .fdcmd}
catch {Window destroy .$fdvar(forminame)}
}} \
		-text Close 
	button $base.bload \
		-borderwidth 1 -command {fd_load_form nimic design} \
		-text {Load from database} 
	button $base.button17 \
		-borderwidth 1 -command {fd_save_form nimic} \
		-text Save 
	label $base.l1 \
		-borderwidth 0 -text {Form name} 
	entry $base.e1 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(formname) 
	label $base.l2 \
		-borderwidth 0 \
		-text {Form's window internal name} 
	entry $base.e2 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-selectborderwidth 0 -textvariable fdvar(forminame) 
	place $base.but17 \
		-x 5 -y 80 -width 62 -height 24 -anchor nw -bordermode ignore 
	place $base.but18 \
		-x 5 -y 45 -width 62 -height 24 -anchor nw -bordermode ignore 
	place $base.but19 \
		-x 70 -y 45 -width 94 -height 24 -anchor nw -bordermode ignore 
	place $base.bex \
		-x 230 -y 45 -height 24 -anchor nw -bordermode ignore 
	place $base.bload \
		-x 75 -y 80 -width 114 -height 23 -anchor nw -bordermode ignore 
	place $base.button17 \
		-x 165 -y 45 -width 44 -height 24 -anchor nw -bordermode ignore 
	place $base.l1 \
		-x 5 -y 5 -anchor nw -bordermode ignore 
	place $base.e1 \
		-x 75 -y 5 -width 193 -height 17 -anchor nw -bordermode ignore 
	place $base.l2 \
		-x 5 -y 25 -anchor nw -bordermode ignore 
	place $base.e2 \
		-x 175 -y 25 -width 60 -height 17 -anchor nw -bordermode ignore 
}

proc vTclWindow.gpw {base} {
	if {$base == ""} {
		set base .gpw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	set sw [winfo screenwidth .]
	set sh [winfo screenheight .]
	set x [expr ($sw - 297)/2]
	set y [expr ($sh - 98)/2]
	wm geometry $base 297x98+$x+$y
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 0 0
	wm deiconify $base
	wm title $base "Input parameter"
	label $base.l1 \
		-anchor nw -borderwidth 1 \
		-justify left -relief sunken -textvariable gpw(msg) -wraplength 200 
	entry $base.e1 \
		-background #fefefe -borderwidth 1 -highlightthickness 0 \
		-textvariable gpw(var) 
	bind $base.e1 <Key-KP_Enter> {
		set gpw(result) 1
destroy .gpw
	}
	bind $base.e1 <Key-Return> {
		set gpw(result) 1
destroy .gpw
	}
	button $base.bok \
		-borderwidth 1 -command {set gpw(result) 1
destroy .gpw} -text Ok 
	button $base.bcanc \
		-borderwidth 1 -command {set gpw(result) 0
destroy .gpw} -text Cancel 
	place $base.l1 \
		-x 10 -y 5 -width 201 -height 53 -anchor nw -bordermode ignore 
	place $base.e1 \
		-x 10 -y 65 -width 200 -height 24 -anchor nw -bordermode ignore 
	place $base.bok \
		-x 225 -y 5 -width 61 -height 26 -anchor nw -bordermode ignore 
	place $base.bcanc \
		-x 225 -y 35 -width 61 -height 26 -anchor nw -bordermode ignore 
}

proc vTclWindow.fdtb {base} {
	if {$base == ""} {
		set base .fdtb
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 90x172+0+0
	wm maxsize $base 785 570
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm deiconify $base
	wm title $base "Toolbar"
	radiobutton $base.rb1 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text Point -value point -variable fdvar(tool) \
		-width 9 
	radiobutton $base.rb2 \
		-anchor w -borderwidth 1 \
		-foreground #000000 -highlightthickness 0 \
		-text Label -value label -variable fdvar(tool) -width 9 
	radiobutton $base.rb3 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text Entry -value entry -variable fdvar(tool) \
		-width 9 
	radiobutton $base.rb4 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text Button -value button \
		-variable fdvar(tool) -width 9 
	radiobutton $base.rb5 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text {List box} -value listbox \
		-variable fdvar(tool) -width 9 
	radiobutton $base.rb6 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text {Check box} -value checkbox \
		-variable fdvar(tool) -width 9 
	radiobutton $base.rb7 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text {Radio btn} -value radio \
		-variable fdvar(tool) -width 9 
	radiobutton $base.rb9 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text {Text} -value text \
		-variable fdvar(tool) -width 9 
	radiobutton $base.rb8 \
		-anchor w -borderwidth 1 \
		-highlightthickness 0 -text Query -value query -variable fdvar(tool) \
		-width 9 
	grid $base.rb1 \
		-in .fdtb -column 0 -row 0 -columnspan 1 -rowspan 1 
	grid $base.rb2 \
		-in .fdtb -column 0 -row 1 -columnspan 1 -rowspan 1 
	grid $base.rb3 \
		-in .fdtb -column 0 -row 2 -columnspan 1 -rowspan 1 
	grid $base.rb4 \
		-in .fdtb -column 0 -row 3 -columnspan 1 -rowspan 1 
	grid $base.rb5 \
		-in .fdtb -column 0 -row 4 -columnspan 1 -rowspan 1 
	grid $base.rb6 \
		-in .fdtb -column 0 -row 5 -columnspan 1 -rowspan 1 
	grid $base.rb7 \
		-in .fdtb -column 0 -row 6 -columnspan 1 -rowspan 1 
	grid $base.rb9 \
		-in .fdtb -column 0 -row 7 -columnspan 1 -rowspan 1 
	grid $base.rb8 \
		-in .fdtb -column 0 -row 8 -columnspan 1 -rowspan 1 
}

proc vTclWindow.sqlw {base} {
	if {$base == ""} {
		set base .sqlw
	}
	if {[winfo exists $base]} {
		wm deiconify $base; return
	}
	toplevel $base -class Toplevel
	wm focusmodel $base passive
	wm geometry $base 551x408+192+169
	wm maxsize $base 1009 738
	wm minsize $base 1 1
	wm overrideredirect $base 0
	wm resizable $base 1 1
	wm deiconify $base
	wm title $base "SQL commands"
	frame $base.f \
		-borderwidth 1 -height 392 -relief raised -width 396 
	scrollbar $base.f.01 \
		-borderwidth 1 -command {.sqlw.f.t xview} -orient horiz \
		-width 10 
	scrollbar $base.f.02 \
		-borderwidth 1 -command {.sqlw.f.t yview} -orient vert -width 10 
	text $base.f.t \
		-borderwidth 1 \
		-height 200 -width 200 -wrap word \
		-xscrollcommand {.sqlw.f.01 set} \
		-yscrollcommand {.sqlw.f.02 set} 
	button $base.b1 \
		-borderwidth 1 -command {.sqlw.f.t delete 1.0 end} -text Clean 
	button $base.b2 \
		-borderwidth 1 -command {destroy .sqlw} -text Close 
	grid columnconf $base 0 -weight 1
	grid columnconf $base 1 -weight 1
	grid rowconf $base 0 -weight 1
	grid $base.f \
		-in .sqlw -column 0 -row 0 -columnspan 2 -rowspan 1 
	grid columnconf $base.f 0 -weight 1
	grid rowconf $base.f 0 -weight 1
	grid $base.f.01 \
		-in .sqlw.f -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky ew 
	grid $base.f.02 \
		-in .sqlw.f -column 1 -row 0 -columnspan 1 -rowspan 1 -sticky ns 
	grid $base.f.t \
		-in .sqlw.f -column 0 -row 0 -columnspan 1 -rowspan 1 \
		-sticky nesw 
	grid $base.b1 \
		-in .sqlw -column 0 -row 1 -columnspan 1 -rowspan 1 
	grid $base.b2 \
		-in .sqlw -column 1 -row 1 -columnspan 1 -rowspan 1 
}

proc vTclWindow.rcw {base} {
    if {$base == ""} {
        set base .rcw
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    toplevel $base -class Toplevel
    wm focusmodel $base passive
    wm geometry $base 215x75+258+213
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 0 0
    wm deiconify $base
    wm title $base "Rename field"
    label $base.l1 \
        -borderwidth 0 -text {New name} 
    entry $base.e1 \
        -background #fefefe -borderwidth 1 -textvariable tiw(new_cn)
	bind $base.e1 <Key-KP_Enter> "rename_column"
	bind $base.e1 <Key-Return> "rename_column"
    frame $base.f \
        -height 75 -relief groove -width 147 
    button $base.f.b1 \
        -borderwidth 1 -command rename_column -text Rename 
    button $base.f.b2 \
        -borderwidth 1 -command {Window destroy .rcw} -text Cancel 
    label $base.l2 -borderwidth 0 
    grid $base.l1 \
        -in .rcw -column 0 -row 0 -columnspan 1 -rowspan 1 
    grid $base.e1 \
        -in .rcw -column 1 -row 0 -columnspan 1 -rowspan 1 
    grid $base.f \
        -in .rcw -column 0 -row 4 -columnspan 2 -rowspan 1 
    grid $base.f.b1 \
        -in .rcw.f -column 0 -row 0 -columnspan 1 -rowspan 1 
    grid $base.f.b2 \
        -in .rcw.f -column 1 -row 0 -columnspan 1 -rowspan 1 
    grid $base.l2 \
        -in .rcw -column 0 -row 3 -columnspan 1 -rowspan 1 
}

proc vTclWindow.anfw {base} {
    if {$base == ""} {
        set base .anfw
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    toplevel $base -class Toplevel
    wm focusmodel $base passive
    wm geometry $base 302x114+195+175
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 0 0
    wm deiconify $base
    wm title $base "Add new field"
    label $base.l1 \
        -borderwidth 0 \
        -text {Field name} 
    entry $base.e1 \
        -background #fefefe -borderwidth 1 -textvariable anfw(name) 
    bind $base.e1 <Key-KP_Enter> {
        focus .anfw.e2
    }
    bind $base.e1 <Key-Return> {
        focus .anfw.e2
    }
    label $base.l2 \
        -borderwidth 0 \
        -text {Field type} 
    entry $base.e2 \
        -background #fefefe -borderwidth 1 -textvariable anfw(type) 
    bind $base.e2 <Key-KP_Enter> {
        anfw:add
    }
    bind $base.e2 <Key-Return> {
        anfw:add
    }
    button $base.b1 \
        -borderwidth 1 -command anfw:add -text {Add field} 
    button $base.b2 \
        -borderwidth 1 -command {Window destroy .anfw} -text Cancel 
    place $base.l1 \
        -x 25 -y 10 -anchor nw -bordermode ignore 
    place $base.e1 \
        -x 98 -y 7 -width 178 -height 22 -anchor nw -bordermode ignore 
    place $base.l2 \
        -x 25 -y 40 -anchor nw -bordermode ignore 
    place $base.e2 \
        -x 98 -y 37 -width 178 -height 22 -anchor nw -bordermode ignore 
    place $base.b1 \
        -x 70 -y 75 -anchor nw -bordermode ignore 
    place $base.b2 \
        -x 160 -y 75 -anchor nw -bordermode ignore 
}

proc vTclWindow.uw {base} {
    if {$base == ""} {
        set base .uw
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    toplevel $base -class Toplevel
    wm focusmodel $base passive
    wm geometry $base 263x220+233+165
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 0 0
    wm deiconify $base
    wm title $base "Define new user"
    label $base.l1 \
        -borderwidth 0 -anchor w -text "User name"
    entry $base.e1 \
        -background #fefefe -borderwidth 1 -textvariable uw(username) 
	bind $base.e1 <Key-Return> "focus .uw.e2"
	bind $base.e1 <Key-KP_Enter> "focus .uw.e2"
    label $base.l2 \
        -borderwidth 0 -text Password 
    entry $base.e2 \
        -background #fefefe -borderwidth 1 -show * -textvariable uw(password) 
	bind $base.e2 <Key-Return> "focus .uw.e3"
	bind $base.e2 <Key-KP_Enter> "focus .uw.e3"
    label $base.l3 \
        -borderwidth 0 -text {verify password} 
    entry $base.e3 \
        -background #fefefe -borderwidth 1 -show * -textvariable uw(verify) 
	bind $base.e3 <Key-Return> "focus .uw.cb1"
	bind $base.e3 <Key-KP_Enter> "focus .uw.cb1"
    checkbutton $base.cb1 \
        -borderwidth 1 -offvalue NOCREATEDB -onvalue CREATEDB \
        -text {Alow user to create databases } -variable uw(createdb) 
    checkbutton $base.cb2 \
        -borderwidth 1 -offvalue NOCREATEUSER -onvalue CREATEUSER \
        -text {Allow users to create other users} -variable uw(createuser) 
    label $base.l4 \
        -borderwidth 0 -anchor w -text {Valid until (date)} 
    entry $base.e4 \
        -background #fefefe -borderwidth 1 -textvariable uw(valid)
	bind $base.e4 <Key-Return> "focus .uw.b1"
	bind $base.e4 <Key-KP_Enter> "focus .uw.b1"
    button $base.b1 \
        -borderwidth 1 -command uw:create_user -text Create 
    button $base.b2 \
        -borderwidth 1 -command {Window destroy .uw} -text Cancel 
    place $base.l1 \
        -x 5 -y 7 -width 62 -height 16 -anchor nw -bordermode ignore 
    place $base.e1 \
        -x 109 -y 5 -width 146 -height 20 -anchor nw -bordermode ignore 
    place $base.l2 \
        -x 5 -y 35 -anchor nw -bordermode ignore 
    place $base.e2 \
        -x 109 -y 32 -width 146 -height 20 -anchor nw -bordermode ignore 
    place $base.l3 \
        -x 5 -y 60 -anchor nw -bordermode ignore 
    place $base.e3 \
        -x 109 -y 58 -width 146 -height 20 -anchor nw -bordermode ignore 
    place $base.cb1 \
        -x 5 -y 90 -anchor nw -bordermode ignore 
    place $base.cb2 \
        -x 5 -y 115 -anchor nw -bordermode ignore 
    place $base.l4 \
        -x 5 -y 145 -width 100 -height 16 -anchor nw -bordermode ignore 
    place $base.e4 \
        -x 110 -y 143 -width 146 -height 20 -anchor nw -bordermode ignore 
    place $base.b1 \
        -x 45 -y 185 -anchor nw -width 70 -height 25 -bordermode ignore 
    place $base.b2 \
        -x 140 -y 185 -anchor nw -width 70 -height 25 -bordermode ignore 
}

Window show .
Window show .dw

main $argc $argv
