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 0000000000..69a920ab67 --- /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 0000000000..d67654b88e --- /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 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 Y*T4PWKmO;x{_j8k_rL#_b_f6fJK5uimH+?% literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/doc/html/api.html b/src/bin/pgaccess/doc/html/api.html new file mode 100644 index 0000000000..7630fd2054 --- /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 zcmZ?wbhEHbwn(@puhMC3;X+Xrl;KK0k-MhPY@9y5c zd)2B{KxO6S<)NXWN=ix$qyWXAEQ}!aIv@gMrvt05f^ryYhp{tqcs-07g_U^#A|> literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/doc/html/contents.html b/src/bin/pgaccess/doc/html/contents.html new file mode 100644 index 0000000000..971f3f43dc --- /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 0000000000..d67654b88e --- /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 0000000000..48d3fa5ec1 --- /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 0000000000..efbe7bf50a --- /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 0000000000..f66dd8321a --- /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 0000000000..4531663be3 --- /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 0000000000..73bf1c5027 --- /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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 CIMVb0 literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/doc/html/forms.html b/src/bin/pgaccess/doc/html/forms.html new file mode 100644 index 0000000000..57ecff52fc --- /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 zcmV+>C)wCXNk%v~Vdw#H0mJ|R-rn8-008#(_CZ8J#lpn^0DAxca{vHp003eD09pV5 zQUCx-002P%0672vF#rH5001BW02lxO5C8xO|NsAUadV`hq~6-zoSB@1fr9`500000 z000000000000000EC2ui0O$d50YC-+ARvxpX`X1Ru59bRa4gSsZQppV?|kpu0f2x& zEECx}yWenjVotBy?{kHI&+q&9 z3xR@zgoS|&h>41ejEN18kdcy;j}DfXn3WOnQesvV zUSQ@{VH9OmYVm7v^l^Ci_ka5PhW-7G00UAQIB=6egQ5~DOvR8PtcMS8Nu21bV#Q(@ zi(%82ZP~eV(v)$VHWJD;A{SEss$9vkrOTHvW6GRKv!>0PICJXU$+M@=pFo2O9ZIyQ zO(NEWpfs8j*vbG*S7P``H2~GCR;*&(NJ^+tyLwXsaUN&#Em%(=7Y&!9t# z9=#UxG19|gw)Oc|a$L%=W6S1xmh{ZWA6*~TJv%mO(@RCSRU0fVTBpa;Do^QDWox{4 zyPmTey|?x2htCQ#4z>Gow%(bC2Ol0e_n57_=B+}#F7>SLrOU@Y`!|84r)}%s&%eL_ z{{VId903`0HC0_=RY%|df($n3;DZoGDB*;NL6rd#W?gthh7=4~U;qcMrZ@7eDQ2kn5kV@fxaO+su9SVMC#`1YSn8@^MoK7xye6ycvS9fN zQ=_8VDy){wR%`A5wQ@RJBd~r7OBS`*hAZy4*Jl5-jn=DH^;I!lSMm8Kyy^81S1y zhOAqUtmcL($CgrR*DzQec{0Z;U;6OJSNSMnsty-=WXd9g3?H&BzZ@{j9S1q|$wtad ztj8e}DRad0K}Yh>OlR8iu`tiv^pmnO%5BC9Q;a3lVvlXD#VTPeZP*UR8Ryj=qx$pE z?Z%z+-BHU8x4d>QjW^D4?p&4JM5p?8-tq1Y_|k`q?B?KoFHSJpDXFb4+iic_>w{#& z*7;YTD;9eHVx#ZPxz(x;TeIe@=hii-cse?vn)0E%Bg#+rTq4qIu3VVy0Mo8GktP#w z_0Bfy{BZ9$-$gU;uQ5NV@kkmyciu(s-n{dVQ|r6-G+PRA?JB2EeO9mk8hf;tKZ}AFHW_h* z0AE|1`^v__4vNi!9LZq&lms*hx+`Lh1KqoX=f4S>ih&-Cp{J;HK@6@hUAL0q>FA=v z9?nohA-ti!HfX2P?XOEl^q~^pMZ*hrfor%KhTTJ@?}&8k+n%GIuV^{ZeFt60ZM*0P#atV(67 zTGyI{bQyt9N(c!7EI`+~R=@%jz$;$m8igr*gbL&UtY86a05PNk9fd{5IuiR1cgQ0i z^@yw+@Il!+?BlY1@P}px5s=Oi&4etX~OWxL+7q;k?z--rRTifE6xbR&nLXBDzJHGO!M71xr>@#2CD2F&8 zO^!*)lT!4cPEC(Qur}egJH2&JXWg7oZCtXQ0jpHN7_RVfG>lTI*w1AQOE3&+M@a*c z7;k0a?_cO!-}_dE#mxW*|lvXYm~ zLP3S@!`p}3@w4xWy=tes_(K<2zXB~}HOgHxr z#dXfKrolWvqWRV zBAo44$FF+cPB$!(4ZCX#yO#C);v}WkK;+3=-S{roug`UBUEMq10GHIh@zw8}RTF}5 z4!FYU1@3;csF}N7xWt>(aAngHQr7#Og7%2+iF=%c13#F<*|lb4#%p_V6Vk_5o}`Mq zd)X|H`4wG$&>^bMmZn=33Li*7Yq~nZIAB|IdS?I6^y43Bb^Eyh?!aCDjb`f&hFh{IyXm35@PqL=>DERcBb5ogHPdMABj`FA{J?)RD`r*mV!xF9$ zo4XeL(<@J+xu>n}X(#;Bv4ePSquuTA8vF8Q$L!aeJ4SpbS1O@l@pa99dsP?xZZ^Jp zt_F#f9izN#sH_4NbKZlQNXptMH+mbQKN$9?$6d-Df=-*!Z~ zcYq7meMx|NOY(etIhT2p$9bf8LaApeCk8>u*LPjlb6A%;L`Q(0XLO8nP0dbc3C2RzW1eq#hgHDV)Ks42wYf{9Xja42x( zR0QbcfiE{_eAtJ6_=kE1h=QmR_+=S36;Xqjh%l9ie^`iF7G^6&W{e_IBn4(xc8M&( zQ5s5?7$7+{ihPJvnGs+AuK0?u7>lwvi?mpaws?!Un2Wl& zix=cmOXX9o$cw@_jKo-s#(0d#n2gG}j7l(E!)RQ{6^&ECT-2ys&-GlPor@2_Fl}`RDU6h6;K7t;9F4e4S`h-fi(_- z)eh^R4v2LQ?Qj6_aE)k?jncJ^_|T1)^^KYpj-54*pjD2eb&jT$j;XbdtksUM^^UR? zkFcnZ8xmY6`2^I^R`nQ*cjXLx#g8&6Sl~cdhV=ynsaQG5SP1D@3RwmWSq~2RkPxX4 z66p^VDG(M}5EzLN8krCr*$^HH5guw{VqMIcQqRi(J{2)zFgj zxR{LDn2!0FkQteb*LW?0r7W7Zwzfr+_!n_AXj%u`6JNj{LXJVgi{t0{R{5t{yG9A;K! zwwYy)k(#L~o2%(`$cc5a*=!G37`6FP&&ivm02-kG{NbN}_?cH!pAsXVpfMaBRUGB%9R*fkAwq9F z)19EX6Ps94y4hi;Ngf>9Q7@4mQv%hH!SDl)0c~CY{mQp{t=5YL;s#Dns8% zW#NgVI$ECNX=7}LJx%wcU!tG|N}rn{i8FzuKKgmj1}+v#A4DpkQaYtn8WPlF1vS!GxC9+SB7W$riv1OQF4d3Mlvj;d{oFwaJr|Q zLq;?OM0Luif|@Hb;)oYQfywfugQ{szG8S)$aZ#vtQTT((xu_HOckCl}Gk8cB7=~1H zfzWe39cQT?hpA`8fGwvqY4m^pq`GpZYI9*If}+!;)#o1Z(W)Q!s*^S>tp}+-h;F-t ztGQ}=m4m3ldaSrctkza@yGn*kqk$Vke4lDPcj`vS8iC3hZm61gz3Qw5_)I)^t=Rf? zw)UuJBd!vstJv0d5BNEXims!kuJ0zPQV4>ERDAF%bMgvvgqpAKx38KSd$BgFuII1% znytnvu$%{i5Z0y!8*>0lfBrInl0u=~W1aFbot*)6kl`^vs2(v%ZniI=7CF`>XORm7CvSOGe zM!SJPtA)-=Hxbmd_4l;@%ocIzcRXHHsZ^`6NXu{LswiDswKZF&-b#B=yQywEbzIAO z1?#D%28284w&enQZt6K@o2e3;cr=K4TsJ(b$FhIRq$Id~!l$6Zk@|#K z>v-*wgNs{r(ImKR>px6bxC2`id3&lct8=rNdRg-^7AQa*SGuA)s-h}1d$-Q({b~wU-CDAaii* z%ec9wcz!f=t!cUc?VG;>W4=4|O@y1j5Qkt&H#Nj5oRWu}2JD)(YGUa*zrp#duQ$99 z47uT|B^$iB1N^zLI<_QSAtKzY=S!ll`@5*?Nago3QS-dw`>7q`_~W`StTa7i zy{LO>HcZ1fY)p}ayUeGjPjZBGQBC5FDRf@)Q4Vtm^hxPz~D zE69Kh$X}?&&UUs7>&9ybMprlu(`#@?tb>nxN7EFfmkYv8n6u3Ht%lcSF>}dgti_+~ z$C_Mk_>0N^Y;3;&41gg)3e6Ydb_Q}Y{kNy%ShdFMg7tt?ZbuqwoP4b zw5F#23dqt#J;zy>!GmkeN$AOs>vRb0Ok#}BK&ZGxIJh1xxn#`0R5-bsSHJwM%E0Hx zoBP(I{6oJr(I*tU*;~3JGrTQ4t+?!%6+TU_eqyTH~VXO@=LU7ta#N8*I%67 z`vZFWJF=$?th@w#&WyoP6HfR7sKJff!%duxi^b85X&+3%Sl!tQU4-1DobxTm28^Bm z3;Z_T+(I@@ZYPG&jGMav=zM_fq+-o!NKiR+y52xNvyCbi%2uTqp5YoE6a>2A9{%AV zz7icC;{8#If^mufl8Ph_AS1rw`caBgRum|%8YMLpn|LuUo=`2G8$Qk# zGwvTMKIZocjAE|lqCo*;+D;4==lA61`Vr=GX6Jgo=S0PdXZ7cR9_WHT=!9PAhJNUX zp6H66=spFCj{fM6o>Y)N>6BjSmVW7&p6Qyt>73r_p8n~e9_pe#>ZD%krhe-GsGjPo zzUrXpjFS24upaBOKI^nTnTjcl&{&qog_dWjmXO7kaNw4B0GDwomxVx=b!nHAfR~$~ zm!iOzed(940GNR(n7u%fweIS?nCrTp1-xF3zODwq9_+$y2gL3N#(wO`{#nW{3Cy0C z&W>8pehSh)?bIGy*3Jvq?uuX05y5qs>|>86SrWoElij`r%ypB@74B&;?r%`;=6>#c zknV)A?(E*~knrxA5byFn@1;=hu5j=8p6|M_@9_oj803{RLhxW|1g;Ji81fN!l~*($ zlYZ5YgEbE1K#=Xw^NIEIKW_y+8SV~0SrAVL5$ z`H?UA6JYZ2h4LuRTPkV!15%9Ke(+}b?F-NFXVCfx@cOVH`?F8`wSW7#pZkix_`L7? zzYqMvKm3%>?`iM(&|vv3zx>45{LT;k(J%c#+4|NW``0!5wa;Dux1akC@ckh0KqFb2 z=NPFg+q$Y0%QIce6Q1ikj|V?6C>#a^gd;MkTr!)^Cv*@17@^iHQ=r{)yWTH2EFP1~ z<}*62UbEZoH#{zXW9#;NQcA`1`~E**px_{3q2VE7qT(VWlU~(Dq~s)JrR61NrsgJR zr{^bVsOTtZsp%=Y#ZWdP+qa(j1xYyr&; z97xb0!FLGdG2BKXW_`_YkOZN8vPzzaUpTv|uB%zEX@dA)e z|2}pELct(Tnl^KCy!jDl&6_?m3ba`iXuzHg;XRzBG9^rxD_usdDz#rsm{X%-ec2A^ zQKAKD3MK0kDYt?{&jtlpbF4;mCM%7^H z2J71~xyXfoizfbhGQ*~qb=zjXIrHD>5@)tneY`sMjlK{du;2ULwSbFxjOq%`rDB&RemzPUNNa>+g4NmvG>we7f_^;e2WcqUQA-#0{nI3kJNba>2%C5Fflc$0O=;feI5s3MIu))?a~GupT#e=kaN z4{bOKIV6!q8hIp=slb>dlTAALB$QFMvZRz%T6rawSqe#|mR)-JC75A?!ljs(=*T0Q zX;N0Ef@-?i--bVu#HJ=^zIi8}+0fZ$o_&_%<1`&2h{<`Sgch8ii6ZCUk!QAek)mtH zMy5%F;Z#2+CrPJbo%U$8 zp&Fa2bDiy~>RznA`m3z4!YgdK+5n2}p3m01Z*p@L+R4BA_M{YeB%RI9r}K54(8dH6xLB){!4EIoD{p?Y8O_dj2}>vEylX z=&~^m`825at?hKM6!CQN8Pepw`Akg*{UA&5gv=x~4++#q*W7^1(u=5K-%Txs?f z#3>qYh?gj$4CT=}B`T(3Ta2Rr>!>J3=~>YdShQdYF*uqG92p$m%EqsZak@5AEuhux#-1c zd*iE3_rZ|2-{sE=O&VVLb~n0_Ep8q$R9>HASFr=;Z(ZL@(zo5GfE}%_Wf9z11s63T z`aOu|vMXWOQdqqljIcOxsh{6&c*6dbE6xI2;(K}Sj;zYEEg^`KY3 zSXs~ZxW?jo@G-wk+5C-}gJ|Y*n?F3iGcQ*yYToW-J^L0UFL2Fs#xr#38%q18mqmT% za(>>NqGN&`V zX4D$As}xFe7gxmGPB*(gR5q+$bc!@D&1oEUs3)D>+;sPX z>jtfh75G;SLac$e4KI|=r>b?gY=qoC>WyocE!B1+#;ZzqzXi`hiEUNa316JShgj~! zF7xXIuI@sb*zD#+dxhaGULW(w;5N!JQ&q0-e0QGc0RMO6jhYdq-*?&#V$N{Q;p?_=bYyrW$RQOk6eu_zv39PbInbS zYnn@6G09afsjdAksz;s7r%a3Q->vrY$4B`Zwj30@k9;S`oZiQ8zZ4bk#`qV1{yqQy zKmGL|{&9rwuJ{W8kk9%%-J3I30q@ju<@^V67EL>K)(r z@kVL62Hb@qT)+qDSsdO$8aAR_{;eSa`c5@sV=}&<_l+1h0^u@|BKZ)Z4WZ-bz+l%X z+}MQBFgk%Lwv+*>NC56z#6_Vy8lj)mV-wsXt=QN;;$V{5*6snM*a#%ruwy}Hp~-#X zG?87(X$M87BE$V7LyC_&b|FND$^u4OLFJkVdeJj>87RVF#@Gf9_9b|J3w>pKQtE=C!1!kz}X+A{~C^=MbemP9;_9A*9fy4Avxr>6%-< zrBZ_ASngn14&pqeWWIT0C7u=w!r)#C8C(veT=GmnaiqO1rbssCL;hvvOrqisgT`UcHp0SsL4GdXj05&STExCf-{Q zNoH=&&2BEwY&Io04W}3tCjo?}azZ6@I%mJ}<8!`MboOQh1z#H0plJ!FVpgXdT_CE~eIiy)r16E|Ee1vR;U~#lIigyuHQ@u^BnPG>-)WokA?b|bW}opWE>0G6S?LD_ z-qh`40;*alvT0YYn^bD(jHTf7ap_6!8YoIz)>RYEZRvJhniE+8fTX69^Z zEjpjhiJ&#|>9%nopWcaqq8ot{r{_^o^_YW-c4`kIPYE^u=crEMys2uYPUbS2s3^K8 ztGa54dZ>K1YK8h(71nB5!DQN8k#X85263gsRb0W59I?)#$JwSa+F>^m=|)b=MgE~x zM(P(jYk_rVTJB-AqSh0+AIgQCwF#ogv6(Txp*+f=weBOi1|e_O5pUwDg2pGO4e3q7 zXOUv629YT*UI(VJNF%~2YqB3J(yQ?0=xx^MT59Bbvfx3SUjROxI{vCFL8-6~CXPnm z9IoJ`N~*ph+Q$Zti#pgGV&cFyY{8;zpGM-LZtO~)C)BAc@kJ~Rav{a`rF8xiVxnvR z-J#uK9Fh7_aF(oyb&%t&T{VuOt`cV6JsvDxQaASh?AHBGf4ZhKrt2UoqZ?A=;Ss8W zZf)afB#2Ak}5;iBZi_XW)gwhzAfCwt=!Hn-PWz$-Ywqdt={e}-}bHF{w?4J zuHX(X;mWNj{3Y5Z?s3u#<2J72D$L6~uH;TG|JEQ z<{}B{g07Z)F6uIg=+4FIw(gLe?&@BN>dx+wz-~yquIbt??P?G2RtfGx2WG5-?rMUi ztU|!J((hJD?Jlp71g}$^2e%|k@-|cHWbD9gI!ko`8v037fDBuoL{ zu6Pu$k;v`>8_5v}Kmv121P{soR)Yf<2?Ss8kW6p|ql^dRNCrd01`|mKk8q5DumY=a zjFd1koN(;A@COqB1-CE_=dcb#t__E9w(Kwv2eIe&Fb)f`5g#%55^)tY0uwi}6F)H& wN3j%7F%?(w6;QApP;lXHF&B5S7k@Drhp`xsF&URJ;ZiUHr?DEZaR2}SJIqAcBme*a literal 0 HcmV?d00001 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 HcmV?d00001 diff --git a/src/bin/pgaccess/doc/html/index.html b/src/bin/pgaccess/doc/html/index.html new file mode 100644 index 0000000000..7ccda19290 --- /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 0000000000..b678458569 --- /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:

+ +
    +

    You will need:

    + +
      +
    • postgreSQL source (http://www.postgresql.org)
    • + +
    • tcl8.0 source (http://www.tclconsortium.org/)
    • + +
    • tk8.0 source (http://www.tclconsortium.org/)
    • + +
    • pgaccess source (http://www.flex.ro/pgaccess)
    • +
    +
+ +

2) Installation:

+ +

a) tcl/tk:

+ +
    +

    You must first install tcl and then tk (in that order). I just used +./configure, no switches and gmake. Their installation should be trouble +free. Then you must move headers and libraries to the right places so:

    + +

    Header files: both tcl and tk have a header file (tcl.h and tk.h). The +tcl.h file is in $tcl_source_dir/generic and the tk.h file is in $tk_source_dir/generic; +both should be copied to /usr/local/include.

    + +

    Libraries: compilation (with cc) of tcl and tk yield libraries libtcl8.0.a +and libtk8.0.a in $source_dir/unix. Both should be copied to /usr/local/lib.

    +
+ +

b) postgreSQL:

+ +
    +

    Make sure you have a fully patched postgreSQL source. If your ./configure +says it can't load 'IRIX' settings then you most probably will need to +patch ./configure.

    + +

    Configure using ./configure with the following switches: ./configure +--with-includes=/usr/local/include

    + +

    --with-libraries=/usr/local/lib --with-tcl [this and previous line as +one]

    + +

    Then make, make install as usual

    +
+ +

c) Compiling libpgtcl:

+ +
    +

    The source for libpgtcl is in $postgreSQL_directory/src/interfaces/libpgsql.

    + +

    I do this twice. Once with just gmake. This produces a static library +libpgtcl.a which I leave where it is (I don't know what to do with it but +it may just come in handy). The I modify Makefile manually with a text +editor. Essentially I modify two line:

    + +

    before:

    + +

    # Shared library stuff

    + +

    install-shlib-dep := shlib :=

    + +

    after:

    + +

    # Shared library stuff

    + +

    install-shlib-dep := install-shlib shlib := libpgtcl.so.1

    + +

    Then gmake -f Makefile_modified. This creates two shared (.so) libraries: +libpgtcl.so and libpgtcl.so.1. I can't tell the difference between them +so I copied them both to /usr/lib/.

    +
+ +

d) running pgaccess:

+ +
    +

    Uncompress pgaccess (usually with gunzip and tar). So long as 'wish' +(a binary produced when compiling tk8.0) is somewhere in your path, you +should be able to run pgaccess with:

    + +

    wish -f $pgaccess_dir/pgaccess.tcl [postgreSQL_database_name]

    +
+ +

e) et voila!

+ +

3) Concluding remarks:

+ +
    +

    As I stated at the start of this document, following the procedure indicated +above worked for me. I am sure, however, that a few of the steps are unnecessary/non-optimised/stupid +etc. If any Unix (IRIX) boffin is reading this and you spot anything you +would like to comment/correct etc. please e-mail me (stuart@ludwig.ucl.ac.uk). +Also, if you just have questions and think I might help, please contact +me at the same e-mail.

    + +

    Finally, I can accept no responsibility if these steps don't work for +you or if it all goes horribly wrong and you 'damage' your computer trying +them. Let common sense prevail!

    +
+ +

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 zcmZ?wbhEHbj9`#wXklRZ4+Lk<{GU1VKZEfZAV^C)V{Ci|$Yx-e2?WN*GZ}!0Aq@nK z(-?q=!59P>j2S>IAb}q!{*!mARPatM%gj^oC{52uE!I)U2Jtc+QZq~RlJj#JbU-G6 zoa4ayUqP`iC39ZJs&zT5&0JhnN<>wYgLn=HJ?wO2b<235B+8&$G~0B_;f{&dIy!_- zv`u7HUYB4Lb*OFkJH8%y#?HMLyB^-0Q6%7P3^P7^eyXeM+d&$MFB$jbBH>gnz4XzXlJm6Wq; zZM~j-)QJ-wK4xc9EYIYHieB+K8Fek>`uw^D`Kr+qs#TMk@3%e=chFn2VBySnA3wg; zEZk7bDJ;w{V0NPQ)Vf&DwAE}YZJf82WGB9#IWsb|A;7ajC0ts;;Mjo)o0hY=2Yd-I z=_yrPw5UmR>i?LMOWKboDGvZJ|n8Q4FbvwynLrz2Nbwx!&9JVrG5% z^lGm8OQ|L5ObQQDpNlUD+1lXtEi-}PU_)JVBul4ObKhin|AVS^s%DMNoT3Uo3I(e! z%4eOva&%elO3j** + + + + + + + +

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 0000000000..2bddfd61d4 --- /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 HcmV?d00001 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 HcmV?d00001 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 0000000000..4bbf11fcf0 --- /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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 VRT_F`GxQ>22v|DAL_-1)`#-H=0h9m$ literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/doc/html/pg93patch.html b/src/bin/pgaccess/doc/html/pg93patch.html new file mode 100644 index 0000000000..4c77bfac61 --- /dev/null +++ b/src/bin/pgaccess/doc/html/pg93patch.html @@ -0,0 +1,25 @@ + + + + + + + + +

    +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 0000000000..7564cf7b55 --- /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 0000000000..b990c0f15c --- /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 0000000000..9d086a3390 --- /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 0000000000..0cf3ac6b65 --- /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 0000000000..b6b82f2336 --- /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 0000000000..f19b61ab90 --- /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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 literal 0 HcmV?d00001 diff --git a/src/bin/pgaccess/doc/html/whatsnew.html b/src/bin/pgaccess/doc/html/whatsnew.html new file mode 100644 index 0000000000..f2faede015 --- /dev/null +++ b/src/bin/pgaccess/doc/html/whatsnew.html @@ -0,0 +1,50 @@ + + + + + + + +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 0000000000..368eb9990e --- /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 0000000000..828baf0992 --- /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 0000000000..631c3537c7 --- /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 0000000000..96e4860592 --- /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 0000000000..87f65703f8 --- /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 0000000000..b4379a4f83 --- /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 0000000000..c752e03ba4 --- /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 0000000000..4db7a0148d --- /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 0000000000..b25ec70ac1 --- /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 0000000000..c526ca9b56 --- /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 0000000000..d3e40ef136 --- /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 0000000000..0302e1fec1 --- /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 0000000000..834eaab22c --- /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 0000000000..857231236f --- /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 0000000000..18204e0f72 --- /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 0000000000..dc520a5b74 --- /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 0000000000..dc4189efc9 --- /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 0000000000..1a3d84e7eb --- /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 0000000000..41fd5cae16 --- /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.50.1