source: tags/arb-6.0/AWT/AWT_tables.cxx

Last change on this file was 11968, checked in by westram, 10 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.3 KB
Line 
1// ================================================================ //
2//                                                                  //
3//   File      : AWT_tables.cxx                                     //
4//   Purpose   :                                                    //
5//                                                                  //
6//   Institute of Microbiology (Technical University Munich)        //
7//   http://www.arb-home.de/                                        //
8//                                                                  //
9// ================================================================ //
10
11#include "awt.hxx"
12#include "awtlocal.hxx"
13#include "awt_sel_boxes.hxx"
14
15#include <aw_awar.hxx>
16#include <aw_file.hxx>
17#include <aw_msg.hxx>
18#include <aw_root.hxx>
19
20#include <arbdbt.h>
21
22static void ad_table_field_reorder_cb(AW_window *aws, awt_table *awtt) {
23    char *source = aws->get_root()->awar(awtt->awar_field_reorder_source)->read_string();
24    char *dest   = aws->get_root()->awar(awtt->awar_field_reorder_dest)  ->read_string();
25
26    GB_ERROR  error    = GB_begin_transaction(awtt->gb_main);
27    GBDATA   *gb_table = NULL;
28   
29    if (!error) {
30        gb_table = GBT_open_table(awtt->gb_main, awtt->table_name, true);
31        if (!gb_table) error = GBS_global_string("Table '%s' does not exist", awtt->table_name);
32    }
33
34    if (!error) {
35        GBDATA *gb_source = GBT_find_table_field(gb_table, source);
36        GBDATA *gb_dest   = GBT_find_table_field(gb_table, dest);
37
38        if (!gb_source || !gb_dest) error    = "Please select two valid fields";
39        else if (gb_dest == gb_source) error = "Please select two different fields";
40        else {
41            GBDATA *gb_fields = GB_get_father(gb_source);
42            int     nitems    = 0;
43
44            for (GBDATA *gb_cnt=GB_child(gb_fields); gb_cnt; gb_cnt = GB_nextChild(gb_cnt)) {
45                nitems++;
46            }
47
48            GBDATA **new_order = new GBDATA *[nitems];
49            nitems             = 0;
50            for (GBDATA *gb_cnt=GB_child(gb_fields); gb_cnt; gb_cnt = GB_nextChild(gb_cnt)) {
51                if (gb_cnt != gb_source) {
52                    new_order[nitems++] = gb_cnt;
53                    if (gb_cnt == gb_dest) {
54                        new_order[nitems++] = gb_source;
55                    }
56                }
57            }
58            GB_ERROR warning = GB_resort_data_base(awtt->gb_main, new_order, nitems);
59            if (warning) aw_message(warning);
60
61            delete [] new_order;
62        }
63    }
64
65    GB_end_transaction_show_error(awtt->gb_main, error, aw_message);
66
67    free(dest);
68    free(source);
69}
70
71static AW_window *create_ad_table_field_reorder_window(AW_root *root, awt_table *awtt)
72{
73    AW_window_simple *aws = new AW_window_simple;
74    aws->init(root, "REORDER_FIELDS", "REORDER FIELDS");
75    aws->load_xfig("ad_kreo.fig");
76
77    aws->callback((AW_CB0)AW_POPDOWN);
78    aws->at("close");
79    aws->create_button("CLOSE", "CLOSE", "C");
80
81    aws->callback(makeHelpCallback("spaf_reorder.hlp"));
82    aws->at("help");
83    aws->create_button("HELP", "HELP", "H");
84
85    aws->at("doit");
86    aws->button_length(0);
87    aws->callback((AW_CB1)ad_table_field_reorder_cb, (AW_CL)awtt);
88    aws->help_text("spaf_reorder.hlp");
89    aws->create_button("MOVE_TO_NEW_POSITION", "MOVE  SELECTED LEFT  ITEM\nAFTER SELECTED RIGHT ITEM", "P");
90
91    aws->at("source");
92    awt_create_selection_list_on_table_fields(awtt->gb_main, aws, awtt->table_name, awtt->awar_field_reorder_source);
93
94    aws->at("dest");
95    awt_create_selection_list_on_table_fields(awtt->gb_main, aws, awtt->table_name, awtt->awar_field_reorder_dest);
96
97    return (AW_window *)aws;
98}
99
100static void awt_table_field_hide_cb(AW_window *aws, awt_table *awtt) {
101    GB_begin_transaction(awtt->gb_main);
102    GB_ERROR  error    = 0;
103    GBDATA   *gb_table = GBT_open_table(awtt->gb_main, awtt->table_name, true);
104
105    if (!gb_table) {
106        error = GBS_global_string("Table '%s' does not exist", awtt->table_name);
107    }
108    else {
109        char   *source    = aws->get_root()->awar(awtt->awar_selected_field)->read_string();
110        GBDATA *gb_source = GBT_find_table_field(gb_table, source);
111
112        if (!gb_source) error = "Please select an item you want to delete";
113        else error            = GB_delete(gb_source);
114
115        free(source);
116    }
117    GB_end_transaction_show_error(awtt->gb_main, error, aw_message);
118}
119
120static void awt_table_field_delete_cb(AW_window *aws, awt_table *awtt) {
121    GB_begin_transaction(awtt->gb_main);
122
123    GB_ERROR  error    = 0;
124    GBDATA   *gb_table = GBT_open_table(awtt->gb_main, awtt->table_name, true);
125    if (!gb_table) {
126        error = GBS_global_string("Table '%s' does not exist", awtt->table_name);
127    }
128    else {
129        char   *source    = aws->get_root()->awar(awtt->awar_selected_field)->read_string();
130        GBDATA *gb_source = GBT_find_table_field(gb_table, source);
131
132        if (!gb_source) error = "Please select an item you want to delete";
133        else error            = GB_delete(gb_source);
134
135        for (GBDATA *gb_table_entry = GBT_first_table_entry(gb_table);
136             gb_table_entry && !error;
137             gb_table_entry = GBT_next_table_entry(gb_table_entry))
138        {
139            GBDATA *gb_table_entry_field;
140            while (!error && (gb_table_entry_field = GB_search(gb_table_entry, source, GB_FIND))) {
141                error = GB_delete(gb_table_entry_field);
142            }
143        }
144        free(source);
145    }
146
147    GB_end_transaction_show_error(awtt->gb_main, error, aw_message);
148}
149
150
151static void ad_table_field_create_cb(AW_window *aws, awt_table *awtt) {
152    GB_push_transaction(awtt->gb_main);
153    char *name = aws->get_root()->awar(awtt->awar_field_new_name)->read_string();
154    GB_ERROR error = GB_check_key(name);
155    GB_ERROR error2 = GB_check_hkey(name);
156    if (error && !error2) {
157        aw_message("Warning: Your key contain a '/' character,\n"
158                   "    that means it is a hierarchical key");
159        error = 0;
160    }
161    GBDATA *gb_table = GBT_open_table(awtt->gb_main, awtt->table_name, true);
162    if (gb_table) {
163        GB_TYPES type = (GB_TYPES)aws->get_root()->awar(awtt->awar_field_new_type)->read_int();
164        if (!error) {
165            GBDATA *gb_table_field = GBT_open_table_field(gb_table, name, type);
166            if (!gb_table_field) error = GB_await_error();
167        }
168    }
169    else {
170        error = GBS_global_string("Table '%s' does not exist", awtt->table_name);
171    }
172    aws->hide_or_notify(error);
173
174    free(name);
175    GB_pop_transaction(awtt->gb_main);
176}
177
178static AW_window *create_ad_table_field_create_window(AW_root *root, awt_table *awtt) {
179    static AW_window_simple *aws = new AW_window_simple;
180    aws->init(root, "CREATE_FIELD", "CREATE A NEW FIELD");
181    aws->load_xfig("ad_fcrea.fig");
182
183    aws->callback((AW_CB0)AW_POPDOWN);
184    aws->at("close");
185    aws->create_button("CLOSE", "CLOSE", "C");
186
187
188    aws->at("input");
189    aws->label("FIELD NAME");
190    aws->create_input_field(awtt->awar_field_new_name, 15);
191
192    aws->at("type");
193    aws->create_toggle_field(awtt->awar_field_new_type, "FIELD TYPE", "F");
194    aws->insert_toggle("Ascii Text", "S",       (int)GB_STRING);
195    aws->insert_toggle("Link", "L",         (int)GB_LINK);
196    aws->insert_toggle("Rounded Numerical", "N", (int)GB_INT);
197    aws->insert_toggle("Numerical", "R",    (int)GB_FLOAT);
198    aws->insert_toggle("MASK = 01 Text", "0",   (int)GB_BITS);
199    aws->update_toggle_field();
200
201
202    aws->at("ok");
203    aws->callback((AW_CB1)ad_table_field_create_cb, (AW_CL)awtt);
204    aws->create_button("CREATE", "CREATE", "C");
205
206    return (AW_window *)aws;
207}
208
209awt_table::awt_table(GBDATA *igb_main, AW_root *awr, const char *itable_name) {
210    gb_main    = igb_main;
211    GB_transaction tscope(gb_main);
212    table_name = strdup(itable_name);
213
214    char *tname = GBS_string_2_key(table_name);
215   
216    awar_field_reorder_source = GBS_global_string_copy(AWAR_TABLE_FIELD_REORDER_SOURCE_TEMPLATE, tname);
217    awar_field_reorder_dest   = GBS_global_string_copy(AWAR_TABLE_FIELD_REORDER_DEST_TEMPLATE, tname);
218    awar_field_rem            = GBS_global_string_copy(AWAR_TABLE_FIELD_REM_TEMPLATE, tname);
219    awar_field_new_name       = GBS_global_string_copy(AWAR_TABLE_FIELD_NEW_NAME_TEMPLATE, tname);
220    awar_field_new_type       = GBS_global_string_copy(AWAR_TABLE_FIELD_NEW_TYPE_TEMPLATE, tname);
221    awar_selected_field       = GBS_global_string_copy(AWAR_TABLE_SELECTED_FIELD_TEMPLATE, tname);
222
223    awr->awar_string(awar_field_reorder_source, "");
224    awr->awar_string(awar_field_reorder_dest, "");
225    awr->awar_string(awar_field_new_name, "");
226    awr->awar_int(awar_field_new_type, GB_STRING);
227    awr->awar_string(awar_field_rem, "No comment");
228    awr->awar_string(awar_selected_field, "");
229
230    free(tname);
231}
232
233awt_table::~awt_table() {
234    free(table_name);
235    free(awar_field_reorder_source);
236    free(awar_field_reorder_dest);
237    free(awar_field_new_name);
238    free(awar_field_rem);
239    free(awar_selected_field);
240}
241
242static void   awt_map_table_field_rem(AW_root *aw_root, awt_table *awtt) {
243    GB_transaction tscope(awtt->gb_main);
244    GBDATA *gb_table = GBT_open_table(awtt->gb_main, awtt->table_name, true);
245    if (!gb_table) {
246        aw_root->awar(awtt->awar_field_rem)->unmap();
247        return;
248    }
249    char *field_name  = aw_root->awar(awtt->awar_selected_field)->read_string();
250    GBDATA *gb_table_field = GBT_find_table_field(gb_table, field_name);
251    if (!gb_table_field) {
252        delete field_name;
253        aw_root->awar(awtt->awar_field_rem)->unmap();
254        return;
255    }
256    GBDATA *gb_desc = GB_search(gb_table_field, "description", GB_STRING);
257    aw_root->awar(awtt->awar_field_rem)->map(gb_desc);
258}
259
260static void create_ad_table_field_admin(AW_window *aww, GBDATA *gb_main, const char *tname) {
261    static GB_HASH *table_to_win_hash = GBS_create_hash(256, GB_MIND_CASE);
262    AW_root        *aw_root           = aww->get_root();
263    char           *table_name;
264    if (tname) {
265        table_name = strdup(tname);
266    }
267    else {
268        table_name = aw_root->awar(AWAR_TABLE_NAME)->read_string();
269    }
270
271    AW_window_simple *aws = (AW_window_simple *)GBS_read_hash(table_to_win_hash, table_name);
272    if (!aws) {
273        awt_table *awtt = new awt_table(gb_main, aw_root, table_name);
274        aws = new AW_window_simple;
275        const char *table_header = GBS_global_string("TABLE_ADMIN_%s", table_name);
276        aws->init(aw_root, table_header, table_header);
277
278        aws->load_xfig("ad_table_fields.fig");
279
280        aws->callback(AW_POPDOWN);
281        aws->at("close");
282        aws->create_button("CLOSE", "CLOSE", "C");
283
284        aws->callback(makeHelpCallback("tableadm.hlp"));
285        aws->at("help");
286        aws->create_button("HELP", "HELP", "H");
287
288        aws->at("table_name");
289        aws->create_button(NULL, table_name, "A");
290
291        aws->button_length(13);
292
293        aws->at("delete");
294        aws->callback((AW_CB1)awt_table_field_delete_cb, (AW_CL)awtt);
295        aws->create_button("DELETE", "DELETE", "D");
296
297        aws->at("hide");
298        aws->callback((AW_CB1)awt_table_field_hide_cb, (AW_CL)awtt);
299        aws->create_button("HIDE", "HIDE", "D");
300
301        aws->at("create");
302        aws->callback(AW_POPUP, (AW_CL)create_ad_table_field_create_window, (AW_CL)awtt);
303        aws->create_button("CREATE", "CREATE", "C");
304
305        aws->at("reorder");
306        aws->callback(AW_POPUP, (AW_CL)create_ad_table_field_reorder_window, (AW_CL)awtt);
307        aws->create_button("REORDER", "REORDER", "R");
308
309        aws->at("list");
310        awt_create_selection_list_on_table_fields(gb_main, (AW_window *)aws, table_name, awtt->awar_selected_field);
311
312        aws->at("rem");
313        aws->create_text_field(awtt->awar_field_rem);
314
315        awt_map_table_field_rem(aw_root, awtt);
316        aw_root->awar(awtt->awar_selected_field)->add_callback((AW_RCB1)awt_map_table_field_rem, (AW_CL)awtt);
317    }
318
319    aws->activate();
320    free(table_name);
321}
322
323// --------------------
324//      table admin
325
326
327// #define AWAR_TABLE_IMPORT "tmp/ad_table/import_table"
328
329static void table_vars_callback(AW_root *aw_root, GBDATA *gb_main)     // Map table vars to display objects
330{
331    GB_push_transaction(gb_main);
332    char *tablename = aw_root->awar(AWAR_TABLE_NAME)->read_string();
333    GBDATA *gb_table = GBT_open_table(gb_main, tablename, true);
334    if (!gb_table) {
335        aw_root->awar(AWAR_TABLE_REM)->unmap();
336    }
337    else {
338        GBDATA *table_rem = GB_search(gb_table, "description",  GB_STRING);
339        aw_root->awar(AWAR_TABLE_REM)->map(table_rem);
340    }
341    char *fname = GBS_string_eval(tablename, "*=*1.table:table_*=*1", 0);
342    aw_root->awar(AWAR_TABLE_EXPORT "/file_name")->write_string(fname); // create default file name
343    delete fname;
344    GB_pop_transaction(gb_main);
345    free(tablename);
346}
347
348
349
350static void table_rename_cb(AW_window *aww, GBDATA *gb_main) {
351    GB_ERROR  error  = 0;
352    char     *source = aww->get_root()->awar(AWAR_TABLE_NAME)->read_string();
353    char     *dest   = aww->get_root()->awar(AWAR_TABLE_DEST)->read_string();
354
355    GB_begin_transaction(gb_main);
356    GBDATA *gb_table_dest = GBT_open_table(gb_main, dest, true);
357    if (gb_table_dest) {
358        error = "Table already exists";
359    }
360    else {
361        GBDATA *gb_table = GBT_open_table(gb_main, source, true);
362        if (gb_table) {
363            GBDATA *gb_name = GB_search(gb_table, "name", GB_STRING);
364
365            if (!gb_name) error = GB_await_error();
366            else error          = GB_write_string(gb_name, dest);
367        }
368    }
369    GB_end_transaction_show_error(gb_main, error, aw_message);
370
371    free(source);
372    free(dest);
373}
374
375static void table_copy_cb(AW_window *aww, GBDATA *gb_main) {
376    GB_ERROR  error  = 0;
377    char     *source = aww->get_root()->awar(AWAR_TABLE_NAME)->read_string();
378    char     *dest   = aww->get_root()->awar(AWAR_TABLE_DEST)->read_string();
379
380    GB_begin_transaction(gb_main);
381    GBDATA *gb_table_dest = GBT_open_table(gb_main, dest, true);
382    if (gb_table_dest) {
383        error = "Table already exists";
384    }
385    else {
386        GBDATA *gb_table = GBT_open_table(gb_main, source, true);
387        if (gb_table) {
388            GBDATA *gb_table_data = GB_entry(gb_main, "table_data");
389            gb_table_dest = GB_create_container(gb_table_data, "table");
390            error = GB_copy(gb_table_dest, gb_table);
391            if (!error) {
392                GBDATA *gb_name = GB_search(gb_table_dest, "name", GB_STRING);
393                error = GB_write_string(gb_name, dest);
394            }
395        }
396    }
397    GB_end_transaction_show_error(gb_main, error, aw_message);
398
399    free(source);
400    free(dest);
401}
402static void table_create_cb(AW_window *aww, GBDATA *gb_main) {
403    char     *dest  = aww->get_root()->awar(AWAR_TABLE_DEST)->read_string();
404    GB_ERROR  error = GB_begin_transaction(gb_main);
405    if (!error) {
406        error = GB_check_key(dest);
407        if (!error) {
408            GBDATA *gb_table     = GBT_open_table(gb_main, dest, false);
409            if (!gb_table) error = GB_await_error();
410        }
411    }
412    error = GB_end_transaction(gb_main, error);
413    aww->hide_or_notify(error);
414    free(dest);
415}
416
417static AW_window *create_table_rename_window(AW_root *root, GBDATA *gb_main)
418{
419    AW_window_simple *aws = new AW_window_simple;
420    aws->init(root, "RENAME_TABLE", "TABLE RENAME");
421    aws->load_xfig("ad_al_si.fig");
422
423    aws->callback((AW_CB0)AW_POPDOWN);
424    aws->at("close");
425    aws->create_button("CLOSE", "CLOSE", "C");
426
427    aws->at("label");
428    aws->create_autosize_button(0, "Please enter the new name\nof the table");
429
430    aws->at("input");
431    aws->create_input_field(AWAR_TABLE_DEST, 15);
432
433    aws->at("ok");
434    aws->callback((AW_CB1)table_rename_cb, (AW_CL)gb_main);
435    aws->create_button("GO", "GO", "G");
436
437    return (AW_window *)aws;
438}
439
440static AW_window *create_table_copy_window(AW_root *root, GBDATA *gb_main)
441{
442    AW_window_simple *aws = new AW_window_simple;
443    aws->init(root, "COPY_TABLE", "TABLE COPY");
444    aws->load_xfig("ad_al_si.fig");
445
446    aws->callback((AW_CB0)AW_POPDOWN);
447    aws->at("close");
448    aws->create_button("CLOSE", "CLOSE", "C");
449
450    aws->at("label");
451    aws->create_autosize_button(0, "Please enter the name\nof the new table");
452
453    aws->at("input");
454    aws->create_input_field(AWAR_TABLE_DEST, 15);
455
456    aws->at("ok");
457    aws->callback((AW_CB1)table_copy_cb, (AW_CL)gb_main);
458    aws->create_button("GO", "GO", "G");
459
460    return (AW_window *)aws;
461}
462static AW_window *create_table_create_window(AW_root *root, GBDATA *gb_main)
463{
464    AW_window_simple *aws = new AW_window_simple;
465    aws->init(root, "CREATE_TABLE", "TABLE CREATE");
466    aws->load_xfig("ad_al_si.fig");
467
468    aws->callback((AW_CB0)AW_POPDOWN);
469    aws->at("close");
470    aws->create_button("CLOSE", "CLOSE", "C");
471
472    aws->at("label");
473    aws->create_autosize_button(0, "Please enter the name\nof the new table");
474
475    aws->at("input");
476    aws->create_input_field(AWAR_TABLE_DEST, 15);
477
478    aws->at("ok");
479    aws->callback((AW_CB1)table_create_cb, (AW_CL)gb_main);
480    aws->create_button("GO", "GO", "G");
481
482    return (AW_window *)aws;
483}
484static void awt_table_delete_cb(AW_window *aww, GBDATA *gb_main) {
485    GB_ERROR  error  = 0;
486    char     *source = aww->get_root()->awar(AWAR_TABLE_NAME)->read_string();
487
488    GB_begin_transaction(gb_main);
489    GBDATA *gb_table = GBT_open_table(gb_main, source, true);
490    if (gb_table) {
491        error = GB_delete(gb_table);
492    }
493    else {
494        error = "Please select a table first";
495    }
496    GB_end_transaction_show_error(gb_main, error, aw_message);
497
498    free(source);
499}
500
501static void create_tables_var(GBDATA *gb_main, AW_root *aw_root) {
502    aw_root->awar_string(AWAR_TABLE_NAME);
503    aw_root->awar_string(AWAR_TABLE_DEST);
504    aw_root->awar_string(AWAR_TABLE_REM, "no rem");
505
506    AW_create_fileselection_awars(aw_root, AWAR_TABLE_EXPORT, "", "table", "tablefile");
507    AW_create_fileselection_awars(aw_root, AWAR_TABLE_IMPORT, "", "table", "tablefile");
508
509    aw_root->awar_string(AWAR_TABLE_IMPORT "/table_name", "table_");
510
511    aw_root->awar(AWAR_TABLE_NAME)->add_callback((AW_RCB1)table_vars_callback, (AW_CL)gb_main);
512    table_vars_callback(aw_root, gb_main);
513}
514
515AW_window *AWT_create_tables_admin_window(AW_root *aw_root, GBDATA *gb_main)
516{
517    static AW_window_simple *aws = 0;
518
519    if (aws) return aws;
520    GB_transaction tscope(gb_main);
521    create_tables_var(gb_main, aw_root);
522
523    aws = new AW_window_simple;
524    aws->init(aw_root, "TABLE_ADMIN", "TABLE ADMIN");
525    aws->load_xfig("ad_table_admin.fig");
526
527    aws->callback(AW_POPDOWN);
528    aws->at("close");
529    aws->create_button("CLOSE", "CLOSE", "C");
530
531    aws->callback(makeHelpCallback("tableadm.hlp"));
532    aws->at("help");
533    aws->create_button("HELP", "HELP", "H");
534
535    aws->button_length(13);
536
537    aws->at("delete");
538    aws->callback((AW_CB1)awt_table_delete_cb, (AW_CL)gb_main);
539    aws->create_button("DELETE", "DELETE", "D");
540
541    aws->at("rename");
542    aws->callback(AW_POPUP, (AW_CL)create_table_rename_window, (AW_CL)gb_main);
543    aws->create_button("RENAME", "RENAME", "R");
544
545    aws->at("copy");
546    aws->callback(AW_POPUP, (AW_CL)create_table_copy_window, (AW_CL)gb_main);
547    aws->create_button("COPY", "COPY", "C");
548
549    aws->at("cmp");
550    aws->callback(AW_POPUP, (AW_CL)create_table_create_window, (AW_CL)gb_main);
551    aws->create_button("CREATE", "CREATE", "C");
552
553    aws->at("export");
554    aws->callback((AW_CB)create_ad_table_field_admin, (AW_CL)gb_main, 0);
555    aws->create_button("ADMIN", "ADMIN", "C");
556
557    aws->at("list");
558    awt_create_selection_list_on_tables(gb_main, (AW_window *)aws, AWAR_TABLE_NAME);
559
560    aws->at("rem");
561    aws->create_text_field(AWAR_TABLE_REM);
562
563    return (AW_window *)aws;
564}
Note: See TracBrowser for help on using the repository browser.