source: trunk/ARB_GDE/GDE.cxx @ 6280

Last change on this file since 6280 was 6280, checked in by westram, 15 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.5 KB
Line 
1#include "GDE_extglob.h"
2#include "GDE_awars.h"
3
4#include <awt_sel_boxes.hxx>
5#include <awt_filter.hxx>
6#include <aw_window.hxx>
7
8/*AISC_MKPT_PROMOTE:#ifndef GDE_MENU_H*/
9/*AISC_MKPT_PROMOTE:#include "GDE_menu.h"*/
10/*AISC_MKPT_PROMOTE:#endif*/
11
12adfiltercbstruct *agde_filtercd = 0;
13
14Gmenu menu[GDEMAXMENU];
15int num_menus = 0,repeat_cnt = 0;
16//Frame frame,pframe,infoframe;
17//Panel popup,infopanel;
18//Panel_item left_foot,right_foot;
19//Canvas EditCan,EditNameCan;
20int DisplayType;
21GmenuItem *current_item;
22NA_Alignment *DataSet = NULL;
23
24char GDEBLANK[] = "\0";
25
26#define SLIDERWIDTH 5           // input field width for numbers
27
28static void GDE_showhelp_cb(AW_window *aw, GmenuItem *gmenuitem, AW_CL /*cd*/) {
29    const char *help_file = gmenuitem->help;
30    if (help_file) {
31        char *agde_help_file = GBS_string_eval(help_file, "*.help=agde_*1.hlp", 0);
32        AW_POPUP_HELP(aw, (AW_CL)agde_help_file);
33        free(agde_help_file);
34    }
35    else {
36        aw_message("Sorry - no help available (please report to devel@arb-home.de)");
37    }
38}
39
40char *GDE_makeawarname(GmenuItem *gmenuitem,long i)
41{
42    char  name[GB_KEY_LEN_MAX*4+5];
43    char *gmenu_label     = GBS_string_2_key(gmenuitem->parent_menu->label);
44    char *gmenuitem_label = GBS_string_2_key(gmenuitem->label);
45    char *arg             = GBS_string_2_key(gmenuitem->arg[i].symbol);
46
47    sprintf(name,"gde/%s/%s/%s", gmenu_label, gmenuitem_label, arg);
48   
49    free(gmenu_label);
50    free(gmenuitem_label);
51    free(arg);
52
53    return(strdup(name));
54}
55
56static void GDE_slide_awar_int_cb(AW_window *aws, AW_CL cl_awar_name, AW_CL cd_diff)
57{
58    int      diff = (int)cd_diff;
59    AW_awar *awar = aws->get_root()->awar((const char *)cl_awar_name);
60
61    awar->write_int(awar->read_int()+diff);
62}
63static void GDE_slide_awar_float_cb(AW_window *aws, AW_CL cl_awar_name, AW_CL cd_diff)
64{
65    double   diff    = *(double*)cd_diff;
66    AW_awar *awar    = aws->get_root()->awar((const char *)cl_awar_name);
67    double   new_val = awar->read_float()+diff;
68
69    if (fabs(new_val) < 0.0001) new_val = 0.0;
70    awar->write_float(new_val);
71
72    // do it again (otherwise internal awar-range correction sometimes leads to 1+eXX values)
73    new_val = awar->read_float();
74    if (fabs(new_val) < 0.0001) new_val = 0.0;
75    awar->write_float(new_val);
76}
77
78static void GDE_create_infieldwithpm(AW_window *aws,char *newawar,long width)
79{
80    char *awar=strdup(newawar);
81    aws->create_input_field(newawar,(int)width);
82    if (aws->get_root()->awar(newawar)->get_type() == AW_INT) {
83        aws->button_length(3);
84        aws->callback(GDE_slide_awar_int_cb,(AW_CL)awar,-1);
85        aws->create_button(0,"-","-");
86        aws->callback(GDE_slide_awar_int_cb,(AW_CL)awar,+1);
87        aws->create_button(0,"+","+");
88    }
89    else if (aws->get_root()->awar(newawar)->get_type() == AW_FLOAT) {
90        aws->button_length(3);
91        aws->callback(GDE_slide_awar_float_cb,(AW_CL)awar,(AW_CL)new double(-0.1));
92        aws->create_button(0,"-","-");
93        aws->callback(GDE_slide_awar_float_cb,(AW_CL)awar,(AW_CL)new double(+0.1));
94        aws->create_button(0,"+","+");
95    }
96}
97
98static char *gde_filter_weights(GBDATA *gb_sai,AW_CL ){
99    char   *ali_name = GBT_get_default_alignment(GB_get_root(gb_sai));
100    GBDATA *gb_ali   = GB_entry(gb_sai,ali_name);
101    char   *result   = 0;
102
103    if (gb_ali) {
104        GBDATA *gb_type = GB_entry(gb_ali, "_TYPE");
105        if (gb_type) {
106            const char *type = GB_read_char_pntr(gb_type);
107
108            if (GBS_string_matches( type,"PV?:*",GB_MIND_CASE)) {
109                result = GBS_global_string_copy("%s: %s", GBT_read_name(gb_sai), type);
110            }
111
112        }
113    }
114
115    free(ali_name);
116    return result;
117
118}
119
120
121
122static AW_window *GDE_menuitem_cb(AW_root *aw_root,GmenuItem *gmenuitem) {
123#define BUFSIZE 200
124    char bf[BUFSIZE+1];
125#if defined(ASSERTION_USED)
126    int printed = 
127#endif // ASSERTION_USED
128        sprintf(bf,"GDE / %s / %s",gmenuitem->parent_menu->label,gmenuitem->label);
129   
130    gb_assert(printed<=BUFSIZE);
131    char seqtype = gmenuitem->seqtype;
132
133    if (gmenuitem->aws == NULL) {
134        AW_window_simple *aws = new AW_window_simple;
135        aws->init(aw_root,bf,bf);
136
137        switch (gde_cgss.wt) {
138            case CGSS_WT_DEFAULT: {
139                if (seqtype == '-') aws->load_xfig("gdeitem_simple.fig");
140                else                aws->load_xfig("gdeitem.fig");
141                break;
142            }
143            case CGSS_WT_EDIT:
144                gde_assert(seqtype != '-');
145                aws->load_xfig("gde2item.fig");
146                break;
147            case CGSS_WT_EDIT4:
148                gde_assert(seqtype != '-');
149                aws->load_xfig("gde3item.fig");
150                break;
151            default:
152                gde_assert(0);
153        }
154
155        aws->set_window_size(1000,2000);
156        aws->button_length(10);
157        aws->at(10,10);
158        aws->auto_space(0,10);
159
160        aws->at("help");
161        aws->callback((AW_CB2)GDE_showhelp_cb,(AW_CL)gmenuitem,0);
162        aws->create_button("GDE_HELP","HELP...","H");
163
164        aws->at("start");
165        aws->callback((AW_CB2)GDE_startaction_cb,(AW_CL)gmenuitem,0);
166        aws->create_button("GO", "GO","O");
167
168        aws->at("cancel");
169        aws->callback((AW_CB0)AW_POPDOWN);
170        aws->create_button("CLOSE", "CLOSE","C");
171
172
173        if (gmenuitem->numinputs>0) {
174            switch (gde_cgss.wt) {
175                case CGSS_WT_DEFAULT: {
176                    if (seqtype != '-') { // '-' means "skip sequence export"
177                        aws->at("which_alignment");
178                        const char *ali_filter = seqtype == 'A' ? "pro=:ami=" : (seqtype == 'N' ? "dna=:rna=" : "*=");
179                        awt_create_selection_list_on_ad(GLOBAL_gb_main, (AW_window *)aws, AWAR_GDE_ALIGNMENT, ali_filter);
180
181                        aws->at( "which_species" );
182                        aws->create_toggle_field(AWAR_GDE_SPECIES);
183                        aws->insert_toggle( "all", "a", 0 );
184                        aws->insert_default_toggle( "marked",  "m", 1 );
185                        aws->update_toggle_field();
186
187                        if (seqtype != 'N') {
188                            aws->at("stop_codon");
189                            aws->label("Cut stop-codon");
190                            aws->create_toggle(AWAR_GDE_CUTOFF_STOPCODON);
191                        }
192                    }
193                    break;
194                }
195                case CGSS_WT_EDIT:
196                    aws->at("bottom"); aws->create_toggle("gde/bottom_area");
197                    aws->at("bottomsai"); aws->create_toggle("gde/bottom_area_sai");
198                    aws->at("bottomh"); aws->create_toggle("gde/bottom_area_helix");
199                    goto both_edits;
200                case CGSS_WT_EDIT4:
201                    aws->at("topk"); aws->create_toggle("gde/top_area_kons");
202                    aws->at("middlek"); aws->create_toggle("gde/middle_area_kons");
203                    aws->at("topr"); aws->create_toggle("gde/top_area_remark");
204                    aws->at("middler"); aws->create_toggle("gde/middle_area_remark");
205                    goto both_edits;
206                both_edits:
207                    aws->at("top"); aws->create_toggle("gde/top_area");
208                    aws->at("topsai"); aws->create_toggle("gde/top_area_sai");
209                    aws->at("toph"); aws->create_toggle("gde/top_area_helix");
210                    aws->at("middle"); aws->create_toggle("gde/middle_area");
211                    aws->at("middlesai"); aws->create_toggle("gde/middle_area_sai");
212                    aws->at("middleh"); aws->create_toggle("gde/middle_area_helix");
213                    break;
214            }
215
216            if (seqtype != '-') {
217                aws->at("compression");
218                aws->create_option_menu(AWAR_GDE_COMPRESSION, "", "");
219                aws->insert_option("none", "n", COMPRESS_NONE);
220                aws->insert_option("vertical gaps", "v", COMPRESS_VERTICAL_GAPS);
221                aws->insert_default_option("columns w/o info", "i", COMPRESS_NONINFO_COLUMNS);
222                aws->insert_option("all gaps", "g", COMPRESS_ALL);
223                aws->update_option_menu();
224
225                aws->button_length(12);
226                aws->at("filtername");
227                if (!agde_filtercd) { // create only one filter - used for all GDE calls
228                    agde_filtercd = awt_create_select_filter(aws->get_root(),GLOBAL_gb_main, AWAR_GDE_FILTER_NAME);
229                }
230                aws->callback((AW_CB2)AW_POPUP, (AW_CL)awt_create_select_filter_win, (AW_CL)agde_filtercd);
231                aws->create_button("SELECT_FILTER", AWAR_GDE_FILTER_NAME);
232            }
233
234            aws->at("paramsb");
235        }
236        else {
237            aws->at("paramsb");
238        }
239
240
241        int labellength = 1;
242        long i;
243        for (i=0;i<gmenuitem->numargs;i++) {
244            if(!(gmenuitem->arg[i].label)) gmenuitem->arg[i].label = GDEBLANK;
245
246            const char *label    = gmenuitem->arg[i].label;
247            const char *linefeed = strchr(label, '\n');
248
249            int lablen;
250            while (linefeed) {
251                lablen = linefeed-label;
252                if (lablen>labellength) {
253                    labellength = lablen;
254                }
255                label    = linefeed+1;
256                linefeed = strchr(label, '\n');
257            }
258
259            lablen = strlen(label);
260            if (lablen>labellength) {
261                labellength = lablen;
262            }
263        }
264        aws->label_length(labellength);
265        aws->auto_space(0,0);
266
267        for (i=0;i<gmenuitem->numargs;i++) {
268            GmenuItemArg itemarg=gmenuitem->arg[i];
269
270            if(itemarg.type==SLIDER) {
271                char *newawar=GDE_makeawarname(gmenuitem,i);
272                if ( int(gmenuitem->arg[i].fvalue) == gmenuitem->arg[i].fvalue &&
273                     int(gmenuitem->arg[i].min) == gmenuitem->arg[i].min &&
274                     int(gmenuitem->arg[i].max) == gmenuitem->arg[i].max){
275                    aw_root->awar_int(newawar,(long)gmenuitem->arg[i].fvalue,AW_ROOT_DEFAULT);
276                }else{
277                    aw_root->awar_float(newawar,gmenuitem->arg[i].fvalue,AW_ROOT_DEFAULT);
278                }
279                aw_root->awar(newawar)->set_minmax(gmenuitem->arg[i].min,gmenuitem->arg[i].max);
280                aws->label(gmenuitem->arg[i].label);
281                GDE_create_infieldwithpm(aws,newawar,SLIDERWIDTH);
282                // maybe bound checking //
283                free(newawar);
284            }
285            else if(itemarg.type==CHOOSER) {
286                char    *defopt           = itemarg.choice[0].method;
287                char    *newawar          = GDE_makeawarname(gmenuitem,i);
288                AW_awar *curr_awar        = aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
289                char    *curr_value       = curr_awar->read_string();
290                bool     curr_value_legal = false;
291
292                aws->label(gmenuitem->arg[i].label);
293                if ((strcasecmp(itemarg.choice[0].label,"no") == 0) ||
294                    (strcasecmp(itemarg.choice[0].label,"yes") == 0))
295                {
296                    aws->create_toggle_field(newawar,1);
297                }
298                else {
299                    aws->create_toggle_field(newawar);
300                }
301
302                for(long j=0;j<itemarg.numchoices;j++) {
303                    if (strcmp(itemarg.choice[j].method, curr_value) == 0) curr_value_legal = true;
304
305                    if (!j) {
306                        aws->insert_default_toggle(itemarg.choice[j].label,"1", itemarg.choice[j].method);
307                    }
308                    else {
309                        aws->insert_toggle(itemarg.choice[j].label,"1", itemarg.choice[j].method);
310                    }
311                }
312                if (!curr_value_legal) curr_awar->write_string(defopt); // if saved value no longer occurs in choice -> overwrite with default
313                free(curr_value);
314                aws->update_toggle_field();
315                free(newawar);
316            }
317            else if(itemarg.type==CHOICE_MENU) {
318                char    *defopt           = itemarg.choice[itemarg.ivalue].method;
319                char    *newawar          = GDE_makeawarname(gmenuitem,i);
320                AW_awar *curr_awar        = aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
321                char    *curr_value       = curr_awar->read_string();
322                bool     curr_value_legal = false;
323
324                aws->label(gmenuitem->arg[i].label);
325                aws->create_option_menu(newawar,NULL,"");
326
327                for(long j=0;j<itemarg.numchoices;j++) {
328                    if (strcmp(itemarg.choice[j].method, curr_value) == 0) curr_value_legal = true;
329                    aws->insert_option(itemarg.choice[j].label,"1", itemarg.choice[j].method);
330                }
331                if (!curr_value_legal) curr_awar->write_string(defopt); // if saved value no longer occurs in choice -> overwrite with default
332                free(curr_value);
333                aws->update_option_menu();
334                free(newawar);
335            }
336            else if(itemarg.type==TEXTFIELD) {
337                char *defopt  = itemarg.textvalue;
338                char *newawar = GDE_makeawarname(gmenuitem,i);
339                aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
340                aws->label(gmenuitem->arg[i].label);
341                aws->create_input_field(newawar,itemarg.textwidth/*TEXTFIELDWIDTH*/);
342                free(newawar);
343            }
344            else if(itemarg.type==CHOICE_TREE) {
345                char *defopt=itemarg.textvalue;
346                char *newawar=GDE_makeawarname(gmenuitem,i);
347                aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
348                aws->label(gmenuitem->arg[i].label);
349                awt_create_selection_list_on_trees(GLOBAL_gb_main,aws,newawar);
350                free(newawar);
351            }
352            else if(itemarg.type==CHOICE_SAI) {
353                char *defopt=itemarg.textvalue;
354                char *newawar=GDE_makeawarname(gmenuitem,i);
355                aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
356                aws->label(gmenuitem->arg[i].label);
357                awt_create_selection_list_on_extendeds(GLOBAL_gb_main,aws,newawar);
358                free(newawar);
359            }
360            else if(itemarg.type==CHOICE_WEIGHTS) {
361                char *defopt=itemarg.textvalue;
362                char *newawar=GDE_makeawarname(gmenuitem,i);
363                aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
364                aws->label(gmenuitem->arg[i].label);
365                void *id = awt_create_selection_list_on_extendeds(GLOBAL_gb_main,aws,newawar,gde_filter_weights);
366                free(newawar);
367                aw_root->awar(AWAR_GDE_ALIGNMENT)->add_callback((AW_RCB1)awt_create_selection_list_on_extendeds_update,(AW_CL)id);
368            }
369
370            aws->at_newline();
371            // if((gmenuitem->numargs<8) || GDE_odd(i)) aws->at_newline();
372            // else aws->at_shift( 50,0 );
373        }
374        aws->at_newline();
375        aws->window_fit();
376
377        gmenuitem->aws = aws;
378    }
379    return gmenuitem->aws;
380#undef BUFSIZE
381}
382
383
384
385
386void GDE_load_menu(AW_window *awm, AW_active mask, const char *menulabel, const char *menuitemlabel) {
387    // Load GDE menu items.
388    //
389    // If 'menulabel' == NULL -> load all menus
390    // Else                   -> load specified menu
391    //
392    // If 'menuitemlabel' == NULL -> load complete menu(s)
393    // Else                       -> load only specific menu topic
394
395    char       buffer[1024];
396    char      *help;
397    long       nitem,num_items;
398    GmenuItem *menuitem;
399    char       hotkey[]   = "x";
400    bool       menuloaded = false;
401    bool       itemloaded = false;
402
403    for (long nmenu = 0; nmenu<num_menus; nmenu++) {
404        {
405            const char *menuname = menu[nmenu].label;
406            if (menulabel){
407                if (strcmp(menulabel,menuname)) {
408                    continue;
409                }
410            }
411            else {
412                hotkey[0]     = menu[nmenu].meta;
413                awm->insert_sub_menu(menuname, hotkey);
414            }
415        }
416
417        menuloaded = true;
418
419        num_items = menu[nmenu].numitems;
420        for (nitem=0; nitem<num_items;nitem++) {
421            menuitem=&menu[nmenu].item[nitem];
422            if (!menuitemlabel || strcmp(menuitem->label,menuitemlabel) == 0) {
423                itemloaded = true;
424                if (menuitem->help) {
425                    sprintf(buffer,"GDEHELP/%s",menuitem->help);
426                    help = strdup(buffer);
427                }
428                else {
429                    help = 0;
430                }
431                hotkey[0]     = menuitem->meta;
432                awm->insert_menu_topic(0,menuitem->label,hotkey,
433                                       help, mask,
434                                       AW_POPUP, (AW_CL)GDE_menuitem_cb, (AW_CL)menuitem);
435            }
436        }
437        if (!menulabel){
438            awm->close_sub_menu();
439        }
440    }
441
442    if (!menuloaded && menulabel) {
443        fprintf(stderr, "GDE-Warning: Could not find requested menu '%s'\n", menulabel);
444    }
445    if (!itemloaded && menuitemlabel) {
446        if (menulabel) {
447            fprintf(stderr, "GDE-Warning: Could not find requested topic '%s' in menu '%s'\n", menuitemlabel, menulabel);
448        }
449        else {
450            fprintf(stderr, "GDE-Warning: Could not find requested topic '%s'\n", menuitemlabel);
451        }
452    }
453}
454
455struct choose_get_sequence_struct gde_cgss = { 0, CGSS_WT_DEFAULT, 0 };
456
457void create_gde_var(AW_root  *aw_root, AW_default aw_def,
458                    char *(*get_sequences)(void *THIS, GBDATA **&the_species,
459                                           uchar **&the_names,
460                                           uchar **&the_sequences,
461                                           long &numberspecies,long &maxalignlen),
462                    gde_cgss_window_type wt,
463                    void *THIS)
464{
465    gde_cgss.get_sequences= get_sequences;
466    gde_cgss.wt = wt;
467    gde_cgss.THIS= THIS;
468
469    // aw_root->awar_string("tmp/gde/helptext", "help", aw_def); // only occurrence
470    aw_root->awar_string(AWAR_GDE_ALIGNMENT, "", aw_def);
471
472    switch (gde_cgss.wt)
473    {
474        case CGSS_WT_EDIT4:
475            aw_root->awar_int("gde/top_area_kons",1,aw_def);
476            aw_root->awar_int("gde/top_area_remark",1,aw_def);
477            aw_root->awar_int("gde/middle_area_kons",1,aw_def);
478            aw_root->awar_int("gde/middle_area_remark",1,aw_def);
479        case CGSS_WT_EDIT:
480            aw_root->awar_int("gde/top_area",1,aw_def);
481            aw_root->awar_int("gde/top_area_sai",1,aw_def);
482            aw_root->awar_int("gde/top_area_helix",1,aw_def);
483            aw_root->awar_int("gde/middle_area",1,aw_def);
484            aw_root->awar_int("gde/middle_area_sai",1,aw_def);
485            aw_root->awar_int("gde/middle_area_helix",1,aw_def);
486            aw_root->awar_int("gde/bottom_area",1,aw_def);
487            aw_root->awar_int("gde/bottom_area_sai",1,aw_def);
488            aw_root->awar_int("gde/bottom_area_helix",1,aw_def);
489        default:
490            break;
491    }
492
493    aw_root->awar_string("presets/use",             "", GLOBAL_gb_main);
494   
495    aw_root->awar_string(AWAR_GDE_FILTER_NAME,      "", aw_def);
496    aw_root->awar_string(AWAR_GDE_FILTER_FILTER,    "", aw_def);
497    aw_root->awar_string(AWAR_GDE_FILTER_ALIGNMENT, "", aw_def);
498
499    aw_root->awar_int(AWAR_GDE_CUTOFF_STOPCODON, 0, aw_def);
500    aw_root->awar_int(AWAR_GDE_SPECIES,          1, aw_def);
501   
502    aw_root->awar_int(AWAR_GDE_COMPRESSION, COMPRESS_NONINFO_COLUMNS, aw_def);
503
504    aw_root->awar(AWAR_GDE_ALIGNMENT)->map("presets/use");
505    aw_root->awar(AWAR_GDE_FILTER_ALIGNMENT)->map("presets/use");
506
507    DataSet = (NA_Alignment *) Calloc(1,sizeof(NA_Alignment));
508    DataSet->rel_offset = 0;
509    ParseMenu();
510}
511
Note: See TracBrowser for help on using the repository browser.