source: tags/arb-6.0/NTREE/ad_ali.cxx

Last change on this file was 12267, 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: 11.6 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : ad_ali.cxx                                        //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include "NT_local.h"
12#include <insdel.h>
13#include <awt_sel_boxes.hxx>
14#include <aw_root.hxx>
15#include <aw_question.hxx>
16#include <aw_awar.hxx>
17#include <aw_msg.hxx>
18#include <aw_awar_defs.hxx>
19#include <arbdbt.h>
20
21
22static void alignment_vars_callback(AW_root *aw_root)
23{
24    GB_push_transaction(GLOBAL.gb_main);
25    char    *use = aw_root->awar(AWAR_DEFAULT_ALIGNMENT)->read_string();
26    GBDATA *ali_cont = GBT_get_alignment(GLOBAL.gb_main, use);
27    if (!ali_cont) {
28        GB_clear_error();
29        aw_root->awar("presets/alignment_name")->unmap();
30        aw_root->awar("presets/alignment_type")->unmap();
31        aw_root->awar("presets/alignment_len")->unmap();
32        aw_root->awar("presets/alignment_rem")->unmap();
33        aw_root->awar("presets/aligned")->unmap();
34        aw_root->awar("presets/auto_format")->unmap();
35        aw_root->awar("presets/security")->unmap();
36    }
37    else {
38        GBDATA *ali_name        = GB_search(ali_cont, "alignment_name",           GB_STRING);
39        GBDATA *ali_len         = GB_search(ali_cont, "alignment_len",            GB_INT);
40        GBDATA *ali_aligned     = GB_search(ali_cont, "aligned",                  GB_INT);
41        GBDATA *ali_auto_format = GB_search(ali_cont, "auto_format",              GB_INT);
42        GBDATA *ali_type        = GB_search(ali_cont, "alignment_type",           GB_STRING);
43        GBDATA *ali_security    = GB_search(ali_cont, "alignment_write_security", GB_INT);
44        GBDATA *ali_rem         = GB_search(ali_cont, "alignment_rem",            GB_STRING);
45
46        aw_root->awar("presets/alignment_name")->map(ali_name);
47        aw_root->awar("presets/alignment_type")->map(ali_type);
48        aw_root->awar("presets/alignment_len") ->map(ali_len);
49        aw_root->awar("presets/alignment_rem") ->map(ali_rem);
50        aw_root->awar("presets/aligned")       ->map(ali_aligned);
51        aw_root->awar("presets/auto_format")   ->map(ali_auto_format);
52        aw_root->awar("presets/security")      ->map(ali_security);
53    }
54    GB_pop_transaction(GLOBAL.gb_main);
55    free(use);
56}
57
58void NT_create_alignment_vars(AW_root *aw_root, AW_default aw_def) {
59    AW_awar *awar_def_ali = aw_root->awar_string(AWAR_DEFAULT_ALIGNMENT, "", aw_def);
60    GB_push_transaction(GLOBAL.gb_main);
61
62    GBDATA *use = GB_search(GLOBAL.gb_main, AWAR_DEFAULT_ALIGNMENT, GB_STRING);
63    awar_def_ali->map(use);
64
65    aw_root->awar_string("presets/alignment_name", "",   aw_def) ->set_srt(GBT_ALI_AWAR_SRT);
66    aw_root->awar_string("presets/alignment_dest", "",   aw_def) ->set_srt(GBT_ALI_AWAR_SRT);
67
68    aw_root->awar_string("presets/alignment_type", "", aw_def);
69    aw_root->awar_string("presets/alignment_rem");
70    aw_root->awar_int("presets/alignment_len", 0, aw_def);
71    aw_root->awar_int("presets/aligned", 0, aw_def);
72    aw_root->awar_int("presets/auto_format", 0, aw_def);
73    aw_root->awar_int("presets/security", 0, aw_def);
74
75    awar_def_ali->add_callback(alignment_vars_callback);
76    alignment_vars_callback(aw_root);
77    GB_pop_transaction(GLOBAL.gb_main);
78}
79
80static void ad_al_delete_cb(AW_window *aww) {
81    if (aw_ask_sure("delete_ali_data", "Are you sure to delete all data belonging to this alignment")) {
82        char           *source = aww->get_root()->awar(AWAR_DEFAULT_ALIGNMENT)->read_string();
83        GB_transaction  ta(GLOBAL.gb_main);
84        GB_ERROR        error  = GBT_rename_alignment(GLOBAL.gb_main, source, 0, 0, 1);
85
86        if (error) {
87            error = ta.close(error);
88            aw_message(error);
89        }
90        free(source);
91    }
92}
93
94
95static void ed_al_check_auto_format(AW_window *aww) {
96    AW_root *awr = aww->get_root();
97    char    *use = awr->awar(AWAR_DEFAULT_ALIGNMENT)->read_string();
98    if (strcmp(use, "ali_genom") == 0) {
99        awr->awar("presets/auto_format")->write_int(2); // ali_genom is always forced to "skip"
100    }
101}
102
103static void ed_al_check_len_cb(AW_window *aww)
104{
105    char *error = 0;
106    char *use = aww->get_root()->awar(AWAR_DEFAULT_ALIGNMENT)->read_string();
107    GB_begin_transaction(GLOBAL.gb_main);
108    if (!error) error = (char *)GBT_check_data(GLOBAL.gb_main, use);
109    GB_commit_transaction(GLOBAL.gb_main);
110    if (error) aw_message(error);
111    free(use);
112}
113
114static void ed_al_align_cb(AW_window *aww) {
115    char     *use = aww->get_root()->awar(AWAR_DEFAULT_ALIGNMENT)->read_string();
116    GB_begin_transaction(GLOBAL.gb_main);
117    GB_ERROR  err = ARB_format_alignment(GLOBAL.gb_main, use);
118    GB_commit_transaction(GLOBAL.gb_main);
119    if (err) aw_message(err);
120    free(use);
121    ed_al_check_len_cb(aww);
122}
123
124static void aa_copy_delete_rename(AW_window *aww, AW_CL copy, AW_CL dele) {
125    char *source = aww->get_root()->awar(AWAR_DEFAULT_ALIGNMENT)->read_string();
126    char *dest   = aww->get_root()->awar("presets/alignment_dest")->read_string();
127
128    GB_ERROR error    = GB_begin_transaction(GLOBAL.gb_main);
129    if (!error) error = GBT_rename_alignment(GLOBAL.gb_main, source, dest, (int)copy, (int)dele);
130    if (!error) {
131        char *nfield = GBS_global_string_copy("%s/data", dest);
132        error        = GBT_add_new_changekey(GLOBAL.gb_main, nfield, GB_STRING);
133        free(nfield);
134    }
135
136    error = GB_end_transaction(GLOBAL.gb_main, error);
137    aww->hide_or_notify(error);
138
139    free(source);
140    free(dest);
141}
142
143static AW_window *create_alignment_copy_window(AW_root *root)
144{
145    AW_window_simple *aws = new AW_window_simple;
146    aws->init(root, "COPY_ALIGNMENT", "ALIGNMENT COPY");
147    aws->load_xfig("ad_al_si.fig");
148
149    aws->callback((AW_CB0)AW_POPDOWN);
150    aws->at("close");
151    aws->create_button("CLOSE", "CLOSE", "C");
152
153    aws->at("label");
154    aws->create_autosize_button(0, "Please enter the new name\nof the alignment");
155
156    aws->at("input");
157    aws->create_input_field("presets/alignment_dest", 15);
158
159    aws->at("ok");
160    aws->callback(aa_copy_delete_rename, 1, 0);
161    aws->create_button("GO", "GO", "G");
162
163    return (AW_window *)aws;
164}
165static AW_window *create_alignment_rename_window(AW_root *root)
166{
167    AW_window_simple *aws = new AW_window_simple;
168    aws->init(root, "RENAME_ALIGNMENT", "ALIGNMENT RENAME");
169    aws->load_xfig("ad_al_si.fig");
170
171    aws->callback((AW_CB0)AW_POPDOWN);
172    aws->at("close");
173    aws->create_button("CLOSE", "CLOSE", "C");
174
175    aws->at("label");
176    aws->create_autosize_button(0, "Please enter the name\nof the new alignment");
177
178    aws->at("input");
179    aws->create_input_field("presets/alignment_dest", 15);
180
181    aws->at("ok");
182    aws->callback(aa_copy_delete_rename, 1, 1);
183    aws->create_button("GO", "GO", "G");
184
185    return (AW_window *)aws;
186}
187
188static void aa_create_alignment(AW_window *aww) {
189    GB_ERROR  error = GB_begin_transaction(GLOBAL.gb_main);
190    if (!error) {
191        char   *name             = aww->get_root()->awar("presets/alignment_dest")->read_string();
192        GBDATA *gb_alignment     = GBT_create_alignment(GLOBAL.gb_main, name, 0, 0, 0, "dna");
193        if (!gb_alignment) error = GB_await_error();
194        else {
195            char *nfield = GBS_global_string_copy("%s/data", name);
196            error        = GBT_add_new_changekey(GLOBAL.gb_main, nfield, GB_STRING);
197            free(nfield);
198        }
199        free(name);
200    }
201    GB_end_transaction_show_error(GLOBAL.gb_main, error, aw_message);
202}
203
204static AW_window *create_alignment_create_window(AW_root *root)
205{
206    AW_window_simple *aws = new AW_window_simple;
207    aws->init(root, "CREATE_ALIGNMENT", "ALIGNMENT CREATE");
208    aws->load_xfig("ad_al_si.fig");
209
210    aws->callback((AW_CB0)AW_POPDOWN);
211    aws->at("close");
212    aws->create_button("CLOSE", "CLOSE", "C");
213
214    aws->at("label");
215    aws->create_autosize_button(0, "Please enter the new name\nof the alignment");
216
217    aws->at("input");
218    aws->create_input_field("presets/alignment_dest", 15);
219
220    aws->at("ok");
221    aws->callback(aa_create_alignment);
222    aws->create_button("GO", "GO", "G");
223
224    return (AW_window *)aws;
225}
226
227AW_window *NT_create_alignment_window(AW_root *root, AW_window *aw_popmedown) {
228    // if 'aw_popmedown' points to a window, that window is popped down
229
230    static AW_window_simple *aws = 0;
231
232    if (aw_popmedown) aw_popmedown->hide();
233
234    if (aws) return aws; // do not duplicate
235
236    aws = new AW_window_simple;
237
238    aws->init(root, "INFO_OF_ALIGNMENT", "ALIGNMENT INFORMATION");
239    aws->load_xfig("ad_align.fig");
240
241    aws->callback((AW_CB0)AW_POPDOWN);
242    aws->at("close");
243    aws->create_button("CLOSE", "CLOSE", "C");
244
245    aws->callback(makeHelpCallback("ad_align.hlp"));
246    aws->at("help");
247    aws->create_button("HELP", "HELP", "H");
248
249    aws->button_length(13);
250
251    aws->at("delete");
252    aws->callback(ad_al_delete_cb);
253    aws->create_button("DELETE", "DELETE", "D");
254
255    aws->at("rename");
256    aws->callback(AW_POPUP, (AW_CL)create_alignment_rename_window, 0);
257    aws->create_button("RENAME", "RENAME", "R");
258
259    aws->at("create");
260    aws->callback(AW_POPUP, (AW_CL)create_alignment_create_window, 0);
261    aws->create_button("CREATE", "CREATE", "N");
262
263    aws->at("copy");
264    aws->callback(AW_POPUP, (AW_CL)create_alignment_copy_window, 0);
265    aws->create_button("COPY", "COPY", "C");
266
267    aws->at("check_len");
268    aws->callback(ed_al_check_len_cb);
269    aws->create_button("CHECK_LEN", "CHECK LEN", "L");
270
271    aws->at("align");
272    aws->callback(ed_al_align_cb);
273    aws->create_button("FORMAT", "FORMAT", "F");
274
275    aws->at("list");
276    awt_create_selection_list_on_alignments(GLOBAL.gb_main, aws, AWAR_DEFAULT_ALIGNMENT, "*=");
277
278    aws->at("aligned");
279    aws->create_option_menu("presets/aligned", true);
280    aws->callback(ed_al_check_len_cb);
281    aws->insert_default_option("not formatted", "n", 0);
282    aws->callback(ed_al_align_cb);
283    aws->insert_option("formatted", "j", 1);
284    aws->update_option_menu();
285
286    aws->at("auto_format");
287    aws->create_option_menu("presets/auto_format", true);
288    aws->callback(ed_al_check_auto_format);
289    aws->insert_default_option("ask", "a", 0);
290    aws->callback(ed_al_check_auto_format);
291    aws->insert_option("always", "", 1);
292    aws->callback(ed_al_check_auto_format);
293    aws->insert_option("never", "", 2);
294    aws->update_option_menu();
295
296    aws->at("len");
297    aws->create_input_field("presets/alignment_len", 7);
298
299    aws->at("type");
300    aws->create_option_menu("presets/alignment_type", true);
301    aws->insert_option("dna", "d", "dna");
302    aws->insert_option("rna", "r", "rna");
303    aws->insert_option("pro", "p", "ami");
304    aws->insert_default_option("???", "?", "usr");
305    aws->update_option_menu();
306
307    aws->at("security");
308    aws->create_option_menu("presets/security", true);
309    aws->callback(ed_al_check_len_cb);
310    aws->insert_option("0", "0", 0);
311    aws->callback(ed_al_check_len_cb);
312    aws->insert_option("1", "1", 1);
313    aws->callback(ed_al_check_len_cb);
314    aws->insert_option("2", "2", 2);
315    aws->callback(ed_al_check_len_cb);
316    aws->insert_option("3", "3", 3);
317    aws->callback(ed_al_check_len_cb);
318    aws->insert_option("4", "4", 4);
319    aws->callback(ed_al_check_len_cb);
320    aws->insert_option("5", "5", 5);
321    aws->callback(ed_al_check_len_cb);
322    aws->insert_default_option("6", "6", 6);
323    aws->update_option_menu();
324
325    aws->at("rem");
326    aws->create_text_field("presets/alignment_rem");
327
328    return aws;
329}
Note: See TracBrowser for help on using the repository browser.