source: tags/arb_5.1/MERGE/MG_main.cxx

Last change on this file was 6121, checked in by westram, 15 years ago
  • fixed macro ids for merge species window
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.4 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <arbdb.h>
5#include <arbdbt.h>
6
7#include <aw_root.hxx>
8#include <aw_device.hxx>
9#include <aw_window.hxx>
10#include <aw_preset.hxx>
11#include <aw_awars.hxx>
12#include <aw_global.hxx>
13#include <awt.hxx>
14#include <AW_rename.hxx>
15
16#include "merge.hxx"
17
18GBDATA *GLOBAL_gb_merge = NULL;
19GBDATA *GLOBAL_gb_dest  = NULL;
20
21void MG_exit(AW_window *aww, AW_CL cl_reload_db2, AW_CL) {
22    int reload_db2 = (int)cl_reload_db2;
23    if (GLOBAL_gb_main) { // running inside normal ARB (aka import)
24        mg_assert(reload_db2 == 0);
25        aww->hide();
26    }
27    else {
28        if (reload_db2) {
29            char       *db2_name = aww->get_root()->awar(AWAR_MAIN_DB"/file_name")->read_string();
30            const char *cmd      = GBS_global_string("arb_ntree '%s' &", db2_name);
31            int         result   = system(cmd);
32            if (result != 0) fprintf(stderr, "Error running '%s'\n", cmd);
33            free(db2_name);
34        }
35        exit (0);
36    }
37}
38
39bool mg_save_enabled = true;
40
41void MG_save_merge_cb(AW_window *aww)
42{
43    char *name = aww->get_root()->awar(AWAR_MERGE_DB"/file_name")->read_string();
44    GB_begin_transaction(GLOBAL_gb_merge);
45    GBT_check_data(GLOBAL_gb_merge,0);
46    GB_commit_transaction(GLOBAL_gb_merge);
47    GB_ERROR error = GB_save(GLOBAL_gb_merge, name, "b");
48    if (error) aw_message(error);
49    else awt_refresh_selection_box(aww->get_root(), AWAR_MERGE_DB);
50    delete name;
51}
52
53AW_window *MG_save_source_cb(AW_root *aw_root, char *base_name)
54{
55    static AW_window_simple *aws = 0;
56    if (aws) return (AW_window *)aws;
57
58    aws = new AW_window_simple;
59    aws->init( aw_root, "MERGE_SAVE_DB_I", "SAVE ARB DB I");
60    aws->load_xfig("sel_box.fig");
61
62    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
63    aws->create_button("CLOSE","CLOSE","C");
64
65    aws->at("save");aws->callback(MG_save_merge_cb);
66    aws->create_button("SAVE","SAVE","S");
67
68    aws->callback( (AW_CB0)AW_POPDOWN);
69    aws->at("cancel");
70    aws->create_button("CLOSE","CANCEL","C");
71
72    awt_create_selection_box((AW_window *)aws,base_name);
73
74    return (AW_window *)aws;
75}
76
77void MG_save_cb(AW_window *aww)
78{
79    char *name = aww->get_root()->awar(AWAR_MAIN_DB"/file_name")->read_string();
80    char *type = aww->get_root()->awar(AWAR_MAIN_DB"/type")->read_string();
81    aw_openstatus("Saving database");
82    GB_begin_transaction(GLOBAL_gb_dest);
83    GBT_check_data(GLOBAL_gb_dest,0);
84    GB_commit_transaction(GLOBAL_gb_dest);
85    GB_ERROR error = GB_save(GLOBAL_gb_dest, name, type);
86    aw_closestatus();
87    if (error) aw_message(error);
88    else    awt_refresh_selection_box(aww->get_root(), AWAR_MAIN_DB);
89    delete name;
90    delete type;
91}
92
93AW_window *MG_save_result_cb(AW_root *aw_root, char *base_name)
94{
95    static AW_window_simple *aws = 0;
96    if (aws) return (AW_window *)aws;
97    aw_root->awar_string( AWAR_DB_COMMENT, "<no description>", GLOBAL_gb_dest);
98
99    aws = new AW_window_simple;
100    aws->init( aw_root, "MERGE_SAVE_WHOLE_DB", "SAVE WHOLE DATABASE");
101    aws->load_xfig("sel_box.fig");
102
103    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
104    aws->create_button("CLOSE","CLOSE","C");
105
106    awt_create_selection_box((AW_window *)aws,base_name);
107
108    aws->at("user");
109    aws->label("Type");
110    aws->create_option_menu(AWAR_MAIN_DB"/type");
111    aws->insert_option("Binary","B","b");
112    aws->insert_option("Bin (with FastLoad File)","f","bm");
113    aws->update_option_menu();
114
115    aws->at("user2");
116    aws->create_button(0,"Database Description");
117
118
119
120    aws->callback( (AW_CB0)AW_POPDOWN);
121    aws->at("cancel4");
122    aws->create_button("CLOSE","CANCEL","C");
123
124    aws->callback( (AW_CB0)AW_POPDOWN);
125    aws->at("cancel4");
126    aws->create_button("CLOSE", "CANCEL","C");
127
128    aws->at("save4");aws->callback(MG_save_cb);
129    aws->create_button("SAVE","SAVE","S");
130
131
132    aws->at("user3");
133    aws->create_text_field(AWAR_DB_COMMENT);
134
135    return (AW_window *)aws;
136}
137
138void MG_save_quick_result_cb(AW_window *aww) {
139    char *name = aww->get_root()->awar(AWAR_MAIN_DB"/file_name")->read_string();
140    aw_openstatus("Saving database");
141    GB_begin_transaction(GLOBAL_gb_dest);
142    GBT_check_data(GLOBAL_gb_dest, 0);
143    GB_commit_transaction(GLOBAL_gb_dest);
144    GB_ERROR error = GB_save_quick_as(GLOBAL_gb_dest, name);
145    aw_closestatus();
146    if (error)
147        aw_message(error);
148    else
149        awt_refresh_selection_box(aww->get_root(), AWAR_MAIN_DB);
150    delete name;
151    return;
152}
153
154static void MG_create_db_dependent_awars(AW_root *aw_root, GBDATA *gb_merge, GBDATA *gb_dest) {
155    MG_create_db_dependent_rename_awars(aw_root, gb_merge, gb_dest);
156}
157
158static void MG_popup_if_renamed(AW_window *aww, AW_CL cl_create_window) {
159    GB_ERROR error = MG_expect_renamed();
160    if (!error) {
161        static GB_HASHI *popup_hash = GBS_create_hashi(10);
162        AW_window       *aw_popup   = (AW_window*)GBS_read_hashi(popup_hash, cl_create_window);
163
164        if (!aw_popup) { // window has not been created yet
165            typedef AW_window *(*window_creator)(AW_root *);
166            window_creator create_window = (window_creator)cl_create_window;
167            aw_popup                     = create_window(aww->get_root());
168            GBS_write_hashi(popup_hash, cl_create_window, (long)aw_popup);
169        }
170
171        aw_popup->activate();
172    }
173
174    if (error) aw_message(error);
175}
176
177// uses gb_dest and gb_merge
178void MG_start_cb2(AW_window *aww,AW_root *aw_root, bool save_enabled, bool dest_is_new) {
179    GB_ERROR error = 0;
180
181    mg_save_enabled = save_enabled;
182
183    {
184        GB_transaction ta_merge(GLOBAL_gb_merge);
185        GB_transaction ta_dest(GLOBAL_gb_dest);
186
187        GBT_mark_all(GLOBAL_gb_dest,0); // unmark everything in dest DB
188
189        // set DB-type to non-genome (compatibility to old DBs)
190        // when exporting to new DB (dest_is_new == true) -> use DB-type of merge-DB
191        bool merge_is_genome = GEN_is_genome_db(GLOBAL_gb_merge, 0);
192
193        int dest_genome = 0;
194        if (dest_is_new) {
195            if (merge_is_genome) {
196                dest_genome = aw_question("Enter destination DB-type", "Normal,Genome");
197            }
198            else {
199                dest_genome = 0; // from non-genome -> to non-genome
200            }
201        }
202
203        GEN_is_genome_db(GLOBAL_gb_dest, dest_genome); // does not change anything if type is already defined
204    }
205
206    if (!error) {
207        GB_transaction ta_merge(GLOBAL_gb_merge);
208        GB_transaction ta_dest(GLOBAL_gb_dest);
209
210        GB_change_my_security(GLOBAL_gb_dest,6,"passwd");
211        GB_change_my_security(GLOBAL_gb_merge,6,"passwd");
212        if (aww) aww->hide();
213
214        MG_create_db_dependent_awars(aw_root, GLOBAL_gb_merge, GLOBAL_gb_dest);
215    }
216
217    if (!error) {
218        GB_transaction ta_merge(GLOBAL_gb_merge);
219        GB_transaction ta_dest(GLOBAL_gb_dest);
220
221        MG_set_renamed(false, aw_root, "Not renamed yet.");
222
223        AW_window_simple_menu *awm = new AW_window_simple_menu();
224        awm->init(aw_root,"ARB_MERGE", "ARB_MERGE");
225        awm->load_xfig("merge/main.fig");
226
227#if defined(DEBUG)
228        AWT_create_debug_menu(awm);
229#endif // DEBUG
230
231        awm->create_menu("File",     "F", "merge_file.hlp",  AWM_ALL );
232        if (mg_save_enabled && GB_read_clients(GLOBAL_gb_merge)>=0) {
233            awm->insert_menu_topic("save_DB1","Save Data Base I ...",       "S","save_as.hlp",AWM_ALL, AW_POPUP, (AW_CL)MG_save_source_cb,(AW_CL)AWAR_MERGE_DB );
234        }
235
236        awm->insert_menu_topic("quit","Quit",               "Q","quit.hlp", AWM_ALL, MG_exit, 0, 0 );
237        if (mg_save_enabled) {
238            awm->insert_menu_topic("quitnstart","Quit & Start DB II", "D","quit.hlp", AWM_ALL, MG_exit, 1, 0 );
239        }
240
241        awm->insert_menu_topic("save_props","Save properties (to ~/.arb_prop/ntree.arb)",               "p","savedef.hlp",  AWM_ALL,      (AW_CB)AW_save_defaults, 0, 0 );
242
243        awm->button_length(30);
244
245        if (GB_read_clients(GLOBAL_gb_merge)>=0){ // merge two databases
246            awm->at("alignment");
247            awm->callback((AW_CB1)AW_POPUP,(AW_CL)MG_merge_alignment_cb);
248            awm->help_text("mg_alignment.hlp");
249            awm->create_button("CHECK_ALIGNMENTS", "Check alignments ...");
250
251            awm->at("names");
252            awm->callback((AW_CB1)AW_POPUP,(AW_CL)MG_merge_names_cb);
253            awm->help_text("mg_names.hlp");
254            awm->create_button("CHECK_NAMES", "Check names ...");
255        }
256        else { // export into new database
257            MG_set_renamed(true, aw_root, "Not necessary"); // a newly created database needs no renaming
258        }
259
260        awm->at("species");
261        awm->callback(MG_popup_if_renamed, (AW_CL)MG_merge_species_cb);
262        awm->help_text("mg_species.hlp");
263        awm->create_button("TRANSFER_SPECIES", "Transfer species ... ");
264
265        awm->at("extendeds");
266        awm->callback((AW_CB1)AW_POPUP,(AW_CL)MG_merge_extendeds_cb);
267        awm->help_text("mg_extendeds.hlp");
268        awm->create_button("TRANSFER_SAIS", "Transfer SAIs ...");
269
270        awm->at("trees");
271        awm->callback(MG_popup_if_renamed, (AW_CL)MG_merge_trees_cb);
272        awm->help_text("mg_trees.hlp");
273        awm->create_button("TRANSFER_TREES", "Transfer trees ...");
274
275        awm->at("configs");
276        awm->callback(MG_popup_if_renamed, (AW_CL)MG_merge_configs_cb);
277        awm->help_text("mg_configs.hlp");
278        awm->create_button("TRANSFER_CONFIGS", "Transfer configurations ...");
279
280        if (mg_save_enabled && GB_read_clients(GLOBAL_gb_dest)>=0){       // No need to save when importing data
281            awm->at("save");
282            awm->callback(AW_POPUP,(AW_CL)MG_save_result_cb,(AW_CL)AWAR_MAIN_DB);
283            awm->create_button("SAVE_WHOLE_DB2", "Save whole DB II as ...");
284
285            awm->at("save_quick");
286            awm->highlight();
287            awm->callback(MG_save_quick_result_cb);
288            awm->create_button("SAVE_CHANGES_OF_DB2", "Quick-save changes of DB II");
289        }
290
291        awm->button_length(15);
292
293        awm->at("db1");
294        awm->create_button(0,AWAR_MERGE_DB"/file_name");
295
296        awm->at("db2");
297        awm->create_button(0,AWAR_MAIN_DB"/file_name");
298
299        awm->button_length(0);
300        awm->shadow_width(1);
301        awm->at("icon");
302        awm->callback(AW_POPUP_HELP, (AW_CL)"mg_main.hlp");
303        awm->create_button("HELP_MERGE", "#merge/icon.bitmap");
304
305        awm->activate();
306    }
307
308    if (error) aw_message(error);
309}
310
311void MG_start_cb(AW_window *aww)
312{
313    AW_root  *awr   = aww->get_root();
314    GB_ERROR  error = 0;
315    {
316        char *merge = awr->awar(AWAR_MERGE_DB"/file_name")->read_string();
317        if (!strlen(merge) || (strcmp(merge,":") && GB_size_of_file(merge)<=0)) {
318            error = GBS_global_string("Cannot find DB I '%s'", merge);
319        }
320        else {
321            aw_openstatus("Loading databases");
322
323#if defined(DEVEL_RALF)
324#warning where are GLOBAL_gb_merge / GLOBAL_gb_dest closed ?
325#warning when closing them, call AWT_browser_forget_db as well
326#endif // DEVEL_RALF
327            aw_status("DATABASE I");
328            GLOBAL_gb_merge             = GBT_open(merge, "rw", "$(ARBHOME)/lib/pts/*");
329            if (!GLOBAL_gb_merge) error = GB_await_error();
330            else {
331#if defined(DEBUG)
332                AWT_announce_db_to_browser(GLOBAL_gb_merge, GBS_global_string("Database I (source; %s)", merge));
333#endif // DEBUG
334
335                aw_status("DATABASE II");
336
337                char       *main      = awr->awar(AWAR_MAIN_DB"/file_name")->read_string();
338                const char *open_mode = 0;
339
340                if (main[0] == 0) {
341                    error = "You have to specify a name for DB II";
342                }
343                else if (strcmp(main,":") != 0 && GB_size_of_file(main) <= 0 ) {
344                    aw_message(GBS_global_string("Cannot find DB II '%s' -> creating empty database", main));
345                    open_mode = "wc";
346                }
347                else {
348                    open_mode = "rwc";
349                }
350
351                if (!error) {
352                    GLOBAL_gb_dest             = GBT_open(main, open_mode, "$(ARBHOME)/lib/pts/*");
353                    if (!GLOBAL_gb_dest) error = GB_await_error();
354#if defined(DEBUG)
355                    else AWT_announce_db_to_browser(GLOBAL_gb_dest, GBS_global_string("Database II (destination; %s)", main));
356#endif // DEBUG
357                }
358                free(main);
359            }
360            aw_closestatus();
361        }
362        free(merge);
363    }
364
365    if (error) aw_message(error);
366    else MG_start_cb2(aww, awr, true, false);
367}
368
369
370AW_window *create_merge_init_window(AW_root *awr)
371{
372    AW_window_simple *aws = new AW_window_simple;
373    aws->init( awr, "MERGE_SELECT_DATABASES", "MERGE SELECT TWO DATABASES");
374    aws->load_xfig("merge/startup.fig");
375
376    aws->button_length( 10 );
377    aws->label_length( 10 );
378
379    aws->callback( (AW_CB0)exit);
380    aws->at("close");
381    aws->create_button("QUIT","QUIT","A");
382
383    aws->callback(AW_POPUP_HELP,(AW_CL)"arb_merge.hlp");
384    aws->at("help");
385    aws->create_button("HELP","HELP","H");
386
387    awt_create_selection_box(aws,AWAR_MERGE_DB,"");
388    aws->at("type");
389    aws->create_option_menu(AWAR_MERGE_DB"/filter");
390    aws->insert_option("ARB","A","arb");
391    aws->insert_default_option("OTHER","O","");
392    aws->update_option_menu();
393
394    awt_create_selection_box(aws,AWAR_MAIN_DB,"m");
395    aws->at("mtype");
396    aws->create_option_menu(AWAR_MAIN_DB"/filter");
397    aws->insert_option("ARB","A","arb");
398    aws->insert_default_option("OTHER","O","");
399    aws->update_option_menu();
400
401    aws->callback(MG_start_cb);
402
403    aws->button_length(0);
404    aws->shadow_width(1);
405    aws->at("icon");
406    aws->create_button("GO","#merge/icon_vertical.bitmap","G");
407
408    return (AW_window *)aws;
409}
410
411void MG_create_all_awars(AW_root *awr, AW_default aw_def,const char *fname_one, const char *fname_two)
412{
413    aw_create_selection_box_awars(awr, AWAR_MAIN_DB, "", ".arb", fname_two, aw_def);
414    awr->awar_string( AWAR_MAIN_DB"/type", "b",aw_def);
415
416    aw_create_selection_box_awars(awr, AWAR_MERGE_DB, "", ".arb", fname_one, aw_def);
417
418    MG_create_trees_awar(awr,aw_def);
419    MG_create_config_awar(awr,aw_def);
420    MG_create_extendeds_awars(awr,aw_def);
421    MG_create_alignment_awars(awr,aw_def);
422    MG_create_species_awars(awr,aw_def);
423    MG_create_gene_species_awars(awr, aw_def);
424
425    MG_create_rename_awars(awr, aw_def);
426    AWTC_create_rename_awars(awr, aw_def);
427
428#if defined(DEBUG)
429    AWT_create_db_browser_awars(awr, aw_def);
430#endif // DEBUG
431}
432
433AW_window *create_MG_main_window(AW_root *aw_root)
434{
435    MG_create_all_awars(aw_root,AW_ROOT_DEFAULT);
436    AW_window *aww=create_merge_init_window(aw_root);
437    aww->activate();
438    return aww;
439}
440
Note: See TracBrowser for help on using the repository browser.