source: branches/port5/AWT/AWT_sel_boxes.cxx

Last change on this file was 6143, checked in by westram, 15 years ago
  • backport [6141] (parts changing code, but only strings and comments)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.7 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <time.h>
5#include <string.h>
6// #include <malloc.h>
7#include <memory.h>
8#include <sys/stat.h>
9
10#include <arbdb.h>
11#include <arbdbt.h>
12#include <ad_config.h>
13#include <aw_root.hxx>
14#include <aw_device.hxx>
15#include <aw_window.hxx>
16#include <aw_awars.hxx>
17#include <aw_global.hxx>
18#include "awt.hxx"
19#include "awtlocal.hxx"
20#include "awt_sel_boxes.hxx"
21#include "awt_item_sel_list.hxx"
22
23// ******************** selection boxes on alignments ********************
24
25static void awt_create_selection_list_on_ad_cb(GBDATA *, struct adawcbstruct *cbs) {
26    cbs->aws->clear_selection_list(cbs->id);
27
28    for (GBDATA * gb_alignment = GB_search(cbs->gb_main, "presets/alignment", GB_FIND);
29         gb_alignment;
30         gb_alignment = GB_nextEntry(gb_alignment))
31    {
32        char *alignment_type = GBT_read_string(gb_alignment, "alignment_type");
33        char *alignment_name = GBT_read_string(gb_alignment, "alignment_name");
34        char *str            = GBS_string_eval(alignment_type, cbs->comm, 0);
35
36        if (!*str) {
37            cbs->aws->insert_selection(cbs->id, alignment_name, alignment_name);
38        }
39        free(str);
40        free(alignment_type);
41        free(alignment_name);
42    }
43    cbs->aws->insert_default_selection(cbs->id, "????", "????");
44    cbs->aws->update_selection_list(cbs->id);
45}
46
47
48void awt_create_selection_list_on_ad(GBDATA *gb_main,AW_window *aws, const char *varname,const char *comm)
49// if comm is set then only those alignments are taken
50// which can be parsed by comm
51{
52    AW_selection_list *id;
53    GBDATA            *gb_presets;
54
55    GB_push_transaction(gb_main);
56
57    id  = aws->create_selection_list(varname,0,"",20,3);
58    struct adawcbstruct *cbs = new adawcbstruct;
59    memset(cbs, 0, sizeof(*cbs));
60
61    cbs->aws     = aws;
62    cbs->awr     = aws->get_root();
63    cbs->gb_main = gb_main;
64    cbs->id      = id;
65    cbs->comm    = 0; if (comm) cbs->comm = strdup(comm);
66
67    awt_create_selection_list_on_ad_cb(0,cbs);
68
69    gb_presets = GB_search(gb_main,"presets",GB_CREATE_CONTAINER);
70    GB_add_callback(gb_presets,GB_CB_CHANGED, (GB_CB)awt_create_selection_list_on_ad_cb, (int *)cbs);
71
72    GB_pop_transaction(gb_main);
73}
74
75
76// ******************** selection boxes on trees ********************
77
78void awt_create_selection_list_on_trees_cb(GBDATA *dummy, struct adawcbstruct *cbs) {
79    AWUSE(dummy);
80
81    cbs->aws->clear_selection_list(cbs->id);
82    char **tree_names = GBT_get_tree_names(cbs->gb_main);
83    if (tree_names) {
84        int maxTreeNameLen = 0;
85        for (char **tree= tree_names ; *tree; tree++){
86            int len = strlen(*tree);
87            if (len>maxTreeNameLen) maxTreeNameLen = len;
88        }
89        for (char **tree= tree_names ; *tree; tree++){
90            const char *info = GBT_tree_info_string(cbs->gb_main, *tree, maxTreeNameLen);
91            if (info) {
92                cbs->aws->insert_selection( cbs->id, info, *tree );
93            } else {
94                cbs->aws->insert_selection( cbs->id, *tree, *tree );
95            }
96        }
97        GBT_free_names(tree_names);
98    }
99    cbs->aws->insert_default_selection( cbs->id, "????", "????" );
100    cbs->aws->update_selection_list( cbs->id );
101}
102
103void awt_create_selection_list_on_trees(GBDATA *gb_main,AW_window *aws,const char *varname) {
104    AW_selection_list *id;
105    GBDATA            *gb_tree_data;
106   
107    GB_push_transaction(gb_main);
108
109    id = aws->create_selection_list(varname,0,"",40,4);
110    struct adawcbstruct *cbs = new adawcbstruct;
111    memset(cbs, 0, sizeof(*cbs));
112
113    cbs->aws     = aws;
114    cbs->awr     = aws->get_root();
115    cbs->gb_main = gb_main;
116    cbs->id      = id;
117
118    awt_create_selection_list_on_trees_cb(0,cbs);
119
120    gb_tree_data = GB_search(gb_main,"tree_data",GB_CREATE_CONTAINER);
121    GB_add_callback(gb_tree_data,GB_CB_CHANGED, (GB_CB)awt_create_selection_list_on_trees_cb, (int *)cbs);
122
123    GB_pop_transaction(gb_main);
124}
125
126// ******************** selection boxes on pt-servers ********************
127
128#define PT_SERVERNAME_LENGTH        23 // that's for buttons
129#define PT_SERVERNAME_SELLIST_WIDTH 30 // this for lists
130#define PT_SERVER_TRACKLOG_TIMER    10000 // every 10 seconds
131
132struct selection_list_handle {
133    AW_window                    *aws;
134    AW_selection_list            *sellst;
135    struct selection_list_handle *next;
136};
137
138static selection_list_handle *allPTserverSellists = 0; // all pt server selection lists
139
140static void fill_pt_server_selection_list(AW_window *aws, AW_selection_list *id) {
141    aws->clear_selection_list(id);
142
143    const char * const *pt_servers = GBS_get_arb_tcp_entries("ARB_PT_SERVER*");
144
145    int count = 0;
146    while (pt_servers[count]) count++;
147
148    for (int i=0; i<count; i++) {
149        char *choice = GBS_ptserver_id_to_choice(i, 1);
150        if (!choice) {
151            aw_message(GB_await_error());
152            break;
153        }
154        aws->insert_selection(id,choice,(long)i);
155        free(choice);
156    }
157
158    aws->insert_default_selection(id, "-undefined-", (long)-1);
159    aws->update_selection_list(id);
160}
161
162void awt_refresh_all_pt_server_selection_lists() {
163    // refresh content of all PT_server selection lists
164    selection_list_handle *serverList = allPTserverSellists;
165
166    while (serverList) {
167        fill_pt_server_selection_list(serverList->aws, serverList->sellst);
168        serverList = serverList->next;
169    }
170}
171
172static void track_log_cb(AW_root *awr) {
173    static long  last_ptserverlog_mod = 0;
174    const char  *ptserverlog          = GBS_ptserver_logname();
175    long         ptserverlog_mod      = GB_time_of_file(ptserverlog);
176
177    if (ptserverlog_mod != last_ptserverlog_mod) {
178#if defined(DEBUG)
179        fprintf(stderr, "%s modified!\n", ptserverlog);
180#endif // DEBUG
181        awt_refresh_all_pt_server_selection_lists();
182        last_ptserverlog_mod = ptserverlog_mod;
183    }
184
185    awr->add_timed_callback(PT_SERVER_TRACKLOG_TIMER, track_log_cb);
186}
187
188static void announce_pt_server_selection_list(AW_window *aws, AW_selection_list *id) {
189#if defined(DEBUG)
190    selection_list_handle *serverList = allPTserverSellists;
191    while (serverList) {
192        awt_assert(aws != serverList->aws || id != serverList->sellst); // oops - added twice
193        serverList = serverList->next;
194    }
195#endif // DEBUG
196
197    if (!allPTserverSellists) { // first pt server selection list -> install log tracker
198        aws->get_root()->add_timed_callback(PT_SERVER_TRACKLOG_TIMER, track_log_cb);
199    }
200
201    selection_list_handle *newServerList = (selection_list_handle *)malloc(sizeof(*newServerList));
202
203    newServerList->aws    = aws;
204    newServerList->sellst = id;
205    newServerList->next   = allPTserverSellists;
206
207    allPTserverSellists = newServerList;
208}
209
210// --------------------------------------------------------------------------------
211
212static char *readable_pt_servername(int index, int maxlength) {
213    char *fullname = GBS_ptserver_id_to_choice(index, 0);
214    if (!fullname) {
215#ifdef DEBUG
216      printf("awar given to awt_create_selection_list_on_pt_servers() does not contain a valid index\n");
217#endif
218      //        awt_assert(0); // awar given to awt_create_selection_list_on_pt_servers() does not contain a valid index
219        return strdup("-undefined-");
220    }
221
222    int len = strlen(fullname);
223    if (len <= maxlength) {
224        return fullname;
225    }
226
227    int remove  = len-maxlength;
228    fullname[0] = '.';
229    fullname[1] = '.';
230    strcpy(fullname+2, fullname+2+remove);
231
232    return fullname;
233}
234
235static void update_ptserver_button(AW_root *aw_root, AW_CL cl_varname) {
236    const char *varname              = (const char *)cl_varname;
237    char       *awar_buttontext_name = GBS_global_string_copy("/tmp/%s_BUTTON", varname);
238    char       *readable_name        = readable_pt_servername(aw_root->awar(varname)->read_int(), PT_SERVERNAME_LENGTH);
239
240    aw_root->awar(awar_buttontext_name)->write_string(readable_name);
241
242    free(readable_name);
243    free(awar_buttontext_name);
244}
245
246AW_window *awt_popup_selection_list_on_pt_servers(AW_root *aw_root, const char *varname) {
247    AW_window_simple *aw_popup = new AW_window_simple;
248
249    aw_popup->init(aw_root, "SELECT_PT_SERVER", "Select a PT-Server");
250    aw_popup->auto_space(10, 10);
251
252    aw_popup->at_newline();
253    aw_popup->callback((AW_CB0)AW_POPDOWN);
254    AW_selection_list *id = aw_popup->create_selection_list(varname, 0, "", PT_SERVERNAME_SELLIST_WIDTH, 20);
255
256    aw_popup->at_newline();
257    aw_popup->callback((AW_CB0)AW_POPDOWN);
258    aw_popup->create_button("CLOSE", "CLOSE", "C");
259
260    aw_popup->window_fit();
261
262    announce_pt_server_selection_list(aw_popup, id);
263    fill_pt_server_selection_list(aw_popup, id);
264
265    return aw_popup;
266}
267
268void awt_create_selection_list_on_pt_servers(AW_window *aws, const char *varname, bool popup)
269{
270    if (popup) {
271        AW_root *aw_root              = aws->get_root();
272        char    *awar_buttontext_name = GBS_global_string_copy("/tmp/%s_BUTTON", varname);
273        int      ptserver_index       = aw_root->awar(varname)->read_int();
274
275        if (ptserver_index<0) { // fix invalid pt_server indices
276            ptserver_index = 0;
277            aw_root->awar(varname)->write_int(ptserver_index);
278        }
279
280        char *readable_name = readable_pt_servername(ptserver_index, PT_SERVERNAME_LENGTH);
281
282        AW_CL cl_varname = (AW_CL)strdup(varname); // make copy of awar_name for callbacks
283
284        aw_root->awar_string(awar_buttontext_name, readable_name, AW_ROOT_DEFAULT);
285        aw_root->awar(varname)->add_callback(update_ptserver_button, cl_varname);
286
287        int old_button_length = aws->get_button_length();
288
289        aws->button_length(PT_SERVERNAME_LENGTH+1);
290        aws->callback(AW_POPUP, (AW_CL)awt_popup_selection_list_on_pt_servers, cl_varname);
291        aws->create_button("CURR_PT_SERVER", awar_buttontext_name);
292
293        aws->button_length(old_button_length);
294
295        free(readable_name);
296        free(awar_buttontext_name);
297    }
298    else {
299        AW_selection_list *id = aws->create_selection_list(varname);
300        announce_pt_server_selection_list(aws, id);
301        fill_pt_server_selection_list(aws, id);
302    }
303}
304
305
306// ******************** selection boxes on tables ********************
307
308void awt_create_selection_list_on_tables_cb(GBDATA *dummy, struct awt_sel_list_for_tables *cbs){
309    AWUSE(dummy);
310    cbs->aws->clear_selection_list(cbs->id);
311    GBDATA *gb_table;
312    for (gb_table = GBT_first_table(cbs->gb_main);
313         gb_table;
314         gb_table = GBT_next_table(gb_table)){
315
316        GBDATA *gb_name = GB_entry(gb_table,"name");
317        GBDATA *gb_description = GB_search(gb_table,"description",GB_STRING);
318        if (!gb_name) continue;
319        char *table_name = GB_read_string(gb_name);
320        char *description = GB_read_string(gb_description);
321        const char *info_text = GBS_global_string("%s: %s",table_name,description);
322        cbs->aws->insert_selection(cbs->id,info_text,table_name);
323        free(table_name);
324        free(description);
325    }
326    cbs->aws->insert_default_selection( cbs->id, "", "" );
327    cbs->aws->update_selection_list( cbs->id );
328}
329
330void awt_create_selection_list_on_tables(GBDATA *gb_main,AW_window *aws,const char *varname)
331{
332    AW_selection_list *id;
333    GBDATA  *gb_table_data;
334    struct awt_sel_list_for_tables *cbs;
335    GB_push_transaction(gb_main);
336
337    id = aws->create_selection_list(varname,0,"",40,8);
338    cbs = new awt_sel_list_for_tables;
339    cbs->aws = aws;
340    cbs->gb_main = gb_main;
341    cbs->id = id;
342
343    awt_create_selection_list_on_tables_cb(0,cbs);
344
345    gb_table_data = GB_search(gb_main,"table_data",GB_CREATE_CONTAINER);
346    GB_add_callback(gb_table_data,GB_CB_CHANGED,(GB_CB)awt_create_selection_list_on_tables_cb, (int *)cbs);
347
348    GB_pop_transaction(gb_main);
349}
350// ******************** selection boxes on tables ********************
351
352void awt_create_selection_list_on_table_fields_cb(GBDATA *dummy, struct awt_sel_list_for_tables *cbs){
353    AWUSE(dummy);
354    cbs->aws->clear_selection_list(cbs->id);
355    GBDATA  *gb_table = GBT_open_table(cbs->gb_main,cbs->table_name, GB_TRUE); // read only
356    GBDATA *gb_table_field;
357    for (gb_table_field = GBT_first_table_field(gb_table);
358         gb_table_field;
359         gb_table_field = GBT_next_table_field(gb_table_field))
360    {
361        GBDATA *gb_name = GB_entry(gb_table_field,"name");
362        GBDATA *gb_description = GB_search(gb_table_field,"description",GB_STRING);
363        if (!gb_name) continue;
364        char *table_name = GB_read_string(gb_name);
365        char *description = GB_read_string(gb_description);
366        const char *info_text = GBS_global_string("%s: %s",table_name,description);
367        cbs->aws->insert_selection(cbs->id,info_text,table_name);
368        free(table_name);
369        free(description);
370    }
371    cbs->aws->insert_default_selection( cbs->id, "", "" );
372    cbs->aws->update_selection_list( cbs->id );
373}
374
375void awt_create_selection_list_on_table_fields(GBDATA *gb_main,AW_window *aws,const char *table_name, const char *varname)
376{
377    AW_selection_list *id;
378    struct awt_sel_list_for_tables *cbs;
379    GB_push_transaction(gb_main);
380
381    id = aws->create_selection_list(varname,0,"",40,8);
382    cbs = new awt_sel_list_for_tables;
383    cbs->aws = aws;
384    cbs->gb_main = gb_main;
385    cbs->id = id;
386    cbs->table_name = strdup(table_name);
387
388    awt_create_selection_list_on_table_fields_cb(0,cbs);
389
390    GBDATA  *gb_table = GBT_open_table(gb_main,table_name, GB_TRUE); // read only
391    if (gb_table){
392        GB_add_callback(gb_table,GB_CB_CHANGED,(GB_CB)awt_create_selection_list_on_table_fields_cb, (int *)cbs);
393    }
394    GB_pop_transaction(gb_main);
395}
396
397// ******************** selection boxes on editor configurations ********************
398
399void awt_create_selection_list_on_configurations_cb(GBDATA*, struct adawcbstruct *cbs) {
400    cbs->aws->clear_selection_list(cbs->id);
401
402    int    config_count;
403    char **config = GBT_get_configuration_names_and_count(cbs->gb_main, &config_count);
404
405    if (config) {
406        for (int c = 0; c<config_count; c++) {
407            cbs->aws->insert_selection(cbs->id, config[c], config[c]);
408        }
409        GBT_free_names(config);
410    }
411
412    cbs->aws->insert_default_selection(cbs->id, "????", "????");
413    cbs->aws->update_selection_list(cbs->id);
414}
415
416void awt_create_selection_list_on_configurations(GBDATA *gb_main,AW_window *aws,const char *varname)
417{
418    AW_selection_list *id;
419    GBDATA  *gb_configuration_data;
420    GB_push_transaction(gb_main);
421
422    id = aws->create_selection_list(varname,0,"",40,15);
423   
424    struct adawcbstruct *cbs = new adawcbstruct;
425    memset(cbs, 0, sizeof(*cbs));
426
427    cbs->aws     = aws;
428    cbs->awr     = aws->get_root();
429    cbs->gb_main = gb_main;
430    cbs->id      = id;
431
432    awt_create_selection_list_on_configurations_cb(0,cbs);
433
434    gb_configuration_data = GB_search(gb_main,AWAR_CONFIG_DATA,GB_CREATE_CONTAINER);
435    GB_add_callback(gb_configuration_data,GB_CB_CHANGED,
436                    (GB_CB)awt_create_selection_list_on_configurations_cb, (int *)cbs);
437
438    GB_pop_transaction(gb_main);
439}
440
441char *awt_create_string_on_configurations(GBDATA *gb_main) {
442    // returns semicolon-separated string containing configuration names
443    // (or NULL if no configs exist)
444   
445    GB_push_transaction(gb_main);
446
447    int    config_count;
448    char **config = GBT_get_configuration_names_and_count(gb_main, &config_count);
449    char  *result = 0;
450
451    if (config) {
452        GBS_strstruct *out = GBS_stropen(1000);
453        for (int c = 0; c<config_count; c++) {
454            if (c>0) GBS_chrcat(out, ';');
455            GBS_strcat(out, config[c]);
456        }
457        result = GBS_strclose(out);
458    }
459
460    GB_pop_transaction(gb_main);
461    return result;
462}
463
464// ******************** selection boxes on SAIs ********************
465
466void awt_create_selection_list_on_extendeds_update(GBDATA *dummy, void *cbsid)
467{
468#if defined(DEVEL_RALF)
469    printf("start awt_create_selection_list_on_extendeds_update\n"); // @@@
470#endif // DEVEL_RALF
471
472    struct awt_sel_list_for_sai *cbs = (struct awt_sel_list_for_sai *)cbsid;
473
474    AWUSE(dummy);
475    cbs->aws->clear_selection_list(cbs->id);
476    GB_transaction ta(cbs->gb_main);
477
478    for (GBDATA *gb_extended = GBT_first_SAI(cbs->gb_main);
479         gb_extended;
480         gb_extended = GBT_next_SAI(gb_extended))
481    {
482        if (cbs->filter_poc) {
483            char *res = cbs->filter_poc(gb_extended,cbs->filter_cd);
484            if (res) {
485                cbs->aws->insert_selection( cbs->id, res, GBT_read_name(gb_extended));
486                free(res);
487            }
488        }
489        else {
490            const char *name     = GBT_read_name(gb_extended);
491            GBDATA     *gb_group = GB_entry(gb_extended, "sai_group");
492
493            if (gb_group) {
494                const char *group          = GB_read_char_pntr(gb_group);
495                char       *group_and_name = GBS_global_string_copy("[%s] %s", group, name);
496               
497                cbs->aws->insert_selection(cbs->id, group_and_name, name);
498                free(group_and_name);
499            }
500            else {
501                cbs->aws->insert_selection( cbs->id, name, name );
502            }
503        }
504    }
505    cbs->aws->sort_selection_list(cbs->id, 0, 0);
506
507    if (cbs->add_selected_species) {
508        GBDATA *gb_sel = GB_search(cbs->gb_main,AWAR_SPECIES_NAME,GB_STRING);
509        char   *name   = GB_read_string(gb_sel);
510        if (strlen(name)){
511            char *sname = (char *)calloc(1, strlen(name)+2);
512            sprintf(sname+1,"%s",name);
513            sname[0] = 1;
514            char *text = (char *)GBS_global_string("Selected Species: '%s'",name);
515            cbs->aws->insert_selection( cbs->id, text, sname );
516            delete name;
517        }
518        delete name;
519    }
520    cbs->aws->insert_default_selection( cbs->id, "- none -", "none" );
521    cbs->aws->update_selection_list( cbs->id );
522   
523#if defined(DEVEL_RALF)
524    printf("done  awt_create_selection_list_on_extendeds_update\n"); // @@@
525#endif // DEVEL_RALF
526}
527
528void *awt_create_selection_list_on_extendeds(GBDATA *gb_main,AW_window *aws, const char *varname,
529                                             char *(*filter_poc)(GBDATA *gb_ext, AW_CL), AW_CL filter_cd,
530                                             bool add_sel_species)
531{
532    AW_selection_list           *id;
533    struct awt_sel_list_for_sai *cbs;
534
535    GB_push_transaction(gb_main);
536
537    id  = aws->create_selection_list(varname,0,"",40,4);
538    cbs = new awt_sel_list_for_sai;
539
540    cbs->aws                  = aws;
541    cbs->gb_main              = gb_main;
542    cbs->id                   = id;
543    cbs->filter_poc           = filter_poc;
544    cbs->filter_cd            = filter_cd;
545    cbs->add_selected_species = add_sel_species;
546
547    awt_create_selection_list_on_extendeds_update(0,(void *)cbs);
548
549    GBDATA *gb_sai_data = GBT_get_SAI_data(gb_main);
550    GB_add_callback(gb_sai_data,GB_CB_CHANGED, (GB_CB)awt_create_selection_list_on_extendeds_update, (int *)cbs);
551
552    if (add_sel_species){       // update box if another species is selected
553        GBDATA *gb_sel = GB_search(gb_main,AWAR_SPECIES_NAME,GB_STRING);
554        GB_add_callback(gb_sel,GB_CB_CHANGED, (GB_CB)awt_create_selection_list_on_extendeds_update, (int *)cbs);
555    }
556    GB_pop_transaction(gb_main);
557
558    return (void *)cbs;
559}
560
561
562
563
564// ******************** selection boxes on saving selection lists ********************
565
566void create_save_box_for_selection_lists_save(AW_window *aws,AW_CL selidcd,AW_CL basenamecd)
567{
568    AW_selection_list *selid       = (AW_selection_list *)selidcd;
569    char              *awar_prefix = (char *)basenamecd;
570
571    char bline_anz[GB_PATH_MAX];
572    sprintf(bline_anz,"%s/line_anz",awar_prefix);
573
574    AW_root *aw_root  = aws->get_root();
575    long     lineanz  = aw_root->awar(bline_anz)->read_int();
576    char    *filename = awt_get_selected_fullname(aw_root, awar_prefix);
577
578    GB_ERROR error = aws->save_selection_list(selid,filename,lineanz);
579
580    if (!error) awt_refresh_selection_box(aw_root, awar_prefix);
581    aws->hide_or_notify(error);
582    free(filename);
583}
584
585AW_window *create_save_box_for_selection_lists(AW_root *aw_root,AW_CL selid)
586{
587    AW_selection_list *selection_list = (AW_selection_list*)selid;
588
589    char *var_id         = GBS_string_2_key(selection_list->variable_name);
590    char *awar_base_name = GBS_global_string_copy("tmp/save_box_sel_%s", var_id); // don't free (passed to callback)
591    char *awar_line_anz  = GBS_global_string_copy("%s/line_anz", awar_base_name);
592    {
593        aw_create_selection_box_awars(aw_root, awar_base_name, ".", GBS_global_string("noname.list"), "list");
594        aw_root->awar_int(awar_line_anz, 0, AW_ROOT_DEFAULT);
595    }
596
597    AW_window_simple *aws       = new AW_window_simple;
598    char             *window_id = GBS_global_string_copy("SAVE_SELECTION_BOX_%s", var_id);
599
600    aws->init(aw_root, window_id, "SAVE BOX");
601    aws->load_xfig("sl_s_box.fig");
602
603    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
604    aws->create_button("CLOSE", "CLOSE","C");
605
606    aws->at("save");
607    aws->highlight();
608    aws->callback(create_save_box_for_selection_lists_save,selid,(AW_CL)awar_base_name); // loose ownership of awar_base_name!
609    aws->create_button("SAVE", "SAVE","S");
610
611    aws->at("nlines");
612    aws->create_option_menu(awar_line_anz, 0, "");
613    aws->insert_default_option("all","a",0);
614    aws->insert_option(   "50", "a",    50);
615    aws->insert_option(  "100", "a",   100);
616    aws->insert_option(  "500", "a",   500);
617    aws->insert_option( "1000", "a",  1000);
618    aws->insert_option( "5000", "a",  5000);
619    aws->insert_option("10000", "a", 10000);
620    aws->update_option_menu();
621
622    awt_create_selection_box(aws,awar_base_name);
623
624    free(window_id);
625    free(awar_line_anz);
626    free(var_id);
627
628    return aws;
629}
630
631void AWT_load_list(AW_window *aww, AW_CL sel_id, AW_CL ibase_name)
632{
633    AW_selection_list * selid       = (AW_selection_list *)sel_id;
634    char *basename = (char *)ibase_name;
635
636    AW_root     *aw_root    = aww->get_root();
637    GB_ERROR    error;
638
639    //     char     bfile_name[GB_PATH_MAX];
640    //     sprintf(bfile_name,"%s/file_name",basename);
641    //     char *filename = aw_root->awar(bfile_name)->read_string();
642
643    char *filename = awt_get_selected_fullname(aw_root, basename);
644    error          = aww->load_selection_list(selid,filename);
645
646    if (error) aw_message(error);
647
648    AW_POPDOWN(aww);
649
650    delete filename;
651}
652
653AW_window *create_load_box_for_selection_lists(AW_root *aw_root, AW_CL selid)
654{
655    char base_name[100];
656    sprintf(base_name,"tmp/load_box_sel_%li",(long)selid);
657
658    aw_create_selection_box_awars(aw_root, base_name, ".", "list", "");
659
660    AW_window_simple *aws = new AW_window_simple;
661    aws->init( aw_root, "LOAD_SELECTION_BOX", "Load box");
662    aws->load_xfig("sl_l_box.fig");
663
664    aws->at("close");
665    aws->callback((AW_CB0)AW_POPDOWN);
666    aws->create_button("CLOSE", "CLOSE","C");
667
668    aws->at("load");
669    aws->highlight();
670    aws->callback(AWT_load_list,selid,(AW_CL)strdup(base_name));
671    aws->create_button("LOAD", "LOAD","L");
672
673    awt_create_selection_box((AW_window *)aws,base_name);
674    return (AW_window*) aws;
675}
676
677
678void create_print_box_for_selection_lists(AW_window *aw_window,AW_CL selid){
679    AW_root *aw_root = aw_window->get_root();
680    char *data = aw_window->get_selection_list_contents((AW_selection_list *)selid);
681    AWT_create_ascii_print_window(aw_root,data,"no title");
682    delete data;
683}
684
685
686
687/* ************************************************** */
688AW_window *awt_create_load_box(AW_root *aw_root, const char *load_what, const char *file_extension, char **set_file_name_awar,
689                               void (*callback)(AW_window*),
690                               AW_window* (*create_popup)(AW_root *, AW_default))
691
692    /*      You can either provide a normal callback or a create_popup-callback
693     *      (the not-used callback has to be 0)
694     */
695
696
697{
698    char *base_name = GBS_global_string_copy("tmp/load_box_%s",load_what);
699
700    aw_create_selection_box_awars(aw_root, base_name, ".", file_extension, "");
701
702    if (set_file_name_awar) {
703        *set_file_name_awar = GBS_global_string_copy("%s/file_name", base_name);
704    }
705
706    AW_window_simple *aws = new AW_window_simple;
707    {
708        char title[100];
709        sprintf(title, "Load %s", load_what);
710        aws->init( aw_root, title, title);
711        aws->load_xfig("load_box.fig");
712    }
713
714    aws->at("close");
715    aws->callback((AW_CB0)AW_POPDOWN);
716    aws->create_button("CLOSE", "CLOSE","C");
717
718    aws->at("help");
719    aws->callback(AW_POPUP_HELP,(AW_CL)"");
720    aws->create_button("HELP","HELP");
721
722    aws->at("go");
723    aws->highlight();
724
725    if (callback) {
726        awt_assert(!create_popup);
727        aws->callback((AW_CB0)callback);
728    }
729    else  {
730        awt_assert(create_popup);
731        aws->callback((AW_CB1)AW_POPUP, (AW_CL)create_popup);
732    }
733
734    aws->create_button("LOAD", "LOAD","L");
735
736    awt_create_selection_box((AW_window *)aws,base_name);
737    free(base_name);
738    return (AW_window*) aws;
739}
740
741/* ************************************************** */
742
743
744
745void awt_set_long(AW_window *aws, AW_CL varname, AW_CL value)   // set an awar
746{
747    aws->get_root()->awar((char *)varname)->write_int((long) value);
748}
749
750void awt_write_string( AW_window *aws, AW_CL varname, AW_CL value)  // set an awar
751{
752    aws->get_root()->awar((char *)varname)->write_string((char *)value);
753}
754
755struct fileChanged_cb_data {
756    char               *fpath;  // full name of edited file
757    int                 lastModtime; // last known modification time of 'fpath'
758    bool                editorTerminated; // do not free before this has been set to 'true'
759    awt_fileChanged_cb  callback;
760
761    fileChanged_cb_data(char **fpath_ptr, awt_fileChanged_cb cb) {
762        fpath            = *fpath_ptr;
763        *fpath_ptr       = 0;   // take ownage
764        lastModtime      = getModtime();
765        editorTerminated = false;
766        callback         = cb;
767    }
768
769    ~fileChanged_cb_data() {
770        free(fpath);
771    }
772
773    int getModtime() {
774        struct stat st;
775        if (stat(fpath, &st) == 0) return st.st_mtime;
776        return 0;
777    }
778
779    bool fileWasChanged() {
780        int  modtime = getModtime();
781        bool changed = modtime != lastModtime;
782        lastModtime  = modtime;
783        return changed;
784    }
785};
786
787static void editor_terminated_cb(const char *IF_DEBUG(message), void *cb_data) {
788    fileChanged_cb_data *data = (fileChanged_cb_data*)cb_data;
789
790#if defined(DEBUG)
791    printf("editor_terminated_cb: message='%s' fpath='%s'\n", message, data->fpath);
792#endif // DEBUG
793
794    data->callback(data->fpath, data->fileWasChanged(), true);
795    data->editorTerminated = true; // trigger removal of check_file_changed_cb
796}
797
798#define AWT_CHECK_FILE_TIMER 700 // in ms
799
800static void check_file_changed_cb(AW_root *aw_root, AW_CL cl_cbdata) {
801    fileChanged_cb_data *data = (fileChanged_cb_data*)cl_cbdata;
802
803    if (data->editorTerminated) {
804        delete data;
805    }
806    else {
807        bool changed = data->fileWasChanged();
808
809        if (changed) data->callback(data->fpath, true, false);
810        aw_root->add_timed_callback(AWT_CHECK_FILE_TIMER, check_file_changed_cb, cl_cbdata);
811    }
812}
813
814void AWT_edit(const char *path, awt_fileChanged_cb callback, AW_window *aww, GBDATA *gb_main) {
815    // Start external editor on file 'path' (asynchronously)
816    // if 'callback' is specified, it is called everytime the file is changed
817    // [aww and gb_main may be 0 if callback is 0]
818
819    const char          *editor  = GB_getenvARB_TEXTEDIT();
820    char                *fpath   = GBS_eval_env(path);
821    char                *command = 0;
822    fileChanged_cb_data *cb_data = 0;
823    GB_ERROR             error   = 0;
824
825    if (callback) {
826        awt_assert(aww);
827        awt_assert(gb_main);
828
829        cb_data = new fileChanged_cb_data(&fpath, callback); // fpath now is 0 and belongs to cb_data
830
831        char *arb_notify       = GB_generate_notification(gb_main, editor_terminated_cb, "editor terminated", (void*)cb_data);
832        if (!arb_notify) error = GB_await_error();
833        else {
834            char *arb_message = GBS_global_string_copy("arb_message \"Could not start editor '%s'\"", editor);
835
836            command = GBS_global_string_copy("((%s %s || %s); %s)&", editor, cb_data->fpath, arb_message, arb_notify);
837            free(arb_message);
838            free(arb_notify);
839        }
840    }
841    else {
842        command = GBS_global_string_copy("%s %s &", editor, fpath);
843    }
844
845    if (command) {
846        awt_assert(!error);
847        error = GB_system(command);
848        if (error) {
849            aw_message(error); error = NULL;
850            if (callback) error = GB_remove_last_notification(gb_main);
851        }
852        else { // successfully started editor
853            // Can't be sure editor really started when callback is used (see command above).
854            // But it doesn't matter, cause arb_notify is called anyway and removes all callbacks
855            if (callback) {
856                // add timed callback tracking file change
857                AW_root *aw_root = aww->get_root();
858                aw_root->add_timed_callback(AWT_CHECK_FILE_TIMER, check_file_changed_cb, (AW_CL)cb_data);
859                cb_data          = 0; // now belongs to check_file_changed_cb
860            }
861        }
862    }
863
864    if (error) aw_message(error);
865
866    free(command);
867    delete cb_data;
868    free(fpath);
869}
870
871
872void AWT_popup_select_species_field_window(AW_window *aww, AW_CL cl_awar_name, AW_CL cl_gb_main)
873{
874    static AW_window_simple *aws = 0;
875
876    // everytime map selection awar to latest user awar:
877    AW_root    *aw_root   = aww->get_root();
878    const char *awar_name = (const char *)cl_awar_name;
879    aw_root->awar("tmp/viewkeys/key_text_select")->map(awar_name);
880
881    if (!aws) {
882        aws = new AW_window_simple;
883       
884        aws->init( aw_root, "SELECT_SPECIES_FIELD", "Select species field");
885        aws->load_xfig("awt/nds_sel.fig");
886        aws->button_length(13);
887
888        aws->callback( AW_POPDOWN);
889        aws->at("close");
890        aws->create_button("CLOSE", "CLOSE","C");
891
892        awt_create_selection_list_on_scandb((GBDATA *)cl_gb_main,
893                                            aws,
894                                            "tmp/viewkeys/key_text_select",
895                                            AWT_NDS_FILTER,
896                                            "scandb","rescandb", &AWT_species_selector, 20, 10);
897    }
898    aws->activate();
899}
900
Note: See TracBrowser for help on using the repository browser.