source: tags/arb_5.0/MERGE/MG_alignment.cxx

Last change on this file was 5953, checked in by westram, 15 years ago
  • awt_create_selection_list_on_scand
    • pass label for popup button - currently there are multiple buttons with same remote-command-id in query window, this offers a way to fix it.
    • packed two bool params ('add_all_fields_pseudo_field' and 'include_hidden_fields') into enum 'awt_selected_fields'
  • moved awt_changekey.hxx to (empty) awt_item_sel_list.hxx
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.7 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <string.h>
5#include <arbdb.h>
6#include <arbdbt.h>
7#include <aw_root.hxx>
8#include <aw_device.hxx>
9#include <aw_window.hxx>
10#include <awt.hxx>
11#include <awt_sel_boxes.hxx>
12#include "merge.hxx"
13
14#define AWAR1 "tmp/merge1/"
15#define AWAR2 "tmp/merge2/"
16#define AWAR_ALI1 AWAR1"alignment_name"
17#define AWAR_ALI2 AWAR2"alignment_name"
18
19void MG_alignment_vars_callback(AW_root *aw_root,GBDATA *gbd, long ali_nr)
20{
21    char buffer[256];
22
23    GB_push_transaction(gbd);
24    sprintf(buffer,"tmp/merge%li/alignment_name",ali_nr);
25    char    *use = aw_root->awar(buffer)->read_string();
26    GBDATA *ali_cont = GBT_get_alignment(gbd,use);
27    if (!ali_cont) {
28        sprintf(buffer,"tmp/merge%li/alignment_type",ali_nr);
29        aw_root->awar(buffer)->unmap();
30
31        sprintf(buffer,"tmp/merge%li/alignment_len",ali_nr);
32        aw_root->awar(buffer)->unmap();
33
34        sprintf(buffer,"tmp/merge%li/aligned",ali_nr);
35        aw_root->awar(buffer)->unmap();
36
37        sprintf(buffer,"tmp/merge%li/security",ali_nr);
38        aw_root->awar(buffer)->unmap();
39    }else{
40
41        GBDATA *ali_len      = GB_entry(ali_cont,"alignment_len");
42        GBDATA *ali_aligned  = GB_entry(ali_cont,"aligned");
43        GBDATA *ali_type     = GB_entry(ali_cont,"alignment_type");
44        GBDATA *ali_security = GB_entry(ali_cont,"alignment_write_security");
45
46        sprintf(buffer,"tmp/merge%li/alignment_type",ali_nr);
47        aw_root->awar(buffer)->map(ali_type);
48
49        sprintf(buffer,"tmp/merge%li/alignment_len",ali_nr);
50        aw_root->awar(buffer)->map(ali_len);
51
52        sprintf(buffer,"tmp/merge%li/aligned",ali_nr);
53        aw_root->awar(buffer)->map(ali_aligned);
54
55        sprintf(buffer,"tmp/merge%li/security",ali_nr);
56        aw_root->awar(buffer)->map(ali_security);
57
58    }
59    GB_pop_transaction(gbd);
60    free(use);
61}
62
63
64void MG_create_alignment_awars(AW_root *aw_root,AW_default aw_def)
65{
66    aw_root->awar_string( AWAR_ALI1, "" ,   aw_def);
67    aw_root->awar_string( AWAR_ALI2, "" ,   aw_def);
68
69    aw_root->awar_string( AWAR1"alignment_dest", "" ,   aw_def);
70    aw_root->awar_string( AWAR2"alignment_dest", "" ,   aw_def);
71    aw_root->awar_string( AWAR1"alignment_type", "" ,   aw_def);
72    aw_root->awar_string( AWAR2"alignment_type", "" ,   aw_def);
73    aw_root->awar_int( AWAR1"alignment_len", 0 ,    aw_def);
74    aw_root->awar_int( AWAR2"alignment_len", 0 ,    aw_def);
75    aw_root->awar_int( AWAR1"aligned", 0 ,  aw_def);
76    aw_root->awar_int( AWAR2"aligned", 0 ,  aw_def);
77    aw_root->awar_int( AWAR1"security", 0 , aw_def);
78    aw_root->awar_int( AWAR2"security", 0 , aw_def);
79
80}
81
82int MG_check_alignment(AW_window *aww,int fast)
83{
84    AWUSE(aww);
85    // check type and names !!!!
86    char result[1024];
87    result[0] = 0;
88    if (!fast){
89        aw_openstatus("Checking alignments");
90        sleep(1);
91    }
92    GB_begin_transaction(GLOBAL_gb_dest);
93    GB_begin_transaction(GLOBAL_gb_merge);
94    char **names = GBT_get_alignment_names(GLOBAL_gb_merge);
95    char **name;
96    GBDATA *gb_ali1;
97    GBDATA *gb_ali2;
98    GBDATA *gb_presets2;
99
100    for (name = names; *name; name++) {
101        if (! (gb_ali2 = GBT_get_alignment(GLOBAL_gb_dest,*name)) ) {
102            gb_ali1 = GBT_get_alignment(GLOBAL_gb_merge,*name);
103            gb_presets2 = GB_search(GLOBAL_gb_dest,"presets",GB_CREATE_CONTAINER);
104            gb_ali2 = GB_create_container(gb_presets2,"alignment");
105            GB_copy(gb_ali2,gb_ali1);
106            GBT_add_new_changekey( GLOBAL_gb_dest, (char *)GBS_global_string("%s/data",*name),GB_STRING);
107        }
108        char *type1 = GBT_get_alignment_type_string(GLOBAL_gb_merge,*name);
109        char *type2 = GBT_get_alignment_type_string(GLOBAL_gb_dest,*name);
110        if (strcmp(type1,type2)) {
111            sprintf(result,"The alignments '%s' have different types (%s != %s)", *name,type1,type2);
112            break;
113        }
114        delete(type1);
115        delete(type2);
116    }
117    GBT_free_names(names);
118    GB_commit_transaction(GLOBAL_gb_dest);
119    GB_commit_transaction(GLOBAL_gb_merge);
120    if (strlen(result)) aw_message(result);
121    if (!fast){
122        aw_closestatus();
123    }
124    return strlen(result);
125}
126
127void MG_ad_al_delete_cb(AW_window *aww,AW_CL db_nr)
128{
129    if (aw_ask_sure("Are you sure to delete all data belonging to this alignment?")) {
130        char     buffer[256];
131        sprintf(buffer,"tmp/merge%li/alignment_name",db_nr);
132
133        GBDATA *gbd    = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest;
134        char   *source = aww->get_root()->awar(buffer)->read_string();
135        {
136            GB_transaction ta(gbd);
137            GB_ERROR       error = GBT_rename_alignment(gbd,source,0,0,1);
138
139            if (error) {
140                error = ta.close(error);
141                aw_message(error);
142            }
143        }
144        free(source);
145    }
146}
147
148
149void MG_ed_al_check_len_cb(AW_window *aww,AW_CL db_nr)
150{
151    char *error = 0;
152    char  buffer[256];
153    sprintf(buffer,"tmp/merge%li/alignment_name",db_nr);
154
155    GBDATA *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest;
156    char   *use = aww->get_root()->awar(buffer)->read_string();
157
158    GB_begin_transaction(gbd);
159    if (!error) error = (char *)GBT_check_data(gbd,use);
160    GB_commit_transaction(gbd);
161    if (error) aw_message(error);
162    delete use;
163}
164
165void MG_copy_delete_rename(AW_window * aww, AW_CL db_nr, AW_CL dele)
166{
167    GBDATA   *gbd    = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest;
168    char     *source = aww->get_root()->awar(GBS_global_string("tmp/merge%li/alignment_name", db_nr))->read_string();
169    char     *dest   = aww->get_root()->awar(GBS_global_string("tmp/merge%li/alignment_dest", db_nr))->read_string();
170    GB_ERROR  error  = GB_begin_transaction(gbd);
171
172    if (!error) error = GBT_rename_alignment(gbd, source, dest, (int)1, (int)dele);
173    if (!error) error = GBT_add_new_changekey(gbd, GBS_global_string("%s/data", dest), GB_STRING);
174   
175    error = GB_end_transaction(gbd, error);
176    aww->hide_or_notify(error);
177
178    free(source);
179    free(dest);
180}
181
182
183AW_window *create_alignment_copy_window(AW_root *root,AW_CL db_nr)
184{
185    AW_window_simple *aws = new AW_window_simple;
186    char header[80];
187    sprintf(header,"ALIGNMENT COPY %li",db_nr);
188    aws->init( root, header, header);
189    aws->load_xfig("ad_al_si.fig");
190
191    aws->callback( (AW_CB0)AW_POPDOWN);
192    aws->at("close");
193    aws->create_button("CLOSE","CLOSE","C");
194
195    aws->at("label");
196    aws->create_autosize_button(0,"Please enter the new name\nof the alignment");
197
198    aws->at("input");
199    char buffer[256];
200    sprintf(buffer,"tmp/merge%li/alignment_dest",db_nr);
201    aws->create_input_field(buffer,15);
202
203    aws->at("ok");
204    aws->callback(MG_copy_delete_rename,db_nr,0);
205    aws->create_button("GO","GO","G");
206
207    return (AW_window *)aws;
208}
209AW_window *MG_create_alignment_rename_window(AW_root *root,AW_CL db_nr)
210{
211    AW_window_simple *aws = new AW_window_simple;
212    char header[80];
213    sprintf(header,"ALIGNMENT RENAME %li",db_nr);
214    aws->init( root, header,header);
215    aws->load_xfig("ad_al_si.fig");
216
217    aws->callback( (AW_CB0)AW_POPDOWN);
218    aws->at("close");
219    aws->create_button("CLOSE","CLOSE","C");
220
221    aws->at("label");
222    aws->create_autosize_button(0,"Please enter the name\nof the new alignment");
223
224    aws->at("input");
225    char buffer[256];
226    sprintf(buffer,"tmp/merge%li/alignment_dest",db_nr);
227    aws->create_input_field(buffer,15);
228
229    aws->at("ok");
230    aws->callback(MG_copy_delete_rename,db_nr,1);
231    aws->create_button("GO","GO","G");
232
233    return (AW_window *)aws;
234}
235
236void MG_aa_create_alignment(AW_window *aww,AW_CL db_nr)
237{
238    GBDATA     *gbd          = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest;
239    const char *name_field   = GBS_global_string("tmp/merge%li/alignment_dest", db_nr);
240    char       *name         = aww->get_root()->awar(name_field)->read_string();
241    GB_ERROR    error        = GB_begin_transaction(gbd);
242    GBDATA     *gb_alignment = GBT_create_alignment(gbd,name,0,0,0,"dna");
243   
244    if (!gb_alignment) error = GB_await_error();
245    GB_end_transaction_show_error(gbd, error, aw_message);
246    free(name);
247}
248
249AW_window *MG_create_alignment_create_window(AW_root *root,AW_CL db_nr)
250{
251    AW_window_simple *aws = new AW_window_simple;
252    char header[80];
253    sprintf(header,"ALIGNMENT CREATE %li",db_nr);
254    aws->init( root, header,header);
255    aws->load_xfig("ad_al_si.fig");
256
257    aws->callback( (AW_CB0)AW_POPDOWN);
258    aws->at("close");
259    aws->create_button("CLOSE","CLOSE","C");
260
261    aws->at("label");
262    aws->create_autosize_button(0,"Please enter the new name\nof the alignment");
263
264    aws->at("input");
265    char buffer[256];
266    sprintf(buffer,"tmp/merge%li/alignment_dest",db_nr);
267    aws->create_input_field(buffer,15);
268
269    aws->at("ok");
270    aws->callback(MG_aa_create_alignment,db_nr);
271    aws->create_button("GO","GO","G");
272
273    return (AW_window *)aws;
274}
275
276
277
278AW_window *MG_create_alignment_window(AW_root *root,AW_CL db_nr)
279{
280    char              buffer[256];
281    GBDATA           *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest;
282    AW_window_simple *aws = new AW_window_simple;
283    char              header[80];
284   
285    sprintf(header,"ALIGNMENT CONTROL %li",db_nr);
286    aws->init( root, header, header);
287    aws->load_xfig("merge/ad_align.fig");
288
289    aws->callback( (AW_CB0)AW_POPDOWN);
290    aws->at("close");
291    aws->create_button("CLOSE","CLOSE","C");
292
293    aws->callback( AW_POPUP_HELP,(AW_CL)"ad_align.hlp");
294    aws->at("help");
295    aws->create_button("HELP","HELP","H");
296
297    aws->button_length(13);
298
299    aws->at("list");
300    sprintf(buffer,"tmp/merge%li/alignment_name",db_nr);
301    awt_create_selection_list_on_ad(gbd,(AW_window *)aws,buffer,"*=");
302
303    aws->at("delete");
304    aws->callback(MG_ad_al_delete_cb,db_nr);
305    aws->create_button("DELETE","DELETE","D");
306
307    aws->at("rename");
308    aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_rename_window,db_nr);
309    aws->create_button("RENAME","RENAME","R");
310
311    aws->at("create");
312    aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_create_window,db_nr);
313    aws->create_button("CREATE","CREATE","N");
314
315    aws->at("copy");
316    aws->callback(AW_POPUP,(AW_CL)create_alignment_copy_window,db_nr);
317    aws->create_button("COPY","COPY","C");
318
319    aws->at("aligned");
320    sprintf(buffer,"tmp/merge%li/aligned",db_nr);
321    aws->create_option_menu(buffer);
322    aws->insert_option("justified","j",1);
323    aws->insert_default_option("not justified","n",0);
324    aws->update_option_menu();
325
326
327
328    aws->at("len");
329    sprintf(buffer,"tmp/merge%li/alignment_len",db_nr);
330    aws->create_input_field(buffer,8);
331
332    aws->at("type");
333    sprintf(buffer,"tmp/merge%li/alignment_type",db_nr);
334    aws->create_option_menu(buffer);
335    aws->insert_option("dna","d","dna");
336    aws->insert_option("rna","r","rna");
337    aws->insert_option("pro","p","ami");
338    aws->insert_default_option("???","?","usr");
339    aws->update_option_menu();
340
341    aws->at("security");
342    sprintf(buffer,"tmp/merge%li/security",db_nr);
343    //  aws->get_root()->awar(buffer)->add_callback(MG_ed_al_check_len_cb,db_nr);
344    aws->callback(MG_ed_al_check_len_cb,db_nr);
345    aws->create_option_menu(buffer);
346    aws->insert_option("0","0",0);
347    aws->insert_option("1","1",1);
348    aws->insert_option("2","2",2);
349    aws->insert_option("3","3",3);
350    aws->insert_option("4","4",4);
351    aws->insert_option("5","5",5);
352    aws->insert_default_option("6","6",6);
353    aws->update_option_menu();
354
355    return (AW_window *)aws;
356
357}
358
359AW_window *MG_merge_alignment_cb(AW_root *awr){
360    static AW_window_simple *aws = 0;
361    if (aws) return (AW_window *)aws;
362
363    awr->awar(AWAR_ALI1)->add_callback( (AW_RCB)MG_alignment_vars_callback,(AW_CL)GLOBAL_gb_merge,1);
364    awr->awar(AWAR_ALI2)->add_callback( (AW_RCB)MG_alignment_vars_callback,(AW_CL)GLOBAL_gb_dest,2);
365
366    aws = new AW_window_simple;
367    aws->init( awr, "MERGE_ALIGNMENTS", "MERGE ALIGNMENTS");
368    aws->load_xfig("merge/alignment.fig");
369
370    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
371    aws->create_button("CLOSE","CLOSE","C");
372
373    aws->at("help");
374    aws->callback(AW_POPUP_HELP,(AW_CL)"mg_alignment.hlp");
375    aws->create_button("HELP","HELP","H");
376
377    aws->at("check");
378    aws->callback((AW_CB1)MG_check_alignment,0);
379    aws->create_button("CHECK","Check");
380
381    aws->at("ali1");
382    awt_create_selection_list_on_ad(GLOBAL_gb_merge,(AW_window *)aws,AWAR_ALI1,"*=");
383
384    aws->at("ali2");
385    awt_create_selection_list_on_ad(GLOBAL_gb_dest,(AW_window *)aws,AWAR_ALI2,"*=");
386
387    aws->at("modify1");
388    aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_window,1);
389    aws->create_button("MODIFY_DB1","MODIFY");
390
391    aws->at("modify2");
392    aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_window,2);
393    aws->create_button("MODIFY_DB2","MODIFY");
394
395
396    aws->button_length(0);
397    aws->shadow_width(1);
398    aws->at("icon");
399    aws->callback(AW_POPUP_HELP,(AW_CL)"mg_alignment.hlp");
400    aws->create_button("HELP_MERGE", "#merge/icon.bitmap");
401
402    return (AW_window *)aws;
403}
Note: See TracBrowser for help on using the repository browser.