From 471881788fe4fde3c93aafe966a43644c86298b5 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 20 Sep 1999 22:03:21 +0000 Subject: [PATCH] Add new files. --- src/bin/pgaccess/README | 82 + src/bin/pgaccess/copyright.html | 39 + src/bin/pgaccess/doc/html/a_right.gif | Bin 0 -> 207 bytes src/bin/pgaccess/doc/html/addindex.gif | Bin 0 -> 11402 bytes src/bin/pgaccess/doc/html/api.html | 232 ++ src/bin/pgaccess/doc/html/ball.gif | Bin 0 -> 176 bytes src/bin/pgaccess/doc/html/contents.html | 29 + src/bin/pgaccess/doc/html/copyright.html | 39 + src/bin/pgaccess/doc/html/documentation.html | 19 + src/bin/pgaccess/doc/html/download.html | 42 + src/bin/pgaccess/doc/html/faq.html | 85 + src/bin/pgaccess/doc/html/features.html | 52 + src/bin/pgaccess/doc/html/formdemo.sql | 216 ++ src/bin/pgaccess/doc/html/forms.gif | Bin 0 -> 20106 bytes src/bin/pgaccess/doc/html/forms.html | 203 ++ src/bin/pgaccess/doc/html/function.gif | Bin 0 -> 10022 bytes src/bin/pgaccess/doc/html/help.gif | Bin 0 -> 7082 bytes src/bin/pgaccess/doc/html/index.html | 11 + src/bin/pgaccess/doc/html/irix.html | 133 ++ src/bin/pgaccess/doc/html/linux1.gif | Bin 0 -> 789 bytes src/bin/pgaccess/doc/html/maillist.html | 43 + src/bin/pgaccess/doc/html/main.html | 34 + src/bin/pgaccess/doc/html/mainwindow.gif | Bin 0 -> 8857 bytes src/bin/pgaccess/doc/html/newtable.gif | Bin 0 -> 9317 bytes src/bin/pgaccess/doc/html/newuser.gif | Bin 0 -> 3965 bytes src/bin/pgaccess/doc/html/old_index.html | 143 ++ src/bin/pgaccess/doc/html/permissions.gif | Bin 0 -> 10414 bytes src/bin/pgaccess/doc/html/pg93patch.html | 25 + src/bin/pgaccess/doc/html/pga-rad.html | 65 + src/bin/pgaccess/doc/html/qbtclet.html | 45 + src/bin/pgaccess/doc/html/qbtclet.tcl | 529 +++++ src/bin/pgaccess/doc/html/screenshots.html | 43 + src/bin/pgaccess/doc/html/specialchars.html | 47 + src/bin/pgaccess/doc/html/todo.html | 11 + src/bin/pgaccess/doc/html/vdesigner.gif | Bin 0 -> 15903 bytes src/bin/pgaccess/doc/html/whatsnew.html | 50 + src/bin/pgaccess/doc/html/win32.html | 45 + src/bin/pgaccess/lib/database.tcl | 61 + src/bin/pgaccess/lib/forms.tcl | 1263 ++++++++++ src/bin/pgaccess/lib/functions.tcl | 181 ++ src/bin/pgaccess/lib/help.tcl | 127 ++ src/bin/pgaccess/lib/mainlib.tcl | 987 ++++++++ src/bin/pgaccess/lib/preferences.tcl | 273 +++ src/bin/pgaccess/lib/qed | 7 + src/bin/pgaccess/lib/queries.tcl | 228 ++ src/bin/pgaccess/lib/reports.tcl | 599 +++++ src/bin/pgaccess/lib/schema.tcl | 585 +++++ src/bin/pgaccess/lib/scripts.tcl | 88 + src/bin/pgaccess/lib/sequences.tcl | 159 ++ src/bin/pgaccess/lib/tables.tcl | 2158 ++++++++++++++++++ src/bin/pgaccess/lib/users.tcl | 155 ++ src/bin/pgaccess/lib/views.tcl | 45 + src/bin/pgaccess/lib/visualqb.tcl | 776 +++++++ src/bin/pgaccess/main.tcl | 250 ++ src/bin/pgaccess/pgaccess | 10 + 55 files changed, 10214 insertions(+) create mode 100644 src/bin/pgaccess/README create mode 100644 src/bin/pgaccess/copyright.html create mode 100644 src/bin/pgaccess/doc/html/a_right.gif create mode 100644 src/bin/pgaccess/doc/html/addindex.gif create mode 100644 src/bin/pgaccess/doc/html/api.html create mode 100644 src/bin/pgaccess/doc/html/ball.gif create mode 100644 src/bin/pgaccess/doc/html/contents.html create mode 100644 src/bin/pgaccess/doc/html/copyright.html create mode 100644 src/bin/pgaccess/doc/html/documentation.html create mode 100644 src/bin/pgaccess/doc/html/download.html create mode 100644 src/bin/pgaccess/doc/html/faq.html create mode 100644 src/bin/pgaccess/doc/html/features.html create mode 100644 src/bin/pgaccess/doc/html/formdemo.sql create mode 100644 src/bin/pgaccess/doc/html/forms.gif create mode 100644 src/bin/pgaccess/doc/html/forms.html create mode 100644 src/bin/pgaccess/doc/html/function.gif create mode 100644 src/bin/pgaccess/doc/html/help.gif create mode 100644 src/bin/pgaccess/doc/html/index.html create mode 100644 src/bin/pgaccess/doc/html/irix.html create mode 100644 src/bin/pgaccess/doc/html/linux1.gif create mode 100644 src/bin/pgaccess/doc/html/maillist.html create mode 100644 src/bin/pgaccess/doc/html/main.html create mode 100644 src/bin/pgaccess/doc/html/mainwindow.gif create mode 100644 src/bin/pgaccess/doc/html/newtable.gif create mode 100644 src/bin/pgaccess/doc/html/newuser.gif create mode 100644 src/bin/pgaccess/doc/html/old_index.html create mode 100644 src/bin/pgaccess/doc/html/permissions.gif create mode 100644 src/bin/pgaccess/doc/html/pg93patch.html create mode 100644 src/bin/pgaccess/doc/html/pga-rad.html create mode 100644 src/bin/pgaccess/doc/html/qbtclet.html create mode 100644 src/bin/pgaccess/doc/html/qbtclet.tcl create mode 100644 src/bin/pgaccess/doc/html/screenshots.html create mode 100644 src/bin/pgaccess/doc/html/specialchars.html create mode 100644 src/bin/pgaccess/doc/html/todo.html create mode 100644 src/bin/pgaccess/doc/html/vdesigner.gif create mode 100644 src/bin/pgaccess/doc/html/whatsnew.html create mode 100644 src/bin/pgaccess/doc/html/win32.html create mode 100644 src/bin/pgaccess/lib/database.tcl create mode 100644 src/bin/pgaccess/lib/forms.tcl create mode 100644 src/bin/pgaccess/lib/functions.tcl create mode 100644 src/bin/pgaccess/lib/help.tcl create mode 100644 src/bin/pgaccess/lib/mainlib.tcl create mode 100644 src/bin/pgaccess/lib/preferences.tcl create mode 100755 src/bin/pgaccess/lib/qed create mode 100644 src/bin/pgaccess/lib/queries.tcl create mode 100644 src/bin/pgaccess/lib/reports.tcl create mode 100644 src/bin/pgaccess/lib/schema.tcl create mode 100644 src/bin/pgaccess/lib/scripts.tcl create mode 100644 src/bin/pgaccess/lib/sequences.tcl create mode 100644 src/bin/pgaccess/lib/tables.tcl create mode 100644 src/bin/pgaccess/lib/users.tcl create mode 100644 src/bin/pgaccess/lib/views.tcl create mode 100644 src/bin/pgaccess/lib/visualqb.tcl create mode 100644 src/bin/pgaccess/main.tcl create mode 100755 src/bin/pgaccess/pgaccess diff --git a/src/bin/pgaccess/README b/src/bin/pgaccess/README new file mode 100644 index 00000000000..69a920ab679 --- /dev/null +++ b/src/bin/pgaccess/README @@ -0,0 +1,82 @@ +--------------------------------------------------------------------------- + +Copyright (c) 1994-7 Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +--------------------------------------------------------------------------- + + +PGACCESS 0.98 29 August 1999 +================================ +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 +time far from them. + + + +1. How to INSTALL ? + +You will need a Tcl/Tk package, at least Tcl 7.6 and Tk 4.2, recommended +Tcl/Tk 8.x + +For Unix users, unpack the pgaccess-xxx.tar.gz archieve in you preferred +directory (usually /usr/local). + +Check where your "wish" program is and modify (if needed) the file +/usr/local/pgaccess/pgaccess and set variables PGACCESS_HOME and +PATH_TO_WISH to the appropriate directories. + +Include the /usr/local/pgaccess directory into your PATH or make a +symbolic link to it wherever you want (in PATH directories). +Example: + +$ ln -s /usr/local/pgaccess/pgaccess /usr/bin/pgaccess + +You will find also some documentation and FAQ in the doc directory. + + + +2. Usage + +You run it with the command: + + pgaccess [database] + +[database] is optional. + + + +3. Bug reporting + +First of all : operating system, PostgreSQL version,Tcl/Tk version. +A more detailed story of what have you done when error occurred. +Tcl/Tk stops usually with a error message and there is a button there +"Stack Trace" and if you press it, you will see a detailed information +about the procedure containing the error. Please send it to me. +Some information about table structure, no. of fields, records would +be also good. + +=========================================================================== +You would find always the latest version at http://www.flex.ro/pgaccess + +Please feel free to e-mail me with any suggestion or bug description +that will help to improve it. + +Constantin Teodorescu + diff --git a/src/bin/pgaccess/copyright.html b/src/bin/pgaccess/copyright.html new file mode 100644 index 00000000000..d67654b88e7 --- /dev/null +++ b/src/bin/pgaccess/copyright.html @@ -0,0 +1,39 @@ + + + + + PgAccess - Copyright notice + + +--------------------------------------------------------------------------- +
  +
  + +

Copyright (c) 1994-7 Regents of the University of California + +

Permission to use, copy, modify, and distribute this software and +its +
documentation for any purpose, without fee, and without a written +agreement +
is hereby granted, provided that the above copyright notice and +this +
paragraph and the following two paragraphs appear in all copies. + +

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY +PARTY FOR +
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +INCLUDING +
LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +
DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED +OF THE +
POSSIBILITY OF SUCH DAMAGE. + +

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +
AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER +IS +
ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS +TO +
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + diff --git a/src/bin/pgaccess/doc/html/a_right.gif b/src/bin/pgaccess/doc/html/a_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..386e27c304feb300eb29248ae887e13fb338bf70 GIT binary patch literal 207 zc-nLKbhEHb6k!lyc+3C-MrVx}{xjUUb7$Yaefs|Xdfnj#4HNe7-_L*zDE?$&WMJT6 z&;fBkW-zeS2%Pj>y;c2nbmz4LfdwAVY9k9{=6MNZMTs~}mHc5aXJeGVlCwgC@rSgA zi790QeC@6iJJcpx&G(NH`j8yA(Z8`FimP^Gl2o`5)10GC0=+c`{13m@{BHMzeSV) literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/addindex.gif b/src/bin/pgaccess/doc/html/addindex.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ff0aa2084e9e573fb2a2de07a40a4bac5075282 GIT binary patch literal 11402 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 Y*T4PWKmO;x{_j8k_rL#_b_f6fJK5uimH+?% literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/api.html b/src/bin/pgaccess/doc/html/api.html new file mode 100644 index 00000000000..7630fd2054d --- /dev/null +++ b/src/bin/pgaccess/doc/html/api.html @@ -0,0 +1,232 @@ + + + + + + + + +

+PgAccess developer API

+ +
+
Starting with PgAccess 0.98 I am planning to make available a complete +API for the PgAccess developers. I plan to make PgAccess not just an administrative +tool, but also a tool for easy build of small applications. +

That's why PgAccess 0.98 has been internally restructured, every main +module of PgAccess has became a namespace (see Tcl namespaces) in order  +to hide the variables and internal procedures to the user. Also, all the +global variables that have been used before were grouped under a single +big associative array called PgAcVar (PgAccess variables) so they +should not interfere with user defined global variables. +
  +
  +

Global variables available +
  +

+ + + + + + + + + + + + + + + + + + + + + + + +
PgAcVarThe main global associative array that hold together various information +needed by PgAccess. User should NOT +alter it under any circumstances.
CurrentDBThe handler of the current opened database. Can be used for database +operations as selects or command execution.
MessagesThe associative array that holds the translation for the current +language. Loaded from the appropriate language file from lib/languages +directory
PGACCESS_HOMEKeep the system directory of PgAccess root installation
+ +
  +

Window naming convention +

Every toplevel window defined by PgAccess has the following naming convention. +Every window name starts with .pgaw (PgAccess window) followed +by a colon and a name. Example: +

.pgaw:User , .pgaw:About , .pgaw:ImportExport
+Namespaces available +

For every tab from the main database window there is a namespace defined +(Tables, Queries, Views, Functions, Sequences, Reports, Forms, Scripts, +Users, Schema). Every namespace has by default the following  procedures: +

    +
  • +new  , no parameter needed
  • + +
  • +open , need a single parameter, the object name
  • + +
  • +design , need a single parameter, the object name
  • +
+You can use these procedures if you want to produce the same efects as +clicking on the desired tab and then on the "New", "Open" or "Design" buttons +from the main database window. +
Example: +
Tables::open "customers" +
Queries::open "Invoices received" +
Forms::open "Add new invoice"
+The Tables::open procedure accepts two optional parameters, filter +and order. +
Example: +
Tables::open "phonebook" "name ~* 'joe'" "age desc"
+will open a table view window with predefined filter "name ~* 'joe'" and +ordered by descending age. +

There is also a special namespace called Database.  Here are some +procedures and functions defined for this namespace available to the user: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameParametersTypeReturnsDescription
vacuumnoneprocedurenothingvacuums the current database
getTablesListnonefunctionlistreturns the list of tables from the current database
executeUpdatesqlcmdfunctionintegerexecute the sqlcmd command on the current database returning +1 if no errors ocurred or 0 if the command failed
+ +

Global functions available +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameParametersDescription
setCursortypeSet the cursor for all PgAccess windows, type of cursor can +be WAIT or CLOCK or WATCH for the hourglass , anything else (or none) to +return to the normal cursor shape
parametermsgShows a modal input dialog with the msg message, wait for user +to enter the data and returns it as a string
showErrormsgShows a modal dialog window with an error message
+ + + diff --git a/src/bin/pgaccess/doc/html/ball.gif b/src/bin/pgaccess/doc/html/ball.gif new file mode 100644 index 0000000000000000000000000000000000000000..02d203471ed785ff5148f6ce7193cee8b248c447 GIT binary patch literal 176 zc-nLKbhEHbwn(@puhMC3;X+Xrl;KK0k-MhPY@9y5c zd)2B{KxO6S<)NXWN=ix$qyWXAEQ}yp2SkAEbYRt0Q0PlCk~wi$ literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/contents.html b/src/bin/pgaccess/doc/html/contents.html new file mode 100644 index 00000000000..971f3f43dce --- /dev/null +++ b/src/bin/pgaccess/doc/html/contents.html @@ -0,0 +1,29 @@ + + + + + + + + +
What is PgAccess? +
What's new? +
Features +
Screenshots +
FAQ +
Documentation +
To-Do list +
Download +
  +


+

+

+ +

Other links +
PostgreSQL +
Visual Tcl +
Tcl/Tk +
Linux +
vTcLava + + diff --git a/src/bin/pgaccess/doc/html/copyright.html b/src/bin/pgaccess/doc/html/copyright.html new file mode 100644 index 00000000000..d67654b88e7 --- /dev/null +++ b/src/bin/pgaccess/doc/html/copyright.html @@ -0,0 +1,39 @@ + + + + + PgAccess - Copyright notice + + +--------------------------------------------------------------------------- +
  +
  + +

Copyright (c) 1994-7 Regents of the University of California + +

Permission to use, copy, modify, and distribute this software and +its +
documentation for any purpose, without fee, and without a written +agreement +
is hereby granted, provided that the above copyright notice and +this +
paragraph and the following two paragraphs appear in all copies. + +

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY +PARTY FOR +
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +INCLUDING +
LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS +
DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED +OF THE +
POSSIBILITY OF SUCH DAMAGE. + +

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +
AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER +IS +
ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS +TO +
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + diff --git a/src/bin/pgaccess/doc/html/documentation.html b/src/bin/pgaccess/doc/html/documentation.html new file mode 100644 index 00000000000..48d3fa5ec14 --- /dev/null +++ b/src/bin/pgaccess/doc/html/documentation.html @@ -0,0 +1,19 @@ + + + + + + + + +

+Documentation

+ +
+

Still need to be written. Some information can be found in the help +included in the main program. +

Jim Lemon <Jim.Lemon@uts.EDU.AU> has started writing a tutorial. +Thought it is based on earlier versions than 0.98 it is a beginning after +all, isn't it ? + + diff --git a/src/bin/pgaccess/doc/html/download.html b/src/bin/pgaccess/doc/html/download.html new file mode 100644 index 00000000000..efbe7bf50aa --- /dev/null +++ b/src/bin/pgaccess/doc/html/download.html @@ -0,0 +1,42 @@ + + + + + + + + +

+Download

+ +
+
The primary site for PgAccess downloads is: + + +

Another one (just with a little bit faster, try this one first) would +be : +

+ +
  + + diff --git a/src/bin/pgaccess/doc/html/faq.html b/src/bin/pgaccess/doc/html/faq.html new file mode 100644 index 00000000000..f66dd8321ac --- /dev/null +++ b/src/bin/pgaccess/doc/html/faq.html @@ -0,0 +1,85 @@ + + + + + + + + +

+PgAccess - FAQ

+ +
+
1. When I run PgAccess I got a message complaining about the crypt +library! What should I do? +
Versions of PostgreSQL prior to 6.5.1 couldn't reliably detect +the presence of the crypt library on RedHat 5.x systems. That's why the +libpgtcl library does not include reference to crypt. You will need to +get a proper copy of libpgtcl.so library or to compile one. Go to the postgresql +source directory into src/interfaces/libpgtcl and edit Makefile adding +-lcrypt to the end of the line SHLIB_LINKS. Make clean and make again. +Your libpgtcl.so is now prepare to run PgAccess. I strongly recommend you +to upgrade to PostgreSQL 6.5.1 where this problem has been solved.
+2. I cannot connect to a database from another machine +
There may be two problems here. First of all, PgAccess running +on the localhost is using two PostgreSQL dependent libraries, libpq and +libpgtcl. Each of them are compiled for a specific PostgreSQL version. +If the PostgreSQL version running on your server is different you might +experience problems. The other problem is related to access rights. On +the PostgreSQL server, in data directory there is a file pg_hba.conf that +will grant access rights to users based on host authentication. Ask your +database administrator to check if your workstation is listed there with +the appropriate access rights. Try for the beginning the 'trust' mode, +allowing full access to the databases.
+3. I am experiencing core dumps when trying to run PgAccess. Is PgAccess +broken? +
No. There were NEVER reported crashes because of PgAccess. +All of them were related to bad libraries usage. The most frequent was +the installing of a new PostgreSQL on a RedHat 5.x server where the postgresql-clients +rpm still exists. So, PgAccess was trying to use the old libpgtcl.so library +suitable for an older version of PostgreSQL. Before installing a new PostgreSQL +(either by compiling it ot by rpm packages) remove ANY TRACE of old PostgreSQL. +PgAccess is fully relying on libpgtcl library in order to get access to +the database so when you are experiencing that kind of problems, double-check +libpq and libpgtcl libraries.
+4. When I try to run PgAccess I get the following error : Application +initialization failed: couldn't connect to display "" +
That kind of error was reported on some Linux RedHat 5.x systems +when user has su - to root and tried to run PgAccess. Some unknown errors +in login scripts are not defining the DISPLAY environment and the wish +application cannot connect to the X display. Try typing export DISPLAY=localhost:0.0 +and run PgAccess again.
+5. Cannot run PgAccess on a Windows machine. +
In order to use PgAccess on Windows you must have installed +two libraries libpq.dll and libpgtcl.dll suitable for your Tcl/Tk package +and your PostgreSQL server. Note that libraries that work with Tcl/Tk 8.0.x +won't work with Tcl/Tk 8.1.x and libraries that work with 6.4.2 backend +won't work with 6.5.x. So, you must properly identify your Tcl/Tk package +version and your PostgreSQL version and download from the Downloads section +(or pick from the win32/dll directory of PgAccess distribution) the right +files. Copy them into your Windows/System directory and try again. Also, +you should be able to access over the network the machine running the PostgreSQL +server (try ping-ing it) and have the proper access rights to the database.
+6. How much costs PgAccess? +
PgAccess is a free tool. You won't have to pay anything in +order to use it. It is protected by the following copyright +as PostgreSQL is. I cannot guarantee technical support but I will try to +answer to your questions as much as I can.
+7. I want to translate PgAccess messages for xxx language. What should +I do? +
In the PgAccess distribution in lib/languages directory there +are files with messages translated for different languages. Copy one of +them and name it after your native language and then start editing it translating +all the messages. Save it into the same directory and that's all. Don't +forget to send me a copy in order to include it into the standard distribution.
+ +


8. I am receiving the following error: message invalid command +name "namespace" while executing "namespace eval Mainlib  ..." +

That means 100% that you have an older version of Tcl/Tk that +don't recognize namespaces command. Please upgrade to Tcl/Tk 8.0.x minimum
+ +
  +
  +
  + + diff --git a/src/bin/pgaccess/doc/html/features.html b/src/bin/pgaccess/doc/html/features.html new file mode 100644 index 00000000000..4531663be38 --- /dev/null +++ b/src/bin/pgaccess/doc/html/features.html @@ -0,0 +1,52 @@ + + + + + + + +Tables +
- opening multiple tables for viewing, max. n records (changed by preferences +menu) +
- column resizing, dragging the vertical grid line (better in table +space rather than in the table header) +
- text wrap in cells - layout saved for every table +
- import/export to external files (SDF,CSV) +
- filter capabilities (enter filter like (price>3.14) +
- sort order capabilities (enter manually the sort field(s)) +
- editing in place +
- improved table generator assistant +
- improved field editing +
Queries +
- define , edit and stores "user defined queries" +
- store queries as views +
- execution of queries with optional user input parameters ( select +* from invoices where year=[parameter "Year of selection"] ) +
- viewing of select type queries result +
- query deleting and renaming +
- visual query builder with drag & drop capabilities. For any of +you who had installed the Tcl/Tk plugin for Netscape Navigator, you can +see it at work clicking here +
Sequences +
- defines sequences, delete them and inspect them +
Functions +
- define, inspect and delete functions in SQL, plpgsql and pgtcl languages +
Reports +
- design and display simple reports from tables +
- fields and labels, font changing, style and size +
- saves and loads report description from database +
- show report previews, sample postscript output file +
Forms +
- open user defined forms +
- form design module available +
- query widget available, controls bound to query results +
- click here for a description of forms and +how they can be used +
Scripts +
- define, modify and call user defined scripts +
Users +
- define and modify user information +

PgAccess API for developing small applications +
  + + diff --git a/src/bin/pgaccess/doc/html/formdemo.sql b/src/bin/pgaccess/doc/html/formdemo.sql new file mode 100644 index 00000000000..73bf1c5027f --- /dev/null +++ b/src/bin/pgaccess/doc/html/formdemo.sql @@ -0,0 +1,216 @@ +\connect - teo +CREATE SEQUENCE "cities_id_seq" start 7 increment 1 maxvalue 2147483647 minvalue 1 cache 1 ; +SELECT nextval ('cities_id_seq'); +CREATE TABLE "pga_queries" ( + "queryname" character varying(64), + "querytype" character, + "querycommand" text, + "querytables" text, + "querylinks" text, + "queryresults" text, + "querycomments" text); +CREATE TABLE "pga_forms" ( + "formname" character varying(64), + "formsource" text); +CREATE TABLE "pga_scripts" ( + "scriptname" character varying(64), + "scriptsource" text); +CREATE TABLE "pga_reports" ( + "reportname" character varying(64), + "reportsource" text, + "reportbody" text, + "reportprocs" text, + "reportoptions" text); +CREATE TABLE "phonebook" ( + "name" character varying(32), + "phone_nr" character varying(16), + "city" character varying(32), + "company" bool, + "continent" character varying(16)); +CREATE TABLE "pga_layout" ( + "tablename" character varying(64), + "nrcols" int2, + "colnames" text, + "colwidth" text); +CREATE TABLE "pga_schema" ( + "schemaname" character varying(64), + "schematables" text, + "schemalinks" text); +REVOKE ALL on "pga_schema" from PUBLIC; +GRANT ALL on "pga_schema" to PUBLIC; +CREATE TABLE "cities" ( + "id" int4 DEFAULT nextval('"cities_id_seq"') NOT NULL, + "name" character varying(32) NOT NULL, + "prefix" character varying(16) NOT NULL); +CREATE FUNCTION "getcityprefix" (int4 ) RETURNS varchar AS 'select prefix from cities where id = $1 ' LANGUAGE 'SQL'; +COPY "pga_queries" FROM stdin; +Query that can be saved as view S select * from phonebook where continent='usa' \N \N \N \N +\. +COPY "pga_forms" FROM stdin; +Working with Tables namespace f3 13 {3 4 5 6 7 9 10 11 12 13} 377x263+59+127 {radio usa {36 24 138 36} {} USA selcont} {radio europe {36 45 141 60} {} Europe selcont} {radio africa {36 66 147 81} {} Africa selcont} {label label6 {9 99 339 114} {} {Select one of the above continents and press} {}} {button button7 {270 93 354 117} {Tables::open phonebook "continent='$selcont'" $selorder} {Show them} {}} {button button9 {66 189 312 213} {Tables::design phonebook} {Show me the phonebook table structure} {}} {button button10 {141 228 240 252} {destroy .f3} {Close the form} {}} {button button11 {93 141 282 165} {Tables::open phonebook "company=true"} {Show me only the companies} {}} {radio name {183 24 261 36} {} {Order by name} selorder} {radio phone_nr {183 45 267 57} {} {Order by phone number} selorder} +A simple demo form asdf 14 {FS {set color none}} 370x310+50+75 {label label1 {15 36 99 57} {} {Selected color} {} label1 flat #000000 #d9d9d9 1} {entry entry2 {111 36 225 54} {} entry2 color entry2 sunken #000000 #fefefe 1} {radio red {249 21 342 36} {} {Red as cherry} color red flat #900000 #d9d9d9 1} {radio green {249 45 342 60} {} {Green as a melon} color green flat #008800 #d9d9d9 1} {radio blue {249 69 342 84} {} {Blue as the sky} color blue flat #00008c #d9d9d9 1} {button button6 {45 69 198 99} {set color spooky} {Set a weird color} {} button6 ridge #0000b0 #dfbcdf 2} {label label7 {24 129 149 145} {} {The checkbox's value} {} label7 flat #000000 #d9d9d9 1} {entry entry8 {162 127 172 145} {} entry8 cbvalue entry8 sunken #000000 #fefefe 1} {checkbox checkbox9 {180 126 279 150} {} {Check me :-)} cbvalue checkbox9 flat #000000 #d9d9d9 1} {button button10 {219 273 366 303} {destroy .asdf} {Close that simple form} {} button10 raised #000000 #d9d9d9 1} {button button11 {219 237 366 267} {Forms::open "Phone book"} {Open my phone book} {} button11 raised #000000 #d9d9d9 1} {listbox lb {12 192 162 267} {} listbox12 {} lb sunken #000000 #fefefe 1} {button button13 {12 156 162 186} {.asdf.lb insert end red green blue cyan white navy black purple maroon violet} {Add some information} {} button13 raised #000000 #d9d9d9 1} {button button14 {12 273 162 303} {.asdf.lb delete 0 end} {Clear this listbox} {} button14 raised #000000 #d9d9d9 1} +Working with listboxes f2 5 {FS {set thestudent ""}} 257x263+139+147 {listbox lb {6 6 246 186} {} listbox1 {} lb sunken #000000 #ffffd4 1} {button button2 {9 234 124 258} {# Populate the listbox with some data\ +#\ +\ +foreach student {John Bill Doe Gigi} {\ +\ .f2.lb insert end $student\ +}\ +\ +\ +\ +# Binding the event left button release to the\ +# list box\ +\ +bind .f2.lb {\ +\ set idsel [.f2.lb curselection]\ +\ if {$idsel!=""} {\ +\ \ set thestudent [.f2.lb get $idsel]\ +\ }\ +}\ +\ +# Cleaning the variable thestudent\ +\ +set thestudent {}} {Show students} {} button2 groove #000000 #d9d9d9 2} {button button3 {132 234 247 258} {destroy .f2} {Close the form} {} button3 groove #000000 #d9d9d9 1} {label label4 {9 213 119 228} {} {You have selected} {} label4 flat #000000 #d9d9d9 1} {label label5 {129 213 219 228} {} {} thestudent label5 flat #00009a #d9d9d9 1} +The simplest form mf 5 {FS {set thename {}}} 306x136+82+146 {label label {42 45 99 60} {} Name {} label flat #000000 #d9d9d9 1 {Helvetica 12 bold italic}} {entry ename {120 42 219 63} {} entry2 thename ename sunken #000000 #fefefe 1 n} {button button3 {6 96 108 129} {set thename Teo} {Set the name} {} button3 raised #000000 #d9d9d9 1 n} {button button4 {192 96 300 129} {destroy .mf} {Close the form} {} button4 raised #000000 #d9d9d9 1 n} {button button5 {114 96 186 129} {set thename {}} {Clear it} {} button5 raised #000000 #d9d9d9 1 n} +Full featured form full 21 {FS {set entrydemo {nice}\ +set color {no color selected}}} 377x418+50+130 {label label1 {3 396 165 411} {} {Status line} {} {} sunken #000000 #d9d9d9 2 n} {label label2 {171 396 369 411} {} {Grooved status line} {} {} groove #000098 #d9d9d9 2 f} {label label3 {108 9 270 31} {} { Full featured form} {} {} ridge #000000 #d9d9d9 4 {Times 16 bold italic}} {button button4 {15 210 144 243} {.full.lb insert end {it's} a nice demo form} {Java style button} {} {} groove #6161b6 #d9d9d9 2 b} {label label5 {15 42 115 58} {} {Java style label} {} {} flat #6161b6 #d9d9d9 1 b} {entry entry6 {123 39 279 60} {} entry6 entrydemo {} groove #000000 #fefefe 2 {Courier 13}} {listbox lb {12 69 147 201} {} listbox8 {} {} ridge #000000 #ffffc8 2 n} {button button9 {18 264 39 282} {} 1 {} {} flat #000000 #d9d9d9 1 n} {button button10 {48 264 68 282} {} 2 {} {} flat #000000 #d9d9d9 1 n} {button button11 {78 264 234 282} {} {and other hidden buttons} {} {} flat #000000 #d9d9d9 1 n} {text txt {153 69 372 201} {} text12 {} {} sunken #000000 #d4ffff 1 n} {button button13 {150 210 369 243} {.full.txt tag configure bold -font {Helvetica 12 bold}\ +.full.txt tag configure italic -font {Helvetica 12 italic}\ +.full.txt tag configure large -font {Helvetica -14 bold}\ +.full.txt tag configure title -font {Helvetica 12 bold italic} -justify center\ +.full.txt tag configure link -font {Helvetica -12 underline} -foreground #000080\ +.full.txt tag configure code -font {Courier 13}\ +.full.txt tag configure warning -font {Helvetica 12 bold} -foreground #800000\ +\ +# That't the way help files are written\ +\ +.full.txt delete 1.0 end\ +.full.txt insert end {Centered title} {title} "\ +\ +You can make different " {} "portions of text bold" {bold} " or italic " {italic} ".\ +Some parts of them can be written as follows" {} "\ +SELECT * FROM PHONEBOOK" {code} "\ +You can also change " {} "colors for some words " {warning} "or underline them" {link} } {Old style button} {} {} raised #000000 #d9d9d9 2 n} {checkbox checkbox14 {48 297 153 309} {} different {} {} flat #00009c #d9d9d9 1 b} {checkbox checkbox15 {48 321 156 336} {} {fonts and} {} {} flat #cc0000 #d9d9d9 1 i} {checkbox checkbox16 {48 345 156 360} {} colors {} {} flat #00b600 #dfb2df 1 f} {radio radio17 {207 297 330 315} {} {red , rosu , rouge} color red flat #9c0000 #d9d9d9 1 n} {radio radio18 {207 321 324 333} {} {green , verde , vert} color green flat #009000 #d9d9d9 1 n} {radio radio19 {207 345 327 363} {} {blue , albastru, bleu} color blue flat #000000 #d9d9d9 1 n} {label selcolor {210 369 345 384} {} {} color {} flat #000000 #d9d9d9 1 n} {button button21 {285 258 363 285} {destroy .full} Exit {} {} raised #7c0000 #dfdbb8 1 b} +Phone book pb 28 {FS {}} 444x307+284+246 {label label1 {33 10 68 28} {} Name {} label1 flat #000000 #d9d9d9 1 n} {entry name_entry {87 9 227 27} {} entry2 DataSet(.pb.qs,name) name_entry sunken #000000 #fefefe 1 n} {label label3 {33 37 73 52} {} Phone {} label3 flat #000000 #d9d9d9 1 n} {entry entry4 {87 36 195 54} {} entry4 DataSet(.pb.qs,phone_nr) entry4 sunken #000000 #fefefe 1 n} {label label5 {33 64 78 82} {} City {} label5 flat #000000 #d9d9d9 1 n} {entry entry6 {87 63 195 81} {} entry6 DataSet(.pb.qs,city) entry6 sunken #000000 #fefefe 1 n} {query qs {3 6 33 33} {} query7 {} qs flat {} {} 1 n} {button button8 {174 177 246 203} {namespace eval DataControl(.pb.qs) {\ +\ setSQL "select oid,* from phonebook where name ~* '$what' order by name"\ +\ open\ +\ set nrecs [getRowCount]\ +\ updateDataSet\ +\ fill .pb.allnames name\ +\ bind .pb.allnames {\ +\ set ancr [.pb.allnames curselection]\ +\ if {$ancr!=""} {\ +\ \ DataControl(.pb.qs)::moveTo $ancr\ +\ \ DataControl(.pb.qs)::updateDataSet\ +\ }\ +\ }\ +}} {Start search} {} button8 raised #000000 #d9d9d9 1 n} {button button9 {363 276 433 300} {DataControl(.pb.qs)::close\ +DataControl(.pb.qs)::clearDataSet\ +set nrecs {}\ +set what {}\ +destroy .pb\ +} Exit {} button9 raised #000000 #d9d9d9 2 n} {button button10 {291 237 313 257} {namespace eval DataControl(.pb.qs) {\ +\ moveFirst\ +\ updateDataSet\ +}\ +} |< {} button10 ridge #000092 #d9d9d9 2 n} {button button11 {324 237 346 257} {namespace eval DataControl(.pb.qs) {\ +\ movePrevious\ +\ updateDataSet\ +}\ +} << {} button11 ridge #000000 #d9d9d9 2 n} {button button12 {348 237 370 257} {namespace eval DataControl(.pb.qs) {\ +\ moveNext\ +\ updateDataSet\ +}} >> {} button12 ridge #000000 #d9d9d9 2 n} {button button13 {381 237 403 257} {namespace eval DataControl(.pb.qs) {\ +\ moveLast\ +\ updateDataSet\ +}\ +} >| {} button13 ridge #000088 #d9d9d9 2 n} {checkbox checkbox14 {33 87 126 105} {} {Is it a company ?} DataSet(.pb.qs,company) checkbox14 flat #000000 #d9d9d9 1 n} {radio usa {63 108 201 120} {} U.S.A. DataSet(.pb.qs,continent) usa flat #000000 #d9d9d9 1 n} {radio europe {63 126 204 141} {} Europe DataSet(.pb.qs,continent) europe flat #000000 #d9d9d9 1 n} {radio africa {63 144 210 159} {} Africa DataSet(.pb.qs,continent) africa flat #000000 #d9d9d9 1 n} {entry entry18 {129 180 169 198} {} entry18 what entry18 sunken #000000 #fefefe 1 n} {label label19 {108 219 188 234} {} {records found} {} label19 flat #000000 #d9d9d9 1 n} {label label20 {90 219 105 234} {} { } nrecs label20 flat #000000 #d9d9d9 1 n} {label label21 {3 252 33 267} {} OID= {} label21 flat #000000 #d9d9d9 1 n} {label label22 {39 252 87 267} {} { } pbqs(oid) label22 flat #000000 #d9d9d9 1 n} {button button23 {9 276 79 300} {set oid {}\ +catch {set oid $DataSet(.pb.qs,oid)}\ +if {[string trim $oid]!=""} {\ + sql_exec noquiet "update phonebook set name='$DataSet(.pb.qs,name)', phone_nr='$DataSet(.pb.qs,phone_nr)',city='$DataSet(.pb.qs,city)',company='$DataSet(.pb.qs,company)',continent='$DataSet(.pb.qs,continent)' where oid=$oid"\ +} else {\ + tk_messageBox -title Error -message "No record is displayed!"\ +}\ +\ +} Update {} button23 raised #000000 #d9d9d9 1 n} {button button24 {210 276 280 300} {set thisname $DataSet(.pb.qs,name)\ +if {[string trim $thisname] != ""} {\ +\ sql_exec noquiet "insert into phonebook values (\ +\ \ '$DataSet(.pb.qs,name)',\ +\ \ '$DataSet(.pb.qs,phone_nr)',\ +\ \ '$DataSet(.pb.qs,city)',\ +\ \ '$DataSet(.pb.qs,company)',\ +\ \ '$DataSet(.pb.qs,continent)'\ +\ )"\ +\ tk_messageBox -title Information -message "A new record has been added!"\ +} else {\ +\ tk_messageBox -title Error -message "This one doesn't have a name?"\ +}\ +\ +} {Add record} {} button24 raised #000000 #d9d9d9 1 n} {button button25 {141 276 204 300} {DataControl(.pb.qs)::clearDataSet\ +# clearcontrols stillinitialise\ +# incorectly booleans controls to {}\ +# so I force it to 'f' (false)\ +set DataSet(.pb.qs,company) f\ +focus .pb.name_entry} {Clear all} {} button25 raised #000000 #d9d9d9 1 n} {listbox allnames {249 6 435 231} {} listbox26 {} allnames sunken #000000 #fefefe 1 n} {label label27 {33 252 90 267} {} {} DataSet(.pb.qs,oid) label27 flat #000000 #d9d9d9 1 n} {label label28 {3 182 128 197} {} {Find name containing} {} {} flat #000000 #d9d9d9 1 n} +\. +COPY "pga_scripts" FROM stdin; +How are forms keeped inside ? Tables::open pga_forms\ +\ +\ +\ + +Opening a table with filters Tables::open phonebook "name ~* 'e'" "name desc"\ +\ +\ + +Autoexec Mainlib::tab_click Forms\ +Forms::open {Full featured form}\ +\ +\ + +\. +COPY "pga_reports" FROM stdin; +My phone book phonebook set PgAcVar(report,tablename) "phonebook" ; set PgAcVar(report,y_rpthdr) 21 ; set PgAcVar(report,y_pghdr) 47 ; set PgAcVar(report,y_detail) 66 ; set PgAcVar(report,y_pgfoo) 96 ; set PgAcVar(report,y_rptfoo) 126 ; .pgaw:ReportBuilder.c create text 10 35 -font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -anchor nw -text {name} -tags {t_l mov ro} ; .pgaw:ReportBuilder.c create text 10 52 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -anchor nw -text {name} -tags {f-name t_f rg_detail mov ro} ; .pgaw:ReportBuilder.c create text 141 36 -font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -anchor nw -text {city} -tags {t_l mov ro} ; .pgaw:ReportBuilder.c create text 141 51 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -anchor nw -text {city} -tags {f-city t_f rg_detail mov ro} ; .pgaw:ReportBuilder.c create text 231 35 -font -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* -anchor nw -text {phone_nr} -tags {t_l mov ro} ; .pgaw:ReportBuilder.c create text 231 51 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -anchor nw -text {phone_nr} -tags {f-phone_nr t_f rg_detail mov ro} \N \N +\. +COPY "phonebook" FROM stdin; +FIAT 623463445 t europe +Gelu Voican 01-32234 Bucuresti f europe +Radu Vasile 01-5523423 Bucuresti f europe +MUGADUMBU SRL +92 534662634 Cairo t africa +Jimmy Page 66323452 f europe +IBM 623346234 \N t usa +John Doe +44 35 2993825 Washington f usa +Bill Clinton +44 35 9283845 New York f usa +Monica Levintchi +44 38 5234526 Dallas f usa +Bill Gates +42 64 4523454 Los Angeles f usa +COMPAQ 623462345 \N t usa +SUN 784563253 \N t usa +DIGITAL 922644516 \N t usa +Frank Zappa 6734567 Montreal f usa +Constantin Teodorescu +40 39 611820 Braila f europe +Ngbendu Wazabanga 34577345 f africa +Mugabe Kandalam 7635745 f africa +Vasile Lupu 52345623 Bucuresti f europe +Gica Farafrica +42 64 4523454 Los Angeles f usa +Victor Ciorbea 634567 Bucuresti f europe +\. +COPY "pga_layout" FROM stdin; +pga_forms 2 formname formsource 82 713 +Usaisti 5 name phone_nr city company continent 150 150 150 150 150 +q1 5 name phone_nr city company continent 150 150 150 150 150 +view_saved_from_that_query 5 name phone_nr city company continent 150 150 150 150 150 +phonebook 5 name phone_nr city company continent 150 105 80 66 104 +Query that can be saved as view 5 name phone_nr city company continent 150 150 150 150 150 +cities 3 id name prefix 150 150 150 +\. +COPY "pga_schema" FROM stdin; +Simple schema cities 10 10 phonebook 201.0 84.0 {cities name phonebook city} +\. +COPY "cities" FROM stdin; +3 Braila 4039 +4 Galati 4036 +5 Dallas 5362 +6 Cairo 9352 +1 Bucuresti 4013 +7 Montreal 5325 +\. +CREATE UNIQUE INDEX "cities_id_key" on "cities" using btree ( "id" "int4_ops" ); diff --git a/src/bin/pgaccess/doc/html/forms.gif b/src/bin/pgaccess/doc/html/forms.gif new file mode 100644 index 0000000000000000000000000000000000000000..947d920b04b475628599d8d586d8eff253588553 GIT binary patch literal 20106 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 literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/forms.html b/src/bin/pgaccess/doc/html/forms.html new file mode 100644 index 00000000000..57ecff52fcb --- /dev/null +++ b/src/bin/pgaccess/doc/html/forms.html @@ -0,0 +1,203 @@ + + + + + + + + +

+FORMS

+ +
+

This version (0.97) of PgAccess has changed the form API : variable +handling, query results interface and control bindings naming convention. +Please read it carefully, download the database demo and practice a while +before trying to design your own forms. +

For the moment, it has only some basic widgets : labels, entries, buttons +, listboxes , checkboxes and radiobuttons. +

Also there is a pseudo data control widget that allows you yo have access +to a query results. +

How do you generate widgets : +

    +
  1. +select a widget from the toolbox by clicking the appropriate radiobutton
  2. + +
  3. +move to the canvas , point with the mouse at the desired location and click +the mouse button to begin
  4. + +
  5. +keeping the mouse-button pressed move the mouse in order to draw a rectangle +that will hold the widget
  6. + +
  7. +release the mouse-button
  8. +
+In the rectangle that you have designed it will appear the selected object. +
Move now to the attribute window to change some of its properties. +

Renaming, resizing items are possible (for the moment) only by modifying +appropriate parameters in attribute window. You must press Enter +in the edit field after changing a value in order to be accepted. +

You can also move items by dragging them or delete them by pressing +Del key after selecting them. +

In attribute window, there are some fields named Command +and +Variable. +

The field Command have meaning +only for Button widgets and holds the command that will be invoked when +the button is pressed. +

    The field Variable have +meaning only for EditField , Label widgets , checkboxes and radiobuttons +and it is the name of the global variable that will hold the value for +that widget. For checkboxes the values are t and f (from +true and false) in order to simplify binding to logical data fields (PgAccess +0.82 used 0 and 1). +

    For radiobuttons, it is usual to assign the same +variable to the same radiobuttons within the same group. That variable +will contain the name of the widget of the radiobutton that has been pressed. +Let's presume that you have entered 3 radiobuttons named red, green and +blue, all of them having the same variable named color. If you will press +them, they will assign their names to global variable. +

    In order to make a simple test, put an entry field +and set it's variable to v1 and a button who's command is "set v1 +whisky". Press the button "Test form" and click on the button. In that +entry should appear whisky. +
Another test is defining in Script module a script called "My first +script" having the following commands: +
tk_messageBox -title Warning -message "This is my +first message!" +
and then define a button who's command is execute_script +"My first script". +
  +

+Database manipulation

+Let's presume that our form have the internal name mf (my +form). Don't forget that the Tk window names could not start with +an uppercase letter. +
The window will be referred inside the Tcl/Tk source as .mf +
If you want to close the form in run-time you have to issue the command +destroy +.mf +

Also, any widget created inside this window (form) will have the name +prefixed by .mf ,so we will have .mf.button1 +or .mf.listbox1 . +

We can name the data control widget dc for example. +The fully qualified name for that "virtual widget" will be .mf.dc +then. A new namespace called DataControl(.mf.dc) will be +automatically defined. +
The Command property of the data control widget must +contain the SQL command that will be executed. +
When the form will be in run-time, automatically you will have access +to the following procedures and functions from the namespace: +

open - opens the connection and execute the query (returns +nothing) +
setSQL newsql - set the command query that will be +executed at the next open +
getRowCount - returns the number of records of the +result set +
getRowIndex - returns the current record number inside +the result set +
getFieldList - returns a Tcl list containing the fields +names from the current result set +
moveFirst - move the cursor to the first record in +the recordset +
moveLast , moveNext , movePrevious- +moves the cursor there +
moveTo newrecno - move the cursor to that new record +number (first is 0) +
updateDataSet - update the variables inside the designed +form that have a particular name (I'll explain later) +
clearDataSet - clear the associated DataSet variables +
fill listbox field - fill the named listbox (whole +widget name as .mf.listbox1) with the all the values of +that field from the current result set +
close - close the result set (if +you don't close it, you will loose some memory) +

These procedures and functions should be called in the normal Tcl namespace +mode as in the following example: +

DataControl(.mf.dc)::setSQL "select * from phonebook" +
DataControl(.mf.dc)::open +
set nrecs [DataControl(.mf.dc)::getRowCount] +

If you complaint about writting to many DataControl(...) you can include +many commands into a single namespace eval as in the following example +: +

namespace eval DataControl(.mf.dc) { +
    setSQL "select * from phonebook" +
    open +
    set nrecs [getRowCount] +
    moveLast +
    updateDataSet +
} +

It's no need to close a query-result set if you want to assign it a +new SQL command and open it again. That will be done automatically releasing +the memory used for the last result set. +
Opening a new DataControl will automatically position the current +row index of the result set on the first row (index 0) and will define +a new global associative array named DataSet that will hold data +from the current row. The key into that array will be the fully qualified +name of the data control widget followed by a comma and the name of every +field in the selected rows. +

Example: +
DataSet(.mf.dc,name) +
DataSet(.mf.dc,city) +

If you want to bound some controls to the fields of the recordset, you +will have to name their associate variable like that : +

DataSet(.mf.dc,salary) to get the "salary" field , or +DataSet(.mf.dc,name) to get the "name" field. Using the +data control procedures DataControl(.mf.dc)::moveNext or +movePrevious will automatically update the DataSet(.mf.dc,...) +array so the database information from entries in the form will be refreshed. +
  +

Here it is a dumped sample database +that contains a demo database. What should you do ? +
Shift-click the above URL in order to download that tiny file (4 Kb). +Create a empty database and psql yourdatabase <formdemo.sql +

You should find a single table called "phonebook" a form called "Phone +book" and another "A simple demo form". +

First of all enter and view the phonebook table in table view. Note +the fields and their values. +
Open the "Phone book" form and enter a letter (a, e or i) in the field +to the left of "Find" button then press Find. It's fine to enter one letter +in order to get more records in query result. You will get information +about the number of records selected, in the listbox you will see all the +values of field "name" from the current data set. Use buttons to move to +first, next, previous or last record within the record set. +

In order to add a new record, press the "New" button in order to get +new, clean entries. Fill them with your data and press "Add new" button. +A new phonebook record will be added. Also, if you want to update a record, +change it's values in the displayed fields after finding it and press "Update" +button. The values will be updated in the database BUT NOT IN THE CURRENT +QUERY RESULT . If you want to see them modified, make a new query trying +to find it again. +

Before using the results from a query you should +know that the information that has been retrieved could be found only in +your computer client memory. It has no live connection to the data +from the database. That's why it isn't possible to develop a simple update +function as interface to that query-result widget. More than that : a query +result could be obtained from a SQL command that return a non-updatable +data set !!! For example fields gathered from multiple tables or summary +fields. It isn't just simple to make an automatic update procedure. The +programmer must know how to make the update or the append procedure, sometimes +using key fields to point to the desired record or an OID. There are examples +in the demo database in "Phone book" form. It may be possible that in the +future, I will develop another pseudo-widget describing a table. It would +be more simple than to implement an update or append or even a delete procedure. +

There is in the demo database also another simple form called "A simple +demo form". It will show you how to handle variables from checkboxes, radiobuttons, +how to use listboxes, open another forms and so on. I think they will help +you. +

In order to avoid naming user defined forms with  a particular +name of another PgAccess form, I would recommend naming them as udf0, udf1 +(user defined form 0 , 1 ) +

+


+

Please feel free to send me your opinion at teo@flex.ro on forms +designing and usage. +

KEEP IN MIND !       +THE FORM API MAY CHANGE IN ORDER TO BE MORE SIMPLE AND BETTER! +
SEND ME YOUR WISHES, YOUR IDEAS, YOUR OPINIONS ! +
ALSO ... DON'T BLAME ME IF YOU WILL HAVE TO RE-DESIGN +YOUR OLD FORMS DUE TO SOME INCOMPATIBILITIES WITH NEWER PGACCESS VERSIONS. + + diff --git a/src/bin/pgaccess/doc/html/function.gif b/src/bin/pgaccess/doc/html/function.gif new file mode 100644 index 0000000000000000000000000000000000000000..51634e5df9d585ddbe8b221a3fab4280e6b2abc0 GIT binary patch literal 10022 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 literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/help.gif b/src/bin/pgaccess/doc/html/help.gif new file mode 100644 index 0000000000000000000000000000000000000000..f08fee8fd38d3e566718d8da06a16cd7d813eadc GIT binary patch literal 7082 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 UBOddp$2?k(d4BvOAVUBEI}YDhP5=M^ literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/index.html b/src/bin/pgaccess/doc/html/index.html new file mode 100644 index 00000000000..7ccda192907 --- /dev/null +++ b/src/bin/pgaccess/doc/html/index.html @@ -0,0 +1,11 @@ + + +PgAccess + + + + + + + + diff --git a/src/bin/pgaccess/doc/html/irix.html b/src/bin/pgaccess/doc/html/irix.html new file mode 100644 index 00000000000..b678458569e --- /dev/null +++ b/src/bin/pgaccess/doc/html/irix.html @@ -0,0 +1,133 @@ + + + + PgAccess on Irix + + + + +

INSTALLING PgAccess UNDER IRIX 5.3. +

+ +

This HOWO-TO make PgAccess working under Irix +is written by Stuart Rison

+ +

These are the steps that I had to follow to get pgaccess to run on an +INDIGO2 running postgreSQL 6.3.2 under IRIX 5.3. I make no guarantee whatsoever +that the same step will work for others but at least it should point you +in the right direction. Also, I am a biologist by training so I only got +pgaccess working by fudging (that is, trial and error) this means that +some of the steps may be unnecessary (e.g. compiling $postgreSQL_source/src/interfaces/libpgtcl +as both a shared and static library) and they certainly haven't been optimised +(I know nothing about compiler switches etc.).

+ +

1) Requirements:

+ + + +

2) Installation:

+ +

a) tcl/tk:

+ + + +

b) postgreSQL:

+ + + +

c) Compiling libpgtcl:

+ + + +

d) running pgaccess:

+ + + +

e) et voila!

+ +

3) Concluding remarks:

+ + + +

Good luck

+ +

Stuart Rison LICR University College London London W1P 8BT
+stuart@ludwig.ucl.ac.uk

+ + + diff --git a/src/bin/pgaccess/doc/html/linux1.gif b/src/bin/pgaccess/doc/html/linux1.gif new file mode 100644 index 0000000000000000000000000000000000000000..b98ac024d735a911da2481054ac9af3ed448282b GIT binary patch literal 789 zc-nLKbhEHbj9`#wXklRZ4+Lk<{GU1VKZEfZAV^C)V{Ci|$Yx-e2?WN*GZ}!0Aq@nK z(-?q=!59P>j2S>I20}pbpS)A0f_G|JW}bpaX?jL#v5rDEh?n7znpvWkoS(~}15yWa zjsxp|1;xIU%y}8B*5#}=b8%HE5mikN;yE1ju+xpzE#rZbD1&a%Y||-+J0@Q1=ny*5 zHj!0%U4l{6p|;)c_ET^X4<_=_9VCn-lM3o0QqHQi z^?LSECr)_yn4L+nJd+nHdd25t)U}Z7^XnGmt42?#R!wTY-}*eJpurR-X*@@Ou>ta3ARc zr&Mjxq9)O)|6@unX+NHaw)Xb+g2$)kdT-B*nf2+@ ztGVVcrIx5ODLhDhF1{dSYlGXj%mjvm4Ry_tES*}-eUs(=531Iwnl(0aiYoXh6s)=^ zuQB}?&zi&2J_+{+3oOo>rNfp!X|uqJg-RLRLR0%A(p;?qPwU@eQf}YdyMBq(a);no zhi(+H9Z%S2H2*`>pZSku&h?Are5&465P#@s&8vG`B%Gf;P<$lxZP_0$=kl&OMshw= zF5SF)Q_Lqsq-DFCZr*{3g5_e-4hJWCrM&&fQN2}Dy~$T7Y{3C0o*xC?l2Vx;olQ># z6i<*bUm$YDNk_r)Y_~zsk^3nxB+LbjwjY?Wz*s+O>!~;gwv*yvDN`Rztv8aH+!3+# s$B7g{2VWyk85NI%ED_?fT2pyuNItvYn%R5k+BAKR%x5##0<(cN0IqF6T>t<8 literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/maillist.html b/src/bin/pgaccess/doc/html/maillist.html new file mode 100644 index 00000000000..4e0ce850c96 --- /dev/null +++ b/src/bin/pgaccess/doc/html/maillist.html @@ -0,0 +1,43 @@ + + + + + + + + +

The mailing list for PgAccess is :       pgsql-interfaces@postgresql.org

+ +

If you have some questions regarding PgAccess you should mail to this +address. I will also answer to messages addresed directly to me but it +would be better to post your messages here because it might be possible +to get an answer quickly from another user of PgAccess.

+ +

+


+ +

To subscribe please send a mail message to :

+ +

     pgsql-interfaces-request@postgresql.org + 

+ +

having a single line in the body message :      subscribe

+ +

In a couple of minutes , if everything is ok, you must receive something +like that :

+ +

+


+ +

Welcome to the pgsql-interfaces mailing list!

+ +

Please save this message for future reference. Thank you.

+ +

If you ever want to remove yourself from this mailing list, you +can send mail to <Majordomo@hub.org> with the following command in +the body of your email message:

+ +

unsubscribe pgsql-interfaces yourname@yourdomain

+ + + diff --git a/src/bin/pgaccess/doc/html/main.html b/src/bin/pgaccess/doc/html/main.html new file mode 100644 index 00000000000..2bddfd61d4a --- /dev/null +++ b/src/bin/pgaccess/doc/html/main.html @@ -0,0 +1,34 @@ + + + + + + + + +

+PgAccess +

+A free graphical database management tool for PostgreSQL. +PgAccess has been written by Constantin Teodorescu +using Visual Tcl, the best tool for developing Tcl/Tk applications I've +ever seen. +

Last version +
Last stable version is 0.98 , released on 29 August 1999. Read what's +new in 0.98. +

Portability issues +
PgAccess is available for every platform where PostgreSQL was ported +and where a Tcl/Tk package is available. PgAccess has been reported running +on : +
- Linux +
- FreeBSD +
- Solaris +
- HPUX +
- Irix +
- Windows 95,98,NT +

PgAccess needs Tcl/Tk versions 8.0.x and higher thought PgAccess. For +win32 platforms there are some special DLL's that have to be downloaded +and installed, more information here. +

PgAccess is protected by the following copyright. + + diff --git a/src/bin/pgaccess/doc/html/mainwindow.gif b/src/bin/pgaccess/doc/html/mainwindow.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a48792d194b5230566665f2e00725f1fb6ace27 GIT binary patch literal 8857 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 bW~EkcC0BN(SAHc}hNW1JC0QOt0000x^?_;D literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/newtable.gif b/src/bin/pgaccess/doc/html/newtable.gif new file mode 100644 index 0000000000000000000000000000000000000000..891d05698f9d32750cf9bfd6e755b312103e61e6 GIT binary patch literal 9317 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

Ge1znX7lh|JYIgx3rz)cnm)7|x$E&g7hg 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 X7}~T>`?OFSwNg8^R67X*Apih7So?qE literal 0 Hc-jL100001 diff --git a/src/bin/pgaccess/doc/html/old_index.html b/src/bin/pgaccess/doc/html/old_index.html new file mode 100644 index 00000000000..4bbf11fcf07 --- /dev/null +++ b/src/bin/pgaccess/doc/html/old_index.html @@ -0,0 +1,143 @@ + + + + + + PgAccess - a Tcl/Tk PostgreSQL interface + + + +

+PgAccess - a free database management tool for PostgreSQL

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


    Latest stable version of PgAccess is 0.97 , released 16 August 1999 +! +

    PgAccess 0.93 and higher will not work from the beginning +with PostgreSQL 6.3.x !! +
    Read here how to apply a +simple patch in order to make it work !

    + +
    + + + + + + + + + + + +
    NEWInternational version +(english, french, italian, romanian)
    NEWContext sensitive Help
    + +
    +

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

    + +

    +Installation problems

    + + + +

    +What does PgAccess now!

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

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

    Here is a special section concerning forms and +scripts . +

    This program is protected by the following copyright +

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

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

    +


    +

    +More information about libpgtcl - downloads

    +     Also, you will need the PostgreSQL to Tcl interface +library, lined as a Tcl/Tk 'load'-able module. It is called libpgtcl and +the source is located in the PostgreSQL directory /src/interfaces/libpgtcl. +Specifically, you will need a libpgtcl library that is 'load'-able from +Tcl/Tk.      This is technically different from +an ordinary PostgreSQL loadable object file, because libpgtcl is a collection +of object files. Under Linux, this is called libpgtcl.so. +

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

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

        PostgreSQL 6.4 release has a minor bug. I does not +include by default the crypt lib when compiling libpgtcl. So, you will +need to manually add a -lcrypt to SHLIB line in Makefile in src/interfaces/libpgtcl +and then make clean and make again. The new libpgtcl.so library is properly +configured to run pgaccess. +
      + + diff --git a/src/bin/pgaccess/doc/html/permissions.gif b/src/bin/pgaccess/doc/html/permissions.gif new file mode 100644 index 0000000000000000000000000000000000000000..06c43491e07da0fe7a9fd7bb63f23eaf2aff968a GIT binary patch literal 10414 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 + + + + + + + +

    +PgAccess 0.93 patch to make it work with PostgreSQL 6.3.x +

    + +


    PgAccess 0.93 is working fine with PostgreSQL 6.4.x due to some +changes in libpgtcl ! +

    There is a small patch that you have to make in order to make it work +with 6.3.x ! +

    Replace in procedure wpg_exec the following line: +

    set pgsql(errmsg) [pg_result $pgsql(res) -error] +

    with this one : +

    set pgsql(errmsg) "NO ERROR INFORMATION SUPPLIED" +

    And it will work fine! In some error cases, you will not get the appropriate +error message from libpgtcl. +

     Back + + diff --git a/src/bin/pgaccess/doc/html/pga-rad.html b/src/bin/pgaccess/doc/html/pga-rad.html new file mode 100644 index 00000000000..7564cf7b553 --- /dev/null +++ b/src/bin/pgaccess/doc/html/pga-rad.html @@ -0,0 +1,65 @@ + + + + + + + +

    +PgAccess - Scripts and Forms  +

    +Beginning with 0.70 version, I have introduced in PgAccess two new modules +for operating with scripts and forms. + +

       This would give to PgAccess the power of creating application +directly into PgAccess, defining new modules, procedures, forms and possibly +making it a rapid development tool for PostgreSQL. The "scripts" and "forms" +modules are using two new tables called pga_forms and pga_scripts. PgAccess +take care of creating them if user is opening a new database and grant +ALL permissions on them to PUBLIC. +
      +
       Of course, when Designing a script, a simple text editor +is opened and text is saved as is in pga_scripts table. When "designing" +a form, a "form editor" that would be very similar with "Visual Tcl" is +invoked. + +

       This mechanism and the extremely versatile scripting mode +of Tcl/Tk would give PgAccess a great power for creating end user application +using PostgreSQL. The most important thing is that the user could call +procedures and functions that I have used for building up PgAccess ! +

    +Forms

    +   Forms are used for creating windows and placing widgets inside +it. When PgAccess interpret them, a new window appear, with buttons as +defined that could call "user defined scripts", "user defined procedures" +or "internal PgAccess procedures". +
       Forms can hold all the widgets allowed in Tcl/Tk , buttons, +check-boxes, radio-buttons, list-boxes, frames, canvases, etc. With these +forms, you can control your application so PgAccess would become just a +"shell", a startup point for you applications. See the  special +section concerning forms. +

    +Scripts

    +   Scripts are normal Tcl/Tk code that is interpreted by Tcl/Tk. +You can define your own procedures inside a script called "Library" for +example. You can call your procedures from within another script, from +another procedure. +
       The most important thing is that you have total access +to the PgAccess core of functions and procedures used by me in building +PgAccess as an application. Just write open_table +"Your sample table" and you'll see the result. +
       If you are writing a script called "Autoexec" then it +will be executed every time the database is opened. You can put inside +different commands that you want to be executed such as : running scripts +that would define your own procedures such as execute_script +"My own procedure library" or open a form with open_form +"Main window with menu buttons" , and so on. + +

    +


    +
    Remember : I'm waiting your messages at teo@flex.ro + +

    +


    + + diff --git a/src/bin/pgaccess/doc/html/qbtclet.html b/src/bin/pgaccess/doc/html/qbtclet.html new file mode 100644 index 00000000000..b990c0f15c3 --- /dev/null +++ b/src/bin/pgaccess/doc/html/qbtclet.html @@ -0,0 +1,45 @@ + + + Visual Query Builder in Tcl/Tk + +

    Visual Query Builder

    +
    +This visual query builder is included in +PgAccess, a visual interface to + PostgreSQL written entirely in +vTcl , (Visual Tcl). + + +

    + + + +

    + +
    + + +Visual Query Designer demo
    +Click here to download the source +created by Constantin Teodorescu with vTcl (visual Tcl), teo@flex.ro +
    +Facitilies
    + - drag and drop selection of fields
    + - drag and drop fields from a table to another do create links
    + - move table position by dragging
    + - point and click any link or table then press delete to delete them
    + - modify sort order by clicking on (unsorted)
    + - enter filter conditions as criteria (>2000 , ='item')
    + - easy panning of table and result panels
    + - show SQL command
    +
    +If you want to use it for your database, modify ql_read_struct in order to read + your table structure. +
    +Feel free to use, modify or copy this software for non-commercial purposes.
    +In any other case, please contact me. +
    +FLEX Consulting Braila, ROMANIA is able to deliver high end interfaces +and any other commercial products written in Tcl/Tk just like that you have seen. + + diff --git a/src/bin/pgaccess/doc/html/qbtclet.tcl b/src/bin/pgaccess/doc/html/qbtclet.tcl new file mode 100644 index 00000000000..9d086a33900 --- /dev/null +++ b/src/bin/pgaccess/doc/html/qbtclet.tcl @@ -0,0 +1,529 @@ +################################# +# GLOBAL VARIABLES +# +global qlvar; +global widget; + +################################# +# USER DEFINED PROCEDURES +# +proc init {argc argv} { +global qlvar +set qlvar(yoffs) 360 +set qlvar(xoffs) 50 +set qlvar(reswidth) 150 +} + +init $argc $argv + +proc main {argc argv} { + +} + +proc show_message {usrmsg} { +global msg +set msg $usrmsg +after 2000 {set msg {}} +} + +proc ql_delete_object {} { +global qlvar +# Checking if there +set obj [.c find withtag hili] +if {$obj==""} return +if {[ql_get_tag_info $obj link]=="s"} { +# if {[tk_messageBox -title WARNING -icon question -message "Remove link ?" -type yesno -default no]=="no"} return + show_message "Deleting the link from tables ..." + set linkid [ql_get_tag_info $obj lkid] + set qlvar(links) [lreplace $qlvar(links) $linkid $linkid] + .c delete links + ql_draw_links +} else { + set tablename [ql_get_tag_info $obj tab] + if {$tablename==""} return +# if {[tk_messageBox -title WARNING -icon question -message "Remove table $tablename from query ?" -type yesno -default no]=="no"} return + show_message "Deleting table from query ..." + for {set i [expr [llength $qlvar(restables)]-1]} {$i>=0} {incr i -1} { + if {$tablename==[lindex $qlvar(restables) $i]} { + set qlvar(resfields) [lreplace $qlvar(resfields) $i $i] + set qlvar(restables) [lreplace $qlvar(restables) $i $i] + set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $i $i] + } + } + for {set i [expr [llength $qlvar(links)]-1]} {$i>=0} {incr i -1} { + set thelink [lindex $qlvar(links) $i] + if {($tablename==[lindex $thelink 0]) || ($tablename==[lindex $thelink 2])} { + set qlvar(links) [lreplace $qlvar(links) $i $i] + } + } + .c delete tab$tablename + .c delete links + ql_draw_links + ql_draw_res_panel +} +} + +proc ql_dragit {w x y} { +global draginfo +if {"$draginfo(obj)" != ""} { + set dx [expr $x - $draginfo(x)] + set dy [expr $y - $draginfo(y)] + if {$draginfo(is_a_table)} { + set taglist [.c gettags $draginfo(obj)] + set tabletag [lindex $taglist [lsearch -regexp $taglist "^tab"]] + $w move $tabletag $dx $dy + ql_draw_links + } else { + $w move $draginfo(obj) $dx $dy + } + set draginfo(x) $x + set draginfo(y) $y +} +} + +proc ql_dragstart {w x y} { +global draginfo +catch {unset draginfo} +set draginfo(obj) [$w find closest $x $y] +if {[ql_get_tag_info $draginfo(obj) r]=="ect"} { + # If it'a a rectangle, exit + set draginfo(obj) {} + return +} +. configure -cursor hand1 +.c raise $draginfo(obj) +set draginfo(table) 0 +if {[ql_get_tag_info $draginfo(obj) table]=="header"} { + set draginfo(is_a_table) 1 + .c itemconfigure [.c find withtag hili] -fill black + .c dtag [.c find withtag hili] hili + .c addtag hili withtag $draginfo(obj) + .c itemconfigure hili -fill blue +} else { + set draginfo(is_a_table) 0 +} +set draginfo(x) $x +set draginfo(y) $y +set draginfo(sx) $x +set draginfo(sy) $y +} + +proc ql_dragstop {x y} { +global draginfo qlvar +. configure -cursor top_left_arrow +set este {} +catch {set este $draginfo(obj)} +if {$este==""} return +# Re-establish the normal paint order so +# information won't be overlapped by table rectangles +# or link linkes +.c lower $draginfo(obj) +.c lower rect +.c lower links +set qlvar(panstarted) 0 +if {$draginfo(is_a_table)} { + set draginfo(obj) {} + .c delete links + ql_draw_links + return +} +.c move $draginfo(obj) [expr $draginfo(sx)-$x] [expr $draginfo(sy)-$y] +if {($y>$qlvar(yoffs)) && ($x>$qlvar(xoffs))} { + # Drop position : inside the result panel + # Compute the offset of the result panel due to panning + set resoffset [expr [lindex [.c bbox resmarker] 0]-$qlvar(xoffs)] + set newfld [.c itemcget $draginfo(obj) -text] + set tabtag [ql_get_tag_info $draginfo(obj) tab] + set col [expr int(($x-$qlvar(xoffs)-$resoffset)/$qlvar(reswidth))] + set qlvar(resfields) [linsert $qlvar(resfields) $col $newfld] + set qlvar(ressort) [linsert $qlvar(ressort) $col unsorted] + set qlvar(rescriteria) [linsert $qlvar(rescriteria) $col {}] + set qlvar(restables) [linsert $qlvar(restables) $col $tabtag] + ql_draw_res_panel +} else { + # Drop position : in the table panel + set droptarget [.c find overlapping $x $y $x $y] + set targettable {} + foreach item $droptarget { + set targettable [ql_get_tag_info $item tab] + set targetfield [ql_get_tag_info $item f-] + if {($targettable!="") && ($targetfield!="")} { + set droptarget $item + break + } + } + # check if target object isn't a rectangle + if {[ql_get_tag_info $droptarget rec]=="t"} {set targettable {}} + if {$targettable!=""} { + # Target has a table + # See about originate table + set sourcetable [ql_get_tag_info $draginfo(obj) tab] + if {$sourcetable!=""} { + # Source has also a tab .. tag + set sourcefield [ql_get_tag_info $draginfo(obj) f-] + if {$sourcetable!=$targettable} { + lappend qlvar(links) [list $sourcetable $sourcefield $targettable $targetfield $draginfo(obj) $droptarget] + ql_draw_links + } + } + } +} +# Erase information about onbject beeing dragged +set draginfo(obj) {} +} + +proc ql_draw_links {} { +global qlvar +.c delete links +set i 0 +foreach link $qlvar(links) { + # Compute the source and destination right edge + set sre [lindex [.c bbox tab[lindex $link 0]] 2] + set dre [lindex [.c bbox tab[lindex $link 2]] 2] + # Compute field bound boxes + set sbbox [.c bbox [lindex $link 4]] + set dbbox [.c bbox [lindex $link 5]] + # Compute the auxiliary lines + if {[lindex $sbbox 2] < [lindex $dbbox 0]} { + # Source object is on the left of target object + set x1 $sre + set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2] + .c create line $x1 $y1 [expr $x1+10] $y1 -tags [subst {links lkid$i}] -width 3 + set x2 [lindex $dbbox 0] + set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2] + .c create line [expr $x2-10] $y2 $x2 $y2 -tags {links} -width 3 + .c create line [expr $x1+10] $y1 [expr $x2-10] $y2 -tags [subst {links lkid$i}] -width 2 + } else { + # source object is on the right of target object + set x1 [lindex $sbbox 0] + set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2] + .c create line $x1 $y1 [expr $x1-10] $y1 -tags [subst {links lkid$i}] -width 3 + set x2 $dre + set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2] + .c create line $x2 $y2 [expr $x2+10] $y2 -width 3 -tags [subst {links lkid$i}] + .c create line [expr $x1-10] $y1 [expr $x2+10] $y2 -tags [subst {links lkid$i}] -width 2 + } + incr i +} +.c lower links +.c bind links {ql_link_click %x %y} +} + +proc ql_draw_lizzard {} { +global qlvar +ql_read_struct +.c delete all +set posx 20 +for {set it 0} {$it<$qlvar(ntables)} {incr it} { + ql_draw_table $it +# set posy 10 +# set tablename $qlvar(tablename$it) +# .c create text $posx $posy -text $tablename -anchor nw -tags [subst {tab$tablename f-oid mov tableheader}] -font -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* +# incr posy 16 +# foreach fld $qlvar(tablestruct$it) { +# .c create text $posx $posy -text $fld -anchor nw -tags [subst {f-$fld tab$tablename mov}] -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +# incr posy 14 +# } +# set reg [.c bbox tab$tablename] +# .c create rectangle [lindex $reg 0] [lindex $reg 1] [lindex $reg 2] [lindex $reg 3] -fill #EEEEEE -tags [subst {rect tab$tablename}] +# .c create line [lindex $reg 0] [expr [lindex $reg 1]+15] [lindex $reg 2] [expr [lindex $reg 1]+15] -tags [subst {rect tab$tablename}] +# set posx [expr $posx+40+[lindex $reg 2]-[lindex $reg 0]] +} +.c lower rect +.c create line 0 $qlvar(yoffs) 10000 $qlvar(yoffs) -width 3 +.c create rectangle 0 $qlvar(yoffs) 10000 5000 -fill #FFFFFF +for {set i [expr 15+$qlvar(yoffs)]} {$i<500} {incr i 15} { + .c create line $qlvar(xoffs) $i 10000 $i -fill #CCCCCC -tags {resgrid} +} +for {set i $qlvar(xoffs)} {$i<10000} {incr i $qlvar(reswidth)} { + .c create line $i [expr 1+$qlvar(yoffs)] $i 10000 -fill #cccccc -tags {resgrid} +} +# Make a marker for result panel offset calculations (due to panning) +.c create line $qlvar(xoffs) $qlvar(yoffs) $qlvar(xoffs) 500 -tags {resmarker resgrid} +.c create rectangle 0 $qlvar(yoffs) $qlvar(xoffs) 5000 -fill #EEEEEE -tags {reshdr} +.c create text 5 [expr 1+$qlvar(yoffs)] -text Field: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} +.c create text 5 [expr 16+$qlvar(yoffs)] -text Table: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} +.c create text 5 [expr 31+$qlvar(yoffs)] -text Sort: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} +.c create text 5 [expr 46+$qlvar(yoffs)] -text Criteria: -anchor nw -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -tags {reshdr} +.c bind mov {ql_dragstart %W %x %y} +.c bind mov {ql_dragit %W %x %y} +bind . {ql_dragstop %x %y} +bind . {qlc_click %x %y %W} +bind . {ql_pan %x %y} +bind . {ql_delete_object} +set qlvar(resfields) {} +set qlvar(ressort) {} +set qlvar(rescriteria) {} +set qlvar(restables) {} +set qlvar(critedit) 0 +set qlvar(links) {} +set qlvar(linktodelete) {} +} + +proc ql_draw_res_panel {} { +global qlvar +# Compute the offset of the result panel due to panning +set resoffset [expr [lindex [.c bbox resmarker] 0]-$qlvar(xoffs)] + .c delete resp + for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} { + .c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 1+$qlvar(yoffs)] -text [lindex $qlvar(resfields) $i] -anchor nw -fill navy -tags {resf resp} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + .c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 16+$qlvar(yoffs)] -text [lindex $qlvar(restables) $i] -anchor nw -tags {resp rest} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + .c create text [expr $resoffset+4+$qlvar(xoffs)+$i*$qlvar(reswidth)] [expr 31+$qlvar(yoffs)] -text [lindex $qlvar(ressort) $i] -anchor nw -tags {resp sort} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + if {[lindex $qlvar(rescriteria) $i]!=""} { + .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}] + } + } + .c raise reshdr + .c bind sort {ql_swap_sort %W %x %y} +} + +proc ql_draw_table {it} { +global qlvar + +set posy 10 +set allbox [.c bbox rect] +if {$allbox==""} {set posx 10} else {set posx [expr 20+[lindex $allbox 2]]} +set tablename $qlvar(tablename$it) +.c create text $posx $posy -text $tablename -anchor nw -tags [subst {tab$tablename f-oid mov tableheader}] -font -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* +incr posy 16 +foreach fld $qlvar(tablestruct$it) { + .c create text $posx $posy -text $fld -anchor nw -tags [subst {f-$fld tab$tablename mov}] -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + incr posy 14 +} +set reg [.c bbox tab$tablename] +.c create rectangle [lindex $reg 0] [lindex $reg 1] [lindex $reg 2] [lindex $reg 3] -fill #EEEEEE -tags [subst {rect tab$tablename}] +.c create line [lindex $reg 0] [expr [lindex $reg 1]+15] [lindex $reg 2] [expr [lindex $reg 1]+15] -tags [subst {rect tab$tablename}] +} + +proc ql_get_tag_info {obj prefix} { +set taglist [.c gettags $obj] +set tagpos [lsearch -regexp $taglist "^$prefix"] +if {$tagpos==-1} {return ""} +set thattag [lindex $taglist $tagpos] +return [string range $thattag [string length $prefix] end] +} + +proc ql_link_click {x y} { +global qlvar + +set obj [.c find closest $x $y 1 links] +if {[ql_get_tag_info $obj link]!="s"} return +.c itemconfigure [.c find withtag hili] -fill black +.c dtag [.c find withtag hili] hili +.c addtag hili withtag $obj +.c itemconfigure $obj -fill blue +} + +proc ql_pan {x y} { +global qlvar +set panstarted 0 +catch {set panstarted $qlvar(panstarted) } +if {!$panstarted} return +set dx [expr $x-$qlvar(panstartx)] +set dy [expr $y-$qlvar(panstarty)] +set qlvar(panstartx) $x +set qlvar(panstarty) $y +if {$qlvar(panobject)=="tables"} { + .c move mov $dx $dy + .c move links $dx $dy + .c move rect $dx $dy +} else { + .c move resp $dx 0 + .c move resgrid $dx 0 + .c raise reshdr +} +} + +proc ql_read_struct {} { +global qlvar + +set qlvar(ntables) 3 +set qlvar(tablename0) Facturi +set qlvar(tablename1) Nommat +set qlvar(tablename2) Incasari +set qlvar(tablestruct0) [list factura client valoare tva] +set qlvar(tablestruct1) [list cod denumire pret greutate procent_tva] +set qlvar(tablestruct2) [list data valoare nrdoc referinta] +} + +proc ql_show_sql {} { +global qlvar + +set sqlcmd "select " +for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} { + if {$sqlcmd!="select "} {set sqlcmd "$sqlcmd, "} + set sqlcmd "$sqlcmd[lindex $qlvar(restables) $i].[lindex $qlvar(resfields) $i]" +} +set tables {} +for {set i 0} {$i<$qlvar(ntables)} {incr i} { + lappend tables $qlvar(tablename$i) +} +set sqlcmd "$sqlcmd from [join $tables ,] " +set sup1 {} +if {[llength $qlvar(links)]>0} { + set sup1 "where " + foreach link $qlvar(links) { + if {$sup1!="where "} {set sup1 "$sup1 and "} + set sup1 "$sup1 ([lindex $link 0].[lindex $link 1]=[lindex $link 2].[lindex $link 3])" + } +} +for {set i 0} {$i<[llength $qlvar(resfields)]} {incr i} { + set crit [lindex $qlvar(rescriteria) $i] + if {$crit!=""} { + if {$sup1==""} {set sup1 "where "} + if {[string range $sup1 0 4]=="where"} {set sup1 "$sup1 and "} + set sup1 "$sup1 ([lindex $qlvar(restables) $i].[lindex $qlvar(resfields) $i]$crit) " + } +} +set sqlcmd "$sqlcmd $sup1" +set sup2 {} +for {set i 0} {$i<[llength $qlvar(ressort)]} {incr i} { + set how [lindex $qlvar(ressort) $i] + if {$how!="unsorted"} { + if {$how=="Ascending"} {set how asc} else {set how desc} + if {$sup2==""} {set sup2 " order by "} else {set sup2 "$sup2,"} + set sup2 "$sup2 [lindex $qlvar(resfields) $i] $how " + } +} +set sqlcmd "$sqlcmd $sup2" +set qlvar(sql) $sqlcmd +#tk_messageBox -message $sqlcmd +.c delete sqlpage +.c create rectangle 0 0 2000 [expr $qlvar(yoffs)-1] -fill #ffffff -tags {sqlpage} +.c create text 10 10 -text $sqlcmd -anchor nw -width 550 -tags {sqlpage} -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +.c bind sqlpage {.c delete sqlpage} +} + +proc ql_swap_sort {w x y} { +global qlvar +set obj [$w find closest $x $y] +set taglist [.c gettags $obj] +if {[lsearch $taglist sort]==-1} return +set cum [.c itemcget $obj -text] +if {$cum=="unsorted"} { + set cum Ascending +} elseif {$cum=="Ascending"} { + set cum Descending +} else { + set cum unsorted +} +set col [expr int(($x-$qlvar(xoffs))/$qlvar(reswidth))] +set qlvar(ressort) [lreplace $qlvar(ressort) $col $col $cum] +.c itemconfigure $obj -text $cum +} + +proc qlc_click {x y w} { +global qlvar +set qlvar(panstarted) 0 +if {$w==".c"} { + set canpan 1 + if {$y<$qlvar(yoffs)} { + if {[llength [.c find overlapping $x $y $x $y]]!=0} {set canpan 0} + set qlvar(panobject) tables + } else { + set qlvar(panobject) result + } + if {$canpan} { + . configure -cursor hand1 + set qlvar(panstartx) $x + set qlvar(panstarty) $y + set qlvar(panstarted) 1 + } +} +set isedit 0 +catch {set isedit $qlvar(critedit)} +# Compute the offset of the result panel due to panning +set resoffset [expr [lindex [.c bbox resmarker] 0]-$qlvar(xoffs)] +if {$isedit} { + set qlvar(rescriteria) [lreplace $qlvar(rescriteria) $qlvar(critcol) $qlvar(critcol) $qlvar(critval)] + .c delete cr-c$qlvar(critcol)-r$qlvar(critrow) + .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)}] + set qlvar(critedit) 0 +} +catch {destroy .entc} +if {$y<[expr $qlvar(yoffs)+46]} return +if {$x<[expr $qlvar(xoffs)+5]} return +set col [expr int(($x-$qlvar(xoffs)-$resoffset)/$qlvar(reswidth))] +if {$col>=[llength $qlvar(resfields)]} return +set nx [expr $col*$qlvar(reswidth)+8+$qlvar(xoffs)+$resoffset] +set ny [expr $qlvar(yoffs)+76] +# Get the old criteria value +set qlvar(critval) [lindex $qlvar(rescriteria) $col] +entry .entc -textvar qlvar(critval) -borderwidth 0 -background #FFFFFF -highlightthickness 0 -selectborderwidth 0 -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* +place .entc -x $nx -y $ny -height 14 +focus .entc +bind .entc {set qlvar(panstarted) 0} +set qlvar(critcol) $col +set qlvar(critrow) 0 +set qlvar(critedit) 1 +} + +proc Window {args} { +global vTcl + set cmd [lindex $args 0] + set name [lindex $args 1] + set newname [lindex $args 2] + set rest [lrange $args 3 end] + if {$name == "" || $cmd == ""} {return} + if {$newname == ""} { + set newname $name + } + set exists [winfo exists $newname] + switch $cmd { + show { + if {$exists == "1" && $name != "."} {wm deiconify $name; return} + if {[info procs vTclWindow(pre)$name] != ""} { + eval "vTclWindow(pre)$name $newname $rest" + } + if {[info procs vTclWindow$name] != ""} { + eval "vTclWindow$name $newname $rest" + } + if {[info procs vTclWindow(post)$name] != ""} { + eval "vTclWindow(post)$name $newname $rest" + } + } + hide { if $exists {wm withdraw $newname; return} } + iconify { if $exists {wm iconify $newname; return} } + destroy { if $exists {destroy $newname; return} } + } +} + + + set base "" + bind $base { + ql_pan %x %y + } + bind $base { + qlc_click %x %y %W + } + bind $base { + ql_dragstop %x %y + } + bind $base { + ql_delete_object + } + canvas $base.c \ + -background #fefefe -borderwidth 2 -height 207 -relief ridge \ + -takefocus 0 -width 295 + label $base.msg -textvar msg -borderwidth 1 -relief sunken + button $base.b2 \ + -borderwidth 1 -command ql_draw_lizzard \ + -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -pady 3 -text {Paint demo tables} + button $base.showbtn \ + -borderwidth 1 -command ql_show_sql \ + -font -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* -padx 9 \ + -pady 3 -text {Show SQL} + ################### + # SETTING GEOMETRY + ################### + place $base.c \ + -x 5 -y 30 -width 578 -height 425 -anchor nw -bordermode ignore + place $base.b2 \ + -x 5 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.showbtn \ + -x 130 -y 5 -height 26 -anchor nw -bordermode ignore + place $base.msg \ + -x 5 -y 460 -width 578 -anchor nw + +main $argc $argv diff --git a/src/bin/pgaccess/doc/html/screenshots.html b/src/bin/pgaccess/doc/html/screenshots.html new file mode 100644 index 00000000000..0cf3ac6b65b --- /dev/null +++ b/src/bin/pgaccess/doc/html/screenshots.html @@ -0,0 +1,43 @@ + + + + + + + + +

    +Image gallery +

    + + + + + diff --git a/src/bin/pgaccess/doc/html/specialchars.html b/src/bin/pgaccess/doc/html/specialchars.html new file mode 100644 index 00000000000..b6b82f2336a --- /dev/null +++ b/src/bin/pgaccess/doc/html/specialchars.html @@ -0,0 +1,47 @@ + + + + Special locale characters + + + + +

    Special locale characters and PgAccess +

    + +

    The problem is related with some special characters used in different +countries because PgAccess did not use fonts with `-ISO8859-1' encoding +--

    + +

    The sollution was proposed by H.P.Heidinger ( hph@hphbbs.ruhr.de) and +it's very simple.

    + +

    If you look into PgAccess, you will find fonts declared as follows :

    + +

    $ grep -e '-font' -i pgaccess.tcl
    +-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \
    +-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \
    +-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \
    +-font -Adobe-Helvetica-Medium-R-Normal--*-120-*-*-*-*-*-* \

    + +

    It should be something like: -adobe-helvetica-medium-r-normal-*-*-120-*-*-*-*-iso8859-1

    + +

    You can achieve this by running the following script :

    + +

    #!/bin/sh
    +cp pgaccess.tcl pgaccess.tcl-org
    +cat pgaccess.tcl |\
    +sed -e's/\-\*\-\*\ /\-iso8859\-1\ /g' |\
    +sed -e's/\-\*\-\*\}/\-iso8859\-1}/g' |\
    +sed -e's/\-\*\-\*\]/\-iso8859\-1]/g' |\
    +sed -e's/\-\*\-\*$/\-iso8859\-1/g' |\
    +sed -e's/\-Clean\-/\-Fixed\-/g' |\
    +sed -e's/clean/fixed/g' >pgaccess.iso
    +mv pgaccess.iso pgaccess.tcl
    +chmod +x pgaccess.tcl

    + +

    The final version of PgAccess (1.0) will let the user decide what fonts +will be used through a "preferences" dialog window.

    + + + diff --git a/src/bin/pgaccess/doc/html/todo.html b/src/bin/pgaccess/doc/html/todo.html new file mode 100644 index 00000000000..f19b61ab90c --- /dev/null +++ b/src/bin/pgaccess/doc/html/todo.html @@ -0,0 +1,11 @@ + + +

    ToDo List


    + - Finish the report generator module
    + - Enhance the form designer
    + - Enhance the scripts module
    + - Translations in other languages
    +
    +Please send any suggestions by mail to Constantin Teodorescu. + + diff --git a/src/bin/pgaccess/doc/html/vdesigner.gif b/src/bin/pgaccess/doc/html/vdesigner.gif new file mode 100644 index 0000000000000000000000000000000000000000..71349e6daf4c52b8d64a14c05ccdecfa24c735ef GIT binary patch literal 15903 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 + + + + + + +29 August 1999 - PgAccess 0.98 has been released! +
      +
    • +international version (romanian, french, italian translations available) +in separate files (japanese translation now possible)
    • + +
    • +context sensitive help, complete help for SQL commands
    • + +
    • +geometry changes for many forms
    • + +
    • +form designer enhancements (widget icons , new attribute window style, +form startup script)
    • + +
    • +ability to inspect PostgreSQL system tables (preferences)
    • + +
    • +enhanced table design window, table permissions
    • + +
    • +distribution archive changes
    • + +
    • +unified internal global variables
    • + +
    • +unified internal window naming conventions
    • + +
    • +usage of Tcl namespaces for all modules
    • + +
    • +PgAccess developer API
    • + +
    • +web site enhancements
    • +
    + + + diff --git a/src/bin/pgaccess/doc/html/win32.html b/src/bin/pgaccess/doc/html/win32.html new file mode 100644 index 00000000000..368eb9990eb --- /dev/null +++ b/src/bin/pgaccess/doc/html/win32.html @@ -0,0 +1,45 @@ + + + + + + + + +

    +PgAccess on Win32

    + +
    In order to run PgAccess on a Win32 workstation you should follow the +following steps: +
      +
    1. +download and install a Tcl/Tk package from Scriptics +(8.0.x or 8.1.x)
    2. + +
    3. +install PgAccess package
    4. + +
    5. +check the Tcl/Tk version that you have
    6. + +
    7. +check the PostgreSQL version installed on your database server machine
    8. + +
    9. +get from win32/dll directory the appropriate libraries suitable for your +Tcl/Tk version and PostgreSQL version and copy them into your Windows/System +directory renaming them as libpq.dll and libpgtcl.dll
    10. + +
    11. +check if your win32 workstation is able to see your database server (ping +yourdatabaseserver)
    12. + +
    13. +ask your database administrator to verify if your win32 workstation has +access rights to the database (pg_hba.conf)
    14. +
    + +


    You should be able to run PgAccess. +
      + + diff --git a/src/bin/pgaccess/lib/database.tcl b/src/bin/pgaccess/lib/database.tcl new file mode 100644 index 00000000000..828baf09920 --- /dev/null +++ b/src/bin/pgaccess/lib/database.tcl @@ -0,0 +1,61 @@ +namespace eval Database { + +proc {getTablesList} {} { +global CurrentDB PgAcVar + set tlist {} + if {[catch { + wpg_select $CurrentDB "select c.relname,count(c.relname) from pg_class C, pg_rewrite R where (r.ev_class = C.oid) and (r.ev_type = '1') group by relname" rec { + if {$rec(count)!=0} { + set itsaview($rec(relname)) 1 + } + } + if {! $PgAcVar(pref,systemtables)} { + wpg_select $CurrentDB "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') order by relname" rec { + if {![regexp "^pga_" $rec(relname)]} then { + if {![info exists itsaview($rec(relname))]} { + lappend tlist $rec(relname) + } + } + } + } else { + wpg_select $CurrentDB "select relname from pg_class where (relkind='r') order by relname" rec { + if {![info exists itsaview($rec(relname))]} { + lappend tlist $rec(relname) + } + } + } + } gterrmsg]} { + showError $gterrmsg + } + return $tlist +} + + +proc {vacuum} {} { +global PgAcVar CurrentDB + if {$CurrentDB==""} return; + set PgAcVar(statusline,dbname) [format [intlmsg "vacuuming database %s ..."] $PgAcVar(currentdb,dbname)] + setCursor CLOCK + set pgres [wpg_exec $CurrentDB "vacuum;"] + catch {pg_result $pgres -clear} + setCursor DEFAULT + set PgAcVar(statusline,dbname) $PgAcVar(currentdb,dbname) +} + + +proc {getPgType} {oid} { +global CurrentDB + set temp "unknown" + wpg_select $CurrentDB "select typname from pg_type where oid=$oid" rec { + set temp $rec(typname) + } + return $temp +} + + +proc {executeUpdate} {sqlcmd} { +global CurrentDB + return [sql_exec noquiet $sqlcmd] +} + +} diff --git a/src/bin/pgaccess/lib/forms.tcl b/src/bin/pgaccess/lib/forms.tcl new file mode 100644 index 00000000000..631c3537c72 --- /dev/null +++ b/src/bin/pgaccess/lib/forms.tcl @@ -0,0 +1,1263 @@ +namespace eval Forms { + +proc {new} {} { +global PgAcVar + Window show .pgaw:FormDesign:menu + tkwait visibility .pgaw:FormDesign:menu + Window show .pgaw:FormDesign:toolbar + tkwait visibility .pgaw:FormDesign:toolbar + Window show .pgaw:FormDesign:attributes + tkwait visibility .pgaw:FormDesign:attributes + Window show .pgaw:FormDesign:draft + design:init +} + + +proc {open} {formname} { + forms:load $formname run + design:run +} + +proc {design} {formname} { + forms:load $formname design +} + + +proc {design:change_coords} {} { +global PgAcVar + set PgAcVar(fdvar,dirty) 1 + set i $PgAcVar(fdvar,attributeFrame) + if {$i == 0} { + # it's the form + set errmsg "" + if {[catch {wm geometry .pgaw:FormDesign:draft $PgAcVar(fdvar,c_width)x$PgAcVar(fdvar,c_height)+$PgAcVar(fdvar,c_left)+$PgAcVar(fdvar,c_top)} errmsg] != 0} { + showError $errmsg + } + return + } + set c [list $PgAcVar(fdvar,c_left) $PgAcVar(fdvar,c_top) [expr $PgAcVar(fdvar,c_left)+$PgAcVar(fdvar,c_width)] [expr $PgAcVar(fdvar,c_top)+$PgAcVar(fdvar,c_height)]] + set PgAcVar(fdobj,$i,coord) $c + .pgaw:FormDesign:draft.c delete o$i + design:draw_object $i + design:draw_hookers $i +} + + +proc {design:delete_object} {} { +global PgAcVar + set i $PgAcVar(fdvar,moveitemobj) + .pgaw:FormDesign:draft.c delete o$i + .pgaw:FormDesign:draft.c delete hook + set j [lsearch $PgAcVar(fdvar,objlist) $i] + set PgAcVar(fdvar,objlist) [lreplace $PgAcVar(fdvar,objlist) $j $j] + set PgAcVar(fdvar,dirty) 1 +} + + +proc {design:draw_hook} {x y} { + .pgaw:FormDesign:draft.c create rectangle [expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2] -fill black -tags hook +} + + +proc {design:draw_hookers} {i} { +global PgAcVar + foreach {x1 y1 x2 y2} $PgAcVar(fdobj,$i,coord) {} + .pgaw:FormDesign:draft.c delete hook + design:draw_hook $x1 $y1 + design:draw_hook $x1 $y2 + design:draw_hook $x2 $y1 + design:draw_hook $x2 $y2 +} + + +proc {design:draw_grid} {} { + for {set i 0} {$i<100} {incr i} { + .pgaw:FormDesign:draft.c create line 0 [expr {$i*6}] 1000 [expr {$i*6}] -fill #afafaf -tags grid + .pgaw:FormDesign:draft.c create line [expr {$i*6}] 0 [expr {$i*6}] 1000 -fill #afafaf -tags grid + } +} + + +proc {design:draw_object} {i} { +global PgAcVar +set c $PgAcVar(fdobj,$i,coord) +foreach {x1 y1 x2 y2} $c {} +.pgaw:FormDesign:draft.c delete o$i +set wfont $PgAcVar(fdobj,$i,font) +switch $wfont { + {} {set wfont $PgAcVar(pref,font_normal) ; set PgAcVar(fdobj,$i,font) normal} + normal {set wfont $PgAcVar(pref,font_normal)} + bold {set wfont $PgAcVar(pref,font_bold)} + italic {set wfont $PgAcVar(pref,font_italic)} + fixed {set wfont $PgAcVar(pref,font_fix)} +} +switch $PgAcVar(fdobj,$i,class) { + button { + design:draw_rectangle $x1 $y1 $x2 $y2 $PgAcVar(fdobj,$i,relief) $PgAcVar(fdobj,$i,bcolor) o$i + .pgaw:FormDesign:draft.c create text [expr ($x1+$x2)/2] [expr ($y1+$y2)/2] -fill $PgAcVar(fdobj,$i,fcolor) -text $PgAcVar(fdobj,$i,label) -font $wfont -tags o$i + } + text { + design:draw_rectangle $x1 $y1 $x2 $y2 $PgAcVar(fdobj,$i,relief) $PgAcVar(fdobj,$i,bcolor) o$i + } + entry { + design:draw_rectangle $x1 $y1 $x2 $y2 $PgAcVar(fdobj,$i,relief) $PgAcVar(fdobj,$i,bcolor) o$i + } + label { + set temp $PgAcVar(fdobj,$i,label) + if {$temp==""} {set temp "____"} + design:draw_rectangle $x1 $y1 $x2 $y2 $PgAcVar(fdobj,$i,relief) $PgAcVar(fdobj,$i,bcolor) o$i + .pgaw:FormDesign:draft.c create text [expr {$x1+1}] [expr {$y1+1}] -text $temp -fill $PgAcVar(fdobj,$i,fcolor) -font $wfont -anchor nw -tags o$i + } + checkbox { + design:draw_rectangle [expr $x1+2] [expr $y1+5] [expr $x1+12] [expr $y1+15] raised #a0a0a0 o$i + .pgaw:FormDesign:draft.c create text [expr $x1+20] [expr $y1+3] -text $PgAcVar(fdobj,$i,label) -anchor nw \ + -fill $PgAcVar(fdobj,$i,fcolor) -font $wfont -tags o$i + } + radio { + .pgaw:FormDesign:draft.c create oval [expr $x1+4] [expr $y1+5] [expr $x1+14] [expr $y1+15] -fill white -tags o$i + .pgaw:FormDesign:draft.c create text [expr $x1+24] [expr $y1+3] -text $PgAcVar(fdobj,$i,label) -anchor nw \ + -fill $PgAcVar(fdobj,$i,fcolor) -font $wfont -tags o$i + } + query { + .pgaw:FormDesign:draft.c create oval $x1 $y1 [expr $x1+20] [expr $y1+20] -fill white -tags o$i + .pgaw:FormDesign:draft.c create text [expr $x1+5] [expr $y1+4] -text Q -anchor nw -font $PgAcVar(pref,font_normal) -tags o$i + } + listbox { + design:draw_rectangle $x1 $y1 [expr $x2-12] $y2 sunken $PgAcVar(fdobj,$i,bcolor) o$i + design:draw_rectangle [expr $x2-11] $y1 $x2 $y2 sunken gray o$i + .pgaw:FormDesign:draft.c create line [expr $x2-5] $y1 $x2 [expr $y1+10] -fill #808080 -tags o$i + .pgaw:FormDesign:draft.c create line [expr $x2-10] [expr $y1+9] $x2 [expr $y1+9] -fill #808080 -tags o$i + .pgaw:FormDesign:draft.c create line [expr $x2-10] [expr $y1+9] [expr $x2-5] $y1 -fill white -tags o$i + .pgaw:FormDesign:draft.c create line [expr $x2-5] $y2 $x2 [expr $y2-10] -fill #808080 -tags o$i + .pgaw:FormDesign:draft.c create line [expr $x2-10] [expr $y2-9] $x2 [expr $y2-9] -fill white -tags o$i + .pgaw:FormDesign:draft.c create line [expr $x2-10] [expr $y2-9] [expr $x2-5] $y2 -fill white -tags o$i + } +} +.pgaw:FormDesign:draft.c raise hook +} + +proc {design:draw_rectangle} {x1 y1 x2 y2 relief color tag} { + if {$relief=="raised"} { + set c1 white + set c2 #606060 + } + if {$relief=="sunken"} { + set c1 #606060 + set c2 white + } + if {$relief=="ridge"} { + design:draw_rectangle $x1 $y1 $x2 $y2 raised none $tag + design:draw_rectangle [expr {$x1+1}] [expr {$y1+1}] [expr {$x2+1}] [expr {$y2+1}] sunken none $tag + design:draw_rectangle [expr {$x1+2}] [expr {$y1+2}] $x2 $y2 flat $color $tag + return + } + if {$relief=="groove"} { + design:draw_rectangle $x1 $y1 $x2 $y2 sunken none $tag + design:draw_rectangle [expr {$x1+1}] [expr {$y1+1}] [expr {$x2+1}] [expr {$y2+1}] raised none $tag + design:draw_rectangle [expr {$x1+2}] [expr {$y1+2}] $x2 $y2 flat $color $tag + return + } + if {$color != "none"} { + .pgaw:FormDesign:draft.c create rectangle $x1 $y1 $x2 $y2 -outline "" -fill $color -tags $tag + } + if {$relief=="flat"} { + return + } + .pgaw:FormDesign:draft.c create line $x1 $y1 $x2 $y1 -fill $c1 -tags $tag + .pgaw:FormDesign:draft.c create line $x1 $y1 $x1 $y2 -fill $c1 -tags $tag + .pgaw:FormDesign:draft.c create line $x1 $y2 $x2 $y2 -fill $c2 -tags $tag + .pgaw:FormDesign:draft.c create line $x2 $y1 $x2 [expr 1+$y2] -fill $c2 -tags $tag +} + + +proc {design:init} {} { +global PgAcVar + PgAcVar:clean fdvar,* + PgAcVar:clean fdobj,* + catch {.pgaw:FormDesign:draft.c delete all} + # design:draw_grid + set PgAcVar(fdobj,0,name) {f1} + set PgAcVar(fdobj,0,class) form + set PgAcVar(fdobj,0,command) {} + set PgAcVar(fdvar,formtitle) "New form" + set PgAcVar(fdvar,objnum) 0 + set PgAcVar(fdvar,objlist) {} + set PgAcVar(fdvar,oper) none + set PgAcVar(fdvar,tool) point + set PgAcVar(fdvar,resizable) 1 + set PgAcVar(fdvar,dirty) 0 +} + + +proc {design:item_click} {x y} { +global PgAcVar + set PgAcVar(fdvar,oper) none + set PgAcVar(fdvar,moveitemobj) {} + set il [.pgaw:FormDesign:draft.c find overlapping $x $y $x $y] + .pgaw:FormDesign:draft.c delete hook + if {[llength $il] == 0} { + design:show_attributes 0 + return + } + set tl [.pgaw:FormDesign:draft.c gettags [lindex $il 0]] + set i [lsearch -glob $tl o*] + if {$i == -1} return + set objnum [string range [lindex $tl $i] 1 end] + set PgAcVar(fdvar,moveitemobj) $objnum + set PgAcVar(fdvar,moveitemx) $x + set PgAcVar(fdvar,moveitemy) $y + set PgAcVar(fdvar,oper) move + design:show_attributes $objnum + design:draw_hookers $objnum +} + + +proc {forms:load} {name mode} { +global PgAcVar CurrentDB + design:init + set PgAcVar(fdvar,formtitle) $name + if {$mode=="design"} { + Window show .pgaw:FormDesign:draft + Window show .pgaw:FormDesign:menu + Window show .pgaw:FormDesign:attributes + Window show .pgaw:FormDesign:toolbar + } + set res [wpg_exec $CurrentDB "select * from pga_forms where formname='$PgAcVar(fdvar,formtitle)'"] + set info [lindex [pg_result $res -getTuple 0] 1] + pg_result $res -clear + set PgAcVar(fdobj,0,name) [lindex $info 0] + set PgAcVar(fdvar,objnum) [lindex $info 1] + # check for old format , prior to 0.97 that + # save here the objlist (deprecated) + set temp [lindex $info 2] + if {[lindex $temp 0] == "FS"} { + set PgAcVar(fdobj,0,command) [lindex $temp 1] + } else { + set PgAcVar(fdobj,0,command) {} + } + set PgAcVar(fdvar,objlist) {} + set PgAcVar(fdvar,geometry) [lindex $info 3] + set i 1 + foreach objinfo [lrange $info 4 end] { + lappend PgAcVar(fdvar,objlist) $i + set PgAcVar(fdobj,$i,class) [lindex $objinfo 0] + set PgAcVar(fdobj,$i,name) [lindex $objinfo 1] + set PgAcVar(fdobj,$i,coord) [lindex $objinfo 2] + set PgAcVar(fdobj,$i,command) [lindex $objinfo 3] + set PgAcVar(fdobj,$i,label) [lindex $objinfo 4] + set PgAcVar(fdobj,$i,variable) [lindex $objinfo 5] + design:setDefaultReliefAndColor $i + set PgAcVar(fdobj,$i,value) $PgAcVar(fdobj,$i,name) + if {[llength $objinfo] > 6 } { + set PgAcVar(fdobj,$i,value) [lindex $objinfo 6] + set PgAcVar(fdobj,$i,relief) [lindex $objinfo 7] + set PgAcVar(fdobj,$i,fcolor) [lindex $objinfo 8] + set PgAcVar(fdobj,$i,bcolor) [lindex $objinfo 9] + set PgAcVar(fdobj,$i,borderwidth) [lindex $objinfo 10] + set PgAcVar(fdobj,$i,font) [lindex $objinfo 11] + # for space saving purposes we have saved onbly the first letter + switch $PgAcVar(fdobj,$i,font) { + n {set PgAcVar(fdobj,$i,font) normal} + i {set PgAcVar(fdobj,$i,font) italic} + b {set PgAcVar(fdobj,$i,font) bold} + f {set PgAcVar(fdobj,$i,font) fixed} + } + } + if {$mode=="design"} {design:draw_object $i} + incr i + } + if {$mode=="design"} {wm geometry .pgaw:FormDesign:draft $PgAcVar(fdvar,geometry)} +} + + +proc {design:mouse_down} {x y} { +global PgAcVar + set x [expr 3*int($x/3)] + set y [expr 3*int($y/3)] + set PgAcVar(fdvar,xstart) $x + set PgAcVar(fdvar,ystart) $y + if {$PgAcVar(fdvar,tool)=="point"} { + design:item_click $x $y + return + } + set PgAcVar(fdvar,oper) draw +} + + +proc {design:mouse_move} {x y} { +global PgAcVar + #set PgAcVar(fdvar,msg) "x=$x y=$y" + set x [expr 3*int($x/3)] + set y [expr 3*int($y/3)] + set oper "" + catch {set oper $PgAcVar(fdvar,oper)} + if {$oper=="draw"} { + catch {.pgaw:FormDesign:draft.c delete curdraw} + .pgaw:FormDesign:draft.c create rectangle $PgAcVar(fdvar,xstart) $PgAcVar(fdvar,ystart) $x $y -tags curdraw + return + } + if {$oper=="move"} { + set dx [expr $x-$PgAcVar(fdvar,moveitemx)] + set dy [expr $y-$PgAcVar(fdvar,moveitemy)] + .pgaw:FormDesign:draft.c move o$PgAcVar(fdvar,moveitemobj) $dx $dy + .pgaw:FormDesign:draft.c move hook $dx $dy + set PgAcVar(fdvar,moveitemx) $x + set PgAcVar(fdvar,moveitemy) $y + set PgAcVar(fdvar,dirty) 1 + } +} + +proc {design:setDefaultReliefAndColor} {i} { +global PgAcVar + set PgAcVar(fdobj,$i,borderwidth) 1 + set PgAcVar(fdobj,$i,relief) flat + set PgAcVar(fdobj,$i,fcolor) {} + set PgAcVar(fdobj,$i,bcolor) {} + set PgAcVar(fdobj,$i,font) normal + switch $PgAcVar(fdobj,$i,class) { + button { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #d9d9d9 + set PgAcVar(fdobj,$i,relief) raised + } + text { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #fefefe + set PgAcVar(fdobj,$i,relief) sunken + } + entry { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #fefefe + set PgAcVar(fdobj,$i,relief) sunken + } + label { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #d9d9d9 + set PgAcVar(fdobj,$i,relief) flat + } + checkbox { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #d9d9d9 + set PgAcVar(fdobj,$i,relief) flat + } + radio { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #d9d9d9 + set PgAcVar(fdobj,$i,relief) flat + } + listbox { + set PgAcVar(fdobj,$i,fcolor) #000000 + set PgAcVar(fdobj,$i,bcolor) #fefefe + set PgAcVar(fdobj,$i,relief) sunken + } + } +} + +proc {design:mouse_up} {x y} { +global PgAcVar + set x [expr 3*int($x/3)] + set y [expr 3*int($y/3)] + if {$PgAcVar(fdvar,oper)=="move"} { + set PgAcVar(fdvar,moveitem) {} + set PgAcVar(fdvar,oper) none + set oc $PgAcVar(fdobj,$PgAcVar(fdvar,moveitemobj),coord) + set dx [expr $x - $PgAcVar(fdvar,xstart)] + set dy [expr $y - $PgAcVar(fdvar,ystart)] + set newcoord [list [expr $dx+[lindex $oc 0]] [expr $dy+[lindex $oc 1]] [expr $dx+[lindex $oc 2]] [expr $dy+[lindex $oc 3]]] + set PgAcVar(fdobj,$PgAcVar(fdvar,moveitemobj),coord) $newcoord + design:show_attributes $PgAcVar(fdvar,moveitemobj) + design:draw_hookers $PgAcVar(fdvar,moveitemobj) + return + } + if {$PgAcVar(fdvar,oper)!="draw"} return + set PgAcVar(fdvar,oper) none + .pgaw:FormDesign:draft.c delete curdraw + # Check for x2 -1} { + label $base.l$row \ + -borderwidth 0 -text [intlmsg Text] + entry $base.e$row -textvariable PgAcVar(fdobj,$i,label) \ + -background #fefefe -borderwidth 1 -width 200 + bind $base.e$row "Forms::design:set_text" + grid $base.l$row \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.e$row \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 -sticky w + incr row + } + + # does it have a variable attribute ? + if {[lsearch {button label radio checkbox entry} $objclass] > -1} { + label $base.l$row \ + -borderwidth 0 -text [intlmsg Variable] + entry $base.e$row -textvariable PgAcVar(fdobj,$i,variable) \ + -background #fefefe -borderwidth 1 -width 200 + grid $base.l$row \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.e$row \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + incr row + } + + # does it have a Command attribute ? + if {[lsearch {button checkbox} $objclass] > -1} { + label $base.l$row \ + -borderwidth 0 -text [intlmsg Command] + entry $base.e$row -textvariable PgAcVar(fdobj,$i,command) \ + -background #fefefe -borderwidth 1 -width 200 + button $base.b$row \ + -borderwidth 1 -padx 1 -pady 0 -text ... -command " + Window show .pgaw:FormDesign:commands + set PgAcVar(fdvar,commandFor) $i + .pgaw:FormDesign:commands.f.txt delete 1.0 end + .pgaw:FormDesign:commands.f.txt insert end \$PgAcVar(fdobj,$i,command)" + grid $base.l$row \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.e$row \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + grid $base.b$row \ + -in $base -column 2 -row $row -columnspan 1 -rowspan 1 + incr row + } + + # does it have a value attribute ? + if {[lsearch {radio checkbox} $objclass] > -1} { + label $base.l$row \ + -borderwidth 0 -text [intlmsg Value] + entry $base.e$row -textvariable PgAcVar(fdobj,$i,value) \ + -background #fefefe -borderwidth 1 -width 200 + grid $base.l$row \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.e$row \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + incr row + } + + # does it have fonts ? + if {[lsearch {label button entry listbox text checkbox radio} $objclass] > -1} { + label $base.lfont \ + -borderwidth 0 -text [intlmsg Font] + grid $base.lfont \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -pady 2 -sticky w + entry $base.efont -textvariable PgAcVar(fdobj,$i,font) \ + -background #fefefe -borderwidth 1 -width 200 + bind $base.efont "Forms::design:draw_object $i ; set PgAcVar(fdvar,dirty) 1" + grid $base.efont \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 -sticky w + menubutton $base.mbf \ + -borderwidth 1 -menu $base.mbf.m -padx 2 -pady 0 \ + -text {...} -font $PgAcVar(pref,font_normal) -relief raised + menu $base.mbf.m \ + -borderwidth 1 -cursor {} -tearoff 0 -font $PgAcVar(pref,font_normal) + foreach font {normal bold italic fixed} { + $base.mbf.m add command \ + -command " + set PgAcVar(fdobj,$i,font) $font + Forms::design:draw_object $i + set PgAcVar(fdvar,dirty) 1 + " -label $font + } + grid $base.mbf \ + -in $base -column 2 -row $row -columnspan 1 -rowspan 1 -pady 2 -padx 2 -sticky w + incr row + } + + # does it have colors ? + if {[lsearch {label button radio checkbox entry listbox text} $objclass] > -1} { + label $base.lcf \ + -borderwidth 0 -text [intlmsg Foreground] + label $base.scf \ + -background $PgAcVar(fdobj,$i,fcolor) -borderwidth 1 -relief sunken -width 200 + button $base.bcf \ + -command "set tempcolor \[tk_chooseColor -initialcolor $PgAcVar(fdobj,$i,fcolor) -title {Choose color}\] + if {\$tempcolor != {}} { + set PgAcVar(fdobj,$i,fcolor) \$tempcolor + $base.scf configure -background \$PgAcVar(fdobj,$i,fcolor) + set PgAcVar(fdvar,dirty) 1 + Forms::design:draw_object $i + }" \ + -borderwidth 1 -padx 1 -pady 0 -text ... + grid $base.lcf \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.scf \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + grid $base.bcf \ + -in $base -column 2 -row $row -columnspan 1 -rowspan 1 + incr row + label $base.lcb \ + -borderwidth 0 -text Background + label $base.scb \ + -background $PgAcVar(fdobj,$i,bcolor) -borderwidth 1 -relief sunken -width 200 + button $base.bcb \ + -command "set tempcolor \[tk_chooseColor -initialcolor $PgAcVar(fdobj,$i,bcolor) -title {Choose color}\] + if {\$tempcolor != {}} { + set PgAcVar(fdobj,$i,bcolor) \$tempcolor + $base.scb configure -background \$PgAcVar(fdobj,$i,bcolor) + set PgAcVar(fdvar,dirty) 1 + Forms::design:draw_object $i + }" \ + -borderwidth 1 -padx 1 -pady 0 -text ... + grid $base.lcb \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.scb \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 -sticky w + grid $base.bcb \ + -in $base -column 2 -row $row -columnspan 1 -rowspan 1 + incr row + } + + # does it have border types ? + if {[lsearch {label button entry listbox text} $objclass] > -1} { + label $base.lrelief \ + -borderwidth 0 -text [intlmsg Relief] + grid $base.lrelief \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -pady 2 -sticky w + menubutton $base.mb \ + -borderwidth 2 -menu $base.mb.m -padx 4 -pady 3 -width 100 -relief $PgAcVar(fdobj,$i,relief) \ + -text groove -textvariable PgAcVar(fdobj,$i,relief) \ + -font $PgAcVar(pref,font_normal) + menu $base.mb.m \ + -borderwidth 1 -cursor {} -tearoff 0 -font $PgAcVar(pref,font_normal) + foreach brdtype {raised sunken ridge groove flat} { + $base.mb.m add command \ + -command " + set PgAcVar(fdobj,$i,relief) $brdtype + $base.mb configure -relief \$PgAcVar(fdobj,$i,relief) + Forms::design:draw_object $i + " -label $brdtype + } + grid $base.mb \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -pady 2 -padx 2 -sticky w + incr row + + } + + # is it a DataControl ? + if {$objclass == "query"} { + label $base.l$row \ + -borderwidth 0 -text [intlmsg SQL] + entry $base.e$row -textvariable PgAcVar(fdobj,$i,command) \ + -background #fefefe -borderwidth 1 -width 200 + grid $base.l$row \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.e$row \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + incr row + } + + # does it have a borderwidth attribute ? + if {[lsearch {button label radio checkbox entry listbox text} $objclass] > -1} { + label $base.l$row \ + -borderwidth 0 -text [intlmsg {Border width}] + entry $base.e$row -textvariable PgAcVar(fdobj,$i,borderwidth) \ + -background #fefefe -borderwidth 1 -width 200 + grid $base.l$row \ + -in $base -column 0 -row $row -columnspan 1 -rowspan 1 -sticky w + grid $base.e$row \ + -in $base -column 1 -row $row -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + incr row + } + + + # The last dummy label + + label $base.ldummy -text {} -borderwidth 0 + grid $base.ldummy -in $base -column 0 -row 100 + grid rowconf $base 100 -weight 1 + +} + + +proc {design:show_attributes} {i} { +global PgAcVar + set objclass $PgAcVar(fdobj,$i,class) + set PgAcVar(fdvar,c_class) $objclass + design:createAttributesFrame $i + set PgAcVar(fdvar,c_name) $PgAcVar(fdobj,$i,name) + if {$i == 0} { + # Object 0 is the form + set c [split [winfo geometry .pgaw:FormDesign:draft] x+] + set PgAcVar(fdvar,c_top) [lindex $c 3] + set PgAcVar(fdvar,c_left) [lindex $c 2] + set PgAcVar(fdvar,c_width) [lindex $c 0] + set PgAcVar(fdvar,c_height) [lindex $c 1] + return + } + set c $PgAcVar(fdobj,$i,coord) + set PgAcVar(fdvar,c_top) [lindex $c 1] + set PgAcVar(fdvar,c_left) [lindex $c 0] + set PgAcVar(fdvar,c_width) [expr [lindex $c 2]-[lindex $c 0]] + set PgAcVar(fdvar,c_height) [expr [lindex $c 3]-[lindex $c 1]] +} + + +proc {design:run} {} { +global PgAcVar CurrentDB DataControlVar +set base .$PgAcVar(fdobj,0,name) +if {[winfo exists $base]} { + wm deiconify $base; return +} +toplevel $base -class Toplevel +wm focusmodel $base passive +wm geometry $base $PgAcVar(fdvar,geometry) +wm maxsize $base 785 570 +wm minsize $base 1 1 +wm overrideredirect $base 0 +wm resizable $base 1 1 +wm deiconify $base +wm title $base $PgAcVar(fdvar,formtitle) +foreach item $PgAcVar(fdvar,objlist) { +set coord $PgAcVar(fdobj,$item,coord) +set name $PgAcVar(fdobj,$item,name) +set wh "-width [expr 3+[lindex $coord 2]-[lindex $coord 0]] -height [expr 3+[lindex $coord 3]-[lindex $coord 1]]" +set visual 1 + +set wfont $PgAcVar(fdobj,$item,font) +switch $wfont { + {} {set wfont $PgAcVar(pref,font_normal)} + normal {set wfont $PgAcVar(pref,font_normal)} + bold {set wfont $PgAcVar(pref,font_bold)} + italic {set wfont $PgAcVar(pref,font_italic)} + fixed {set wfont $PgAcVar(pref,font_fix)} +} + +namespace forget ::DataControl($base.$name) + +# Checking if relief ridge or groove has borderwidth 2 +if {[lsearch {ridge groove} $PgAcVar(fdobj,$item,relief)] != -1} { + if {$PgAcVar(fdobj,$item,borderwidth) < 2} { + set PgAcVar(fdobj,$item,borderwidth) 2 + } +} + +# Checking if borderwidth is okay +if {[lsearch {0 1 2 3 4 5} $PgAcVar(fdobj,$item,borderwidth)] == -1} { + set PgAcVar(fdobj,$item,borderwidth) 1 +} + +set cmd {} +catch {set cmd $PgAcVar(fdobj,$item,command)} + +switch $PgAcVar(fdobj,$item,class) { + button { + button $base.$name -borderwidth 1 -padx 0 -pady 0 -text "$PgAcVar(fdobj,$item,label)" \ + -fg $PgAcVar(fdobj,$item,fcolor) -bg $PgAcVar(fdobj,$item,bcolor) \ + -borderwidth $PgAcVar(fdobj,$item,borderwidth) \ + -relief $PgAcVar(fdobj,$item,relief) -font $wfont -command [subst {$cmd}] + if {$PgAcVar(fdobj,$item,variable) != ""} { + $base.$name configure -textvariable $PgAcVar(fdobj,$item,variable) + } + } + checkbox { + checkbutton $base.$name -onvalue t -offvalue f -font $wfont \ + -fg $PgAcVar(fdobj,$item,fcolor) \ + -borderwidth $PgAcVar(fdobj,$item,borderwidth) \ + -command [subst {$cmd}] \ + -text "$PgAcVar(fdobj,$item,label)" -variable "$PgAcVar(fdobj,$item,variable)" -borderwidth 1 + set wh {} + } + query { + set visual 0 + set DataControlVar($base.$name,sql) $PgAcVar(fdobj,$item,command) + namespace eval ::DataControl($base.$name) "proc open {} { + global CurrentDB DataControlVar + variable tuples + catch {unset tuples} + set wn \[focus\] ; setCursor CLOCK + set res \[wpg_exec \$CurrentDB \"\$DataControlVar($base.$name,sql)\"\] + pg_result \$res -assign tuples + set fl {} + foreach fd \[pg_result \$res -lAttributes\] {lappend fl \[lindex \$fd 0\]} + set DataControlVar($base.$name,fields) \$fl + set DataControlVar($base.$name,recno) 0 + set DataControlVar($base.$name,nrecs) \[pg_result \$res -numTuples\] + setCursor NORMAL + }" + namespace eval ::DataControl($base.$name) "proc setSQL {sqlcmd} { + global DataControlVar + set DataControlVar($base.$name,sql) \$sqlcmd + }" + namespace eval ::DataControl($base.$name) "proc getRowCount {} { + global DataControlVar + return \$DataControlVar($base.$name,nrecs) + }" + namespace eval ::DataControl($base.$name) "proc getRowIndex {} { + global DataControlVar + return \$DataControlVar($base.$name,recno) + }" + namespace eval ::DataControl($base.$name) "proc moveTo {newrecno} { + global DataControlVar + set DataControlVar($base.$name,recno) \$newrecno + }" + namespace eval ::DataControl($base.$name) "proc close {} { + variable tuples + catch {unset tuples} + }" + namespace eval ::DataControl($base.$name) "proc getFieldList {} { + global DataControlVar + return \$DataControlVar($base.$name,fields) + }" + namespace eval ::DataControl($base.$name) "proc fill {lb fld} { + global DataControlVar + variable tuples + \$lb delete 0 end + for {set i 0} {\$i<\$DataControlVar($base.$name,nrecs)} {incr i} { + \$lb insert end \$tuples\(\$i,\$fld\) + } + }" + namespace eval ::DataControl($base.$name) "proc moveFirst {} {global DataControlVar ; set DataControlVar($base.$name,recno) 0}" + namespace eval ::DataControl($base.$name) "proc moveNext {} {global DataControlVar ; incr DataControlVar($base.$name,recno) ; if {\$DataControlVar($base.$name,recno)==\[getRowCount\]} {moveLast}}" + namespace eval ::DataControl($base.$name) "proc movePrevious {} {global DataControlVar ; incr DataControlVar($base.$name,recno) -1 ; if {\$DataControlVar($base.$name,recno)==-1} {moveFirst}}" + namespace eval ::DataControl($base.$name) "proc moveLast {} {global DataControlVar ; set DataControlVar($base.$name,recno) \[expr \[getRowCount\] -1\]}" + namespace eval ::DataControl($base.$name) "proc updateDataSet {} {\ + global DataControlVar + global DataSet + variable tuples + set i \$DataControlVar($base.$name,recno) + foreach fld \$DataControlVar($base.$name,fields) { + catch { + upvar DataSet\($base.$name,\$fld\) dbvar + set dbvar \$tuples\(\$i,\$fld\) + } + } + }" + namespace eval ::DataControl($base.$name) "proc clearDataSet {} { + global DataControlVar + global DataSet + catch { foreach fld \$DataControlVar($base.$name,fields) { + catch { + upvar DataSet\($base.$name,\$fld\) dbvar + set dbvar {} + } + }} + }" + } + radio { + radiobutton $base.$name -font $wfont -text "$PgAcVar(fdobj,$item,label)" \ + -fg $PgAcVar(fdobj,$item,fcolor) -bg $PgAcVar(fdobj,$item,bcolor) -variable $PgAcVar(fdobj,$item,variable) \ + -value $PgAcVar(fdobj,$item,value) -borderwidth 1 + set wh {} + } + entry { + set var {} ; catch {set var $PgAcVar(fdobj,$item,variable)} + entry $base.$name -bg $PgAcVar(fdobj,$item,bcolor) -fg $PgAcVar(fdobj,$item,fcolor) \ + -borderwidth $PgAcVar(fdobj,$item,borderwidth) -font $wfont \ + -relief $PgAcVar(fdobj,$item,relief) -selectborderwidth 0 -highlightthickness 0 + if {$var!=""} {$base.$name configure -textvar $var} + } + text { + text $base.$name -fg $PgAcVar(fdobj,$item,fcolor) -bg $PgAcVar(fdobj,$item,bcolor) \ + -relief $PgAcVar(fdobj,$item,relief) -borderwidth $PgAcVar(fdobj,$item,borderwidth) \ + -font $wfont + } + label { + # set wh {} + label $base.$name -font $wfont -anchor nw -padx 0 -pady 0 -text $PgAcVar(fdobj,$item,label) \ + -borderwidth $PgAcVar(fdobj,$item,borderwidth) \ + -relief $PgAcVar(fdobj,$item,relief) -fg $PgAcVar(fdobj,$item,fcolor) -bg $PgAcVar(fdobj,$item,bcolor) + set var {} ; catch {set var $PgAcVar(fdobj,$item,variable)} + if {$var!=""} {$base.$name configure -textvar $var} + } + listbox { + listbox $base.$name -bg $PgAcVar(fdobj,$item,bcolor) -highlightthickness 0 -selectborderwidth 0 \ + -borderwidth $PgAcVar(fdobj,$item,borderwidth) -relief $PgAcVar(fdobj,$item,relief) \ + -fg $PgAcVar(fdobj,$item,fcolor) -bg $PgAcVar(fdobj,$item,bcolor) -font $wfont -yscrollcommand [subst {$base.sb$name set}] + scrollbar $base.sb$name -borderwidth 1 -command [subst {$base.$name yview}] -orient vert -highlightthickness 0 + eval [subst "place $base.sb$name -x [expr [lindex $coord 2]-14] -y [expr [lindex $coord 1]-1] -width 16 -height [expr 3+[lindex $coord 3]-[lindex $coord 1]] -anchor nw -bordermode ignore"] + } +} +if $visual {eval [subst "place $base.$name -x [expr [lindex $coord 0]-1] -y [expr [lindex $coord 1]-1] -anchor nw $wh -bordermode ignore"]} +} +if {$PgAcVar(fdobj,0,command) != ""} { + uplevel #0 $PgAcVar(fdobj,0,command) +} +} + +proc {design:close} {} { +global PgAcVar + if {$PgAcVar(fdvar,dirty)} { + if {[tk_messageBox -title [intlmsg Warning] -message [intlmsg "Do you want to save the form into the database?"] -type yesno -default yes]=="yes"} { + if {[design:save $PgAcVar(fdvar,formtitle)]==0} {return} + } + } + catch {Window destroy .pgaw:FormDesign:draft} + catch {Window destroy .pgaw:FormDesign:toolbar} + catch {Window destroy .pgaw:FormDesign:menu} + catch {Window destroy .pgaw:FormDesign:attributes} + catch {Window destroy .pgaw:FormDesign:commands} + catch {Window destroy .$PgAcVar(fdobj,0,name)} +} + +} + +proc vTclWindow.pgaw:FormDesign:draft {base} { + if {$base == ""} { + set base .pgaw:FormDesign:draft + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 377x315+50+130 + wm maxsize $base 785 570 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm deiconify $base + wm title $base [intlmsg "Form design"] + bind $base { + Forms::design:delete_object + } + bind $base "Help::load form_design" + canvas $base.c \ + -background #a0a0a0 -height 207 -highlightthickness 0 -relief ridge \ + -selectborderwidth 0 -width 295 + bind $base.c { + Forms::design:mouse_down %x %y + } + bind $base.c { + Forms::design:mouse_up %x %y + } + bind $base.c { + Forms::design:mouse_move %x %y + } + pack $base.c \ + -in .pgaw:FormDesign:draft -anchor center -expand 1 -fill both -side top +} + +proc vTclWindow.pgaw:FormDesign:attributes {base} { + if {$base == ""} { + set base .pgaw:FormDesign:attributes + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 237x300+461+221 + wm maxsize $base 785 570 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base [intlmsg "Attributes"] + + # The identification frame + + frame $base.fi \ + -borderwidth 2 -height 75 -relief groove -width 125 + label $base.fi.lclass \ + -borderwidth 0 -text [intlmsg Class] + entry $base.fi.eclass -textvariable PgAcVar(fdvar,c_class) \ + -borderwidth 1 -width 200 + label $base.fi.lname \ + -borderwidth 0 -text [intlmsg Name] + entry $base.fi.ename -textvariable PgAcVar(fdvar,c_name) \ + -background #fefefe -borderwidth 1 -width 200 + bind $base.fi.ename { + Forms::design:set_name + } + + + # The geometry frame + + frame $base.fg \ + -borderwidth 2 -height 75 -relief groove -width 125 + entry $base.fg.e1 -textvariable PgAcVar(fdvar,c_width) \ + -background #fefefe -borderwidth 1 -width 5 + entry $base.fg.e2 -textvariable PgAcVar(fdvar,c_height) \ + -background #fefefe -borderwidth 1 -width 5 + entry $base.fg.e3 -textvariable PgAcVar(fdvar,c_left) \ + -background #fefefe -borderwidth 1 -width 5 + entry $base.fg.e4 -textvariable PgAcVar(fdvar,c_top) \ + -background #fefefe -borderwidth 1 -width 5 + bind $base.fg.e1 { + Forms::design:change_coords + } + bind $base.fg.e2 { + Forms::design:change_coords + } + bind $base.fg.e3 { + Forms::design:change_coords + } + bind $base.fg.e4 { + Forms::design:change_coords + } + label $base.fg.l1 \ + -borderwidth 0 -text Width + label $base.fg.l2 \ + -borderwidth 0 -text Height + label $base.fg.l3 \ + -borderwidth 0 -text Left + label $base.fg.l4 \ + -borderwidth 0 -text Top + label $base.fg.lx1 \ + -borderwidth 0 -text x + label $base.fg.lp1 \ + -borderwidth 0 -text + + label $base.fg.lp2 \ + -borderwidth 0 -text + + + # The frame for the rest of the attributes (dynamically generated) + + + frame $base.f \ + -borderwidth 2 -height 75 -relief groove -width 125 + + + # Geometry for "identification frame" + + + place $base.fi \ + -x 5 -y 5 -width 230 -height 55 -anchor nw -bordermode ignore + grid columnconf $base.fi 1 -weight 1 + grid $base.fi.lclass \ + -in $base.fi -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.fi.eclass \ + -in $base.fi -column 1 -row 0 -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + grid $base.fi.lname \ + -in $base.fi -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky w + grid $base.fi.ename \ + -in $base.fi -column 1 -row 1 -columnspan 1 -rowspan 1 -padx 2 \ + -sticky w + + + + # Geometry for "geometry frame" + + place $base.fg \ + -x 5 -y 60 -width 230 -height 45 -anchor nw -bordermode ignore + grid $base.fg.e1 \ + -in $base.fg -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.fg.e2 \ + -in $base.fg -column 2 -row 0 -columnspan 1 -rowspan 1 + grid $base.fg.e3 \ + -in $base.fg -column 4 -row 0 -columnspan 1 -rowspan 1 + grid $base.fg.e4 \ + -in $base.fg -column 6 -row 0 -columnspan 1 -rowspan 1 + grid $base.fg.l1 \ + -in $base.fg -column 0 -row 1 -columnspan 1 -rowspan 1 + grid $base.fg.l2 \ + -in $base.fg -column 2 -row 1 -columnspan 1 -rowspan 1 + grid $base.fg.l3 \ + -in $base.fg -column 4 -row 1 -columnspan 1 -rowspan 1 + grid $base.fg.l4 \ + -in $base.fg -column 6 -row 1 -columnspan 1 -rowspan 1 + grid $base.fg.lx1 \ + -in $base.fg -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.fg.lp1 \ + -in $base.fg -column 5 -row 0 -columnspan 1 -rowspan 1 + grid $base.fg.lp2 \ + -in $base.fg -column 3 -row 0 -columnspan 1 -rowspan 1 + + place $base.f -x 5 -y 105 -width 230 -height 190 -anchor nw + +} + + +proc vTclWindow.pgaw:FormDesign:commands {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:FormDesign:commands + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 640x480+120+100 + wm maxsize $base 785 570 + wm minsize $base 1 19 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm title $base [intlmsg "Command"] + frame $base.f \ + -borderwidth 2 -height 75 -relief groove -width 125 + scrollbar $base.f.sb \ + -borderwidth 1 -command {.pgaw:FormDesign:commands.f.txt yview} -orient vert -width 12 + text $base.f.txt \ + -font $PgAcVar(pref,font_fix) -height 1 -tabs {20 40 60 80 100 120 140 160 180 200} \ + -width 200 -yscrollcommand {.pgaw:FormDesign:commands.f.sb set} + frame $base.fb \ + -height 75 -width 125 + button $base.fb.b1 \ + -borderwidth 1 \ + -command { + set PgAcVar(fdobj,$PgAcVar(fdvar,commandFor),command) [.pgaw:FormDesign:commands.f.txt get 1.0 "end - 1 chars"] + Window hide .pgaw:FormDesign:commands + set PgAcVar(fdvar,dirty) 1 + } -text [intlmsg Save] -width 5 + button $base.fb.b2 \ + -borderwidth 1 -command {Window hide .pgaw:FormDesign:commands} \ + -text [intlmsg Cancel] + pack $base.f \ + -in .pgaw:FormDesign:commands -anchor center -expand 1 -fill both -side top + pack $base.f.sb \ + -in .pgaw:FormDesign:commands.f -anchor e -expand 1 -fill y -side right + pack $base.f.txt \ + -in .pgaw:FormDesign:commands.f -anchor center -expand 1 -fill both -side top + pack $base.fb \ + -in .pgaw:FormDesign:commands -anchor center -expand 0 -fill none -side top + pack $base.fb.b1 \ + -in .pgaw:FormDesign:commands.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.b2 \ + -in .pgaw:FormDesign:commands.fb -anchor center -expand 0 -fill none -side top +} + +proc vTclWindow.pgaw:FormDesign:menu {base} { + if {$base == ""} { + set base .pgaw:FormDesign:menu + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 432x74+0+0 + 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 [intlmsg "Form designer"] + frame $base.f1 \ + -height 75 -relief groove -width 125 + label $base.f1.l1 \ + -borderwidth 0 -text "[intlmsg {Form name}] " + entry $base.f1.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(fdvar,formtitle) + frame $base.f2 \ + -height 75 -relief groove -width 125 + label $base.f2.l \ + -borderwidth 0 -text "[intlmsg {Form's window internal name}] " + entry $base.f2.e \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(fdobj,0,name) + frame $base.f3 \ + -height 1 -width 125 + button $base.f3.b1 \ + -command {set PgAcVar(fdvar,geometry) [wm geometry .pgaw:FormDesign:draft] ; Forms::design:run} -padx 1 \ + -text [intlmsg {Test form}] + button $base.f3.b2 \ + -command {destroy .$PgAcVar(fdobj,0,name)} -padx 1 \ + -text [intlmsg {Close test form}] + button $base.f3.b3 \ + -command {Forms::design:save nimic} -padx 1 -text [intlmsg Save] + button $base.f3.b4 \ + -command {Forms::design:close} \ + -padx 1 -text [intlmsg Close] + pack $base.f1 \ + -in .pgaw:FormDesign:menu -anchor center -expand 0 -fill x -pady 2 -side top + pack $base.f1.l1 \ + -in .pgaw:FormDesign:menu.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.e1 \ + -in .pgaw:FormDesign:menu.f1 -anchor center -expand 1 -fill x -side left + pack $base.f2 \ + -in .pgaw:FormDesign:menu -anchor center -expand 0 -fill x -pady 1 -side top + pack $base.f2.l \ + -in .pgaw:FormDesign:menu.f2 -anchor center -expand 0 -fill none -side left + pack $base.f2.e \ + -in .pgaw:FormDesign:menu.f2 -anchor center -expand 1 -fill x -side left + pack $base.f3 \ + -in .pgaw:FormDesign:menu -anchor center -expand 0 -fill x -pady 2 -side bottom + pack $base.f3.b1 \ + -in .pgaw:FormDesign:menu.f3 -anchor center -expand 0 -fill none -side left + pack $base.f3.b2 \ + -in .pgaw:FormDesign:menu.f3 -anchor center -expand 0 -fill none -side left + pack $base.f3.b3 \ + -in .pgaw:FormDesign:menu.f3 -anchor center -expand 0 -fill none -side left + pack $base.f3.b4 \ + -in .pgaw:FormDesign:menu.f3 -anchor center -expand 0 -fill none -side right +} + + +proc vTclWindow.pgaw:FormDesign:toolbar {base} { +global PgAcVar + foreach wid {button frame radiobutton checkbutton label text entry listbox query} { + image create photo "icon_$wid" -file [file join $PgAcVar(PGACCESS_HOME) images icon_$wid.gif] + } + if {$base == ""} { + set base .pgaw:FormDesign:toolbar + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel -menu .pgaw:FormDesign:toolbar.m17 + wm focusmodel $base passive + wm geometry $base 29x235+1+130 + 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 [intlmsg "Toolbar"] + button $base.b1 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) button} -image icon_button \ + -padx 9 -pady 3 + button $base.b3 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) radio} \ + -image icon_radiobutton -padx 9 -pady 3 + button $base.b4 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) checkbox} \ + -image icon_checkbutton -padx 9 -pady 3 + button $base.b5 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) label} -image icon_label \ + -padx 9 -pady 3 + button $base.b6 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) text} -image icon_text \ + -padx 9 -pady 3 + button $base.b7 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) entry} -image icon_entry \ + -padx 9 -pady 3 + button $base.b8 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) listbox} -image icon_listbox \ + -padx 9 -pady 3 + button $base.b9 \ + -borderwidth 1 -command {set PgAcVar(fdvar,tool) query} -height 21 \ + -image icon_query -padx 9 -pady 3 -width 20 + grid $base.b1 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 2 -columnspan 1 -rowspan 1 + grid $base.b3 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 4 -columnspan 1 -rowspan 1 + grid $base.b4 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 5 -columnspan 1 -rowspan 1 + grid $base.b5 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.b6 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 6 -columnspan 1 -rowspan 1 + grid $base.b7 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 1 -columnspan 1 -rowspan 1 + grid $base.b8 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 7 -columnspan 1 -rowspan 1 + grid $base.b9 \ + -in .pgaw:FormDesign:toolbar -column 0 -row 8 -columnspan 2 -rowspan 3 +} + diff --git a/src/bin/pgaccess/lib/functions.tcl b/src/bin/pgaccess/lib/functions.tcl new file mode 100644 index 00000000000..96e48605926 --- /dev/null +++ b/src/bin/pgaccess/lib/functions.tcl @@ -0,0 +1,181 @@ +namespace eval Functions { + +proc {new} {} { +global PgAcVar + Window show .pgaw:Function + set PgAcVar(function,name) {} + set PgAcVar(function,nametodrop) {} + set PgAcVar(function,parameters) {} + set PgAcVar(function,returns) {} + set PgAcVar(function,language) {} + .pgaw:Function.fs.text1 delete 1.0 end + focus .pgaw:Function.fp.e1 + wm transient .pgaw:Function .pgaw:Main +} + + +proc {design} {functionname} { +global PgAcVar CurrentDB + Window show .pgaw:Function + .pgaw:Function.fs.text1 delete 1.0 end + wpg_select $CurrentDB "select * from pg_proc where proname='$functionname'" rec { + set PgAcVar(function,name) $functionname + set temppar $rec(proargtypes) + set PgAcVar(function,returns) [Database::getPgType $rec(prorettype)] + set funcnrp $rec(pronargs) + set prolanguage $rec(prolang) + .pgaw:Function.fs.text1 insert end $rec(prosrc) + } + wpg_select $CurrentDB "select lanname from pg_language where oid=$prolanguage" rec { + set PgAcVar(function,language) $rec(lanname) + } + if { $PgAcVar(function,language)=="C" || $PgAcVar(function,language)=="c" } { + wpg_select $CurrentDB "select probin from pg_proc where proname='$functionname'" rec { + .pgaw:Function.fs.text1 delete 1.0 end + .pgaw:Function.fs.text1 insert end $rec(probin) + } + } + set PgAcVar(function,parameters) {} + for {set i 0} {$i<$funcnrp} {incr i} { + lappend PgAcVar(function,parameters) [Database::getPgType [lindex $temppar $i]] + } + set PgAcVar(function,parameters) [join $PgAcVar(function,parameters) ,] + set PgAcVar(function,nametodrop) "$PgAcVar(function,name) ($PgAcVar(function,parameters))" +} + + +proc {save} {} { +global PgAcVar + if {$PgAcVar(function,name)==""} { + focus .pgaw:Function.fp.e1 + showError [intlmsg "You must supply a name for this function!"] + } elseif {$PgAcVar(function,returns)==""} { + focus .pgaw:Function.fp.e3 + showError [intlmsg "You must supply a return type!"] + } elseif {$PgAcVar(function,language)==""} { + focus .pgaw:Function.fp.e4 + showError [intlmsg "You must supply the function language!"] + } else { + set funcbody [.pgaw:Function.fs.text1 get 1.0 end] + regsub -all "\n" $funcbody " " funcbody + if {$PgAcVar(function,nametodrop) != ""} { + if {! [sql_exec noquiet "drop function $PgAcVar(function,nametodrop)"]} { + return + } + } + if {[sql_exec noquiet "create function $PgAcVar(function,name) ($PgAcVar(function,parameters)) returns $PgAcVar(function,returns) as '$funcbody' language '$PgAcVar(function,language)'"]} { + Window destroy .pgaw:Function + tk_messageBox -title PostgreSQL -parent .pgaw:Main -message [intlmsg "Function saved!"] + Mainlib::tab_click Functions + } + } +} + +} + +proc vTclWindow.pgaw:Function {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:Function + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 480x330+98+212 + wm maxsize $base 1009 738 + wm minsize $base 480 330 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm deiconify $base + wm title $base [intlmsg "Function"] + bind $base "Help::load functions" + frame $base.fp \ + -height 88 -relief groove -width 125 + label $base.fp.l1 \ + -borderwidth 0 -relief raised -text [intlmsg Name] + entry $base.fp.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(function,name) + bind $base.fp.e1 { + focus .pgaw:Function.fp.e2 + } + label $base.fp.l2 \ + -borderwidth 0 -relief raised -text [intlmsg Parameters] + entry $base.fp.e2 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(function,parameters) -width 15 + bind $base.fp.e2 { + focus .pgaw:Function.fp.e3 + } + label $base.fp.l3 \ + -borderwidth 0 -relief raised -text [intlmsg Returns] + entry $base.fp.e3 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(function,returns) + bind $base.fp.e3 { + focus .pgaw:Function.fp.e4 + } + label $base.fp.l4 \ + -borderwidth 0 -relief raised -text [intlmsg Language] + entry $base.fp.e4 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(function,language) -width 15 + bind $base.fp.e4 { + focus .pgaw:Function.fs.text1 + } + label $base.fp.lspace \ + -borderwidth 0 -relief raised -text { } + frame $base.fs \ + -borderwidth 2 -height 75 -relief groove -width 125 + text $base.fs.text1 \ + -background #fefefe -foreground #000000 -borderwidth 1 -font $PgAcVar(pref,font_fix) -height 16 \ + -tabs {20 40 60 80 100 120} -width 43 -yscrollcommand {.pgaw:Function.fs.vsb set} + scrollbar $base.fs.vsb \ + -borderwidth 1 -command {.pgaw:Function.fs.text1 yview} -orient vert + frame $base.fb \ + -borderwidth 2 -height 75 -width 125 + frame $base.fb.fbc \ + -borderwidth 2 -height 75 -width 125 + button $base.fb.fbc.btnsave -command {Functions::save} \ + -borderwidth 1 -padx 9 -pady 3 -text [intlmsg Save] + button $base.fb.fbc.btnhelp -command {Help::load functions} \ + -borderwidth 1 -padx 9 -pady 3 -text [intlmsg Help] + button $base.fb.fbc.btncancel \ + -borderwidth 1 -command {Window destroy .pgaw:Function} -padx 9 -pady 3 \ + -text [intlmsg Cancel] + pack $base.fp \ + -in .pgaw:Function -anchor center -expand 0 -fill x -side top + grid $base.fp.l1 \ + -in .pgaw:Function.fp -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.fp.e1 \ + -in .pgaw:Function.fp -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.fp.l2 \ + -in .pgaw:Function.fp -column 3 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.fp.e2 \ + -in .pgaw:Function.fp -column 4 -row 0 -columnspan 1 -rowspan 1 -pady 2 + grid $base.fp.l3 \ + -in .pgaw:Function.fp -column 0 -row 4 -columnspan 1 -rowspan 1 -sticky w + grid $base.fp.e3 \ + -in .pgaw:Function.fp -column 1 -row 4 -columnspan 1 -rowspan 1 + grid $base.fp.l4 \ + -in .pgaw:Function.fp -column 3 -row 4 -columnspan 1 -rowspan 1 -sticky w + grid $base.fp.e4 \ + -in .pgaw:Function.fp -column 4 -row 4 -columnspan 1 -rowspan 1 -pady 3 + grid $base.fp.lspace \ + -in .pgaw:Function.fp -column 2 -row 4 -columnspan 1 -rowspan 1 + pack $base.fs \ + -in .pgaw:Function -anchor center -expand 1 -fill both -side top + pack $base.fs.text1 \ + -in .pgaw:Function.fs -anchor center -expand 1 -fill both -side left + pack $base.fs.vsb \ + -in .pgaw:Function.fs -anchor center -expand 0 -fill y -side right + pack $base.fb \ + -in .pgaw:Function -anchor center -expand 0 -fill x -side bottom + pack $base.fb.fbc \ + -in .pgaw:Function.fb -anchor center -expand 0 -fill none -side top + pack $base.fb.fbc.btnsave \ + -in .pgaw:Function.fb.fbc -anchor center -expand 0 -fill none -side left + pack $base.fb.fbc.btnhelp \ + -in .pgaw:Function.fb.fbc -anchor center -expand 0 -fill none -side left + pack $base.fb.fbc.btncancel \ + -in .pgaw:Function.fb.fbc -anchor center -expand 0 -fill none -side right +} + diff --git a/src/bin/pgaccess/lib/help.tcl b/src/bin/pgaccess/lib/help.tcl new file mode 100644 index 00000000000..87f65703f89 --- /dev/null +++ b/src/bin/pgaccess/lib/help.tcl @@ -0,0 +1,127 @@ +namespace eval Help { + +proc {findLink} {} { + foreach tagname [.pgaw:Help.f.t tag names current] { + if {$tagname!="link"} { + load $tagname + return + } + } +} + + +proc {load} {topic args} { +global PgAcVar + if {![winfo exists .pgaw:Help]} { + Window show .pgaw:Help + tkwait visibility .pgaw:Help + } + wm deiconify .pgaw:Help + if {![info exists PgAcVar(help,history)]} { + set PgAcVar(help,history) {} + } + if {[llength $args]==1} { + set PgAcVar(help,current_topic) [lindex $args 0] + set PgAcVar(help,history) [lrange $PgAcVar(help,history) 0 [lindex $args 0]] + } else { + lappend PgAcVar(help,history) $topic + set PgAcVar(help,current_topic) [expr {[llength $PgAcVar(help,history)]-1}] + } + # Limit the history length to 100 topics + if {[llength $PgAcVar(help,history)]>100} { + set PgAcVar(help,history) [lrange $PgAcVar(help,history) 1 end] + } + + .pgaw:Help.f.t configure -state normal + .pgaw:Help.f.t delete 1.0 end + .pgaw:Help.f.t tag configure bold -font $PgAcVar(pref,font_bold) + .pgaw:Help.f.t tag configure italic -font $PgAcVar(pref,font_italic) + .pgaw:Help.f.t tag configure large -font {Helvetica -14 bold} + .pgaw:Help.f.t tag configure title -font $PgAcVar(pref,font_bold) -justify center + .pgaw:Help.f.t tag configure link -font {Helvetica -12 underline} -foreground #000080 + .pgaw:Help.f.t tag configure code -font $PgAcVar(pref,font_fix) + .pgaw:Help.f.t tag configure warning -font $PgAcVar(pref,font_bold) -foreground #800000 + .pgaw:Help.f.t tag bind link {Help::findLink} + set errmsg {} + .pgaw:Help.f.t configure -tabs {30 60 90 120 150 180 210 240 270 300 330 360 390} + catch { source [file join $PgAcVar(PGACCESS_HOME) lib help $topic.hlp] } errmsg + if {$errmsg!=""} { + .pgaw:Help.f.t insert end "Error loading help file [file join $PgAcVar(PGACCESS_HOME) $topic.hlp]\n\n$errmsg" bold + } + .pgaw:Help.f.t configure -state disabled + focus .pgaw:Help.f.sb +} + +proc {back} {} { +global PgAcVar + if {![info exists PgAcVar(help,history)]} {return} + if {[llength $PgAcVar(help,history)]==0} {return} + set i $PgAcVar(help,current_topic) + if {$i<1} {return} + incr i -1 + load [lindex $PgAcVar(help,history) $i] $i +} + + +} + +proc vTclWindow.pgaw:Help {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:Help + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + set sw [winfo screenwidth .] + set sh [winfo screenheight .] + set x [expr {($sw - 640)/2}] + set y [expr {($sh - 480)/2}] + wm geometry $base 640x480+$x+$y + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm deiconify $base + wm title $base [intlmsg "Help"] + bind $base "Window destroy .pgaw:Help" + frame $base.fb \ + -borderwidth 2 -height 75 -relief groove -width 125 + button $base.fb.bback \ + -command Help::back -padx 9 -pady 3 -text [intlmsg Back] + button $base.fb.bi \ + -command {Help::load index} -padx 9 -pady 3 -text [intlmsg Index] + button $base.fb.bp \ + -command {Help::load postgresql} -padx 9 -pady 3 -text PostgreSQL + button $base.fb.btnclose \ + -command {Window destroy .pgaw:Help} -padx 9 -pady 3 -text [intlmsg Close] + frame $base.f \ + -borderwidth 2 -height 75 -relief groove -width 125 + text $base.f.t \ + -borderwidth 1 -cursor {} -font $PgAcVar(pref,font_normal) -height 2 \ + -highlightthickness 0 -state disabled \ + -tabs {30 60 90 120 150 180 210 240 270 300 330 360 390} -width 8 \ + -wrap word -yscrollcommand {.pgaw:Help.f.sb set} + scrollbar $base.f.sb \ + -borderwidth 1 -command {.pgaw:Help.f.t yview} -highlightthickness 0 \ + -orient vert + pack $base.fb \ + -in .pgaw:Help -anchor center -expand 0 -fill x -side top + pack $base.fb.bback \ + -in .pgaw:Help.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.bi \ + -in .pgaw:Help.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.bp \ + -in .pgaw:Help.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.btnclose \ + -in .pgaw:Help.fb -anchor center -expand 0 -fill none -side right + pack $base.f \ + -in .pgaw:Help -anchor center -expand 1 -fill both -side top + pack $base.f.t \ + -in .pgaw:Help.f -anchor center -expand 1 -fill both -side left + pack $base.f.sb \ + -in .pgaw:Help.f -anchor center -expand 0 -fill y -side right +} + diff --git a/src/bin/pgaccess/lib/mainlib.tcl b/src/bin/pgaccess/lib/mainlib.tcl new file mode 100644 index 00000000000..b4379a4f831 --- /dev/null +++ b/src/bin/pgaccess/lib/mainlib.tcl @@ -0,0 +1,987 @@ +namespace eval Mainlib { + +proc {cmd_Delete} {} { +global PgAcVar CurrentDB +if {$CurrentDB==""} return; +set objtodelete [get_dwlb_Selection] +if {$objtodelete==""} return; +set delmsg [format [intlmsg "You are going to delete\n\n %s \n\nProceed?"] $objtodelete] +if {[tk_messageBox -title [intlmsg "FINAL WARNING"] -parent .pgaw:Main -message $delmsg -type yesno -default no]=="no"} { return } +switch $PgAcVar(activetab) { + Tables { + sql_exec noquiet "drop table \"$objtodelete\"" + sql_exec quiet "delete from pga_layout where tablename='$objtodelete'" + cmd_Tables + } + Schema { + sql_exec quiet "delete from pga_schema where schemaname='$objtodelete'" + cmd_Schema + } + Views { + sql_exec noquiet "drop view \"$objtodelete\"" + sql_exec quiet "delete from pga_layout where tablename='$objtodelete'" + cmd_Views + } + Queries { + sql_exec quiet "delete from pga_queries where queryname='$objtodelete'" + sql_exec quiet "delete from pga_layout where tablename='$objtodelete'" + cmd_Queries + } + Scripts { + sql_exec quiet "delete from pga_scripts where scriptname='$objtodelete'" + cmd_Scripts + } + Forms { + sql_exec quiet "delete from pga_forms where formname='$objtodelete'" + cmd_Forms + } + Sequences { + sql_exec quiet "drop sequence \"$objtodelete\"" + cmd_Sequences + } + Functions { + delete_function $objtodelete + cmd_Functions + } + Reports { + sql_exec noquiet "delete from pga_reports where reportname='$objtodelete'" + cmd_Reports + } + Users { + sql_exec noquiet "drop user \"$objtodelete\"" + cmd_Users + } +} +} + +proc {cmd_Design} {} { +global PgAcVar CurrentDB +if {$CurrentDB==""} return; +if {[.pgaw:Main.lb curselection]==""} return; +set objname [.pgaw:Main.lb get [.pgaw:Main.lb curselection]] +set tablename $objname +switch $PgAcVar(activetab) { + Tables { + Tables::design $objname + } + Schema { + Schema::open $objname + } + Queries { + Queries::design $objname + } + Views { + Views::design $objname + } + Scripts { + Scripts::design $objname + } + Forms { + Forms::design $objname + } + Functions { + Functions::design $objname + } + Reports { + Reports::design $objname + } + Users { + Users::design $objname + } +} +} + +proc {cmd_Forms} {} { +global CurrentDB + setCursor CLOCK + .pgaw:Main.lb delete 0 end + catch { + wpg_select $CurrentDB "select formname from pga_forms order by formname" rec { + .pgaw:Main.lb insert end $rec(formname) + } + } + setCursor DEFAULT +} + + +proc {cmd_Functions} {} { +global CurrentDB + set maxim 16384 + setCursor CLOCK + catch { + wpg_select $CurrentDB "select oid from pg_database where datname='template1'" rec { + set maxim $rec(oid) + } + } + .pgaw:Main.lb delete 0 end + catch { + wpg_select $CurrentDB "select proname from pg_proc where oid>$maxim order by proname" rec { + .pgaw:Main.lb insert end $rec(proname) + } + } + setCursor DEFAULT +} + + +proc {cmd_Import_Export} {how} { +global PgAcVar CurrentDB + if {$CurrentDB==""} return; + Window show .pgaw:ImportExport + set PgAcVar(impexp,tablename) {} + set PgAcVar(impexp,filename) {} + set PgAcVar(impexp,delimiter) {} + if {$PgAcVar(activetab)=="Tables"} { + set tn [get_dwlb_Selection] + set PgAcVar(impexp,tablename) $tn + if {$tn!=""} {set PgAcVar(impexp,filename) "$tn.txt"} + } + .pgaw:ImportExport.expbtn configure -text [intlmsg $how] +} + + +proc {cmd_New} {} { +global PgAcVar CurrentDB +if {$CurrentDB==""} return; +switch $PgAcVar(activetab) { + Tables { + Tables::new + } + Schema { + Schema::new + } + Queries { + Queries::new + } + Users { + Users::new + } + Views { + Views::new + } + Sequences { + Sequences::new + } + Reports { + Reports::new + } + Forms { + Forms::new + } + Scripts { + Scripts::new + } + Functions { + Functions::new + } +} +} + + +proc {cmd_Open} {} { +global PgAcVar CurrentDB + if {$CurrentDB==""} return; + set objname [get_dwlb_Selection] + if {$objname==""} return; + switch $PgAcVar(activetab) { + Tables { Tables::open $objname } + Schema { Schema::open $objname } + Forms { Forms::open $objname } + Scripts { Scripts::open $objname } + Queries { Queries::open $objname } + Views { Views::open $objname } + Sequences { Sequences::open $objname } + Functions { Functions::design $objname } + Reports { Reports::open $objname } + } +} + + + +proc {cmd_Queries} {} { +global CurrentDB + .pgaw:Main.lb delete 0 end + catch { + wpg_select $CurrentDB "select queryname from pga_queries order by queryname" rec { + .pgaw:Main.lb insert end $rec(queryname) + } + } +} + + +proc {cmd_Rename} {} { +global PgAcVar CurrentDB + if {$CurrentDB==""} return; + if {$PgAcVar(activetab)=="Views"} return; + if {$PgAcVar(activetab)=="Sequences"} return; + if {$PgAcVar(activetab)=="Functions"} return; + if {$PgAcVar(activetab)=="Users"} return; + set temp [get_dwlb_Selection] + if {$temp==""} { + tk_messageBox -title [intlmsg Warning] -parent .pgaw:Main -message [intlmsg "Please select an object first!"] + return; + } + set PgAcVar(Old_Object_Name) $temp + Window show .pgaw:RenameObject +} + + +proc {cmd_Reports} {} { +global CurrentDB + setCursor CLOCK + catch { + wpg_select $CurrentDB "select reportname from pga_reports order by reportname" rec { + .pgaw:Main.lb insert end "$rec(reportname)" + } + } + setCursor DEFAULT +} + +proc {cmd_Users} {} { +global CurrentDB + setCursor CLOCK + .pgaw:Main.lb delete 0 end + catch { + wpg_select $CurrentDB "select * from pg_user order by usename" rec { + .pgaw:Main.lb insert end $rec(usename) + } + } + setCursor DEFAULT +} + + +proc {cmd_Scripts} {} { +global CurrentDB + setCursor CLOCK + .pgaw:Main.lb delete 0 end + catch { + wpg_select $CurrentDB "select scriptname from pga_scripts order by scriptname" rec { + .pgaw:Main.lb insert end $rec(scriptname) + } + } + setCursor DEFAULT +} + + +proc {cmd_Sequences} {} { +global CurrentDB + +setCursor CLOCK +.pgaw:Main.lb delete 0 end +catch { + wpg_select $CurrentDB "select relname from pg_class where (relname not like 'pg_%') and (relkind='S') order by relname" rec { + .pgaw:Main.lb insert end $rec(relname) + } +} +setCursor DEFAULT +} + +proc {cmd_Tables} {} { +global CurrentDB + setCursor CLOCK + .pgaw:Main.lb delete 0 end + foreach tbl [Database::getTablesList] {.pgaw:Main.lb insert end $tbl} + setCursor DEFAULT +} + +proc {cmd_Schema} {} { +global CurrentDB +.pgaw:Main.lb delete 0 end +catch { + wpg_select $CurrentDB "select schemaname from pga_schema order by schemaname" rec { + .pgaw:Main.lb insert end $rec(schemaname) + } +} +} + +proc {cmd_Views} {} { +global CurrentDB +setCursor CLOCK +.pgaw:Main.lb delete 0 end +catch { + wpg_select $CurrentDB "select c.relname,count(c.relname) from pg_class C, pg_rewrite R where (relname !~ '^pg_') and (r.ev_class = C.oid) and (r.ev_type = '1') group by relname" rec { + if {$rec(count)!=0} { + set itsaview($rec(relname)) 1 + } + } + wpg_select $CurrentDB "select relname from pg_class where (relname !~ '^pg_') and (relkind='r') and (relhasrules) order by relname" rec { + if {[info exists itsaview($rec(relname))]} { + .pgaw:Main.lb insert end $rec(relname) + } + } +} +setCursor DEFAULT +} + +proc {delete_function} {objname} { +global CurrentDB + wpg_select $CurrentDB "select proargtypes,pronargs from pg_proc where proname='$objname'" rec { + set PgAcVar(function,parameters) $rec(proargtypes) + set nrpar $rec(pronargs) + } + set lispar {} + for {set i 0} {$i<$nrpar} {incr i} { + lappend lispar [Database::getPgType [lindex $PgAcVar(function,parameters) $i]] + } + set lispar [join $lispar ,] + sql_exec noquiet "drop function $objname ($lispar)" +} + + +proc {draw_tabs} {} { +global PgAcVar + set ypos 85 + foreach tab $PgAcVar(tablist) { + label .pgaw:Main.tab$tab -borderwidth 1 -anchor w -relief raised -text [intlmsg $tab] + place .pgaw:Main.tab$tab -x 10 -y $ypos -height 25 -width 82 -anchor nw -bordermode ignore + lower .pgaw:Main.tab$tab + bind .pgaw:Main.tab$tab "Mainlib::tab_click $tab" + incr ypos 25 + } + set PgAcVar(activetab) "" +} + + +proc {get_dwlb_Selection} {} { + set temp [.pgaw:Main.lb curselection] + if {$temp==""} return ""; + return [.pgaw:Main.lb get $temp] +} + + + + +proc {sqlw_display} {msg} { + if {![winfo exists .pgaw:SQLWindow]} {return} + .pgaw:SQLWindow.f.t insert end "$msg\n\n" + .pgaw:SQLWindow.f.t see end + set nrlines [lindex [split [.pgaw:SQLWindow.f.t index end] .] 0] + if {$nrlines>50} { + .pgaw:SQLWindow.f.t delete 1.0 3.0 + } +} + + +proc {open_database} {} { +global PgAcVar CurrentDB +setCursor CLOCK +if {$PgAcVar(opendb,username)!=""} { + if {$PgAcVar(opendb,host)!=""} { + set connres [catch {set newdbc [pg_connect -conninfo "host=$PgAcVar(opendb,host) port=$PgAcVar(opendb,pgport) dbname=$PgAcVar(opendb,dbname) user=$PgAcVar(opendb,username) password=$PgAcVar(opendb,password)"]} msg] + } else { + set connres [catch {set newdbc [pg_connect -conninfo "dbname=$PgAcVar(opendb,dbname) user=$PgAcVar(opendb,username) password=$PgAcVar(opendb,password)"]} msg] + } +} else { + set connres [catch {set newdbc [pg_connect $PgAcVar(opendb,dbname) -host $PgAcVar(opendb,host) -port $PgAcVar(opendb,pgport)]} msg] +} +if {$connres} { + setCursor DEFAULT + showError [format [intlmsg "Error trying to connect to database '%s' on host %s \n\nPostgreSQL error message:%s"] $PgAcVar(opendb,dbname) $PgAcVar(opendb,host) $msg"] + return $msg +} else { + catch {pg_disconnect $CurrentDB} + set CurrentDB $newdbc + set PgAcVar(currentdb,host) $PgAcVar(opendb,host) + set PgAcVar(currentdb,pgport) $PgAcVar(opendb,pgport) + set PgAcVar(currentdb,dbname) $PgAcVar(opendb,dbname) + set PgAcVar(currentdb,username) $PgAcVar(opendb,username) + set PgAcVar(currentdb,password) $PgAcVar(opendb,password) + set PgAcVar(statusline,dbname) $PgAcVar(currentdb,dbname) + set PgAcVar(pref,lastdb) $PgAcVar(currentdb,dbname) + set PgAcVar(pref,lasthost) $PgAcVar(currentdb,host) + set PgAcVar(pref,lastport) $PgAcVar(currentdb,pgport) + set PgAcVar(pref,lastusername) $PgAcVar(currentdb,username) + Preferences::save + catch {setCursor DEFAULT ; Window hide .pgaw:OpenDB} + tab_click Tables + # Check for pga_ tables + foreach {table structure} {pga_queries {queryname varchar(64),querytype char(1),querycommand text,querytables text,querylinks text,queryresults text,querycomments 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} pga_schema {schemaname varchar(64),schematables text,schemalinks text}} { + set pgres [wpg_exec $CurrentDB "select relname from pg_class where relname='$table'"] + if {$PgAcVar(pgsql,status)!="PGRES_TUPLES_OK"} { + showError "[intlmsg {FATAL ERROR searching for PgAccess system tables}] : $PgAcVar(pgsql,errmsg)\nStatus:$PgAcVar(pgsql,status)" + catch {pg_disconnect $CurrentDB} + 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" + } else { + foreach fieldspec [split $structure ,] { + set field [lindex [split $fieldspec] 0] + set pgres [wpg_exec $CurrentDB "select \"$field\" from \"$table\""] + if {$PgAcVar(pgsql,status)!="PGRES_TUPLES_OK"} { + if {![regexp "attribute '$field' not found" $PgAcVar(pgsql,errmsg)]} { + showError "[intlmsg {FATAL ERROR upgrading PgAccess table}] $table: $PgAcVar(pgsql,errmsg)\nStatus:$PgAcVar(pgsql,status)" + catch {pg_disconnect $CurrentDB} + exit + } else { + pg_result $pgres -clear + sql_exec quiet "alter table \"$table\" add column $fieldspec " + } + } + } + } + catch {pg_result $pgres -clear} + } + + # searching for autoexec script + wpg_select $CurrentDB "select * from pga_scripts where scriptname ~* '^autoexec$'" recd { + eval $recd(scriptsource) + } + return "" +} +} + + +proc {tab_click} {tabname} { +global PgAcVar CurrentDB + set w .pgaw:Main.tab$tabname + if {$CurrentDB==""} return; + set curtab $tabname + #if {$PgAcVar(activetab)==$curtab} return; + .pgaw:Main.btndesign configure -state disabled + if {$PgAcVar(activetab)!=""} { + place .pgaw:Main.tab$PgAcVar(activetab) -x 10 + .pgaw:Main.tab$PgAcVar(activetab) configure -font $PgAcVar(pref,font_normal) + } + $w configure -font $PgAcVar(pref,font_bold) + place $w -x 7 + place .pgaw:Main.lmask -x 80 -y [expr 86+25*[lsearch -exact $PgAcVar(tablist) $curtab]] + set PgAcVar(activetab) $curtab + # Tabs where button Design is enabled + if {[lsearch {Tables Schema Scripts Queries Functions Views Reports Forms Users} $PgAcVar(activetab)]!=-1} { + .pgaw:Main.btndesign configure -state normal + } + .pgaw:Main.lb delete 0 end + cmd_$curtab +} + + + +} + + +proc vTclWindow.pgaw:Main {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:Main + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel \ + -background #efefef -cursor left_ptr + wm focusmodel $base passive + wm geometry $base 332x390+96+172 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base "PostgreSQL access" + bind $base "Help::load index" + label $base.labframe \ + -relief raised + listbox $base.lb \ + -background #fefefe \ + -selectbackground #c3c3c3 \ + -foreground black -highlightthickness 0 -selectborderwidth 0 \ + -yscrollcommand {.pgaw:Main.sb set} + bind $base.lb { + Mainlib::cmd_Open + } + button $base.btnnew \ + -borderwidth 1 -command Mainlib::cmd_New -text [intlmsg New] + button $base.btnopen \ + -borderwidth 1 -command Mainlib::cmd_Open -text [intlmsg Open] + button $base.btndesign \ + -borderwidth 1 -command Mainlib::cmd_Design -text [intlmsg Design] + label $base.lmask \ + -borderwidth 0 \ + -text { } + frame $base.fm \ + -borderwidth 1 -height 75 -relief raised -width 125 + menubutton $base.fm.mndb \ + -borderwidth 1 -font $PgAcVar(pref,font_normal) \ + -menu .pgaw:Main.fm.mndb.01 -padx 4 -pady 3 -text [intlmsg Database] + menu $base.fm.mndb.01 \ + -borderwidth 1 -font $PgAcVar(pref,font_normal) \ + -tearoff 0 + $base.fm.mndb.01 add command \ + -command { +Window show .pgaw:OpenDB +set PgAcVar(opendb,host) $PgAcVar(currentdb,host) +set PgAcVar(opendb,pgport) $PgAcVar(currentdb,pgport) +focus .pgaw:OpenDB.f1.e3 +wm transient .pgaw:OpenDB .pgaw:Main +.pgaw:OpenDB.f1.e3 selection range 0 end} \ + -label [intlmsg Open] -font $PgAcVar(pref,font_normal) + $base.fm.mndb.01 add command \ + -command {.pgaw:Main.lb delete 0 end +set CurrentDB {} +set PgAcVar(currentdb,dbname) {} +set PgAcVar(statusline,dbname) {}} \ + -label [intlmsg Close] + $base.fm.mndb.01 add command \ + -command Database::vacuum -label [intlmsg Vacuum] + $base.fm.mndb.01 add separator + $base.fm.mndb.01 add command \ + -command {Mainlib::cmd_Import_Export Import} -label [intlmsg {Import table}] + $base.fm.mndb.01 add command \ + -command {Mainlib::cmd_Import_Export Export} -label [intlmsg {Export table}] + $base.fm.mndb.01 add separator + $base.fm.mndb.01 add command \ + -command Preferences::configure -label [intlmsg Preferences] + $base.fm.mndb.01 add command \ + -command "Window show .pgaw:SQLWindow" -label [intlmsg "SQL window"] + $base.fm.mndb.01 add separator + $base.fm.mndb.01 add command \ + -command { +set PgAcVar(activetab) {} +Preferences::save +catch {pg_disconnect $CurrentDB} +exit} -label [intlmsg Exit] + label $base.lshost \ + -relief groove -text localhost -textvariable PgAcVar(currentdb,host) + label $base.lsdbname \ + -anchor w \ + -relief groove -textvariable PgAcVar(statusline,dbname) + scrollbar $base.sb \ + -borderwidth 1 -command {.pgaw:Main.lb yview} -orient vert + menubutton $base.fm.mnob \ + -borderwidth 1 \ + -menu .pgaw:Main.fm.mnob.m -font $PgAcVar(pref,font_normal) -text [intlmsg Object] + menu $base.fm.mnob.m \ + -borderwidth 1 -font $PgAcVar(pref,font_normal) \ + -tearoff 0 + $base.fm.mnob.m add command \ + -command Mainlib::cmd_New -font $PgAcVar(pref,font_normal) -label [intlmsg New] + $base.fm.mnob.m add command \ + -command Mainlib::cmd_Delete -label [intlmsg Delete] + $base.fm.mnob.m add command \ + -command Mainlib::cmd_Rename -label [intlmsg Rename] + menubutton $base.fm.mnhelp \ + -borderwidth 1 \ + -menu .pgaw:Main.fm.mnhelp.m -font $PgAcVar(pref,font_normal) -text [intlmsg Help] + menu $base.fm.mnhelp.m \ + -borderwidth 1 -font $PgAcVar(pref,font_normal) \ + -tearoff 0 + $base.fm.mnhelp.m add command \ + -label [intlmsg Contents] -command {Help::load index} + $base.fm.mnhelp.m add command \ + -label PostgreSQL -command {Help::load postgresql} + $base.fm.mnhelp.m add separator + $base.fm.mnhelp.m add command \ + -command {Window show .pgaw:About} -label [intlmsg About] + place $base.labframe \ + -x 80 -y 30 -width 246 -height 325 -anchor nw -bordermode ignore + place $base.lb \ + -x 90 -y 75 -width 210 -height 272 -anchor nw -bordermode ignore + place $base.btnnew \ + -x 89 -y 40 -width 75 -height 25 -anchor nw -bordermode ignore + place $base.btnopen \ + -x 166 -y 40 -width 75 -height 25 -anchor nw -bordermode ignore + place $base.btndesign \ + -x 243 -y 40 -width 76 -height 25 -anchor nw -bordermode ignore + place $base.lmask \ + -x 1550 -y 4500 -width 10 -height 23 -anchor nw -bordermode ignore + place $base.lshost \ + -x 3 -y 370 -width 91 -height 20 -anchor nw -bordermode ignore + place $base.lsdbname \ + -x 95 -y 370 -width 233 -height 20 -anchor nw -bordermode ignore + place $base.sb \ + -x 301 -y 74 -width 18 -height 274 -anchor nw -bordermode ignore + place $base.fm \ + -x 1 -y 0 -width 331 -height 25 -anchor nw -bordermode ignore + pack $base.fm.mndb \ + -in .pgaw:Main.fm -anchor center -expand 0 -fill none -side left + pack $base.fm.mnob \ + -in .pgaw:Main.fm -anchor center -expand 0 -fill none -side left + pack $base.fm.mnhelp \ + -in .pgaw:Main.fm -anchor center -expand 0 -fill none -side right +} + +proc vTclWindow.pgaw:ImportExport {base} { + if {$base == ""} { + set base .pgaw:ImportExport + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 287x151+259+304 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm title $base [intlmsg "Import-Export table"] + label $base.l1 -borderwidth 0 -text [intlmsg {Table name}] + entry $base.e1 -background #fefefe -borderwidth 1 -textvariable PgAcVar(impexp,tablename) + label $base.l2 -borderwidth 0 -text [intlmsg {File name}] + entry $base.e2 -background #fefefe -borderwidth 1 -textvariable PgAcVar(impexp,filename) + label $base.l3 -borderwidth 0 -text [intlmsg {Field delimiter}] + entry $base.e3 -background #fefefe -borderwidth 1 -textvariable PgAcVar(impexp,delimiter) + button $base.expbtn -borderwidth 1 -command {if {$PgAcVar(impexp,tablename)==""} { + showError [intlmsg "You have to supply a table name!"] +} elseif {$PgAcVar(impexp,filename)==""} { + showError [intlmsg "You have to supply a external file name!"] +} else { + if {$PgAcVar(impexp,delimiter)==""} { + set sup "" + } else { + set sup " USING DELIMITERS '$PgAcVar(impexp,delimiter)'" + } + if {[.pgaw:ImportExport.expbtn cget -text]=="Import"} { + set oper "FROM" + } else { + set oper "TO" + } + if {$PgAcVar(impexp,withoids)} { + set sup2 " WITH OIDS " + } else { + set sup2 "" + } + set sqlcmd "COPY \"$PgAcVar(impexp,tablename)\" $sup2 $oper '$PgAcVar(impexp,filename)'$sup" + setCursor CLOCK + if {[sql_exec noquiet $sqlcmd]} { + tk_messageBox -title [intlmsg Information] -parent .pgaw:ImportExport -message [intlmsg "Operation completed!"] + Window destroy .pgaw:ImportExport + } + setCursor DEFAULT +}} -text Export + button $base.cancelbtn -borderwidth 1 -command {Window destroy .pgaw:ImportExport} -text [intlmsg Cancel] + checkbutton $base.oicb -borderwidth 1 -text [intlmsg {with OIDs}] -variable PgAcVar(impexp,withoids) + place $base.l1 -x 15 -y 15 -anchor nw -bordermode ignore + place $base.e1 -x 115 -y 10 -height 22 -anchor nw -bordermode ignore + place $base.l2 -x 15 -y 45 -anchor nw -bordermode ignore + place $base.e2 -x 115 -y 40 -height 22 -anchor nw -bordermode ignore + place $base.l3 -x 15 -y 75 -height 18 -anchor nw -bordermode ignore + place $base.e3 -x 115 -y 74 -width 33 -height 22 -anchor nw -bordermode ignore + place $base.expbtn -x 60 -y 110 -height 25 -width 75 -anchor nw -bordermode ignore + place $base.cancelbtn -x 155 -y 110 -height 25 -width 75 -anchor nw -bordermode ignore + place $base.oicb -x 170 -y 75 -anchor nw -bordermode ignore +} + + + +proc vTclWindow.pgaw:RenameObject {base} { + if {$base == ""} { + set base .pgaw:RenameObject + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 272x105+294+262 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm title $base [intlmsg "Rename"] + label $base.l1 -borderwidth 0 -text [intlmsg {New name}] + entry $base.e1 -background #fefefe -borderwidth 1 -textvariable PgAcVar(New_Object_Name) + button $base.b1 -borderwidth 1 -command { + if {$PgAcVar(New_Object_Name)==""} { + showError [intlmsg "You must give object a new name!"] + } elseif {$PgAcVar(activetab)=="Tables"} { + set retval [sql_exec noquiet "alter table \"$PgAcVar(Old_Object_Name)\" rename to \"$PgAcVar(New_Object_Name)\""] + if {$retval} { + sql_exec quiet "update pga_layout set tablename='$PgAcVar(New_Object_Name)' where tablename='$PgAcVar(Old_Object_Name)'" + Mainlib::cmd_Tables + Window destroy .pgaw:RenameObject + } + } elseif {$PgAcVar(activetab)=="Queries"} { + set pgres [wpg_exec $CurrentDB "select * from pga_queries where queryname='$PgAcVar(New_Object_Name)'"] + if {$PgAcVar(pgsql,status)!="PGRES_TUPLES_OK"} { + showError "[intlmsg {Error retrieving from}] pga_queries\n$PgAcVar(pgsql,errmsg)\n$PgAcVar(pgsql,status)" + } elseif {[pg_result $pgres -numTuples]>0} { + showError [format [intlmsg "Query '%s' already exists!"] $PgAcVar(New_Object_Name)] + } else { + sql_exec noquiet "update pga_queries set queryname='$PgAcVar(New_Object_Name)' where queryname='$PgAcVar(Old_Object_Name)'" + sql_exec noquiet "update pga_layout set tablename='$PgAcVar(New_Object_Name)' where tablename='$PgAcVar(Old_Object_Name)'" + Mainlib::cmd_Queries + Window destroy .pgaw:RenameObject + } + catch {pg_result $pgres -clear} + } elseif {$PgAcVar(activetab)=="Forms"} { + set pgres [wpg_exec $CurrentDB "select * from pga_forms where formname='$PgAcVar(New_Object_Name)'"] + if {$PgAcVar(pgsql,status)!="PGRES_TUPLES_OK"} { + showError "[intlmsg {Error retrieving from}] pga_forms\n$PgAcVar(pgsql,errmsg)\n$PgAcVar(pgsql,status)" + } elseif {[pg_result $pgres -numTuples]>0} { + showError [format [intlmsg "Form '%s' already exists!"] $PgAcVar(New_Object_Name)] + } else { + sql_exec noquiet "update pga_forms set formname='$PgAcVar(New_Object_Name)' where formname='$PgAcVar(Old_Object_Name)'" + Mainlib::cmd_Forms + Window destroy .pgaw:RenameObject + } + catch {pg_result $pgres -clear} + } elseif {$PgAcVar(activetab)=="Scripts"} { + set pgres [wpg_exec $CurrentDB "select * from pga_scripts where scriptname='$PgAcVar(New_Object_Name)'"] + if {$PgAcVar(pgsql,status)!="PGRES_TUPLES_OK"} { + showError "[intlmsg {Error retrieving from}] pga_scripts\n$PgAcVar(pgsql,errmsg)\n$PgAcVar(pgsql,status)" + } elseif {[pg_result $pgres -numTuples]>0} { + showError [format [intlmsg "Script '%s' already exists!"] $PgAcVar(New_Object_Name)] + } else { + sql_exec noquiet "update pga_scripts set scriptname='$PgAcVar(New_Object_Name)' where scriptname='$PgAcVar(Old_Object_Name)'" + Mainlib::cmd_Scripts + Window destroy .pgaw:RenameObject + } + catch {pg_result $pgres -clear} + } elseif {$PgAcVar(activetab)=="Schema"} { + set pgres [wpg_exec $CurrentDB "select * from pga_schema where schemaname='$PgAcVar(New_Object_Name)'"] + if {$PgAcVar(pgsql,status)!="PGRES_TUPLES_OK"} { + showError "[intlmsg {Error retrieving from}] pga_schema\n$PgAcVar(pgsql,errmsg)\n$PgAcVar(pgsql,status)" + } elseif {[pg_result $pgres -numTuples]>0} { + showError [format [intlmsg "Schema '%s' already exists!"] $PgAcVar(New_Object_Name)] + } else { + sql_exec noquiet "update pga_schema set schemaname='$PgAcVar(New_Object_Name)' where schemaname='$PgAcVar(Old_Object_Name)'" + Mainlib::cmd_Schema + Window destroy .pgaw:RenameObject + } + catch {pg_result $pgres -clear} + } + } -text [intlmsg Rename] + button $base.b2 -borderwidth 1 -command {Window destroy .pgaw:RenameObject} -text [intlmsg 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 55 -y 65 -width 80 -anchor nw -bordermode ignore + place $base.b2 -x 155 -y 65 -width 80 -anchor nw -bordermode ignore +} + + +proc vTclWindow.pgaw:GetParameter {base} { + if {$base == ""} { + set base .pgaw:GetParameter + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + set sw [winfo screenwidth .] + set sh [winfo screenheight .] + set x [expr ($sw - 297)/2] + set y [expr ($sh - 98)/2] + wm geometry $base 297x98+$x+$y + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base [intlmsg "Input parameter"] + label $base.l1 \ + -anchor nw -borderwidth 1 \ + -justify left -relief sunken -textvariable PgAcVar(getqueryparam,msg) -wraplength 200 + entry $base.e1 \ + -background #fefefe -borderwidth 1 -highlightthickness 0 \ + -textvariable PgAcVar(getqueryparam,var) + bind $base.e1 { + set PgAcVar(getqueryparam,result) 1 +destroy .pgaw:GetParameter + } + bind $base.e1 { + set PgAcVar(getqueryparam,result) 1 +destroy .pgaw:GetParameter + } + button $base.bok \ + -borderwidth 1 -command {set PgAcVar(getqueryparam,result) 1 +destroy .pgaw:GetParameter} -text Ok + button $base.bcanc \ + -borderwidth 1 -command {set PgAcVar(getqueryparam,result) 0 +destroy .pgaw:GetParameter} -text [intlmsg Cancel] + place $base.l1 \ + -x 10 -y 5 -width 201 -height 53 -anchor nw -bordermode ignore + place $base.e1 \ + -x 10 -y 65 -width 200 -height 24 -anchor nw -bordermode ignore + place $base.bok \ + -x 225 -y 5 -width 61 -height 26 -anchor nw -bordermode ignore + place $base.bcanc \ + -x 225 -y 35 -width 61 -height 26 -anchor nw -bordermode ignore +} + + +proc vTclWindow.pgaw:SQLWindow {base} { + if {$base == ""} { + set base .pgaw:SQLWindow + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 551x408+192+169 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm deiconify $base + wm title $base [intlmsg "SQL window"] + frame $base.f \ + -borderwidth 1 -height 392 -relief raised -width 396 + scrollbar $base.f.01 \ + -borderwidth 1 -command {.pgaw:SQLWindow.f.t xview} -orient horiz \ + -width 10 + scrollbar $base.f.02 \ + -borderwidth 1 -command {.pgaw:SQLWindow.f.t yview} -orient vert -width 10 + text $base.f.t \ + -borderwidth 1 \ + -height 200 -width 200 -wrap word \ + -xscrollcommand {.pgaw:SQLWindow.f.01 set} \ + -yscrollcommand {.pgaw:SQLWindow.f.02 set} + button $base.b1 \ + -borderwidth 1 -command {.pgaw:SQLWindow.f.t delete 1.0 end} -text [intlmsg Clean] + button $base.b2 \ + -borderwidth 1 -command {destroy .pgaw:SQLWindow} -text [intlmsg Close] + grid columnconf $base 0 -weight 1 + grid columnconf $base 1 -weight 1 + grid rowconf $base 0 -weight 1 + grid $base.f \ + -in .pgaw:SQLWindow -column 0 -row 0 -columnspan 2 -rowspan 1 + grid columnconf $base.f 0 -weight 1 + grid rowconf $base.f 0 -weight 1 + grid $base.f.01 \ + -in .pgaw:SQLWindow.f -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky ew + grid $base.f.02 \ + -in .pgaw:SQLWindow.f -column 1 -row 0 -columnspan 1 -rowspan 1 -sticky ns + grid $base.f.t \ + -in .pgaw:SQLWindow.f -column 0 -row 0 -columnspan 1 -rowspan 1 \ + -sticky nesw + grid $base.b1 \ + -in .pgaw:SQLWindow -column 0 -row 1 -columnspan 1 -rowspan 1 + grid $base.b2 \ + -in .pgaw:SQLWindow -column 1 -row 1 -columnspan 1 -rowspan 1 +} + +proc vTclWindow.pgaw:About {base} { + if {$base == ""} { + set base .pgaw:About + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 471x177+168+243 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm title $base [intlmsg "About"] + label $base.l1 -borderwidth 3 -font -Adobe-Helvetica-Bold-R-Normal-*-*-180-*-*-*-*-* -relief ridge -text PgAccess + label $base.l2 -relief groove -text [intlmsg "A Tcl/Tk interface to\nPostgreSQL\nby Constantin Teodorescu"] + label $base.l3 -borderwidth 0 -relief sunken -text {v 0.98} + label $base.l4 -relief groove -text "[intlmsg {You will always get the latest version at:}] +http://www.flex.ro/pgaccess + +[intlmsg {Suggestions at}] : teo@flex.ro" + button $base.b1 -borderwidth 1 -command {Window destroy .pgaw:About} -text Ok + place $base.l1 -x 10 -y 10 -width 196 -height 103 -anchor nw -bordermode ignore + place $base.l2 -x 10 -y 115 -width 198 -height 55 -anchor nw -bordermode ignore + place $base.l3 -x 145 -y 80 -anchor nw -bordermode ignore + place $base.l4 -x 215 -y 10 -width 246 -height 103 -anchor nw -bordermode ignore + place $base.b1 -x 295 -y 130 -width 105 -height 28 -anchor nw -bordermode ignore +} + +proc vTclWindow.pgaw:OpenDB {base} { + if {$base == ""} { + set base .pgaw:OpenDB + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 283x172+119+210 + 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 [intlmsg "Open database"] + frame $base.f1 \ + -borderwidth 2 -height 75 -width 125 + label $base.f1.l1 \ + -borderwidth 0 -relief raised -text [intlmsg Host] + entry $base.f1.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(opendb,host) -width 200 + bind $base.f1.e1 { + focus .pgaw:OpenDB.f1.e2 + } + bind $base.f1.e1 { + focus .pgaw:OpenDB.f1.e2 + } + label $base.f1.l2 \ + -borderwidth 0 -relief raised -text [intlmsg Port] + entry $base.f1.e2 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(opendb,pgport) -width 200 + bind $base.f1.e2 { + focus .pgaw:OpenDB.f1.e3 + } + label $base.f1.l3 \ + -borderwidth 0 -relief raised -text [intlmsg Database] + entry $base.f1.e3 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(opendb,dbname) -width 200 + bind $base.f1.e3 { + focus .pgaw:OpenDB.f1.e4 + } + label $base.f1.l4 \ + -borderwidth 0 -relief raised -text [intlmsg Username] + entry $base.f1.e4 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(opendb,username) \ + -width 200 + bind $base.f1.e4 { + focus .pgaw:OpenDB.f1.e5 + } + label $base.f1.ls2 \ + -borderwidth 0 -relief raised -text { } + label $base.f1.l5 \ + -borderwidth 0 -relief raised -text [intlmsg Password] + entry $base.f1.e5 \ + -background #fefefe -borderwidth 1 -show x -textvariable PgAcVar(opendb,password) \ + -width 200 + bind $base.f1.e5 { + focus .pgaw:OpenDB.fb.btnopen + } + frame $base.fb \ + -height 75 -relief groove -width 125 + button $base.fb.btnopen \ + -borderwidth 1 -command Mainlib::open_database -padx 9 \ + -pady 3 -text [intlmsg Open] + button $base.fb.btncancel \ + -borderwidth 1 -command {Window hide .pgaw:OpenDB} \ + -padx 9 -pady 3 -text [intlmsg Cancel] + place $base.f1 \ + -x 9 -y 5 -width 265 -height 126 -anchor nw -bordermode ignore + grid columnconf $base.f1 2 -weight 1 + grid $base.f1.l1 \ + -in .pgaw:OpenDB.f1 -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e1 \ + -in .pgaw:OpenDB.f1 -column 2 -row 0 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.l2 \ + -in .pgaw:OpenDB.f1 -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e2 \ + -in .pgaw:OpenDB.f1 -column 2 -row 2 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.l3 \ + -in .pgaw:OpenDB.f1 -column 0 -row 4 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e3 \ + -in .pgaw:OpenDB.f1 -column 2 -row 4 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.l4 \ + -in .pgaw:OpenDB.f1 -column 0 -row 6 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e4 \ + -in .pgaw:OpenDB.f1 -column 2 -row 6 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.ls2 \ + -in .pgaw:OpenDB.f1 -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.f1.l5 \ + -in .pgaw:OpenDB.f1 -column 0 -row 7 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e5 \ + -in .pgaw:OpenDB.f1 -column 2 -row 7 -columnspan 1 -rowspan 1 -pady 2 + place $base.fb \ + -x 0 -y 135 -width 283 -height 40 -anchor nw -bordermode ignore + grid $base.fb.btnopen \ + -in .pgaw:OpenDB.fb -column 0 -row 0 -columnspan 1 -rowspan 1 -padx 5 + grid $base.fb.btncancel \ + -in .pgaw:OpenDB.fb -column 1 -row 0 -columnspan 1 -rowspan 1 -padx 5 +} + + diff --git a/src/bin/pgaccess/lib/preferences.tcl b/src/bin/pgaccess/lib/preferences.tcl new file mode 100644 index 00000000000..c752e03ba4a --- /dev/null +++ b/src/bin/pgaccess/lib/preferences.tcl @@ -0,0 +1,273 @@ +namespace eval Preferences { + +proc {load} {} { +global PgAcVar + setDefaultFonts + setGUIPreferences + # Set some default values for preferences + set PgAcVar(pref,rows) 200 + set PgAcVar(pref,tvfont) clean + set PgAcVar(pref,autoload) 1 + set PgAcVar(pref,systemtables) 0 + set PgAcVar(pref,lastdb) {} + set PgAcVar(pref,lasthost) localhost + set PgAcVar(pref,lastport) 5432 + set PgAcVar(pref,username) {} + set PgAcVar(pref,password) {} + set PgAcVar(pref,language) english + set retval [catch {set fid [open "~/.pgaccessrc" r]} errmsg] + if {! $retval} { + while {![eof $fid]} { + set pair [gets $fid] + set PgAcVar([lindex $pair 0]) [lindex $pair 1] + } + close $fid + setGUIPreferences + } + # The following preferences values will be ignored from the .pgaccessrc file + set PgAcVar(pref,typecolors) {black red brown #007e00 #004e00 blue orange yellow pink purple cyan magenta lightblue lightgreen gray lightyellow} + set PgAcVar(pref,typelist) {text bool bytea float8 float4 int4 char name int8 int2 int28 regproc oid tid xid cid} + loadInternationalMessages +} + + +proc {save} {} { +global PgAcVar + catch { + set fid [open "~/.pgaccessrc" w] + foreach key [array names PgAcVar pref,*] { puts $fid "$key {$PgAcVar($key)}" } + close $fid + } + if {$PgAcVar(activetab)=="Tables"} { + Mainlib::tab_click Tables + } +} + +proc {configure} {} { +global PgAcVar + Window show .pgaw:Preferences + foreach language [lsort $PgAcVar(AVAILABLE_LANGUAGES)] {.pgaw:Preferences.fpl.flb.llb insert end $language} + wm transient .pgaw:Preferences .pgaw:Main +} + + +proc {loadInternationalMessages} {} { +global Messages PgAcVar + set PgAcVar(AVAILABLE_LANGUAGES) {english} + foreach filename [glob -nocomplain [file join $PgAcVar(PGACCESS_HOME) lib languages *]] { + lappend PgAcVar(AVAILABLE_LANGUAGES) [file tail $filename] + } + catch { unset Messages } + catch { source [file join $PgAcVar(PGACCESS_HOME) lib languages $PgAcVar(pref,language)] } +} + + +proc {changeLanguage} {} { +global PgAcVar + set sel [.pgaw:Preferences.fpl.flb.llb curselection] + if {$sel==""} {return} + set desired [.pgaw:Preferences.fpl.flb.llb get $sel] + if {$desired==$PgAcVar(pref,language)} {return} + set PgAcVar(pref,language) $desired + loadInternationalMessages + return + foreach wid [winfo children .pgaw:Main] { + set wtext {} + catch { set wtext [$wid cget -text] } + if {$wtext != ""} { + $wid configure -text [intlmsg $wtext] + } + } +} + + +proc {setDefaultFonts} {} { +global PgAcVar tcl_platform +if {[string toupper $tcl_platform(platform)]=="WINDOWS"} { + set PgAcVar(pref,font_normal) {"MS Sans Serif" 8} + set PgAcVar(pref,font_bold) {"MS Sans Serif" 8 bold} + set PgAcVar(pref,font_fix) {Terminal 8} + set PgAcVar(pref,font_italic) {"MS Sans Serif" 8 italic} +} else { + set PgAcVar(pref,font_normal) -Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-* + set PgAcVar(pref,font_bold) -Adobe-Helvetica-Bold-R-Normal-*-*-120-*-*-*-*-* + set PgAcVar(pref,font_italic) -Adobe-Helvetica-Medium-O-Normal-*-*-120-*-*-*-*-* + set PgAcVar(pref,font_fix) -*-Clean-Medium-R-Normal-*-*-130-*-*-*-*-* +} +} + + +proc {setGUIPreferences} {} { +global PgAcVar + foreach wid {Label Text Button Listbox Checkbutton Radiobutton} { + option add *$wid.font $PgAcVar(pref,font_normal) + } + option add *Entry.background #fefefe + option add *Entry.foreground #000000 + option add *Button.BorderWidth 1 +} + +} + + +################### END OF NAMESPACE PREFERENCES ################# + +proc vTclWindow.pgaw:Preferences {base} { + if {$base == ""} { + set base .pgaw:Preferences + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 450x360+100+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 [intlmsg "Preferences"] + bind $base "Window destroy .pgaw:Preferences" + frame $base.fl \ + -height 75 -relief groove -width 10 + frame $base.fr \ + -height 75 -relief groove -width 10 + frame $base.f1 \ + -height 80 -relief groove -width 125 + label $base.f1.l1 \ + -borderwidth 0 -relief raised \ + -text [intlmsg {Max rows displayed in table/query view}] + entry $base.f1.erows \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(pref,rows) -width 7 + frame $base.f2 \ + -height 75 -relief groove -width 125 + label $base.f2.l \ + -borderwidth 0 -relief raised -text [intlmsg {Table viewer font}] + label $base.f2.ls \ + -borderwidth 0 -relief raised -text { } + radiobutton $base.f2.pgaw:rb1 \ + -borderwidth 1 -text [intlmsg {fixed width}] -value clean \ + -variable PgAcVar(pref,tvfont) + radiobutton $base.f2.pgaw:rb2 \ + -borderwidth 1 -text [intlmsg proportional] -value helv -variable PgAcVar(pref,tvfont) + frame $base.ff \ + -height 75 -relief groove -width 125 + label $base.ff.l1 \ + -borderwidth 0 -relief raised -text [intlmsg {Font normal}] + entry $base.ff.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(pref,font_normal) \ + -width 200 + label $base.ff.l2 \ + -borderwidth 0 -relief raised -text [intlmsg {Font bold}] + entry $base.ff.e2 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(pref,font_bold) \ + -width 200 + label $base.ff.l3 \ + -borderwidth 0 -relief raised -text [intlmsg {Font italic}] + entry $base.ff.e3 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(pref,font_italic) \ + -width 200 + label $base.ff.l4 \ + -borderwidth 0 -relief raised -text [intlmsg {Font fixed}] + entry $base.ff.e4 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(pref,font_fix) \ + -width 200 + frame $base.fls \ + -borderwidth 1 -height 2 -relief sunken -width 125 + frame $base.fal \ + -height 75 -relief groove -width 125 + checkbutton $base.fal.al \ + -borderwidth 1 -text [intlmsg {Auto-load the last opened database at startup}] \ + -variable PgAcVar(pref,autoload) -anchor w + checkbutton $base.fal.st \ + -borderwidth 1 -text [intlmsg {View system tables}] \ + -variable PgAcVar(pref,systemtables) -anchor w + frame $base.fpl \ + -height 49 -relief groove -width 125 + label $base.fpl.lt \ + -borderwidth 0 -relief raised -text [intlmsg {Preferred language}] + frame $base.fpl.flb \ + -height 75 -relief sunken -width 125 + listbox $base.fpl.flb.llb \ + -borderwidth 1 -height 6 -yscrollcommand {.pgaw:Preferences.fpl.flb.vsb set} + scrollbar $base.fpl.flb.vsb \ + -borderwidth 1 -command {.pgaw:Preferences.fpl.flb.llb yview} -orient vert + frame $base.fb \ + -height 75 -relief groove -width 125 + button $base.fb.btnsave \ + -command {if {$PgAcVar(pref,rows)>200} { + tk_messageBox -title [intlmsg Warning] -parent .pgaw:Preferences -message [intlmsg "A big number of rows displayed in table view will take a lot of memory!"] +} +Preferences::changeLanguage +Preferences::save +Window destroy .pgaw:Preferences +tk_messageBox -title [intlmsg Warning] -parent .pgaw:Main -message [intlmsg "Changed fonts may appear in the next working session!"]} \ + -padx 9 -pady 3 -text [intlmsg Save] + button $base.fb.btncancel \ + -command {Window destroy .pgaw:Preferences} -padx 9 -pady 3 -text [intlmsg Cancel] + pack $base.fl \ + -in .pgaw:Preferences -anchor center -expand 0 -fill y -side left + pack $base.fr \ + -in .pgaw:Preferences -anchor center -expand 0 -fill y -side right + pack $base.f1 \ + -in .pgaw:Preferences -anchor center -expand 0 -fill x -pady 5 -side top + pack $base.f1.l1 \ + -in .pgaw:Preferences.f1 -anchor center -expand 0 -fill none -side left + pack $base.f1.erows \ + -in .pgaw:Preferences.f1 -anchor center -expand 0 -fill none -side left + pack $base.f2 \ + -in .pgaw:Preferences -anchor center -expand 0 -fill x -pady 5 -side top + pack $base.f2.l \ + -in .pgaw:Preferences.f2 -anchor center -expand 0 -fill none -side left + pack $base.f2.ls \ + -in .pgaw:Preferences.f2 -anchor center -expand 0 -fill none -side left + pack $base.f2.pgaw:rb1 \ + -in .pgaw:Preferences.f2 -anchor center -expand 0 -fill none -side left + pack $base.f2.pgaw:rb2 \ + -in .pgaw:Preferences.f2 -anchor center -expand 0 -fill none -side left + pack $base.ff \ + -in .pgaw:Preferences -anchor center -expand 0 -fill x -side top + grid columnconf $base.ff 1 -weight 1 + grid $base.ff.l1 \ + -in .pgaw:Preferences.ff -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.ff.e1 \ + -in .pgaw:Preferences.ff -column 1 -row 0 -columnspan 1 -rowspan 1 -pady 1 + grid $base.ff.l2 \ + -in .pgaw:Preferences.ff -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.ff.e2 \ + -in .pgaw:Preferences.ff -column 1 -row 2 -columnspan 1 -rowspan 1 -pady 1 + grid $base.ff.l3 \ + -in .pgaw:Preferences.ff -column 0 -row 4 -columnspan 1 -rowspan 1 -sticky w + grid $base.ff.e3 \ + -in .pgaw:Preferences.ff -column 1 -row 4 -columnspan 1 -rowspan 1 -pady 1 + grid $base.ff.l4 \ + -in .pgaw:Preferences.ff -column 0 -row 6 -columnspan 1 -rowspan 1 -sticky w + grid $base.ff.e4 \ + -in .pgaw:Preferences.ff -column 1 -row 6 -columnspan 1 -rowspan 1 -pady 1 + pack $base.fls \ + -in .pgaw:Preferences -anchor center -expand 0 -fill x -pady 5 -side top + pack $base.fal \ + -in .pgaw:Preferences -anchor center -expand 0 -fill x -side top + pack $base.fal.al \ + -in .pgaw:Preferences.fal -anchor center -expand 0 -fill x -side top -anchor w + pack $base.fal.st \ + -in .pgaw:Preferences.fal -anchor center -expand 0 -fill x -side top -anchor w + pack $base.fpl \ + -in .pgaw:Preferences -anchor center -expand 0 -fill x -side top + pack $base.fpl.lt \ + -in .pgaw:Preferences.fpl -anchor center -expand 0 -fill none -side top + pack $base.fpl.flb \ + -in .pgaw:Preferences.fpl -anchor center -expand 0 -fill none -side top + pack $base.fpl.flb.llb \ + -in .pgaw:Preferences.fpl.flb -anchor center -expand 0 -fill none -side left + pack $base.fpl.flb.vsb \ + -in .pgaw:Preferences.fpl.flb -anchor center -expand 0 -fill y -side right + pack $base.fb \ + -in .pgaw:Preferences -anchor center -expand 0 -fill none -side bottom + grid $base.fb.btnsave \ + -in .pgaw:Preferences.fb -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.fb.btncancel \ + -in .pgaw:Preferences.fb -column 1 -row 0 -columnspan 1 -rowspan 1 +} + diff --git a/src/bin/pgaccess/lib/qed b/src/bin/pgaccess/lib/qed new file mode 100755 index 00000000000..4db7a0148d5 --- /dev/null +++ b/src/bin/pgaccess/lib/qed @@ -0,0 +1,7 @@ +#!/bin/bash +for fisier in *.tcl ; do + echo $fisier ; + sed -e "s/show_error/showError/g" <$fisier >temp + mv temp $fisier +done + diff --git a/src/bin/pgaccess/lib/queries.tcl b/src/bin/pgaccess/lib/queries.tcl new file mode 100644 index 00000000000..b25ec70ac1f --- /dev/null +++ b/src/bin/pgaccess/lib/queries.tcl @@ -0,0 +1,228 @@ +namespace eval Queries { + + +proc {new} {} { +global PgAcVar + Window show .pgaw:QueryBuilder + PgAcVar:clean query,* + set PgAcVar(query,oid) 0 + set PgAcVar(query,name) {} + set PgAcVar(query,asview) 0 + set PgAcVar(query,tables) {} + set PgAcVar(query,links) {} + set PgAcVar(query,results) {} + .pgaw:QueryBuilder.saveAsView configure -state normal +} + + +proc {open} {queryname} { +global PgAcVar + if {! [loadQuery $queryname]} return; + if {$PgAcVar(query,type)=="S"} then { + set wn [Tables::getNewWindowName] + set PgAcVar(mw,$wn,query) [subst $PgAcVar(query,sqlcmd)] + set PgAcVar(mw,$wn,updatable) 0 + set PgAcVar(mw,$wn,isaquery) 1 + Tables::createWindow + wm title $wn "Query result: $PgAcVar(query,name)" + Tables::loadLayout $wn $PgAcVar(query,name) + Tables::selectRecords $wn $PgAcVar(mw,$wn,query) + } else { + set answ [tk_messageBox -title [intlmsg Warning] -type yesno -message "This query is an action query!\n\n[string range $qcmd 0 30] ...\n\nDo you want to execute it?"] + if {$answ} { + if {[sql_exec noquiet $qcmd]} { + tk_messageBox -title Information -message "Your query has been executed without error!" + } + } + } +} + + +proc {design} {queryname} { +global PgAcVar + if {! [loadQuery $queryname]} return; + Window show .pgaw:QueryBuilder + .pgaw:QueryBuilder.text1 delete 0.0 end + .pgaw:QueryBuilder.text1 insert end $PgAcVar(query,sqlcmd) + .pgaw:QueryBuilder.text2 delete 0.0 end + .pgaw:QueryBuilder.text2 insert end $PgAcVar(query,comments) +} + + +proc {loadQuery} {queryname} { +global PgAcVar CurrentDB + set PgAcVar(query,name) $queryname + if {[set pgres [wpg_exec $CurrentDB "select querycommand,querytype,querytables,querylinks,queryresults,querycomments,oid from pga_queries where queryname='$PgAcVar(query,name)'"]]==0} then { + showError [intlmsg "Error retrieving query definition"] + return 0 + } + if {[pg_result $pgres -numTuples]==0} { + showError [format [intlmsg "Query '%s' was not found!"] $PgAcVar(query,name)] + pg_result $pgres -clear + return 0 + } + set tuple [pg_result $pgres -getTuple 0] + set PgAcVar(query,sqlcmd) [lindex $tuple 0] + set PgAcVar(query,type) [lindex $tuple 1] + set PgAcVar(query,tables) [lindex $tuple 2] + set PgAcVar(query,links) [lindex $tuple 3] + set PgAcVar(query,results) [lindex $tuple 4] + set PgAcVar(query,comments) [lindex $tuple 5] + set PgAcVar(query,oid) [lindex $tuple 6] + pg_result $pgres -clear + return 1 +} + + +proc {visualDesigner} {} { +global PgAcVar + Window show .pgaw:VisualQuery + VisualQueryBuilder::loadVisualLayout + focus .pgaw:VisualQuery.fb.entt +} + + +proc {save} {} { +global PgAcVar CurrentDB +if {$PgAcVar(query,name)==""} then { + showError [intlmsg "You have to supply a name for this query!"] + focus .pgaw:QueryBuilder.eqn +} else { + set qcmd [.pgaw:QueryBuilder.text1 get 1.0 end] + set PgAcVar(query,comments) [.pgaw:QueryBuilder.text2 get 1.0 end] + regsub -all "\n" $qcmd " " qcmd + if {$qcmd==""} then { + showError [intlmsg "This query has no commands?"] + } else { + if { [lindex [split [string toupper [string trim $qcmd]]] 0] == "SELECT" } { + set qtype S + } else { + set qtype A + } + if {$PgAcVar(query,asview)} { + wpg_select $CurrentDB "select pg_get_viewdef('$PgAcVar(query,name)') as vd" tup { + if {$tup(vd)!="Not a view"} { + if {[tk_messageBox -title [intlmsg Warning] -message [format [intlmsg "View '%s' already exists!\nOverwrite ?"] $PgAcVar(query,name)] -type yesno -default no]=="yes"} { + set pg_res [wpg_exec $CurrentDB "drop view \"$PgAcVar(query,name)\""] + if {$PgAcVar(pgsql,status)!="PGRES_COMMAND_OK"} { + showError "[intlmsg {Error deleting view}] '$PgAcVar(query,name)'" + } + } + } + } + set pgres [wpg_exec $CurrentDB "create view \"$PgAcVar(query,name)\" as $qcmd"] + if {$PgAcVar(pgsql,status)!="PGRES_COMMAND_OK"} { + showError "[intlmsg {Error defining view}]\n\n$PgAcVar(pgsql,errmsg)" + } else { + Mainlib::tab_click Views + Window destroy .pgaw:QueryBuilder + } + catch {pg_result $pgres -clear} + } else { + regsub -all "'" $qcmd "''" qcmd + regsub -all "'" $PgAcVar(query,comments) "''" PgAcVar(query,comments) + regsub -all "'" $PgAcVar(query,results) "''" PgAcVar(query,results) + setCursor CLOCK + if {$PgAcVar(query,oid)==0} then { + set pgres [wpg_exec $CurrentDB "insert into pga_queries values ('$PgAcVar(query,name)','$qtype','$qcmd','$PgAcVar(query,tables)','$PgAcVar(query,links)','$PgAcVar(query,results)','$PgAcVar(query,comments)')"] + } else { + set pgres [wpg_exec $CurrentDB "update pga_queries set queryname='$PgAcVar(query,name)',querytype='$qtype',querycommand='$qcmd',querytables='$PgAcVar(query,tables)',querylinks='$PgAcVar(query,links)',queryresults='$PgAcVar(query,results)',querycomments='$PgAcVar(query,comments)' where oid=$PgAcVar(query,oid)"] + } + setCursor DEFAULT + if {$PgAcVar(pgsql,status)!="PGRES_COMMAND_OK"} then { + showError "[intlmsg {Error executing query}]\n$PgAcVar(pgsql,errmsg)" + } else { + Mainlib::tab_click Queries + if {$PgAcVar(query,oid)==0} {set PgAcVar(query,oid) [pg_result $pgres -oid]} + } + } + catch {pg_result $pgres -clear} + } +} +} + + +proc {execute} {} { +global PgAcVar +set qcmd [.pgaw:QueryBuilder.text1 get 0.0 end] +regsub -all "\n" [string trim $qcmd] " " qcmd +if {[lindex [split [string toupper $qcmd]] 0]!="SELECT"} { + if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:QueryBuilder -message [intlmsg "This is an action query!\n\nExecute it?"] -type yesno -default no]=="yes"} { + sql_exec noquiet $qcmd + } +} else { + set wn [Tables::getNewWindowName] + set PgAcVar(mw,$wn,query) [subst $qcmd] + set PgAcVar(mw,$wn,updatable) 0 + set PgAcVar(mw,$wn,isaquery) 1 + Tables::createWindow + Tables::loadLayout $wn $PgAcVar(query,name) + Tables::selectRecords $wn $PgAcVar(mw,$wn,query) +} +} + +proc {close} {} { +global PgAcVar + .pgaw:QueryBuilder.saveAsView configure -state normal + set PgAcVar(query,asview) 0 + set PgAcVar(query,name) {} + .pgaw:QueryBuilder.text1 delete 1.0 end + Window destroy .pgaw:QueryBuilder +} + + +} + + +proc vTclWindow.pgaw:QueryBuilder {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:QueryBuilder + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 542x364+150+150 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base [intlmsg "Query builder"] + bind $base "Help::load queries" + label $base.lqn -borderwidth 0 -text [intlmsg {Query name}] + entry $base.eqn -background #fefefe -borderwidth 1 -foreground #000000 -highlightthickness 1 -selectborderwidth 0 -textvariable PgAcVar(query,name) + text $base.text1 -background #fefefe -borderwidth 1 -font $PgAcVar(pref,font_normal) -foreground #000000 -highlightthickness 1 -wrap word + label $base.lcomm -borderwidth 0 -text [intlmsg Comments] + text $base.text2 -background #fefefe -borderwidth 1 -font $PgAcVar(pref,font_normal) -foreground #000000 -highlightthickness 1 -wrap word + checkbutton $base.saveAsView -borderwidth 1 -text [intlmsg {Save this query as a view}] -variable PgAcVar(query,asview) + frame $base.frb \ + -height 75 -relief groove -width 125 + button $base.frb.savebtn -command {Queries::save} \ + -borderwidth 1 -text [intlmsg {Save query definition}] + button $base.frb.execbtn -command {Queries::execute} \ + -borderwidth 1 -text [intlmsg {Execute query}] + button $base.frb.pgaw:VisualQueryshow -command {Queries::visualDesigner} \ + -borderwidth 1 -text [intlmsg {Visual designer}] + button $base.frb.termbtn -command {Queries::close} \ + -borderwidth 1 -text [intlmsg Close] + place $base.lqn -x 5 -y 5 -anchor nw -bordermode ignore + place $base.eqn -x 100 -y 1 -width 335 -height 24 -anchor nw -bordermode ignore + place $base.frb \ + -x 5 -y 55 -width 530 -height 35 -anchor nw -bordermode ignore + pack $base.frb.savebtn \ + -in $base.frb -anchor center -expand 0 -fill none -side left + pack $base.frb.execbtn \ + -in $base.frb -anchor center -expand 0 -fill none -side left + pack $base.frb.pgaw:VisualQueryshow \ + -in $base.frb -anchor center -expand 0 -fill none -side left + pack $base.frb.termbtn \ + -in $base.frb -anchor center -expand 0 -fill none -side right + place $base.text1 -x 5 -y 90 -width 530 -height 160 -anchor nw -bordermode ignore + place $base.lcomm -x 5 -y 255 + place $base.text2 -x 5 -y 270 -width 530 -height 86 -anchor nw -bordermode ignore + place $base.saveAsView -x 5 -y 30 -height 25 -anchor nw -bordermode ignore +} + diff --git a/src/bin/pgaccess/lib/reports.tcl b/src/bin/pgaccess/lib/reports.tcl new file mode 100644 index 00000000000..c526ca9b569 --- /dev/null +++ b/src/bin/pgaccess/lib/reports.tcl @@ -0,0 +1,599 @@ +namespace eval Reports { + + +proc {new} {} { +global PgAcVar + Window show .pgaw:ReportBuilder + tkwait visibility .pgaw:ReportBuilder + init + set PgAcVar(report,reportname) {} + set PgAcVar(report,justpreview) 0 + focus .pgaw:ReportBuilder.e2 +} + + +proc {open} {reportname} { +global PgAcVar CurrentDB + Window show .pgaw:ReportBuilder + #tkwait visibility .pgaw:ReportBuilder + Window hide .pgaw:ReportBuilder + Window show .pgaw:ReportPreview + init + set PgAcVar(report,reportname) $reportname + loadReport + tkwait visibility .pgaw:ReportPreview + set PgAcVar(report,justpreview) 1 + preview +} + + +proc {design} {reportname} { +global PgAcVar + Window show .pgaw:ReportBuilder + tkwait visibility .pgaw:ReportBuilder + init + set PgAcVar(report,reportname) $reportname + loadReport + set PgAcVar(report,justpreview) 0 +} + + +proc {drawReportAreas} {} { +global PgAcVar +foreach rg $PgAcVar(report,regions) { + .pgaw:ReportBuilder.c delete bg_$rg + .pgaw:ReportBuilder.c create line 0 $PgAcVar(report,y_$rg) 5000 $PgAcVar(report,y_$rg) -tags [subst {bg_$rg}] + .pgaw:ReportBuilder.c create rectangle 6 [expr $PgAcVar(report,y_$rg)-3] 12 [expr $PgAcVar(report,y_$rg)+3] -fill black -tags [subst {bg_$rg mov reg}] + .pgaw:ReportBuilder.c lower bg_$rg +} +} + +proc {toggleAlignMode} {} { +set bb [.pgaw:ReportBuilder.c bbox hili] +if {[.pgaw:ReportBuilder.balign cget -text]=="left"} then { + .pgaw:ReportBuilder.balign configure -text right + .pgaw:ReportBuilder.c itemconfigure hili -anchor ne + .pgaw:ReportBuilder.c move hili [expr [lindex $bb 2]-[lindex $bb 0]-3] 0 +} else { + .pgaw:ReportBuilder.balign configure -text left + .pgaw:ReportBuilder.c itemconfigure hili -anchor nw + .pgaw:ReportBuilder.c move hili [expr [lindex $bb 0]-[lindex $bb 2]+3] 0 +} +} + +proc {getBoldStatus} {} { + if {[.pgaw:ReportBuilder.lbold cget -relief]=="raised"} then {return Medium} else {return Bold} +} + +proc {getItalicStatus} {} { + if {[.pgaw:ReportBuilder.lita cget -relief]=="raised"} then {return R} else {return O} +} + +proc {toggleBold} {} { + if {[getBoldStatus]=="Bold"} { + .pgaw:ReportBuilder.lbold configure -relief raised + } else { + .pgaw:ReportBuilder.lbold configure -relief sunken + } + setObjectFont +} + + +proc {toggleItalic} {} { + if {[getItalicStatus]=="O"} { + .pgaw:ReportBuilder.lita configure -relief raised + } else { + .pgaw:ReportBuilder.lita configure -relief sunken + } + setObjectFont +} + + +proc {setFont} {} { + set temp [.pgaw:ReportBuilder.bfont cget -text] + if {$temp=="Courier"} then { + .pgaw:ReportBuilder.bfont configure -text Helvetica + } else { + .pgaw:ReportBuilder.bfont configure -text Courier + } + setObjectFont +} + + +proc {getSourceFields} {} { +global PgAcVar CurrentDB + .pgaw:ReportBuilder.lb delete 0 end + if {$PgAcVar(report,tablename)==""} return ; + #setCursor CLOCK + wpg_select $CurrentDB "select attnum,attname from pg_class,pg_attribute where (pg_class.relname='$PgAcVar(report,tablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) order by attnum" rec { + .pgaw:ReportBuilder.lb insert end $rec(attname) + } + #setCursor DEFAULT +} + + +proc {hasTag} {id tg} { + if {[lsearch [.pgaw:ReportBuilder.c itemcget $id -tags] $tg]==-1} then {return 0 } else {return 1} +} + + +proc {init} {} { +global PgAcVar + set PgAcVar(report,xl_auto) 10 + set PgAcVar(report,xf_auto) 10 + set PgAcVar(report,regions) {rpthdr pghdr detail pgfoo rptfoo} + set PgAcVar(report,y_rpthdr) 30 + set PgAcVar(report,y_pghdr) 60 + set PgAcVar(report,y_detail) 90 + set PgAcVar(report,y_pgfoo) 120 + set PgAcVar(report,y_rptfoo) 150 + set PgAcVar(report,e_rpthdr) [intlmsg {Report header}] + set PgAcVar(report,e_pghdr) [intlmsg {Page header}] + set PgAcVar(report,e_detail) [intlmsg {Detail record}] + set PgAcVar(report,e_pgfoo) [intlmsg {Page footer}] + set PgAcVar(report,e_rptfoo) [intlmsg {Report footer}] + drawReportAreas +} + +proc {loadReport} {} { +global PgAcVar CurrentDB + .pgaw:ReportBuilder.c delete all + wpg_select $CurrentDB "select * from pga_reports where reportname='$PgAcVar(report,reportname)'" rcd { + eval $rcd(reportbody) + } + getSourceFields + drawReportAreas +} + + +proc {preview} {} { +global PgAcVar CurrentDB +Window show .pgaw:ReportPreview +.pgaw:ReportPreview.fr.c delete all +set ol [.pgaw:ReportBuilder.c find withtag ro] +set fields {} +foreach objid $ol { + set tags [.pgaw:ReportBuilder.c itemcget $objid -tags] + lappend fields [string range [lindex $tags [lsearch -glob $tags f-*]] 2 64] + lappend fields [lindex [.pgaw:ReportBuilder.c coords $objid] 0] + lappend fields [lindex [.pgaw:ReportBuilder.c coords $objid] 1] + lappend fields $objid + lappend fields [lindex $tags [lsearch -glob $tags t_*]] +} +# Parsing page header +set py 10 +foreach {field x y objid objtype} $fields { + if {$objtype=="t_l"} { + .pgaw:ReportPreview.fr.c create text $x [expr $py+$y] -text [.pgaw:ReportBuilder.c itemcget $objid -text] -font [.pgaw:ReportBuilder.c itemcget $objid -font] -anchor nw + } +} +incr py [expr $PgAcVar(report,y_pghdr)-$PgAcVar(report,y_rpthdr)] +# Parsing detail group +set di [lsearch $PgAcVar(report,regions) detail] +set y_hi $PgAcVar(report,y_detail) +set y_lo $PgAcVar(report,y_[lindex $PgAcVar(report,regions) [expr $di-1]]) +wpg_select $CurrentDB "select * from \"$PgAcVar(report,tablename)\"" rec { + foreach {field x y objid objtype} $fields { + if {($y>=$y_lo) && ($y<=$y_hi)} then { + if {$objtype=="t_f"} { + .pgaw:ReportPreview.fr.c create text $x [expr $py+$y] -text $rec($field) -font [.pgaw:ReportBuilder.c itemcget $objid -font] -anchor [.pgaw:ReportBuilder.c itemcget $objid -anchor] + } + if {$objtype=="t_l"} { + .pgaw:ReportPreview.fr.c create text $x [expr $py+$y] -text [.pgaw:ReportBuilder.c itemcget $objid -text] -font [.pgaw:ReportBuilder.c itemcget $objid -font] -anchor nw + } + } + } + incr py [expr $PgAcVar(report,y_detail)-$PgAcVar(report,y_pghdr)] +} +.pgaw:ReportPreview.fr.c configure -scrollregion [subst {0 0 1000 $py}] +} + + +proc {print} {} { + set bb [.pgaw:ReportPreview.fr.c bbox all] + .pgaw:ReportPreview.fr.c postscript -file "pgaccess-report.ps" -width [expr 10+[lindex $bb 2]-[lindex $bb 0]] -height [expr 10+[lindex $bb 3]-[lindex $bb 1]] + tk_messageBox -title Information -parent .pgaw:ReportBuilder -message "The printed image in Postscript is in the file pgaccess-report.ps" +} + + +proc {save} {} { +global PgAcVar +set prog "set PgAcVar(report,tablename) \"$PgAcVar(report,tablename)\"" +foreach region $PgAcVar(report,regions) { + set prog "$prog ; set PgAcVar(report,y_$region) $PgAcVar(report,y_$region)" +} +foreach obj [.pgaw:ReportBuilder.c find all] { + if {[.pgaw:ReportBuilder.c type $obj]=="text"} { + set bb [.pgaw:ReportBuilder.c bbox $obj] + if {[.pgaw:ReportBuilder.c itemcget $obj -anchor]=="nw"} then {set x [expr [lindex $bb 0]+1]} else {set x [expr [lindex $bb 2]-2]} + set prog "$prog ; .pgaw:ReportBuilder.c create text $x [lindex $bb 1] -font [.pgaw:ReportBuilder.c itemcget $obj -font] -anchor [.pgaw:ReportBuilder.c itemcget $obj -anchor] -text {[.pgaw:ReportBuilder.c itemcget $obj -text]} -tags {[.pgaw:ReportBuilder.c itemcget $obj -tags]}" + } +} +sql_exec noquiet "delete from pga_reports where reportname='$PgAcVar(report,reportname)'" +sql_exec noquiet "insert into pga_reports (reportname,reportsource,reportbody) values ('$PgAcVar(report,reportname)','$PgAcVar(report,tablename)','$prog')" +} + + +proc {addField} {} { +global PgAcVar + set fldname [.pgaw:ReportBuilder.lb get [.pgaw:ReportBuilder.lb curselection]] + set newid [.pgaw:ReportBuilder.c create text $PgAcVar(report,xf_auto) [expr $PgAcVar(report,y_rpthdr)+5] -text $fldname -tags [subst {t_l mov ro}] -anchor nw -font $PgAcVar(pref,font_normal)] + .pgaw:ReportBuilder.c create text $PgAcVar(report,xf_auto) [expr $PgAcVar(report,y_pghdr)+5] -text $fldname -tags [subst {f-$fldname t_f rg_detail mov ro}] -anchor nw -font $PgAcVar(pref,font_normal) + set bb [.pgaw:ReportBuilder.c bbox $newid] + incr PgAcVar(report,xf_auto) [expr 5+[lindex $bb 2]-[lindex $bb 0]] +} + + +proc {addLabel} {} { +global PgAcVar + set fldname $PgAcVar(report,labeltext) + set newid [.pgaw:ReportBuilder.c create text $PgAcVar(report,xl_auto) [expr $PgAcVar(report,y_rpthdr)+5] -text $fldname -tags [subst {t_l mov ro}] -anchor nw -font $PgAcVar(pref,font_normal)] + set bb [.pgaw:ReportBuilder.c bbox $newid] + incr PgAcVar(report,xl_auto) [expr 5+[lindex $bb 2]-[lindex $bb 0]] +} + + +proc {setObjectFont} {} { +global PgAcVar + .pgaw:ReportBuilder.c itemconfigure hili -font -Adobe-[.pgaw:ReportBuilder.bfont cget -text]-[getBoldStatus]-[getItalicStatus]-Normal--*-$PgAcVar(report,pointsize)-*-*-*-*-*-* +} + + +proc {deleteObject} {} { + if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:ReportBuilder -message "Delete current report object?" -type yesno -default no]=="no"} return; + .pgaw:ReportBuilder.c delete hili +} + + +proc {dragMove} {w x y} { +global PgAcVar + # Showing current region + foreach rg $PgAcVar(report,regions) { + set PgAcVar(report,msg) $PgAcVar(report,e_$rg) + if {$PgAcVar(report,y_$rg)>$y} break; + } + set temp {} + catch {set temp $PgAcVar(draginfo,obj)} + if {"$temp" != ""} { + set dx [expr $x - $PgAcVar(draginfo,x)] + set dy [expr $y - $PgAcVar(draginfo,y)] + if {$PgAcVar(draginfo,region)!=""} { + set x $PgAcVar(draginfo,x) ; $w move bg_$PgAcVar(draginfo,region) 0 $dy + } else { + $w move $PgAcVar(draginfo,obj) $dx $dy + } + set PgAcVar(draginfo,x) $x + set PgAcVar(draginfo,y) $y + } +} + + +proc {dragStart} {w x y} { +global PgAcVar +focus .pgaw:ReportBuilder.c +catch {unset draginfo} +set obj {} +# Only movable objects start dragging +foreach id [$w find overlapping $x $y $x $y] { + if {[hasTag $id mov]} { + set obj $id + break + } +} +if {$obj==""} return; +set PgAcVar(draginfo,obj) $obj +set taglist [.pgaw:ReportBuilder.c itemcget $obj -tags] +set i [lsearch -glob $taglist bg_*] +if {$i==-1} { + set PgAcVar(draginfo,region) {} +} else { + set PgAcVar(draginfo,region) [string range [lindex $taglist $i] 3 64] +} +.pgaw:ReportBuilder configure -cursor hand1 +.pgaw:ReportBuilder.c itemconfigure [.pgaw:ReportBuilder.c find withtag hili] -fill black +.pgaw:ReportBuilder.c dtag [.pgaw:ReportBuilder.c find withtag hili] hili +.pgaw:ReportBuilder.c addtag hili withtag $PgAcVar(draginfo,obj) +.pgaw:ReportBuilder.c itemconfigure hili -fill blue +set PgAcVar(draginfo,x) $x +set PgAcVar(draginfo,y) $y +set PgAcVar(draginfo,sx) $x +set PgAcVar(draginfo,sy) $y +# Setting font information +if {[.pgaw:ReportBuilder.c type hili]=="text"} { + set fnta [split [.pgaw:ReportBuilder.c itemcget hili -font] -] + .pgaw:ReportBuilder.bfont configure -text [lindex $fnta 2] + if {[lindex $fnta 3]=="Medium"} then {.pgaw:ReportBuilder.lbold configure -relief raised} else {.pgaw:ReportBuilder.lbold configure -relief sunken} + if {[lindex $fnta 4]=="R"} then {.pgaw:ReportBuilder.lita configure -relief raised} else {.pgaw:ReportBuilder.lita configure -relief sunken} + set PgAcVar(report,pointsize) [lindex $fnta 8] + if {[hasTag $obj t_f]} {set PgAcVar(report,info) "Database field"} + if {[hasTag $obj t_l]} {set PgAcVar(report,info) "Label"} + if {[.pgaw:ReportBuilder.c itemcget $obj -anchor]=="nw"} then {.pgaw:ReportBuilder.balign configure -text left} else {.pgaw:ReportBuilder.balign configure -text right} +} +} + +proc {dragStop} {x y} { +global PgAcVar +# when click Close, ql window is destroyed but event ButtonRelease-1 is fired +if {![winfo exists .pgaw:ReportBuilder]} return; +.pgaw:ReportBuilder configure -cursor left_ptr +set este {} +catch {set este $PgAcVar(draginfo,obj)} +if {$este==""} return +# Erase information about object beeing dragged +if {$PgAcVar(draginfo,region)!=""} { + set dy 0 + foreach rg $PgAcVar(report,regions) { + .pgaw:ReportBuilder.c move rg_$rg 0 $dy + if {$rg==$PgAcVar(draginfo,region)} { + set dy [expr $y-$PgAcVar(report,y_$PgAcVar(draginfo,region))] + } + incr PgAcVar(report,y_$rg) $dy + } +# .pgaw:ReportBuilder.c move det 0 [expr $y-$PgAcVar(report,y_$PgAcVar(draginfo,region))] + set PgAcVar(report,y_$PgAcVar(draginfo,region)) $y + drawReportAreas +} else { + # Check if object beeing dragged is inside the canvas + set bb [.pgaw:ReportBuilder.c bbox $PgAcVar(draginfo,obj)] + if {[lindex $bb 0] < 5} { + .pgaw:ReportBuilder.c move $PgAcVar(draginfo,obj) [expr 5-[lindex $bb 0]] 0 + } +} +set PgAcVar(draginfo,obj) {} +PgAcVar:clean draginfo,* +} + + +proc {deleteAllObjects} {} { + if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:ReportBuilder -message [intlmsg "All report information will be deleted.\n\nProceed ?"] -type yesno -default no]=="yes"} then { + .pgaw:ReportBuilder.c delete all + init + drawReportAreas + } +} + +} + +################################################################ + + +proc vTclWindow.pgaw:ReportBuilder {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:ReportBuilder + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 652x426+96+120 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base [intlmsg "Report builder"] + label $base.l1 \ + -borderwidth 1 \ + -relief raised -text [intlmsg {Report fields}] + listbox $base.lb \ + -background #fefefe -foreground #000000 -borderwidth 1 \ + -selectbackground #c3c3c3 \ + -highlightthickness 1 -selectborderwidth 0 \ + -yscrollcommand {.pgaw:ReportBuilder.sb set} + bind $base.lb { + Reports::addField + } + canvas $base.c \ + -background #fffeff -borderwidth 2 -height 207 -highlightthickness 0 \ + -relief ridge -takefocus 1 -width 295 + bind $base.c { + Reports::dragStart %W %x %y + } + bind $base.c { + Reports::dragStop %x %y + } + bind $base.c { + Reports::deleteObject + } + bind $base.c { + Reports::dragMove %W %x %y + } + button $base.bt2 \ + -command Reports::deleteAllObjects \ + -text [intlmsg {Delete all}] + button $base.bt4 \ + -command Reports::preview \ + -text [intlmsg Preview] + button $base.bt5 \ + -borderwidth 1 -command {Window destroy .pgaw:ReportBuilder} \ + -text [intlmsg Close] + scrollbar $base.sb \ + -borderwidth 1 -command {.pgaw:ReportBuilder.lb yview} -orient vert + label $base.lmsg \ + -anchor w \ + -relief groove -text [intlmsg {Report header}] -textvariable PgAcVar(report,msg) + entry $base.e2 \ + -background #fefefe -borderwidth 1 -highlightthickness 0 \ + -textvariable PgAcVar(report,tablename) + bind $base.e2 { + Reports::getSourceFields + } + entry $base.elab \ + -background #fefefe -borderwidth 1 -highlightthickness 0 \ + -textvariable PgAcVar(report,labeltext) + button $base.badl \ + -borderwidth 1 -command Reports::addLabel \ + -text [intlmsg {Add label}] + label $base.lbold \ + -borderwidth 1 -relief raised -text B + bind $base.lbold { + Reports::toggleBold + } + label $base.lita \ + -borderwidth 1 \ + -font $PgAcVar(pref,font_italic) \ + -relief raised -text i + bind $base.lita { + Reports::toggleItalic + } + entry $base.eps \ + -background #fefefe -highlightthickness 0 -relief groove \ + -textvariable PgAcVar(report,pointsize) + bind $base.eps { + Reports::setObjectFont + } + label $base.linfo \ + -anchor w \ + -relief groove -text {Database field} -textvariable PgAcVar(report,info) + label $base.llal \ + -borderwidth 0 -text Align + button $base.balign \ + -borderwidth 0 -command Reports::toggleAlignMode \ + -relief groove -text right + button $base.savebtn \ + -borderwidth 1 -command Reports::save \ + -text [intlmsg Save] + label $base.lfn \ + -borderwidth 0 -text Font + button $base.bfont \ + -borderwidth 0 \ + -command Reports::setFont \ + -relief groove -text Courier + button $base.bdd \ + -borderwidth 1 \ + -command {if {[winfo exists .pgaw:ReportBuilder.ddf]} { + destroy .pgaw:ReportBuilder.ddf +} else { + create_drop_down .pgaw:ReportBuilder 405 22 200 + focus .pgaw:ReportBuilder.ddf.sb + foreach tbl [Database::getTablesList] {.pgaw:ReportBuilder.ddf.lb insert end $tbl} + bind .pgaw:ReportBuilder.ddf.lb { + set i [.pgaw:ReportBuilder.ddf.lb curselection] + if {$i!=""} {set PgAcVar(report,tablename) [.pgaw:ReportBuilder.ddf.lb get $i]} + destroy .pgaw:ReportBuilder.ddf + Reports::getSourceFields + break + } +}} \ + -highlightthickness 0 -image dnarw + label $base.lrn \ + -borderwidth 0 -text [intlmsg {Report name}] + entry $base.ern \ + -background #fefefe -borderwidth 1 -highlightthickness 0 \ + -textvariable PgAcVar(report,reportname) + bind $base.ern { + loadReport + } + label $base.lrs \ + -borderwidth 0 -text [intlmsg {Report source}] + label $base.ls \ + -borderwidth 1 -relief raised + entry $base.ef \ + -background #fefefe -borderwidth 1 -highlightthickness 0 \ + -textvariable PgAcVar(report,formula) + button $base.baf \ + -borderwidth 1 \ + -text [intlmsg {Add formula}] + place $base.l1 \ + -x 5 -y 55 -width 131 -height 18 -anchor nw -bordermode ignore + place $base.lb \ + -x 5 -y 70 -width 118 -height 121 -anchor nw -bordermode ignore + place $base.c \ + -x 140 -y 75 -width 508 -height 345 -anchor nw -bordermode ignore + place $base.bt2 \ + -x 5 -y 365 -width 64 -height 26 -anchor nw -bordermode ignore + place $base.bt4 \ + -x 70 -y 365 -width 66 -height 26 -anchor nw -bordermode ignore + place $base.bt5 \ + -x 70 -y 395 -width 66 -height 26 -anchor nw -bordermode ignore + place $base.sb \ + -x 120 -y 70 -width 18 -height 122 -anchor nw -bordermode ignore + place $base.lmsg \ + -x 142 -y 55 -width 151 -height 18 -anchor nw -bordermode ignore + place $base.e2 \ + -x 405 -y 4 -width 129 -height 18 -anchor nw -bordermode ignore + place $base.elab \ + -x 5 -y 225 -width 130 -height 18 -anchor nw -bordermode ignore + place $base.badl \ + -x 5 -y 243 -width 132 -height 26 -anchor nw -bordermode ignore + place $base.lbold \ + -x 535 -y 55 -width 18 -height 18 -anchor nw -bordermode ignore + place $base.lita \ + -x 555 -y 55 -width 18 -height 18 -anchor nw -bordermode ignore + place $base.eps \ + -x 500 -y 55 -width 30 -height 18 -anchor nw -bordermode ignore + place $base.linfo \ + -x 295 -y 55 -width 91 -height 18 -anchor nw -bordermode ignore + place $base.llal \ + -x 575 -y 56 -anchor nw -bordermode ignore + place $base.balign \ + -x 610 -y 54 -width 35 -height 21 -anchor nw -bordermode ignore + place $base.savebtn \ + -x 5 -y 395 -width 64 -height 26 -anchor nw -bordermode ignore + place $base.lfn \ + -x 405 -y 56 -anchor nw -bordermode ignore + place $base.bfont \ + -x 435 -y 54 -width 65 -height 21 -anchor nw -bordermode ignore + place $base.bdd \ + -x 535 -y 4 -width 15 -height 20 -anchor nw -bordermode ignore + place $base.lrn \ + -x 5 -y 5 -anchor nw -bordermode ignore + place $base.ern \ + -x 80 -y 4 -width 219 -height 18 -anchor nw -bordermode ignore + place $base.lrs \ + -x 320 -y 5 -anchor nw -bordermode ignore + place $base.ls \ + -x 5 -y 30 -width 641 -height 2 -anchor nw -bordermode ignore + place $base.ef \ + -x 5 -y 280 -width 130 -height 18 -anchor nw -bordermode ignore + place $base.baf \ + -x 5 -y 298 -width 132 -height 26 -anchor nw -bordermode ignore +} + +proc vTclWindow.pgaw:ReportPreview {base} { + if {$base == ""} { + set base .pgaw:ReportPreview + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 495x500+230+50 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm title $base "Report preview" + frame $base.fr \ + -borderwidth 2 -height 75 -relief groove -width 125 + canvas $base.fr.c \ + -background #fcfefe -borderwidth 2 -height 207 -relief ridge \ + -scrollregion {0 0 1000 824} -width 295 \ + -yscrollcommand {.pgaw:ReportPreview.fr.sb set} + scrollbar $base.fr.sb \ + -borderwidth 1 -command {.pgaw:ReportPreview.fr.c yview} -highlightthickness 0 \ + -orient vert -width 12 + frame $base.f1 \ + -borderwidth 2 -height 75 -width 125 + button $base.f1.button18 \ + -borderwidth 1 -command {if {$PgAcVar(report,justpreview)} then {Window destroy .pgaw:ReportBuilder} ; Window destroy .pgaw:ReportPreview} \ + -text [intlmsg Close] + button $base.f1.button17 \ + -borderwidth 1 -command Reports::print \ + -text Print + pack $base.fr \ + -in .pgaw:ReportPreview -anchor center -expand 1 -fill both -side top + pack $base.fr.c \ + -in .pgaw:ReportPreview.fr -anchor center -expand 1 -fill both -side left + pack $base.fr.sb \ + -in .pgaw:ReportPreview.fr -anchor center -expand 0 -fill y -side right + pack $base.f1 \ + -in .pgaw:ReportPreview -anchor center -expand 0 -fill none -side top + pack $base.f1.button18 \ + -in .pgaw:ReportPreview.f1 -anchor center -expand 0 -fill none -side right + pack $base.f1.button17 \ + -in .pgaw:ReportPreview.f1 -anchor center -expand 0 -fill none -side left +} diff --git a/src/bin/pgaccess/lib/schema.tcl b/src/bin/pgaccess/lib/schema.tcl new file mode 100644 index 00000000000..d3e40ef1363 --- /dev/null +++ b/src/bin/pgaccess/lib/schema.tcl @@ -0,0 +1,585 @@ +namespace eval Schema { + + +proc {new} {} { +global PgAcVar + init + Window show .pgaw:Schema + set PgAcVar(schema,oid) 0 + set PgAcVar(schema,name) {} + set PgAcVar(schema,tables) {} + set PgAcVar(schema,links) {} + set PgAcVar(schema,results) {} + focus .pgaw:Schema.f.e +} + + +proc {open} {obj} { +global PgAcVar CurrentDB + init + set PgAcVar(schema,name) $obj + if {[set pgres [wpg_exec $CurrentDB "select schematables,schemalinks,oid from pga_schema where schemaname='$PgAcVar(schema,name)'"]]==0} then { + showError [intlmsg "Error retrieving schema definition"] + return + } + if {[pg_result $pgres -numTuples]==0} { + showError [format [intlmsg "Schema '%s' was not found!"] $PgAcVar(schema,name)] + pg_result $pgres -clear + return + } + set tuple [pg_result $pgres -getTuple 0] + set tables [lindex $tuple 0] + set links [lindex $tuple 1] + set PgAcVar(schema,oid) [lindex $tuple 2] + pg_result $pgres -clear + Window show .pgaw:Schema + foreach {t x y} $tables { + set PgAcVar(schema,newtablename) $t + addNewTable $x $y + } + set PgAcVar(schema,links) $links + drawLinks +} + + +proc {addNewTable} {{tabx 0} {taby 0}} { +global PgAcVar CurrentDB + +if {$PgAcVar(schema,newtablename)==""} return +if {$PgAcVar(schema,newtablename)=="*"} { + set tbllist [Database::getTablesList] + foreach tn [array names PgAcVar schema,tablename*] { + if { [set linkid [lsearch $tbllist $PgAcVar($tn)]] != -1 } { + set tbllist [lreplace $tbllist $linkid $linkid] + } + } + foreach t $tbllist { + set PgAcVar(schema,newtablename) $t + addNewTable + } + return +} + +foreach tn [array names PgAcVar schema,tablename*] { + if {$PgAcVar(schema,newtablename)==$PgAcVar($tn)} { + showError [format [intlmsg "Table '%s' already in schema"] $PgAcVar($tn)] + return + } +} +set fldlist {} +setCursor CLOCK +wpg_select $CurrentDB "select attnum,attname,typname from pg_class,pg_attribute,pg_type where (pg_class.relname='$PgAcVar(schema,newtablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) and (atttypid=pg_type.oid) order by attnum" rec { + lappend fldlist $rec(attname) $rec(typname) +} +setCursor DEFAULT +if {$fldlist==""} { + showError [format [intlmsg "Table '%s' not found!"] $PgAcVar(schema,newtablename)] + return +} +set PgAcVar(schema,tablename$PgAcVar(schema,ntables)) $PgAcVar(schema,newtablename) +set PgAcVar(schema,tablestruct$PgAcVar(schema,ntables)) $fldlist +set PgAcVar(schema,tablex$PgAcVar(schema,ntables)) $tabx +set PgAcVar(schema,tabley$PgAcVar(schema,ntables)) $taby +incr PgAcVar(schema,ntables) +if {$PgAcVar(schema,ntables)==1} { + drawAll +} else { + drawTable [expr $PgAcVar(schema,ntables)-1] +} +lappend PgAcVar(schema,tables) $PgAcVar(schema,newtablename) $PgAcVar(schema,tablex[expr $PgAcVar(schema,ntables)-1]) $PgAcVar(schema,tabley[expr $PgAcVar(schema,ntables)-1]) +set PgAcVar(schema,newtablename) {} +focus .pgaw:Schema.f.e +} + +proc {drawAll} {} { +global PgAcVar + .pgaw:Schema.c delete all + for {set it 0} {$it<$PgAcVar(schema,ntables)} {incr it} { + drawTable $it + } + .pgaw:Schema.c lower rect + drawLinks + + .pgaw:Schema.c bind mov {Schema::dragStart %W %x %y} + .pgaw:Schema.c bind mov {Schema::dragMove %W %x %y} + bind .pgaw:Schema.c {Schema::dragStop %x %y} + bind .pgaw:Schema {Schema::canvasClick %x %y %W} + bind .pgaw:Schema {Schema::canvasPanning %x %y} + bind .pgaw:Schema {Schema::deleteObject} +} + + +proc {drawTable} {it} { +global PgAcVar + +if {$PgAcVar(schema,tablex$it)==0} { + set posy $PgAcVar(schema,nexty) + set posx $PgAcVar(schema,nextx) + set PgAcVar(schema,tablex$it) $posx + set PgAcVar(schema,tabley$it) $posy +} else { + set posx [expr int($PgAcVar(schema,tablex$it))] + set posy [expr int($PgAcVar(schema,tabley$it))] +} +set tablename $PgAcVar(schema,tablename$it) +.pgaw:Schema.c create text $posx $posy -text "$tablename" -anchor nw -tags [subst {tab$it f-oid mov tableheader}] -font $PgAcVar(pref,font_bold) +incr posy 16 +foreach {fld ftype} $PgAcVar(schema,tablestruct$it) { + if {[set cindex [lsearch $PgAcVar(pref,typelist) $ftype]] == -1} {set cindex 1} + .pgaw:Schema.c create text $posx $posy -text $fld -fill [lindex $PgAcVar(pref,typecolors) $cindex] -anchor nw -tags [subst {f-$fld tab$it mov}] -font $PgAcVar(pref,font_normal) + incr posy 14 +} +set reg [.pgaw:Schema.c bbox tab$it] +.pgaw:Schema.c create rectangle [lindex $reg 0] [lindex $reg 1] [lindex $reg 2] [lindex $reg 3] -fill #EEEEEE -tags [subst {rect outer tab$it}] +.pgaw:Schema.c create line [lindex $reg 0] [expr [lindex $reg 1]+15] [lindex $reg 2] [expr [lindex $reg 1]+15] -tags [subst {rect tab$it}] +.pgaw:Schema.c lower tab$it +.pgaw:Schema.c lower rect +set reg [.pgaw:Schema.c bbox tab$it] + + +set nexty [lindex $reg 1] +set nextx [expr 20+[lindex $reg 2]] +if {$nextx > [winfo width .pgaw:Schema.c] } { + set nextx 10 + set allbox [.pgaw:Schema.c bbox rect] + set nexty [expr 20 + [lindex $allbox 3]] +} +set PgAcVar(schema,nextx) $nextx +set PgAcVar(schema,nexty) $nexty + +} + +proc {deleteObject} {} { +global PgAcVar +# Checking if there +set obj [.pgaw:Schema.c find withtag hili] +if {$obj==""} return +# Is object a link ? +if {[getTagInfo $obj link]=="s"} { + if {[tk_messageBox -title [intlmsg Warning] -icon question -parent .pgaw:Schema -message [intlmsg "Remove link ?"] -type yesno -default no]=="no"} return + set linkid [getTagInfo $obj lkid] + set PgAcVar(schema,links) [lreplace $PgAcVar(schema,links) $linkid $linkid] + .pgaw:Schema.c delete links + drawLinks + return +} +# Is object a table ? +set tablealias [getTagInfo $obj tab] +set tablename $PgAcVar(schema,tablename$tablealias) +if {"$tablename"==""} return +if {[tk_messageBox -title [intlmsg Warning] -icon question -parent .pgaw:Schema -message [format [intlmsg "Remove table %s from query?"] $tablename] -type yesno -default no]=="no"} return +for {set i [expr [llength $PgAcVar(schema,links)]-1]} {$i>=0} {incr i -1} { + set thelink [lindex $PgAcVar(schema,links) $i] + if {($tablealias==[lindex $thelink 0]) || ($tablealias==[lindex $thelink 2])} { + set PgAcVar(schema,links) [lreplace $PgAcVar(schema,links) $i $i] + } +} +for {set i 0} {$i<$PgAcVar(schema,ntables)} {incr i} { + set temp {} + catch {set temp $PgAcVar(schema,tablename$i)} + if {"$temp"=="$tablename"} { + unset PgAcVar(schema,tablename$i) + unset PgAcVar(schema,tablestruct$i) + break + } +} +#incr PgAcVar(schema,ntables) -1 +.pgaw:Schema.c delete tab$tablealias +.pgaw:Schema.c delete links +drawLinks +} + + +proc {dragMove} {w x y} { +global PgAcVar + if {"$PgAcVar(draginfo,obj)" == ""} {return} + set dx [expr $x - $PgAcVar(draginfo,x)] + set dy [expr $y - $PgAcVar(draginfo,y)] + if {$PgAcVar(draginfo,is_a_table)} { + $w move $PgAcVar(draginfo,tabletag) $dx $dy + drawLinks + } else { + $w move $PgAcVar(draginfo,obj) $dx $dy + } + set PgAcVar(draginfo,x) $x + set PgAcVar(draginfo,y) $y +} + + +proc {dragStart} {w x y} { +global PgAcVar +PgAcVar:clean draginfo,* +set PgAcVar(draginfo,obj) [$w find closest $x $y] +if {[getTagInfo $PgAcVar(draginfo,obj) r]=="ect"} { + # If it'a a rectangle, exit + set PgAcVar(draginfo,obj) {} + return +} +.pgaw:Schema configure -cursor hand1 +.pgaw:Schema.c raise $PgAcVar(draginfo,obj) +set PgAcVar(draginfo,table) 0 +if {[getTagInfo $PgAcVar(draginfo,obj) table]=="header"} { + set PgAcVar(draginfo,is_a_table) 1 + set taglist [.pgaw:Schema.c gettags $PgAcVar(draginfo,obj)] + set PgAcVar(draginfo,tabletag) [lindex $taglist [lsearch -regexp $taglist "^tab\[0-9\]*"]] + .pgaw:Schema.c raise $PgAcVar(draginfo,tabletag) + .pgaw:Schema.c itemconfigure [.pgaw:Schema.c find withtag hili] -fill black + .pgaw:Schema.c dtag [.pgaw:Schema.c find withtag hili] hili + .pgaw:Schema.c addtag hili withtag $PgAcVar(draginfo,obj) + .pgaw:Schema.c itemconfigure hili -fill blue +} else { + set PgAcVar(draginfo,is_a_table) 0 +} +set PgAcVar(draginfo,x) $x +set PgAcVar(draginfo,y) $y +set PgAcVar(draginfo,sx) $x +set PgAcVar(draginfo,sy) $y +} + +proc {dragStop} {x y} { +global PgAcVar +# when click Close, schema window is destroyed but event ButtonRelease-1 is fired +if {![winfo exists .pgaw:Schema]} return; +.pgaw:Schema configure -cursor left_ptr +set este {} +catch {set este $PgAcVar(draginfo,obj)} +if {$este==""} return +# Re-establish the normal paint order so +# information won't be overlapped by table rectangles +# or link lines +.pgaw:Schema.c lower $PgAcVar(draginfo,obj) +.pgaw:Schema.c lower rect +.pgaw:Schema.c lower links +set PgAcVar(schema,panstarted) 0 +if {$PgAcVar(draginfo,is_a_table)} { + set tabnum [getTagInfo $PgAcVar(draginfo,obj) tab] + foreach w [.pgaw:Schema.c find withtag $PgAcVar(draginfo,tabletag)] { + if {[lsearch [.pgaw:Schema.c gettags $w] outer] != -1} { + foreach [list PgAcVar(schema,tablex$tabnum) PgAcVar(schema,tabley$tabnum) x1 y1] [.pgaw:Schema.c coords $w] {} + break + } + } + set PgAcVar(draginfo,obj) {} + .pgaw:Schema.c delete links + drawLinks + return +} +# not a table +.pgaw:Schema.c move $PgAcVar(draginfo,obj) [expr $PgAcVar(draginfo,sx)-$x] [expr $PgAcVar(draginfo,sy)-$y] +set droptarget [.pgaw:Schema.c find overlapping $x $y $x $y] +set targettable {} +foreach item $droptarget { + set targettable $PgAcVar(schema,tablename[getTagInfo $item tab]) + set targetfield [getTagInfo $item f-] + if {($targettable!="") && ($targetfield!="")} { + set droptarget $item + break + } +} +# check if target object isn't a rectangle +if {[getTagInfo $droptarget rec]=="t"} {set targettable {}} +if {$targettable!=""} { + # Target has a table + # See about originate table + set sourcetable $PgAcVar(schema,tablename[getTagInfo $PgAcVar(draginfo,obj) tab]) + if {$sourcetable!=""} { + # Source has also a tab .. tag + set sourcefield [getTagInfo $PgAcVar(draginfo,obj) f-] + if {$sourcetable!=$targettable} { + lappend PgAcVar(schema,links) [list $sourcetable $sourcefield $targettable $targetfield] + drawLinks + } + } +} +# Erase information about object beeing dragged +set PgAcVar(draginfo,obj) {} +} + +proc {drawLinks} {} { +global PgAcVar +.pgaw:Schema.c delete links +set i 0 +foreach link $PgAcVar(schema,links) { + set sourcenum -1 + set targetnum -1 + # Compute the source and destination right edge + foreach t [array names PgAcVar schema,tablename*] { + if {[regexp "^$PgAcVar($t)$" [lindex $link 0] ]} { + set sourcenum [string range $t 16 end] + } elseif {[regexp "^$PgAcVar($t)$" [lindex $link 2] ]} { + set targetnum [string range $t 16 end] + } + } + set sb [findField $sourcenum [lindex $link 1]] + set db [findField $targetnum [lindex $link 3]] + if {($sourcenum == -1 )||($targetnum == -1)||($sb ==-1)||($db==-1)} { + set PgAcVar(schema,links) [lreplace $PgAcVar(schema,links) $i $i] + showError "Link from [lindex $link 0].[lindex $link 1] to [lindex $link 2].[lindex $link 3] not found!" + } else { + + set sre [lindex [.pgaw:Schema.c bbox tab$sourcenum] 2] + set dre [lindex [.pgaw:Schema.c bbox tab$targetnum] 2] + # Compute field bound boxes + set sbbox [.pgaw:Schema.c bbox $sb] + set dbbox [.pgaw:Schema.c bbox $db] + # Compute the auxiliary lines + if {[lindex $sbbox 2] < [lindex $dbbox 0]} { + # Source object is on the left of target object + set x1 $sre + set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2] + .pgaw:Schema.c create line $x1 $y1 [expr $x1+10] $y1 \ + -tags [subst {links lkid$i}] -width 3 + set x2 [lindex $dbbox 0] + set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2] + .pgaw:Schema.c create line [expr $x2-10] $y2 $x2 $y2 \ + -tags [subst {links lkid$i}] -width 3 + .pgaw:Schema.c create line [expr $x1+10] $y1 [expr $x2-10] $y2 \ + -tags [subst {links lkid$i}] -width 2 + } else { + # source object is on the right of target object + set x1 [lindex $sbbox 0] + set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2] + .pgaw:Schema.c create line $x1 $y1 [expr $x1-10] $y1 \ + -tags [subst {links lkid$i}] -width 3 + set x2 $dre + set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2] + .pgaw:Schema.c create line $x2 $y2 [expr $x2+10] $y2 -width 3 \ + -tags [subst {links lkid$i}] + .pgaw:Schema.c create line [expr $x1-10] $y1 [expr $x2+10] $y2 \ + -tags [subst {links lkid$i}] -width 2 + } + incr i + } +} +.pgaw:Schema.c lower links +.pgaw:Schema.c bind links {Schema::linkClick %x %y} +} + + +proc {getSchemaTabless} {} { +global PgAcVar + set tablelist {} + foreach key [array names PgAcVar schema,tablename*] { + regsub schema,tablename $key "" num + lappend tablelist $PgAcVar($key) $PgAcVar(schema,tablex$num) $PgAcVar(schema,tabley$num) + } + return $tablelist +} + + +proc {findField} {alias field} { +foreach obj [.pgaw:Schema.c find withtag f-${field}] { + if {[lsearch [.pgaw:Schema.c gettags $obj] tab$alias] != -1} {return $obj} + } +return -1 +} + + +proc {addLink} {sourcetable sourcefield targettable targetfield} { +global PgAcVar + lappend PgAcVar(schema,links) [list $sourcetable $sourcefield $targettable $targetfield] +} + + +proc {getTagInfo} {obj prefix} { + set taglist [.pgaw:Schema.c gettags $obj] + set tagpos [lsearch -regexp $taglist "^$prefix"] + if {$tagpos==-1} {return ""} + set thattag [lindex $taglist $tagpos] + return [string range $thattag [string length $prefix] end] +} + + +proc {init} {} { +global PgAcVar + PgAcVar:clean schema,* + set PgAcVar(schema,nexty) 10 + set PgAcVar(schema,nextx) 10 + set PgAcVar(schema,links) {} + set PgAcVar(schema,ntables) 0 + set PgAcVar(schema,newtablename) {} +} + + +proc {linkClick} {x y} { +global PgAcVar + set obj [.pgaw:Schema.c find closest $x $y 1 links] + if {[getTagInfo $obj link]!="s"} return + .pgaw:Schema.c itemconfigure [.pgaw:Schema.c find withtag hili] -fill black + .pgaw:Schema.c dtag [.pgaw:Schema.c find withtag hili] hili + .pgaw:Schema.c addtag hili withtag $obj + .pgaw:Schema.c itemconfigure $obj -fill blue +} + + +proc {canvasPanning} {x y} { +global PgAcVar + set panstarted 0 + catch {set panstarted $PgAcVar(schema,panstarted) } + if {!$panstarted} return + set dx [expr $x-$PgAcVar(schema,panstartx)] + set dy [expr $y-$PgAcVar(schema,panstarty)] + set PgAcVar(schema,panstartx) $x + set PgAcVar(schema,panstarty) $y + if {$PgAcVar(schema,panobject)=="tables"} { + .pgaw:Schema.c move mov $dx $dy + .pgaw:Schema.c move links $dx $dy + .pgaw:Schema.c move rect $dx $dy + } else { + .pgaw:Schema.c move resp $dx 0 + .pgaw:Schema.c move resgrid $dx 0 + .pgaw:Schema.c raise reshdr + } +} + + +proc print {c} { + set types { + {{Postscript Files} {.ps}} + {{All Files} *} + } + if {[catch {tk_getSaveFile -defaultextension .ps -filetypes $types \ + -title "Print to Postscript"} fn] || [string match {} $fn]} return + if {[catch {::open $fn "w" } fid]} { + return -code error "Save Error: Unable to open '$fn' for writing\n$fid" + } + puts $fid [$c postscript -rotate 1] + close $fid +} + + +proc {canvasClick} {x y w} { +global PgAcVar +set PgAcVar(schema,panstarted) 0 +if {$w==".pgaw:Schema.c"} { + set canpan 1 + if {[llength [.pgaw:Schema.c find overlapping $x $y $x $y]]!=0} {set canpan 0} + set PgAcVar(schema,panobject) tables + if {$canpan} { + if {[.pgaw:Schema.c find withtag hili]!=""} { + .pgaw:Schema.c itemconfigure [.pgaw:Schema.c find withtag hili] -fill black + .pgaw:Schema.c dtag [.pgaw:Schema.c find withtag hili] hili + } + + .pgaw:Schema configure -cursor hand1 + set PgAcVar(schema,panstartx) $x + set PgAcVar(schema,panstarty) $y + set PgAcVar(schema,panstarted) 1 + } +} +} + +} + +proc vTclWindow.pgaw:Schema {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:Schema + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 759x530+10+13 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm title $base [intlmsg "Visual schema designer"] + bind $base { + Schema::canvasPanning %x %y + } + bind $base { + Schema::canvasClick %x %y %W + } + bind $base { + Schema::dragStop %x %y + } + bind $base { + Schema::deleteObject + } + canvas $base.c -background #fefefe -borderwidth 2 -height 207 -relief ridge -takefocus 0 -width 295 + frame $base.f \ + -height 75 -relief groove -width 125 + label $base.f.l -text [intlmsg {Add table}] + entry $base.f.e \ + -background #fefefe -borderwidth 1 + bind $base.f.e { + Schema::addNewTable + } + button $base.f.bdd \ + -image dnarw \ + -command {if {[winfo exists .pgaw:Schema.ddf]} { + destroy .pgaw:Schema.ddf +} else { + create_drop_down .pgaw:Schema 70 27 200 + focus .pgaw:Schema.ddf.sb + foreach tbl [Database::getTablesList] {.pgaw:Schema.ddf.lb insert end $tbl} + bind .pgaw:Schema.ddf.lb { + set i [.pgaw:Schema.ddf.lb curselection] + if {$i!=""} { + set PgAcVar(schema,newtablename) [.pgaw:Schema.ddf.lb get $i] + Schema::addNewTable + } + destroy .pgaw:Schema.ddf + break + } +}} \ + -padx 1 -pady 1 + button $base.f.btnclose \ + -command {Schema::init +Window destroy .pgaw:Schema} -padx 2 -pady 3 -text [intlmsg Close] + button $base.f.printbtn \ + -command {Schema::print .pgaw:Schema.c} -padx 1 -pady 3 -text [intlmsg Print] + button $base.f.btnsave \ + -command {if {$PgAcVar(schema,name)==""} then { + showError [intlmsg "You have to supply a name for this schema!"] + focus .pgaw:Schema.f.esn +} else { + setCursor CLOCK + set tables [Schema::getSchemaTabless] + if {$PgAcVar(schema,oid)==0} then { + set pgres [wpg_exec $CurrentDB "insert into pga_schema values ('$PgAcVar(schema,name)','$tables','$PgAcVar(schema,links)')"] + } else { + set pgres [wpg_exec $CurrentDB "update pga_schema set schemaname='$PgAcVar(schema,name)',schematables='$tables',schemalinks='$PgAcVar(schema,links)' where oid=$PgAcVar(schema,oid)"] + } + setCursor DEFAULT + if {$PgAcVar(pgsql,status)!="PGRES_COMMAND_OK"} then { + showError "[intlmsg {Error executing query}]\n$PgAcVar(pgsql,errmsg)" + } else { + Mainlib::tab_click Schema + if {$PgAcVar(schema,oid)==0} {set PgAcVar(schema,oid) [pg_result $pgres -oid]} + } + catch {pg_result $pgres -clear} +}} \ + -padx 2 -pady 3 -text [intlmsg {Save schema}] + label $base.f.ls1 -text { } + entry $base.f.esn \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(schema,name) + label $base.f.lsn -text [intlmsg {Schema name}] + place $base.c -x 5 -y 30 -width 748 -height 500 -anchor nw -bordermode ignore + place $base.f \ + -x 5 -y 5 -width 748 -height 25 -anchor nw -bordermode ignore + pack $base.f.l \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side left + pack $base.f.e \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side left + pack $base.f.bdd \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side left + pack $base.f.btnclose \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side right + pack $base.f.printbtn \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side right + pack $base.f.btnsave \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side right + pack $base.f.ls1 \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side right + pack $base.f.esn \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side right + pack $base.f.lsn \ + -in .pgaw:Schema.f -anchor center -expand 0 -fill none -side right + +} + + diff --git a/src/bin/pgaccess/lib/scripts.tcl b/src/bin/pgaccess/lib/scripts.tcl new file mode 100644 index 00000000000..0302e1fec14 --- /dev/null +++ b/src/bin/pgaccess/lib/scripts.tcl @@ -0,0 +1,88 @@ +namespace eval Scripts { + +proc {new} {} { + design {} +} + + +proc {open} {scriptname} { +global CurrentDB + set ss {} + wpg_select $CurrentDB "select * from pga_scripts where scriptname='$scriptname'" rec { + set ss $rec(scriptsource) + } + if {[string length $ss] > 0} { + eval $ss + } +} + + +proc {design} {scriptname} { +global PgAcVar CurrentDB + Window show .pgaw:Scripts + set PgAcVar(script,name) $scriptname + .pgaw:Scripts.src delete 1.0 end + if {[string length $scriptname]==0} return; + wpg_select $CurrentDB "select * from pga_scripts where scriptname='$scriptname'" rec { + .pgaw:Scripts.src insert end $rec(scriptsource) + } +} + + +proc {execute} {scriptname} { + # a wrap for execute command + open $scriptname +} + + +proc {save} {} { +global PgAcVar + if {$PgAcVar(script,name)==""} { + tk_messageBox -title [intlmsg Warning] -parent .pgaw:Scripts -message [intlmsg "The script must have a name!"] + } else { + sql_exec noquiet "delete from pga_scripts where scriptname='$PgAcVar(script,name)'" + regsub -all {\\} [.pgaw:Scripts.src get 1.0 end] {\\\\} PgAcVar(script,body) + regsub -all ' $PgAcVar(script,body) \\' PgAcVar(script,body) + sql_exec noquiet "insert into pga_scripts values ('$PgAcVar(script,name)','$PgAcVar(script,body)')" + Mainlib::tab_click Scripts + } +} + +} + + +########################## END OF NAMESPACE SCRIPTS ################## + +proc vTclWindow.pgaw:Scripts {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:Scripts + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 594x416+192+152 + wm maxsize $base 1009 738 + wm minsize $base 300 300 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm title $base [intlmsg "Design script"] + frame $base.f1 -height 55 -relief groove -width 125 + label $base.f1.l1 -borderwidth 0 -text [intlmsg {Script name}] + entry $base.f1.e1 -background #fefefe -borderwidth 1 -highlightthickness 0 -textvariable PgAcVar(script,name) -width 32 + text $base.src -background #fefefe -foreground #000000 -font $PgAcVar(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 .pgaw:Scripts} -text [intlmsg Cancel] + button $base.f2.b2 -borderwidth 1 -command Scripts::save \ + -text [intlmsg Save] -width 6 + pack $base.f1 -in .pgaw:Scripts -anchor center -expand 0 -fill x -pady 2 -side top + pack $base.f1.l1 -in .pgaw:Scripts.f1 -anchor center -expand 0 -fill none -ipadx 2 -side left + pack $base.f1.e1 -in .pgaw:Scripts.f1 -anchor center -expand 0 -fill none -side left + pack $base.src -in .pgaw:Scripts -anchor center -expand 1 -fill both -padx 2 -side top + pack $base.f2 -in .pgaw:Scripts -anchor center -expand 0 -fill none -side top + pack $base.f2.b1 -in .pgaw:Scripts.f2 -anchor center -expand 0 -fill none -side right + pack $base.f2.b2 -in .pgaw:Scripts.f2 -anchor center -expand 0 -fill none -side right +} + diff --git a/src/bin/pgaccess/lib/sequences.tcl b/src/bin/pgaccess/lib/sequences.tcl new file mode 100644 index 00000000000..834eaab22cc --- /dev/null +++ b/src/bin/pgaccess/lib/sequences.tcl @@ -0,0 +1,159 @@ +namespace eval Sequences { + +proc {new} {} { +global PgAcVar + Window show .pgaw:Sequence + set PgAcVar(seq,name) {} + set PgAcVar(seq,incr) 1 + set PgAcVar(seq,start) 1 + set PgAcVar(seq,minval) 1 + set PgAcVar(seq,maxval) 2147483647 + focus .pgaw:Sequence.f1.e1 +} + +proc {open} {seqname} { +global PgAcVar CurrentDB +Window show .pgaw:Sequence +set flag 1 +wpg_select $CurrentDB "select * from \"$seqname\"" rec { + set flag 0 + set PgAcVar(seq,name) $seqname + set PgAcVar(seq,incr) $rec(increment_by) + set PgAcVar(seq,start) $rec(last_value) + .pgaw:Sequence.f1.l3 configure -text [intlmsg "Last value"] + set PgAcVar(seq,minval) $rec(min_value) + set PgAcVar(seq,maxval) $rec(max_value) + .pgaw:Sequence.fb.btnsave configure -state disabled +} +if {$flag} { + showError [format [intlmsg "Sequence '%s' not found!"] $seqname] +} else { + for {set i 1} {$i<6} {incr i} { + .pgaw:Sequence.f1.e$i configure -state disabled + } + focus .pgaw:Sequence.fb.btncancel +} +} + +proc {save} {} { +global PgAcVar + if {$PgAcVar(seq,name)==""} { + showError [intlmsg "You should supply a name for this sequence"] + } else { + set s1 {};set s2 {};set s3 {};set s4 {}; + if {$PgAcVar(seq,incr)!=""} {set s1 "increment $PgAcVar(seq,incr)"}; + if {$PgAcVar(seq,start)!=""} {set s2 "start $PgAcVar(seq,start)"}; + if {$PgAcVar(seq,minval)!=""} {set s3 "minvalue $PgAcVar(seq,minval)"}; + if {$PgAcVar(seq,maxval)!=""} {set s4 "maxvalue $PgAcVar(seq,maxval)"}; + set sqlcmd "create sequence \"$PgAcVar(seq,name)\" $s1 $s2 $s3 $s4" + if {[sql_exec noquiet $sqlcmd]} { + Mainlib::cmd_Sequences + tk_messageBox -title [intlmsg Information] -parent .pgaw:Sequence -message [intlmsg "Sequence created!"] + } + } +} + +} + +proc vTclWindow.pgaw:Sequence {base} { + if {$base == ""} { + set base .pgaw:Sequence + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 283x172+119+210 + 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 [intlmsg "Sequence"] + bind $base "Help::load sequences" + frame $base.f1 \ + -borderwidth 2 -height 75 -width 125 + label $base.f1.l1 \ + -borderwidth 0 -relief raised -text [intlmsg {Sequence name}] + entry $base.f1.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(seq,name) -width 200 + bind $base.f1.e1 { + focus .pgaw:Sequence.f1.e2 + } + bind $base.f1.e1 { + focus .pgaw:Sequence.f1.e2 + } + label $base.f1.l2 \ + -borderwidth 0 -relief raised -text [intlmsg Increment] + entry $base.f1.e2 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(seq,incr) -width 200 + bind $base.f1.e2 { + focus .pgaw:Sequence.f1.e3 + } + label $base.f1.l3 \ + -borderwidth 0 -relief raised -text [intlmsg {Start value}] + entry $base.f1.e3 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(seq,start) -width 200 + bind $base.f1.e3 { + focus .pgaw:Sequence.f1.e4 + } + label $base.f1.l4 \ + -borderwidth 0 -relief raised -text [intlmsg Minvalue] + entry $base.f1.e4 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(seq,minval) \ + -width 200 + bind $base.f1.e4 { + focus .pgaw:Sequence.f1.e5 + } + label $base.f1.ls2 \ + -borderwidth 0 -relief raised -text { } + label $base.f1.l5 \ + -borderwidth 0 -relief raised -text [intlmsg Maxvalue] + entry $base.f1.e5 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(seq,maxval) \ + -width 200 + bind $base.f1.e5 { + focus .pgaw:Sequence.fb.btnsave + } + frame $base.fb \ + -height 75 -relief groove -width 125 + button $base.fb.btnsave \ + -borderwidth 1 -command Sequences::save \ + -padx 9 -pady 3 -text [intlmsg {Define sequence}] + button $base.fb.btncancel \ + -borderwidth 1 -command {Window destroy .pgaw:Sequence} \ + -padx 9 -pady 3 -text [intlmsg Close] + place $base.f1 \ + -x 9 -y 5 -width 265 -height 126 -anchor nw -bordermode ignore + grid columnconf $base.f1 2 -weight 1 + grid $base.f1.l1 \ + -in .pgaw:Sequence.f1 -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e1 \ + -in .pgaw:Sequence.f1 -column 2 -row 0 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.l2 \ + -in .pgaw:Sequence.f1 -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e2 \ + -in .pgaw:Sequence.f1 -column 2 -row 2 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.l3 \ + -in .pgaw:Sequence.f1 -column 0 -row 4 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e3 \ + -in .pgaw:Sequence.f1 -column 2 -row 4 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.l4 \ + -in .pgaw:Sequence.f1 -column 0 -row 6 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e4 \ + -in .pgaw:Sequence.f1 -column 2 -row 6 -columnspan 1 -rowspan 1 -pady 2 + grid $base.f1.ls2 \ + -in .pgaw:Sequence.f1 -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.f1.l5 \ + -in .pgaw:Sequence.f1 -column 0 -row 7 -columnspan 1 -rowspan 1 -sticky w + grid $base.f1.e5 \ + -in .pgaw:Sequence.f1 -column 2 -row 7 -columnspan 1 -rowspan 1 -pady 2 + place $base.fb \ + -x 0 -y 135 -width 283 -height 40 -anchor nw -bordermode ignore + grid $base.fb.btnsave \ + -in .pgaw:Sequence.fb -column 0 -row 0 -columnspan 1 -rowspan 1 -padx 5 + grid $base.fb.btncancel \ + -in .pgaw:Sequence.fb -column 1 -row 0 -columnspan 1 -rowspan 1 -padx 5 +} + diff --git a/src/bin/pgaccess/lib/tables.tcl b/src/bin/pgaccess/lib/tables.tcl new file mode 100644 index 00000000000..857231236ff --- /dev/null +++ b/src/bin/pgaccess/lib/tables.tcl @@ -0,0 +1,2158 @@ +namespace eval Tables { + + +proc {new} {} { + PgAcVar:clean nt,* + Window show .pgaw:NewTable + focus .pgaw:NewTable.etabn +} + + +proc {open} {tablename {filter ""} {order ""}} { +global PgAcVar + set wn [getNewWindowName] + createWindow + set PgAcVar(mw,$wn,tablename) $tablename + loadLayout $wn $tablename + set PgAcVar(mw,$wn,sortfield) $order + set PgAcVar(mw,$wn,filter) $filter + set PgAcVar(mw,$wn,query) "select oid,\"$tablename\".* from \"$tablename\"" + set PgAcVar(mw,$wn,updatable) 1 + set PgAcVar(mw,$wn,isaquery) 0 + initVariables $wn + refreshRecords $wn + catch {wm title $wn "$tablename"} +} + + +proc {design} {tablename} { +global PgAcVar CurrentDB + if {$CurrentDB==""} return; + set PgAcVar(tblinfo,tablename) $tablename + refreshTableInformation +} + + +proc {refreshTableInformation} {} { +global PgAcVar CurrentDB + Window show .pgaw:TableInfo + wm title .pgaw:TableInfo "[intlmsg {Table information}] : $PgAcVar(tblinfo,tablename)" + .pgaw:TableInfo.f1.lb delete 0 end + .pgaw:TableInfo.f2.fl.ilb delete 0 end + .pgaw:TableInfo.f2.fr.lb delete 0 end + .pgaw:TableInfo.f3.plb delete 0 end + set PgAcVar(tblinfo,isunique) {} + set PgAcVar(tblinfo,isclustered) {} + set PgAcVar(tblinfo,indexfields) {} + wpg_select $CurrentDB "select attnum,attname,typname,attlen,attnotnull,atttypmod,usename,usesysid,pg_class.oid,relpages,reltuples,relhaspkey,relhasrules,relacl from pg_class,pg_user,pg_attribute,pg_type where (pg_class.relname='$PgAcVar(tblinfo,tablename)') and (pg_class.oid=pg_attribute.attrelid) and (pg_class.relowner=pg_user.usesysid) and (pg_attribute.atttypid=pg_type.oid) order by attnum" rec { + set fsize $rec(attlen) + set fsize1 $rec(atttypmod) + set ftype $rec(typname) + if { $fsize=="-1" && $fsize1!="-1" } { + set fsize $rec(atttypmod) + incr fsize -4 + } + if { $fsize1=="-1" && $fsize=="-1" } { + set fsize "" + } + if {$rec(attnotnull) == "t"} { + set notnull "NOT NULL" + } else { + set notnull {} + } + if {$rec(attnum)>0} {.pgaw:TableInfo.f1.lb insert end [format "%-33.33s %-14.14s %6.6s %-8.8s" $rec(attname) $ftype $fsize $notnull]} + set PgAcVar(tblinfo,owner) $rec(usename) + set PgAcVar(tblinfo,tableoid) $rec(oid) + set PgAcVar(tblinfo,ownerid) $rec(usesysid) + set PgAcVar(tblinfo,f$rec(attnum)) $rec(attname) + set PgAcVar(tblinfo,numtuples) $rec(reltuples) + set PgAcVar(tblinfo,numpages) $rec(relpages) + set PgAcVar(tblinfo,permissions) $rec(relacl) + if {$rec(relhaspkey)=="t"} { + set PgAcVar(tblinfo,hasprimarykey) [intlmsg Yes] + } else { + set PgAcVar(tblinfo,hasprimarykey) [intlmsg No] + } + if {$rec(relhasrules)=="t"} { + set PgAcVar(tblinfo,hasrules) [intlmsg Yes] + } else { + set PgAcVar(tblinfo,hasrules) [intlmsg No] + } + } + set PgAcVar(tblinfo,indexlist) {} + wpg_select $CurrentDB "select oid,indexrelid from pg_index where (pg_class.relname='$PgAcVar(tblinfo,tablename)') and (pg_class.oid=pg_index.indrelid)" rec { + lappend PgAcVar(tblinfo,indexlist) $rec(oid) + wpg_select $CurrentDB "select relname from pg_class where oid=$rec(indexrelid)" rec1 { + .pgaw:TableInfo.f2.fl.ilb insert end $rec1(relname) + } + } + # + # showing permissions + set temp $PgAcVar(tblinfo,permissions) + regsub "^\{" $temp {} temp + regsub "\}$" $temp {} temp + regsub -all "\"" $temp {} temp + foreach token [split $temp ,] { + set oli [split $token =] + set uname [lindex $oli 0] + set rights [lindex $oli 1] + if {$uname == ""} {set uname PUBLIC} + set r_select " " + set r_update " " + set r_insert " " + set r_rule " " + if {[string first r $rights] != -1} {set r_select x} + if {[string first w $rights] != -1} {set r_update x} + if {[string first a $rights] != -1} {set r_insert x} + if {[string first R $rights] != -1} {set r_rule x} + # + # changing the format of the following line can affect the loadPermissions procedure + # see below + .pgaw:TableInfo.f3.plb insert end [format "%-23.23s %11s %11s %11s %11s" $uname $r_select $r_update $r_insert $r_rule] + + } +} + +proc {loadPermissions} {} { +global PgAcVar + set sel [.pgaw:TableInfo.f3.plb curselection] + if {$sel == ""} { + bell + return + } + set line [.pgaw:TableInfo.f3.plb get $sel] + set uname [string trim [string range $line 0 22]] + Window show .pgaw:Permissions + wm transient .pgaw:Permissions .pgaw:TableInfo + set PgAcVar(permission,username) $uname + set PgAcVar(permission,select) [expr {"x"==[string range $line 34 34]}] + set PgAcVar(permission,update) [expr {"x"==[string range $line 46 46]}] + set PgAcVar(permission,insert) [expr {"x"==[string range $line 58 58]}] + set PgAcVar(permission,rule) [expr {"x"==[string range $line 70 70]}] + focus .pgaw:Permissions.f1.ename +} + + +proc {newPermissions} {} { +global PgAcVar + PgAcVar:clean permission,* + Window show .pgaw:Permissions + wm transient .pgaw:Permissions .pgaw:TableInfo + focus .pgaw:Permissions.f1.ename +} + + +proc {savePermissions} {} { +global PgAcVar + if {$PgAcVar(permission,username) == ""} { + showError [intlmsg "User without name?"] + return + } + sql_exec noquiet "revoke all on \"$PgAcVar(tblinfo,tablename)\" from $PgAcVar(permission,username)" + if {$PgAcVar(permission,select)} { + sql_exec noquiet "GRANT SELECT on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)" + } + if {$PgAcVar(permission,insert)} { + sql_exec noquiet "GRANT INSERT on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)" + } + if {$PgAcVar(permission,update)} { + sql_exec noquiet "GRANT UPDATE on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)" + } + if {$PgAcVar(permission,rule)} { + sql_exec noquiet "GRANT RULE on \"$PgAcVar(tblinfo,tablename)\" to $PgAcVar(permission,username)" + } + refreshTableInformation +} + + +proc {clusterIndex} {} { +global PgAcVar + set sel [.pgaw:TableInfo.f2.fl.ilb curselection] + if {$sel == ""} { + showError [intlmsg "You have to select an index!"] + return + } + bell + if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:TableInfo -message [format [intlmsg "You choose to cluster index\n\n %s \n\nAll other indices will be lost!\nProceed?"] [.pgaw:TableInfo.f2.fl.ilb get $sel]] -type yesno -default no]=="no"} {return} + if {[sql_exec noquiet "cluster \"[.pgaw:TableInfo.f2.fl.ilb get $sel]\" on \"$PgAcVar(tblinfo,tablename)\""]} { + refreshTableInformation + } +} + + +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 {dragMove} {w x y} { +global PgAcVar + set dlo "" + catch { set dlo $PgAcVar(draglocation,obj) } + if {$dlo != ""} { + set dx [expr $x - $PgAcVar(draglocation,x)] + set dy [expr $y - $PgAcVar(draglocation,y)] + $w move $dlo $dx $dy + set PgAcVar(draglocation,x) $x + set PgAcVar(draglocation,y) $y + } +} + + +proc {dragStart} {wn w x y} { +global PgAcVar + PgAcVar:clean draglocation,* + set object [$w find closest $x $y] + if {[lsearch [$wn.c gettags $object] movable]==-1} return; + $wn.c bind movable {} + set PgAcVar(draglocation,obj) $object + set PgAcVar(draglocation,x) $x + set PgAcVar(draglocation,y) $y + set PgAcVar(draglocation,start) $x +} + + +proc {dragStop} {wn w x y} { +global PgAcVar CurrentDB + set dlo "" + catch { set dlo $PgAcVar(draglocation,obj) } + if {$dlo != ""} { + $wn.c bind movable "$wn configure -cursor left_ptr" + $wn configure -cursor left_ptr + set ctr [get_tag_info $wn $PgAcVar(draglocation,obj) v] + set diff [expr $x-$PgAcVar(draglocation,start)] + if {$diff==0} return; + set newcw {} + for {set i 0} {$i<$PgAcVar(mw,$wn,colcount)} {incr i} { + if {$i==$ctr} { + lappend newcw [expr [lindex $PgAcVar(mw,$wn,colwidth) $i]+$diff] + } else { + lappend newcw [lindex $PgAcVar(mw,$wn,colwidth) $i] + } + } + set PgAcVar(mw,$wn,colwidth) $newcw + $wn.c itemconfigure c$ctr -width [expr [lindex $PgAcVar(mw,$wn,colwidth) $ctr]-5] + drawHeaders $wn + drawHorizontalLines $wn + if {$PgAcVar(mw,$wn,crtrow)!=""} {showRecord $wn $PgAcVar(mw,$wn,crtrow)} + for {set i [expr $ctr+1]} {$i<$PgAcVar(mw,$wn,colcount)} {incr i} { + $wn.c move c$i $diff 0 + } + setCursor CLOCK + sql_exec quiet "update pga_layout set colwidth='$PgAcVar(mw,$wn,colwidth)' where tablename='$PgAcVar(mw,$wn,layout_name)'" + setCursor DEFAULT + } +} + + +proc {canvasClick} {wn x y} { +global PgAcVar + if {![finishEdit $wn]} return + # Determining row + for {set row 0} {$row<$PgAcVar(mw,$wn,nrecs)} {incr row} { + if {[lindex $PgAcVar(mw,$wn,rowy) $row]>$y} break + } + incr row -1 + if {$y>[lindex $PgAcVar(mw,$wn,rowy) $PgAcVar(mw,$wn,last_rownum)]} {set row $PgAcVar(mw,$wn,last_rownum)} + if {$row<0} return + set PgAcVar(mw,$wn,row_edited) $row + set PgAcVar(mw,$wn,crtrow) $row + showRecord $wn $row + if {$PgAcVar(mw,$wn,errorsavingnew)} return + # Determining column + set posx [expr -$PgAcVar(mw,$wn,leftoffset)] + set col 0 + foreach cw $PgAcVar(mw,$wn,colwidth) { + incr posx [expr $cw+2] + if {$x<$posx} break + incr col + } + set itlist [$wn.c find withtag r$row] + foreach item $itlist { + if {[get_tag_info $wn $item c]==$col} { + startEdit $wn $item $x $y + break + } + } +} + + +proc {deleteRecord} {wn} { +global PgAcVar CurrentDB + if {!$PgAcVar(mw,$wn,updatable)} return; + if {![finishEdit $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 $PgAcVar(mw,$wn,keylist) $row] + if {[tk_messageBox -title [intlmsg "FINAL WARNING"] -icon question -parent $wn -message [intlmsg "Delete current record ?"] -type yesno -default no]=="no"} return + if {[sql_exec noquiet "delete from \"$PgAcVar(mw,$wn,tablename)\" where oid=$oid"]} { + $wn.c delete hili + } +} + + +proc {drawHeaders} {wn} { +global PgAcVar + $wn.c delete header + set posx [expr 5-$PgAcVar(mw,$wn,leftoffset)] + for {set i 0} {$i<$PgAcVar(mw,$wn,colcount)} {incr i} { + set xf [expr $posx+[lindex $PgAcVar(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 $PgAcVar(mw,$wn,colwidth) $i]*1.0/2] 14 -text [lindex $PgAcVar(mw,$wn,colnames) $i] -tags header -fill navy -font $PgAcVar(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 PgAcVar(mw,$wn,r_edge) $posx + $wn.c bind movable "Tables::dragStart $wn %W %x %y" + $wn.c bind movable {Tables::dragMove %W %x %y} + $wn.c bind movable "Tables::dragStop $wn %W %x %y" + $wn.c bind movable "$wn configure -cursor left_side" + $wn.c bind movable "$wn configure -cursor left_ptr" +} + + +proc {drawHorizontalLines} {wn} { +global PgAcVar + $wn.c delete hgrid + set posx 10 + for {set j 0} {$j<$PgAcVar(mw,$wn,colcount)} {incr j} { + set ledge($j) $posx + incr posx [expr [lindex $PgAcVar(mw,$wn,colwidth) $j]+2] + set textwidth($j) [expr [lindex $PgAcVar(mw,$wn,colwidth) $j]-5] + } + incr posx -6 + for {set i 0} {$i<$PgAcVar(mw,$wn,nrecs)} {incr i} { + $wn.c create line [expr -$PgAcVar(mw,$wn,leftoffset)] [lindex $PgAcVar(mw,$wn,rowy) [expr $i+1]] [expr $posx-$PgAcVar(mw,$wn,leftoffset)] [lindex $PgAcVar(mw,$wn,rowy) [expr $i+1]] -fill gray -tags [subst {hgrid g$i}] + } + if {$PgAcVar(mw,$wn,updatable)} { + set i $PgAcVar(mw,$wn,nrecs) + set posy [expr 14+[lindex $PgAcVar(mw,$wn,rowy) $PgAcVar(mw,$wn,nrecs)]] + $wn.c create line [expr -$PgAcVar(mw,$wn,leftoffset)] $posy [expr $posx-$PgAcVar(mw,$wn,leftoffset)] $posy -fill gray -tags [subst {hgrid g$i}] + } +} + + +proc {drawNewRecord} {wn} { +global PgAcVar + set posx [expr 10-$PgAcVar(mw,$wn,leftoffset)] + set posy [lindex $PgAcVar(mw,$wn,rowy) $PgAcVar(mw,$wn,last_rownum)] + if {$PgAcVar(pref,tvfont)=="helv"} { + set tvfont $PgAcVar(pref,font_normal) + } else { + set tvfont $PgAcVar(pref,font_fix) + } + if {$PgAcVar(mw,$wn,updatable)} { + for {set j 0} {$j<$PgAcVar(mw,$wn,colcount)} {incr j} { + $wn.c create text $posx $posy -text * -tags [subst {r$PgAcVar(mw,$wn,nrecs) c$j q new unt}] -anchor nw -font $tvfont -width [expr [lindex $PgAcVar(mw,$wn,colwidth) $j]-5] + incr posx [expr [lindex $PgAcVar(mw,$wn,colwidth) $j]+2] + } + incr posy 14 + $wn.c create line [expr -$PgAcVar(mw,$wn,leftoffset)] $posy [expr $PgAcVar(mw,$wn,r_edge)-$PgAcVar(mw,$wn,leftoffset)] $posy -fill gray -tags [subst {hgrid g$PgAcVar(mw,$wn,nrecs)}] + } +} + + +proc {editMove} { wn {distance 1} {position end} } { + global PgAcVar + + # This routine moves the cursor some relative distance + # from one cell being editted to another cell in the table. + # Typical distances are 1, +1, $PgAcVar(mw,$wn,colcount), and + # -$PgAcVar(mw,$wn,colcount). Position is where + # the cursor will be placed within the cell. The valid + # positions are 0 and end. + + # get the current row and column + set current_cell_id $PgAcVar(mw,$wn,id_edited) + set tags [$wn.c gettags $current_cell_id] + regexp {r([0-9]+)} $tags match crow + regexp {c([0-9]+)} $tags match ccol + + + # calculate next row and column + set colcount $PgAcVar(mw,$wn,colcount) + set ccell [expr ($crow * $colcount) + $ccol] + set ncell [expr $ccell + $distance] + set nrow [expr $ncell / $colcount] + set ncol [expr $ncell % $colcount] + + + # find the row of the next cell + if {$distance < 0} { + set row_increment -1 + } else { + set row_increment 1 + } + set id_tuple [$wn.c find withtag r$nrow] + # skip over deleted rows... + while {[llength $id_tuple] == 0} { + # case above first row of table + if {$nrow < 0} { + return + # case at or beyond last row of table + } elseif {$nrow >= $PgAcVar(mw,$wn,nrecs)} { + if {![insertNewRecord $wn]} { + set PgAcVar(mw,$wn,errorsavingnew) 1 + return + } + set id_tuple [$wn.c find withtag r$nrow] + break + } + incr nrow $row_increment + set id_tuple [$wn.c find withtag r$nrow] + } + + # find the widget id of the next cell + set next_cell_id [lindex [lsort -integer $id_tuple] $ncol] + if {[string compare $next_cell_id {}] == 0} { + set next_cell_id [$wn.c find withtag $current_cell_id] + } + + # make sure that the new cell is in the visible window + set toprec $PgAcVar(mw,$wn,toprec) + set numscreenrecs [getVisibleRecordsCount $wn] + if {$nrow < $toprec} { + # case nrow above visable window + scrollWindow $wn moveto \ + [expr $nrow *[recordSizeInScrollbarUnits $wn]] + } elseif {$nrow > ($toprec + $numscreenrecs - 1)} { + # case nrow below visable window + scrollWindow $wn moveto \ + [expr ($nrow - $numscreenrecs + 2) * [recordSizeInScrollbarUnits $wn]] + } + # I need to find a better way to pan -kk + foreach {x1 y1 x2 y2} [$wn.c bbox $next_cell_id] {break} + while {$x1 <= $PgAcVar(mw,$wn,leftoffset)} { + panRight $wn + foreach {x1 y1 x2 y2} [$wn.c bbox $next_cell_id] {break} + } + set rightedge [expr $x1 + [lindex $PgAcVar(mw,$wn,colwidth) $ncol]] + while {$rightedge > ($PgAcVar(mw,$wn,leftoffset) + [winfo width $wn.c])} { + panLeft $wn + } + + # move to the next cell + foreach {x1 y1 x2 y2} [$wn.c bbox $next_cell_id] {break} + switch -exact -- $position { + 0 { + canvasClick $wn [incr x1 ] [incr y1 ] + } + end - + default { + canvasClick $wn [incr x2 -1] [incr y2 -1] + } + } +} + + +proc {editText} {wn c k} { +global PgAcVar +set bbin [$wn.c bbox r$PgAcVar(mw,$wn,row_edited)] +switch $k { + BackSpace { set dp [expr [$wn.c index $PgAcVar(mw,$wn,id_edited) insert]-1];if {$dp>=0} {$wn.c dchars $PgAcVar(mw,$wn,id_edited) $dp $dp; set PgAcVar(mw,$wn,dirtyrec) 1}} + Home {$wn.c icursor $PgAcVar(mw,$wn,id_edited) 0} + End {$wn.c icursor $PgAcVar(mw,$wn,id_edited) end} + Left { + set position [expr [$wn.c index $PgAcVar(mw,$wn,id_edited) insert]-1] + if {$position < 0} { + editMove $wn -1 end + return + } + $wn.c icursor $PgAcVar(mw,$wn,id_edited) $position + } + Delete {} + Right { + set position [expr [$wn.c index $PgAcVar(mw,$wn,id_edited) insert]+1] + if {$position > [$wn.c index $PgAcVar(mw,$wn,id_edited) end] } { + editMove $wn 1 0 + return + } + $wn.c icursor $PgAcVar(mw,$wn,id_edited) $position + } + Return - + Tab {editMove $wn; return} + ISO_Left_Tab {editMove $wn -1; return} + Up {editMove $wn -$PgAcVar(mw,$wn,colcount); return } + Down {editMove $wn $PgAcVar(mw,$wn,colcount); return } + Escape {set PgAcVar(mw,$wn,dirtyrec) 0; $wn.c itemconfigure $PgAcVar(mw,$wn,id_edited) -text $PgAcVar(mw,$wn,text_initial_value); $wn.c focus {}} + default {if {[string compare $c " "]>-1} {$wn.c insert $PgAcVar(mw,$wn,id_edited) insert $c;set PgAcVar(mw,$wn,dirtyrec) 1}} +} +set bbout [$wn.c bbox r$PgAcVar(mw,$wn,row_edited)] +set dy [expr [lindex $bbout 3]-[lindex $bbin 3]] +if {$dy==0} return +set re $PgAcVar(mw,$wn,row_edited) +$wn.c move g$re 0 $dy +for {set i [expr 1+$re]} {$i<=$PgAcVar(mw,$wn,nrecs)} {incr i} { + $wn.c move r$i 0 $dy + $wn.c move g$i 0 $dy + set rh [lindex $PgAcVar(mw,$wn,rowy) $i] + incr rh $dy + set PgAcVar(mw,$wn,rowy) [lreplace $PgAcVar(mw,$wn,rowy) $i $i $rh] +} +showRecord $wn $PgAcVar(mw,$wn,row_edited) +# Delete is trapped by window interpreted as record delete +# Delete {$wn.c dchars $PgAcVar(mw,$wn,id_edited) insert insert; set PgAcVar(mw,$wn,dirtyrec) 1} +} + + +proc {finishEdit} {wn} { +global PgAcVar CurrentDB +# User has edited the text ? +if {!$PgAcVar(mw,$wn,dirtyrec)} { + # No, unfocus text + $wn.c focus {} + # For restoring * to the new record position + if {$PgAcVar(mw,$wn,id_edited)!=""} { + if {[lsearch [$wn.c gettags $PgAcVar(mw,$wn,id_edited)] new]!=-1} { + $wn.c itemconfigure $PgAcVar(mw,$wn,id_edited) -text $PgAcVar(mw,$wn,text_initial_value) + } + } + set PgAcVar(mw,$wn,id_edited) {};set PgAcVar(mw,$wn,text_initial_value) {} + return 1 +} +# Trimming the spaces +set fldval [string trim [$wn.c itemcget $PgAcVar(mw,$wn,id_edited) -text]] +$wn.c itemconfigure $PgAcVar(mw,$wn,id_edited) -text $fldval +if {[string compare $PgAcVar(mw,$wn,text_initial_value) $fldval]==0} { + set PgAcVar(mw,$wn,dirtyrec) 0 + $wn.c focus {} + set PgAcVar(mw,$wn,id_edited) {};set PgAcVar(mw,$wn,text_initial_value) {} + return 1 +} +setCursor CLOCK +set oid [lindex $PgAcVar(mw,$wn,keylist) $PgAcVar(mw,$wn,row_edited)] +set fld [lindex $PgAcVar(mw,$wn,colnames) [get_tag_info $wn $PgAcVar(mw,$wn,id_edited) c]] +set fillcolor black +if {$PgAcVar(mw,$wn,row_edited)==$PgAcVar(mw,$wn,last_rownum)} { + set fillcolor red + set sfp [lsearch $PgAcVar(mw,$wn,newrec_fields) "\"$fld\""] + if {$sfp>-1} { + set PgAcVar(mw,$wn,newrec_fields) [lreplace $PgAcVar(mw,$wn,newrec_fields) $sfp $sfp] + set PgAcVar(mw,$wn,newrec_values) [lreplace $PgAcVar(mw,$wn,newrec_values) $sfp $sfp] + } + lappend PgAcVar(mw,$wn,newrec_fields) "\"$fld\"" + lappend PgAcVar(mw,$wn,newrec_values) '$fldval' + # Remove the untouched tag from the object + $wn.c dtag $PgAcVar(mw,$wn,id_edited) unt + $wn.c itemconfigure $PgAcVar(mw,$wn,id_edited) -fill red + set retval 1 +} else { + set PgAcVar(mw,$wn,msg) "Updating record ..." + after 1000 "set PgAcVar(mw,$wn,msg) {}" + regsub -all ' $fldval \\' sqlfldval + +#FIXME rjr 4/29/1999 special case null so it can be entered into tables +#really need to write a tcl sqlquote proc which quotes the string only +#if necessary, so it can be used all over pgaccess, instead of explicit 's + + if {$sqlfldval == "null"} { + set retval [sql_exec noquiet "update \"$PgAcVar(mw,$wn,tablename)\" \ + set \"$fld\"= null where oid=$oid"] + } else { + set retval [sql_exec noquiet "update \"$PgAcVar(mw,$wn,tablename)\" \ + set \"$fld\"='$sqlfldval' where oid=$oid"] + } +} +setCursor DEFAULT +if {!$retval} { + set PgAcVar(mw,$wn,msg) "" + focus $wn.c + return 0 +} +set PgAcVar(mw,$wn,dirtyrec) 0 +$wn.c focus {} +set PgAcVar(mw,$wn,id_edited) {};set PgAcVar(mw,$wn,text_initial_value) {} +return 1 +} + +proc {loadLayout} {wn layoutname} { +global PgAcVar CurrentDB + setCursor CLOCK + set PgAcVar(mw,$wn,layout_name) $layoutname + catch {unset PgAcVar(mw,$wn,colcount) PgAcVar(mw,$wn,colnames) PgAcVar(mw,$wn,colwidth)} + set PgAcVar(mw,$wn,layout_found) 0 + set pgres [wpg_exec $CurrentDB "select *,oid from pga_layout where tablename='$layoutname' order by oid desc"] + set pgs [pg_result $pgres -status] + if {$pgs!="PGRES_TUPLES_OK"} { + # Probably table pga_layout isn't yet defined + sql_exec noquiet "create table pga_layout (tablename varchar(64),nrcols int2,colnames text,colwidth text)" + sql_exec quiet "grant ALL on pga_layout to PUBLIC" + } else { + set nrlay [pg_result $pgres -numTuples] + if {$nrlay>=1} { + set layoutinfo [pg_result $pgres -getTuple 0] + set PgAcVar(mw,$wn,colcount) [lindex $layoutinfo 1] + set PgAcVar(mw,$wn,colnames) [lindex $layoutinfo 2] + set PgAcVar(mw,$wn,colwidth) [lindex $layoutinfo 3] + set goodoid [lindex $layoutinfo 4] + set PgAcVar(mw,$wn,layout_found) 1 + } + if {$nrlay>1} { + showError "Multiple ($nrlay) layout info found\n\nPlease report the bug!" + sql_exec quiet "delete from pga_layout where (tablename='$PgAcVar(mw,$wn,tablename)') and (oid<>$goodoid)" + } + } + pg_result $pgres -clear +} + + +proc {panLeft} {wn } { +global PgAcVar + if {![finishEdit $wn]} return; + if {$PgAcVar(mw,$wn,leftcol)==[expr $PgAcVar(mw,$wn,colcount)-1]} return; + set diff [expr 2+[lindex $PgAcVar(mw,$wn,colwidth) $PgAcVar(mw,$wn,leftcol)]] + incr PgAcVar(mw,$wn,leftcol) + incr PgAcVar(mw,$wn,leftoffset) $diff + $wn.c move header -$diff 0 + $wn.c move q -$diff 0 + $wn.c move hgrid -$diff 0 +} + + +proc {panRight} {wn} { +global PgAcVar + if {![finishEdit $wn]} return; + if {$PgAcVar(mw,$wn,leftcol)==0} return; + incr PgAcVar(mw,$wn,leftcol) -1 + set diff [expr 2+[lindex $PgAcVar(mw,$wn,colwidth) $PgAcVar(mw,$wn,leftcol)]] + incr PgAcVar(mw,$wn,leftoffset) -$diff + $wn.c move header $diff 0 + $wn.c move q $diff 0 + $wn.c move hgrid $diff 0 +} + + +proc {insertNewRecord} {wn} { +global PgAcVar CurrentDB + if {![finishEdit $wn]} {return 0} + if {$PgAcVar(mw,$wn,newrec_fields)==""} {return 1} + set PgAcVar(mw,$wn,msg) "Saving new record ..." + after 1000 "set PgAcVar(mw,$wn,msg) {}" + set pgres [wpg_exec $CurrentDB "insert into \"$PgAcVar(mw,$wn,tablename)\" ([join $PgAcVar(mw,$wn,newrec_fields) ,]) values ([join $PgAcVar(mw,$wn,newrec_values) ,])" ] + if {[pg_result $pgres -status]!="PGRES_COMMAND_OK"} { + set errmsg [pg_result $pgres -error] + showError "[intlmsg {Error inserting new record}]\n\n$errmsg" + return 0 + } + set oid [pg_result $pgres -oid] + lappend PgAcVar(mw,$wn,keylist) $oid + pg_result $pgres -clear + # Get bounds of the last record + set lrbb [$wn.c bbox new] + lappend PgAcVar(mw,$wn,rowy) [lindex $lrbb 3] + $wn.c itemconfigure new -fill black + $wn.c dtag q new + # Replace * from untouched new row elements with " " + foreach item [$wn.c find withtag unt] { + $wn.c itemconfigure $item -text " " + } + $wn.c dtag q unt + incr PgAcVar(mw,$wn,last_rownum) + incr PgAcVar(mw,$wn,nrecs) + drawNewRecord $wn + set PgAcVar(mw,$wn,newrec_fields) {} + set PgAcVar(mw,$wn,newrec_values) {} + return 1 +} + + +proc {scrollWindow} {wn par1 args} { +global PgAcVar + if {![finishEdit $wn]} return; + if {$par1=="scroll"} { + set newtop $PgAcVar(mw,$wn,toprec) + if {[lindex $args 1]=="units"} { + incr newtop [lindex $args 0] + } else { + incr newtop [expr [lindex $args 0]*25] + if {$newtop<0} {set newtop 0} + if {$newtop>=[expr $PgAcVar(mw,$wn,nrecs)-1]} {set newtop [expr $PgAcVar(mw,$wn,nrecs)-1]} + } + } elseif {$par1=="moveto"} { + set newtop [expr int([lindex $args 0]*$PgAcVar(mw,$wn,nrecs))] + } else { + return + } + if {$newtop<0} return; + if {$newtop>=[expr $PgAcVar(mw,$wn,nrecs)-1]} return; + set dy [expr [lindex $PgAcVar(mw,$wn,rowy) $PgAcVar(mw,$wn,toprec)]-[lindex $PgAcVar(mw,$wn,rowy) $newtop]] + $wn.c move q 0 $dy + $wn.c move hgrid 0 $dy + set newrowy {} + foreach y $PgAcVar(mw,$wn,rowy) {lappend newrowy [expr $y+$dy]} + set PgAcVar(mw,$wn,rowy) $newrowy + set PgAcVar(mw,$wn,toprec) $newtop + setScrollbar $wn +} + + +proc {initVariables} {wn} { +global PgAcVar + set PgAcVar(mw,$wn,newrec_fields) {} + set PgAcVar(mw,$wn,newrec_values) {} +} + +proc {selectRecords} {wn sql} { +global PgAcVar CurrentDB +if {![finishEdit $wn]} return; +initVariables $wn +$wn.c delete q +$wn.c delete header +$wn.c delete hgrid +$wn.c delete new +set PgAcVar(mw,$wn,leftcol) 0 +set PgAcVar(mw,$wn,leftoffset) 0 +set PgAcVar(mw,$wn,crtrow) {} +set PgAcVar(mw,$wn,msg) [intlmsg "Accessing data. Please wait ..."] +catch {$wn.f1.b1 configure -state disabled} +setCursor CLOCK +set is_error 1 +if {[sql_exec noquiet "BEGIN"]} { + if {[sql_exec noquiet "declare mycursor cursor for $sql"]} { + set pgres [wpg_exec $CurrentDB "fetch $PgAcVar(pref,rows) in mycursor"] + if {$PgAcVar(pgsql,status)=="PGRES_TUPLES_OK"} { + set is_error 0 + } + } +} +if {$is_error} { + sql_exec quiet "END" + set PgAcVar(mw,$wn,msg) {} + catch {$wn.f1.b1 configure -state normal} + setCursor DEFAULT + set PgAcVar(mw,$wn,msg) "Error executing : $sql" + return +} +if {$PgAcVar(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 {$PgAcVar(mw,$wn,layout_found)} then { + if { ($PgAcVar(mw,$wn,colcount) != [expr [llength $attrlist]-$shift]) || + ($PgAcVar(mw,$wn,colcount) != [llength $PgAcVar(mw,$wn,colnames)]) || + ($PgAcVar(mw,$wn,colcount) != [llength $PgAcVar(mw,$wn,colwidth)]) } then { + # No. of columns don't match, something is wrong + # tk_messageBox -title [intlmsg Information] -message "Layout info changed !\nRescanning..." + set PgAcVar(mw,$wn,layout_found) 0 + sql_exec quiet "delete from pga_layout where tablename='$PgAcVar(mw,$wn,layout_name)'" + } +} +# Always take the col. names from the result +set PgAcVar(mw,$wn,colcount) [llength $attrlist] +if {$PgAcVar(mw,$wn,updatable)} then {incr PgAcVar(mw,$wn,colcount) -1} +set PgAcVar(mw,$wn,colnames) {} +# In defPgAcVar(mw,$wn,colwidth) prepare PgAcVar(mw,$wn,colwidth) (in case that not layout_found) +set defPgAcVar(mw,$wn,colwidth) {} +for {set i 0} {$i<$PgAcVar(mw,$wn,colcount)} {incr i} { + lappend PgAcVar(mw,$wn,colnames) [lindex [lindex $attrlist [expr {$i+$shift}]] 0] + lappend defPgAcVar(mw,$wn,colwidth) 150 +} +if {!$PgAcVar(mw,$wn,layout_found)} { + set PgAcVar(mw,$wn,colwidth) $defPgAcVar(mw,$wn,colwidth) + sql_exec quiet "insert into pga_layout values ('$PgAcVar(mw,$wn,layout_name)',$PgAcVar(mw,$wn,colcount),'$PgAcVar(mw,$wn,colnames)','$PgAcVar(mw,$wn,colwidth)')" + set PgAcVar(mw,$wn,layout_found) 1 +} +set PgAcVar(mw,$wn,nrecs) [pg_result $pgres -numTuples] +if {$PgAcVar(mw,$wn,nrecs)>$PgAcVar(pref,rows)} { + set PgAcVar(mw,$wn,msg) "Only first $PgAcVar(pref,rows) records from $PgAcVar(mw,$wn,nrecs) have been loaded" + set PgAcVar(mw,$wn,nrecs) $PgAcVar(pref,rows) +} +set tagoid {} +if {$PgAcVar(pref,tvfont)=="helv"} { + set tvfont $PgAcVar(pref,font_normal) +} else { + set tvfont $PgAcVar(pref,font_fix) +} +# Computing column's left edge +set posx 10 +for {set j 0} {$j<$PgAcVar(mw,$wn,colcount)} {incr j} { + set ledge($j) $posx + incr posx [expr {[lindex $PgAcVar(mw,$wn,colwidth) $j]+2}] + set textwidth($j) [expr {[lindex $PgAcVar(mw,$wn,colwidth) $j]-5}] +} +incr posx -6 +set posy 24 +drawHeaders $wn +set PgAcVar(mw,$wn,updatekey) oid +set PgAcVar(mw,$wn,keylist) {} +set PgAcVar(mw,$wn,rowy) {24} +set PgAcVar(mw,$wn,msg) "Loading maximum $PgAcVar(pref,rows) records ..." +set wupdatable $PgAcVar(mw,$wn,updatable) +for {set i 0} {$i<$PgAcVar(mw,$wn,nrecs)} {incr i} { + set curtup [pg_result $pgres -getTuple $i] + if {$wupdatable} then {lappend PgAcVar(mw,$wn,keylist) [lindex $curtup 0]} + for {set j 0} {$j<$PgAcVar(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 PgAcVar(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 PgAcVar(mw,$wn,msg) {}" +set PgAcVar(mw,$wn,last_rownum) $i +# Defining position for input data +drawNewRecord $wn +pg_result $pgres -clear +sql_exec quiet "END" +set PgAcVar(mw,$wn,toprec) 0 +setScrollbar $wn +if {$PgAcVar(mw,$wn,updatable)} then { + $wn.c bind q "Tables::editText $wn %A %K" +} else { + $wn.c bind q {} +} +set PgAcVar(mw,$wn,dirtyrec) 0 +$wn.c raise header +catch {$wn.f1.b1 configure -state normal} +setCursor DEFAULT +} + + +proc recordSizeInScrollbarUnits {wn} { + # record size in scrollbar units + global PgAcVar + return [expr 1.0/$PgAcVar(mw,$wn,nrecs)] +} + + +proc getVisibleRecordsCount {wn} { + # number of records that fit in the window at its current size + expr [winfo height $wn.c]/14 +} + + +proc {setScrollbar} {wn} { +global PgAcVar + if {$PgAcVar(mw,$wn,nrecs)==0} return; + # Fixes problem of window resizing messing up the scrollbar size. + set record_size [recordSizeInScrollbarUnits $wn]; + $wn.sb set [expr $PgAcVar(mw,$wn,toprec)*$record_size] \ + [expr ($PgAcVar(mw,$wn,toprec)+[getVisibleRecordsCount $wn])*$record_size] +} + + +proc {refreshRecords} {wn} { +global PgAcVar + set nq $PgAcVar(mw,$wn,query) + if {($PgAcVar(mw,$wn,isaquery)) && ("$PgAcVar(mw,$wn,filter)$PgAcVar(mw,$wn,sortfield)"!="")} { + showError [intlmsg "Sorting and filtering not (yet) available from queries!\n\nPlease enter them in the query definition!"] + set PgAcVar(mw,$wn,sortfield) {} + set PgAcVar(mw,$wn,filter) {} + } else { + if {$PgAcVar(mw,$wn,filter)!=""} { + set nq "$PgAcVar(mw,$wn,query) where ($PgAcVar(mw,$wn,filter))" + } else { + set nq $PgAcVar(mw,$wn,query) + } + if {$PgAcVar(mw,$wn,sortfield)!=""} { + set nq "$nq order by $PgAcVar(mw,$wn,sortfield)" + } + } + if {[insertNewRecord $wn]} {selectRecords $wn $nq} +} + + +proc {showRecord} {wn row} { +global PgAcVar + set PgAcVar(mw,$wn,errorsavingnew) 0 + if {$PgAcVar(mw,$wn,newrec_fields)!=""} { + if {$row!=$PgAcVar(mw,$wn,last_rownum)} { + if {![insertNewRecord $wn]} { + set PgAcVar(mw,$wn,errorsavingnew) 1 + return + } + } + } + set y1 [lindex $PgAcVar(mw,$wn,rowy) $row] + set y2 [lindex $PgAcVar(mw,$wn,rowy) [expr $row+1]] + if {$y2==""} {set y2 [expr $y1+14]} + $wn.c dtag hili hili + $wn.c addtag hili withtag r$row + # Making a rectangle arround the record + set x 3 + foreach wi $PgAcVar(mw,$wn,colwidth) {incr x [expr $wi+2]} + $wn.c delete crtrec + $wn.c create rectangle [expr -1-$PgAcVar(mw,$wn,leftoffset)] $y1 [expr $x-$PgAcVar(mw,$wn,leftoffset)] $y2 -fill #EEEEEE -outline {} -tags {q crtrec} + $wn.c lower crtrec +} + + +proc {startEdit} {wn id x y} { +global PgAcVar + if {!$PgAcVar(mw,$wn,updatable)} return + set PgAcVar(mw,$wn,id_edited) $id + set PgAcVar(mw,$wn,dirtyrec) 0 + set PgAcVar(mw,$wn,text_initial_value) [$wn.c itemcget $id -text] + focus $wn.c + $wn.c focus $id + $wn.c icursor $id @$x,$y + if {$PgAcVar(mw,$wn,row_edited)==$PgAcVar(mw,$wn,nrecs)} { + if {[$wn.c itemcget $id -text]=="*"} { + $wn.c itemconfigure $id -text "" + $wn.c icursor $id 0 + } + } +} + + +proc {canvasPaste} {wn x y} { +global PgAcVar + $wn.c insert $PgAcVar(mw,$wn,id_edited) insert [selection get] + set PgAcVar(mw,$wn,dirtyrec) 1 +} + +proc {getNewWindowName} {} { +global PgAcVar + incr PgAcVar(mwcount) + return .pgaw:$PgAcVar(mwcount) +} + + + +proc {createWindow} {{base ""}} { +global PgAcVar + if {$base == ""} { + set base .pgaw:$PgAcVar(mwcount) + set included 0 + } else { + set included 1 + } + set wn $base + set PgAcVar(mw,$wn,dirtyrec) 0 + set PgAcVar(mw,$wn,id_edited) {} + set PgAcVar(mw,$wn,filter) {} + set PgAcVar(mw,$wn,sortfield) {} + if {! $included} { + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 650x400 + wm maxsize $base 1009 738 + wm minsize $base 650 400 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm deiconify $base + wm title $base [intlmsg "Table"] + } + bind $base "Tables::deleteRecord $wn" + bind $base "Help::load tables" + if {! $included} { + frame $base.f1 -borderwidth 2 -height 75 -relief groove -width 125 + label $base.f1.l1 -borderwidth 0 -text [intlmsg {Sort field}] + entry $base.f1.e1 -background #fefefe -borderwidth 1 -width 14 -highlightthickness 1 -textvariable PgAcVar(mw,$wn,sortfield) + bind $base.f1.e1 "Tables::refreshRecords $wn" + bind $base.f1.e1 "Tables::refreshRecords $wn" + label $base.f1.lb1 -borderwidth 0 -text { } + label $base.f1.l2 -borderwidth 0 -text [intlmsg {Filter conditions}] + entry $base.f1.e2 -background #fefefe -borderwidth 1 -highlightthickness 1 -textvariable PgAcVar(mw,$wn,filter) + bind $base.f1.e2 "Tables::refreshRecords $wn" + bind $base.f1.e2 "Tables::refreshRecords $wn" + button $base.f1.b1 -borderwidth 1 -text [intlmsg Close] -command " + if {\[Tables::insertNewRecord $wn\]} { + $wn.c delete rows + $wn.c delete header + Window destroy $wn + PgAcVar:clean mw,$wn,* + }" + button $base.f1.b2 -borderwidth 1 -text [intlmsg Reload] -command "Tables::refreshRecords $wn" + } + frame $base.frame20 -borderwidth 2 -height 75 -relief groove -width 125 + button $base.frame20.01 -borderwidth 1 -text < -command "Tables::panRight $wn" + label $base.frame20.02 -anchor w -borderwidth 1 -height 1 -relief sunken -text {} -textvariable PgAcVar(mw,$wn,msg) + button $base.frame20.03 -borderwidth 1 -text > -command "Tables::panLeft $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 "Tables::scrollWindow $wn" + bind $base.c "Tables::canvasClick $wn %x %y" + bind $base.c "Tables::canvasPaste $wn %x %y" + bind $base.c "if {[Tables::finishEdit $wn]} \"Tables::insertNewRecord $wn\"" + + # Prevent Tab from moving focus out of canvas widget + bind $base.c break + + if {! $included} { + 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 {renameColumn} {} { +global PgAcVar CurrentDB + if {[string length [string trim $PgAcVar(tblinfo,new_cn)]]==0} { + showError [intlmsg "Field name not entered!"] + return + } + set old_name [string trim [string range $PgAcVar(tblinfo,old_cn) 0 31]] + set PgAcVar(tblinfo,new_cn) [string trim $PgAcVar(tblinfo,new_cn)] + if {$old_name == $PgAcVar(tblinfo,new_cn)} { + showError [intlmsg "New name is the same as the old one!"] + return + } + foreach line [.pgaw:TableInfo.f1.lb get 0 end] { + if {[string trim [string range $line 0 31]]==$PgAcVar(tblinfo,new_cn)} { + showError [format [intlmsg {Column name '%s' already exists in this table!}] $PgAcVar(tblinfo,new_cn)] + return + } + } + if {[sql_exec noquiet "alter table \"$PgAcVar(tblinfo,tablename)\" rename column \"$old_name\" to \"$PgAcVar(tblinfo,new_cn)\""]} { + refreshTableInformation + Window destroy .pgaw:RenameField + } +} + + + +proc {addNewIndex} {} { +global PgAcVar + set iflds [.pgaw:TableInfo.f1.lb curselection] + if {$iflds==""} { + showError [intlmsg "You have to select index fields!"] + return + } + set ifldslist {} + foreach i $iflds {lappend ifldslist "\"[string trim [string range [.pgaw:TableInfo.f1.lb get $i] 0 32]]\""} + set PgAcVar(addindex,indexname) $PgAcVar(tblinfo,tablename)_[join $ifldslist _] + # Replace the quotes with underlines + regsub -all {"} $PgAcVar(addindex,indexname) {_} PgAcVar(addindex,indexname) + # Replace the double underlines + while {[regsub -all {__} $PgAcVar(addindex,indexname) {_} PgAcVar(addindex,indexname)]} {} + # Replace the final underline + regsub -all {_$} $PgAcVar(addindex,indexname) {} PgAcVar(addindex,indexname) + set PgAcVar(addindex,indexfields) [join $ifldslist ,] + Window show .pgaw:AddIndex + wm transient .pgaw:AddIndex .pgaw:TableInfo +} + +proc {deleteIndex} {} { +global PgAcVar + set sel [.pgaw:TableInfo.f2.fl.ilb curselection] + if {$sel == ""} { + showError [intlmsg "You have to select an index!"] + return + } + if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:TableInfo -message [format [intlmsg "You choose to delete index\n\n %s \n\nProceed?"] [.pgaw:TableInfo.f2.fl.ilb get $sel]] -type yesno -default no]=="no"} {return} + if {[sql_exec noquiet "drop index \"[.pgaw:TableInfo.f2.fl.ilb get $sel]\""]} { + refreshTableInformation + } +} + +proc {createNewIndex} {} { +global PgAcVar + if {$PgAcVar(addindex,indexname)==""} { + showError [intlmsg "Index name cannot be null!"] + return + } + setCursor CLOCK + if {[sql_exec noquiet "CREATE $PgAcVar(addindex,unique) INDEX \"$PgAcVar(addindex,indexname)\" on \"$PgAcVar(tblinfo,tablename)\" ($PgAcVar(addindex,indexfields))"]} { + setCursor DEFAULT + Window destroy .pgaw:AddIndex + refreshTableInformation + } + setCursor DEFAULT +} + + +proc {showIndexInformation} {} { +global PgAcVar CurrentDB +set cs [.pgaw:TableInfo.f2.fl.ilb curselection] +if {$cs==""} return +set idxname [.pgaw:TableInfo.f2.fl.ilb get $cs] +wpg_select $CurrentDB "select pg_index.*,pg_class.oid from pg_index,pg_class where pg_class.relname='$idxname' and pg_class.oid=pg_index.indexrelid" rec { + if {$rec(indisunique)=="t"} { + set PgAcVar(tblinfo,isunique) [intlmsg Yes] + } else { + set PgAcVar(tblinfo,isunique) [intlmsg No] + } + if {$rec(indisclustered)=="t"} { + set PgAcVar(tblinfo,isclustered) [intlmsg Yes] + } else { + set PgAcVar(tblinfo,isclustered) [intlmsg No] + } + set PgAcVar(tblinfo,indexfields) {} + .pgaw:TableInfo.f2.fr.lb delete 0 end + foreach field $rec(indkey) { + if {$field!=0} { +# wpg_select $CurrentDB "select attname from pg_attribute where attrelid=$PgAcVar(tblinfo,tableoid) and attnum=$field" rec1 { +# set PgAcVar(tblinfo,indexfields) "$PgAcVar(tblinfo,indexfields) $rec1(attname)" +# } + set PgAcVar(tblinfo,indexfields) "$PgAcVar(tblinfo,indexfields) $PgAcVar(tblinfo,f$field)" + .pgaw:TableInfo.f2.fr.lb insert end $PgAcVar(tblinfo,f$field) + } + + } +} +set PgAcVar(tblinfo,indexfields) [string trim $PgAcVar(tblinfo,indexfields)] +} + + +proc {addNewColumn} {} { +global PgAcVar + if {$PgAcVar(addfield,name)==""} { + showError [intlmsg "Empty field name ?"] + focus .pgaw:AddField.e1 + return + } + if {$PgAcVar(addfield,type)==""} { + showError [intlmsg "No field type ?"] + focus .pgaw:AddField.e2 + return + } + if {![sql_exec quiet "alter table \"$PgAcVar(tblinfo,tablename)\" add column \"$PgAcVar(addfield,name)\" $PgAcVar(addfield,type)"]} { + showError "[intlmsg {Cannot add column}]\n\n$PgAcVar(pgsql,errmsg)" + return + } + Window destroy .pgaw:AddField + sql_exec quiet "update pga_layout set colnames=colnames || ' {$PgAcVar(addfield,name)}', colwidth=colwidth || ' 150',nrcols=nrcols+1 where tablename='$PgAcVar(tblinfo,tablename)'" + refreshTableInformation +} + + +proc {newtable:add_new_field} {} { +global PgAcVar +if {$PgAcVar(nt,fieldname)==""} { + showError [intlmsg "Enter a field name"] + focus .pgaw:NewTable.e2 + return +} +if {$PgAcVar(nt,fldtype)==""} { + showError [intlmsg "The field type is not specified!"] + return +} +if {($PgAcVar(nt,fldtype)=="varchar")&&($PgAcVar(nt,fldsize)=="")} { + focus .pgaw:NewTable.e3 + showError [intlmsg "You must specify field size!"] + return +} +if {$PgAcVar(nt,fldsize)==""} then {set sup ""} else {set sup "($PgAcVar(nt,fldsize))"} +if {[regexp $PgAcVar(nt,fldtype) "varchartextdatetime"]} {set supc "'"} else {set supc ""} +# Don't put the ' arround default value if it contains the now() function +if {([regexp $PgAcVar(nt,fldtype) "datetime"]) && ([regexp now $PgAcVar(nt,defaultval)])} {set supc ""} +# Clear the notnull attribute if field type is serial +if {$PgAcVar(nt,fldtype)=="serial"} {set PgAcVar(nt,notnull) " "} +if {$PgAcVar(nt,defaultval)==""} then {set sup2 ""} else {set sup2 " DEFAULT $supc$PgAcVar(nt,defaultval)$supc"} +# Checking for field name collision +set inspos end +for {set i 0} {$i<[.pgaw:NewTable.lb size]} {incr i} { + set linie [.pgaw:NewTable.lb get $i] + if {$PgAcVar(nt,fieldname)==[string trim [string range $linie 2 33]]} { + if {[tk_messageBox -title [intlmsg Warning] -parent .pgaw:NewTable -message [format [intlmsg "There is another field with the same name: '%s'!\n\nReplace it ?"] $PgAcVar(nt,fieldname)] -type yesno -default yes]=="no"} return + .pgaw:NewTable.lb delete $i + set inspos $i + break + } + } +.pgaw:NewTable.lb insert $inspos [format "%1s %-32.32s %-14s%-16s" $PgAcVar(nt,primarykey) $PgAcVar(nt,fieldname) $PgAcVar(nt,fldtype)$sup $sup2$PgAcVar(nt,notnull)] +focus .pgaw:NewTable.e2 +set PgAcVar(nt,fieldname) {} +set PgAcVar(nt,fldsize) {} +set PgAcVar(nt,defaultval) {} +set PgAcVar(nt,primarykey) " " +} + +proc {newtable:create} {} { +global PgAcVar CurrentDB +if {$PgAcVar(nt,tablename)==""} then { + showError [intlmsg "You must supply a name for your table!"] + focus .pgaw:NewTable.etabn + return +} +if {[.pgaw:NewTable.lb size]==0} then { + showError [intlmsg "Your table has no fields!"] + focus .pgaw:NewTable.e2 + return +} +set fl {} +set pkf {} +foreach line [.pgaw:NewTable.lb get 0 end] { + set fldname "\"[string trim [string range $line 2 33]]\"" + lappend fl "$fldname [string trim [string range $line 35 end]]" + if {[string range $line 0 0]=="*"} { + lappend pkf "$fldname" + } +} +set temp "create table \"$PgAcVar(nt,tablename)\" ([join $fl ,]" +if {$PgAcVar(nt,constraint)!=""} then {set temp "$temp, constraint \"$PgAcVar(nt,constraint)\""} +if {$PgAcVar(nt,check)!=""} then {set temp "$temp check ($PgAcVar(nt,check))"} +if {[llength $pkf]>0} then {set temp "$temp, primary key([join $pkf ,])"} +set temp "$temp)" +if {$PgAcVar(nt,inherits)!=""} then {set temp "$temp inherits ($PgAcVar(nt,inherits))"} +setCursor CLOCK +if {[sql_exec noquiet $temp]} { + Window destroy .pgaw:NewTable + Mainlib::cmd_Tables +} +setCursor DEFAULT +} + +proc {tabSelect} {i} { +global PgAcVar + set base .pgaw:TableInfo + foreach tab {0 1 2 3} { + if {$i == $tab} { + place $base.l$tab -y 13 + place $base.f$tab -x 15 -y 45 + $base.l$tab configure -font $PgAcVar(pref,font_bold) + } else { + place $base.l$tab -y 15 + place $base.f$tab -x 15 -y 500 + $base.l$tab configure -font $PgAcVar(pref,font_normal) + } + } + array set coord [place info $base.l$i] + place $base.lline -x [expr {1+$coord(-x)}] +} + + +} + +#################### END OF NAMESPACE TABLES #################### + +proc vTclWindow.pgaw:NewTable {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:NewTable + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 634x392+78+181 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 0 0 + wm deiconify $base + wm title $base [intlmsg "Create new table"] + bind $base "Help::load new_table" + entry $base.etabn \ + -background #fefefe -borderwidth 1 -selectborderwidth 0 \ + -textvariable PgAcVar(nt,tablename) + bind $base.etabn { + focus .pgaw:NewTable.einh + } + label $base.li \ + -anchor w -borderwidth 0 -text [intlmsg Inherits] + entry $base.einh \ + -background #fefefe -borderwidth 1 -selectborderwidth 0 \ + -textvariable PgAcVar(nt,inherits) + bind $base.einh { + focus .pgaw:NewTable.e2 + } + button $base.binh \ + -borderwidth 1 \ + -command {if {[winfo exists .pgaw:NewTable.ddf]} { + destroy .pgaw:NewTable.ddf +} else { + create_drop_down .pgaw:NewTable 386 23 220 + focus .pgaw:NewTable.ddf.sb + foreach tbl [Database::getTablesList] {.pgaw:NewTable.ddf.lb insert end $tbl} + bind .pgaw:NewTable.ddf.lb { + set i [.pgaw:NewTable.ddf.lb curselection] + if {$i!=""} { + if {$PgAcVar(nt,inherits)==""} { + set PgAcVar(nt,inherits) "\"[.pgaw:NewTable.ddf.lb get $i]\"" + } else { + set PgAcVar(nt,inherits) "$PgAcVar(nt,inherits),\"[.pgaw:NewTable.ddf.lb get $i]\"" + } + } + if {$i!=""} {focus .pgaw:NewTable.e2} + destroy .pgaw:NewTable.ddf + break + } +}} \ + -highlightthickness 0 -takefocus 0 -image dnarw + entry $base.e2 \ + -background #fefefe -borderwidth 1 -selectborderwidth 0 \ + -textvariable PgAcVar(nt,fieldname) + bind $base.e2 { + focus .pgaw:NewTable.e1 + } + entry $base.e1 \ + -background #fefefe -borderwidth 1 -selectborderwidth 0 \ + -textvariable PgAcVar(nt,fldtype) + bind $base.e1 { + focus .pgaw:NewTable.e5 + } + entry $base.e3 \ + -background #fefefe -borderwidth 1 -selectborderwidth 0 \ + -textvariable PgAcVar(nt,fldsize) + bind $base.e3 { + focus .pgaw:NewTable.e5 + } + entry $base.e5 \ + -background #fefefe -borderwidth 1 -selectborderwidth 0 \ + -textvariable PgAcVar(nt,defaultval) + bind $base.e5 { + focus .pgaw:NewTable.cb1 + } + checkbutton $base.cb1 \ + -borderwidth 1 \ + -offvalue { } -onvalue { NOT NULL} -text [intlmsg {field cannot be null}] \ + -variable PgAcVar(nt,notnull) + label $base.lab1 \ + -borderwidth 0 -text [intlmsg type] + label $base.lab2 \ + -borderwidth 0 -anchor w -text [intlmsg {field name}] + label $base.lab3 \ + -borderwidth 0 -text [intlmsg size] + label $base.lab4 \ + -borderwidth 0 -anchor w -text [intlmsg {Default value}] + button $base.addfld \ + -borderwidth 1 -command Tables::newtable:add_new_field \ + -text [intlmsg {Add field}] + button $base.delfld \ + -borderwidth 1 -command {catch {.pgaw:NewTable.lb delete [.pgaw:NewTable.lb curselection]}} \ + -text [intlmsg {Delete field}] + button $base.emptb \ + -borderwidth 1 -command {.pgaw:NewTable.lb delete 0 [.pgaw:NewTable.lb size]} \ + -text [intlmsg {Delete all}] + button $base.maketbl \ + -borderwidth 1 -command Tables::newtable:create \ + -text [intlmsg Create] + listbox $base.lb \ + -background #fefefe -foreground #000000 -borderwidth 1 \ + -selectbackground #c3c3c3 -font $PgAcVar(pref,font_fix) \ + -selectborderwidth 0 -yscrollcommand {.pgaw:NewTable.sb set} + bind $base.lb { + if {[.pgaw:NewTable.lb curselection]!=""} { + set fldname [string trim [lindex [split [.pgaw:NewTable.lb get [.pgaw:NewTable.lb curselection]]] 0]] +} + } + button $base.exitbtn \ + -borderwidth 1 -command {Window destroy .pgaw:NewTable} \ + -text [intlmsg Cancel] + button $base.helpbtn \ + -borderwidth 1 -command {Help::load new_table} \ + -text [intlmsg Help] + label $base.l1 \ + -anchor w -borderwidth 1 \ + -relief raised -text " [intlmsg {field name}]" + label $base.l2 \ + -borderwidth 1 \ + -relief raised -text [intlmsg type] + label $base.l3 \ + -borderwidth 1 \ + -relief raised -text [intlmsg options] + scrollbar $base.sb \ + -borderwidth 1 -command {.pgaw:NewTable.lb yview} -orient vert + label $base.l93 \ + -anchor w -borderwidth 0 -text [intlmsg {Table name}] + button $base.mvup \ + -borderwidth 1 \ + -command {if {[.pgaw:NewTable.lb size]>1} { + set i [.pgaw:NewTable.lb curselection] + if {($i!="")&&($i>0)} { + .pgaw:NewTable.lb insert [expr $i-1] [.pgaw:NewTable.lb get $i] + .pgaw:NewTable.lb delete [expr $i+1] + .pgaw:NewTable.lb selection set [expr $i-1] + } +}} \ + -text [intlmsg {Move up}] + button $base.mvdn \ + -borderwidth 1 \ + -command {if {[.pgaw:NewTable.lb size]>1} { + set i [.pgaw:NewTable.lb curselection] + if {($i!="")&&($i<[expr [.pgaw:NewTable.lb size]-1])} { + .pgaw:NewTable.lb insert [expr $i+2] [.pgaw:NewTable.lb get $i] + .pgaw:NewTable.lb delete $i + .pgaw:NewTable.lb selection set [expr $i+1] + } +}} \ + -text [intlmsg {Move down}] + button $base.button17 \ + -borderwidth 1 \ + -command { +if {[winfo exists .pgaw:NewTable.ddf]} { + destroy .pgaw:NewTable.ddf +} else { + create_drop_down .pgaw:NewTable 291 80 97 + focus .pgaw:NewTable.ddf.sb + .pgaw:NewTable.ddf.lb insert end char varchar text int2 int4 serial float4 float8 money abstime date datetime interval reltime time timespan timestamp boolean box circle line lseg path point polygon + bind .pgaw:NewTable.ddf.lb { + set i [.pgaw:NewTable.ddf.lb curselection] + if {$i!=""} {set PgAcVar(nt,fldtype) [.pgaw:NewTable.ddf.lb get $i]} + destroy .pgaw:NewTable.ddf + if {$i!=""} { + if {[lsearch {char varchar} $PgAcVar(nt,fldtype)]==-1} { + set PgAcVar(nt,fldsize) {} + .pgaw:NewTable.e3 configure -state disabled + focus .pgaw:NewTable.e5 + } else { + .pgaw:NewTable.e3 configure -state normal + focus .pgaw:NewTable.e3 + } + } + break + } +}} \ + -highlightthickness 0 -takefocus 0 -image dnarw + label $base.lco \ + -borderwidth 0 -anchor w -text [intlmsg Constraint] + entry $base.eco \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(nt,constraint) + label $base.lch \ + -borderwidth 0 -text [intlmsg check] + entry $base.ech \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(nt,check) + label $base.ll \ + -borderwidth 1 \ + -relief raised + checkbutton $base.pk \ + -borderwidth 1 \ + -offvalue { } -onvalue * -text [intlmsg {primary key}] -variable PgAcVar(nt,primarykey) + label $base.lpk \ + -borderwidth 1 \ + -relief raised -text K + place $base.etabn \ + -x 105 -y 5 -width 136 -height 20 -anchor nw -bordermode ignore + place $base.li \ + -x 245 -y 7 -height 16 -anchor nw -bordermode ignore + place $base.einh \ + -x 300 -y 5 -width 308 -height 20 -anchor nw -bordermode ignore + place $base.binh \ + -x 590 -y 7 -width 16 -height 16 -anchor nw -bordermode ignore + place $base.e2 \ + -x 105 -y 60 -width 136 -height 20 -anchor nw -bordermode ignore + place $base.e1 \ + -x 291 -y 60 -width 98 -height 20 -anchor nw -bordermode ignore + place $base.e3 \ + -x 470 -y 60 -width 46 -height 20 -anchor nw -bordermode ignore + place $base.e5 \ + -x 105 -y 82 -width 136 -height 20 -anchor nw -bordermode ignore + place $base.cb1 \ + -x 245 -y 83 -height 20 -anchor nw -bordermode ignore + place $base.lab1 \ + -x 247 -y 62 -height 16 -anchor nw -bordermode ignore + place $base.lab2 \ + -x 4 -y 62 -height 16 -anchor nw -bordermode ignore + place $base.lab3 \ + -x 400 -y 62 -height 16 -anchor nw -bordermode ignore + place $base.lab4 \ + -x 5 -y 84 -height 16 -anchor nw -bordermode ignore + place $base.addfld \ + -x 530 -y 58 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.delfld \ + -x 530 -y 190 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.emptb \ + -x 530 -y 220 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.maketbl \ + -x 530 -y 365 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.lb \ + -x 4 -y 121 -width 506 -height 269 -anchor nw -bordermode ignore + place $base.helpbtn \ + -x 530 -y 305 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.exitbtn \ + -x 530 -y 335 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.l1 \ + -x 18 -y 105 -width 195 -height 18 -anchor nw -bordermode ignore + place $base.l2 \ + -x 213 -y 105 -width 88 -height 18 -anchor nw -bordermode ignore + place $base.l3 \ + -x 301 -y 105 -width 225 -height 18 -anchor nw -bordermode ignore + place $base.sb \ + -x 509 -y 121 -width 18 -height 269 -anchor nw -bordermode ignore + place $base.l93 \ + -x 4 -y 7 -height 16 -anchor nw -bordermode ignore + place $base.mvup \ + -x 530 -y 120 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.mvdn \ + -x 530 -y 150 -width 100 -height 26 -anchor nw -bordermode ignore + place $base.button17 \ + -x 371 -y 62 -width 16 -height 16 -anchor nw -bordermode ignore + place $base.lco \ + -x 5 -y 28 -width 58 -height 16 -anchor nw -bordermode ignore + place $base.eco \ + -x 105 -y 27 -width 136 -height 20 -anchor nw -bordermode ignore + place $base.lch \ + -x 245 -y 30 -anchor nw -bordermode ignore + place $base.ech \ + -x 300 -y 27 -width 308 -height 22 -anchor nw -bordermode ignore + place $base.ll \ + -x 5 -y 53 -width 603 -height 2 -anchor nw -bordermode ignore + place $base.pk \ + -x 450 -y 83 -height 20 -anchor nw -bordermode ignore + place $base.lpk \ + -x 4 -y 105 -width 14 -height 18 -anchor nw -bordermode ignore +} + + +proc vTclWindow.pgaw:TableInfo {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:TableInfo + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel \ + -background #c7c3c7 + wm focusmodel $base passive + wm geometry $base 522x398+152+135 + 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 [intlmsg "Table information"] + bind $base "Help::load view_table_structure" + label $base.l0 \ + -borderwidth 1 -font $PgAcVar(pref,font_bold) \ + -relief raised -text [intlmsg General] + bind $base.l0 { + Tables::tabSelect 0 + } + label $base.l1 \ + -borderwidth 1 \ + -relief raised -text [intlmsg Columns] + bind $base.l1 { + Tables::tabSelect 1 + } + label $base.l2 \ + -borderwidth 1 \ + -relief raised -text [intlmsg Indexes] + bind $base.l2 { + Tables::tabSelect 2 + } + label $base.l3 \ + -borderwidth 1 \ + -relief raised -text [intlmsg Permissions] + bind $base.l3 { + Tables::tabSelect 3 + } + label $base.l \ + -relief raised + button $base.btnclose \ + -borderwidth 1 -command {Window destroy .pgaw:TableInfo} \ + -highlightthickness 0 -padx 9 -pady 3 -text [intlmsg Close] + frame $base.f1 \ + -borderwidth 2 -height 75 -relief groove -width 125 + frame $base.f1.ft \ + -height 75 -relief groove -width 125 + label $base.f1.ft.t1 \ + -relief groove -text [intlmsg {field name}] + label $base.f1.ft.t2 \ + -relief groove -text [intlmsg type] -width 12 + label $base.f1.ft.t3 \ + -relief groove -text [intlmsg size] -width 6 + label $base.f1.ft.lnn \ + -relief groove -text [intlmsg {not null}] -width 18 + label $base.f1.ft.ls \ + -borderwidth 0 \ + -relief raised -text { } + frame $base.f1.fb \ + -height 75 -relief groove -width 125 + button $base.f1.fb.addcolbtn \ + -borderwidth 1 \ + -command {Window show .pgaw:AddField + set PgAcVar(addfield,name) {} + set PgAcVar(addfield,type) {} + wm transient .pgaw:AddField .pgaw:TableInfo + focus .pgaw:AddField.e1} \ + -padx 9 -pady 3 -text [intlmsg {Add new column}] + button $base.f1.fb.rencolbtn \ + -borderwidth 1 \ + -command { +if {[set PgAcVar(tblinfo,col_id) [.pgaw:TableInfo.f1.lb curselection]]==""} then { + bell +} else { + set PgAcVar(tblinfo,old_cn) [.pgaw:TableInfo.f1.lb get [.pgaw:TableInfo.f1.lb curselection]] + set PgAcVar(tblinfo,new_cn) {} + Window show .pgaw:RenameField + tkwait visibility .pgaw:RenameField + wm transient .pgaw:RenameField .pgaw:TableInfo + focus .pgaw:RenameField.e1 +} +} \ + -padx 9 -pady 3 -text [intlmsg {Rename column}] + button $base.f1.fb.addidxbtn \ + -borderwidth 1 -command Tables::addNewIndex \ + -padx 9 \ + -pady 3 -text [intlmsg {Add new index}] + listbox $base.f1.lb \ + -background #fefefe -borderwidth 1 -font $PgAcVar(pref,font_fix) \ + -highlightthickness 0 -selectborderwidth 0 \ + -selectmode extended \ + -yscrollcommand {.pgaw:TableInfo.f1.vsb set} + scrollbar $base.f1.vsb \ + -borderwidth 1 -command {.pgaw:TableInfo.f1.lb yview} -orient vert -width 14 + frame $base.f2 \ + -borderwidth 2 -height 75 -relief groove -width 125 + frame $base.f2.fl \ + -height 75 -relief groove -width 182 + label $base.f2.fl.t \ + -relief groove -text [intlmsg {Indexes defined}] + button $base.f2.fl.delidxbtn \ + -borderwidth 1 -command Tables::deleteIndex \ + -padx 9 \ + -pady 3 -text [intlmsg {Delete index}] + listbox $base.f2.fl.ilb \ + -background #fefefe -borderwidth 1 \ + -highlightthickness 0 -selectborderwidth 0 -width 37 \ + -yscrollcommand {.pgaw:TableInfo.f2.fl.vsb set} + bind $base.f2.fl.ilb { + Tables::showIndexInformation + } + scrollbar $base.f2.fl.vsb \ + -borderwidth 1 -command {.pgaw:TableInfo.f2.fl.ilb yview} -orient vert -width 14 + frame $base.f2.fr \ + -height 75 -relief groove -width 526 + label $base.f2.fr.t \ + -relief groove -text [intlmsg {index properties}] + button $base.f2.fr.clusterbtn \ + -borderwidth 1 -command Tables::clusterIndex \ + -padx 9 -pady 3 -text [intlmsg {Cluster index}] + frame $base.f2.fr.fp \ + -borderwidth 2 -height 75 -relief groove -width 125 + label $base.f2.fr.fp.lu \ + -anchor w -borderwidth 0 \ + -relief raised -text [intlmsg {Is unique ?}] + label $base.f2.fr.fp.vu \ + -borderwidth 0 -textvariable PgAcVar(tblinfo,isunique) \ + -foreground #000096 -relief raised -text {} + label $base.f2.fr.fp.lc \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Is clustered ?}] + label $base.f2.fr.fp.vc -textvariable PgAcVar(tblinfo,isclustered) \ + -borderwidth 0 \ + -foreground #000096 -relief raised -text {} + label $base.f2.fr.lic \ + -relief groove -text [intlmsg {index columns}] + listbox $base.f2.fr.lb \ + -background #fefefe -borderwidth 1 \ + -highlightthickness 0 -selectborderwidth 0 \ + -yscrollcommand {.pgaw:TableInfo.f2.fr.vsb set} + scrollbar $base.f2.fr.vsb \ + -borderwidth 1 -command {.pgaw:TableInfo.f2.fr.lb yview} -orient vert -width 14 + frame $base.f3 \ + -borderwidth 2 -height 75 -relief groove -width 125 + frame $base.f3.ft \ + -height 75 -relief groove -width 125 + label $base.f3.ft.luser \ + -relief groove -text [intlmsg {User name}] + label $base.f3.ft.lselect \ + -relief groove -text [intlmsg select] -width 10 + label $base.f3.ft.lupdate \ + -relief groove -text [intlmsg update] -width 10 + label $base.f3.ft.linsert \ + -relief groove -text [intlmsg insert] -width 10 + label $base.f3.ft.lrule \ + -relief groove -text [intlmsg rule] -width 10 + label $base.f3.ft.ls \ + -borderwidth 0 \ + -relief raised -text { } + frame $base.f3.fb \ + -height 75 -relief groove -width 125 + button $base.f3.fb.adduserbtn \ + -borderwidth 1 -command Tables::newPermissions \ + -padx 9 -pady 3 -text [intlmsg {Add user}] + button $base.f3.fb.chguserbtn -command Tables::loadPermissions \ + -borderwidth 1 -padx 9 -pady 3 -text [intlmsg {Change permissions}] + listbox $base.f3.plb \ + -background #fefefe -borderwidth 1 -font $PgAcVar(pref,font_fix) \ + -highlightthickness 0 -selectborderwidth 0 \ + -yscrollcommand {.pgaw:TableInfo.f3.vsb set} + bind $base.f3.plb Tables::loadPermissions + scrollbar $base.f3.vsb \ + -borderwidth 1 -command {.pgaw:TableInfo.f3.plb yview} -orient vert -width 14 + label $base.lline \ + -borderwidth 0 \ + -relief raised -text { } + frame $base.f0 \ + -borderwidth 2 -height 75 -relief groove -width 125 + frame $base.f0.fi \ + -borderwidth 2 -height 75 -relief groove -width 125 + label $base.f0.fi.l1 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Table name}] + label $base.f0.fi.l2 \ + -anchor w -borderwidth 1 \ + -relief sunken -text {} -textvariable PgAcVar(tblinfo,tablename) \ + -width 200 + label $base.f0.fi.l3 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Table OID}] + label $base.f0.fi.l4 \ + -anchor w -borderwidth 1 \ + -relief sunken -text {} -textvariable PgAcVar(tblinfo,tableoid) \ + -width 200 + label $base.f0.fi.l5 \ + -borderwidth 0 \ + -relief raised -text [intlmsg Owner] + label $base.f0.fi.l6 \ + -anchor w -borderwidth 1 \ + -relief sunken -text {} -textvariable PgAcVar(tblinfo,owner) \ + -width 200 + label $base.f0.fi.l7 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Owner ID}] + label $base.f0.fi.l8 \ + -anchor w -borderwidth 1 \ + -relief sunken -text {} -textvariable PgAcVar(tblinfo,ownerid) \ + -width 200 + label $base.f0.fi.l9 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Has primary key ?}] + label $base.f0.fi.l10 \ + -anchor w -borderwidth 1 \ + -relief sunken -text {} \ + -textvariable PgAcVar(tblinfo,hasprimarykey) -width 200 + label $base.f0.fi.l11 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Has rules ?}] + label $base.f0.fi.l12 \ + -anchor w -borderwidth 1 \ + -relief sunken -text {} -textvariable PgAcVar(tblinfo,hasrules) \ + -width 200 + label $base.f0.fi.last \ + -borderwidth 0 \ + -relief raised -text { } + frame $base.f0.fs \ + -borderwidth 2 -height 75 -relief groove -width 125 + label $base.f0.fs.l1 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Number of tuples}] + label $base.f0.fs.l2 \ + -anchor e -borderwidth 1 \ + -relief sunken -text 0 -textvariable PgAcVar(tblinfo,numtuples) \ + -width 200 + label $base.f0.fs.l3 \ + -borderwidth 0 \ + -relief raised -text [intlmsg {Number of pages}] + label $base.f0.fs.l4 \ + -anchor e -borderwidth 1 \ + -relief sunken -text 0 -textvariable PgAcVar(tblinfo,numpages) \ + -width 200 + label $base.f0.fs.last \ + -borderwidth 0 \ + -relief raised -text { } + label $base.f0.lstat \ + -borderwidth 0 -font $PgAcVar(pref,font_bold) -relief raised \ + -text " [intlmsg Statistics] " + label $base.f0.lid \ + -borderwidth 0 -font $PgAcVar(pref,font_bold) -relief raised \ + -text " [intlmsg Identification] " + place $base.l0 \ + -x 15 -y 13 -width 96 -height 23 -anchor nw -bordermode ignore + place $base.l1 \ + -x 111 -y 15 -width 96 -height 23 -anchor nw -bordermode ignore + place $base.l2 \ + -x 207 -y 15 -width 96 -height 23 -anchor nw -bordermode ignore + place $base.l3 \ + -x 303 -y 15 -width 96 -height 23 -anchor nw -bordermode ignore + place $base.l \ + -x 5 -y 35 -width 511 -height 357 -anchor nw -bordermode ignore + place $base.btnclose \ + -x 425 -y 5 -width 91 -height 26 -anchor nw -bordermode ignore + place $base.f1 \ + -x 15 -y 500 -width 490 -height 335 -anchor nw -bordermode ignore + pack $base.f1.ft \ + -in .pgaw:TableInfo.f1 -anchor center -expand 0 -fill x -side top + pack $base.f1.ft.t1 \ + -in .pgaw:TableInfo.f1.ft -anchor center -expand 1 -fill x -side left + pack $base.f1.ft.t2 \ + -in .pgaw:TableInfo.f1.ft -anchor center -expand 0 -fill none -side left + pack $base.f1.ft.t3 \ + -in .pgaw:TableInfo.f1.ft -anchor center -expand 0 -fill none -side left + pack $base.f1.ft.lnn \ + -in .pgaw:TableInfo.f1.ft -anchor center -expand 0 -fill none -side left + pack $base.f1.ft.ls \ + -in .pgaw:TableInfo.f1.ft -anchor center -expand 0 -fill none -side top + pack $base.f1.fb \ + -in .pgaw:TableInfo.f1 -anchor center -expand 0 -fill x -side bottom + grid $base.f1.fb.addcolbtn \ + -in .pgaw:TableInfo.f1.fb -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f1.fb.rencolbtn \ + -in .pgaw:TableInfo.f1.fb -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.f1.fb.addidxbtn \ + -in .pgaw:TableInfo.f1.fb -column 2 -row 0 -columnspan 1 -rowspan 1 + pack $base.f1.lb \ + -in .pgaw:TableInfo.f1 -anchor center -expand 1 -fill both -pady 1 -side left + pack $base.f1.vsb \ + -in .pgaw:TableInfo.f1 -anchor center -expand 0 -fill y -side right + place $base.f2 \ + -x 15 -y 500 -width 490 -height 335 -anchor nw -bordermode ignore + pack $base.f2.fl \ + -in .pgaw:TableInfo.f2 -anchor center -expand 0 -fill both -side left + pack $base.f2.fl.t \ + -in .pgaw:TableInfo.f2.fl -anchor center -expand 0 -fill x -pady 1 -side top + pack $base.f2.fl.delidxbtn \ + -in .pgaw:TableInfo.f2.fl -anchor center -expand 0 -fill none -side bottom + pack $base.f2.fl.ilb \ + -in .pgaw:TableInfo.f2.fl -anchor center -expand 1 -fill both -pady 1 -side left + pack $base.f2.fl.vsb \ + -in .pgaw:TableInfo.f2.fl -anchor center -expand 0 -fill y -side right + pack $base.f2.fr \ + -in .pgaw:TableInfo.f2 -anchor center -expand 1 -fill both -padx 1 -side right + pack $base.f2.fr.t \ + -in .pgaw:TableInfo.f2.fr -anchor center -expand 0 -fill x -pady 1 -side top + pack $base.f2.fr.clusterbtn \ + -in .pgaw:TableInfo.f2.fr -anchor center -expand 0 -fill none -side bottom + pack $base.f2.fr.fp \ + -in .pgaw:TableInfo.f2.fr -anchor center -expand 0 -fill x -pady 1 -side top + grid $base.f2.fr.fp.lu \ + -in .pgaw:TableInfo.f2.fr.fp -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.f2.fr.fp.vu \ + -in .pgaw:TableInfo.f2.fr.fp -column 1 -row 0 -columnspan 1 -rowspan 1 -padx 5 \ + -sticky w + grid $base.f2.fr.fp.lc \ + -in .pgaw:TableInfo.f2.fr.fp -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.f2.fr.fp.vc \ + -in .pgaw:TableInfo.f2.fr.fp -column 1 -row 2 -columnspan 1 -rowspan 1 -padx 5 \ + -sticky w + pack $base.f2.fr.lic \ + -in .pgaw:TableInfo.f2.fr -anchor center -expand 0 -fill x -side top + pack $base.f2.fr.lb \ + -in .pgaw:TableInfo.f2.fr -anchor center -expand 1 -fill both -pady 1 -side left + pack $base.f2.fr.vsb \ + -in .pgaw:TableInfo.f2.fr -anchor center -expand 0 -fill y -side right + place $base.f3 \ + -x 15 -y 500 -width 490 -height 335 -anchor nw -bordermode ignore + pack $base.f3.ft \ + -in .pgaw:TableInfo.f3 -anchor center -expand 0 -fill x -pady 1 -side top + pack $base.f3.ft.luser \ + -in .pgaw:TableInfo.f3.ft -anchor center -expand 1 -fill x -side left + pack $base.f3.ft.lselect \ + -in .pgaw:TableInfo.f3.ft -anchor center -expand 0 -fill none -side left + pack $base.f3.ft.lupdate \ + -in .pgaw:TableInfo.f3.ft -anchor center -expand 0 -fill none -side left + pack $base.f3.ft.linsert \ + -in .pgaw:TableInfo.f3.ft -anchor center -expand 0 -fill none -side left + pack $base.f3.ft.lrule \ + -in .pgaw:TableInfo.f3.ft -anchor center -expand 0 -fill none -side left + pack $base.f3.ft.ls \ + -in .pgaw:TableInfo.f3.ft -anchor center -expand 0 -fill none -side top + pack $base.f3.fb \ + -in .pgaw:TableInfo.f3 -anchor center -expand 0 -fill x -side bottom + grid $base.f3.fb.adduserbtn \ + -in .pgaw:TableInfo.f3.fb -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f3.fb.chguserbtn \ + -in .pgaw:TableInfo.f3.fb -column 1 -row 0 -columnspan 1 -rowspan 1 + pack $base.f3.plb \ + -in .pgaw:TableInfo.f3 -anchor center -expand 1 -fill both -pady 1 -side left + pack $base.f3.vsb \ + -in .pgaw:TableInfo.f3 -anchor center -expand 0 -fill y -side right + place $base.lline \ + -x 16 -y 32 -width 94 -height 6 -anchor nw -bordermode ignore + place $base.f0 \ + -x 15 -y 45 -width 490 -height 335 -anchor nw -bordermode ignore + place $base.f0.fi \ + -x 5 -y 15 -width 300 -height 140 -anchor nw -bordermode ignore + grid columnconf $base.f0.fi 1 -weight 1 + grid rowconf $base.f0.fi 6 -weight 1 + grid $base.f0.fi.l1 \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fi.l2 \ + -in .pgaw:TableInfo.f0.fi -column 1 -row 0 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 + grid $base.f0.fi.l3 \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fi.l4 \ + -in .pgaw:TableInfo.f0.fi -column 1 -row 1 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 + grid $base.f0.fi.l5 \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fi.l6 \ + -in .pgaw:TableInfo.f0.fi -column 1 -row 2 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 + grid $base.f0.fi.l7 \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 3 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fi.l8 \ + -in .pgaw:TableInfo.f0.fi -column 1 -row 3 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 + grid $base.f0.fi.l9 \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 4 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fi.l10 \ + -in .pgaw:TableInfo.f0.fi -column 1 -row 4 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 + grid $base.f0.fi.l11 \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 5 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fi.l12 \ + -in .pgaw:TableInfo.f0.fi -column 1 -row 5 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 + grid $base.f0.fi.last \ + -in .pgaw:TableInfo.f0.fi -column 0 -row 6 -columnspan 1 -rowspan 1 + place $base.f0.fs \ + -x 310 -y 15 -width 175 -height 50 -anchor nw -bordermode ignore + grid columnconf $base.f0.fs 1 -weight 1 + grid rowconf $base.f0.fs 2 -weight 1 + grid $base.f0.fs.l1 \ + -in .pgaw:TableInfo.f0.fs -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fs.l2 \ + -in .pgaw:TableInfo.f0.fs -column 1 -row 0 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 -sticky w + grid $base.f0.fs.l3 \ + -in .pgaw:TableInfo.f0.fs -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky w + grid $base.f0.fs.l4 \ + -in .pgaw:TableInfo.f0.fs -column 1 -row 1 -columnspan 1 -rowspan 1 -padx 2 \ + -pady 2 -sticky w + grid $base.f0.fs.last \ + -in .pgaw:TableInfo.f0.fs -column 0 -row 2 -columnspan 1 -rowspan 1 + place $base.f0.lstat \ + -x 315 -y 5 -height 18 -anchor nw -bordermode ignore + place $base.f0.lid \ + -x 10 -y 5 -height 16 -anchor nw -bordermode ignore +} + + +proc vTclWindow.pgaw:AddIndex {base} { + if {$base == ""} { + set base .pgaw:AddIndex + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 334x203+265+266 + 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 [intlmsg "Add new index"] + frame $base.f \ + -borderwidth 2 -height 75 -relief groove -width 125 + frame $base.f.fin \ + -height 75 -relief groove -width 125 + label $base.f.fin.lin \ + -borderwidth 0 -relief raised -text [intlmsg {Index name}] + entry $base.f.fin.ein \ + -background #fefefe -borderwidth 1 -width 28 -textvariable PgAcVar(addindex,indexname) + checkbutton $base.f.cbunique -borderwidth 1 \ + -offvalue { } -onvalue unique -text [intlmsg {Is unique ?}] -variable PgAcVar(addindex,unique) + label $base.f.ls1 \ + -anchor w -background #dfdbdf -borderwidth 0 -foreground #000086 \ + -justify left -relief raised -textvariable PgAcVar(addindex,indexfields) \ + -wraplength 300 + label $base.f.lif \ + -borderwidth 0 -relief raised -text "[intlmsg {Index fields}]:" + label $base.f.ls2 \ + -borderwidth 0 -relief raised -text { } + label $base.f.ls3 \ + -borderwidth 0 -relief raised -text { } + frame $base.fb \ + -height 75 -relief groove -width 125 + button $base.fb.btncreate -command Tables::createNewIndex \ + -padx 9 -pady 3 -text [intlmsg Create] + button $base.fb.btncancel \ + -command {Window destroy .pgaw:AddIndex} -padx 9 -pady 3 -text [intlmsg Cancel] + pack $base.f \ + -in .pgaw:AddIndex -anchor center -expand 1 -fill both -side top + grid $base.f.fin \ + -in .pgaw:AddIndex.f -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f.fin.lin \ + -in .pgaw:AddIndex.f.fin -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f.fin.ein \ + -in .pgaw:AddIndex.f.fin -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.f.cbunique \ + -in .pgaw:AddIndex.f -column 0 -row 5 -columnspan 1 -rowspan 1 + grid $base.f.ls1 \ + -in .pgaw:AddIndex.f -column 0 -row 3 -columnspan 1 -rowspan 1 + grid $base.f.lif \ + -in .pgaw:AddIndex.f -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.f.ls2 \ + -in .pgaw:AddIndex.f -column 0 -row 1 -columnspan 1 -rowspan 1 + grid $base.f.ls3 \ + -in .pgaw:AddIndex.f -column 0 -row 4 -columnspan 1 -rowspan 1 + pack $base.fb \ + -in .pgaw:AddIndex -anchor center -expand 0 -fill x -side bottom + grid $base.fb.btncreate \ + -in .pgaw:AddIndex.fb -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.fb.btncancel \ + -in .pgaw:AddIndex.fb -column 1 -row 0 -columnspan 1 -rowspan 1 +} + + +proc vTclWindow.pgaw:AddField {base} { + if {$base == ""} { + set base .pgaw:AddField + } + 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 [intlmsg "Add new column"] + label $base.l1 \ + -borderwidth 0 -text [intlmsg {Field name}] + entry $base.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(addfield,name) + bind $base.e1 { + focus .pgaw:AddField.e2 + } + bind $base.e1 { + focus .pgaw:AddField.e2 + } + label $base.l2 \ + -borderwidth 0 \ + -text [intlmsg {Field type}] + entry $base.e2 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(addfield,type) + bind $base.e2 { + Tables::addNewColumn + } + bind $base.e2 { + Tables::addNewColumn + } + button $base.b1 \ + -borderwidth 1 -command Tables::addNewColumn -text [intlmsg {Add field}] + button $base.b2 \ + -borderwidth 1 -command {Window destroy .pgaw:AddField} -text [intlmsg 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.pgaw:RenameField {base} { + if {$base == ""} { + set base .pgaw:RenameField + } + 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 [intlmsg "Rename column"] + label $base.l1 \ + -borderwidth 0 -text [intlmsg {New name}] + entry $base.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(tblinfo,new_cn) + bind $base.e1 "Tables::renameColumn" + bind $base.e1 "Tables::renameColumn" + frame $base.f \ + -height 75 -relief groove -width 147 + button $base.f.b1 \ + -borderwidth 1 -command Tables::renameColumn -text [intlmsg Rename] + button $base.f.b2 \ + -borderwidth 1 -command {Window destroy .pgaw:RenameField} -text [intlmsg Cancel] + label $base.l2 -borderwidth 0 + grid $base.l1 \ + -in .pgaw:RenameField -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.e1 \ + -in .pgaw:RenameField -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.f \ + -in .pgaw:RenameField -column 0 -row 4 -columnspan 2 -rowspan 1 + grid $base.f.b1 \ + -in .pgaw:RenameField.f -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f.b2 \ + -in .pgaw:RenameField.f -column 1 -row 0 -columnspan 1 -rowspan 1 + grid $base.l2 \ + -in .pgaw:RenameField -column 0 -row 3 -columnspan 1 -rowspan 1 +} + +proc vTclWindow.pgaw:Permissions {base} { + if {$base == ""} { + set base .pgaw:Permissions + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 273x147+256+266 + 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 [intlmsg "Permissions"] + frame $base.f1 \ + -height 103 -relief groove -width 125 + label $base.f1.l \ + -borderwidth 0 -relief raised -text [intlmsg {User name}] + entry $base.f1.ename -textvariable PgAcVar(permission,username) \ + -background #fefefe -borderwidth 1 + label $base.f1.l2 \ + -borderwidth 0 -relief raised -text { } + label $base.f1.l3 \ + -borderwidth 0 -relief raised -text { } + frame $base.f2 \ + -height 75 -relief groove -borderwidth 2 -width 125 + checkbutton $base.f2.cb1 -borderwidth 1 -padx 4 -pady 4 \ + -text [intlmsg select] -variable PgAcVar(permission,select) + checkbutton $base.f2.cb2 -borderwidth 1 -padx 4 -pady 4 \ + -text [intlmsg update] -variable PgAcVar(permission,update) + checkbutton $base.f2.cb3 -borderwidth 1 -padx 4 -pady 4 \ + -text [intlmsg insert] -variable PgAcVar(permission,insert) + checkbutton $base.f2.cb4 -borderwidth 1 -padx 4 -pady 4 \ + -text [intlmsg rule] -variable PgAcVar(permission,rule) + frame $base.fb \ + -height 75 -relief groove -width 125 + button $base.fb.btnsave -command Tables::savePermissions \ + -padx 9 -pady 3 -text [intlmsg Save] + button $base.fb.btncancel -command {Window destroy .pgaw:Permissions} \ + -padx 9 -pady 3 -text [intlmsg Cancel] + pack $base.f1 \ + -in .pgaw:Permissions -anchor center -expand 0 -fill none -side top + grid $base.f1.l \ + -in .pgaw:Permissions.f1 -column 0 -row 1 -columnspan 1 -rowspan 1 + grid $base.f1.ename \ + -in .pgaw:Permissions.f1 -column 1 -row 1 -columnspan 1 -rowspan 1 -padx 2 + grid $base.f1.l2 \ + -in .pgaw:Permissions.f1 -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.f1.l3 \ + -in .pgaw:Permissions.f1 -column 0 -row 2 -columnspan 1 -rowspan 1 + pack $base.f2 \ + -in .pgaw:Permissions -anchor center -expand 0 -fill none -side top + grid $base.f2.cb1 \ + -in .pgaw:Permissions.f2 -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky w + grid $base.f2.cb2 \ + -in .pgaw:Permissions.f2 -column 1 -row 1 -columnspan 1 -rowspan 1 -sticky w + grid $base.f2.cb3 \ + -in .pgaw:Permissions.f2 -column 0 -row 2 -columnspan 1 -rowspan 1 -sticky w + grid $base.f2.cb4 \ + -in .pgaw:Permissions.f2 -column 1 -row 2 -columnspan 1 -rowspan 1 -sticky w + pack $base.fb \ + -in .pgaw:Permissions -anchor center -expand 0 -fill none -pady 3 -side bottom + grid $base.fb.btnsave \ + -in .pgaw:Permissions.fb -column 0 -row 0 -columnspan 1 -rowspan 1 + grid $base.fb.btncancel \ + -in .pgaw:Permissions.fb -column 1 -row 0 -columnspan 1 -rowspan 1 +} diff --git a/src/bin/pgaccess/lib/users.tcl b/src/bin/pgaccess/lib/users.tcl new file mode 100644 index 00000000000..18204e0f722 --- /dev/null +++ b/src/bin/pgaccess/lib/users.tcl @@ -0,0 +1,155 @@ +namespace eval Users { + +proc {new} {} { +global PgAcVar + Window show .pgaw:User + wm transient .pgaw:User .pgaw:Main + set PgAcVar(user,action) "CREATE" + set PgAcVar(user,name) {} + set PgAcVar(user,password) {} + set PgAcVar(user,createdb) NOCREATEDB + set PgAcVar(user,createuser) NOCREATEUSER + set PgAcVar(user,verifypassword) {} + set PgAcVar(user,validuntil) {} + focus .pgaw:User.e1 +} + +proc {design} {username} { +global PgAcVar CurrentDB + Window show .pgaw:User + tkwait visibility .pgaw:User + wm transient .pgaw:User .pgaw:Main + wm title .pgaw:User [intlmsg "Change user"] + set PgAcVar(user,action) "ALTER" + set PgAcVar(user,name) $username + set PgAcVar(user,password) {} ; set PgAcVar(user,verifypassword) {} + pg_select $CurrentDB "select *,date(valuntil) as valdata from pg_user where usename='$username'" tup { + if {$tup(usesuper)=="t"} { + set PgAcVar(user,createuser) CREATEUSER + } else { + set PgAcVar(user,createuser) NOCREATEUSER + } + if {$tup(usecreatedb)=="t"} { + set PgAcVar(user,createdb) CREATEDB + } else { + set PgAcVar(user,createdb) NOCREATEDB + } + if {$tup(valuntil)!=""} { + set PgAcVar(user,validuntil) $tup(valdata) + } else { + set PgAcVar(user,validuntil) {} + } + } + .pgaw:User.e1 configure -state disabled + .pgaw:User.b1 configure -text [intlmsg Save] + focus .pgaw:User.e2 +} + +proc {save} {} { +global PgAcVar CurrentDB + set PgAcVar(user,name) [string trim $PgAcVar(user,name)] + set PgAcVar(user,password) [string trim $PgAcVar(user,password)] + set PgAcVar(user,verifypassword) [string trim $PgAcVar(user,verifypassword)] + if {$PgAcVar(user,name)==""} { + showError [intlmsg "User without name?"] + focus .pgaw:User.e1 + return + } + if {$PgAcVar(user,password)!=$PgAcVar(user,verifypassword)} { + showError [intlmsg "Passwords do not match!"] + set PgAcVar(user,password) {} ; set PgAcVar(user,verifypassword) {} + focus .pgaw:User.e2 + return + } + set cmd "$PgAcVar(user,action) user \"$PgAcVar(user,name)\"" + if {$PgAcVar(user,password)!=""} { + set cmd "$cmd WITH PASSWORD \"$PgAcVar(user,password)\" " + } + set cmd "$cmd $PgAcVar(user,createdb) $PgAcVar(user,createuser)" + if {$PgAcVar(user,validuntil)!=""} { + set cmd "$cmd VALID UNTIL '$PgAcVar(user,validuntil)'" + } + if {[sql_exec noquiet $cmd]} { + Window destroy .pgaw:User + Mainlib::cmd_Users + } +} + +} + +proc vTclWindow.pgaw:User {base} { + if {$base == ""} { + set base .pgaw:User + } + 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 [intlmsg "Define new user"] + label $base.l1 \ + -borderwidth 0 -anchor w -text [intlmsg "User name"] + entry $base.e1 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(user,name) + bind $base.e1 "focus .pgaw:User.e2" + bind $base.e1 "focus .pgaw:User.e2" + label $base.l2 \ + -borderwidth 0 -text [intlmsg Password] + entry $base.e2 \ + -background #fefefe -borderwidth 1 -show * -textvariable PgAcVar(user,password) + bind $base.e2 "focus .pgaw:User.e3" + bind $base.e2 "focus .pgaw:User.e3" + label $base.l3 \ + -borderwidth 0 -text [intlmsg {verify password}] + entry $base.e3 \ + -background #fefefe -borderwidth 1 -show * -textvariable PgAcVar(user,verifypassword) + bind $base.e3 "focus .pgaw:User.cb1" + bind $base.e3 "focus .pgaw:User.cb1" + checkbutton $base.cb1 \ + -borderwidth 1 -offvalue NOCREATEDB -onvalue CREATEDB \ + -text [intlmsg {Allow user to create databases}] -variable PgAcVar(user,createdb) + checkbutton $base.cb2 \ + -borderwidth 1 -offvalue NOCREATEUSER -onvalue CREATEUSER \ + -text [intlmsg {Allow user to create other users}] -variable PgAcVar(user,createuser) + label $base.l4 \ + -borderwidth 0 -anchor w -text [intlmsg {Valid until (date)}] + entry $base.e4 \ + -background #fefefe -borderwidth 1 -textvariable PgAcVar(user,validuntil) + bind $base.e4 "focus .pgaw:User.b1" + bind $base.e4 "focus .pgaw:User.b1" + button $base.b1 \ + -borderwidth 1 -command Users::save -text [intlmsg Create] + button $base.b2 \ + -borderwidth 1 -command {Window destroy .pgaw:User} -text [intlmsg Cancel] + place $base.l1 \ + -x 5 -y 7 -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 -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 +} + diff --git a/src/bin/pgaccess/lib/views.tcl b/src/bin/pgaccess/lib/views.tcl new file mode 100644 index 00000000000..dc520a5b746 --- /dev/null +++ b/src/bin/pgaccess/lib/views.tcl @@ -0,0 +1,45 @@ +namespace eval Views { + +proc {new} {} { +global PgAcVar + set PgAcVar(query,oid) 0 + set PgAcVar(query,name) {} + Window show .pgaw:QueryBuilder + set PgAcVar(query,asview) 1 + .pgaw:QueryBuilder.saveAsView configure -state disabled +} + + +proc {open} {viewname} { +global PgAcVar + if {$viewname==""} return; + set wn [Tables::getNewWindowName] + Tables::createWindow + set PgAcVar(mw,$wn,query) "select * from \"$viewname\"" + set PgAcVar(mw,$wn,isaquery) 0 + set PgAcVar(mw,$wn,updatable) 0 + Tables::loadLayout $wn $viewname + Tables::selectRecords $wn $PgAcVar(mw,$wn,query) +} + + +proc {design} {viewname} { +global PgAcVar CurrentDB + set vd {} + wpg_select $CurrentDB "select pg_get_viewdef('$viewname')as vd" tup { + set vd $tup(vd) + } + if {$vd==""} { + showError "[intlmsg {Error retrieving view definition for}] '$viewname'!" + return + } + Window show .pgaw:QueryBuilder + .pgaw:QueryBuilder.text1 delete 0.0 end + .pgaw:QueryBuilder.text1 insert end $vd + set PgAcVar(query,asview) 1 + .pgaw:QueryBuilder.saveAsView configure -state disabled + set PgAcVar(query,name) $viewname +} + + +} diff --git a/src/bin/pgaccess/lib/visualqb.tcl b/src/bin/pgaccess/lib/visualqb.tcl new file mode 100644 index 00000000000..dc4189efc95 --- /dev/null +++ b/src/bin/pgaccess/lib/visualqb.tcl @@ -0,0 +1,776 @@ +namespace eval VisualQueryBuilder { + +# The following array will hold all the local variables + +variable vqb + +proc {addNewTable} {{tabx 0} {taby 0} {alias -1}} { +global PgAcVar CurrentDB +variable vqb +if {$vqb(newtablename)==""} return +set fldlist {} +setCursor CLOCK +wpg_select $CurrentDB "select attnum,attname from pg_class,pg_attribute where (pg_class.relname='$vqb(newtablename)') and (pg_class.oid=pg_attribute.attrelid) and (attnum>0) order by attnum" rec { + lappend fldlist $rec(attname) +} +setCursor DEFAULT +if {$fldlist==""} { + showError [format [intlmsg "Table '%s' not found!"] $vqb(newtablename)] + return +} +if {$alias==-1} { + set tabnum $vqb(ntables) +} else { + regsub t $alias "" tabnum +} +set vqb(tablename$tabnum) $vqb(newtablename) +set vqb(tablestruct$tabnum) $fldlist +set vqb(tablealias$tabnum) "t$tabnum" +set vqb(ali_t$tabnum) $vqb(newtablename) +set vqb(tablex$tabnum) $tabx +set vqb(tabley$tabnum) $taby + +incr vqb(ntables) +if {$vqb(ntables)==1} { + repaintAll +} else { + drawTable [expr $vqb(ntables)-1] +} +set vqb(newtablename) {} +focus .pgaw:VisualQuery.fb.entt +} + +proc {computeSQL} {} { +global PgAcVar +variable vqb +set sqlcmd "select " +#rjr 8Mar1999 added logical return state for results +for {set i 0} {$i<[llength $vqb(resfields)]} {incr i} { + if {[lindex $vqb(resreturn) $i]==[intlmsg Yes]} { + if {$sqlcmd!="select "} {set sqlcmd "$sqlcmd, "} + set sqlcmd "$sqlcmd[lindex $vqb(restables) $i].\"[lindex $vqb(resfields) $i]\"" + } +} +set tables {} +for {set i 0} {$i<$vqb(ntables)} {incr i} { + set thename {} + catch {set thename $vqb(tablename$i)} + if {$thename!=""} {lappend tables "\"$vqb(tablename$i)\" $vqb(tablealias$i)"} +} +set sqlcmd "$sqlcmd from [join $tables ,] " +set sup1 {} +if {[llength $vqb(links)]>0} { + set sup1 "where " + foreach link $vqb(links) { + if {$sup1!="where "} {set sup1 "$sup1 and "} + set sup1 "$sup1 ([lindex $link 0].\"[lindex $link 1]\"=[lindex $link 2].\"[lindex $link 3]\")" + } +} +for {set i 0} {$i<[llength $vqb(resfields)]} {incr i} { + set crit [lindex $vqb(rescriteria) $i] + if {$crit!=""} { + if {$sup1==""} {set sup1 "where "} + if {[string length $sup1]>6} {set sup1 "$sup1 and "} + set sup1 "$sup1 ([lindex $vqb(restables) $i].\"[lindex $vqb(resfields) $i]\" $crit) " + } +} +set sqlcmd "$sqlcmd $sup1" +set sup2 {} +for {set i 0} {$i<[llength $vqb(ressort)]} {incr i} { + set how [lindex $vqb(ressort) $i] + if {$how!="unsorted"} { + if {$how=="Ascending"} {set how asc} else {set how desc} + if {$sup2==""} {set sup2 " order by "} else {set sup2 "$sup2,"} + set sup2 "$sup2 [lindex $vqb(restables) $i].\"[lindex $vqb(resfields) $i]\" $how " + } +} +set sqlcmd "$sqlcmd $sup2" +set vqb(qcmd) $sqlcmd +return $sqlcmd +} + +proc {deleteObject} {} { +global PgAcVar +variable vqb +# Checking if there is a highlighted object (i.e. is selected) +set obj [.pgaw:VisualQuery.c find withtag hili] +if {$obj==""} return +# +# Is object a link ? +if {[getTagInfo $obj link]=="s"} { + if {[tk_messageBox -title [intlmsg Warning] -icon question -parent .pgaw:VisualQuery -message [intlmsg "Remove link ?"] -type yesno -default no]=="no"} return + set linkid [getTagInfo $obj lkid] + set vqb(links) [lreplace $vqb(links) $linkid $linkid] + .pgaw:VisualQuery.c delete links + drawLinks + return +} +# +# Is object a result field ? +if {[getTagInfo $obj res]=="f"} { + set col [getTagInfo $obj col] + if {$col==""} return + if {[tk_messageBox -title [intlmsg Warning] -icon question -parent .pgaw:VisualQuery -message [intlmsg "Remove field from result ?"] -type yesno -default no]=="no"} return + set vqb(resfields) [lreplace $vqb(resfields) $col $col] + set vqb(ressort) [lreplace $vqb(ressort) $col $col] + set vqb(resreturn) [lreplace $vqb(resreturn) $col $col] + set vqb(restables) [lreplace $vqb(restables) $col $col] + set vqb(rescriteria) [lreplace $vqb(rescriteria) $col $col] + drawResultPanel + return +} +# +# Is object a table ? +set tablealias [getTagInfo $obj tab] +set tablename $vqb(ali_$tablealias) +if {"$tablename"==""} return +if {[tk_messageBox -title [intlmsg Warning] -icon question -parent .pgaw:VisualQuery -message [format [intlmsg "Remove table %s from query?"] $tablename] -type yesno -default no]=="no"} return +for {set i [expr [llength $vqb(restables)]-1]} {$i>=0} {incr i -1} { + if {"$tablealias"==[lindex $vqb(restables) $i]} { + set vqb(resfields) [lreplace $vqb(resfields) $i $i] + set vqb(ressort) [lreplace $vqb(ressort) $i $i] + set vqb(resreturn) [lreplace $vqb(resreturn) $i $i] + set vqb(restables) [lreplace $vqb(restables) $i $i] + set vqb(rescriteria) [lreplace $vqb(rescriteria) $i $i] + } +} +for {set i [expr [llength $vqb(links)]-1]} {$i>=0} {incr i -1} { + set thelink [lindex $vqb(links) $i] + if {($tablealias==[lindex $thelink 0]) || ($tablealias==[lindex $thelink 2])} { + set vqb(links) [lreplace $vqb(links) $i $i] + } +} +for {set i 0} {$i<$vqb(ntables)} {incr i} { + set temp {} + catch {set temp $vqb(tablename$i)} + if {"$temp"=="$tablename"} { + unset vqb(tablename$i) + unset vqb(tablestruct$i) + unset vqb(tablealias$i) + break + } +} +unset vqb(ali_$tablealias) +#incr vqb(ntables) -1 +.pgaw:VisualQuery.c delete tab$tablealias +.pgaw:VisualQuery.c delete links +drawLinks +drawResultPanel +} + + +proc {dragObject} {w x y} { +global PgAcVar +variable vqb + if {"$PgAcVar(draginfo,obj)" == ""} {return} + set dx [expr $x - $PgAcVar(draginfo,x)] + set dy [expr $y - $PgAcVar(draginfo,y)] + if {$PgAcVar(draginfo,is_a_table)} { + $w move $PgAcVar(draginfo,tabletag) $dx $dy + drawLinks + } else { + $w move $PgAcVar(draginfo,obj) $dx $dy + } + set PgAcVar(draginfo,x) $x + set PgAcVar(draginfo,y) $y +} + + +proc {dragStart} {w x y} { +global PgAcVar +variable vqb +PgAcVar:clean draginfo,* +set PgAcVar(draginfo,obj) [$w find closest $x $y] +if {[getTagInfo $PgAcVar(draginfo,obj) r]=="ect"} { + # If it'a a rectangle, exit + set PgAcVar(draginfo,obj) {} + return +} +.pgaw:VisualQuery configure -cursor hand1 +.pgaw:VisualQuery.c raise $PgAcVar(draginfo,obj) +set PgAcVar(draginfo,table) 0 +if {[getTagInfo $PgAcVar(draginfo,obj) table]=="header"} { + set PgAcVar(draginfo,is_a_table) 1 + set taglist [.pgaw:VisualQuery.c gettags $PgAcVar(draginfo,obj)] + set PgAcVar(draginfo,tabletag) [lindex $taglist [lsearch -regexp $taglist "^tab\[0-9\]*"]] + .pgaw:VisualQuery.c raise $PgAcVar(draginfo,tabletag) + .pgaw:VisualQuery.c itemconfigure [.pgaw:VisualQuery.c find withtag hili] -fill black + .pgaw:VisualQuery.c dtag [.pgaw:VisualQuery.c find withtag hili] hili + .pgaw:VisualQuery.c addtag hili withtag $PgAcVar(draginfo,obj) + .pgaw:VisualQuery.c itemconfigure hili -fill blue +} else { + set PgAcVar(draginfo,is_a_table) 0 +} +set PgAcVar(draginfo,x) $x +set PgAcVar(draginfo,y) $y +set PgAcVar(draginfo,sx) $x +set PgAcVar(draginfo,sy) $y +} + + +proc {dragStop} {x y} { +global PgAcVar +variable vqb +# when click Close, ql window is destroyed but event ButtonRelease-1 is fired +if {![winfo exists .pgaw:VisualQuery]} return; +.pgaw:VisualQuery configure -cursor left_ptr +set este {} +catch {set este $PgAcVar(draginfo,obj)} +if {$este==""} return +# Re-establish the normal paint order so +# information won't be overlapped by table rectangles +# or link lines +.pgaw:VisualQuery.c lower $PgAcVar(draginfo,obj) +.pgaw:VisualQuery.c lower rect +.pgaw:VisualQuery.c lower links +set vqb(panstarted) 0 +if {$PgAcVar(draginfo,is_a_table)} { + set tabnum [getTagInfo $PgAcVar(draginfo,obj) tabt] + foreach w [.pgaw:VisualQuery.c find withtag $PgAcVar(draginfo,tabletag)] { + if {[lsearch [.pgaw:VisualQuery.c gettags $w] outer] != -1} { + foreach [list vqb(tablex$tabnum) vqb(tabley$tabnum) x1 y1] [.pgaw:VisualQuery.c coords $w] {} + } + } + set PgAcVar(draginfo,obj) {} + .pgaw:VisualQuery.c delete links + drawLinks + return +} +.pgaw:VisualQuery.c move $PgAcVar(draginfo,obj) [expr $PgAcVar(draginfo,sx)-$x] [expr $PgAcVar(draginfo,sy)-$y] +if {($y>$vqb(yoffs)) && ($x>$vqb(xoffs))} { + # Drop position : inside the result panel + # Compute the offset of the result panel due to panning + set resoffset [expr [lindex [.pgaw:VisualQuery.c bbox resmarker] 0]-$vqb(xoffs)] + set newfld [.pgaw:VisualQuery.c itemcget $PgAcVar(draginfo,obj) -text] + set tabtag [getTagInfo $PgAcVar(draginfo,obj) tab] + set col [expr int(($x-$vqb(xoffs)-$resoffset)/$vqb(reswidth))] + set vqb(resfields) [linsert $vqb(resfields) $col $newfld] + set vqb(ressort) [linsert $vqb(ressort) $col unsorted] + set vqb(rescriteria) [linsert $vqb(rescriteria) $col {}] + set vqb(restables) [linsert $vqb(restables) $col $tabtag] + set vqb(resreturn) [linsert $vqb(resreturn) $col [intlmsg Yes]] + drawResultPanel +} else { + # Drop position : in the table panel + set droptarget [.pgaw:VisualQuery.c find overlapping $x $y $x $y] + set targettable {} + foreach item $droptarget { + set targettable [getTagInfo $item tab] + set targetfield [getTagInfo $item f-] + if {($targettable!="") && ($targetfield!="")} { + set droptarget $item + break + } + } + # check if target object isn't a rectangle + if {[getTagInfo $droptarget rec]=="t"} {set targettable {}} + if {$targettable!=""} { + # Target has a table + # See about originate table + set sourcetable [getTagInfo $PgAcVar(draginfo,obj) tab] + if {$sourcetable!=""} { + # Source has also a tab .. tag + set sourcefield [getTagInfo $PgAcVar(draginfo,obj) f-] + if {$sourcetable!=$targettable} { + lappend vqb(links) [list $sourcetable $sourcefield $targettable $targetfield] + drawLinks + } + } + } +} +# Erase information about onbject beeing dragged +set PgAcVar(draginfo,obj) {} +} + + +proc {getTableList} {} { +global PgAcVar +variable vqb + set tablelist {} + foreach name [array names vqb tablename*] { + regsub tablename $name "" num + lappend tablelist $vqb($name) $vqb(tablex$num) $vqb(tabley$num) t$num + } + return $tablelist +} + + +proc {getLinkList} {} { +global PgAcVar +variable vqb + set linklist {} + foreach l $vqb(links) { + lappend linklist [lindex $l 0] [lindex $l 1] [lindex $l 2] [lindex $l 3] + } + return $linklist +} + + +proc {loadVisualLayout} {} { +global PgAcVar +variable vqb + init + foreach {t x y a} $PgAcVar(query,tables) {set vqb(newtablename) $t; addNewTable $x $y $a} + foreach {t0 f0 t1 f1} $PgAcVar(query,links) {lappend vqb(links) [list $t0 $f0 $t1 $f1]} + foreach {f t s c r} $PgAcVar(query,results) {addResultColumn $f $t $s $c $r} + repaintAll +} + + +proc {findField} {alias field} { + foreach obj [.pgaw:VisualQuery.c find withtag f-${field}] { + if {[lsearch [.pgaw:VisualQuery.c gettags $obj] tab$alias] != -1} {return $obj} + } + return -1 +} + + +proc {getResultList} {} { +global PgAcVar +variable vqb + set reslist {} + for {set i 0} {$i < [llength $vqb(resfields)]} {incr i} { + lappend reslist [lindex $vqb(resfields) $i] + lappend reslist [lindex $vqb(restables) $i] + lappend reslist [lindex $vqb(ressort) $i] + lappend reslist [lindex $vqb(rescriteria) $i] + lappend reslist [lindex $vqb(resreturn) $i] + } + return $reslist +} + + +proc {addResultColumn} {f t s c r} { +global PgAcVar +variable vqb + lappend vqb(resfields) $f + lappend vqb(restables) $t + lappend vqb(ressort) $s + lappend vqb(rescriteria) $c + lappend vqb(resreturn) $r +} + + +proc {drawLinks} {} { +global PgAcVar +variable vqb +.pgaw:VisualQuery.c delete links +set i 0 +foreach link $vqb(links) { + # Compute the source and destination right edge + set sre [lindex [.pgaw:VisualQuery.c bbox tab[lindex $link 0]] 2] + set dre [lindex [.pgaw:VisualQuery.c bbox tab[lindex $link 2]] 2] + # Compute field bound boxes + set sbbox [.pgaw:VisualQuery.c bbox [findField [lindex $link 0] [lindex $link 1]]] + set dbbox [.pgaw:VisualQuery.c bbox [findField [lindex $link 2] [lindex $link 3]]] + # Compute the auxiliary lines + if {[lindex $sbbox 2] < [lindex $dbbox 0]} { + # Source object is on the left of target object + set x1 $sre + set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2] + .pgaw:VisualQuery.c create line $x1 $y1 [expr $x1+10] $y1 -tags [subst {links lkid$i}] -width 3 + set x2 [lindex $dbbox 0] + set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2] + .pgaw:VisualQuery.c create line [expr $x2-10] $y2 $x2 $y2 -tags [subst {links lkid$i}] -width 3 + .pgaw:VisualQuery.c create line [expr $x1+10] $y1 [expr $x2-10] $y2 -tags [subst {links lkid$i}] -width 2 + } else { + # source object is on the right of target object + set x1 [lindex $sbbox 0] + set y1 [expr ([lindex $sbbox 1]+[lindex $sbbox 3])/2] + .pgaw:VisualQuery.c create line $x1 $y1 [expr $x1-10] $y1 -tags [subst {links lkid$i}] -width 3 + set x2 $dre + set y2 [expr ([lindex $dbbox 1]+[lindex $dbbox 3])/2] + .pgaw:VisualQuery.c create line $x2 $y2 [expr $x2+10] $y2 -width 3 -tags [subst {links lkid$i}] + .pgaw:VisualQuery.c create line [expr $x1-10] $y1 [expr $x2+10] $y2 -tags [subst {links lkid$i}] -width 2 + } + incr i +} +.pgaw:VisualQuery.c lower links +.pgaw:VisualQuery.c bind links {VisualQueryBuilder::linkClick %x %y} +} + + +proc {repaintAll} {} { +global PgAcVar +variable vqb +.pgaw:VisualQuery.c delete all +set posx 20 +foreach tn [array names vqb tablename*] { + regsub tablename $tn "" it + drawTable $it +} +.pgaw:VisualQuery.c lower rect +.pgaw:VisualQuery.c create line 0 $vqb(yoffs) 10000 $vqb(yoffs) -width 3 +.pgaw:VisualQuery.c create rectangle 0 $vqb(yoffs) 10000 5000 -fill #FFFFFF +for {set i [expr 15+$vqb(yoffs)]} {$i<500} {incr i 15} { + .pgaw:VisualQuery.c create line $vqb(xoffs) $i 10000 $i -fill #CCCCCC -tags {resgrid} +} +for {set i $vqb(xoffs)} {$i<10000} {incr i $vqb(reswidth)} { + .pgaw:VisualQuery.c create line $i [expr 1+$vqb(yoffs)] $i 10000 -fill #cccccc -tags {resgrid} +} +# Make a marker for result panel offset calculations (due to panning) +.pgaw:VisualQuery.c create line $vqb(xoffs) $vqb(yoffs) $vqb(xoffs) 500 -tags {resmarker resgrid} +.pgaw:VisualQuery.c create rectangle 0 $vqb(yoffs) $vqb(xoffs) 5000 -fill #EEEEEE -tags {reshdr} +.pgaw:VisualQuery.c create text 5 [expr 1+$vqb(yoffs)] -text [intlmsg Field] -anchor nw -font $PgAcVar(pref,font_normal) -tags {reshdr} +.pgaw:VisualQuery.c create text 5 [expr 16+$vqb(yoffs)] -text [intlmsg Table] -anchor nw -font $PgAcVar(pref,font_normal) -tags {reshdr} +.pgaw:VisualQuery.c create text 5 [expr 31+$vqb(yoffs)] -text [intlmsg Sort] -anchor nw -font $PgAcVar(pref,font_normal) -tags {reshdr} +.pgaw:VisualQuery.c create text 5 [expr 46+$vqb(yoffs)] -text [intlmsg Criteria] -anchor nw -font $PgAcVar(pref,font_normal) -tags {reshdr} +.pgaw:VisualQuery.c create text 5 [expr 61+$vqb(yoffs)] -text [intlmsg Return] -anchor nw -font $PgAcVar(pref,font_normal) -tags {reshdr} + +drawLinks +drawResultPanel + +.pgaw:VisualQuery.c bind mov {VisualQueryBuilder::dragStart %W %x %y} +.pgaw:VisualQuery.c bind mov {VisualQueryBuilder::dragObject %W %x %y} +bind .pgaw:VisualQuery {VisualQueryBuilder::dragStop %x %y} +bind .pgaw:VisualQuery {VisualQueryBuilder::canvasClick %x %y %W} +bind .pgaw:VisualQuery {VisualQueryBuilder::panning %x %y} +bind .pgaw:VisualQuery {VisualQueryBuilder::deleteObject} +} + + +proc {drawResultPanel} {} { +global PgAcVar +variable vqb +# Compute the offset of the result panel due to panning +set resoffset [expr [lindex [.pgaw:VisualQuery.c bbox resmarker] 0]-$vqb(xoffs)] +.pgaw:VisualQuery.c delete resp +for {set i 0} {$i<[llength $vqb(resfields)]} {incr i} { + .pgaw:VisualQuery.c create text [expr $resoffset+4+$vqb(xoffs)+$i*$vqb(reswidth)] [expr 1+$vqb(yoffs)] -text [lindex $vqb(resfields) $i] -anchor nw -tags [subst {resf resp col$i}] -font $PgAcVar(pref,font_normal) + .pgaw:VisualQuery.c create text [expr $resoffset+4+$vqb(xoffs)+$i*$vqb(reswidth)] [expr 16+$vqb(yoffs)] -text $vqb(ali_[lindex $vqb(restables) $i]) -anchor nw -tags {resp rest} -font $PgAcVar(pref,font_normal) + .pgaw:VisualQuery.c create text [expr $resoffset+4+$vqb(xoffs)+$i*$vqb(reswidth)] [expr 31+$vqb(yoffs)] -text [lindex $vqb(ressort) $i] -anchor nw -tags {resp sort} -font $PgAcVar(pref,font_normal) + if {[lindex $vqb(rescriteria) $i]!=""} { + .pgaw:VisualQuery.c create text [expr $resoffset+4+$vqb(xoffs)+$i*$vqb(reswidth)] [expr $vqb(yoffs)+46+15*0] -anchor nw -text [lindex $vqb(rescriteria) $i] -font $PgAcVar(pref,font_normal) -tags [subst {resp cr-c$i-r0}] + } + .pgaw:VisualQuery.c create text [expr $resoffset+4+$vqb(xoffs)+$i*$vqb(reswidth)] [expr 61+$vqb(yoffs)] -text [lindex $vqb(resreturn) $i] -anchor nw -tags {resp retval} -font $PgAcVar(pref,font_normal) +} +.pgaw:VisualQuery.c raise reshdr +.pgaw:VisualQuery.c bind resf {VisualQueryBuilder::resultFieldClick %x %y} +.pgaw:VisualQuery.c bind sort {VisualQueryBuilder::toggleSortMode %W %x %y} +.pgaw:VisualQuery.c bind retval {VisualQueryBuilder::toggleReturn %W %x %y} +} + + +proc {drawTable} {it} { +global PgAcVar +variable vqb +if {$vqb(tablex$it)==0} { + set posy 10 + set allbox [.pgaw:VisualQuery.c bbox rect] + if {$allbox==""} {set posx 10} else {set posx [expr 20+[lindex $allbox 2]]} + set vqb(tablex$it) $posx + set vqb(tabley$it) $posy +} else { + set posx [expr int($vqb(tablex$it))] + set posy [expr int($vqb(tabley$it))] +} +set tablename $vqb(tablename$it) +set tablealias $vqb(tablealias$it) +.pgaw:VisualQuery.c create text $posx $posy -text "$tablename" -anchor nw -tags [subst {tab$tablealias f-oid mov tableheader}] -font $PgAcVar(pref,font_bold) +incr posy 16 +foreach fld $vqb(tablestruct$it) { + .pgaw:VisualQuery.c create text $posx $posy -text $fld -fill #010101 -anchor nw -tags [subst {f-$fld tab$tablealias mov}] -font $PgAcVar(pref,font_normal) + incr posy 14 +} +set reg [.pgaw:VisualQuery.c bbox tab$tablealias] +.pgaw:VisualQuery.c create rectangle [lindex $reg 0] [lindex $reg 1] [lindex $reg 2] [lindex $reg 3] -fill #EEEEEE -tags [subst {rect outer tab$tablealias}] +.pgaw:VisualQuery.c create line [lindex $reg 0] [expr [lindex $reg 1]+15] [lindex $reg 2] [expr [lindex $reg 1]+15] -tags [subst {rect tab$tablealias}] +.pgaw:VisualQuery.c lower tab$tablealias +.pgaw:VisualQuery.c lower rect +} + + +proc {getTagInfo} {obj prefix} { +variable vqb + set taglist [.pgaw:VisualQuery.c gettags $obj] + set tagpos [lsearch -regexp $taglist "^$prefix"] + if {$tagpos==-1} {return ""} + set thattag [lindex $taglist $tagpos] + return [string range $thattag [string length $prefix] end] +} + +proc {init} {} { +global PgAcVar +variable vqb + catch { unset vqb } + set vqb(yoffs) 360 + set vqb(xoffs) 50 + set vqb(reswidth) 150 + set vqb(resfields) {} + set vqb(resreturn) {} + set vqb(ressort) {} + set vqb(rescriteria) {} + set vqb(restables) {} + set vqb(critedit) 0 + set vqb(links) {} + set vqb(ntables) 0 + set vqb(newtablename) {} +} + + +proc {linkClick} {x y} { +global PgAcVar +variable vqb + set obj [.pgaw:VisualQuery.c find closest $x $y 1 links] + if {[getTagInfo $obj link]!="s"} return + .pgaw:VisualQuery.c itemconfigure [.pgaw:VisualQuery.c find withtag hili] -fill black + .pgaw:VisualQuery.c dtag [.pgaw:VisualQuery.c find withtag hili] hili + .pgaw:VisualQuery.c addtag hili withtag $obj + .pgaw:VisualQuery.c itemconfigure $obj -fill blue +} + + +proc {panning} {x y} { +global PgAcVar +variable vqb + set panstarted 0 + catch {set panstarted $vqb(panstarted) } + if {!$panstarted} return + set dx [expr $x-$vqb(panstartx)] + set dy [expr $y-$vqb(panstarty)] + set vqb(panstartx) $x + set vqb(panstarty) $y + if {$vqb(panobject)=="tables"} { + .pgaw:VisualQuery.c move mov $dx $dy + .pgaw:VisualQuery.c move links $dx $dy + .pgaw:VisualQuery.c move rect $dx $dy + } else { + .pgaw:VisualQuery.c move resp $dx 0 + .pgaw:VisualQuery.c move resgrid $dx 0 + .pgaw:VisualQuery.c raise reshdr + } +} + + +proc {resultFieldClick} {x y} { +global PgAcVar +variable vqb + set obj [.pgaw:VisualQuery.c find closest $x $y] + if {[getTagInfo $obj res]!="f"} return + .pgaw:VisualQuery.c itemconfigure [.pgaw:VisualQuery.c find withtag hili] -fill black + .pgaw:VisualQuery.c dtag [.pgaw:VisualQuery.c find withtag hili] hili + .pgaw:VisualQuery.c addtag hili withtag $obj + .pgaw:VisualQuery.c itemconfigure $obj -fill blue +} + + +proc {showSQL} {} { +global PgAcVar +variable vqb + set sqlcmd [computeSQL] + .pgaw:VisualQuery.c delete sqlpage + .pgaw:VisualQuery.c create rectangle 0 0 2000 [expr $vqb(yoffs)-1] -fill #ffffff -tags {sqlpage} + .pgaw:VisualQuery.c create text 10 10 -text $sqlcmd -anchor nw -width 550 -tags {sqlpage} -font $PgAcVar(pref,font_normal) + .pgaw:VisualQuery.c bind sqlpage {.pgaw:VisualQuery.c delete sqlpage} +} + + +proc {toggleSortMode} {w x y} { +global PgAcVar +variable vqb + set obj [$w find closest $x $y] + set taglist [.pgaw:VisualQuery.c gettags $obj] + if {[lsearch $taglist sort]==-1} return + set how [.pgaw:VisualQuery.c itemcget $obj -text] + if {$how=="unsorted"} { + set how Ascending + } elseif {$how=="Ascending"} { + set how Descending + } else { + set how unsorted + } + set col [expr int(($x-$vqb(xoffs))/$vqb(reswidth))] + set vqb(ressort) [lreplace $vqb(ressort) $col $col $how] + .pgaw:VisualQuery.c itemconfigure $obj -text $how +} + + +#rjr 8Mar1999 toggle logical return state for result +proc {toggleReturn} {w x y} { +global PgAcVar +variable vqb + set obj [$w find closest $x $y] + set taglist [.pgaw:VisualQuery.c gettags $obj] + if {[lsearch $taglist retval]==-1} return + set how [.pgaw:VisualQuery.c itemcget $obj -text] + if {$how==[intlmsg Yes]} { + set how [intlmsg No] + } else { + set how [intlmsg Yes] + } + set col [expr int(($x-$vqb(xoffs))/$vqb(reswidth))] + set vqb(resreturn) [lreplace $vqb(resreturn) $col $col $how] + .pgaw:VisualQuery.c itemconfigure $obj -text $how +} + + +proc {canvasClick} {x y w} { +global PgAcVar +variable vqb +set vqb(panstarted) 0 +if {$w==".pgaw:VisualQuery.c"} { + set canpan 1 + if {$y<$vqb(yoffs)} { + if {[llength [.pgaw:VisualQuery.c find overlapping $x $y $x $y]]!=0} {set canpan 0} + set vqb(panobject) tables + } else { + set vqb(panobject) result + } + if {$canpan} { + .pgaw:VisualQuery configure -cursor hand1 + set vqb(panstartx) $x + set vqb(panstarty) $y + set vqb(panstarted) 1 + } +} +set isedit 0 +catch {set isedit $vqb(critedit)} +# Compute the offset of the result panel due to panning +set resoffset [expr [lindex [.pgaw:VisualQuery.c bbox resmarker] 0]-$vqb(xoffs)] +if {$isedit} { + set vqb(rescriteria) [lreplace $vqb(rescriteria) $vqb(critcol) $vqb(critcol) $vqb(critval)] + .pgaw:VisualQuery.c delete cr-c$vqb(critcol)-r$vqb(critrow) + .pgaw:VisualQuery.c create text [expr $resoffset+4+$vqb(xoffs)+$vqb(critcol)*$vqb(reswidth)] [expr $vqb(yoffs)+46+15*$vqb(critrow)] -anchor nw -text $vqb(critval) -font $PgAcVar(pref,font_normal) -tags [subst {resp cr-c$vqb(critcol)-r$vqb(critrow)}] + set vqb(critedit) 0 +} +catch {destroy .pgaw:VisualQuery.entc} +if {$y<[expr $vqb(yoffs)+46]} return +if {$x<[expr $vqb(xoffs)+5]} return +set col [expr int(($x-$vqb(xoffs)-$resoffset)/$vqb(reswidth))] +if {$col>=[llength $vqb(resfields)]} return +set nx [expr $col*$vqb(reswidth)+8+$vqb(xoffs)+$resoffset] +set ny [expr $vqb(yoffs)+76] +# Get the old criteria value +set vqb(critval) [lindex $vqb(rescriteria) $col] +entry .pgaw:VisualQuery.entc -textvar VisualQueryBuilder::vqb(critval) -borderwidth 0 -background #FFFFFF -highlightthickness 0 -selectborderwidth 0 -font $PgAcVar(pref,font_normal) +place .pgaw:VisualQuery.entc -x $nx -y $ny -height 14 +focus .pgaw:VisualQuery.entc +bind .pgaw:VisualQuery.entc {set VisualQueryBuilder::vqb(panstarted) 0} +set vqb(critcol) $col +set vqb(critrow) 0 +set vqb(critedit) 1 +} + + +proc {saveToQueryBuilder} {} { +global PgAcVar +variable vqb + Window show .pgaw:QueryBuilder + .pgaw:QueryBuilder.text1 delete 1.0 end + set vqb(qcmd) [computeSQL] + set PgAcVar(query,tables) [getTableList] + set PgAcVar(query,links) [getLinkList] + set PgAcVar(query,results) [getResultList] + .pgaw:QueryBuilder.text1 insert end $vqb(qcmd) + focus .pgaw:QueryBuilder +} + + +proc {executeSQL} {} { +global PgAcVar +variable vqb + set vqb(qcmd) [computeSQL] + set wn [Tables::getNewWindowName] + set PgAcVar(mw,$wn,query) [subst $vqb(qcmd)] + set PgAcVar(mw,$wn,updatable) 0 + set PgAcVar(mw,$wn,isaquery) 1 + Tables::createWindow + Tables::loadLayout $wn nolayoutneeded + Tables::selectRecords $wn $PgAcVar(mw,$wn,query) +} + + +proc {createDropDown} {} { +global PgAcVar +variable vqb + if {[winfo exists .pgaw:VisualQuery.ddf]} { + destroy .pgaw:VisualQuery.ddf + } else { + create_drop_down .pgaw:VisualQuery 70 27 200 + focus .pgaw:VisualQuery.ddf.sb + foreach tbl [Database::getTablesList] {.pgaw:VisualQuery.ddf.lb insert end $tbl} + bind .pgaw:VisualQuery.ddf.lb { + set i [.pgaw:VisualQuery.ddf.lb curselection] + if {$i!=""} { + set VisualQueryBuilder::vqb(newtablename) [.pgaw:VisualQuery.ddf.lb get $i] + VisualQueryBuilder::addNewTable + } + destroy .pgaw:VisualQuery.ddf + break + } + } +} + +} + +proc vTclWindow.pgaw:VisualQuery {base} { +global PgAcVar + if {$base == ""} { + set base .pgaw:VisualQuery + } + if {[winfo exists $base]} { + wm deiconify $base; return + } + toplevel $base -class Toplevel + wm focusmodel $base passive + wm geometry $base 759x530+10+13 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm deiconify $base + wm title $base [intlmsg "Visual query designer"] + bind $base { + VisualQueryBuilder::panning %x %y + } + bind $base { + VisualQueryBuilder::canvasClick %x %y %W + } + bind $base { + VisualQueryBuilder::dragStop %x %y + } + bind $base { + VisualQueryBuilder::deleteObject + } + bind $base "Help::load visual_designer" + canvas $base.c -background #fefefe -borderwidth 2 -height 207 -relief ridge -takefocus 0 -width 295 + frame $base.fb -height 75 -width 125 + label $base.fb.l12 -borderwidth 0 -text "[intlmsg {Add table}] " + entry $base.fb.entt -background #fefefe -borderwidth 1 -highlightthickness 1 \ + -selectborderwidth 0 -textvariable VisualQueryBuilder::vqb(newtablename) + bind $base.fb.entt { + VisualQueryBuilder::addNewTable + } + button $base.fb.bdd -borderwidth 1 \ + -command VisualQueryBuilder::createDropDown -image dnarw + button $base.fb.showbtn \ + -command VisualQueryBuilder::showSQL \ + -text [intlmsg {Show SQL}] + button $base.fb.execbtn \ + -command VisualQueryBuilder::executeSQL \ + -text [intlmsg {Execute SQL}] + button $base.fb.stoqb \ + -command VisualQueryBuilder::saveToQueryBuilder \ + -text [intlmsg {Save to query builder}] + button $base.fb.exitbtn \ + -command {Window destroy .pgaw:VisualQuery} \ + -text [intlmsg Close] + place $base.c -x 5 -y 30 -width 750 -height 500 -anchor nw -bordermode ignore + place $base.fb \ + -x 5 -y 0 -width 753 -height 31 -anchor nw -bordermode ignore + pack $base.fb.l12 \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.entt \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.bdd \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side left + pack $base.fb.exitbtn \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side right + pack $base.fb.stoqb \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side right + pack $base.fb.execbtn \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side right + pack $base.fb.showbtn \ + -in .pgaw:VisualQuery.fb -anchor center -expand 0 -fill none -side right +} + diff --git a/src/bin/pgaccess/main.tcl b/src/bin/pgaccess/main.tcl new file mode 100644 index 00000000000..1a3d84e7eb1 --- /dev/null +++ b/src/bin/pgaccess/main.tcl @@ -0,0 +1,250 @@ +#!/bin/sh +# the next line restarts using wish \ +exec wish "$0" "$@" + +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 {intlmsg} {msg} { +global PgAcVar Messages + if {$PgAcVar(pref,language)=="english"} { return $msg } + if { ! [array exists Messages] } { return $msg } + if { ! [info exists Messages($msg)] } { return $msg } + return $Messages($msg) +} + +proc {PgAcVar:clean} {prefix} { +global PgAcVar + foreach key [array names PgAcVar $prefix] { + set PgAcVar($key) {} + unset PgAcVar($key) + } +} + + +proc {find_PGACCESS_HOME} {} { +global PgAcVar env + if {! [info exists env(PGACCESS_HOME)]} { + set home [file dirname [info script]] + switch [file pathtype $home] { + absolute {set env(PGACCESS_HOME) $home} + relative {set env(PGACCESS_HOME) [file join [pwd] $home]} + volumerelative { + set curdir [pwd] + cd $home + set env(PGACCESS_HOME) [file join [pwd] [file dirname [file join [lrange [file split $home] 1 end]]]] + cd $curdir + } + } + } + if {![file isdir $env(PGACCESS_HOME)]} { + set PgAcVar(PGACCESS_HOME) [pwd] + } else { + set PgAcVar(PGACCESS_HOME) $env(PGACCESS_HOME) + } +} + + +proc init {argc argv} { +global PgAcVar CurrentDB + find_PGACCESS_HOME + # Loading all defined namespaces + foreach module {mainlib database tables queries visualqb forms views functions reports scripts users sequences schema help preferences} { + source [file join $PgAcVar(PGACCESS_HOME) lib $module.tcl] + } + set PgAcVar(currentdb,host) localhost + set PgAcVar(currentdb,pgport) 5432 + set CurrentDB {} + set PgAcVar(tablist) [list Tables Queries Views Sequences Functions Reports Forms Scripts Users Schema] + set PgAcVar(activetab) {} + set PgAcVar(query,tables) {} + set PgAcVar(query,links) {} + set PgAcVar(query,results) {} + set PgAcVar(mwcount) 0 + Preferences::load +} + +proc {wpg_exec} {db cmd} { +global PgAcVar + set PgAcVar(pgsql,cmd) "never executed" + set PgAcVar(pgsql,status) "no status yet" + set PgAcVar(pgsql,errmsg) "no error message yet" + if {[catch { + Mainlib::sqlw_display $cmd + set PgAcVar(pgsql,cmd) $cmd + set PgAcVar(pgsql,res) [pg_exec $db $cmd] + set PgAcVar(pgsql,status) [pg_result $PgAcVar(pgsql,res) -status] + set PgAcVar(pgsql,errmsg) [pg_result $PgAcVar(pgsql,res) -error] + } tclerrmsg]} { + showError [format [intlmsg "Tcl error executing pg_exec %s\n\n%s"] $cmd $tclerrmsg] + return 0 + } + return $PgAcVar(pgsql,res) +} + + +proc {wpg_select} {args} { + Mainlib::sqlw_display "[lindex $args 1]" + uplevel pg_select $args +} + + +proc {create_drop_down} {base x y w} { +global PgAcVar + if {[winfo exists $base.ddf]} return; + frame $base.ddf -borderwidth 1 -height 75 -relief raised -width 55 + listbox $base.ddf.lb -background #fefefe -foreground #000000 -selectbackground #c3c3c3 -borderwidth 1 -font $PgAcVar(pref,font_normal) -highlightthickness 0 -selectborderwidth 0 -yscrollcommand [subst {$base.ddf.sb set}] + scrollbar $base.ddf.sb -borderwidth 1 -command [subst {$base.ddf.lb yview}] -highlightthickness 0 -orient vert + place $base.ddf -x $x -y $y -width $w -height 185 -anchor nw -bordermode ignore + place $base.ddf.lb -x 1 -y 1 -width [expr $w-18] -height 182 -anchor nw -bordermode ignore + place $base.ddf.sb -x [expr $w-15] -y 1 -width 14 -height 183 -anchor nw -bordermode ignore +} + + +proc {setCursor} {{type NORMAL}} { + if {[lsearch -exact "CLOCK WAIT WATCH" [string toupper $type]] != -1} { + set type watch + } else { + set type left_ptr + } + foreach wn [winfo children .] { + catch {$wn configure -cursor $type} + } + update ; update idletasks +} + + +proc {parameter} {msg} { +global PgAcVar + Window show .pgaw:GetParameter + focus .pgaw:GetParameter.e1 + set PgAcVar(getqueryparam,var) "" + set PgAcVar(getqueryparam,flag) 0 + set PgAcVar(getqueryparam,msg) $msg + bind .pgaw:GetParameter "set PgAcVar(getqueryparam,flag) 1" + grab .pgaw:GetParameter + tkwait variable PgAcVar(getqueryparam,flag) + if {$PgAcVar(getqueryparam,result)} { + return $PgAcVar(getqueryparam,var) + } else { + return "" + } +} + + +proc {showError} {emsg} { + bell ; tk_messageBox -title [intlmsg Error] -icon error -message $emsg +} + + +proc {sql_exec} {how cmd} { +global PgAcVar CurrentDB + if {[set pgr [wpg_exec $CurrentDB $cmd]]==0} { + return 0 + } + if {($PgAcVar(pgsql,status)=="PGRES_COMMAND_OK") || ($PgAcVar(pgsql,status)=="PGRES_TUPLES_OK")} { + pg_result $pgr -clear + return 1 + } + if {$how != "quiet"} { + showError [format [intlmsg "Error executing query\n\n%s\n\nPostgreSQL error message:\n%s\nPostgreSQL status:%s"] $cmd $PgAcVar(pgsql,errmsg) $PgAcVar(pgsql,status)] + } + pg_result $pgr -clear + return 0 +} + + + +proc {main} {argc argv} { +global PgAcVar CurrentDB tcl_platform + load libpgtcl[info sharedlibextension] + catch {Mainlib::draw_tabs} + set PgAcVar(opendb,username) {} + set PgAcVar(opendb,password) {} + if {$argc>0} { + set PgAcVar(opendb,dbname) [lindex $argv 0] + set PgAcVar(opendb,host) localhost + set PgAcVar(opendb,pgport) 5432 + Mainlib::open_database + } elseif {$PgAcVar(pref,autoload) && ($PgAcVar(pref,lastdb)!="")} { + set PgAcVar(opendb,dbname) $PgAcVar(pref,lastdb) + set PgAcVar(opendb,host) $PgAcVar(pref,lasthost) + set PgAcVar(opendb,pgport) $PgAcVar(pref,lastport) + catch {set PgAcVar(opendb,username) $PgAcVar(pref,lastusername)} + if {[set openmsg [Mainlib::open_database]]!=""} { + if {[regexp "no password supplied" $openmsg]} { + Window show .pgaw:OpenDB + focus .pgaw:OpenDB.f1.e5 + wm transient .pgaw:OpenDB .pgaw:Main + } + } + + } + wm protocol .pgaw:Main WM_DELETE_WINDOW { + catch {pg_disconnect $CurrentDB} + exit + } +} + + +proc {Window} {args} { +global vTcl + set cmd [lindex $args 0] + set name [lindex $args 1] + set newname [lindex $args 2] + set rest [lrange $args 3 end] + if {$name == "" || $cmd == ""} {return} + if {$newname == ""} { + set newname $name + } + set exists [winfo exists $newname] + switch $cmd { + show { + if {$exists == "1" && $name != "."} {wm deiconify $name; return} + if {[info procs vTclWindow(pre)$name] != ""} { + eval "vTclWindow(pre)$name $newname $rest" + } + if {[info procs vTclWindow$name] != ""} { + eval "vTclWindow$name $newname $rest" + } + if {[info procs vTclWindow(post)$name] != ""} { + eval "vTclWindow(post)$name $newname $rest" + } + } + hide { if $exists {wm withdraw $newname; return} } + iconify { if $exists {wm iconify $newname; return} } + destroy { if $exists {destroy $newname; return} } + } +} + +proc vTclWindow. {base} { + if {$base == ""} { + set base . + } + wm focusmodel $base passive + wm geometry $base 1x1+0+0 + wm maxsize $base 1009 738 + wm minsize $base 1 1 + wm overrideredirect $base 0 + wm resizable $base 1 1 + wm withdraw $base + wm title $base "vt.tcl" +} + + +init $argc $argv + +Window show . +Window show .pgaw:Main + +main $argc $argv + diff --git a/src/bin/pgaccess/pgaccess b/src/bin/pgaccess/pgaccess new file mode 100755 index 00000000000..41fd5cae16f --- /dev/null +++ b/src/bin/pgaccess/pgaccess @@ -0,0 +1,10 @@ +#!/bin/sh + +PATH_TO_WISH=/usr/bin/wish +PGACCESS_HOME=/usr/local/pgaccess + +export PATH_TO_WISH +export PGACCESS_HOME + +exec ${PATH_TO_WISH} ${PGACCESS_HOME}/main.tcl "$@" + -- 2.39.5