source: tags/initial/ARB_GDE/GDE.cxx

Last change on this file was 2, checked in by oldcode, 24 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.6 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4
5#include <arbdb.h>
6#include <arbdbt.h>
7#include <malloc.h>
8#include <aw_root.hxx>
9#include <aw_device.hxx>
10#include <aw_window.hxx>
11#include <awt.hxx>
12
13#include "gde.hxx"
14#include "GDE_menu.h"
15#include "GDE_def.h"
16#include "GDE_extglob.h"
17
18#define META "M"
19
20
21AW_CL agde_filtercd;
22
23extern void GDE_startaction_cb(AW_window *aw,AWwindowinfo *AWinfo,AW_CL cd);
24
25Gmenu menu[GDEMAXMENU];
26int num_menus = 0,repeat_cnt = 0;
27//Frame frame,pframe,infoframe;
28//Panel popup,infopanel;
29//Panel_item left_foot,right_foot;
30//Canvas EditCan,EditNameCan;
31int DisplayType;
32GmenuItem *current_item;
33NA_Alignment *DataSet = NULL;
34//NA_Alignment *Clipboard = NULL;
35//char **TextClip;
36//int TextClipSize = 0,TextClipLength = 0;
37
38char GDEBLANK[] = "\0";
39
40enum {
41        SLIDERWIDTH = 5, // input field for numbers
42        TEXTFIELDWIDTH = 15
43        };
44
45char *GDE_makeawarname(AWwindowinfo *AWinfo,long i);
46
47int GDE_odd(long a)
48{
49        if(((a/2)*2)==a) return 0;
50        return 1;
51}
52
53void GDE_showhelp_cb(AW_window *aw,AWwindowinfo *AWinfo,AW_CL cd)
54{
55        AWUSE(cd);
56        AW_root *awr=aw->get_root();
57        static AW_window_simple *helpwindow=0;
58
59        char helpfile[1024], *help_file;
60        char *helptext=0;       
61
62        help_file=AWinfo->gmenuitem->help;
63        if(!(help_file)) awr->awar("tmp/gde/helptext")->write_string("no help\0");
64        else 
65        {
66                sprintf(helpfile,"%s/GDEHELP/%s",GB_getenvARBHOME(),help_file);
67
68                helptext=GB_read_file(helpfile);
69                if(helptext) 
70                {
71                        awr->awar("tmp/gde/helptext")->write_string(helptext);
72                        delete helptext;
73                }
74                else awr->awar("tmp/gde/helptext")->write_string("can not find help file\0");
75        }
76       
77        if(helpwindow) { helpwindow->show() ; return; }
78       
79        helpwindow=new AW_window_simple;
80                helpwindow->init(awr,"GDE_HELP", "GDE HELP",200,10);
81       
82        helpwindow->button_length(10);
83        helpwindow->at(10,10);helpwindow->callback((AW_CB0)AW_POPDOWN);
84        helpwindow->create_button("CLOSE", "CLOSE","C");
85
86        helpwindow->at(10,40);
87        //helpwindow->button_length(80);
88        //helpwindow->label_length(80);
89        helpwindow->create_text_field("tmp/gde/helptext",80,20);
90
91        helpwindow->window_fit();       
92        helpwindow->show();
93       
94}
95
96char *GDE_makeawarname(AWwindowinfo *AWinfo,long i)
97{
98        char name[GB_KEY_LEN_MAX*4+5];
99        char *gmenu = GBS_string_2_key(AWinfo->gmenu->label);
100        char *gmenuitem = GBS_string_2_key(AWinfo->gmenuitem->label);
101        char *arg = GBS_string_2_key(AWinfo->gmenuitem->arg[i].symbol);
102
103        sprintf(name,"gde/%s/%s/%s",gmenu,gmenuitem,arg);
104        delete gmenu;
105        delete gmenuitem;
106        delete arg;
107
108        return(strdup(name));
109}
110
111void GDE_decreaseawar_cb(AW_window *aws,char *awar,AW_CL cd)
112{
113        AWUSE(cd);
114        AW_root *awr=aws->get_root();
115        awr->awar(awar)->write_int(awr->awar(awar)->read_int()-1);
116}
117
118void GDE_increaseawar_cb(AW_window *aws,char *awar,AW_CL cd)
119{
120        AWUSE(cd);
121        AW_root *awr=aws->get_root();
122        awr->awar(awar)->write_int(awr->awar(awar)->read_int()+1);
123}
124
125
126void GDE_create_infieldwithpm(AW_window *aws,char *newawar,long width)
127{
128        char *awar=strdup(newawar);
129        aws->create_input_field(newawar,(int)width);
130        if (aws->get_root()->awar(newawar)->get_type() == AW_INT) {
131            aws->button_length(3);
132            aws->callback((AW_CB2)GDE_decreaseawar_cb,(AW_CL)awar,0);
133            aws->create_button(0,"-","-");
134            aws->callback((AW_CB2)GDE_increaseawar_cb,(AW_CL)awar,0);
135            aws->create_button(0,"+","+");
136        }
137}
138
139char *gde_filter_weights(GBDATA *gb_sai,AW_CL ){
140    char *ali_name = GBT_get_default_alignment(gb_main);
141    GBDATA *gb_ali = GB_find(gb_sai,ali_name,0,down_level);
142    delete ali_name;
143    if (!gb_ali) return 0;
144    GBDATA *gb_type = GB_find(gb_ali, "_TYPE",0,down_level);
145    if (!gb_type) return 0;
146    char *type = GB_read_char_pntr(gb_type);
147    if (GBS_string_cmp( type,"PV?:*",0)) {
148        return 0;
149    }
150   
151    char *name = GBT_read_name(gb_sai);
152    const char *res = GBS_global_string("%s: %s",name,type);
153    delete name;
154    return strdup(res);
155}
156
157
158                 
159AW_window *GDE_menuitem_cb(AW_root *aw_root,AWwindowinfo *AWinfo) {
160#define BUFSIZE 200
161    char bf[BUFSIZE+1]; 
162#if defined(DEBUG)
163    int printed =
164#endif // DEBUG
165        sprintf(bf,"GDE / %s / %s",AWinfo->gmenu->label,AWinfo->gmenuitem->label); 
166    gb_assert(printed<=BUFSIZE);
167   
168    AW_window_simple *aws = new AW_window_simple;
169    aws->init(aw_root,bf,bf,10,10);
170   
171    switch (gde_cgss.wt) {
172        case CGSS_WT_DEFAULT:
173            aws->load_xfig("gdeitem.fig");
174            break;
175        case CGSS_WT_EDIT:
176            aws->load_xfig("gde2item.fig");
177            break;
178        case CGSS_WT_EDIT4:
179            aws->load_xfig("gde3item.fig");
180            break;
181        default:
182            gde_assert(0);
183    }
184   
185    aws->set_window_size(1000,2000);
186    aws->button_length(10);
187    aws->at(10,10);
188    aws->auto_space(0,10);
189
190    aws->at("help");
191    aws->callback((AW_CB2)GDE_showhelp_cb,(AW_CL)AWinfo,0);
192    aws->create_button("GDE_HELP","HELP...","H");
193
194    aws->at("start");
195    aws->callback((AW_CB2)GDE_startaction_cb,(AW_CL)AWinfo,0);
196    aws->create_button("GO", "GO","O");
197
198    aws->at("cancel");
199    aws->callback((AW_CB0)AW_POPDOWN);
200    aws->create_button("CLOSE", "CLOSE","C");
201
202
203    if (AWinfo->gmenuitem->numinputs>0) {
204        switch (gde_cgss.wt) {
205            case CGSS_WT_DEFAULT:
206                aws->at("which_alignment");
207                awt_create_selection_list_on_ad(gb_main, (AW_window *)aws,"tmp/gde/alignment","*=");
208                aws->at( "which_species" );
209                aws->create_toggle_field( "gde/species" );
210                aws->insert_toggle( "all", "a", 0 );
211                aws->insert_default_toggle( "marked",  "m", 1 );
212                aws->update_toggle_field();
213                break;
214            case CGSS_WT_EDIT:
215                aws->at("bottom"); aws->create_toggle("gde/bottom_area");
216                aws->at("bottomsai"); aws->create_toggle("gde/bottom_area_sai");
217                aws->at("bottomh"); aws->create_toggle("gde/bottom_area_helix");
218                goto both_edits;
219            case CGSS_WT_EDIT4:
220                aws->at("topk"); aws->create_toggle("gde/top_area_kons");
221                aws->at("middlek"); aws->create_toggle("gde/middle_area_kons");
222                aws->at("topr"); aws->create_toggle("gde/top_area_remark");
223                aws->at("middler"); aws->create_toggle("gde/middle_area_remark");
224                goto both_edits;
225        both_edits:
226                aws->at("top"); aws->create_toggle("gde/top_area");
227                aws->at("topsai"); aws->create_toggle("gde/top_area_sai");
228                aws->at("toph"); aws->create_toggle("gde/top_area_helix");
229                aws->at("middle"); aws->create_toggle("gde/middle_area");
230                aws->at("middlesai"); aws->create_toggle("gde/middle_area_sai");
231                aws->at("middleh"); aws->create_toggle("gde/middle_area_helix");
232                break;
233        }
234       
235        aws->at("compression");
236        aws->create_toggle_field( "gde/compression" );
237        aws->insert_toggle( "none", "n",0 ); 
238        aws->insert_default_toggle( "vertical gaps", "v", 1 );
239        aws->insert_toggle( "all gaps",  "g", 2 );
240        aws->update_toggle_field();
241
242        aws->button_length(12);
243        aws->at("filtername");
244        agde_filtercd = awt_create_select_filter(aws->get_root(),gb_main,"gde/filter/name");
245        aws->callback((AW_CB2)AW_POPUP,(AW_CL)awt_create_select_filter_win,agde_filtercd);
246        aws->create_button("SELECT_FILTER", "gde/filter/name");
247
248        aws->at("paramsb");
249    }
250    else {
251        aws->at("paramsb");
252    }
253
254       
255    long labellength=0,lablen;
256    //char *help;
257    labellength=1;
258    long i;
259    for(i=0;i<AWinfo->gmenuitem->numargs;i++)
260    {
261        //help=AWinfo->gmenuitem->help;
262        if(!(AWinfo->gmenuitem->arg[i].label)) AWinfo->gmenuitem->arg[i].label=GDEBLANK;
263        lablen=strlen(AWinfo->gmenuitem->arg[i].label); 
264        if(lablen>labellength) labellength=lablen;
265    }
266    aws->label_length((int)labellength);
267    aws->auto_space(0,0);
268
269    for(i=0;i<AWinfo->gmenuitem->numargs;i++)
270    {
271        GmenuItemArg itemarg=AWinfo->gmenuitem->arg[i];
272
273        if(itemarg.type==SLIDER)
274        {
275            char *newawar=GDE_makeawarname(AWinfo,i);
276            if ( int(AWinfo->gmenuitem->arg[i].fvalue) == AWinfo->gmenuitem->arg[i].fvalue &&
277                 int(AWinfo->gmenuitem->arg[i].min) == AWinfo->gmenuitem->arg[i].min &&
278                 int(AWinfo->gmenuitem->arg[i].max) == AWinfo->gmenuitem->arg[i].max){
279                aw_root->awar_int(newawar,(long)AWinfo->gmenuitem->arg[i].fvalue,AW_ROOT_DEFAULT);
280            }else{
281                aw_root->awar_float(newawar,AWinfo->gmenuitem->arg[i].fvalue,AW_ROOT_DEFAULT);
282            }
283            aw_root->awar(newawar)
284                ->set_minmax(AWinfo->gmenuitem->arg[i].min,AWinfo->gmenuitem->arg[i].max);
285            aws->label(AWinfo->gmenuitem->arg[i].label);
286            GDE_create_infieldwithpm(aws,newawar,SLIDERWIDTH);
287            // maybe bound checking //
288            delete newawar;
289        }
290
291        else if(itemarg.type==CHOOSER)
292        {
293            char *defopt=itemarg.choice[0].method;
294            char *newawar=GDE_makeawarname(AWinfo,i);
295            aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
296            aws->label(AWinfo->gmenuitem->arg[i].label);
297            if (        (! GBS_string_cmp(itemarg.choice[0].label,"no",1)) ||
298                    (! GBS_string_cmp(itemarg.choice[0].label,"yes",1))){
299                aws->create_toggle_field(newawar,1);
300            }else{
301                aws->create_toggle_field(newawar);
302            }
303            for(long j=0;j<itemarg.numchoices;j++)
304            {
305                if (!j) {
306                    aws->insert_default_toggle(itemarg.choice[j].label,"1",
307                                               itemarg.choice[j].method);
308                }else{
309                    aws->insert_toggle(itemarg.choice[j].label,"1",
310                                       itemarg.choice[j].method);
311                }
312            }
313            aws->update_toggle_field();
314            delete newawar;
315        }
316        else if(itemarg.type==CHOICE_MENU)
317        {
318            char *defopt=itemarg.choice[itemarg.ivalue].method;
319            char *newawar=GDE_makeawarname(AWinfo,i);
320            aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
321            aws->label(AWinfo->gmenuitem->arg[i].label);
322            aws->create_option_menu(newawar,NULL,"");
323
324            for(long j=0;j<itemarg.numchoices;j++)
325            {
326                aws->insert_option(itemarg.choice[j].label,"1",
327                                   itemarg.choice[j].method);
328            }
329            aws->update_option_menu();
330            delete newawar;
331        }else if(itemarg.type==TEXTFIELD){
332            char *defopt=itemarg.textvalue;
333            char *newawar=GDE_makeawarname(AWinfo,i);                   
334            aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
335            aws->label(AWinfo->gmenuitem->arg[i].label);
336            aws->create_input_field(newawar,TEXTFIELDWIDTH);
337            delete newawar;
338        }else if(itemarg.type==CHOICE_TREE){
339            char *defopt=itemarg.textvalue;
340            char *newawar=GDE_makeawarname(AWinfo,i);                   
341            aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
342            aws->label(AWinfo->gmenuitem->arg[i].label);                   
343            awt_create_selection_list_on_trees(gb_main,aws,newawar);
344            delete newawar;
345        }else if(itemarg.type==CHOICE_SAI){
346            char *defopt=itemarg.textvalue;
347            char *newawar=GDE_makeawarname(AWinfo,i);                   
348            aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
349            aws->label(AWinfo->gmenuitem->arg[i].label);                   
350            awt_create_selection_list_on_extendeds(gb_main,aws,newawar);
351            delete newawar;
352        }else if(itemarg.type==CHOICE_WEIGHTS){
353            char *defopt=itemarg.textvalue;
354            char *newawar=GDE_makeawarname(AWinfo,i);                   
355            aw_root->awar_string(newawar,defopt,AW_ROOT_DEFAULT);
356            aws->label(AWinfo->gmenuitem->arg[i].label);                   
357            void *id = awt_create_selection_list_on_extendeds(gb_main,aws,newawar,gde_filter_weights);
358            delete newawar;
359            aw_root->awar("tmp/gde/alignment")
360                ->add_callback((AW_RCB1)awt_create_selection_list_on_extendeds_update,(AW_CL)id);
361        }
362        if((AWinfo->gmenuitem->numargs<8) || GDE_odd(i)) aws->at_newline();
363        else aws->at_shift( 50,0 );
364    }
365    aws->at_newline();
366
367    aws->window_fit(); 
368    return (AW_window *)aws;
369#undef BUFSIZE   
370}
371
372
373void GDE_load_menu(AW_window *awm,const char *menulabel,const char *menuitemlabel)
374{
375//      AW_root *aw_root=awm->get_root();
376        char    buffer[1024];
377        char    *help;
378        long nitem,num_items;
379        GmenuItem *menuitem;
380        for(long nmenu=0;nmenu<num_menus;nmenu++)
381        {
382                char *manuname=GBS_string_2_key(menu[nmenu].label);
383                if (menulabel){
384                        if (strcmp(menulabel,manuname)) {
385                                delete manuname;
386                                continue;
387                        }
388                }else{
389                        awm->insert_sub_menu(0,manuname,META);
390                }
391                delete manuname;
392                num_items=menu[nmenu].numitems;
393                for(nitem=0;nitem<num_items;nitem++)
394                {
395                        menuitem=&menu[nmenu].item[nitem];
396                        if (!menuitemlabel || !GBS_string_cmp(menuitem->label,menuitemlabel,0)){
397                                AWwindowinfo *AWinfo=new AWwindowinfo;
398                                AWinfo->gmenu=&menu[nmenu];
399                                AWinfo->gmenuitem=menuitem;
400                                if (menuitem->help) {
401                                        sprintf(buffer,"GDEHELP/%s",menuitem->help);
402                                        help = strdup(buffer);
403                                }else{
404                                        help = 0;
405                                }
406                                awm->insert_menu_topic(0,menuitem->label,&(menuitem->meta),
407                                        help,AWM_ALL,
408                                        AW_POPUP, (AW_CL)GDE_menuitem_cb, (AW_CL)AWinfo );
409                        }
410                }
411        //      if(!menulabel && nmenu==0)
412        //              awm->insert_menu_topic(0,"Close","C",0,(AW_active) -1, (AW_CB)AW_POPDOWN, 0, 0);
413                if (!menulabel){
414                        awm->close_sub_menu();
415                }
416        }
417}
418
419struct choose_get_sequence_struct gde_cgss = { 0,CGSS_WT_DEFAULT};
420
421void create_gde_var(AW_root  *aw_root, AW_default aw_def,
422                    char *(*get_sequences)(void *THIS, GBDATA **&the_species, 
423                                           uchar **&the_names,
424                                           uchar **&the_sequences,
425                                           long &numberspecies,long &maxalignlen),
426                    gde_cgss_window_type wt,
427                    void *THIS)
428{
429    gde_cgss.get_sequences= get_sequences;
430    gde_cgss.wt = wt;
431    gde_cgss.THIS= THIS;
432
433    aw_root->awar_string("tmp/gde/helptext","help",aw_def);
434    aw_root->awar_string( "tmp/gde/alignment","" ,aw_def );     
435   
436    switch (gde_cgss.wt)
437    {
438        case CGSS_WT_EDIT4:
439            aw_root->awar_int("gde/top_area_kons",1,aw_def);
440            aw_root->awar_int("gde/top_area_remark",1,aw_def);
441            aw_root->awar_int("gde/middle_area_kons",1,aw_def);
442            aw_root->awar_int("gde/middle_area_remark",1,aw_def);
443        case CGSS_WT_EDIT:
444            aw_root->awar_int("gde/top_area",1,aw_def);
445            aw_root->awar_int("gde/top_area_sai",1,aw_def);
446            aw_root->awar_int("gde/top_area_helix",1,aw_def);
447            aw_root->awar_int("gde/middle_area",1,aw_def);
448            aw_root->awar_int("gde/middle_area_sai",1,aw_def);
449            aw_root->awar_int("gde/middle_area_helix",1,aw_def);
450            aw_root->awar_int("gde/bottom_area",1,aw_def);
451            aw_root->awar_int("gde/bottom_area_sai",1,aw_def);
452            aw_root->awar_int("gde/bottom_area_helix",1,aw_def);
453        default:
454            break;
455    }
456   
457    aw_root->awar_string( "presets/use","" ,gb_main ); 
458    aw_root->awar_string( "gde/filter/name","",aw_def);
459    aw_root->awar_string( "gde/filter/filter","",aw_def);
460    aw_root->awar_int( "gde/species",1,aw_def);
461    aw_root->awar_int( "gde/compression",1,aw_def);
462    aw_root->awar_string( "gde/filter/alignment","",aw_def);
463    aw_root->awar("tmp/gde/alignment")->map("presets/use");
464    aw_root->awar("gde/filter/alignment")->map("presets/use");
465
466    DataSet = (NA_Alignment *) Calloc(1,sizeof(NA_Alignment));
467    DataSet->rel_offset = 0;
468    ParseMenu();       
469}
470
471AW_window *AP_open_gde_window(AW_root *aw_root)
472{
473        AW_window_menu_modes *awm = new AW_window_menu_modes;
474                awm->init(aw_root,"GDE","GDE",700,30,0,0);
475        awm->at(10,100);awm->callback((AW_CB0)AW_POPDOWN);
476        awm->create_button("CLOSE", "CLOSE","C");
477
478        GDE_load_menu(awm);
479
480        return (AW_window *)awm;
481}
Note: See TracBrowser for help on using the repository browser.