From 4c87f79854f45f2279db96bd203980b839343f67 Mon Sep 17 00:00:00 2001 From: Bruce Momjian <bruce@momjian.us> 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 8e5abc0c948..b19c313c39f 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 e943fe402bd..57b1dc59ae5 100644 --- a/src/bin/pgaccess/index.html +++ b/src/bin/pgaccess/index.html @@ -1,144 +1,129 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> - <TITLE>PgAccess - a Tcl/Tk PostgreSQL interface</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> - <META NAME="GENERATOR" CONTENT="Mozilla/3.04Gold (X11; I; Linux 2.0.33 i586) [Netscape]"> + <META NAME="GENERATOR" CONTENT="Mozilla/4.07 [en] (X11; I; Linux 2.0.36 i586) [Netscape]"> + <TITLE>PgAccess - a Tcl/Tk PostgreSQL interface</TITLE> </HEAD> <BODY BGCOLOR="#FFFFFF"> -<H1>PgAccess - a free database management tool for <A HREF="http://www.postgreSQL.org">PostgreSQL</A></H1> - -<P> -<HR></P> - -<LI><A HREF="pgaccess-0.91.tar.gz">Download the last version of PgAccess -(press shift and click this link)</A>.</LI> - -<CENTER><P>Latest version of PgAccess is 0.91 , 1 November 1998 ! <BR> -<BR> - <B><FONT COLOR="#FF0000">NEW * NEW * NEW *</FONT></B> <B><FONT COLOR="#FF0000"> -NEW *</FONT></B> ==== > <B><FONT SIZE=+1>QUERY PARAMETERS</FONT></B> -(see section Queries below)<BR> -<BR> -Precompiled libpgtcl and libpq binaries for i386 are <A HREF="ftp://ftp.flex.ro/pub/pgaccess">here -</A>!!! <BR> - </P></CENTER> - -<CENTER><TABLE BORDER=3 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" BGCOLOR="#FFB6C1" > -<TR> -<TD> -<CENTER><P><B><FONT SIZE=+2>PgAccess can now design <A HREF="forms.html">Forms</A></FONT></B>, -<B><FONT SIZE=+2><A HREF="pga-rad.html">Reports and Scripts</A></FONT></B> -</P></CENTER> -</TD> -</TR> -</TABLE></CENTER> - -<H3><FONT COLOR="#000080">Installation problems</FONT></H3> +<H1> +PgAccess - a free database management tool for <A HREF="http://www.postgreSQL.org">PostgreSQL</A></H1> + +<HR> +<LI> +Download the last version of PgAccess <A HREF="pgaccess-0.93.tar.gz">(press +shift and click this link) (tar.gz file)</A> or <A HREF="pgaccess.zip">this +one (zip file for Windows)</A></LI> + +<CENTER> +<P><BR>Latest stable version of PgAccess is 0.93 , released 10 December +1998 ! +<P><FONT SIZE=+2><B><FONT COLOR="#FF0000">NEW *</FONT></B> <B><FONT COLOR="#FF0000">NEW +*</FONT></B></FONT><B><FONT COLOR="#FF0000"> </FONT><FONT COLOR="#000000"><FONT SIZE=+1> +==> </FONT><FONT SIZE=+2>Microsoft Windows compatible version</FONT></FONT></B> +<P> <B><FONT COLOR="#FF0000">NEW *</FONT></B> ==== > <B>PostgreSQL +user management, multiple table views</B>,. <B>Query parameters</B> (see +section Queries below) +<P>Precompiled libpgtcl and libpq binaries and dll's for i386 are <A HREF="ftp://ftp.flex.ro/pub/pgaccess">here +</A>!!!</CENTER> + +<BR> +<H3> +<FONT COLOR="#000080">Installation problems</FONT></H3> <UL> -<LI>Some problems related with locale special characters could be solved -by this <A HREF="specialchars.html">simple patch</A></LI> +<LI> +Some problems related with locale special characters could be solved by +this <A HREF="specialchars.html">simple patch</A></LI> -<LI>I think that there were some problems loading libpgtcl library. I invite +<LI> +I think that there were some problems loading libpgtcl library. I invite you to read a <A HREF="index.html#libpgtcl">special section concerning libpgtcl</A></LI> -<LI>For Silicon Graphics Indigo computers, Irix operating system, there -is a <A HREF="irix.html">HOWTO make PgAccess to work</A></LI> +<LI> +For Silicon Graphics Indigo computers, Irix operating system, there is +a <A HREF="irix.html">HOWTO make PgAccess to work</A></LI> </UL> -<H3><FONT COLOR="#191970">What does PgAccess now!</FONT></H3> - -<P>Here are some screenshots from PgAccess windows : <A HREF="pic-pga-1.gif">Main +<H3> +<FONT COLOR="#191970">What does PgAccess now!</FONT></H3> +Here are some screenshots from PgAccess windows : <A HREF="pic-pga-1.gif">Main window </A>, <A HREF="pic-pga-2.gif">table builder </A>, <A HREF="pic-pga-4.gif">table(query) -view </A>, <A HREF="pic-pga-3.gif">visual query builder </A>. </P> - -<P><B>Tables</B> <BR> -- opening tables for viewing, max. 200 records (changed by preferences -menu) <BR> -- column resizing, dragging the vertical grid line (better in table space -rather than in the table header) <BR> -- text wrap in cells - layout saved for every table <BR> -- import/export to external files (SDF,CSV) <BR> -- filter capabilities (enter filter like (price>3.14) <BR> -- sort order capabilities (enter manually the sort field(s)) <BR> -- editing in place <BR> -- improved table generator assistant <BR> -- improved field editing <BR> -<B>Queries</B> <BR> -- define , edit and stores "user defined queries" <BR> -- store queries as views <BR> -- execution of queries with optional user input parameters ( select * from -invoices where year=[parameter "Year of selection"] )<BR> -- viewing of select type queries result <BR> -- query deleting and renaming <BR> -- 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 <A HREF="qbtclet.html">clicking here</A> <BR> -<B>Sequences</B> <BR> -- defines sequences, delete them and inspect them <BR> -<B>Functions</B> <BR> -- define, inspect and delete functions in SQL language <BR> -<B>Reports</B> <BR> -- design and display simple reports from tables <BR> -- fields and labels, font changing, style and size <BR> -- saves and loads report description from database <BR> -- show report previews, sample postscript output file <BR> -<B>Forms</B> <BR> -- open user defined forms <BR> -- form design module available <BR> -- query widget available, controls bound to query results <BR> -- <A HREF="forms.html">click here</A> for a description of forms and how -they can be used <BR> -<B>Scripts</B> <BR> -- define, modify and call user defined scripts <BR> -Here is <A HREF="pga-rad.html">a special section concerning forms and scripts</A> -. </P> - -<P>On the TO-DO list! <BR> -- table design (add new fields, renaming, etc.) </P> - +view </A>, <A HREF="pic-pga-3.gif">visual query builder </A>. +<P><B>Tables</B> +<BR>- opening multiple tables for viewing, max. n records (changed by preferences +menu) +<BR>- column resizing, dragging the vertical grid line (better in table +space rather than in the table header) +<BR>- text wrap in cells - layout saved for every table +<BR>- import/export to external files (SDF,CSV) +<BR>- filter capabilities (enter filter like (price>3.14) +<BR>- sort order capabilities (enter manually the sort field(s)) +<BR>- editing in place +<BR>- improved table generator assistant +<BR>- improved field editing +<BR><B>Queries</B> +<BR>- define , edit and stores "user defined queries" +<BR>- store queries as views +<BR>- execution of queries with optional user input parameters ( select +* from invoices where year=[parameter "Year of selection"] ) +<BR>- viewing of select type queries result +<BR>- query deleting and renaming +<BR>- 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 <A HREF="qbtclet.html">clicking here</A> +<BR><B>Sequences</B> +<BR>- defines sequences, delete them and inspect them +<BR><B>Functions</B> +<BR>- define, inspect and delete functions in SQL language +<BR><B>Reports</B> +<BR>- design and display simple reports from tables +<BR>- fields and labels, font changing, style and size +<BR>- saves and loads report description from database +<BR>- show report previews, sample postscript output file +<BR><B>Forms</B> +<BR>- open user defined forms +<BR>- form design module available +<BR>- query widget available, controls bound to query results +<BR>- <A HREF="forms.html">click here</A> for a description of forms and +how they can be used +<BR><B>Scripts</B> +<BR>- define, modify and call user defined scripts +<BR><B>Users</B> +<BR>- define and modify user parameters +<P>Here is <A HREF="pga-rad.html">a special section concerning forms and +scripts</A> . <P>This program is protected by the following <A HREF="copyright.html">copyright</A> -</P> - <P>If you have any comment, suggestion for improvements, please feel free -to e-mail to : <A HREF="mailto:teo@flex.ro">teo@flex.ro </A> </P> - +to e-mail to : <A HREF="mailto:teo@flex.ro">teo@flex.ro</A> <P><B><FONT COLOR="#FF1493"><FONT SIZE=+2>Mailing list for PgAccess </FONT></FONT></B><A HREF="maillist.html">Here -you will find how to subscribe to this mailing list</A>. </P> - +you will find how to subscribe to this mailing list</A>. <P> -<HR></P> - -<H1>More information about libpgtcl - downloads</H1> - -<P> Also, you will need the PostgreSQL to Tcl interface +<HR> +<H1> +More information about libpgtcl - downloads</H1> + 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. <BR> - You can download <B><A HREF="lib-pg63-redhat42.tar.gz">from -here</A></B> 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. </P> - +of object files. Under Linux, this is called libpgtcl.so. <P> One of the solutions is to remove from the source the line containing <B>load libpgtcl.so </B>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. </P> - -<P> If you have installed RedHat 5.0, you should +libpgtcl library! I do not recommend this one. +<P> 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 <B>libpq </B>and <B><TT>libpgtcl </TT></B>libraries. -</P> - -<P>However, the application should work without problems! </P> - +<P> 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. +<BR> </BODY> </HTML> 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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 Ot2De`{QdtVf&T~ejfGDD literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/libpq.dll b/src/bin/pgaccess/libpq.dll new file mode 100644 index 0000000000000000000000000000000000000000..1079f2fa7786ee1335efc58533b21e3451cb523f GIT binary patch literal 78336 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 literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/pgaccess.tcl b/src/bin/pgaccess/pgaccess.tcl index 78079b39e3d..c8d73aaabfa 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 <Leave> {} +if {[lsearch [$wn.c gettags $object] movable]==-1} return; +$wn.c bind movable <Leave> {} set draglocation(obj) $object set draglocation(x) $x set draglocation(y) $y set draglocation(start) $x } -proc {drag_stop} {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 <Leave> {.mw configure -cursor top_left_arrow} - .mw configure -cursor top_left_arrow - set ctr [get_tag_info $draglocation(obj) v] + $wn.c bind movable <Leave> "$wn configure -cursor left_ptr" + $wn configure -cursor left_ptr + set ctr [get_tag_info $wn $draglocation(obj) v] set diff [expr $x-$draglocation(start)] if {$diff==0} return; set newcw {} - for {set i 0} {$i<$mw(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 <Button-1> {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 <Button-1> {drag_start %W %x %y} -.mw.c bind movable <B1-Motion> {drag_it %W %x %y} -.mw.c bind movable <ButtonRelease-1> {drag_stop %W %x %y} -.mw.c bind movable <Enter> {.mw configure -cursor left_side} -.mw.c bind movable <Leave> {.mw configure -cursor top_left_arrow} +set mw($wn,r_edge) $posx +$wn.c bind movable <Button-1> "drag_start $wn %W %x %y" +$wn.c bind movable <B1-Motion> {drag_it %W %x %y} +$wn.c bind movable <ButtonRelease-1> "drag_stop $wn %W %x %y" +$wn.c bind movable <Enter> "$wn configure -cursor left_side" +$wn.c bind movable <Leave> "$wn configure -cursor left_ptr" } -proc {mw_draw_hgrid} {} { +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 <Key> {mw_edit_text %A %K} +set mw($wn,toprec) 0 +mw_set_scrollbar $wn +if {$mw($wn,updatable)} then { + $wn.c bind q <Key> "mw_edit_text $wn %A %K" } else { - .mw.c bind q <Key> {} + $wn.c bind q <Key> {} } -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 <Button-1> {ql_dragstart %W %x %y} .ql.c bind mov <B1-Motion> {ql_dragit %W %x %y} bind .ql <ButtonRelease-1> {ql_dragstop %x %y} @@ -2057,16 +2251,16 @@ bind .ql <Key-Delete> {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 <Button-1> {.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 <Button-1> {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 <Key-Return> { 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 <Double-Button-1> { 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 <Key-Delete> { - mw_delete_record - } + bind $base <Key-Delete> "mw_delete_record $wn" frame $base.f1 -borderwidth 2 -height 75 -relief groove -width 125 - label $base.f1.l1 -borderwidth 0 -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 <Key-Return> "mw_reload $wn" + bind $base.f1.e1 <Key-KP_Enter> "mw_reload $wn" + label $base.f1.lb1 -borderwidth 0 -text { } + label $base.f1.l2 -borderwidth 0 -text {Filter conditions} + entry $base.f1.e2 -background #fefefe -borderwidth 1 -highlightthickness 1 -textvariable mw($wn,filter) + bind $base.f1.e2 <Key-Return> "mw_reload $wn" + bind $base.f1.e2 <Key-KP_Enter> "mw_reload $wn" + button $base.f1.b1 -borderwidth 1 -text Close -command " +if {\[mw_save_new_record $wn\]} { + $wn.c delete rows + $wn.c delete header set sortfield {} set filter {} - Window destroy .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 <Button-1> { - mw_canvas_click %x %y - } - bind $base.c <Button-2> { - mw_canvas_paste %x %y - } - bind $base.c <Button-3> { - 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 <Button-1> "mw_canvas_click $wn %x %y" + bind $base.c <Button-2> "mw_canvas_paste $wn %x %y" + bind $base.c <Button-3> "if {[mw_exit_edit $wn]} \"mw_save_new_record $wn\"" + pack $base.f1 -in $wn -anchor center -expand 0 -fill x -side top + pack $base.f1.l1 -in $wn.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.e1 -in $wn.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.lb1 -in $wn.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.l2 -in $wn.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.e2 -in $wn.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.b1 -in $wn.f1 -anchor center -expand 0 -fill none -side right + pack $base.f1.b2 -in $wn.f1 -anchor center -expand 0 -fill none -side right + pack $base.frame20 -in $wn -anchor s -expand 0 -fill x -side bottom + pack $base.frame20.01 -in $wn.frame20 -anchor center -expand 0 -fill none -side left + pack $base.frame20.02 -in $wn.frame20 -anchor center -expand 1 -fill x -side left + pack $base.frame20.03 -in $wn.frame20 -anchor center -expand 0 -fill none -side right + pack $base.c -in $wn -anchor w -expand 1 -fill both -side left + pack $base.sb -in $wn -anchor e -expand 0 -fill y -side right } proc vTclWindow.nt {base} { +global pref if {$base == ""} { set base .nt } if {[winfo exists $base]} { wm deiconify $base; return } - ################### - # 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 <ButtonRelease-1> { @@ -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 <ButtonRelease-1> { 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 <Key-Return> { 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 <ButtonRelease-1> { @@ -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 <Button-1> { @@ -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 <Button-1> { 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 <ButtonRelease-1> { tiw_show_index } - label $base.lip -borderwidth 1 -relief raised -text {index properties} - frame $base.fr11 -borderwidth 1 -height 75 -relief sunken -width 125 - label $base.fr11.l9 -borderwidth 0 -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 <Motion> { 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 <Key-KP_Enter> "rename_column" + bind $base.e1 <Key-Return> "rename_column" + frame $base.f \ + -height 75 -relief groove -width 147 + button $base.f.b1 \ + -borderwidth 1 -command rename_column -text Rename + button $base.f.b2 \ + -borderwidth 1 -command {Window destroy .rcw} -text Cancel + label $base.l2 -borderwidth 0 + grid $base.l1 \ + -in .rcw -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.e1 \ + -in .rcw -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.f \ + -in .rcw -column 0 -row 4 -columnspan 2 -rowspan 1 + grid $base.f.b1 \ + -in .rcw.f -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f.b2 \ + -in .rcw.f -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.l2 \ + -in .rcw -column 0 -row 3 -columnspan 1 -rowspan 1 +} + +proc vTclWindow.anfw {base} { + if {$base == ""} { + set base .anfw + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 302x114+195+175 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base "Add new field" + label $base.l1 \ + -borderwidth 0 \ + -text {Field name} + entry $base.e1 \ + -background #fefefe -borderwidth 1 -textvariable anfw(name) + bind $base.e1 <Key-KP_Enter> { + focus .anfw.e2 + } + bind $base.e1 <Key-Return> { + focus .anfw.e2 + } + label $base.l2 \ + -borderwidth 0 \ + -text {Field type} + entry $base.e2 \ + -background #fefefe -borderwidth 1 -textvariable anfw(type) + bind $base.e2 <Key-KP_Enter> { + anfw:add + } + bind $base.e2 <Key-Return> { + anfw:add + } + button $base.b1 \ + -borderwidth 1 -command anfw:add -text {Add field} + button $base.b2 \ + -borderwidth 1 -command {Window destroy .anfw} -text Cancel + place $base.l1 \ + -x 25 -y 10 -anchor nw -bordermode ignore + place $base.e1 \ + -x 98 -y 7 -width 178 -height 22 -anchor nw -bordermode ignore + place $base.l2 \ + -x 25 -y 40 -anchor nw -bordermode ignore + place $base.e2 \ + -x 98 -y 37 -width 178 -height 22 -anchor nw -bordermode ignore + place $base.b1 \ + -x 70 -y 75 -anchor nw -bordermode ignore + place $base.b2 \ + -x 160 -y 75 -anchor nw -bordermode ignore +} + +proc vTclWindow.uw {base} { + if {$base == ""} { + set base .uw + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 263x220+233+165 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base "Define new user" + label $base.l1 \ + -borderwidth 0 -anchor w -text "User name" + entry $base.e1 \ + -background #fefefe -borderwidth 1 -textvariable uw(username) + bind $base.e1 <Key-Return> "focus .uw.e2" + bind $base.e1 <Key-KP_Enter> "focus .uw.e2" + label $base.l2 \ + -borderwidth 0 -text Password + entry $base.e2 \ + -background #fefefe -borderwidth 1 -show * -textvariable uw(password) + bind $base.e2 <Key-Return> "focus .uw.e3" + bind $base.e2 <Key-KP_Enter> "focus .uw.e3" + label $base.l3 \ + -borderwidth 0 -text {verify password} + entry $base.e3 \ + -background #fefefe -borderwidth 1 -show * -textvariable uw(verify) + bind $base.e3 <Key-Return> "focus .uw.cb1" + bind $base.e3 <Key-KP_Enter> "focus .uw.cb1" + checkbutton $base.cb1 \ + -borderwidth 1 -offvalue NOCREATEDB -onvalue CREATEDB \ + -text {Alow user to create databases } -variable uw(createdb) + checkbutton $base.cb2 \ + -borderwidth 1 -offvalue NOCREATEUSER -onvalue CREATEUSER \ + -text {Allow users to create other users} -variable uw(createuser) + label $base.l4 \ + -borderwidth 0 -anchor w -text {Valid until (date)} + entry $base.e4 \ + -background #fefefe -borderwidth 1 -textvariable uw(valid) + bind $base.e4 <Key-Return> "focus .uw.b1" + bind $base.e4 <Key-KP_Enter> "focus .uw.b1" + button $base.b1 \ + -borderwidth 1 -command uw:create_user -text Create + button $base.b2 \ + -borderwidth 1 -command {Window destroy .uw} -text Cancel + place $base.l1 \ + -x 5 -y 7 -width 62 -height 16 -anchor nw -bordermode ignore + place $base.e1 \ + -x 109 -y 5 -width 146 -height 20 -anchor nw -bordermode ignore + place $base.l2 \ + -x 5 -y 35 -anchor nw -bordermode ignore + place $base.e2 \ + -x 109 -y 32 -width 146 -height 20 -anchor nw -bordermode ignore + place $base.l3 \ + -x 5 -y 60 -anchor nw -bordermode ignore + place $base.e3 \ + -x 109 -y 58 -width 146 -height 20 -anchor nw -bordermode ignore + place $base.cb1 \ + -x 5 -y 90 -anchor nw -bordermode ignore + place $base.cb2 \ + -x 5 -y 115 -anchor nw -bordermode ignore + place $base.l4 \ + -x 5 -y 145 -width 100 -height 16 -anchor nw -bordermode ignore + place $base.e4 \ + -x 110 -y 143 -width 146 -height 20 -anchor nw -bordermode ignore + place $base.b1 \ + -x 45 -y 185 -anchor nw -width 70 -height 25 -bordermode ignore + place $base.b2 \ + -x 140 -y 185 -anchor nw -width 70 -height 25 -bordermode ignore +} Window show . Window show .dw -- GitLab