From: Bruce Momjian Date: Thu, 16 Oct 1997 17:32:07 +0000 (+0000) Subject: Updates for 6.2.1. Update pgaccess to 0.61. Add to HISTORY. X-Git-Tag: REL9_0_0~28157 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ed966c4617155f39fee3489199cca314cb01f34c;p=pg-rex%2Fsyncrep.git Updates for 6.2.1. Update pgaccess to 0.61. Add to HISTORY. --- diff --git a/HISTORY b/HISTORY index 6daab42863..732c2356c8 100644 --- a/HISTORY +++ b/HISTORY @@ -14,6 +14,7 @@ fix for buffer cache reference count problem(Vadim) Allow strings to span lines, like ANSI(Thomas) Fix for backward ORDER BY(Vadim) Fix avg(cash) computation(Thomas) +Fix for specifying a column twice in ORDER BY(Vadim) PostgreSQL 6.2 Thu Oct 02 12:53:46 EDT 1997 diff --git a/src/bin/pgaccess/README b/src/bin/pgaccess/README index abee8c02f1..db7ebeec09 100644 --- a/src/bin/pgaccess/README +++ b/src/bin/pgaccess/README @@ -1,3 +1,4 @@ +--------------------------------------------------------------------------- @@ -23,7 +24,7 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. -PGACCESS 0.51 , 3 October 1997 +PGACCESS 0.61 , 14 October 1997 ================================ I dedicate this program to my little 4 year daughter Ana-Maria and my wife for their understanding. I hope they will forgive me for spending so many @@ -83,6 +84,8 @@ pgaccess.tcl file. Tables - opening tables for vieweing, max 200 records - column resizing by dragging the vertical grid lines +- text will wrap in cells now +- dynamic row height when editing - table layout saved for every table - import/export to external files (SDF,CSV) - filter capabilities ,enter filter like price>3.14 @@ -92,7 +95,7 @@ Tables - adding new records ,save new row with right-button-click on table for the moment - table generator assistant lizzard :-) (not wizzard) - table renaming and deleting (dropping) -- table information retrieving : owner, field information +- table information retrieving : owner, field information, indexes Queries - define, edit and store "user defined queries" diff --git a/src/bin/pgaccess/pgaccess.tcl b/src/bin/pgaccess/pgaccess.tcl index b618bb9e2f..b0f6f93f99 100644 --- a/src/bin/pgaccess/pgaccess.tcl +++ b/src/bin/pgaccess/pgaccess.tcl @@ -9,8 +9,7 @@ global activetab; global dbc; global dbname; -global dirty; -global fldval; +global mw; global host; global newdbname; global newhost; @@ -26,15 +25,17 @@ global widget; # USER DEFINED PROCEDURES # proc init {argc argv} { -global dbc host pport tablist dirty fldval activetab qlvar +global dbc host pport tablist mw fldval activetab qlvar +foreach wid {Label Text Button Listbox Checkbutton Radiobutton} { + option add *$wid.font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +} set host localhost set pport 5432 set dbc {} set tablist [list Tables Queries Views Sequences Functions Reports Scripts] set activetab {} -set dirty false -set fldval "" -trace variable fldval w mark_dirty +set mw(dirtyrec) 0 +set mw(id_edited) {} catch {unset qlvar} set qlvar(yoffs) 360 set qlvar(xoffs) 50 @@ -180,24 +181,40 @@ if {$activetab=="Tables"} { } proc cmd_Information {} { -global dbc tiw activetab +global dbc tiw activetab indexlist if {$dbc==""} return; if {$activetab!="Tables"} return; set tiw(tablename) [get_dwlb_Selection] if {$tiw(tablename)==""} return; Window show .tiw .tiw.lb delete 0 end -pg_select $dbc "select attnum,attname,typname,attlen,usename 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) and (attnum>0) order by attnum" rec { +.tiw.ilb delete 0 end +set tiw(isunique) {} +set tiw(isclustered) {} +set tiw(indexfields) {} +pg_select $dbc "select attnum,attname,typname,attlen,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 ftype $rec(typname) if {$ftype=="varchar"} { incr fsize -4 } + if {$ftype=="bpchar"} { + incr fsize -4 + } if {$ftype=="text"} { set fsize "" } - .tiw.lb insert end [format "%-32s %-14s %-4s" $rec(attname) $ftype $fsize] + if {$rec(attnum)>0} {.tiw.lb insert end [format "%-32s %-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) {} +pg_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) + pg_select $dbc "select relname from pg_class where oid=$rec(indexrelid)" rec1 { + .tiw.ilb insert end $rec1(relname) + } } } @@ -348,20 +365,28 @@ catch { cursor_arrow .dw } -proc color_record {obj} { -global newrec_fields -set oid [get_tag_info $obj o] -if {![hide_entry]} return; -if {$newrec_fields!=""} { - if {[get_tag_info $obj n]!="ew"} { - if {![save_new_record]} return; +proc mw_show_record {row} { +global mw msg +set mw(errorsavingnew) 0 +if {$mw(newrec_fields)!=""} { + if {$row!=$mw(last_rownum)} { + if {![mw_save_new_record]} { + set mw(errorsavingnew) 1 + return + } } } -.mw.c itemconfigure hili -fill black -if {$oid==0} return; +set y1 [lindex $mw(rowy) $row] +set y2 [lindex $mw(rowy) [expr $row+1]] +if {$y2==""} {set y2 [expr $y1+14]} .mw.c dtag hili hili -.mw.c addtag hili withtag o$oid -.mw.c itemconfigure hili -fill blue +.mw.c addtag hili withtag r$row +# Making a rectangle arround the record +set x 3 +foreach wi $mw(colwidth) {incr x [expr $wi+2]} +.mw.c delete crtrec +.mw.c create rectangle [expr -1-$mw(leftoffset)] $y1 [expr $x-$mw(leftoffset)] $y2 -fill #EEEEEE -outline {} -tags {q crtrec} +.mw.c lower crtrec } proc cursor_arrow {w} { @@ -388,14 +413,15 @@ set lispar [join $lispar ,] sql_exec noquiet "drop function $objname ($lispar)" } -proc delete_record {} { -global dbc ds_updatable tablename -if {$ds_updatable=="false"} return; -if {![hide_entry]} return; +proc mw_delete_record {} { +global dbc mw tablename +if {!$mw(updatable)} return; +if {![mw_exit_edit]} return; set taglist [.mw.c gettags hili] if {[llength $taglist]==0} return; -set oidtag [lindex $taglist [lsearch -regexp $taglist "^o"]] -set oid [string range $oidtag 1 end] +set rowtag [lindex $taglist [lsearch -regexp $taglist "^r"]] +set row [string range $rowtag 1 end] +set oid [lindex $mw(keylist) $row] if {[tk_messageBox -title "FINAL WARNING" -icon question -message "Delete current record ?" -type yesno -default no]=="no"} return if {[sql_exec noquiet "delete from $tablename where oid=$oid"]} { .mw.c delete hili @@ -428,52 +454,52 @@ set draglocation(start) $x } proc drag_stop {w x y} { -global draglocation colcount colwidth layout_name dbc +global draglocation mw dbc set dlo "" catch { set dlo $draglocation(obj) } if {$dlo != ""} { .mw.c bind movable {.mw configure -cursor top_left_arrow} .mw configure -cursor top_left_arrow - set ctr [get_tag_info $draglocation(obj) g] + set ctr [get_tag_info $draglocation(obj) v] set diff [expr $x-$draglocation(start)] if {$diff==0} return; set newcw {} - for {set i 0} {$i<$colcount} {incr i} { + for {set i 0} {$i<$mw(colcount)} {incr i} { if {$i==$ctr} { - lappend newcw [expr [lindex $colwidth $i]+$diff] + lappend newcw [expr [lindex $mw(colwidth) $i]+$diff] } else { - lappend newcw [lindex $colwidth $i] + lappend newcw [lindex $mw(colwidth) $i] } } - set colwidth $newcw - draw_headers - for {set i [expr $ctr+1]} {$i<$colcount} {incr i} { + set mw(colwidth) $newcw + .mw.c itemconfigure c$ctr -width [expr [lindex $mw(colwidth) $ctr]-5] + mw_draw_headers + mw_draw_hgrid + if {$mw(crtrow)!=""} {mw_show_record $mw(crtrow)} + for {set i [expr $ctr+1]} {$i<$mw(colcount)} {incr i} { .mw.c move c$i $diff 0 } cursor_watch .mw - sql_exec quiet "update pga_layout set colwidth='$colwidth' where tablename='$layout_name'" + sql_exec quiet "update pga_layout set colwidth='$mw(colwidth)' where tablename='$mw(layout_name)'" cursor_arrow .mw } } -proc draw_headers {} { -global colcount colname colwidth - +proc mw_draw_headers {} { +global mw .mw.c delete header -set posx 5 -for {set i 0} {$i<$colcount} {incr i} { - set xf [expr $posx+[lindex $colwidth $i]] - .mw.c create rectangle $posx 3 $xf 22 -fill #CCCCCC -outline "" -width 0 -tags header - .mw.c create text [expr $posx+[lindex $colwidth $i]*1.0/2] 14 -text [lindex $colname $i] -tags header -fill navy -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +set posx [expr 5-$mw(leftoffset)] +for {set i 0} {$i<$mw(colcount)} {incr i} { + set xf [expr $posx+[lindex $mw(colwidth) $i]] + .mw.c create rectangle $posx 1 $xf 22 -fill #CCCCCC -outline "" -width 0 -tags header + .mw.c create text [expr $posx+[lindex $mw(colwidth) $i]*1.0/2] 14 -text [lindex $mw(colnames) $i] -tags header -fill navy -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* .mw.c create line $posx 22 [expr $xf-1] 22 -fill #AAAAAA -tags header .mw.c create line [expr $xf-1] 5 [expr $xf-1] 22 -fill #AAAAAA -tags header .mw.c create line [expr $xf+1] 5 [expr $xf+1] 22 -fill white -tags header - .mw.c create line $xf -15000 $xf 15000 -fill #CCCCCC -tags [subst {header movable g$i}] + .mw.c create line $xf -15000 $xf 15000 -fill #CCCCCC -tags [subst {header movable v$i}] set posx [expr $xf+2] } -for {set i 0} {$i < 100} {incr i} { - .mw.c create line 0 [expr 37+$i*14] $posx [expr 37+$i*14] -fill gray -tags header -} +set mw(r_edge) $posx .mw.c bind movable {drag_start %W %x %y} .mw.c bind movable {drag_it %W %x %y} .mw.c bind movable {drag_stop %W %x %y} @@ -481,13 +507,22 @@ for {set i 0} {$i < 100} {incr i} { .mw.c bind movable {.mw configure -cursor top_left_arrow} } -proc draw_new_record {} { -global ds_updatable last_rownum colwidth colcount +proc mw_draw_new_record {} { +global mw pref set posx 10 -if {$ds_updatable} {for {set j 0} {$j<$colcount} {incr j} { - .mw.c create text $posx [expr 30+$last_rownum*14] -text * -tags [subst {o0 c$j rows new unt}] -anchor w -font -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-* - incr posx [expr [lindex $colwidth $j]+2] +set posy [lindex $mw(rowy) $mw(last_rownum)] +if {$pref(tvfont)=="helv"} { + set tvfont -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +} else { + set tvfont -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-* +} +if {$mw(updatable)} {for {set j 0} {$j<$mw(colcount)} {incr j} { + .mw.c create text $posx $posy -text * -tags [subst {r$mw(nrecs) c$j q new unt}] -anchor nw -font $tvfont -width [expr [lindex $mw(colwidth) $j]-5] + incr posx [expr [lindex $mw(colwidth) $j]+2] } + incr posy 14 + lappend mw(rowy) $posy + .mw.c create line [expr -$mw(leftoffset)] $posy [expr $mw(r_edge)-$mw(leftoffset)] $posy -fill gray -tags [subst {hgrid g$mw(nrecs)}] } } @@ -504,6 +539,37 @@ foreach tab $tablist { set activetab "" } +proc mw_edit_text {c k} { +global mw msg +set bbin [.mw.c bbox r$mw(row_edited)] +switch $k { + BackSpace { set dp [expr [.mw.c index $mw(id_edited) insert]-1];if {$dp>=0} {.mw.c dchars $mw(id_edited) $dp $dp; set mw(dirtyrec) 1}} + Home {.mw.c icursor $mw(id_edited) 0} + End {.mw.c icursor $mw(id_edited) end} + Left {.mw.c icursor $mw(id_edited) [expr [.mw.c index $mw(id_edited) insert]-1]} + Delete {} + Right {.mw.c icursor $mw(id_edited) [expr [.mw.c index $mw(id_edited) insert]+1]} + Return {if {[mw_exit_edit]} {.mw.c focus {}}} + Escape {set mw(dirtyrec) 0; .mw.c itemconfigure $mw(id_edited) -text $mw(text_initial_value); .mw.c focus {}} + default {if {[string compare $c " "]>-1} {.mw.c insert $mw(id_edited) insert $c;set mw(dirtyrec) 1}} +} +set bbout [.mw.c bbox r$mw(row_edited)] +set dy [expr [lindex $bbout 3]-[lindex $bbin 3]] +if {$dy==0} return +set re $mw(row_edited) +.mw.c move g$re 0 $dy +for {set i [expr 1+$re]} {$i<=$mw(nrecs)} {incr i} { + .mw.c move r$i 0 $dy + .mw.c move g$i 0 $dy + set rh [lindex $mw(rowy) $i] + incr rh $dy + set mw(rowy) [lreplace $mw(rowy) $i $i $rh] +} +mw_show_record $mw(row_edited) +# Delete is trapped by window interpreted as record delete +# Delete {.mw.c dchars $mw(id_edited) insert insert; set mw(dirtyrec) 1} +} + proc get_dwlb_Selection {} { set temp [.dw.lb curselection] if {$temp==""} return ""; @@ -526,66 +592,84 @@ set thetag [lindex $taglist $i] return [string range $thetag 1 end] } -proc hide_entry {} { -global dirty dbc msg fldval itemid colname tablename -global newrec_fields newrec_values - -if {$dirty} { - cursor_watch .mw - set oid [get_tag_info $itemid o] - set fld [lindex $colname [get_tag_info $itemid c]] - set fldval [string trim $fldval] - set fillcolor black - if {$oid==0} { - set fillcolor red - set sfp [lsearch $newrec_fields $fld] - if {$sfp>-1} { - set newrec_fields [lreplace $newrec_fields $sfp $sfp] - set newrec_values [lreplace $newrec_values $sfp $sfp] - } - lappend newrec_fields $fld - lappend newrec_values '$fldval' - # Remove the untouched tag from the object - .mw.c dtag $itemid unt - set retval 1 - } else { - set msg "Updating record ..." - after 1000 {set msg ""} - set retval [sql_exec noquiet "update $tablename set $fld='$fldval' where oid=$oid"] +proc mw_exit_edit {} { +global mw dbc msg tablename +# User has edited the text ? +if {!$mw(dirtyrec)} { + # No, unfocus text + .mw.c focus {} + # For restoring * to the new record position + if {$mw(id_edited)!=""} { + if {[lsearch [.mw.c gettags $mw(id_edited)] new]!=-1} { + .mw.c itemconfigure $mw(id_edited) -text $mw(text_initial_value) + } } - cursor_arrow .mw - if {!$retval} { - set msg "" - return 0 - } - .mw.c itemconfigure $itemid -text $fldval -fill $fillcolor + set mw(id_edited) {};set mw(text_initial_value) {} + return 1 +} +# Trimming the spaces +set fldval [string trim [.mw.c itemcget $mw(id_edited) -text]] +.mw.c itemconfigure $mw(id_edited) -text $fldval +if {[string compare $mw(text_initial_value) $fldval]==0} { + set mw(dirtyrec) 0 + .mw.c focus {} + set mw(id_edited) {};set mw(text_initial_value) {} + return 1 } -catch {destroy .mw.entf} -set dirty false +cursor_watch .mw +set oid [lindex $mw(keylist) $mw(row_edited)] +set fld [lindex $mw(colnames) [get_tag_info $mw(id_edited) c]] +set fillcolor black +if {$mw(row_edited)==$mw(last_rownum)} { + set fillcolor red + set sfp [lsearch $mw(newrec_fields) $fld] + if {$sfp>-1} { + set mw(newrec_fields) [lreplace $mw(newrec_fields) $sfp $sfp] + set mw(newrec_values) [lreplace $mw(newrec_values) $sfp $sfp] + } + lappend mw(newrec_fields) $fld + lappend mw(newrec_values) '$fldval' + # Remove the untouched tag from the object + .mw.c dtag $mw(id_edited) unt + .mw.c itemconfigure $mw(id_edited) -fill red + set retval 1 +} else { + set msg "Updating record ..." + after 1000 {set msg ""} + set retval [sql_exec noquiet "update $tablename set $fld='$fldval' where oid=$oid"] +} +cursor_arrow .mw +if {!$retval} { + set msg "" + focus .mw.c + return 0 +} +set mw(dirtyrec) 0 +.mw.c focus {} +set mw(id_edited) {};set mw(text_initial_value) {} return 1 } -proc load_layout {tablename} { -global dbc msg colcount colname colwidth layout_found layout_name - +proc mw_load_layout {tablename} { +global dbc msg mw cursor_watch .mw -set layout_name $tablename -catch {unset colcount colname colwidth} -set layout_found false +set mw(layout_name) $tablename +catch {unset mw(colcount) mw(colnames) mw(colwidth)} +set mw(layout_found) 0 set retval [catch {set pgres [pg_exec $dbc "select *,oid from pga_layout where tablename='$tablename' order by oid desc"]}] if {$retval} { # Probably table pga_layout isn't yet defined - sql_exec noquiet "create table pga_layout (tablename varchar(64),nrcols int2,colname text,colwidth text)" + 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 colcount [lindex $layoutinfo 1] - set colname [lindex $layoutinfo 2] - set colwidth [lindex $layoutinfo 3] + set mw(colcount) [lindex $layoutinfo 1] + set mw(colnames) [lindex $layoutinfo 2] + set mw(colwidth) [lindex $layoutinfo 3] set goodoid [lindex $layoutinfo 4] - set layout_found true + set mw(layout_found) 1 } if {$nrlay>1} { show_error "Multiple ([pg_result $pgres -numTuples]) layout info found\n\nPlease report the bug!" @@ -615,18 +699,62 @@ if {$retval} { } proc load_table {objname} { -global ds_query ds_updatable ds_isaquery sortfield filter tablename +global mw sortfield filter tablename set tablename $objname -load_layout $objname -set ds_query "select oid,$tablename.* from $objname" -set ds_updatable true -set ds_isaquery false -select_records $ds_query +mw_load_layout $objname +set mw(query) "select oid,$tablename.* from $objname" +set mw(updatable) 1 +set mw(isaquery) 0 +mw_select_records $mw(query) +wm title .mw "Table viewer : $objname" +} + +proc mw_canvas_click {x y} { +global mw msg +if {![mw_exit_edit]} return +# Determining row +for {set row 0} {$row<$mw(nrecs)} {incr row} { + if {[lindex $mw(rowy) $row]>$y} break +} +incr row -1 +if {$y>[lindex $mw(rowy) $mw(last_rownum)]} {set row $mw(last_rownum)} +if {$row<0} return +set mw(row_edited) $row +set mw(crtrow) $row +mw_show_record $row +if {$mw(errorsavingnew)} return +# Determining column +set posx [expr -$mw(leftoffset)] +set col 0 +foreach cw $mw(colwidth) { + incr posx [expr $cw+2] + if {$x<$posx} break + incr col +} +set itlist [.mw.c find withtag r$row] +foreach item $itlist { + if {[get_tag_info $item c]==$col} { + mw_start_edit $item $x $y + break + } +} +} + +proc mw_start_edit {id x y} { +global mw msg +if {!$mw(updatable)} return +set mw(id_edited) $id +set mw(dirtyrec) 0 +set mw(text_initial_value) [.mw.c itemcget $id -text] +focus .mw.c +.mw.c focus $id +.mw.c icursor $id @$x,$y +if {$mw(row_edited)==$mw(nrecs)} { + if {[.mw.c itemcget $id -text]=="*"} { + .mw.c itemconfigure $id -text "" + .mw.c icursor $id 0 + } } - -proc mark_dirty {name1 name2 op} { -global dirty -set dirty true } proc open_database {} { @@ -679,7 +807,7 @@ set funcpar [join $funcpar ,] } proc open_query {how} { -global dbc queryname layout_found queryoid ds_query ds_updatable ds_isaquery sortfield filter +global dbc queryname mw queryoid sortfield filter if {[.dw.lb curselection]==""} return; set queryname [.dw.lb get [.dw.lb curselection]] @@ -704,11 +832,12 @@ if {$how=="design"} { } else { if {$qtype=="S"} then { Window show .mw - load_layout $queryname - set ds_query $qcmd - set ds_updatable false - set ds_isaquery true - select_records $qcmd + wm title .mw "Query result: $queryname" + mw_load_layout $queryname + set mw(query) $qcmd + set mw(updatable) 0 + set mw(isaquery) 1 + mw_select_records $qcmd } else { set answ [tk_messageBox -title Warning -type yesno -message "This query is an action query!\n\n$qcmd\n\nDo you want to execute it?"] if {$answ} { @@ -746,37 +875,39 @@ if {$flag} { } proc open_view {} { -global ds_query ds_updatable ds_isaquery +global mw set vn [get_dwlb_Selection] if {$vn==""} return; Window show .mw -set ds_query "select * from $vn" -set ds_isaquery false -set ds_updatable false -load_layout $vn -select_records $ds_query -} - -proc pan_left {} { -global leftcol leftoffset colwidth colcount -if {![hide_entry]} return; -if {$leftcol==[expr $colcount-1]} return; -set diff [expr 2+[lindex $colwidth $leftcol]] -incr leftcol -incr leftoffset $diff +set mw(query) "select * from $vn" +set mw(isaquery) 0 +set mw(updatable) 0 +mw_load_layout $vn +mw_select_records $mw(query) +} + +proc mw_pan_left {} { +global mw +if {![mw_exit_edit]} return; +if {$mw(leftcol)==[expr $mw(colcount)-1]} return; +set diff [expr 2+[lindex $mw(colwidth) $mw(leftcol)]] +incr mw(leftcol) +incr mw(leftoffset) $diff .mw.c move header -$diff 0 -.mw.c move rows -$diff 0 +.mw.c move q -$diff 0 +.mw.c move hgrid -$diff 0 } -proc pan_right {} { -global leftcol leftoffset colcount colwidth -if {![hide_entry]} return; -if {$leftcol==0} return; -incr leftcol -1 -set diff [expr 2+[lindex $colwidth $leftcol]] -incr leftoffset -$diff +proc mw_pan_right {} { +global mw +if {![mw_exit_edit]} return; +if {$mw(leftcol)==0} return; +incr mw(leftcol) -1 +set diff [expr 2+[lindex $mw(colwidth) $mw(leftcol)]] +incr mw(leftoffset) -$diff .mw.c move header $diff 0 -.mw.c move rows $diff 0 +.mw.c move q $diff 0 +.mw.c move hgrid $diff 0 } proc ql_add_new_table {} { @@ -856,42 +987,56 @@ 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 -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 -} else { - set tablename [ql_get_tag_info $obj tab] - if {$tablename==""} return - if {[tk_messageBox -title WARNING -icon question -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(restables) [lreplace $qlvar(restables) $i $i] - set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $i $i] - } +} +# 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 -message "Remove field from result ?" -type yesno -default no]=="no"} return + set qlvar(resfields) [lreplace $qlvar(resfields) $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 tablename [ql_get_tag_info $obj tab] +if {$tablename==""} return +if {[tk_messageBox -title WARNING -icon question -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(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 {($tablename==[lindex $thelink 0]) || ($tablename==[lindex $thelink 2])} { - set qlvar(links) [lreplace $qlvar(links) $i $i] - } +} +for {set i [expr [llength $qlvar(links)]-1]} {$i>=0} {incr i -1} { + set thelink [lindex $qlvar(links) $i] + if {($tablename==[lindex $thelink 0]) || ($tablename==[lindex $thelink 2])} { + set qlvar(links) [lreplace $qlvar(links) $i $i] } - for {set i 0} {$i<$qlvar(ntables)} {incr i} { - if {$qlvar(tablename$i)=="$tablename"} { - unset qlvar(tablename$i) - unset qlvar(tablestruct$i) - break - } +} +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) + break } - incr qlvar(ntables) -1 - .ql.c delete tab$tablename - .ql.c delete links - ql_draw_links - ql_draw_res_panel } +incr qlvar(ntables) -1 +.ql.c delete tab$tablename +.ql.c delete links +ql_draw_links +ql_draw_res_panel } proc ql_dragit {w x y} { @@ -1075,17 +1220,18 @@ proc ql_draw_res_panel {} { global qlvar # 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 -fill navy -tags {resf resp} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* - .ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 16+$qlvar(yoffs)] -text [lindex $qlvar(restables) $i] -anchor nw -tags {resp rest} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* - .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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* - 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags [subst {resp cr-c$i-r0}] - } +.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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + .ql.c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 16+$qlvar(yoffs)] -text [lindex $qlvar(restables) $i] -anchor nw -tags {resp rest} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + .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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags [subst {resp cr-c$i-r0}] } - .ql.c raise reshdr - .ql.c bind sort {ql_swap_sort %W %x %y} +} +.ql.c raise reshdr +.ql.c bind resf {ql_resfield_click %x %y} +.ql.c bind sort {ql_swap_sort %W %x %y} } proc ql_draw_table {it} { @@ -1163,6 +1309,17 @@ if {$qlvar(panobject)=="tables"} { } } +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 @@ -1237,14 +1394,14 @@ set qlvar(critrow) 0 set qlvar(critedit) 1 } -proc save_new_record {} { -global dbc newrec_fields newrec_values tablename msg last_rownum -if {![hide_entry]} {return 0} -if {$newrec_fields==""} {return 1} +proc mw_save_new_record {} { +global dbc mw tablename msg +if {![mw_exit_edit]} {return 0} +if {$mw(newrec_fields)==""} {return 1} set msg "Saving new record ..." after 1000 {set msg ""} set retval [catch { - set sqlcmd "insert into $tablename ([join $newrec_fields ,]) values ([join $newrec_values ,])" + set sqlcmd "insert into $tablename ([join $mw(newrec_fields) ,]) values ([join $mw(newrec_values) ,])" set pgres [pg_exec $dbc $sqlcmd] } errmsg] if {$retval} { @@ -1252,26 +1409,28 @@ if {$retval} { return 0 } set oid [pg_result $pgres -oid] +lappend mw(keylist) $oid pg_result $pgres -clear +# Get bounds of the last record +set lrbb [.mw.c bbox new] +lappend mw(rowy) [lindex $lrbb 3] .mw.c itemconfigure new -fill black -.mw.c addtag o$oid withtag new -.mw.c dtag new o0 -.mw.c dtag rows new +.mw.c dtag q new # Replace * from untouched new row elements with " " foreach item [.mw.c find withtag unt] { .mw.c itemconfigure $item -text " " } -.mw.c dtag rows unt -incr last_rownum -draw_new_record -set newrec_fields {} -set newrec_values {} +.mw.c dtag q unt +incr mw(last_rownum) +incr mw(nrecs) +mw_draw_new_record +set mw(newrec_fields) {} +set mw(newrec_values) {} return 1 } proc save_pref {} { global pref - catch { set fid [open "~/.pgaccessrc" w] foreach {opt val} [array get pref] { puts $fid "$opt $val" } @@ -1279,81 +1438,99 @@ catch { } } -proc scroll_window {par1 par2 args} { -global nrecs toprec -if {![hide_entry]} return; +proc mw_scroll_window {par1 par2 args} { +global mw +if {![mw_exit_edit]} return; if {$par1=="scroll"} { - set newtop $toprec + set newtop $mw(toprec) if {[lindex $args 0]=="units"} { incr newtop $par2 } else { incr newtop [expr $par2*25] if {$newtop<0} {set newtop 0} - if {$newtop>=[expr $nrecs-1]} {set newtop [expr $nrecs-1]} + if {$newtop>=[expr $mw(nrecs)-1]} {set newtop [expr $mw(nrecs)-1]} } } else { - set newtop [expr int($par2*$nrecs)] + set newtop [expr int($par2*$mw(nrecs))] } if {$newtop<0} return; -if {$newtop>=[expr $nrecs-1]} return; -.mw.c move rows 0 [expr 14*($toprec-$newtop)] -set toprec $newtop -set_scrollbar -} - -proc select_records {sql} { -global dbc field dirty nrecs toprec colwidth colname colcount ds_updatable -global layout_found layout_name tablename leftcol leftoffset msg pref -global newrec_fields newrec_values -global last_rownum -set newrec_fields {} -set newrec_values {} -if {![hide_entry]} return; -.mw.c delete rows +if {$newtop>=[expr $mw(nrecs)-1]} return; +set dy [expr [lindex $mw(rowy) $mw(toprec)]-[lindex $mw(rowy) $newtop]] +.mw.c move q 0 $dy +.mw.c move hgrid 0 $dy +set newrowy {} +foreach y $mw(rowy) {lappend newrowy [expr $y+$dy]} +set mw(rowy) $newrowy +set mw(toprec) $newtop +mw_set_scrollbar +} + +proc mw_select_records {sql} { +global dbc field mw +global tablename msg pref +set mw(newrec_fields) {} +set mw(newrec_values) {} +if {![mw_exit_edit]} return; +.mw.c delete q .mw.c delete header -set leftcol 0 -set leftoffset 0 +.mw.c delete hgrid +.mw.c delete new +set mw(leftcol) 0 +set mw(leftoffset) 0 +set mw(crtrow) {} set msg {} +set msg "Accessing data. Please wait ..." cursor_watch .mw -set retval [catch {set pgres [pg_exec $dbc $sql]} errmsg] +set retval [catch {set pgres [pg_exec $dbc "BEGIN"]} errmsg] +if {!$retval} { + pg_result $pgres -clear + set retval [catch {set pgres [pg_exec $dbc "declare mycursor cursor for $sql"]} errmsg] + if {!$retval} { + pg_result $pgres -clear + set retval [catch {set pgres [pg_exec $dbc "fetch $pref(rows) in mycursor"]} errmsg] + } +} +#set retval [catch {set pgres [pg_exec $dbc $sql]} errmsg] if {$retval} { + sql_exec quiet "END" + set msg {} cursor_arrow .mw show_error "Error executing SQL command\n\n$sql\n\nError message:$errmsg" set msg "Error executing : $sql" return } -if {$ds_updatable} then {set shift 1} else {set shift 0} +if {$mw(updatable)} then {set shift 1} else {set shift 0} # # checking at least the numer of fields set attrlist [pg_result $pgres -lAttributes] -if {$layout_found} then { - if { ($colcount != [expr [llength $attrlist]-$shift]) || - ($colcount != [llength $colname]) || - ($colcount != [llength $colwidth]) } then { +if {$mw(layout_found)} then { + if { ($mw(colcount) != [expr [llength $attrlist]-$shift]) || + ($mw(colcount) != [llength $mw(colnames)]) || + ($mw(colcount) != [llength $mw(colwidth)]) } then { # No. of columns don't match, something is wrong # tk_messageBox -title Information -message "Layout info changed !\nRescanning..." - set layout_found false - sql_exec quiet "delete from pga_layout where tablename='$layout_name'" + set mw(layout_found) 0 + sql_exec quiet "delete from pga_layout where tablename='$mw(layout_name)'" } } # Always take the col. names from the result -set colcount [llength $attrlist] -if {$ds_updatable} then {incr colcount -1} -set colname {} -# In defcolwidth prepare colwidth (in case that not layout_found) -set defcolwidth {} -for {set i 0} {$i<$colcount} {incr i} { - lappend colname [lindex [lindex $attrlist [expr $i+$shift]] 0] - lappend defcolwidth 150 -} -if {$layout_found=="false"} { - set colwidth $defcolwidth - sql_exec quiet "insert into pga_layout values ('$layout_name',$colcount,'$colname','$colwidth')" -} -set nrecs [pg_result $pgres -numTuples] -if {$nrecs>$pref(rows)} { - set msg "Only first $pref(rows) records from $nrecs have been loaded" - set nrecs $pref(rows) +set mw(colcount) [llength $attrlist] +if {$mw(updatable)} then {incr mw(colcount) -1} +set mw(colnames) {} +# In defmw(colwidth) prepare mw(colwidth) (in case that not layout_found) +set defmw(colwidth) {} +for {set i 0} {$i<$mw(colcount)} {incr i} { + lappend mw(colnames) [lindex [lindex $attrlist [expr $i+$shift]] 0] + lappend defmw(colwidth) 150 +} +if {!$mw(layout_found)} { + set mw(colwidth) $defmw(colwidth) + sql_exec quiet "insert into pga_layout values ('$mw(layout_name)',$mw(colcount),'$mw(colnames)','$mw(colwidth)')" +} +set mw(nrecs) [pg_result $pgres -numTuples] +if {$mw(nrecs)>$pref(rows)} { + set msg "Only first $pref(rows) records from $mw(nrecs) have been loaded" + set mw(nrecs) $pref(rows) } set tagoid {} if {$pref(tvfont)=="helv"} { @@ -1361,64 +1538,75 @@ if {$pref(tvfont)=="helv"} { } else { set tvfont -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-* } -for {set i 0} {$i<$nrecs} {incr i} { +# Computing column's left edge +set posx 10 +for {set j 0} {$j<$mw(colcount)} {incr j} { + set ledge($j) $posx + incr posx [expr [lindex $mw(colwidth) $j]+2] + set textwidth($j) [expr [lindex $mw(colwidth) $j]-5] +} +incr posx -6 +set posy 24 +mw_draw_headers +set mw(updatekey) oid +set mw(keylist) {} +set mw(rowy) {24} +set msg [time {for {set i 0} {$i<$mw(nrecs)} {incr i} { set curtup [pg_result $pgres -getTuple $i] - if {$ds_updatable} then {set tagoid o[lindex $curtup 0]} - set posx 10 - for {set j 0} {$j<$colcount} {incr j} { - set fldtext [lindex $curtup [expr $j+$shift]] - if {[string length $fldtext]==0} {set fldtext " "}; - .mw.c create text $posx [expr 30+$i*14] -text $fldtext -tags [subst {$tagoid c$j rows}] -anchor w -font $tvfont - incr posx [expr [lindex $colwidth $j]+2] - } -} -set last_rownum $i + if {$mw(updatable)} then {lappend mw(keylist) [lindex $curtup 0]} + for {set j 0} {$j<$mw(colcount)} {incr j} { + .mw.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) + } + set bb [.mw.c bbox r$i] + incr posy [expr [lindex $bb 3]-[lindex $bb 1]] + lappend mw(rowy) $posy + .mw.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 2000 set msg {} +set mw(last_rownum) $i # Defining position for input data -draw_new_record +mw_draw_new_record pg_result $pgres -clear -set toprec 0 -set_scrollbar -if {$ds_updatable} then { - .mw.c bind rows {color_record [%W find closest %x %y]} - .mw.c bind rows {show_entry [%W find closest %x %y]} +#set msg {} +sql_exec quiet "END" +set mw(toprec) 0 +mw_set_scrollbar +if {$mw(updatable)} then { + .mw.c bind q {mw_edit_text %A %K} } else { - .mw.c bind rows {} - .mw.c bind rows {bell} + .mw.c bind q {} } -set dirty false -draw_headers +set mw(dirtyrec) 0 +#mw_draw_headers +.mw.c raise header cursor_arrow .mw } -proc set_scrollbar {} { -global nrecs toprec - -if {$nrecs==0} return; -.mw.sb set [expr $toprec*1.0/$nrecs] [expr ($toprec+27.0)/$nrecs] +proc mw_draw_hgrid {} { +global mw +.mw.c delete hgrid +set posx 10 +for {set j 0} {$j<$mw(colcount)} {incr j} { + set ledge($j) $posx + incr posx [expr [lindex $mw(colwidth) $j]+2] + set textwidth($j) [expr [lindex $mw(colwidth) $j]-5] } - -proc show_entry {id} { -global dirty fldval msg itemid colname colwidth - -if {![hide_entry]} return; -set itemid $id -set colidx [get_tag_info $id c] -set fldval [string trim [.mw.c itemcget $id -text]] -# It's a new record tag ? -if {[get_tag_info $id n]=="ew"} { - set fldval "" -} else { - if {![save_new_record]} return; +incr posx -6 +for {set i 0} {$i<$mw(nrecs)} {incr i} { + .mw.c create line [expr -$mw(leftoffset)] [lindex $mw(rowy) [expr $i+1]] [expr $posx-$mw(leftoffset)] [lindex $mw(rowy) [expr $i+1]] -fill gray -tags [subst {hgrid g$i}] +} +if {$mw(updatable)} { + set i $mw(nrecs) + .mw.c create line [expr -$mw(leftoffset)] [lindex $mw(rowy) [expr $i+1]] [expr $posx-$mw(leftoffset)] [lindex $mw(rowy) [expr $i+1]] -fill gray -tags [subst {hgrid g$i}] } -set dirty false -set coord [.mw.c coords $id] -entry .mw.entf -textvar fldval -width [expr int(([lindex $colwidth $colidx]-5)/6.2)] -borderwidth 0 -background #ddfefe -highlightthickness 0 -selectborderwidth 0 -font -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-*; -place .mw.entf -x [expr 4+[lindex $coord 0]] -y [expr 18+[lindex $coord 1]]; -focus .mw.entf -bind .mw.entf {hide_entry} -bind .mw.entf {set dirty false;hide_entry;set msg {}} -set msg "Editing field [lindex $colname $colidx]" -after 2000 {set msg ""} +} + +proc mw_set_scrollbar {} { +global mw +if {$mw(nrecs)==0} return; +.mw.sb set [expr $mw(toprec)*1.0/$mw(nrecs)] [expr ($mw(toprec)+27.0)/$mw(nrecs)] } proc show_error {emsg} { @@ -1461,7 +1649,7 @@ cmd_$curtab } proc main {argc argv} { -global pref newdbname newpport newhost +global pref newdbname newpport newhost dbc load libpgtcl.so catch {draw_tabs} load_pref @@ -1471,6 +1659,40 @@ if {$pref(autoload) && ($pref(lastdb)!="")} { set newpport $pref(lastport) open_database } +wm protocol .dw WM_DELETE_WINDOW { + catch {pg_disconnect $dbc} + exit + } +} + +proc tiw_show_index {} { +global tiw dbc +set cs [.tiw.ilb curselection] +if {$cs==""} return +set idxname [.tiw.ilb get $cs] +pg_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} { +# pg_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 Window {args} { @@ -1545,24 +1767,40 @@ proc vTclWindow.about {base} { 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 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief groove -text {A Tcl/Tk interface to + 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 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief sunken -text {vers 0.5} - label $base.l4 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief groove -text {You will always get the latest version at: + label $base.l3 \ + -borderwidth 0 \ + -relief sunken -text {vers 0.61} + label $base.l4 \ + -relief groove \ + -text {You will always get the latest version at: http://ww.flex.ro/pgaccess Suggestions : teo@flex.ro} - button $base.b1 -borderwidth 1 -command {Window hide .about} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Ok + button $base.b1 \ + -borderwidth 1 -command {Window hide .about} \ + -padx 9 \ + -pady 3 -text Ok ################### # SETTING GEOMETRY ################### - 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 + 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} { @@ -1586,32 +1824,28 @@ proc vTclWindow.dbod {base} { wm title $base "Open database" label $base.lhost \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text Host entry $base.ehost \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newhost label $base.lport \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text Port entry $base.epport \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newpport label $base.ldbname \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text Database entry $base.edbname \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newdbname button $base.opbtu \ -borderwidth 1 -command open_database \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Open + -padx 9 -pady 3 -text Open button $base.canbut \ -borderwidth 1 -command {Window hide .dbod} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text Cancel ################### # SETTING GEOMETRY @@ -1647,7 +1881,7 @@ proc vTclWindow.dw {base} { toplevel $base -class Toplevel \ -background #efefef wm focusmodel $base passive - wm geometry $base 322x355+78+129 + wm geometry $base 322x355+93+104 wm maxsize $base 1009 738 wm minsize $base 1 1 wm overrideredirect $base 0 @@ -1655,7 +1889,6 @@ proc vTclWindow.dw {base} { wm deiconify $base wm title $base "PostgreSQL access" label $base.labframe \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised listbox $base.lb \ -background #fefefe \ @@ -1667,23 +1900,21 @@ proc vTclWindow.dw {base} { } button $base.btnnew \ -borderwidth 1 -command cmd_New \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text New button $base.btnopen \ -borderwidth 1 -command cmd_Open \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text Open button $base.btndesign \ -borderwidth 1 -command cmd_Design \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -state disabled -text Design label $base.lmask \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text { } label $base.label22 \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised menubutton $base.menubutton23 \ -borderwidth 1 \ @@ -1722,11 +1953,9 @@ set sdbname {}} \ save_pref exit} -label Exit label $base.lshost \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief groove -text localhost -textvariable host label $base.lsdbname \ - -anchor w -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief groove -textvariable sdbname + -anchor w -relief groove -textvariable sdbname scrollbar $base.sb \ -borderwidth 1 -command {.dw.lb yview} -orient vert menubutton $base.mnob \ @@ -1806,16 +2035,31 @@ proc vTclWindow.fw {base} { wm minsize $base 1 1 wm overrideredirect $base 0 wm resizable $base 0 0 - wm deiconify $base wm title $base "Function" - label $base.l1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Name - entry $base.e1 -background #fefefe -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable funcname - label $base.l2 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Parameters - entry $base.e2 -background #fefefe -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable funcpar - label $base.l3 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Returns - entry $base.e3 -background #fefefe -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable funcret - text $base.text1 -background #fefefe -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -highlightthickness 1 -selectborderwidth 0 -wrap word - button $base.okbtn -borderwidth 1 -command { + label $base.l1 \ + -borderwidth 0 \ + -relief raised -text Name + entry $base.e1 \ + -background #fefefe -borderwidth 1 -highlightthickness 1 \ + -selectborderwidth 0 -textvariable funcname + label $base.l2 \ + -borderwidth 0 \ + -relief raised -text Parameters + entry $base.e2 \ + -background #fefefe -borderwidth 1 -highlightthickness 1 \ + -selectborderwidth 0 -textvariable funcpar + label $base.l3 \ + -borderwidth 0 \ + -relief raised -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==""} { @@ -1830,20 +2074,34 @@ proc vTclWindow.fw {base} { } } - } -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Define - button $base.cancelbtn -borderwidth 1 -command {Window hide .fw} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Close + } \ + -padx 9 \ + -pady 3 -state disabled -text Define + button $base.cancelbtn \ + -borderwidth 1 -command {Window hide .fw} \ + -padx 9 \ + -pady 3 -text Close ################### # SETTING GEOMETRY ################### - 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 255 -anchor nw -bordermode ignore - place $base.cancelbtn -x 160 -y 255 -anchor nw -bordermode ignore + 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} { @@ -1864,13 +2122,24 @@ proc vTclWindow.iew {base} { wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Import-Export table" - label $base.l1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Table name} - entry $base.e1 -background #fefefe -borderwidth 1 -textvariable ie_tablename - label $base.l2 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {File name} - entry $base.e2 -background #fefefe -borderwidth 1 -textvariable ie_filename - label $base.l3 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Field delimiter} - entry $base.e3 -background #fefefe -borderwidth 1 -textvariable ie_delimiter - button $base.expbtn -borderwidth 1 -command {if {$ie_tablename==""} { + label $base.l1 \ + -borderwidth 0 \ + -relief raised -text {Table name} + entry $base.e1 \ + -background #fefefe -borderwidth 1 -textvariable ie_tablename + label $base.l2 \ + -borderwidth 0 \ + -relief raised -text {File name} + entry $base.e2 \ + -background #fefefe -borderwidth 1 -textvariable ie_filename + label $base.l3 \ + -borderwidth 0 \ + -relief raised -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!" @@ -1898,21 +2167,37 @@ proc vTclWindow.iew {base} { Window hide .iew } cursor_arrow .iew -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Export - button $base.cancelbtn -borderwidth 1 -command {Window hide .iew} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Cancel - checkbutton $base.oicb -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -text {with OIDs} -variable oicb +}} \ + -padx 9 \ + -pady 3 -text Export + button $base.cancelbtn \ + -borderwidth 1 -command {Window hide .iew} \ + -padx 9 \ + -pady 3 -text Cancel + checkbutton $base.oicb \ + -borderwidth 1 \ + -text {with OIDs} -variable oicb ################### # SETTING GEOMETRY ################### - place $base.l1 -x 25 -y 15 -anchor nw -bordermode ignore - place $base.e1 -x 115 -y 10 -anchor nw -bordermode ignore - place $base.l2 -x 25 -y 45 -anchor nw -bordermode ignore - place $base.e2 -x 115 -y 40 -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 -anchor nw -bordermode ignore - place $base.cancelbtn -x 155 -y 110 -anchor nw -bordermode ignore - place $base.oicb -x 170 -y 75 -anchor nw -bordermode ignore + place $base.l1 \ + -x 25 -y 15 -anchor nw -bordermode ignore + place $base.e1 \ + -x 115 -y 10 -anchor nw -bordermode ignore + place $base.l2 \ + -x 25 -y 45 -anchor nw -bordermode ignore + place $base.e2 \ + -x 115 -y 40 -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 -anchor nw -bordermode ignore + place $base.cancelbtn \ + -x 155 -y 110 -anchor nw -bordermode ignore + place $base.oicb \ + -x 170 -y 75 -anchor nw -bordermode ignore } proc vTclWindow.mw {base} { @@ -1928,44 +2213,43 @@ proc vTclWindow.mw {base} { toplevel $base -class Toplevel \ -cursor top_left_arrow wm focusmodel $base passive - wm geometry $base 631x452+160+238 + wm geometry $base 631x452+239+226 wm maxsize $base 1009 738 wm minsize $base 1 1 wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Table browser" bind $base { - delete_record + mw_delete_record } label $base.hoslbl \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text {Sort field} button $base.fillbtn \ -borderwidth 1 \ - -command {set nq $ds_query -if {($ds_isaquery=="true") && ("$filter$sortfield"!="")} { + -command {set nq $mw(query) +if {($mw(isaquery)) && ("$filter$sortfield"!="")} { show_error "Sorting and filtering not (yet) available from queries!\n\nPlease enter them in the query definition!" set sortfield {} set filter {} } else { if {$filter!=""} { - set nq "$ds_query where ($filter)" + set nq "$mw(query) where ($filter)" } else { - set nq $ds_query + set nq $mw(query) } if {$sortfield!=""} { set nq "$nq order by $sortfield" } } -if {[save_new_record]} {select_records $nq} +if {[mw_save_new_record]} {mw_select_records $nq} } \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text Reload button $base.exitbtn \ -borderwidth 1 \ -command { -if {[save_new_record]} { +if {[mw_save_new_record]} { .mw.c delete rows .mw.c delete header set sortfield {} @@ -1973,26 +2257,29 @@ if {[save_new_record]} { Window hide .mw } } \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text Close canvas $base.c \ - -background #fefefe -borderwidth 2 -height 207 -relief ridge \ - -width 295 + -background #fefefe -borderwidth 2 -height 207 -highlightthickness 0 \ + -relief ridge -selectborderwidth 0 -takefocus 1 -width 295 + bind $base.c { + mw_canvas_click %x %y + } bind $base.c { - if {[hide_entry]} {save_new_record} + if {[mw_exit_edit]} {mw_save_new_record} } label $base.msglbl \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief sunken -textvariable msg scrollbar $base.sb \ - -borderwidth 1 -command scroll_window -orient vert + -borderwidth 1 -command mw_scroll_window -highlightthickness 0 \ + -orient vert button $base.ert \ - -borderwidth 1 -command pan_left \ + -borderwidth 1 -command mw_pan_left \ -font -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ -pady 3 -text > button $base.dfggfh \ - -borderwidth 1 -command pan_right \ + -borderwidth 1 -command mw_pan_right \ -font -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ -pady 3 -text < entry $base.tbn \ @@ -2000,7 +2287,6 @@ if {[save_new_record]} { -selectborderwidth 0 -textvariable filter label $base.tbllbl \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text {Filter conditions} entry $base.dben \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ @@ -2019,7 +2305,7 @@ if {[save_new_record]} { place $base.msglbl \ -x 33 -y 430 -width 567 -height 18 -anchor nw -bordermode ignore place $base.sb \ - -x 610 -y 26 -width 18 -height 404 -anchor nw -bordermode ignore + -x 612 -y 26 -width 13 -height 404 -anchor nw -bordermode ignore place $base.ert \ -x 603 -y 428 -width 25 -height 22 -anchor nw -bordermode ignore place $base.dfggfh \ @@ -2076,14 +2362,14 @@ proc vTclWindow.nt {base} { bind $base.e5 { focus .nt.cb1 } - checkbutton $base.cb1 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -offvalue { } -onvalue { NOT NULL} -text {field cannot be null} -variable notnull - label $base.lab1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Field type} - label $base.lab2 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Field name} - label $base.lab3 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Field size} - label $base.lab4 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Default value} - button $base.addfld -borderwidth 1 -command add_new_field -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Add field} - button $base.delfld -borderwidth 1 -command {catch {.nt.lb delete [.nt.lb curselection]}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Delete field} - button $base.emptb -borderwidth 1 -command {.nt.lb delete 0 [.nt.lb size]} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Delete all} + checkbutton $base.cb1 -borderwidth 1 -offvalue { } -onvalue { NOT NULL} -text {field cannot be null} -variable notnull + label $base.lab1 -borderwidth 0 -relief raised -text {Field type} + label $base.lab2 -borderwidth 0 -relief raised -text {Field name} + label $base.lab3 -borderwidth 0 -relief raised -text {Field size} + label $base.lab4 -borderwidth 0 -relief raised -text {Default value} + button $base.addfld -borderwidth 1 -command add_new_field -padx 9 -pady 3 -text {Add field} + button $base.delfld -borderwidth 1 -command {catch {.nt.lb delete [.nt.lb curselection]}} -padx 9 -pady 3 -text {Delete field} + button $base.emptb -borderwidth 1 -command {.nt.lb delete 0 [.nt.lb size]} -padx 9 -pady 3 -text {Delete all} button $base.maketbl -borderwidth 1 -command {if {$newtablename==""} then { show_error "You must supply a name for your table!" focus .nt.etabn @@ -2092,10 +2378,12 @@ proc vTclWindow.nt {base} { focus .nt.e2 } else { set temp "create table $newtablename ([join [.nt.lb get 0 end] ,])" + cursor_watch .nt set retval [catch { set pgres [pg_exec $dbc $temp] pg_result $pgres -clear } errmsg ] + cursor_arrow .nt if {$retval} { show_error "Error creating table\n$errmsg" } else { @@ -2103,19 +2391,19 @@ proc vTclWindow.nt {base} { Window hide .nt cmd_Tables } -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Create table} +}} -padx 9 -pady 3 -text {Create table} listbox $base.lb -background #fefefe -borderwidth 1 -font -*-Clean-Medium-R-Normal--*-130-*-*-*-*-*-* -highlightthickness 1 -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 hide .nt} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Cancel - label $base.l1 -anchor w -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {field name} - label $base.l2 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text type - label $base.l3 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text options + button $base.exitbtn -borderwidth 1 -command {Window hide .nt} -padx 9 -pady 3 -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 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Table name} + label $base.l93 -borderwidth 0 -relief raised -text {Table name} menu $base.pop -tearoff 0 $base.pop add command -command {set fldtype char; if {("char"=="varchar")||("char"=="char")} then {.nt.e3 configure -state normal;focus .nt.e3} else {.nt.e3 configure -state disabled;focus .nt.e5} } -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -label char $base.pop add command -command {set fldtype char2; if {("char2"=="varchar")||("char2"=="char")} then {.nt.e3 configure -state normal;focus .nt.e3} else {.nt.e3 configure -state disabled;focus .nt.e5} } -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -label char2 @@ -2137,7 +2425,7 @@ proc vTclWindow.nt {base} { .nt.lb delete [expr $i+1] .nt.lb selection set [expr $i-1] } -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Move field up} +}} -padx 9 -pady 3 -text {Move field up} button $base.mvdn -borderwidth 1 -command {if {[.nt.lb size]>2} { set i [.nt.lb curselection] if {($i!="")&&($i<[expr [.nt.lb size]-1])} { @@ -2145,8 +2433,8 @@ proc vTclWindow.nt {base} { .nt.lb delete $i .nt.lb selection set [expr $i+1] } -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Move field down} - label $base.ll -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief sunken +}} -padx 9 -pady 3 -text {Move field down} + label $base.ll -borderwidth 1 -relief sunken ################### # SETTING GEOMETRY ################### @@ -2194,18 +2482,18 @@ proc vTclWindow.pw {base} { wm overrideredirect $base 0 wm resizable $base 1 1 wm title $base "Preferences" - label $base.l1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Max rows displayed in table/query view} + label $base.l1 -borderwidth 0 -relief raised -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 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Font - radiobutton $base.tvf -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -text {fixed (clean)} -value clean -variable pref(tvfont) - radiobutton $base.tvfv -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -text {proportional (helvetica)} -value helv -variable pref(tvfont) - label $base.ll -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief sunken - checkbutton $base.alcb -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -text {Auto-load the last opened database at startup} -variable pref(autoload) + label $base.l2 -borderwidth 0 -relief raised -text Font + radiobutton $base.tvf -borderwidth 1 -text {fixed (clean)} -value clean -variable pref(tvfont) + radiobutton $base.tvfv -borderwidth 1 -text {proportional (helvetica)} -value helv -variable pref(tvfont) + 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 -message "A big number of rows displayed in table view will take a lot of memory!" } save_pref -Window hide .pw} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Ok +Window hide .pw} -padx 9 -pady 3 -text Ok ################### # SETTING GEOMETRY ################### @@ -2229,9 +2517,10 @@ proc vTclWindow.qb {base} { ################### # CREATING WIDGETS ################### - toplevel $base -class Toplevel + toplevel $base -class Toplevel \ + -cursor top_left_arrow wm focusmodel $base passive - wm geometry $base 442x344+258+271 + wm geometry $base 442x344+277+276 wm maxsize $base 1009 738 wm minsize $base 1 1 wm overrideredirect $base 0 @@ -2239,7 +2528,6 @@ proc vTclWindow.qb {base} { wm title $base "Query builder" label $base.lqn \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text {Query name} entry $base.eqn \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ @@ -2289,20 +2577,19 @@ proc vTclWindow.qb {base} { catch {pg_result $pgres -clear} } }} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Save query definition} + -padx 9 -pady 3 -text {Save query definition} button $base.execbtn \ -borderwidth 1 \ -command {Window show .mw set qcmd [.qb.text1 get 0.0 end] regsub -all "\n" $qcmd " " qcmd -set layout_name $queryname -load_layout $queryname -set ds_query $qcmd -set ds_updatable false -set ds_isaquery true -select_records $qcmd} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ +set mw(layout_name) $queryname +mw_load_layout $queryname +set mw(query) $qcmd +set mw(updatable) 0 +set mw(isaquery) 1 +mw_select_records $qcmd} \ + -padx 9 \ -pady 3 -text {Execute query} button $base.termbtn \ -borderwidth 1 \ @@ -2311,22 +2598,20 @@ set cbv 0 set queryname {} .qb.text1 delete 1.0 end Window hide .qb} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text Close text $base.text1 \ -background #fefefe -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -highlightthickness 1 -wrap word checkbutton $base.cbv \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -text {Save this query as a view} -variable cbv button $base.qlshow \ -borderwidth 1 \ -command {Window show .ql ql_draw_lizzard focus .ql.entt} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -padx 9 \ -pady 3 -text {Visual designer} ################### # SETTING GEOMETRY @@ -2359,10 +2644,9 @@ proc vTclWindow.ql {base} { ################### # CREATING WIDGETS ################### - toplevel $base -class Toplevel \ - -cursor top_left_arrow + toplevel $base -class Toplevel -cursor top_left_arrow wm focusmodel $base passive - wm geometry $base 759x530+135+154 + wm geometry $base 759x530+228+154 wm maxsize $base 1009 738 wm minsize $base 1 1 wm overrideredirect $base 0 @@ -2380,71 +2664,39 @@ proc vTclWindow.ql {base} { bind $base { ql_delete_object } - canvas $base.c \ - -background #fefefe -borderwidth 2 -height 207 -relief ridge \ - -takefocus 0 -width 295 - button $base.b1 \ - -borderwidth 1 -command ql_add_new_table \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Add table} - button $base.exitbtn \ - -borderwidth 1 -command {ql_init -Window hide .ql} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Close - button $base.showbtn \ - -borderwidth 1 -command ql_show_sql \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Show SQL} - label $base.l12 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text Table - entry $base.entt \ - -background #fefefe -borderwidth 1 -highlightthickness 1 \ - -selectborderwidth 0 -textvariable qlvar(newtablename) + canvas $base.c -background #fefefe -borderwidth 2 -height 207 -relief ridge -takefocus 0 -width 295 + button $base.b1 -borderwidth 1 -command ql_add_new_table -padx 9 -pady 3 -text {Add table} + button $base.exitbtn -borderwidth 1 -command {ql_init +Window hide .ql} -padx 9 -pady 3 -text Close + button $base.showbtn -borderwidth 1 -command ql_show_sql -padx 9 -pady 3 -text {Show SQL} + label $base.l12 -borderwidth 0 -relief raised -text 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 {Window show .mw + button $base.execbtn -borderwidth 1 -command {Window show .mw set qcmd [ql_compute_sql] -set layout_name nolayoutneeded -load_layout $layout_name -set ds_query $qcmd -set ds_updatable false -set ds_isaquery true -select_records $qcmd} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Execute SQL} - button $base.stoqb \ - -borderwidth 1 \ - -command {Window show .qb +set mw(layout_name) nolayoutneeded +mw_load_layout $mw(layout_name) +set mw(query) $qcmd +set mw(updatable) 0 +set mw(isaquery) 1 +mw_select_records $qcmd} -padx 9 -pady 3 -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} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Save to query builder} +focus .qb} -padx 9 -pady 3 -text {Save to query builder} ################### # SETTING GEOMETRY ################### - place $base.c \ - -x 5 -y 30 -width 748 -height 500 -anchor nw -bordermode ignore - place $base.b1 \ - -x 180 -y 5 -height 26 -anchor nw -bordermode ignore - place $base.exitbtn \ - -x 695 -y 5 -height 26 -anchor nw -bordermode ignore - place $base.showbtn \ - -x 367 -y 5 -height 26 -anchor nw -bordermode ignore - place $base.l12 \ - -x 10 -y 8 -width 33 -height 16 -anchor nw -bordermode ignore - place $base.entt \ - -x 50 -y 7 -width 126 -height 20 -anchor nw -bordermode ignore - place $base.execbtn \ - -x 452 -y 5 -height 26 -anchor nw -bordermode ignore - place $base.stoqb \ - -x 550 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.c -x 5 -y 30 -width 748 -height 500 -anchor nw -bordermode ignore + place $base.b1 -x 180 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.exitbtn -x 695 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.showbtn -x 367 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.l12 -x 10 -y 8 -width 33 -height 16 -anchor nw -bordermode ignore + place $base.entt -x 50 -y 7 -width 126 -height 20 -anchor nw -bordermode ignore + place $base.execbtn -x 452 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.stoqb -x 550 -y 5 -height 26 -anchor nw -bordermode ignore } proc vTclWindow.rf {base} { @@ -2465,7 +2717,7 @@ proc vTclWindow.rf {base} { wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Rename" - label $base.l1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {New name} + label $base.l1 -borderwidth 0 -relief raised -text {New name} entry $base.e1 -background #fefefe -borderwidth 1 -textvariable newobjname button $base.b1 -borderwidth 1 -command { if {$newobjname==""} { @@ -2492,8 +2744,8 @@ proc vTclWindow.rf {base} { Window hide .rf } } - } -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Rename - button $base.b2 -borderwidth 1 -command {Window hide .rf} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Cancel + } -padx 9 -pady 3 -text Rename + button $base.b2 -borderwidth 1 -command {Window hide .rf} -padx 9 -pady 3 -text Cancel ################### # SETTING GEOMETRY ################### @@ -2521,15 +2773,15 @@ proc vTclWindow.sqf {base} { wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Sequence" - label $base.l1 -anchor w -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Sequence name} + label $base.l1 -anchor w -borderwidth 0 -relief raised -text {Sequence name} entry $base.e1 -borderwidth 1 -highlightthickness 1 -textvariable seq_name - label $base.l2 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Increment + label $base.l2 -borderwidth 0 -relief raised -text Increment entry $base.e2 -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable seq_inc - label $base.l3 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Start value} + label $base.l3 -borderwidth 0 -relief raised -text {Start value} entry $base.e3 -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable seq_start - label $base.l4 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Minvalue + label $base.l4 -borderwidth 0 -relief raised -text Minvalue entry $base.e4 -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable seq_minval - label $base.l5 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Maxvalue + label $base.l5 -borderwidth 0 -relief raised -text Maxvalue entry $base.e5 -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable seq_maxval button $base.defbtn -borderwidth 1 -command { if {$seq_name==""} { @@ -2546,7 +2798,7 @@ proc vTclWindow.sqf {base} { tk_messageBox -title Information -message "Sequence created!" } } - } -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Define sequence} + } -padx 9 -pady 3 -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 @@ -2555,7 +2807,7 @@ proc vTclWindow.sqf {base} { } place .sqf.defbtn -x 40 -y 175 Window hide .sqf -} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Close +} -padx 9 -pady 3 -text Close ################### # SETTING GEOMETRY ################### @@ -2585,35 +2837,125 @@ proc vTclWindow.tiw {base} { ################### toplevel $base -class Toplevel wm focusmodel $base passive - wm geometry $base 395x309+300+240 + wm geometry $base 390x460+243+120 wm maxsize $base 1009 738 wm minsize $base 1 1 wm overrideredirect $base 0 wm resizable $base 1 1 wm title $base "Table information" - label $base.l1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Table name} - label $base.l2 -anchor w -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text note -textvariable tiw(tablename) - label $base.l3 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text Owner - label $base.l4 -anchor w -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text teo -textvariable tiw(owner) - listbox $base.lb -background #fefefe -borderwidth 1 -font -*-Clean-Medium-R-Normal--*-130-*-*-*-*-*-* -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 hide .tiw} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Close - label $base.l10 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {field name} - label $base.l11 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {field type} - label $base.l12 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text size + label $base.l1 \ + -borderwidth 0 \ + -relief raised -text {Table name} + label $base.l2 \ + -anchor w -borderwidth 0 \ + -relief raised -text conturi -textvariable tiw(tablename) + label $base.l3 \ + -borderwidth 0 \ + -relief raised -text Owner + label $base.l4 \ + -anchor w -borderwidth 1 \ + -textvariable tiw(owner) + listbox $base.lb \ + -background #fefefe -borderwidth 1 \ + -font -*-Clean-Medium-R-Normal--*-130-*-*-*-*-*-* \ + -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 hide .tiw} \ + -pady 3 -text Close + 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 \ + -relief raised -text {Field information} + label $base.lii \ + -borderwidth 1 \ + -relief raised -text {Indexes defined} + listbox $base.ilb \ + -background #fefefe -borderwidth 1 \ + -highlightthickness 1 -selectborderwidth 0 + 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 \ + -relief raised -text {Is clustered ?} + label $base.fr11.l2 \ + -borderwidth 0 \ + -relief raised -text {Is unique ?} + label $base.fr11.liu \ + -anchor nw -borderwidth 0 \ + -relief raised -text Yes -textvariable tiw(isunique) + label $base.fr11.lic \ + -anchor nw -borderwidth 0 \ + -relief raised -text No -textvariable tiw(isclustered) + label $base.fr11.l5 \ + -borderwidth 0 \ + -relief raised -text {Fields :} + label $base.fr11.lif \ + -anchor nw -borderwidth 1 \ + -justify left -relief sunken -text cont \ + -textvariable tiw(indexfields) -wraplength 170 ################### # SETTING GEOMETRY ################### - place $base.l1 -x 25 -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 25 -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 25 -y 90 -width 333 -height 176 -anchor nw -bordermode ignore - place $base.sb -x 355 -y 90 -width 18 -height 177 -anchor nw -bordermode ignore - place $base.closebtn -x 170 -y 275 -anchor nw -bordermode ignore - place $base.l10 -x 26 -y 75 -width 199 -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.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.sb \ + -x 355 -y 90 -width 18 -height 173 -anchor nw -bordermode ignore + place $base.closebtn \ + -x 325 -y 5 -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 280 -width 151 -height 18 -anchor nw -bordermode ignore + place $base.ilb \ + -x 20 -y 296 -width 150 -height 148 -anchor nw -bordermode ignore + place $base.lip \ + -x 171 -y 280 -width 198 -height 18 -anchor nw -bordermode ignore + place $base.fr11 \ + -x 170 -y 297 -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 } Window show .