From 4c87f79854f45f2279db96bd203980b839343f67 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 12 Dec 1998 21:15:40 +0000 Subject: [PATCH] Update to pgaccess 0.93. --- src/bin/pgaccess/README.pga | 20 +- src/bin/pgaccess/index.html | 211 ++-- src/bin/pgaccess/libpgtcl.dll | Bin 0 -> 48128 bytes src/bin/pgaccess/libpq.dll | Bin 0 -> 78336 bytes src/bin/pgaccess/pgaccess.tcl | 2175 ++++++++++++++++++--------------- 5 files changed, 1270 insertions(+), 1136 deletions(-) create mode 100644 src/bin/pgaccess/libpgtcl.dll create mode 100644 src/bin/pgaccess/libpq.dll diff --git a/src/bin/pgaccess/README.pga b/src/bin/pgaccess/README.pga index 8e5abc0c94..b19c313c39 100644 --- a/src/bin/pgaccess/README.pga +++ b/src/bin/pgaccess/README.pga @@ -22,7 +22,7 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. --------------------------------------------------------------------------- -PGACCESS 0.91 1 November 1998 +PGACCESS 0.93 10 December 1998 ================================ I dedicate this program to my little daughters Ana-Maria and Emilia and to my wife for their understanding. I hope they will forgive me for spending so many @@ -55,8 +55,17 @@ loadable object file, because libpgtcl is a collection of object files. Under Linux, this is called libpgtcl.so. You will find a pre-compiled copy of it for Linux i386 systems at : http://www.flex.ro/pgaccess. -Just copy libpgtcl.so into your system library director (/usr/lib) and -go for it. +Just copy libpgtcl.so into your system library directory /usr/lib or +/lib and go for it. + +Under Windows, copy libpgtcl.dll and libpq.dll into C:\WINDOWS\SYSTEM directory. +Make sure you have Tcl/Tk at least version 8.0.0 for Microsoft Windows 95 & NT. +PgAccess has been checked with Tcl/Tk 8.0.4 version on Windows95 and Windows98 +platforms. + +Tcl/Tk 8.0.4 for Windows95 & NT can be downloaded from +ftp://ftp.scriptics.com/pub/tcl/tcl8_0/tcl804.exe +It is 1833712 bytes long. 3.How to run it? @@ -79,10 +88,10 @@ pgaccess.tcl file. - Opens any database on a specified host at the specified port, username and password - Perform vacuum command. -- Saves preferences in ~/pgaccessrc file +- Saves preferences in ~/.pgaccessrc file Tables -- opening tables for viewing, max 200 records +- opening multiple tables for viewing, max n records (configurable) - column resizing by dragging the vertical grid lines - text will wrap in cells now - dynamic row height when editing @@ -135,7 +144,6 @@ Scripts 5.What it should do in the future ? -- table design (add new fields, renaming, etc) - sequence and function renaming - more powerful report generator and viewer - help on line diff --git a/src/bin/pgaccess/index.html b/src/bin/pgaccess/index.html index e943fe402b..57b1dc59ae 100644 --- a/src/bin/pgaccess/index.html +++ b/src/bin/pgaccess/index.html @@ -1,144 +1,129 @@ - + - PgAccess - a Tcl/Tk PostgreSQL interface - + + PgAccess - a Tcl/Tk PostgreSQL interface -

PgAccess - a free database management tool for PostgreSQL

- -

-


- -
  • Download the last version of PgAccess -(press shift and click this link).
  • - -

    Latest version of PgAccess is 0.91 , 1 November 1998 !
    -
    NEW * NEW * NEW * -NEW * ==== > QUERY PARAMETERS -(see section Queries below)
    -
    -Precompiled libpgtcl and libpq binaries for i386 are here -!!!

    - -
    - - - -
    -

    PgAccess can now design Forms, -Reports and Scripts  -

    -
    - -

    Installation problems

    +

    +PgAccess - a free database management tool for PostgreSQL

    + +
    +
  • +Download the last version of PgAccess (press +shift and click this link) (tar.gz file)  or   this +one (zip file for Windows)
  • + +
    +


    Latest stable version of PgAccess is 0.93 , released 10 December +1998 ! +

    NEW * NEW +*  +==> Microsoft Windows compatible version +

      NEW * ==== > PostgreSQL +user management, multiple table views,. Query parameters (see +section Queries below) +

    Precompiled libpgtcl and libpq binaries and dll's for i386 are here +!!!

    + +
      +

    +Installation problems

    -

    What does PgAccess now!

    - -

    Here are some screenshots from PgAccess windows : Main +

    +What does PgAccess now!

    +Here are some screenshots from PgAccess windows : Main window , table builder , table(query) -view , visual query builder .

    - -

    Tables
    -- opening tables for viewing, max. 200 records (changed by preferences -menu)
    -- column resizing, dragging the vertical grid line (better in table space -rather than in the table header)
    -- text wrap in cells - layout saved for every table
    -- import/export to external files (SDF,CSV)
    -- filter capabilities (enter filter like (price>3.14)
    -- sort order capabilities (enter manually the sort field(s))
    -- editing in place
    -- improved table generator assistant
    -- improved field editing
    -Queries
    -- define , edit and stores "user defined queries"
    -- store queries as views
    -- execution of queries with optional user input parameters ( select * from -invoices where year=[parameter "Year of selection"] )
    -- viewing of select type queries result
    -- query deleting and renaming
    -- visual query builder with drag & drop capabilities. For any of you -who had installed the Tcl/Tk plugin for Netscape Navigator, you can see -it at work clicking here
    -Sequences
    -- defines sequences, delete them and inspect them
    -Functions
    -- define, inspect and delete functions in SQL language
    -Reports
    -- design and display simple reports from tables
    -- fields and labels, font changing, style and size
    -- saves and loads report description from database
    -- show report previews, sample postscript output file
    -Forms
    -- open user defined forms
    -- form design module available
    -- query widget available, controls bound to query results
    -- click here for a description of forms and how -they can be used
    -Scripts
    -- define, modify and call user defined scripts
    -Here is a special section concerning forms and scripts -.

    - -

    On the TO-DO list!
    -- table design (add new fields, renaming, etc.)

    - +view , visual query builder . +

    Tables +
    - opening multiple tables for viewing, max. n records (changed by preferences +menu) +
    - column resizing, dragging the vertical grid line (better in table +space rather than in the table header) +
    - text wrap in cells - layout saved for every table +
    - import/export to external files (SDF,CSV) +
    - filter capabilities (enter filter like (price>3.14) +
    - sort order capabilities (enter manually the sort field(s)) +
    - editing in place +
    - improved table generator assistant +
    - improved field editing +
    Queries +
    - define , edit and stores "user defined queries" +
    - store queries as views +
    - execution of queries with optional user input parameters ( select +* from invoices where year=[parameter "Year of selection"] ) +
    - viewing of select type queries result +
    - query deleting and renaming +
    - visual query builder with drag & drop capabilities. For any of +you who had installed the Tcl/Tk plugin for Netscape Navigator, you can +see it at work clicking here +
    Sequences +
    - defines sequences, delete them and inspect them +
    Functions +
    - define, inspect and delete functions in SQL language +
    Reports +
    - design and display simple reports from tables +
    - fields and labels, font changing, style and size +
    - saves and loads report description from database +
    - show report previews, sample postscript output file +
    Forms +
    - open user defined forms +
    - form design module available +
    - query widget available, controls bound to query results +
    - click here for a description of forms and +how they can be used +
    Scripts +
    - define, modify and call user defined scripts +
    Users +
    - define and modify user parameters +

    Here is a special section concerning forms and +scripts .

    This program is protected by the following copyright -

    -

    If you have any comment, suggestion for improvements, please feel free -to e-mail to : teo@flex.ro 

    - +to e-mail to : teo@flex.ro

    Mailing list for PgAccess Here -you will find how to subscribe to this mailing list.

    - +you will find how to subscribe to this mailing list.

    -


    - -

    More information about libpgtcl - downloads

    - -

         Also, you will need the PostgreSQL to Tcl interface +


    +

    +More information about libpgtcl - downloads

    +     Also, you will need the PostgreSQL to Tcl interface library, lined as a Tcl/Tk 'load'-able module. It is called libpgtcl and the source is located in the PostgreSQL directory /src/interfaces/libpgtcl. Specifically, you will need a libpgtcl library that is 'load'-able from Tcl/Tk.      This is technically different from an ordinary PostgreSQL loadable object file, because libpgtcl is a collection -of object files. Under Linux, this is called libpgtcl.so.
    -     You can download from -here  libpgtcl.so and libpq.so compiled for PostgreSQL 6.3 -version running on a Linux RedHat 4.2 i386 systems. Just copy libpgtcl.so -and libpq.so into your system library directory (/usr/lib or /lib) and -go for it.

    - +of object files. Under Linux, this is called libpgtcl.so.

         One of the solutions is to remove from the source the line containing load libpgtcl.so and to load pgaccess.tcl not with wish, but with pgwish (or wishpg) that wish that was linked with -libpgtcl library! I do not recommend this one.

    - -

         If you have installed RedHat 5.0, you should +libpgtcl library! I do not recommend this one. +

         If you have installed RedHat 5.x, you should get the last distribution kit of PostgreSQL and compile it from scratch. -RedHat 5.0 is using some new versions of libraries and you have to compile +RedHat 5.x is using some new versions of libraries and you have to compile and install again at least libpq and libpgtcl libraries. -

    - -

    However, the application should work without problems!

    - +

        PostgreSQL 6.4 release has a minor bug. I does not +includ by default the crypt lib when compiling libpgtcl. So, you will need +to manually add a -lcrypt to SHLIB line in Makefile in src/interfaces/libpgtcl +and then make clean and make again. The new libpgtcl.so library is properly +configured to run pgaccess. +
      diff --git a/src/bin/pgaccess/libpgtcl.dll b/src/bin/pgaccess/libpgtcl.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e631d501708bff7406352c1968c61948ab771d6 GIT binary patch literal 48128 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 literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/pgaccess.tcl b/src/bin/pgaccess/pgaccess.tcl index 78079b39e3..c8d73aaabf 100644 --- a/src/bin/pgaccess/pgaccess.tcl +++ b/src/bin/pgaccess/pgaccess.tcl @@ -1,46 +1,74 @@ #!/usr/bin/wish -############################################################################# -# Visual Tcl v1.11 Project -# -################################# -# GLOBAL VARIABLES -# -global activetab; -global dbc; -global username; -global password; -global dbname; -global host; -global mw; -global newdbname; -global newhost; -global newpport; -global newusername; -global newpassword; -global pport; -global pref; -global qlvar; -global sdbname; -global tablist; global widget; -################################# -# USER DEFINED PROCEDURES -# -proc init {argc argv} { -global dbc host pport tablist mw fldval activetab qlvar +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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + 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] +set tablist [list Tables Queries Views Sequences Functions Reports Forms Scripts Users] set activetab {} -set mw(dirtyrec) 0 -set mw(id_edited) {} -catch {unset qlvar} set qlvar(yoffs) 360 set qlvar(xoffs) 50 set qlvar(reswidth) 150 @@ -52,6 +80,7 @@ set qlvar(critedit) 0 set qlvar(links) {} set qlvar(ntables) 0 set qlvar(newtablename) {} +set mwcount 0 } init $argc $argv @@ -68,6 +97,9 @@ proc {sqlw_display} {msg} { 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 @@ -86,6 +118,27 @@ proc {wpg_select} {args} { 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)==""} { @@ -110,7 +163,7 @@ 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 -message "There is another field with the same name: \"$ntw(fldname)\"!\n\nReplace it ?" -type yesno -default yes]=="no"} return + 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 @@ -167,62 +220,68 @@ if {$objtodelete==""} return; set temp {} switch $activetab { Tables { - if {[tk_messageBox -title "FINAL WARNING" -message "You are going to delete table:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { + 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" -message "You are going to delete view:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { - sql_exec noquiet "drop view $objtodelete" + 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" -message "You are going to delete query:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { + 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" -message "You are going to delete script:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { + 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" -message "You are going to delete form:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { + 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" -message "You are going to delete sequence:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { - sql_exec quiet "drop sequence $objtodelete" + 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" -message "You are going to delete function:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { + 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" -message "You are going to delete report:\n\n$objtodelete\n\nProceed ?" -type yesno -default no]=="yes"} { + 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 tablename rbvar +global dbc activetab rbvar uw if {$dbc==""} return; if {[.dw.lb curselection]==""} return; set objname [.dw.lb get [.dw.lb curselection]] @@ -232,12 +291,40 @@ switch $activetab { 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 + 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 } } } @@ -299,19 +386,30 @@ show_table_information [get_dwlb_Selection] } proc {cmd_New} {} { -global dbc activetab queryname queryoid cbv funcpar funcname funcret rbvar +global dbc activetab queryname queryoid cbv funcpar funcname funcret rbvar uw if {$dbc==""} return; switch $activetab { Tables { - Window show .nt - focus .nt.etabn + Window show .nt + focus .nt.etabn } Queries { - Window show .qb - set queryoid 0 - set queryname {} - set cbv 0 - .qb.cbv configure -state normal + 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 @@ -336,7 +434,7 @@ switch $activetab { fd_init } Scripts { - design_script {} + design_script {} } Functions { Window show .fw @@ -377,21 +475,52 @@ proc {cmd_Queries} {} { global dbc .dw.lb delete 0 end catch { - wpg_select $dbc "select * from pga_queries order by queryname" rec { + 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 -message "Please select an object first !" + tk_messageBox -title Warning -parent .dw -message "Please select an object first !" return; } set oldobjname $temp @@ -402,19 +531,31 @@ proc {cmd_Reports} {} { global dbc cursor_clock catch { - wpg_select $dbc "select * from pga_reports order by reportname" rec { + 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 * from pga_scripts order by scriptname" rec { + wpg_select $dbc "select scriptname from pga_scripts order by scriptname" rec { .dw.lb insert end $rec(scriptname) } } @@ -427,7 +568,7 @@ global dbc cursor_clock .dw.lb delete 0 end catch { - wpg_select $dbc "select * from pg_class where (relname not like 'pg_%') and (relkind='S') order by relname" rec { + 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) } } @@ -448,7 +589,7 @@ global dbc cursor_clock .dw.lb delete 0 end catch { - wpg_select $dbc "select * from pg_class where (relname !~ '^pg_') and (relkind='r') and (relhasrules) order by relname" rec { + wpg_select $dbc "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') and (relhasrules) order by relname" rec { .dw.lb insert end $rec(relname) } } @@ -456,11 +597,12 @@ 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 -borderwidth 1 -font -*-Clean-medium-R-Normal--*-130-*-*-*-*-*-* -highlightthickness 0 -selectborderwidth 0 -yscrollcommand [subst {$base.ddf.sb set}] +listbox $base.ddf.lb -background #fefefe -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 @@ -469,7 +611,7 @@ place $base.ddf.sb -x [expr $w-15] -y 1 -width 14 -height 183 -anchor nw -border proc {cursor_normal} {} { foreach wn [winfo children .] { - catch {$wn configure -cursor top_left_arrow} + catch {$wn configure -cursor left_ptr} } update ; update idletasks } @@ -483,7 +625,7 @@ proc {cursor_clock} {} { proc {delete_function} {objname} { global dbc -wpg_select $dbc "select * from pg_proc where proname='$objname'" rec { +wpg_select $dbc "select proargtypes,pronargs from pg_proc where proname='$objname'" rec { set funcpar $rec(proargtypes) set nrpar $rec(pronargs) } @@ -519,46 +661,46 @@ global draglocation } } -proc {drag_start} {w x y} { +proc {drag_start} {wn w x y} { global draglocation catch {unset draglocation} set object [$w find closest $x $y] -if {[lsearch [.mw.c gettags $object] movable]==-1} return; -.mw.c bind movable {} +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} {w x y} { +proc {drag_stop} {wn w x y} { 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) v] + $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(colcount)} {incr i} { + for {set i 0} {$i<$mw($wn,colcount)} {incr i} { if {$i==$ctr} { - lappend newcw [expr [lindex $mw(colwidth) $i]+$diff] + lappend newcw [expr [lindex $mw($wn,colwidth) $i]+$diff] } else { - lappend newcw [lindex $mw(colwidth) $i] + lappend newcw [lindex $mw($wn,colwidth) $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 + 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(colwidth)' where tablename='$mw(layout_name)'" + sql_exec quiet "update pga_layout set colwidth='$mw($wn,colwidth)' where tablename='$mw($wn,layout_name)'" cursor_normal } } @@ -567,7 +709,7 @@ proc {draw_tabs} {} { global tablist activetab set ypos 85 foreach tab $tablist { - label .dw.tab$tab -borderwidth 1 -anchor w -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text $tab + 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} @@ -622,32 +764,32 @@ fd_draw_hook $x2 $y2 } proc {fd_draw_object} {i} { -global fdvar fdobj +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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags 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 } entry { fd_draw_rectangle $x1 $y1 $x2 $y2 sunken white o$i } label { - .fd.c create text $x1 $y1 -text $fdobj($i,l) -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -anchor nw -tags o$i + .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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -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 -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* -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 @@ -889,7 +1031,7 @@ catch {set fdvar(c_text) $fdobj($i,l)} } proc {fd_test} {} { -global fdvar fdobj dbc datasets +global fdvar fdobj dbc datasets pref set basewp $fdvar(forminame) set base .$fdvar(forminame) if {[winfo exists $base]} { @@ -913,10 +1055,10 @@ switch $fdobj($item,t) { button { set cmd {} catch {set cmd $fdobj($item,x)} - button $base.$name -borderwidth 1 -padx 0 -pady 0 -text "$fdobj($item,l)" -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -command [subst {$cmd}] + button $base.$name -borderwidth 1 -padx 0 -pady 0 -text "$fdobj($item,l)" -font $pref(font_normal) -command [subst {$cmd}] } checkbox { - checkbutton $base.$name -onvalue t -offvalue f -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -borderwidth 1 + checkbutton $base.$name -onvalue t -offvalue f -font $pref(font_normal) -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -borderwidth 1 set wh {} } query { @@ -991,7 +1133,7 @@ switch $fdobj($item,t) { }" } radio { - radiobutton $base.$name -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -value "$name" -borderwidth 1 + radiobutton $base.$name -font $pref(font_normal) -text "$fdobj($item,l)" -variable "$fdobj($item,v)" -value "$name" -borderwidth 1 set wh {} } entry { @@ -1001,12 +1143,12 @@ switch $fdobj($item,t) { } label { set wh {} - label $base.$name -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -anchor nw -padx 0 -pady 0 -text $fdobj($item,l) + label $base.$name -font $pref(font_normal) -anchor nw -padx 0 -pady 0 -text $fdobj($item,l) set var {} ; catch {set var $fdobj($item,v)} if {$var!=""} {$base.$name configure -textvar $var} } listbox { - listbox $base.$name -borderwidth 1 -background white -highlightthickness 0 -selectborderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -yscrollcommand [subst {$base.sb$name set}] + listbox $base.$name -borderwidth 1 -background white -highlightthickness 0 -selectborderwidth 0 -font $pref(font_normal) -yscrollcommand [subst {$base.sb$name set}] scrollbar $base.sb$name -borderwidth 1 -command [subst {$base.$name yview}] -orient vert -highlightthickness 0 eval [subst "place $base.sb$name -x [expr [lindex $coord 2]-14] -y [expr [lindex $coord 1]-1] -width 16 -height [expr 3+[lindex $coord 3]-[lindex $coord 1]] -anchor nw -bordermode ignore"] } @@ -1036,248 +1178,224 @@ proc {get_tables} {} { global dbc set tbl {} catch { - wpg_select $dbc "select * from pg_class where (relname !~ '^pg_') and (relkind='r') and (not relhasrules) order by relname" rec { + wpg_select $dbc "select * from pg_class where (relname !~ '^pg_') and (relkind='r') order by relname" rec { if {![regexp "^pga_" $rec(relname)]} then {lappend tbl $rec(relname)} } } return $tbl } -proc {get_tag_info} {itemid prefix} { -set taglist [.mw.c itemcget $itemid -tags] +proc {get_tag_info} {wn itemid prefix} { +set taglist [$wn.c itemcget $itemid -tags] set i [lsearch -glob $taglist $prefix*] set thetag [lindex $taglist $i] return [string range $thetag 1 end] } -proc {load_pref} {} { -global 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 -} -} - - - - -proc {mw_canvas_click} {x y} { -global mw msg -if {![mw_exit_edit]} return +proc {mw_canvas_click} {wn x y} { +global mw +if {![mw_exit_edit $wn]} return # Determining row -for {set row 0} {$row<$mw(nrecs)} {incr row} { - if {[lindex $mw(rowy) $row]>$y} break +for {set row 0} {$row<$mw($wn,nrecs)} {incr row} { + if {[lindex $mw($wn,rowy) $row]>$y} break } incr row -1 -if {$y>[lindex $mw(rowy) $mw(last_rownum)]} {set row $mw(last_rownum)} +if {$y>[lindex $mw($wn,rowy) $mw($wn,last_rownum)]} {set row $mw($wn,last_rownum)} if {$row<0} return -set mw(row_edited) $row -set mw(crtrow) $row -mw_show_record $row -if {$mw(errorsavingnew)} 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(leftoffset)] +set posx [expr -$mw($wn,leftoffset)] set col 0 -foreach cw $mw(colwidth) { +foreach cw $mw($wn,colwidth) { incr posx [expr $cw+2] if {$x<$posx} break incr col } -set itlist [.mw.c find withtag r$row] +set itlist [$wn.c find withtag r$row] foreach item $itlist { - if {[get_tag_info $item c]==$col} { - mw_start_edit $item $x $y + if {[get_tag_info $wn $item c]==$col} { + mw_start_edit $wn $item $x $y break } } } -proc {mw_delete_record} {} { -global dbc mw tablename -if {!$mw(updatable)} return; -if {![mw_exit_edit]} return; -set taglist [.mw.c gettags hili] +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(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 -} -} - -proc {mw_draw_headers} {} { -global mw -.mw.c delete header -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 v$i}] +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(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} -.mw.c bind movable {.mw configure -cursor left_side} -.mw.c bind movable {.mw configure -cursor top_left_arrow} +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} {} { +proc {mw_draw_hgrid} {wn} { global mw -.mw.c delete hgrid +$wn.c delete hgrid set posx 10 -for {set j 0} {$j<$mw(colcount)} {incr j} { +for {set j 0} {$j<$mw($wn,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 [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(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}] +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(updatable)} { - set i $mw(nrecs) - set posy [expr 14+[lindex $mw(rowy) $mw(nrecs)]] - .mw.c create line [expr -$mw(leftoffset)] $posy [expr $posx-$mw(leftoffset)] $posy -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} {} { -global mw pref msg -set posx 10 -set posy [lindex $mw(rowy) $mw(last_rownum)] +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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + set tvfont $pref(font_normal) } else { - set tvfont -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-* + set tvfont $pref(font_fix) } -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] +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 - .mw.c create line [expr -$mw(leftoffset)] $posy [expr $mw(r_edge)-$mw(leftoffset)] $posy -fill gray -tags [subst {hgrid g$mw(nrecs)}] + $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} {c k} { -global mw msg -set bbin [.mw.c bbox r$mw(row_edited)] +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 [.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]} + 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 {.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}} + 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 [.mw.c bbox r$mw(row_edited)] +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(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] +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(rowy) [lreplace $mw(rowy) $i $i $rh] + set mw($wn,rowy) [lreplace $mw($wn,rowy) $i $i $rh] } -mw_show_record $mw(row_edited) +mw_show_record $wn $mw($wn,row_edited) # Delete is trapped by window interpreted as record delete -# Delete {.mw.c dchars $mw(id_edited) insert insert; set mw(dirtyrec) 1} +# Delete {$wn.c dchars $mw($wn,id_edited) insert insert; set mw($wn,dirtyrec) 1} } -proc {mw_exit_edit} {} { -global mw dbc msg tablename +proc {mw_exit_edit} {wn} { +global mw dbc # User has edited the text ? -if {!$mw(dirtyrec)} { +if {!$mw($wn,dirtyrec)} { # No, unfocus text - .mw.c focus {} + $wn.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) + 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(id_edited) {};set mw(text_initial_value) {} + set mw($wn,id_edited) {};set mw($wn,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) {} +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(keylist) $mw(row_edited)] -set fld [lindex $mw(colnames) [get_tag_info $mw(id_edited) c]] +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(row_edited)==$mw(last_rownum)} { +if {$mw($wn,row_edited)==$mw($wn,last_rownum)} { set fillcolor red - set sfp [lsearch $mw(newrec_fields) "\"$fld\""] + set sfp [lsearch $mw($wn,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] + 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(newrec_fields) "\"$fld\"" - lappend mw(newrec_values) '$fldval' + lappend mw($wn,newrec_fields) "\"$fld\"" + lappend mw($wn,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 + $wn.c dtag $mw($wn,id_edited) unt + $wn.c itemconfigure $mw($wn,id_edited) -fill red set retval 1 } else { - set msg "Updating record ..." - after 1000 {set msg ""} + set mw($wn,msg) "Updating record ..." + after 1000 "set mw($wn,msg) {}" regsub -all ' $fldval \\' sqlfldval - set retval [sql_exec noquiet "update \"$tablename\" set \"$fld\"='$sqlfldval' where oid=$oid"] + set retval [sql_exec noquiet "update \"$mw($wn,tablename)\" set \"$fld\"='$sqlfldval' where oid=$oid"] } cursor_normal if {!$retval} { - set msg "" - focus .mw.c + set mw($wn,msg) "" + focus $wn.c return 0 } -set mw(dirtyrec) 0 -.mw.c focus {} -set mw(id_edited) {};set mw(text_initial_value) {} +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} {tablename} { -global dbc msg mw +proc {mw_load_layout} {wn layoutname} { +global dbc mw cursor_clock -set mw(layout_name) $tablename -catch {unset mw(colcount) mw(colnames) mw(colwidth)} -set mw(layout_found) 0 -set pgres [wpg_exec $dbc "select *,oid from pga_layout where tablename='$tablename' order by oid desc"] +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 @@ -1287,119 +1405,120 @@ if {$pgs!="PGRES_TUPLES_OK"} { set nrlay [pg_result $pgres -numTuples] if {$nrlay>=1} { set layoutinfo [pg_result $pgres -getTuple 0] - set mw(colcount) [lindex $layoutinfo 1] - set mw(colnames) [lindex $layoutinfo 2] - set mw(colwidth) [lindex $layoutinfo 3] + 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(layout_found) 1 + 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='$tablename') and (oid<>$goodoid)" + sql_exec quiet "delete from pga_layout where (tablename='$mw($wn,tablename)') and (oid<>$goodoid)" } } pg_result $pgres -clear } -proc {mw_pan_left} {} { +proc {mw_pan_left} {wn } { 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 q -$diff 0 -.mw.c move hgrid -$diff 0 +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} {} { +proc {mw_pan_right} {wn} { 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 q $diff 0 -.mw.c move hgrid $diff 0 -} - -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 pgres [wpg_exec $dbc "insert into \"$tablename\" ([join $mw(newrec_fields) ,]) values ([join $mw(newrec_values) ,])" ] +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(keylist) $oid +lappend mw($wn,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 dtag q new +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 [.mw.c find withtag unt] { - .mw.c itemconfigure $item -text " " -} -.mw.c dtag q unt -incr mw(last_rownum) -incr mw(nrecs) -mw_draw_new_record -set mw(newrec_fields) {} -set mw(newrec_values) {} +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} {par1 par2 args} { +proc {mw_scroll_window} {wn par1 args} { global mw -if {![mw_exit_edit]} return; +if {![mw_exit_edit $wn]} return; if {$par1=="scroll"} { - set newtop $mw(toprec) - if {[lindex $args 0]=="units"} { - incr newtop $par2 + set newtop $mw($wn,toprec) + if {[lindex $args 1]=="units"} { + incr newtop [lindex $args 0] } else { - incr newtop [expr $par2*25] + incr newtop [expr [lindex $args 0]*25] if {$newtop<0} {set newtop 0} - if {$newtop>=[expr $mw(nrecs)-1]} {set newtop [expr $mw(nrecs)-1]} + 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 { - set newtop [expr int($par2*$mw(nrecs))] + return } if {$newtop<0} return; -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 +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(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 pgsql -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 -.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 ..." +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"]} { @@ -1412,145 +1531,167 @@ if {[sql_exec noquiet "BEGIN"]} { } if {$is_error} { sql_exec quiet "END" - set msg {} + set mw($wn,msg) {} + $wn.f1.b1 configure -state normal cursor_normal - set msg "Error executing : $sql" + set mw($wn,msg) "Error executing : $sql" return } -if {$mw(updatable)} then {set shift 1} else {set shift 0} +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(layout_found)} then { - if { ($mw(colcount) != [expr [llength $attrlist]-$shift]) || - ($mw(colcount) != [llength $mw(colnames)]) || - ($mw(colcount) != [llength $mw(colwidth)]) } then { +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(layout_found) 0 - sql_exec quiet "delete from pga_layout where tablename='$mw(layout_name)'" + 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(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(layout_found) 1 -} -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 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + set tvfont $pref(font_normal) } else { - set tvfont -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-* + set tvfont $pref(font_fix) } # Computing column's left edge set posx 10 -for {set j 0} {$j<$mw(colcount)} {incr j} { +for {set j 0} {$j<$mw($wn,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 [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 -set mw(updatekey) oid -set mw(keylist) {} -set mw(rowy) {24} -set msg "Loading maximum $pref(rows) records ..." -for {set i 0} {$i<$mw(nrecs)} {incr i} { +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 {$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) -fill black - } - 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 {$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 msg {} } -set mw(last_rownum) $i +after 3000 "set mw($wn,msg) {}" +set mw($wn,last_rownum) $i # Defining position for input data -mw_draw_new_record +mw_draw_new_record $wn pg_result $pgres -clear sql_exec quiet "END" -set mw(toprec) 0 -mw_set_scrollbar -if {$mw(updatable)} then { - .mw.c bind q {mw_edit_text %A %K} +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 { - .mw.c bind q {} + $wn.c bind q {} } -set mw(dirtyrec) 0 -#mw_draw_headers -.mw.c raise header +set mw($wn,dirtyrec) 0 +$wn.c raise header +$wn.f1.b1 configure -state normal cursor_normal } -proc {mw_set_scrollbar} {} { +proc {mw_set_scrollbar} {wn} { global mw -if {$mw(nrecs)==0} return; -.mw.sb set [expr $mw(toprec)*1.0/$mw(nrecs)] [expr ($mw(toprec)+27.0)/$mw(nrecs)] +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} {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 +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(rowy) $row] -set y2 [lindex $mw(rowy) [expr $row+1]] +set y1 [lindex $mw($wn,rowy) $row] +set y2 [lindex $mw($wn,rowy) [expr $row+1]] if {$y2==""} {set y2 [expr $y1+14]} -.mw.c dtag hili hili -.mw.c addtag hili withtag r$row +$wn.c dtag hili hili +$wn.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 +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} {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 {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 +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] @@ -1559,7 +1700,8 @@ if {$newusername!=""} { } if {$connres} { cursor_normal - show_error "Error connecting database\n$msg" + 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 @@ -1578,18 +1720,23 @@ if {$connres} { 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 {[pg_result $pgres -numTuples]==0} { + 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" + sql_exec quiet "grant ALL on $table to PUBLIC" } - catch { pg_result $pgres -clear } + catch {pg_result $pgres -clear} } # searching for autoexec script wpg_select $dbc "select * from pga_scripts where scriptname ~* '^autoexec$'" recd { eval $recd(scriptsource) - } + } + return "" } } @@ -1633,7 +1780,7 @@ rb_preview } proc {open_query} {how} { -global dbc queryname mw queryoid sortfield filter +global dbc queryname mw queryoid if {[.dw.lb curselection]==""} return; set queryname [.dw.lb get [.dw.lb curselection]] @@ -1657,13 +1804,14 @@ if {$how=="design"} { .qb.text1 insert end $qcmd } else { if {$qtype=="S"} then { - set mw(query) [subst $qcmd] - set mw(updatable) 0 - set mw(isaquery) 1 - Window show .mw - wm title .mw "Query result: $queryname" - mw_load_layout $queryname - mw_select_records $mw(query) + 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} { @@ -1675,11 +1823,29 @@ if {$how=="design"} { } } +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 { +wpg_select $dbc "select * from \"$objname\"" rec { set flag 0 set seq_name $objname set seq_inc $rec(increment_by) @@ -1701,29 +1867,57 @@ if {$flag} { } proc {open_table} {objname} { -global mw sortfield filter tablename +global mw sortfield filter set sortfield {} set filter {} -Window show .mw -set tablename $objname -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" +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; -Window show .mw -set mw(query) "select * from $vn" -set mw(isaquery) 0 -set mw(updatable) 0 -mw_load_layout $vn -mw_select_records $mw(query) +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} { @@ -1824,7 +2018,7 @@ 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 + 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 @@ -1835,7 +2029,7 @@ if {[ql_get_tag_info $obj link]=="s"} { 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 + 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(restables) [lreplace $qlvar(restables) $col $col] set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $col $col] @@ -1846,7 +2040,7 @@ if {[ql_get_tag_info $obj res]=="f"} { set tablealias [ql_get_tag_info $obj tab] set tablename $qlvar(ali_$tablealias) if {"$tablename"==""} return -if {[tk_messageBox -title WARNING -icon question -message "Remove table $tablename from query ?" -type yesno -default no]=="no"} 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] @@ -1926,7 +2120,7 @@ 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 top_left_arrow +.ql configure -cursor left_ptr set este {} catch {set este $draginfo(obj)} if {$este==""} return @@ -2026,7 +2220,7 @@ foreach link $qlvar(links) { } proc {ql_draw_lizzard} {} { -global qlvar +global qlvar pref .ql.c delete all set posx 20 for {set it 0} {$it<$qlvar(ntables)} {incr it} { @@ -2044,10 +2238,10 @@ for {set i $qlvar(xoffs)} {$i<10000} {incr i $qlvar(reswidth)} { # 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} -.ql.c create text 5 [expr 16+$qlvar(yoffs)] -text Table: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} -.ql.c create text 5 [expr 31+$qlvar(yoffs)] -text Sort: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} -.ql.c create text 5 [expr 46+$qlvar(yoffs)] -text Criteria: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -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 bind mov {ql_dragstart %W %x %y} .ql.c bind mov {ql_dragit %W %x %y} bind .ql {ql_dragstop %x %y} @@ -2057,16 +2251,16 @@ bind .ql {ql_delete_object} } proc {ql_draw_res_panel} {} { -global qlvar +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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* - .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 -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-*-*-*-*-* + .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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags [subst {resp cr-c$i-r0}] + .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 raise reshdr @@ -2075,17 +2269,17 @@ for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} { } proc {ql_draw_table} {it} { -global qlvar +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 -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* +.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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + .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] @@ -2162,12 +2356,12 @@ if {[ql_get_tag_info $obj res]!="f"} return } proc {ql_show_sql} {} { -global qlvar +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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +.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} } @@ -2190,7 +2384,7 @@ set qlvar(ressort) [lreplace $qlvar(ressort) $col $col $cum] } proc {qlc_click} {x y w} { -global qlvar +global qlvar pref set qlvar(panstarted) 0 if {$w==".ql.c"} { set canpan 1 @@ -2214,7 +2408,7 @@ 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags [subst {resp 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} @@ -2226,7 +2420,7 @@ 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +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} @@ -2236,18 +2430,18 @@ set qlvar(critedit) 1 } proc {rb_add_field} {} { -global rbvar +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 -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*] -.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 -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* +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 +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 -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-*] +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]] } @@ -2258,7 +2452,7 @@ global rbvar } proc {rb_delete_object} {} { -if {[tk_messageBox -title Warning -message "Delete current report object?" -type yesno -default no]=="no"} return; +if {[tk_messageBox -title Warning -parent .rb -message "Delete current report object?" -type yesno -default no]=="no"} return; .rb.c delete hili } @@ -2331,7 +2525,7 @@ 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 top_left_arrow +.rb configure -cursor left_ptr set este {} catch {set este $draginfo(obj)} if {$este==""} return @@ -2478,7 +2672,7 @@ wpg_select $dbc "select * from \"$rbvar(tablename)\"" rec { 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 -message "The printed image in Postscript is in the file pgaccess-report.ps" +tk_messageBox -title Information -parent .rb -message "The printed image in Postscript is in the file pgaccess-report.ps" } proc {rb_save_report} {} { @@ -2502,13 +2696,13 @@ proc {save_pref} {} { global pref catch { set fid [open "~/.pgaccessrc" w] - foreach {opt val} [array get pref] { puts $fid "$opt $val" } + foreach {opt val} [array get pref] { puts $fid "$opt {$val}" } close $fid } } proc {show_error} {emsg} { - tk_messageBox -title Error -icon error -message $emsg + bell ; tk_messageBox -title Error -icon error -message $emsg } proc {show_table_information} {tblname} { @@ -2563,21 +2757,21 @@ return 0 } proc {tab_click} {w} { -global dbc tablist activetab +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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + .dw.tab$activetab configure -font $pref(font_normal) } -$w configure -font -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* +$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 Reports Forms} $activetab]!=-1} { +if {[lsearch {Scripts Queries Reports Forms Users} $activetab]!=-1} { .dw.btndesign configure -state normal } .dw.lb delete 0 end @@ -2626,10 +2820,13 @@ set sdbname $dbname } proc {main} {argc argv} { -global pref newdbname newpport newhost newusername newpassword dbc -load libpgtcl.so +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} -load_pref set newusername {} set newpassword {} if {$argc>0} { @@ -2642,7 +2839,14 @@ if {$argc>0} { set newhost $pref(lasthost) set newpport $pref(lastport) catch {set newusername $pref(lastusername)} - open_database + 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} @@ -2679,17 +2883,10 @@ global vTcl } } -################################# -# VTCL GENERATED GUI PROCEDURES -# - proc vTclWindow. {base} { if {$base == ""} { set base . } - ################### - # CREATING WIDGETS - ################### wm focusmodel $base passive wm geometry $base 1x1+0+0 wm maxsize $base 1009 738 @@ -2698,9 +2895,6 @@ proc vTclWindow. {base} { wm resizable $base 1 1 wm withdraw $base wm title $base "vt.tcl" - ################### - # SETTING GEOMETRY - ################### } proc vTclWindow.about {base} { @@ -2710,9 +2904,6 @@ proc vTclWindow.about {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 471x177+168+243 @@ -2722,18 +2913,15 @@ proc vTclWindow.about {base} { 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.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.91} - 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 {v 0.93} + 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} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Ok - ################### - # SETTING GEOMETRY - ################### + 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 @@ -2748,11 +2936,8 @@ proc vTclWindow.dbod {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel \ - -cursor top_left_arrow + -cursor left_ptr wm focusmodel $base passive wm geometry $base 282x180+358+333 wm maxsize $base 1009 738 @@ -2762,7 +2947,7 @@ proc vTclWindow.dbod {base} { wm deiconify $base wm title $base "Open database" label $base.lhost \ - -borderwidth 0 -relief raised -text Host + -borderwidth 0 -text Host entry $base.ehost \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newhost @@ -2770,7 +2955,7 @@ proc vTclWindow.dbod {base} { focus .dbod.epport } label $base.lport \ - -borderwidth 0 -relief raised -text Port + -borderwidth 0 -text Port entry $base.epport \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newpport @@ -2778,7 +2963,7 @@ proc vTclWindow.dbod {base} { focus .dbod.edbname } label $base.ldbname \ - -borderwidth 0 -relief raised -text Database + -borderwidth 0 -text Database entry $base.edbname \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newdbname @@ -2787,7 +2972,7 @@ proc vTclWindow.dbod {base} { .dbod.eusername selection range 0 end } label $base.lusername \ - -borderwidth 0 -relief raised -text Username + -borderwidth 0 -text Username entry $base.eusername \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newusername @@ -2795,7 +2980,7 @@ proc vTclWindow.dbod {base} { focus .dbod.epassword } label $base.lpassword \ - -borderwidth 0 -relief raised -text Password + -borderwidth 0 -text Password entry $base.epassword \ -background #fefefe -borderwidth 1 -highlightthickness 1 \ -selectborderwidth 0 -textvariable newpassword -show "*" @@ -2803,16 +2988,12 @@ proc vTclWindow.dbod {base} { focus .dbod.opbtu } button $base.opbtu \ - -borderwidth 1 -command open_database -padx 9 -pady 3 -text Open + -borderwidth 1 -command open_database -text Open bind $base.opbtu { open_database } button $base.canbut \ - -borderwidth 1 -command {Window hide .dbod} -padx 9 -pady 3 \ - -text Cancel - ################### - # SETTING GEOMETRY - ################### + -borderwidth 1 -command {Window hide .dbod} -text Cancel place $base.lhost \ -x 35 -y 7 -anchor nw -bordermode ignore place $base.ehost \ @@ -2840,17 +3021,15 @@ proc vTclWindow.dbod {base} { } proc vTclWindow.dw {base} { +global pref if {$base == ""} { set base .dw } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel \ - -background #efefef -cursor top_left_arrow + -background #efefef -cursor left_ptr wm focusmodel $base passive wm geometry $base 322x355+96+172 wm maxsize $base 1009 738 @@ -2860,43 +3039,32 @@ 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 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -foreground black -highlightthickness 0 -selectborderwidth 0 \ -yscrollcommand {.dw.sb set} bind $base.lb { cmd_Open } button $base.btnnew \ - -borderwidth 1 -command cmd_New \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text New + -borderwidth 1 -command cmd_New -text New button $base.btnopen \ - -borderwidth 1 -command cmd_Open \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Open + -borderwidth 1 -command cmd_Open -text Open button $base.btndesign \ - -borderwidth 1 -command cmd_Design \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Design + -borderwidth 1 -command cmd_Design -text Design label $base.lmask \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text { } + -text { } label $base.label22 \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised menubutton $base.menubutton23 \ - -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ + -borderwidth 1 -font $pref(font_normal) \ -menu .dw.menubutton23.01 -padx 4 -pady 3 -text Database menu $base.menubutton23.01 \ - -borderwidth 1 -cursor {} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -tearoff 0 + -borderwidth 1 -font $pref(font_normal) \ + -tearoff 0 $base.menubutton23.01 add command \ \ -command { @@ -2905,7 +3073,7 @@ set newhost $host set newpport $pport focus .dbod.edbname .dbod.edbname selection range 0 end} \ - -label Open + -label Open -font $pref(font_normal) $base.menubutton23.01 add command \ \ -command {.dw.lb delete 0 end @@ -2931,22 +3099,20 @@ 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-*-*-*-*-* \ + -anchor w \ -relief groove -textvariable sdbname scrollbar $base.sb \ -borderwidth 1 -command {.dw.lb yview} -orient vert menubutton $base.mnob \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -menu .dw.mnob.m -padx 4 -pady 3 -text Object + -menu .dw.mnob.m -font $pref(font_normal) -text Object menu $base.mnob.m \ - -borderwidth 1 -cursor {} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -tearoff 0 + -borderwidth 1 -font $pref(font_normal) \ + -tearoff 0 $base.mnob.m add command \ - -command cmd_New -label New + -command cmd_New -font $pref(font_normal) -label New $base.mnob.m add command \ -command {cmd_Delete } -label Delete $base.mnob.m add command \ @@ -2955,11 +3121,10 @@ exit} -label Exit -command cmd_Information -label Information menubutton $base.mhelp \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -menu .dw.mhelp.m -padx 4 -pady 3 -text Help + -menu .dw.mhelp.m -font $pref(font_normal) -text Help menu $base.mhelp.m \ - -borderwidth 1 -cursor {} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -tearoff 0 + -borderwidth 1 -font $pref(font_normal) \ + -tearoff 0 $base.mhelp.m add command \ -label Contents $base.mhelp.m add command \ @@ -2967,13 +3132,10 @@ exit} -label Exit $base.mhelp.m add separator $base.mhelp.m add command \ -command {Window show .about} -label About - ################### - # SETTING GEOMETRY - ################### 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 248 -anchor nw -bordermode ignore + -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 \ @@ -2991,7 +3153,7 @@ exit} -label Exit place $base.lsdbname \ -x 95 -y 335 -width 223 -height 20 -anchor nw -bordermode ignore place $base.sb \ - -x 295 -y 73 -width 18 -height 252 -anchor nw -bordermode ignore + -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 \ @@ -3005,9 +3167,6 @@ proc vTclWindow.fw {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 306x288+233+130 @@ -3016,11 +3175,11 @@ proc vTclWindow.fw {base} { wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Function" - label $base.l1 -borderwidth 0 -relief raised -text Name + 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 -relief raised -text Parameters + 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 -relief raised -text Returns + 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 { @@ -3038,11 +3197,8 @@ proc vTclWindow.fw {base} { } } - } -padx 9 -pady 3 -state disabled -text Define - button $base.cancelbtn -borderwidth 1 -command {Window destroy .fw} -padx 9 -pady 3 -text Close - ################### - # SETTING GEOMETRY - ################### + } -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 @@ -3061,9 +3217,6 @@ proc vTclWindow.iew {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 287x151+259+304 @@ -3072,11 +3225,11 @@ proc vTclWindow.iew {base} { wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Import-Export table" - label $base.l1 -borderwidth 0 -relief raised -text {Table name} + label $base.l1 -borderwidth 0 -text {Table name} entry $base.e1 -background #fefefe -borderwidth 1 -textvariable ie_tablename - label $base.l2 -borderwidth 0 -relief raised -text {File name} + label $base.l2 -borderwidth 0 -text {File name} entry $base.e2 -background #fefefe -borderwidth 1 -textvariable ie_filename - label $base.l3 -borderwidth 0 -relief raised -text {Field delimiter} + 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!" @@ -3101,132 +3254,101 @@ proc vTclWindow.iew {base} { set sqlcmd "COPY $ie_tablename $sup2 $oper '$ie_filename'$sup" cursor_clock if {[sql_exec noquiet $sqlcmd]} { - tk_messageBox -title Information -message "Operation completed!" + tk_messageBox -title Information -parent .iew -message "Operation completed!" Window destroy .iew } cursor_normal -}} -padx 9 -pady 3 -text Export - button $base.cancelbtn -borderwidth 1 -command {Window destroy .iew} -padx 9 -pady 3 -text Cancel +}} -text Export + button $base.cancelbtn -borderwidth 1 -command {Window destroy .iew} -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.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 -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 -anchor nw -bordermode ignore - place $base.cancelbtn -x 155 -y 110 -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} {x y} { +proc {mw_canvas_paste} {wn x y} { global mw - .mw.c insert $mw(id_edited) insert [selection get] - set mw(dirtyrec) 1 + $wn.c insert $mw($wn,id_edited) insert [selection get] + set mw($wn,dirtyrec) 1 } -proc vTclWindow.mw {base} { - if {$base == ""} { - set base .mw - } +proc {mw_create_window} {} { +global mwcount + set base .mw$mwcount + set wn .mw$mwcount if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive - wm geometry $base 550x400+5+5 + 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 - } + bind $base "mw_delete_record $wn" frame $base.f1 -borderwidth 2 -height 75 -relief groove -width 125 - label $base.f1.l1 -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -relief raised -text {Sort field} - entry $base.f1.e1 -background #fefefe -borderwidth 1 -width 14 -highlightthickness 1 -textvariable sortfield - label $base.f1.lb1 -borderwidth 0 -relief raised -text { } - label $base.f1.l2 -background #dfdfdf -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -relief raised -text {Filter conditions} - entry $base.f1.e2 -background #fefefe -borderwidth 1 -highlightthickness 1 -textvariable filter - button $base.f1.b1 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 -pady 3 -text Close -command { -if {[mw_save_new_record]} { - .mw.c delete rows - .mw.c delete header + 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 .mw + Window destroy $wn + mw_free_variables $wn } - } - button $base.f1.b2 -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 -pady 3 -text Reload -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 "$mw(query) where ($filter)" - } else { - set nq $mw(query) - } - if {$sortfield!=""} { - set nq "$nq order by $sortfield" - } -} -if {[mw_save_new_record]} {mw_select_records $nq} - } + " + 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 -padx 9 -pady 3 -text < -command {mw_pan_right} - label $base.frame20.02 -anchor w -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -height 1 -relief sunken -text {} -textvariable msg - button $base.frame20.03 -borderwidth 1 -padx 9 -pady 3 -text > -command {mw_pan_left} + 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 - bind $base.c { - mw_canvas_click %x %y - } - bind $base.c { - mw_canvas_paste %x %y - } - bind $base.c { - if {[mw_exit_edit]} {mw_save_new_record} - } - ################### - # SETTING GEOMETRY - ################### - pack $base.f1 -in .mw -anchor center -expand 0 -fill x -side top - pack $base.f1.l1 -in .mw.f1 -anchor center -expand 0 -fill none -side left - pack $base.f1.e1 -in .mw.f1 -anchor center -expand 0 -fill none -side left - pack $base.f1.lb1 -in .mw.f1 -anchor center -expand 0 -fill none -side left - pack $base.f1.l2 -in .mw.f1 -anchor center -expand 0 -fill none -side left - pack $base.f1.e2 -in .mw.f1 -anchor center -expand 0 -fill none -side left - pack $base.f1.b1 -in .mw.f1 -anchor center -expand 0 -fill none -side right - pack $base.f1.b2 -in .mw.f1 -anchor center -expand 0 -fill none -side right - pack $base.frame20 -in .mw -anchor s -expand 0 -fill x -side bottom - pack $base.frame20.01 -in .mw.frame20 -anchor center -expand 0 -fill none -side left - pack $base.frame20.02 -in .mw.frame20 -anchor center -expand 1 -fill x -side left - pack $base.frame20.03 -in .mw.frame20 -anchor center -expand 0 -fill none -side right - pack $base.c -in .mw -anchor w -expand 1 -fill both -side left - pack $base.sb -in .mw -anchor e -expand 0 -fill y -side right + 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 } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 614x392+78+181 @@ -3243,9 +3365,7 @@ proc vTclWindow.nt {base} { focus .nt.einh } label $base.li \ - -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text Inherits + -anchor w -borderwidth 0 -text Inherits entry $base.einh \ -background #fefefe -borderwidth 1 -selectborderwidth 0 \ -textvariable ntw(fathername) @@ -3257,7 +3377,7 @@ proc vTclWindow.nt {base} { -command {if {[winfo exists .nt.ddf]} { destroy .nt.ddf } else { - create_drop_down .nt 378 25 220 + 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 { @@ -3274,8 +3394,7 @@ proc vTclWindow.nt {base} { break } }} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -highlightthickness 0 -padx 9 -pady 3 -takefocus 0 -text v + -highlightthickness 0 -takefocus 0 -image dnarw entry $base.e2 \ -background #fefefe -borderwidth 1 -selectborderwidth 0 \ -textvariable ntw(fldname) @@ -3302,44 +3421,31 @@ proc vTclWindow.nt {base} { } checkbutton $base.cb1 \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -offvalue { } -onvalue { NOT NULL} -text {field cannot be null} \ -variable ntw(notnull) label $base.lab1 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text type + -borderwidth 0 -text type label $base.lab2 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text {Field name} + -borderwidth 0 -anchor w -text {Field name} label $base.lab3 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text size + -borderwidth 0 -text size label $base.lab4 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text {Default value} + -borderwidth 0 -anchor w -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} + -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} + -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} + -text {Delete all} button $base.maketbl \ -borderwidth 1 -command create_table \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Create + -text Create listbox $base.lb \ -background #fefefe -borderwidth 1 \ - -font -*-Clean-Medium-R-Normal--*-130-*-*-*-*-*-* \ + -font $pref(font_fix) \ -selectborderwidth 0 -yscrollcommand {.nt.sb set} bind $base.lb { if {[.nt.lb curselection]!=""} { @@ -3348,26 +3454,20 @@ proc vTclWindow.nt {base} { } button $base.exitbtn \ -borderwidth 1 -command {Window destroy .nt} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Cancel + -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 scrollbar $base.sb \ -borderwidth 1 -command {.nt.lb yview} -orient vert label $base.l93 \ - -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text {Table name} + -anchor w -borderwidth 0 -text {Table name} button $base.mvup \ -borderwidth 1 \ -command {if {[.nt.lb size]>1} { @@ -3378,8 +3478,7 @@ proc vTclWindow.nt {base} { .nt.lb selection set [expr $i-1] } }} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Move up} + -text {Move up} button $base.mvdn \ -borderwidth 1 \ -command {if {[.nt.lb size]>1} { @@ -3390,8 +3489,7 @@ proc vTclWindow.nt {base} { .nt.lb selection set [expr $i+1] } }} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Move down} + -text {Move down} button $base.button17 \ -borderwidth 1 \ -command { @@ -3409,47 +3507,36 @@ if {[winfo exists .nt.ddf]} { break } }} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -highlightthickness 0 -padx 9 -pady 3 -takefocus 0 -text v + -highlightthickness 0 -takefocus 0 -image dnarw label $base.lco \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text Constraint + -borderwidth 0 -anchor w -text Constraint entry $base.eco \ -background #fefefe -borderwidth 1 -textvariable ntw(constraint) label $base.lch \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -relief raised -text check + -borderwidth 0 -text check entry $base.ech \ -background #fefefe -borderwidth 1 -textvariable ntw(check) label $base.ll \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised checkbutton $base.pk \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -offvalue { } -onvalue * -text {primary key} -variable ntw(pk) label $base.lpk \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -relief raised -text K - ################### - # SETTING GEOMETRY - ################### 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 292 -height 20 -anchor nw -bordermode ignore + -x 290 -y 5 -width 318 -height 20 -anchor nw -bordermode ignore place $base.binh \ - -x 582 -y 6 -width 16 -height 19 -anchor nw -bordermode ignore + -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 81 -height 20 -anchor nw -bordermode ignore + -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 \ @@ -3491,7 +3578,7 @@ if {[winfo exists .nt.ddf]} { place $base.mvdn \ -x 534 -y 150 -width 75 -height 26 -anchor nw -bordermode ignore place $base.button17 \ - -x 372 -y 61 -width 16 -height 19 -anchor nw -bordermode ignore + -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 \ @@ -3499,9 +3586,9 @@ if {[winfo exists .nt.ddf]} { place $base.lch \ -x 245 -y 30 -anchor nw -bordermode ignore place $base.ech \ - -x 290 -y 27 -width 308 -height 22 -anchor nw -bordermode ignore + -x 290 -y 27 -width 318 -height 22 -anchor nw -bordermode ignore place $base.ll \ - -x 5 -y 53 -width 591 -height 2 -anchor nw -bordermode ignore + -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 \ @@ -3509,59 +3596,71 @@ if {[winfo exists .nt.ddf]} { } proc vTclWindow.pw {base} { +global pref if {$base == ""} { set base .pw } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive - wm geometry $base 322x167+210+219 + wm geometry $base 322x227+210+219 wm maxsize $base 1009 738 wm minsize $base 1 1 wm overrideredirect $base 0 - wm resizable $base 1 1 + wm resizable $base 0 0 wm title $base "Preferences" - label $base.l1 -borderwidth 0 -relief raised -text {Max rows displayed in table/query view} + 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 -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.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 -message "A big number of rows displayed in table view will take a lot of memory!" + 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} -padx 9 -pady 3 -text Ok - ################### - # SETTING GEOMETRY - ################### - place $base.l1 -x 10 -y 20 -anchor nw -bordermode ignore - place $base.e1 -x 245 -y 17 -width 65 -height 24 -anchor nw -bordermode ignore - place $base.l2 -x 10 -y 53 -anchor nw -bordermode ignore - place $base.tvf -x 50 -y 50 -anchor nw -bordermode ignore - place $base.tvfv -x 155 -y 50 -anchor nw -bordermode ignore - place $base.ll -x 10 -y 85 -width 301 -height 2 -anchor nw -bordermode ignore - place $base.alcb -x 10 -y 95 -anchor nw -bordermode ignore - place $base.okbtn -x 125 -y 135 -width 80 -height 26 -anchor nw -bordermode ignore +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 } - ################### - # CREATING WIDGETS - ################### - toplevel $base -class Toplevel -cursor top_left_arrow + toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 442x344+150+150 wm maxsize $base 1009 738 @@ -3570,7 +3669,7 @@ proc vTclWindow.qb {base} { wm resizable $base 0 0 wm deiconify $base wm title $base "Query builder" - label $base.lqn -borderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Query name} + 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!" @@ -3587,7 +3686,7 @@ proc vTclWindow.qb {base} { set qtype A } if {$cbv} { - set pgres [wpg_exec $dbc "create view $queryname as $qcmd"] + 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 { @@ -3607,64 +3706,59 @@ proc vTclWindow.qb {base} { if {$pgsql(status)!="PGRES_COMMAND_OK"} then { show_error "Error executing query\n$pgres(errmsg)" } else { - cmd_Queries + tab_click .dw.tabQueries if {$queryoid==0} {set queryoid [pg_result $pgres -oid]} } } catch {pg_result $pgres -clear} } -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Save query definition} +}} -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 -message "This is an action query!\n\nExecute it?" -type yesno -default no]=="yes"} { + 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 mw(query) [subst $qcmd] - set mw(updatable) 0 - set mw(isaquery) 1 - Window show .mw - set mw(layout_name) $queryname - mw_load_layout $queryname - mw_select_records $mw(query) -} -} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Execute query} + 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} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Close - text $base.text1 -background #fefefe -borderwidth 1 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -foreground #000000 -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 +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} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Visual designer} - ################### - # SETTING GEOMETRY - ################### +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 -anchor nw -bordermode ignore - place $base.execbtn -x 150 -y 60 -anchor nw -bordermode ignore - place $base.termbtn -x 375 -y 60 -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 -anchor nw -bordermode ignore - place $base.qlshow -x 255 -y 60 -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 } - ################### - # CREATING WIDGETS - ################### - toplevel $base -class Toplevel -cursor top_left_arrow + toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 759x530+10+13 wm maxsize $base 1009 738 @@ -3688,26 +3782,26 @@ proc vTclWindow.ql {base} { 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} -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 {Add table} +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 mw(layout_name) nolayoutneeded -set mw(query) [subst $qcmd] -set mw(updatable) 0 -set mw(isaquery) 1 -Window show .mw -mw_load_layout $mw(layout_name) -mw_select_records $mw(query)} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Execute 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} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text {Save to query builder} +focus .qb} -text {Save to query builder} button $base.bdd -borderwidth 1 -command {if {[winfo exists .ql.ddf]} { destroy .ql.ddf } else { @@ -3723,17 +3817,14 @@ focus .qb} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -p destroy .ql.ddf break } -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -highlightthickness 0 -padx 9 -pady 3 -text v - ################### - # SETTING GEOMETRY - ################### +}} -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 26 -anchor nw -bordermode ignore - place $base.showbtn -x 367 -y 5 -height 26 -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 26 -anchor nw -bordermode ignore - place $base.stoqb -x 550 -y 5 -height 26 -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 } @@ -3745,9 +3836,6 @@ proc vTclWindow.rf {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 272x105+294+262 @@ -3756,7 +3844,7 @@ proc vTclWindow.rf {base} { wm overrideredirect $base 0 wm resizable $base 0 0 wm title $base "Rename" - label $base.l1 -borderwidth 0 -relief raised -text {New name} + 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==""} { @@ -3782,11 +3870,8 @@ proc vTclWindow.rf {base} { } catch {pg_result $pgres -clear} } - } -padx 9 -pady 3 -text Rename - button $base.b2 -borderwidth 1 -command {Window destroy .rf} -padx 9 -pady 3 -text Cancel - ################### - # SETTING GEOMETRY - ################### + } -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 @@ -3794,15 +3879,13 @@ proc vTclWindow.rf {base} { } proc vTclWindow.rb {base} { +global pref if {$base == ""} { set base .rb } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 652x426+96+120 @@ -3814,11 +3897,9 @@ proc vTclWindow.rb {base} { wm title $base "Report builder" label $base.l1 \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -relief raised -text {Report fields} listbox $base.lb \ -background #fefefe -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -highlightthickness 1 -selectborderwidth 0 \ -yscrollcommand {.rb.sb set} bind $base.lb { @@ -3841,25 +3922,22 @@ proc vTclWindow.rb {base} { } button $base.bt2 \ -borderwidth 1 \ - -command {if {[tk_messageBox -title Warning -message "All report information will be deleted.\n\nProceed ?" -type yesno -default no]=="yes"} then { + -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 }} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text {Clear all} + -text {Clear all} button $base.bt4 \ -borderwidth 1 -command rb_preview \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text Preview + -text Preview button $base.bt5 \ -borderwidth 1 -command {Window destroy .rb} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text Quit + -text Quit scrollbar $base.sb \ -borderwidth 1 -command {.rb.lb yview} -orient vert label $base.lmsg \ - -anchor w -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ + -anchor w \ -relief groove -text {Report header} -textvariable rbvar(msg) entry $base.e2 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ @@ -3872,8 +3950,7 @@ rb_draw_regions -textvariable rbvar(labeltext) button $base.badl \ -borderwidth 1 -command rb_add_label \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text {Add label} + -text {Add label} label $base.lbold \ -borderwidth 1 -relief raised -text B bind $base.lbold { @@ -3886,7 +3963,7 @@ rb_change_object_font } label $base.lita \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-O-Normal--*-120-*-*-*-*-*-* \ + -font $pref(font_italic) \ -relief raised -text i bind $base.lita { if {[rb_get_italic]=="O"} { @@ -3903,24 +3980,18 @@ rb_change_object_font rb_change_object_font } label $base.linfo \ - -anchor w -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ + -anchor w \ -relief groove -text {Database field} -textvariable rbvar(info) label $base.llal \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -relief raised -text Align + -borderwidth 0 -text Align button $base.balign \ -borderwidth 0 -command rb_flip_align \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -relief groove -text right + -relief groove -text right button $base.savebtn \ -borderwidth 1 -command rb_save_report \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text Save + -text Save label $base.lfn \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -relief raised -text Font + -borderwidth 0 -text Font button $base.bfont \ -borderwidth 0 \ -command {set temp [.rb.bfont cget -text] @@ -3930,8 +4001,7 @@ if {$temp=="Courier"} then { .rb.bfont configure -text Courier } rb_change_object_font} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -relief groove -text Courier + -relief groove -text Courier button $base.bdd \ -borderwidth 1 \ -command {if {[winfo exists .rb.ddf]} { @@ -3948,12 +4018,9 @@ rb_change_object_font} \ break } }} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -highlightthickness 0 -padx 9 -pady 2 -text v + -highlightthickness 0 -image dnarw label $base.lrn \ - -borderwidth 0 \ - -font -Adobe-Helvetica-medium-R-Normal--*-120-*-*-*-*-*-* \ - -relief raised -text {Report name} + -borderwidth 0 -text {Report name} entry $base.ern \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ -textvariable rbvar(reportname) @@ -3961,9 +4028,7 @@ rb_change_object_font} \ rb_load_report } label $base.lrs \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -relief raised -text {Report source} + -borderwidth 0 -text {Report source} label $base.ls \ -borderwidth 1 -relief raised entry $base.ef \ @@ -3971,11 +4036,7 @@ rb_change_object_font} \ -textvariable rbvar(formula) button $base.baf \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text {Add formula} - ################### - # SETTING GEOMETRY - ################### + -text {Add formula} place $base.l1 \ -x 5 -y 55 -width 131 -height 18 -anchor nw -bordermode ignore place $base.lb \ @@ -4039,9 +4100,6 @@ proc vTclWindow.rpv {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 495x500+230+50 @@ -4063,15 +4121,10 @@ proc vTclWindow.rpv {base} { -borderwidth 2 -height 75 -width 125 button $base.f1.button18 \ -borderwidth 1 -command {if {$rbvar(justpreview)} then {Window destroy .rb} ; Window destroy .rpv} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text Close + -text Close button $base.f1.button17 \ -borderwidth 1 -command rb_print_report \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text Print - ################### - # SETTING GEOMETRY - ################### + -text Print pack $base.fr \ -in .rpv -anchor center -expand 1 -fill both -side top pack $base.fr.c \ @@ -4093,9 +4146,6 @@ proc vTclWindow.sqf {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 310x223+245+158 @@ -4104,15 +4154,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 -relief raised -text {Sequence name} + 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 -relief raised -text Increment + label $base.l2 -borderwidth 0 -text Increment entry $base.e2 -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable seq_inc - label $base.l3 -borderwidth 0 -relief raised -text {Start value} + 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 -relief raised -text Minvalue + label $base.l4 -borderwidth 0 -text Minvalue entry $base.e4 -borderwidth 1 -highlightthickness 1 -selectborderwidth 0 -textvariable seq_minval - label $base.l5 -borderwidth 0 -relief raised -text Maxvalue + 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==""} { @@ -4123,13 +4173,13 @@ proc vTclWindow.sqf {base} { 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" + set sqlcmd "create sequence \"$seq_name\" $s1 $s2 $s3 $s4" if {[sql_exec noquiet $sqlcmd]} { cmd_Sequences - tk_messageBox -title Information -message "Sequence created!" + tk_messageBox -title Information -parent .sqf -message "Sequence created!" } } - } -padx 9 -pady 3 -text {Define sequence} + } -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 @@ -4138,10 +4188,7 @@ proc vTclWindow.sqf {base} { } place .sqf.defbtn -x 40 -y 175 Window destroy .sqf -} -padx 9 -pady 3 -text Close - ################### - # SETTING GEOMETRY - ################### +} -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 @@ -4157,15 +4204,13 @@ Window destroy .sqf } proc vTclWindow.sw {base} { +global pref if {$base == ""} { set base .sw } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 594x416+192+152 @@ -4175,23 +4220,20 @@ proc vTclWindow.sw {base} { 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 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -relief raised -text {Script name} + 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 -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -height 2 -highlightthickness 1 -selectborderwidth 0 -width 2 + 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} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Cancel + 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 -message "The script must have a name!" + 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 -}} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 -pady 3 -text Save -width 6 - ################### - # SETTING GEOMETRY - ################### +}} -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 @@ -4202,65 +4244,65 @@ proc vTclWindow.sw {base} { } proc vTclWindow.tiw {base} { +global pref if {$base == ""} { set base .tiw } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### 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 1 1 + wm resizable $base 0 0 wm title $base "Table information" - 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.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 -borderwidth 1 -font -*-Clean-Medium-R-Normal--*-130-*-*-*-*-*-* -highlightthickness 1 -selectborderwidth 0 -yscrollcommand {.tiw.sb set} + listbox $base.lb -background #fefefe -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 - 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} + 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 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.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 - ################### - # SETTING GEOMETRY - ################### 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 -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 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.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 @@ -4276,9 +4318,6 @@ proc vTclWindow.fd {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 377x315+103+101 @@ -4303,9 +4342,6 @@ proc vTclWindow.fd {base} { bind $base.c { fd_mouse_move %x %y } - ################### - # SETTING GEOMETRY - ################### pack $base.c \ -in .fd -anchor center -expand 1 -fill both -side top } @@ -4317,9 +4353,6 @@ proc vTclWindow.fda {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 225x197+561+0 @@ -4331,7 +4364,6 @@ proc vTclWindow.fda {base} { wm title $base "Attributes" label $base.l1 \ -anchor nw -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -justify left -text Name -width 8 entry $base.e1 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ @@ -4341,7 +4373,6 @@ proc vTclWindow.fda {base} { } label $base.l2 \ -anchor nw -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -justify left -text Top -width 8 entry $base.e2 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ @@ -4351,8 +4382,7 @@ proc vTclWindow.fda {base} { } label $base.l3 \ -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text Left \ - -width 8 + -text Left -width 8 entry $base.e3 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ -selectborderwidth 0 -textvariable fdvar(c_left) @@ -4361,7 +4391,7 @@ proc vTclWindow.fda {base} { } label $base.l4 \ -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -text Width \ + -text Width \ -width 8 entry $base.e4 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ @@ -4370,9 +4400,7 @@ proc vTclWindow.fda {base} { fd_change_coord } label $base.l5 \ - -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 0 \ - -text Height -width 8 + -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) @@ -4380,9 +4408,7 @@ proc vTclWindow.fda {base} { fd_change_coord } label $base.l6 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 0 \ - -text Command + -borderwidth 0 -text Command entry $base.e6 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ -selectborderwidth 0 -textvariable fdvar(c_cmd) @@ -4394,11 +4420,9 @@ proc vTclWindow.fda {base} { -command {Window show .fdcmd .fdcmd.f.txt delete 1.0 end .fdcmd.f.txt insert end $fdvar(c_cmd)} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 3 \ - -pady 3 -text ... -width 1 + -text ... -width 1 label $base.l7 \ -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -text Variable -width 8 entry $base.e7 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ @@ -4408,8 +4432,7 @@ proc vTclWindow.fda {base} { } label $base.l8 \ -anchor w -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -text Text \ - -width 8 + -text Text -width 8 entry $base.e8 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ -selectborderwidth 0 -textvariable fdvar(c_text) @@ -4419,9 +4442,6 @@ proc vTclWindow.fda {base} { label $base.l0 \ -borderwidth 1 -relief raised -text {checkbox .udf0.checkbox17} \ -textvariable fdvar(c_info) -width 28 - ################### - # SETTING GEOMETRY - ################### grid $base.l1 \ -in .fda -column 0 -row 1 -columnspan 1 -rowspan 1 grid $base.e1 \ @@ -4461,15 +4481,13 @@ proc vTclWindow.fda {base} { } proc vTclWindow.fdcmd {base} { +global pref if {$base == ""} { set base .fdcmd } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 282x274+504+229 @@ -4483,7 +4501,7 @@ proc vTclWindow.fdcmd {base} { scrollbar $base.f.sb \ -borderwidth 1 -command {.fdcmd.f.txt yview} -orient vert -width 12 text $base.f.txt \ - -font -*-Clean-Medium-R-Normal--*-130-*-*-*-*-*-* -height 1 \ + -font $pref(font_fix) -height 1 \ -width 115 -yscrollcommand {.fdcmd.f.sb set} frame $base.fb \ -height 75 -width 125 @@ -4492,15 +4510,10 @@ proc vTclWindow.fdcmd {base} { -command {set fdvar(c_cmd) [.fdcmd.f.txt get 1.0 "end - 1 chars"] Window hide .fdcmd fd_set_command} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Ok -width 5 + -text Ok -width 5 button $base.fb.b2 \ -borderwidth 1 -command {Window hide .fdcmd} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Cancel - ################### - # SETTING GEOMETRY - ################### + -text Cancel pack $base.f \ -in .fdcmd -anchor center -expand 1 -fill both -side top pack $base.f.sb \ @@ -4522,9 +4535,6 @@ proc vTclWindow.fdmenu {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 288x70+103+0 @@ -4538,16 +4548,13 @@ proc vTclWindow.fdmenu {base} { -borderwidth 1 \ -command {if {[tk_messageBox -title Warning -message "Delete all objects ?" -type yesno -default no]=="no"} return fd_init} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Delete all} + -text {Delete all} button $base.but18 \ -borderwidth 1 -command {set fdvar(geometry) [wm geometry .fd] ; fd_test } \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Test form} + -text {Test form} button $base.but19 \ -borderwidth 1 -command {destroy .$fdvar(forminame)} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text {Close test form} + -text {Close test form} button $base.bex \ -borderwidth 1 \ -command {if {[fd_save_form $fdvar(formname)]==1} { @@ -4558,33 +4565,24 @@ catch {Window destroy .fda} catch {Window destroy .fdcmd} catch {Window destroy .$fdvar(forminame)} }} \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ - -pady 3 -text Close + -text Close button $base.bload \ -borderwidth 1 -command {fd_load_form nimic design} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text {Load from database} + -text {Load from database} button $base.button17 \ -borderwidth 1 -command {fd_save_form nimic} \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* -padx 9 \ - -pady 3 -text Save + -text Save label $base.l1 \ - -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ - -text {Form name} + -borderwidth 0 -text {Form name} entry $base.e1 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ -selectborderwidth 0 -textvariable fdvar(formname) label $base.l2 \ -borderwidth 0 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -text {Form's window internal name} entry $base.e2 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ -selectborderwidth 0 -textvariable fdvar(forminame) - ################### - # SETTING GEOMETRY - ################### place $base.but17 \ -x 5 -y 80 -width 62 -height 24 -anchor nw -bordermode ignore place $base.but18 \ @@ -4614,9 +4612,6 @@ proc vTclWindow.gpw {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive set sw [winfo screenwidth .] @@ -4632,7 +4627,6 @@ proc vTclWindow.gpw {base} { wm title $base "Input parameter" label $base.l1 \ -anchor nw -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -justify left -relief sunken -textvariable gpw(msg) -wraplength 200 entry $base.e1 \ -background #fefefe -borderwidth 1 -highlightthickness 0 \ @@ -4647,15 +4641,10 @@ destroy .gpw } button $base.bok \ -borderwidth 1 -command {set gpw(result) 1 -destroy .gpw} -padx 9 \ - -pady 3 -text Ok +destroy .gpw} -text Ok button $base.bcanc \ -borderwidth 1 -command {set gpw(result) 0 -destroy .gpw} -padx 9 \ - -pady 3 -text Cancel - ################### - # SETTING GEOMETRY - ################### +destroy .gpw} -text Cancel place $base.l1 \ -x 10 -y 5 -width 201 -height 53 -anchor nw -bordermode ignore place $base.e1 \ @@ -4673,9 +4662,6 @@ proc vTclWindow.fdtb {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 90x152+0+0 @@ -4687,47 +4673,36 @@ proc vTclWindow.fdtb {base} { wm title $base "Toolbar" radiobutton $base.rb1 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -highlightthickness 0 -text Point -value point -variable fdvar(tool) \ -width 9 radiobutton $base.rb2 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ - -foreground #000000 -highlightthickness 0 -selectcolor #0000ee \ + -foreground #000000 -highlightthickness 0 \ -text Label -value label -variable fdvar(tool) -width 9 radiobutton $base.rb3 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -highlightthickness 0 -text Entry -value entry -variable fdvar(tool) \ -width 9 radiobutton $base.rb4 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -highlightthickness 0 -text Button -value button \ -variable fdvar(tool) -width 9 radiobutton $base.rb5 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* \ -highlightthickness 0 -text {List box} -value listbox \ -variable fdvar(tool) -width 9 radiobutton $base.rb6 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -highlightthickness 0 -text {Check box} -value checkbox \ -variable fdvar(tool) -width 9 radiobutton $base.rb7 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -highlightthickness 0 -text {Radio btn} -value radio \ -variable fdvar(tool) -width 9 radiobutton $base.rb8 \ -anchor w -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \ -highlightthickness 0 -text Query -value query -variable fdvar(tool) \ -width 9 - ################### - # SETTING GEOMETRY - ################### grid $base.rb1 \ -in .fdtb -column 0 -row 0 -columnspan 1 -rowspan 1 grid $base.rb2 \ @@ -4753,9 +4728,6 @@ proc vTclWindow.sqlw {base} { if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # CREATING WIDGETS - ################### toplevel $base -class Toplevel wm focusmodel $base passive wm geometry $base 551x408+192+169 @@ -4774,18 +4746,13 @@ proc vTclWindow.sqlw {base} { -borderwidth 1 -command {.sqlw.f.t yview} -orient vert -width 10 text $base.f.t \ -borderwidth 1 \ - -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-* \ -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} -padx 9 \ - -pady 3 -text Clean + -borderwidth 1 -command {.sqlw.f.t delete 1.0 end} -text Clean button $base.b2 \ - -borderwidth 1 -command {destroy .sqlw} -padx 9 -pady 3 -text Close - ################### - # SETTING GEOMETRY - ################### + -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 @@ -4806,6 +4773,180 @@ proc vTclWindow.sqlw {base} { -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 -- 2.40.0