source: branches/properties/MERGE/MG_alignment.cxx

Last change on this file was 19206, checked in by westram, 2 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.7 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : MG_alignment.cxx                                  //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include "merge.hxx"
12
13#include <awt_sel_boxes.hxx>
14#include <aw_root.hxx>
15#include <aw_awar.hxx>
16#include <aw_msg.hxx>
17#include <arbdbt.h>
18#include <arb_strarray.h>
19#include <arb_global_defs.h>
20#include <AliAdmin.h>
21
22#include <unistd.h>
23
24static void copy_and_check_alignments_ignoreResult() { MG_copy_and_check_alignments(); }
25int MG_copy_and_check_alignments() {
26    // returns 0 if alignments are ok for merging.
27    // otherwise an error message is shown in message box.
28    // checks types and names.
29
30    GB_ERROR error = NULp;
31
32    GB_begin_transaction(GLOBAL_gb_dst);
33    GB_begin_transaction(GLOBAL_gb_src);
34
35    ConstStrArray names;
36    GBT_get_alignment_names(names, GLOBAL_gb_src);
37
38    GBDATA *gb_dst_presets = NULp;
39
40    for (int i = 0; names[i] && !error; ++i) {
41        const char *name       = names[i];
42        GBDATA     *gb_dst_ali = GBT_get_alignment(GLOBAL_gb_dst, name);
43
44        if (!gb_dst_ali) {
45            GB_clear_error(); // from GBT_get_alignment
46
47            GBDATA *gb_src_ali = GBT_get_alignment(GLOBAL_gb_src, name);
48            mg_assert(gb_src_ali);
49
50            if (!gb_dst_presets) {
51                gb_dst_presets = GBT_get_presets(GLOBAL_gb_dst);
52                if (!gb_dst_presets) error = GB_await_error();
53            }
54            if (!error) {
55                gb_dst_ali = GB_create_container(gb_dst_presets, "alignment");
56                if (!gb_dst_ali) error = GB_await_error();
57            }
58            if (!error) error = GB_copy_dropProtectMarksAndTempstate(gb_dst_ali, gb_src_ali);
59            if (!error) error = GBT_add_alignment_changekeys(GLOBAL_gb_dst, name);
60        }
61
62        if (!error) {
63            char *src_type = GBT_get_alignment_type_string(GLOBAL_gb_src, name);
64            char *dst_type = GBT_get_alignment_type_string(GLOBAL_gb_dst, name);
65
66            mg_assert(src_type);
67            mg_assert(dst_type);
68
69            if (strcmp(src_type, dst_type) != 0) {
70                error = GBS_global_string("The alignments '%s' have different types (%s != %s)", name, src_type, dst_type);
71            }
72            free(dst_type);
73            free(src_type);
74        }
75    }
76
77    error = GB_end_transaction(GLOBAL_gb_dst, error);
78    error = GB_end_transaction(GLOBAL_gb_src, error);
79
80    if (error) aw_message(error);
81
82    return !!error;
83}
84
85static void bindAdmin(AW_window *aws, const char *at_ali, const char *at_modify, const char *button_id, AdminType type) {
86    DbSel db = DbSel(type);
87    mg_assert(validDb(db));
88
89    AW_root *aw_root = aws->get_root();
90    GBDATA  *gb_main = get_gb_main(db);
91
92    const char *awarname_select = (db == SRC_DB) ? AWAR_MERGE_TMP_SRC "alignment_name" : AWAR_MERGE_TMP_DST "alignment_name";
93    const char *awarbase        = (db == SRC_DB) ? AWAR_MERGE_TMP_SRC  : AWAR_MERGE_TMP_DST;
94
95    aw_root->awar_string(awarname_select, NO_ALI_SELECTED, AW_ROOT_DEFAULT);
96    AliAdmin *const admin = new AliAdmin(type, gb_main, awarname_select, awarbase); // do not free (bound to callbacks)
97
98    aws->at(at_ali);
99    awt_create_ALI_selection_list(gb_main, aws, awarname_select, "*=");
100
101    aws->at(at_modify);
102    aws->callback(makeCreateWindowCallback(ALI_create_admin_window, admin));
103    aws->create_button(button_id, "MODIFY");
104}
105
106AW_window *MG_create_merge_alignment_window(AW_root *awr) {
107    AW_window_simple *aws = new AW_window_simple;
108
109    aws->init(awr, "MERGE_ALIGNMENTS", "MERGE ALIGNMENTS");
110    aws->load_xfig("merge/alignment.fig");
111
112    aws->at("close");
113    aws->callback(AW_POPDOWN);
114    aws->create_button("CLOSE", "CLOSE", "C");
115
116    aws->at("help");
117    aws->callback(makeHelpCallback("mg_alignment.hlp"));
118    aws->create_button("HELP", "HELP", "H");
119
120    aws->at("check");
121    aws->callback(makeWindowCallback(copy_and_check_alignments_ignoreResult));
122    aws->create_button("CHECK", "Check");
123
124    bindAdmin(aws, "ali1", "modify1", "MODIFY_DB1", SOURCE_ADMIN);
125    bindAdmin(aws, "ali2", "modify2", "MODIFY_DB2", TARGET_ADMIN);
126
127    aws->button_length(0);
128    aws->shadow_width(1);
129    aws->at("icon");
130    aws->callback(makeHelpCallback("mg_alignment.hlp"));
131    aws->create_button("HELP_MERGE", "#merge/icon.xpm");
132
133    return aws;
134}
Note: See TracBrowser for help on using the repository browser.