source: tags/ms_r16q3/SL/ALILINK/AdminGui.cxx

Last change on this file was 14731, checked in by westram, 8 years ago
  • mark code binding callbacks to non-button-widgets (probably incomplete; see #559 for details)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.1 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : AdminGui.cxx                                      //
4//   Purpose   : alignment admin GUI                               //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include <insdel.h>
12
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 <arbdbt.h>
19#include <AliAdmin.h>
20
21static void alignment_vars_callback(AW_root *, AliAdmin *admin) {
22    ali_assert(!GB_have_error());
23
24    GBDATA         *gb_main  = admin->get_gb_main();
25    GB_transaction  ta(gb_main);
26    GBDATA         *ali_cont = GBT_get_alignment(gb_main, admin->get_selected_ali());
27
28    if (!ali_cont) {
29        GB_clear_error();
30        admin->type_awar()->unmap();
31        admin->len_awar()->unmap();
32        admin->aligned_awar()->unmap();
33        admin->security_awar()->unmap();
34        admin->remark_awar()->unmap();
35        admin->auto_awar()->unmap();
36    }
37    else {
38        GBDATA *ali_len         = GB_search(ali_cont, "alignment_len",            GB_INT);
39        GBDATA *ali_aligned     = GB_search(ali_cont, "aligned",                  GB_INT);
40        GBDATA *ali_type        = GB_search(ali_cont, "alignment_type",           GB_STRING);
41        GBDATA *ali_security    = GB_search(ali_cont, "alignment_write_security", GB_INT);
42        GBDATA *ali_rem         = GB_search(ali_cont, "alignment_rem",            GB_STRING);
43        GBDATA *ali_auto_format = GB_search(ali_cont, "auto_format",              GB_INT);
44
45        admin->type_awar()    ->map(ali_type);
46        admin->len_awar()     ->map(ali_len);
47        admin->aligned_awar() ->map(ali_aligned);
48        admin->security_awar()->map(ali_security);
49        admin->remark_awar()  ->map(ali_rem);
50        admin->auto_awar()    ->map(ali_auto_format);
51    }
52
53    ali_assert(!GB_have_error());
54}
55
56static void create_admin_awars(AW_root *aw_root, AW_default aw_def, AliAdmin *admin) {
57    aw_root->awar_string(admin->dest_name(),   "", aw_def)->set_srt(GBT_ALI_AWAR_SRT);
58    aw_root->awar_string(admin->type_name(),   "", aw_def);
59    aw_root->awar_string(admin->remark_name(), "", aw_def);
60
61    aw_root->awar_int(admin->len_name(),      0, aw_def);
62    aw_root->awar_int(admin->aligned_name(),  0, aw_def);
63    aw_root->awar_int(admin->security_name(), 0, aw_def);
64    aw_root->awar_int(admin->auto_name(),     0, aw_def);
65
66    RootCallback rcb = makeRootCallback(alignment_vars_callback, admin);
67    admin->select_awar()->add_callback(rcb);
68    rcb(aw_root);
69}
70
71static void delete_ali_cb(AW_window *, AliAdmin *admin) {
72    if (aw_ask_sure("delete_ali_data", "Are you sure to delete all data belonging to this alignment?")) {
73        GBDATA         *gb_main = admin->get_gb_main();
74        GB_transaction  ta(gb_main);
75        GB_ERROR        error   = GBT_rename_alignment(gb_main, admin->get_selected_ali(), 0, 0, 1);
76
77        error = ta.close(error);
78        if (error) aw_message(error);
79    }
80}
81
82static void ali_checklen_cb(AW_window *, AliAdmin *admin) {
83    GBDATA         *gb_main = admin->get_gb_main();
84    GB_transaction  ta(gb_main);
85    GB_ERROR        error   = GBT_check_data(gb_main, admin->get_selected_ali());
86
87    error = ta.close(error);
88    aw_message_if(error);
89}
90
91static void never_auto_format_ali_genom_cb(AW_window *, AliAdmin *admin) {
92    if (strcmp(admin->get_selected_ali(), "ali_genom") == 0) {
93        admin->auto_awar()->write_int(2); // ali_genom is always forced to "skip"
94    }
95}
96
97static void ali_format_cb(AW_window *aww, AliAdmin *admin) {
98    {
99        GB_transaction ta(admin->get_gb_main());
100        GB_ERROR       error = ARB_format_alignment(admin->get_gb_main(), admin->get_selected_ali());
101        aw_message_if(error);
102    }
103    ali_checklen_cb(aww, admin);
104}
105
106enum CopyRenameMode {
107    CRM_RENAME,
108    CRM_COPY,
109};
110
111static void copy_rename_cb(AW_window *aww, AliAdmin *admin, CopyRenameMode mode) {
112    ali_assert(!GB_have_error());
113
114    GBDATA     *gb_main = admin->get_gb_main();
115    const char *source  = admin->get_selected_ali();
116    const char *dest    = admin->get_dest_ali();
117    GB_ERROR    error   = GB_begin_transaction(gb_main);
118
119    if (!error) error = GBT_rename_alignment(gb_main, source, dest, 1, mode == CRM_RENAME);
120    if (!error) {
121        char *nfield = GBS_global_string_copy("%s/data", dest);
122        error        = GBT_add_new_changekey(gb_main, nfield, GB_STRING);
123        free(nfield);
124    }
125
126    error = GB_end_transaction(gb_main, error);
127    aww->hide_or_notify(error);
128
129    ali_assert(!GB_have_error());
130}
131
132static AW_window *create_alignment_copy_window(AW_root *, AliAdmin *admin) {
133    AW_window_simple *aws = new AW_window_simple;
134    admin->window_init(aws, "COPY_%s", "Copy %s");
135    aws->load_xfig("ad_al_si.fig");
136
137    aws->at("close");
138    aws->callback(AW_POPDOWN);
139    aws->create_button("CLOSE", "CLOSE", "C");
140
141    aws->at("label");
142    aws->create_autosize_button(0, "Please enter the new name\nof the alignment");
143
144    aws->at("input");
145    aws->create_input_field(admin->dest_name(), 15);
146
147    aws->at("ok");
148    aws->callback(makeWindowCallback(copy_rename_cb, admin, CRM_COPY));
149    aws->create_button("GO", "GO", "G");
150
151    return (AW_window *)aws;
152}
153
154static AW_window *create_alignment_rename_window(AW_root *, AliAdmin *admin) {
155    AW_window_simple *aws = new AW_window_simple;
156    admin->window_init(aws, "RENAME_%s", "Rename %s");
157    aws->load_xfig("ad_al_si.fig");
158
159    aws->at("close");
160    aws->callback(AW_POPDOWN);
161    aws->create_button("CLOSE", "CLOSE", "C");
162
163    aws->at("label");
164    aws->create_autosize_button(0, "Please enter the name\nof the new alignment");
165
166    aws->at("input");
167    aws->create_input_field(admin->dest_name(), 15);
168
169    aws->at("ok");
170    aws->callback(makeWindowCallback(copy_rename_cb, admin, CRM_RENAME));
171    aws->create_button("GO", "GO", "G");
172
173    return (AW_window *)aws;
174}
175
176static void create_alignment_cb(AW_window *, AliAdmin *admin) {
177    GBDATA   *gb_main = admin->get_gb_main();
178    GB_ERROR  error   = GB_begin_transaction(gb_main);
179    if (!error) {
180        const char *name   = admin->get_dest_ali();
181        GBDATA     *gb_ali = GBT_create_alignment(gb_main, name, 0, 0, 0, "dna");
182
183        if (!gb_ali) error = GB_await_error();
184        else {
185            char *nfield = GBS_global_string_copy("%s/data", name);
186            error        = GBT_add_new_changekey(gb_main, nfield, GB_STRING);
187            free(nfield);
188        }
189    }
190    GB_end_transaction_show_error(gb_main, error, aw_message);
191}
192
193static AW_window *create_alignment_create_window(AW_root *, AliAdmin *admin) {
194    AW_window_simple *aws = new AW_window_simple;
195    admin->window_init(aws, "CREATE_%s", "Create %s");
196    aws->load_xfig("ad_al_si.fig");
197
198    aws->at("close");
199    aws->callback(AW_POPDOWN);
200    aws->create_button("CLOSE", "CLOSE", "C");
201
202    aws->at("label");
203    aws->create_autosize_button(0, "Please enter the new name\nof the alignment");
204
205    aws->at("input");
206    aws->create_input_field(admin->dest_name(), 15);
207
208    aws->at("ok");
209    aws->callback(makeWindowCallback(create_alignment_cb, admin));
210    aws->create_button("GO", "GO", "G");
211
212    return (AW_window *)aws;
213}
214
215AW_window *ALI_create_admin_window(AW_root *root, AliAdmin *admin) {
216    if (!admin->get_window()) {
217        GBDATA           *gb_main = admin->get_gb_main();
218        AW_window_simple *aws     = new AW_window_simple;
219
220        create_admin_awars(root, AW_ROOT_DEFAULT, admin);
221        admin->store_window(aws);
222
223        admin->window_init(aws, "INFO_OF_%s", "%s information");
224        aws->load_xfig("ad_align.fig");
225
226        aws->at("close");
227        aws->callback(AW_POPDOWN);
228        aws->create_button("CLOSE", "CLOSE", "C");
229
230        aws->at("help");
231        aws->callback(makeHelpCallback("ad_align.hlp"));
232        aws->create_button("HELP", "HELP", "H");
233
234        // button column
235        aws->button_length(13);
236
237        aws->at("delete");
238        aws->callback(makeWindowCallback(delete_ali_cb, admin));
239        aws->create_button("DELETE", "DELETE", "D");
240
241        aws->at("rename");
242        aws->callback(makeCreateWindowCallback(create_alignment_rename_window, admin));
243        aws->create_button("RENAME", "RENAME", "R");
244
245        aws->at("create");
246        aws->callback(makeCreateWindowCallback(create_alignment_create_window, admin));
247        aws->create_button("CREATE", "CREATE", "N");
248
249        aws->at("copy");
250        aws->callback(makeCreateWindowCallback(create_alignment_copy_window, admin));
251        aws->create_button("COPY", "COPY", "C");
252
253        aws->at("check_len");
254        aws->callback(makeWindowCallback(ali_checklen_cb, admin));
255        aws->create_button("CHECK_LEN", "CHECK LEN", "L");
256
257        aws->at("align");
258        aws->callback(makeWindowCallback(ali_format_cb, admin));
259        aws->create_button("FORMAT", "FORMAT", "F");
260
261        // ali selection list
262        aws->at("list");
263        awt_create_ALI_selection_list(gb_main, aws, admin->select_name(), "*=");
264
265        // alignment settings
266        aws->at("aligned");
267        aws->create_option_menu(admin->aligned_name(), true);
268        aws->callback(makeWindowCallback(ali_checklen_cb, admin)); aws->insert_default_option("not formatted", "n", 0); // @@@ used as OPTIONMENU_SELECT_CB (see #559)
269        aws->callback(makeWindowCallback(ali_format_cb, admin));   aws->insert_option("formatted", "j", 1); // @@@ used as OPTIONMENU_SELECT_CB (see #559)
270        aws->update_option_menu();
271
272        aws->at("len");
273        aws->create_input_field(admin->len_name(), 8);
274
275        aws->at("type");
276        aws->create_option_menu(admin->type_name(), true);
277        aws->insert_option("dna", "d", "dna");
278        aws->insert_option("rna", "r", "rna");
279        aws->insert_option("pro", "p", "ami");
280        aws->insert_default_option("???", "?", "usr");
281        aws->update_option_menu();
282
283        aws->at("security");
284        aws->callback(makeWindowCallback(ali_checklen_cb, admin)); // @@@ used as OPTIONMENU_SELECT_CB (see #559)
285        aws->create_option_menu(admin->security_name(), true);
286        aws->insert_option("0", "0", 0);
287        aws->insert_option("1", "1", 1);
288        aws->insert_option("2", "2", 2);
289        aws->insert_option("3", "3", 3);
290        aws->insert_option("4", "4", 4);
291        aws->insert_option("5", "5", 5);
292        aws->insert_default_option("6", "6", 6);
293        aws->update_option_menu();
294
295        aws->at("auto_format");
296        aws->callback(makeWindowCallback(never_auto_format_ali_genom_cb, admin)); // @@@ used as OPTIONMENU_SELECT_CB (see #559)
297        aws->create_option_menu(admin->auto_name(), true);
298        aws->insert_default_option("ask", "a", 0);
299        aws->insert_option("always", "", 1);
300        aws->insert_option("never", "", 2);
301        aws->update_option_menu();
302
303        aws->at("rem");
304        aws->create_text_field(admin->remark_name());
305    }
306
307    return admin->get_window();
308}
309
Note: See TracBrowser for help on using the repository browser.