#!/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 {} 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 "$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 {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$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 "drag_start $wn %W %x %y" $wn.c bind movable {drag_it %W %x %y} $wn.c bind movable "drag_stop $wn %W %x %y" $wn.c bind movable "$wn configure -cursor left_side" $wn.c bind movable "$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 "mw_edit_text $wn %A %K" } else { $wn.c bind q {} } 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 "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 {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 {ql_dragstart %W %x %y} .ql.c bind mov {ql_dragit %W %x %y} bind .ql {ql_dragstop %x %y} bind .ql {qlc_click %x %y %W} bind .ql {ql_pan %x %y} bind .ql {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 {ql_resfield_click %x %y} .ql.c bind sort {ql_swap_sort %W %x %y} .ql.c bind retval {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 {.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 {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 { 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 { 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 { 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 { 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 { focus .dbod.opbtu } button $base.opbtu \ -borderwidth 1 -command open_database -text Open bind $base.opbtu { 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 { 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 "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 "mw_reload $wn" bind $base.f1.e1 "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 "mw_reload $wn" bind $base.f1.e2 "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 "mw_canvas_click $wn %x %y" bind $base.c "mw_canvas_paste $wn %x %y" bind $base.c "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 { 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 { 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 { 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 { focus .nt.e1 } entry $base.e1 \ -background #fefefe -borderwidth 1 -selectborderwidth 0 \ -textvariable ntw(fldtype) bind $base.e1 { focus .nt.e5 } entry $base.e3 \ -background #fefefe -borderwidth 1 -selectborderwidth 0 \ -textvariable ntw(fldsize) bind $base.e3 { focus .nt.e5 } entry $base.e5 \ -background #fefefe -borderwidth 1 -selectborderwidth 0 \ -textvariable ntw(defaultval) bind $base.e5 { 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 { 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 { 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 { ql_pan %x %y } bind $base { qlc_click %x %y %W } bind $base { ql_dragstop %x %y } bind $base { 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 { 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 { 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 { rb_add_field } canvas $base.c \ -background #fffeff -borderwidth 2 -height 207 -highlightthickness 0 \ -relief ridge -takefocus 1 -width 295 bind $base.c { rb_dragstart %W %x %y } bind $base.c { rb_dragstop %x %y } bind $base.c { rb_delete_object } bind $base.c { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { fd_delete_object } canvas $base.c \ -background #828282 -height 207 -highlightthickness 0 -relief ridge \ -selectborderwidth 0 -width 295 bind $base.c { fd_mouse_down %x %y } bind $base.c { fd_mouse_up %x %y } bind $base.c { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 { set gpw(result) 1 destroy .gpw } bind $base.e1 { 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 "rename_column" bind $base.e1 "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 { focus .anfw.e2 } bind $base.e1 { focus .anfw.e2 } label $base.l2 \ -borderwidth 0 \ -text {Field type} entry $base.e2 \ -background #fefefe -borderwidth 1 -textvariable anfw(type) bind $base.e2 { anfw:add } bind $base.e2 { 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 "focus .uw.e2" bind $base.e1 "focus .uw.e2" label $base.l2 \ -borderwidth 0 -text Password entry $base.e2 \ -background #fefefe -borderwidth 1 -show * -textvariable uw(password) bind $base.e2 "focus .uw.e3" bind $base.e2 "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 "focus .uw.cb1" bind $base.e3 "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 "focus .uw.b1" bind $base.e4 "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