source: tags/arb-6.0/MERGE/MG_extendeds.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: 7.4 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : MG_extendeds.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 <db_scanner.hxx>
14#include <awt_sel_boxes.hxx>
15#include <aw_awar.hxx>
16#include <aw_msg.hxx>
17#include <aw_root.hxx>
18#include <arbdbt.h>
19
20#define AWAR_EX_NAME_SRC    AWAR_MERGE_TMP_SRC "extended_name"
21#define AWAR_EX_NAME_DST    AWAR_MERGE_TMP_DST "extended_name"
22#define AWAR_EX_NAME(db_nr) awar_name_tmp(db_nr, "extended_name")
23#define AWAR_EX_DEST        AWAR_MERGE_TMP "extended_dest"
24
25void MG_create_extendeds_awars(AW_root *aw_root, AW_default aw_def)
26{
27    aw_root->awar_string(AWAR_EX_NAME_SRC, "", aw_def);
28    aw_root->awar_string(AWAR_EX_NAME_DST, "", aw_def);
29    aw_root->awar_string(AWAR_EX_DEST,  "", aw_def);
30}
31
32static void MG_extended_rename_cb(AW_window *aww, GBDATA *gbmain, int db_nr) {
33    AW_root *awr    = aww->get_root();
34    char    *source = awr->awar(AWAR_EX_NAME(db_nr))->read_string();
35    char    *dest   = awr->awar(AWAR_EX_DEST)->read_string();
36
37    GB_ERROR error = GB_begin_transaction(gbmain);
38    if (!error) {
39        GBDATA *gb_sai_data     = GBT_get_SAI_data(gbmain);
40        if (!gb_sai_data) error = GB_await_error();
41        else {
42            GBDATA *gb_sai      = GBT_find_SAI_rel_SAI_data(gb_sai_data, source);
43            GBDATA *gb_dest_sai = GBT_find_SAI_rel_SAI_data(gb_sai_data, dest);
44
45            if (gb_dest_sai) error  = GBS_global_string("SAI '%s' already exists", dest);
46            else if (!gb_sai) error = "Please select a SAI";
47            else error              = GBT_write_string(gb_sai, "name", dest);
48        }
49    }
50    error = GB_end_transaction(gbmain, error);
51    aww->hide_or_notify(error);
52
53    free(dest);
54    free(source);
55}
56
57static AW_window *MG_create_extended_rename_window(AW_root *root, int db_nr) {
58    AW_window_simple *aws = new AW_window_simple;
59    if (db_nr == 1) {
60        aws->init(root, "MERGE_RENAME_SAI_1", "SAI RENAME 1");
61    }
62    else {
63        aws->init(root, "MERGE_RENAME_SAI_2", "SAI RENAME 2");
64    }
65    aws->load_xfig("ad_al_si.fig");
66
67    aws->callback((AW_CB0)AW_POPDOWN);
68    aws->at("close");
69    aws->create_button("CLOSE", "CLOSE", "C");
70
71    aws->at("label");
72    aws->create_autosize_button(0, "Please enter the new name\nof the SAI");
73
74    aws->at("input");
75    aws->create_input_field(AWAR_EX_DEST, 15);
76
77    aws->at("ok");
78    aws->callback(makeWindowCallback(MG_extended_rename_cb, GLOBAL_gb_dst, db_nr));
79    aws->create_button("GO", "GO", "G");
80
81    return aws;
82}
83
84static void MG_extended_delete_cb(AW_window *aww, int db_nr) {
85    GBDATA   *gbmain = get_gb_main(db_nr);
86    GB_ERROR  error  = GB_begin_transaction(gbmain);
87
88    if (!error) {
89        char   *source    = aww->get_root()->awar(AWAR_EX_NAME(db_nr))->read_string();
90        GBDATA *gb_sai    = GBT_find_SAI(gbmain, source);
91        if (gb_sai) error = GB_delete(gb_sai);
92        else    error     = "Please select a SAI first";
93
94        free(source);
95    }
96    GB_end_transaction_show_error(gbmain, error, aw_message);
97}
98
99static void MG_transfer_extended(AW_window *aww) {
100    AW_root *awr    = aww->get_root();
101    char    *source = awr->awar(AWAR_EX_NAME_SRC)->read_string();
102    char    *dest   = awr->awar(AWAR_EX_NAME_SRC)->read_string();
103
104    GB_ERROR error    = GB_begin_transaction(GLOBAL_gb_dst);
105    if (!error) error = GB_begin_transaction(GLOBAL_gb_src);
106
107    if (!error) {
108        GBDATA *gb_src = GBT_find_SAI(GLOBAL_gb_src, dest);
109
110        if (!gb_src) error = "Please select the SAI you want to transfer";
111        else {
112            GBDATA *gb_dst_sai_data     = GBT_get_SAI_data(GLOBAL_gb_dst);
113            if (!gb_dst_sai_data) error = GB_await_error();
114            else {
115                GBDATA *gb_dest_sai = GBT_find_SAI_rel_SAI_data(gb_dst_sai_data, dest);
116                if (gb_dest_sai) {
117                    // if (force) error = GB_delete(gb_dest_sai); else
118                    error = GBS_global_string("SAI '%s' exists, delete it first", dest);
119                }
120                if (!error) {
121                    gb_dest_sai             = GB_create_container(gb_dst_sai_data, "extended");
122                    if (!gb_dest_sai) error = GB_await_error();
123                    else error              = GB_copy(gb_dest_sai, gb_src);
124                }
125            }
126        }
127    }
128
129    error = GB_end_transaction(GLOBAL_gb_dst, error);
130    error = GB_end_transaction(GLOBAL_gb_src, error);
131    if (error) aw_message(error);
132
133    free(source);
134    free(dest);
135}
136
137inline void map_extended(AW_root *aw_root, DbScanner *scanner, int db_nr) {
138    GBDATA *gb_main = get_gb_main(db_nr);
139    GB_transaction ta(gb_main);
140    GBDATA *gb_sai  = GBT_find_SAI(gb_main, aw_root->awar(AWAR_EX_NAME(db_nr))->read_char_pntr());
141    map_db_scanner(scanner, gb_sai, CHANGE_KEY_PATH);
142}
143
144static void MG_map_src_extended(AW_root *aw_root, DbScanner *scanner) { map_extended(aw_root, scanner, 1); }
145static void MG_map_dst_extended(AW_root *aw_root, DbScanner *scanner) { map_extended(aw_root, scanner, 2); }
146
147AW_window *MG_create_merge_SAIs_window(AW_root *awr) {
148    AW_window_simple *aws = new AW_window_simple;
149
150    aws->init(awr, "MERGE_SAI", "MERGE SAI");
151    aws->load_xfig("merge/extended.fig");
152
153    aws->at("close"); aws->callback((AW_CB0)AW_POPDOWN);
154    aws->create_button("CLOSE", "CLOSE", "C");
155
156    aws->at("help");
157    aws->callback(makeHelpCallback("mg_extendeds.hlp"));
158    aws->create_button("HELP", "HELP", "H");
159
160    aws->at("ex1");
161    awt_create_selection_list_on_sai(GLOBAL_gb_src, aws, AWAR_EX_NAME_SRC, true);
162    DbScanner *scanner = create_db_scanner(GLOBAL_gb_src, aws, "info1", 0, 0, 0, DB_SCANNER, 0, 0, 0, SPECIES_get_selector());
163    aws->get_root()->awar(AWAR_EX_NAME_SRC)->add_callback(makeRootCallback(MG_map_src_extended, scanner));
164
165    aws->at("ex2");
166    awt_create_selection_list_on_sai(GLOBAL_gb_dst, aws, AWAR_EX_NAME_DST, true);
167    scanner = create_db_scanner(GLOBAL_gb_dst, aws, "info2", 0, 0, 0, DB_SCANNER, 0, 0, 0, SPECIES_get_selector());
168    aws->get_root()->awar(AWAR_EX_NAME_DST)->add_callback(makeRootCallback(MG_map_dst_extended, scanner));
169
170    aws->button_length(20);
171
172    aws->at("delete1");
173    aws->callback(makeWindowCallback(MG_extended_delete_cb, 1));
174    aws->create_button("DELETE_SAI_DB1", "Delete SAI");
175
176    aws->at("delete2");
177    aws->callback(makeWindowCallback(MG_extended_delete_cb, 2));
178    aws->create_button("DELETE_SAI_DB2", "Delete SAI");
179
180    aws->at("rename1");
181    aws->callback(makeCreateWindowCallback(MG_create_extended_rename_window, 1));
182    aws->create_button("RENAME_SAI_DB1", "Rename SAI");
183
184    aws->at("rename2");
185    aws->callback(makeCreateWindowCallback(MG_create_extended_rename_window, 2));
186    aws->create_button("RENAME_SAI_DB2", "Rename SAI");
187
188    aws->at("transfer");
189    aws->callback(MG_transfer_extended);
190    aws->create_button("TRANSFER_SAI", "Transfer SAI");
191
192    aws->button_length(0);
193    aws->shadow_width(1);
194    aws->at("icon");
195    aws->callback(makeHelpCallback("mg_extendeds.hlp"));
196    aws->create_button("HELP_MERGE", "#merge/icon.xpm");
197
198    return aws;
199}
Note: See TracBrowser for help on using the repository browser.