source: tags/cvs_2_svn/MERGE/MG_main.cxx

Last change on this file was 5396, checked in by westram, 16 years ago
  • fixed usage of GB_HASHI
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.6 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
139MG_save_quick_cb(AW_window *aww)
140{
141    char *name = aww->get_root()->awar(AWAR_MAIN_DB"/file_name")->read_string();
142    aw_openstatus("Saving database");
143    GB_begin_transaction(GLOBAL_gb_dest);
144    GBT_check_data(GLOBAL_gb_dest,0);
145    GB_commit_transaction(GLOBAL_gb_dest);
146    GB_ERROR error = GB_save_quick_as(GLOBAL_gb_dest, name);
147    aw_closestatus();
148    if (error) aw_message(error);
149    else    awt_refresh_selection_box(aww->get_root(), AWAR_MAIN_DB);
150    delete name;
151}
152
153AW_window *MG_save_quick_result_cb(AW_root *aw_root, char *base_name)
154{
155    static AW_window_simple *aws = 0;
156    if (aws) return (AW_window *)aws;
157
158    aws = new AW_window_simple;
159    aws->init( aw_root, "SAVE_CHANGES_OF_DB_II_AS", "SAVE CHANGES TO DB2 AS");
160    aws->load_xfig("sel_box.fig");
161
162    aws->at("close");aws->callback((AW_CB0)AW_POPDOWN);
163    aws->create_button("CLOSE","CLOSE","C");
164
165    aws->at("save");aws->callback(MG_save_quick_cb);
166    aws->create_button("SAVE","SAVE","S");
167
168    awt_create_selection_box((AW_window *)aws,base_name);
169
170    return (AW_window *)aws;
171}
172
173
174static void MG_create_db_dependent_awars(AW_root *aw_root, GBDATA *gb_merge, GBDATA *gb_dest) {
175    MG_create_db_dependent_rename_awars(aw_root, gb_merge, gb_dest);
176}
177
178static void MG_popup_if_renamed(AW_window *aww, AW_CL cl_create_window) {
179    GB_ERROR error = MG_expect_renamed();
180    if (!error) {
181        static GB_HASHI *popup_hash = GBS_create_hashi(10);
182        AW_window       *aw_popup   = (AW_window*)GBS_read_hashi(popup_hash, cl_create_window);
183
184        if (!aw_popup) { // window has not been created yet
185            typedef AW_window *(*window_creator)(AW_root *);
186            window_creator create_window = (window_creator)cl_create_window;
187            aw_popup                     = create_window(aww->get_root());
188            GBS_write_hashi(popup_hash, cl_create_window, (long)aw_popup);
189        }
190       
191        aw_popup->show();
192    }
193
194    if (error) aw_message(error);
195}
196
197// uses gb_dest and gb_merge
198void MG_start_cb2(AW_window *aww,AW_root *aw_root, bool save_enabled, bool dest_is_new) {
199    GB_ERROR error = 0;
200
201    mg_save_enabled = save_enabled;
202
203    {
204        GB_transaction ta_merge(GLOBAL_gb_merge);
205        GB_transaction ta_dest(GLOBAL_gb_dest);
206
207        GBT_mark_all(GLOBAL_gb_dest,0); // unmark everything in dest DB
208
209        // set DB-type to non-genome (compatibility to old DBs)
210        // when exporting to new DB (dest_is_new == true) -> use DB-type of merge-DB
211        bool merge_is_genome = GEN_is_genome_db(GLOBAL_gb_merge, 0);
212
213        int dest_genome = 0;
214        if (dest_is_new) {
215            if (merge_is_genome) {
216                dest_genome = aw_message("Enter destination DB-type", "Normal,Genome");
217            }
218            else {
219                dest_genome = 0; // from non-genome -> to non-genome
220            }
221        }
222
223        GEN_is_genome_db(GLOBAL_gb_dest, dest_genome); // does not change anything if type is already defined
224    }
225
226    if (!error) {
227        GB_transaction ta_merge(GLOBAL_gb_merge);
228        GB_transaction ta_dest(GLOBAL_gb_dest);
229           
230        GB_change_my_security(GLOBAL_gb_dest,6,"passwd");
231        GB_change_my_security(GLOBAL_gb_merge,6,"passwd");
232        if (aww) aww->hide();
233
234        MG_create_db_dependent_awars(aw_root, GLOBAL_gb_merge, GLOBAL_gb_dest);
235    }
236
237    if (!error) {
238        GB_transaction ta_merge(GLOBAL_gb_merge);
239        GB_transaction ta_dest(GLOBAL_gb_dest);
240
241        MG_set_renamed(false, aw_root, "Not renamed yet.");
242
243        AW_window_simple_menu *awm = new AW_window_simple_menu();
244        awm->init(aw_root,"ARB_MERGE", "ARB_MERGE");
245        awm->load_xfig("merge/main.fig");
246
247        awm->create_menu(       0,   "File",     "F", "merge_file.hlp",  AWM_ALL );
248#if defined(DEBUG)
249        awm->insert_menu_topic("db_browser", "Browse loaded database(s)", "", "db_browser.hlp", AWM_ALL, AW_POPUP, (AW_CL)AWT_create_db_browser, 0);
250        awm->insert_separator();
251#endif // DEBUG
252        if (mg_save_enabled && GB_read_clients(GLOBAL_gb_merge)>=0) {
253            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 );
254        }
255
256        awm->insert_menu_topic("quit","Quit",               "Q","quit.hlp", AWM_ALL, MG_exit, 0, 0 );
257        if (mg_save_enabled) {
258            awm->insert_menu_topic("quit","Quit & Start DB II", "D","quit.hlp", AWM_ALL, MG_exit, 1, 0 );
259        }
260
261        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 );
262
263        awm->button_length(30);
264
265        if (GB_read_clients(GLOBAL_gb_merge)>=0){ // merge 2 database
266            awm->at("alignment");
267            awm->callback((AW_CB1)AW_POPUP,(AW_CL)MG_merge_alignment_cb);
268            awm->help_text("mg_alignment.hlp");
269            awm->create_button("CHECK_ALIGNMENTS", "Check Alignments ...");
270
271            awm->at("names");
272            awm->callback((AW_CB1)AW_POPUP,(AW_CL)MG_merge_names_cb);
273            awm->help_text("mg_names.hlp");
274            awm->create_button("CHECK_NAMES", "Check Names ...");
275        }
276        else { // export into new database
277            MG_set_renamed(true, aw_root, "Not necessary"); // a newly created database needs no renaming
278        }
279
280        awm->at("species");
281        awm->callback(MG_popup_if_renamed, (AW_CL)MG_merge_species_cb);
282        awm->help_text("mg_species.hlp");
283        awm->create_button("TRANSFER_SPECIES", "Transfer Species ... ");
284
285        awm->at("extendeds");
286        awm->callback((AW_CB1)AW_POPUP,(AW_CL)MG_merge_extendeds_cb);
287        awm->help_text("mg_extendeds.hlp");
288        awm->create_button("TRANSFER_SAIS", "Transfer SAIs ...");
289
290        awm->at("trees");
291        awm->callback(MG_popup_if_renamed, (AW_CL)MG_merge_trees_cb);
292        awm->help_text("mg_trees.hlp");
293        awm->create_button("TRANSFER_TREES", "Transfer Trees ...");
294
295        awm->at("configs");
296        awm->callback(MG_popup_if_renamed, (AW_CL)MG_merge_configs_cb);
297        awm->help_text("mg_configs.hlp");
298        awm->create_button("TRANSFER_CONFIGS", "Transfer Configurations ...");
299
300        if (mg_save_enabled && GB_read_clients(GLOBAL_gb_dest)>=0){       // No need to save when importing data
301            awm->at("save");
302            awm->callback(AW_POPUP,(AW_CL)MG_save_result_cb,(AW_CL)AWAR_MAIN_DB);
303            awm->create_button("SAVE_WHOLE_DB2", "Save Whole DB II ...");
304
305            awm->at("save_quick");
306            awm->highlight();
307            awm->callback(AW_POPUP,(AW_CL)MG_save_quick_result_cb,(AW_CL)AWAR_MAIN_DB);
308            awm->create_button("SAVE_CHANGES_OF_DB2", "Save Changes of DB II as ...");
309        }
310
311        awm->button_length(15);
312
313        awm->at("db1");
314        awm->create_button(0,AWAR_MERGE_DB"/file_name");
315
316        awm->at("db2");
317        awm->create_button(0,AWAR_MAIN_DB"/file_name");
318
319        awm->button_length(0);
320        awm->shadow_width(1);
321        awm->at("icon");
322        awm->callback(AW_POPUP_HELP, (AW_CL)"mg_main.hlp");
323        awm->create_button("HELP_MERGE", "#merge/icon.bitmap");
324
325        awm->show();
326    }
327
328    if (error) aw_message(error);
329}
330
331void MG_start_cb(AW_window *aww)
332{
333    AW_root *awr = aww->get_root();
334    GB_ERROR error = 0;
335    {
336        char *merge = awr->awar(AWAR_MERGE_DB"/file_name")->read_string();
337        if (!strlen(merge) || (strcmp(merge,":") && GB_size_of_file(merge)<=0)) {
338            error = "Cannot find database I file";
339        }
340        else {
341            char *main = awr->awar(AWAR_MAIN_DB"/file_name")->read_string();
342            if (!strlen(main) || (strcmp(main,":") && GB_size_of_file(main)<=0 )) {
343                error = "Cannot find main file -> creating empty database";
344            }
345            else {
346                aw_openstatus("Loading databases");
347               
348                aw_status("DATABASE I");
349                GLOBAL_gb_merge = GBT_open(merge,"rw","$(ARBHOME)/lib/pts/*");
350                if (!GLOBAL_gb_merge) {
351                    error = GB_get_error();
352                }
353                else {
354                    AWT_announce_db_to_browser(GLOBAL_gb_merge, GBS_global_string("Database I (source; %s)", merge));
355
356                    aw_status("DATABASE II");
357                    GLOBAL_gb_dest = GBT_open(main,"rwc","$(ARBHOME)/lib/pts/*");
358
359                    if (!GLOBAL_gb_dest) {
360                        error = GB_get_error();
361                    }
362                    else {
363                        AWT_announce_db_to_browser(GLOBAL_gb_dest, GBS_global_string("Database II (destination; %s)", main));
364                    }
365                }
366                aw_closestatus();
367            }
368            free(main);
369        }
370        free(merge);
371    }
372
373    if (error) aw_message(error);
374    else MG_start_cb2(aww, awr, true, false);
375}
376
377
378AW_window *create_merge_init_window(AW_root *awr)
379{
380    AW_window_simple *aws = new AW_window_simple;
381    aws->init( awr, "MERGE_SELECT_DATABASES", "MERGE SELECT TWO DATABASES");
382    aws->load_xfig("merge/startup.fig");
383
384    aws->button_length( 10 );
385    aws->label_length( 10 );
386
387    aws->callback( (AW_CB0)exit);
388    aws->at("close");
389    aws->create_button("QUIT","QUIT","A");
390
391    aws->callback(AW_POPUP_HELP,(AW_CL)"arb_merge.hlp");
392    aws->at("help");
393    aws->create_button("HELP","HELP","H");
394
395    awt_create_selection_box(aws,AWAR_MERGE_DB,"");
396    aws->at("type");
397    aws->create_option_menu(AWAR_MERGE_DB"/filter");
398    aws->insert_option("ARB","A","arb");
399    aws->insert_default_option("OTHER","O","");
400    aws->update_option_menu();
401
402    awt_create_selection_box(aws,AWAR_MAIN_DB,"m");
403    aws->at("mtype");
404    aws->create_option_menu(AWAR_MAIN_DB"/filter");
405    aws->insert_option("ARB","A","arb");
406    aws->insert_default_option("OTHER","O","");
407    aws->update_option_menu();
408
409    aws->callback(MG_start_cb);
410
411    aws->button_length(0);
412    aws->shadow_width(1);
413    aws->at("icon");
414    aws->create_button("GO","#merge/icon_vertical.bitmap","G");
415
416    return (AW_window *)aws;
417}
418
419void MG_create_all_awars(AW_root *awr, AW_default aw_def,const char *fname_one, const char *fname_two)
420{
421    aw_create_selection_box_awars(awr, AWAR_MAIN_DB, "", ".arb", fname_two, aw_def);
422    awr->awar_string( AWAR_MAIN_DB"/type", "b",aw_def);
423
424    aw_create_selection_box_awars(awr, AWAR_MERGE_DB, "", ".arb", fname_one, aw_def);
425
426    MG_create_trees_awar(awr,aw_def);
427    MG_create_config_awar(awr,aw_def);
428    MG_create_extendeds_awars(awr,aw_def);
429    MG_create_alignment_awars(awr,aw_def);
430    MG_create_species_awars(awr,aw_def);
431    MG_create_gene_species_awars(awr, aw_def);
432
433    MG_create_rename_awars(awr, aw_def);
434    AWTC_create_rename_awars(awr, aw_def);
435    AWT_create_db_browser_awars(awr, aw_def);
436}
437
438AW_window *create_MG_main_window(AW_root *aw_root)
439{
440    MG_create_all_awars(aw_root,AW_ROOT_DEFAULT);
441    AW_window *aww=create_merge_init_window(aw_root);
442    aww->show();
443    return aww;
444}
445
Note: See TracBrowser for help on using the repository browser.