ARB
MG_main.cxx
Go to the documentation of this file.
1 // =============================================================== //
2 // //
3 // File : MG_main.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 #include <AW_rename.hxx>
13 #include <app.hxx>
14 #include <arb_spec.hxx>
15 
16 #include <macros.hxx>
17 #include <MacroExitor.hxx>
18 
19 #include <aw_preset.hxx>
20 #include <aw_awars.hxx>
21 #include <aw_file.hxx>
22 
23 #include <arb_progress.h>
24 #include <arb_file.h>
25 
26 // AISC_MKPT_PROMOTE:// source and destination DBs for merge:
27 // AISC_MKPT_PROMOTE:extern GBDATA *GLOBAL_gb_src;
28 // AISC_MKPT_PROMOTE:extern GBDATA *GLOBAL_gb_dst;
29 
32 
33 __ATTR__NORETURN static void (*MG_exit_cb)(const char *) = NULp;
34 
35 class MG_MacroExitor: public MacroExitor {
36  bool start_dst_db;
37 
38  char *find_existing_directory_of(const char *fullpath) {
39  char *parent;
40  GB_split_full_path(fullpath, &parent, NULp, NULp, NULp);
41  return (parent && !GB_is_directory(parent)) ? NULp : parent;
42  }
43 
44  __ATTR__NORETURN void perform_exit() OVERRIDE {
45  AW_root *awr = get_root();
46  char *restart_args = NULp;
47 
48  {
49  const char *dst_db_name = awr->awar(AWAR_DB_DST"/file_name")->read_char_pntr();
50  if (start_dst_db) { // restart with destination DB
51  restart_args = GBK_singlequote(dst_db_name);
52  }
53  else if (!is_performing_delayed_exit() && // manual quit (not via macro)
54  strcmp(dst_db_name, ":") != 0) // target database is not client-DB (of a running arb instance)
55  {
56  // start intro window (prefer directory of destination database)
57  char *start_dir = find_existing_directory_of(awr->awar(AWAR_DB_DST"/file_name")->read_char_pntr());
58  if (!start_dir) start_dir = find_existing_directory_of(awr->awar(AWAR_DB_SRC"/file_name")->read_char_pntr());
59 
60  if (start_dir) {
61  restart_args = GBK_singlequote(start_dir);
62  freenull(start_dir);
63  }
64  }
65  }
66 
67  ARB_disconnect_from_db(awr, GLOBAL_gb_src);
68  ARB_disconnect_from_db(awr, GLOBAL_gb_dst);
69 
71  MG_exit_cb(restart_args); // effectively calls ../NTREE/NT_main.cxx@exit_from_merge
72  }
73 
74  GBDATA* get_gbmain_checked_for_save() OVERRIDE {
75  return GLOBAL_gb_dst;
76  }
77 
78 public:
79  MG_MacroExitor(AW_root *aw_root_, bool start_dst_db_)
80  : MacroExitor(aw_root_, "ARB_MERGE"),
81  start_dst_db(start_dst_db_)
82  {}
83 };
84 
85 static void MG_confirm_exit_restart_if(AW_window *aww, bool start_dst_db) {
86  // finally (may) exit ARB merge-tool using MG_MacroExitor::perform_exit above.
87  //
88  // Beforehand this will happen:
89  // - if no macro running -> asks user to confirm quit (and maybe aborts restart).
90  // - otherwise waits for macro to finish, then quits w/o question.
91 
92  static SmartPtr<MG_MacroExitor> exitor;
93  if (exitor.isNull()) exitor = new MG_MacroExitor(aww->get_root(), start_dst_db);
94  exitor->maybe_exit_delayed();
95  if (!exitor->is_performing_delayed_exit()) exitor.setNull();
96 }
97 
98 static void MG_save_cb(AW_window *aww, bool source_database) {
99  GBDATA *gb_db_to_save = source_database ? GLOBAL_gb_src : GLOBAL_gb_dst;
100  const char *base_name = source_database ? AWAR_DB_SRC : AWAR_DB_DST; // awar basename
101 
102  AW_root *awr = aww->get_root();
103  char *name = awr->awar(GBS_global_string("%s/file_name", base_name))->read_string();
104  const char *atype = awr->awar(GBS_global_string("%s/type", base_name))->read_char_pntr();
105  const char *ctype = awr->awar(GBS_global_string("%s/compression", base_name))->read_char_pntr();
106  char *type = GBS_global_string_copy("%s%s", atype, ctype);
107 
108  arb_progress progress(GBS_global_string("Saving %s database", source_database ? "source" : "target"));
109 
110  awr->dont_save_awars_with_default_value(gb_db_to_save); // has to be done outside transaction!
111  GB_begin_transaction(gb_db_to_save);
112  GBT_check_data(gb_db_to_save, NULp);
113  GB_commit_transaction(gb_db_to_save);
114 
115  GB_ERROR error = GB_save(gb_db_to_save, name, type);
116  if (error) aw_message(error);
117  else AW_refresh_fileselection(awr, base_name);
118 
119  free(type);
120  free(name);
121 }
122 
123 static AW_window *MG_create_save_as_window(AW_root *aw_root, bool source_database) {
124  GBDATA *gb_db_to_save = source_database ? GLOBAL_gb_src : GLOBAL_gb_dst;
125  const char *base_name = source_database ? AWAR_DB_SRC : AWAR_DB_DST; // awar basename
126  const char *window_id = source_database ? "MERGE_SAVE_DB_I" : "MERGE_SAVE_WHOLE_DB";
127 
128  aw_root->awar_string(AWAR_DB_COMMENT, "<no description>", gb_db_to_save);
129 
130  AW_window_simple *aws = new AW_window_simple;
131  aws->init(aw_root, window_id, GBS_global_string("Save whole %s database", source_database ? "source" : "target"));
132  aws->load_xfig("save_as.fig");
133 
134  aws->at("close");
135  aws->callback(AW_POPDOWN);
136  aws->create_button("CLOSE", "CLOSE", "C");
137 
138  aws->at("help");
139  aws->callback(makeHelpCallback("save.hlp"));
140  aws->create_button("HELP", "HELP", "H");
141 
142  AW_create_standard_fileselection(aws, base_name);
143 
144  aws->at("type");
145  AWT_insert_DBsaveType_selector(aws, GBS_global_string("%s/type", base_name));
146 
147  aws->at("compression");
148  AWT_insert_DBcompression_selector(aws, GBS_global_string("%s/compression", base_name));
149 
150  aws->at("save");
151  aws->callback(makeWindowCallback(MG_save_cb, source_database));
152  aws->create_button("SAVE", "SAVE", "S");
153 
154  aws->at("comment");
155  aws->create_text_field(AWAR_DB_COMMENT);
156 
157  return aws;
158 }
159 
161  char *name = aww->get_root()->awar(AWAR_DB_DST"/file_name")->read_string();
162 
163  arb_progress progress("Saving database");
164  GB_begin_transaction(GLOBAL_gb_dst);
165  GBT_check_data(GLOBAL_gb_dst, NULp);
166  GB_commit_transaction(GLOBAL_gb_dst);
167 
168  GB_ERROR error = GB_save_quick_as(GLOBAL_gb_dst, name);
169  if (error) aw_message(error);
171 
172  free(name);
173 }
174 
175 static void MG_create_db_dependent_awars(AW_root *aw_root, GBDATA *gb_src, GBDATA *gb_dst) {
176  MG_create_db_dependent_rename_awars(aw_root, gb_src, gb_dst);
177 }
178 
179 AW_window *MERGE_create_main_window(AW_root *aw_root, bool dst_is_new, __ATTR__NORETURN void (*exit_cb)(const char *)) {
180  // 'dst_is_new' == true -> setup dest DB according to source-DB
181  //
182  // GLOBAL_gb_src and GLOBAL_gb_dst have to be opened before
183 
184  // @@@ add GB_is_client and use that here
185  bool src_is_client = GB_read_clients(GLOBAL_gb_src)<0;
186  bool dst_is_client = GB_read_clients(GLOBAL_gb_dst)<0;
187 
188  MG_exit_cb = exit_cb;
189 
190  mg_assert(contradicted(src_is_client, GB_is_server(GLOBAL_gb_src)));
191  mg_assert(contradicted(dst_is_client, GB_is_server(GLOBAL_gb_dst)));
192 
193  mg_assert(!(src_is_client && dst_is_client));
194 
195  bool save_src_enabled = !src_is_client;
196  bool save_dst_enabled = !dst_is_client;
197 
198  {
199  GBDATA *gb_main_4_macros = NULp;
200  const char *app_id = NULp;
201 
202  if (src_is_client) {
203  gb_main_4_macros = GLOBAL_gb_src;
204  app_id = "ARB_MERGE_OUTOF";
205  }
206  else if (dst_is_client) {
207  gb_main_4_macros = GLOBAL_gb_dst;
208  app_id = "ARB_MERGE_INTO";
209  }
210  else {
211  gb_main_4_macros = GLOBAL_gb_dst; // does not matter
212  app_id = "ARB_MERGE";
213  }
214 
215  GB_ERROR error = configure_macro_recording(aw_root, app_id, gb_main_4_macros);
216  aw_message_if(error);
217  }
218 
219  mg_assert(aw_root);
220 
221  {
222  GB_transaction ta_merge(GLOBAL_gb_src);
223  GB_transaction ta_dest(GLOBAL_gb_dst);
224 
225  GBT_mark_all(GLOBAL_gb_dst, 0); // unmark everything in dest DB
226 
227  // set DB-type to non-genome (compatibility to old DBs)
228  // when exporting to new DB (dest_is_new == true) -> use DB-type of merge-DB
229  bool merge_is_genome = GEN_is_genome_db(GLOBAL_gb_src, 0);
230 
231  int dest_genome = 0;
232  if (dst_is_new) {
233  if (merge_is_genome) {
234  dest_genome = aw_question("select_dest_dbtype", "Enter destination DB-type", "Normal,Genome");
235  }
236  else {
237  dest_genome = 0; // from non-genome -> to non-genome
238  }
239  }
240 
241  GEN_is_genome_db(GLOBAL_gb_dst, dest_genome); // does not change anything if type is already defined
242  }
243 
244  {
245  GB_transaction ta_merge(GLOBAL_gb_src);
246  GB_transaction ta_dest(GLOBAL_gb_dst);
247 
248  GB_change_my_security(GLOBAL_gb_dst, 6); // generally raises user securities in merge tool (allow anything)
249  GB_change_my_security(GLOBAL_gb_src, 6);
250 
251  MG_create_db_dependent_awars(aw_root, GLOBAL_gb_src, GLOBAL_gb_dst);
252  }
253 
254  {
255  GB_transaction ta_merge(GLOBAL_gb_src);
256  GB_transaction ta_dest(GLOBAL_gb_dst);
257 
258  MG_set_renamed(false, aw_root, "Not renamed yet.");
259 
261  awm->init(aw_root, "ARB_MERGE", "ARB_MERGE");
262  awm->load_xfig("merge/main.fig");
263 
264  // create menus
265 #if defined(DEBUG)
266  AWT_create_debug_menu(awm);
267 #endif // DEBUG
268 
269  awm->create_menu("File", "F", AWM_ALL);
270  if (save_src_enabled) {
271  awm->insert_menu_topic("save_DB1", "Save source DB ...", "S", "save.hlp", AWM_ALL, makeCreateWindowCallback(MG_create_save_as_window, true));
272  }
273 
274  awm->insert_menu_topic("quit", "Quit", "Q", "quit.hlp", AWM_ALL, makeWindowCallback(MG_confirm_exit_restart_if, false));
275  if (save_dst_enabled) {
276  awm->insert_menu_topic("quitnstart", "Quit & start target DB", "D", "quit.hlp", AWM_ALL, makeWindowCallback(MG_confirm_exit_restart_if, true));
277  }
278 
279  insert_macro_menu_entry(awm, true);
280 
281  awm->create_menu("Properties", "P", AWM_ALL);
283  awm->sep______________();
284  awm->insert_menu_topic("save_props", "Save properties (ntree.arb)", "p", "savedef.hlp", AWM_ALL, AW_save_properties);
285 
286  awm->insert_help_topic("ARB_MERGE help", "M", "arb_merge.hlp", AWM_ALL, makeHelpCallback("arb_merge.hlp"));
287 
288 
289  // display involved databases
290  awm->button_length(28);
291 
292  awm->at("db1"); awm->create_button(NULp, AWAR_DB_SRC"/name", NULp, "+");
293  awm->at("db2"); awm->create_button(NULp, AWAR_DB_DST"/name", NULp, "+");
294 
295 
296  // add main controls
297  awm->button_length(32);
298 
299  {
300  // conditional section:
301  // when exporting into a new database there is no need to adapt alignments or names
302 
303  if (dst_is_new) awm->sens_mask(AWM_DISABLED);
304 
305  awm->at("alignment");
307  awm->help_text("mg_alignment.hlp");
308  awm->create_button("CHECK_ALIGNMENTS", "Check alignments ...");
309 
310  awm->at("names");
312  awm->help_text("mg_names.hlp");
313  awm->create_button("CHECK_NAMES", "Check IDs ...");
314 
315  if (dst_is_new) {
316  awm->sens_mask(AWM_ALL);
317  MG_set_renamed(true, aw_root, "Not necessary");
318  }
319  }
320 
321  awm->at("species");
322  awm->callback(makeCreateWindowCallback(MG_create_merge_species_window, dst_is_new));
323  awm->help_text("mg_species.hlp");
324  awm->create_button("TRANSFER_SPECIES", "Transfer species ... ");
325 
326  awm->at("extendeds");
328  awm->help_text("mg_extendeds.hlp");
329  awm->create_button("TRANSFER_SAIS", "Transfer SAIs ...");
330 
331  awm->at("trees");
333  awm->help_text("mg_trees.hlp");
334  awm->create_button("TRANSFER_TREES", "Transfer trees ...");
335 
336  awm->at("configs");
338  awm->help_text("mg_species_configs.hlp");
339  awm->create_button("TRANSFER_CONFIGS", "Transfer configurations ...");
340 
341  {
342  // conditional section:
343  // allow save only when not merging into DB running inside ARB_NT
344 
345  if (!save_dst_enabled) awm->sens_mask(AWM_DISABLED);
346 
347  awm->at("save");
348  awm->callback(makeCreateWindowCallback(MG_create_save_as_window, false));
349  awm->help_text("save.hlp");
350  awm->create_button("SAVE_WHOLE_DB2", "Save whole target DB as ...");
351 
352  awm->at("save_quick");
354  awm->help_text("save.hlp");
355  awm->create_button("SAVE_CHANGES_OF_DB2", "Quick-save changes of target DB");
356 
357  awm->sens_mask(AWM_ALL);
358  }
359 
360  awm->at("quit");
361  awm->callback(makeWindowCallback(MG_confirm_exit_restart_if, false));
362  awm->create_button("QUIT", save_dst_enabled ? "Quit" : "Close");
363 
364  awm->activate();
365 
366  return awm;
367  }
368 }
369 
371  MG_create_trees_awar(awr, aw_def);
372  MG_create_config_awar(awr, aw_def);
373  MG_create_extendeds_awars(awr, aw_def);
374  MG_create_species_awars(awr, aw_def);
375  MG_create_gene_species_awars(awr, aw_def);
376 
377  MG_create_rename_awars(awr, aw_def);
378 
379 #if defined(DEBUG)
380  AWT_create_db_browser_awars(awr, aw_def);
381 #endif // DEBUG
382 }
383 
384 inline const char *get_awar_name(const char *awar_base_name, const char *entry) {
385  return GBS_global_string("%s/%s", awar_base_name, entry);
386 }
387 
388 static void filename_changed_cb(AW_root *awr, const char *awar_base_name) {
389  AW_awar *filename_awar = awr->awar(get_awar_name(awar_base_name, "file_name"));
390 
391  char *name;
392  char *suffix;
393  GB_split_full_path(filename_awar->read_char_pntr(), NULp, NULp, &name, &suffix);
394 
395  if (name) {
396  AW_awar *name_awar = awr->awar(get_awar_name(awar_base_name, "name"));
397  const char *shown_name;
398  if (strcmp(name, ":") == 0 && !suffix) {
399  shown_name = ": (DB loaded in ARB_NT)";
400  }
401  else {
402  shown_name = GB_append_suffix(name, suffix);
403  }
404  name_awar->write_string(shown_name);
405  }
406 
407  free(name);
408  free(suffix);
409 }
410 
411 static void create_fileselection_and_name_awars(AW_root *awr, AW_default aw_def, const char *awar_base_name, const char *filename) {
412  AW_create_fileselection_awars(awr, awar_base_name, "", ".arb", filename);
413 
414  awr->awar_string(get_awar_name(awar_base_name, "name"), "", aw_def); // create awar to display DB-names w/o path
415  AW_awar *filename_awar = awr->awar(get_awar_name(awar_base_name, "file_name")); // defined by AW_create_fileselection_awars above
416 
417  filename_awar->add_callback(makeRootCallback(filename_changed_cb, awar_base_name));
418  filename_awar->touch(); // trigger callback once
419 }
420 
421 void MERGE_create_db_file_awars(AW_root *awr, AW_default aw_def, const char *src_name, const char *dst_name) {
422  create_fileselection_and_name_awars(awr, aw_def, AWAR_DB_DST, dst_name);
423  create_fileselection_and_name_awars(awr, aw_def, AWAR_DB_SRC, src_name);
424 }
425 
GB_ERROR GB_begin_transaction(GBDATA *gbd)
Definition: arbdb.cxx:2528
void MG_create_trees_awar(AW_root *aw_root, AW_default aw_def)
Definition: MG_trees.cxx:33
const char * GB_ERROR
Definition: arb_core.h:25
GB_TYPES type
GB_ERROR GB_commit_transaction(GBDATA *gbd)
Definition: arbdb.cxx:2551
void MERGE_create_db_file_awars(AW_root *awr, AW_default aw_def, const char *src_name, const char *dst_name)
Definition: MG_main.cxx:421
void button_length(int length)
Definition: AW_at.cxx:288
void sens_mask(AW_active mask)
Definition: AW_window.cxx:127
bool GB_is_server(GBDATA *gbd)
Definition: adcomm.cxx:1697
GB_ERROR GB_save(GBDATA *gb, const char *path, const char *savetype)
void insert_menu_topic(const char *id, const char *name, const char *mnemonic, const char *help_text_, AW_active mask, const WindowCallback &wcb)
Definition: AW_window.cxx:595
void load_xfig(const char *file, bool resize=true)
Definition: AW_window.cxx:720
long GBT_mark_all(GBDATA *gb_main, int flag)
Definition: aditem.cxx:295
void at(int x, int y)
Definition: AW_at.cxx:93
void dont_save_awars_with_default_value(GBDATA *gb_db)
Definition: AW_root.cxx:605
void AW_create_standard_fileselection(AW_window *aws, const char *awar_prefix)
Definition: aw_file.hxx:30
void maybe_exit_delayed()
const char * GBS_global_string(const char *templat,...)
Definition: arb_msg.cxx:203
static void create_fileselection_and_name_awars(AW_root *awr, AW_default aw_def, const char *awar_base_name, const char *filename)
Definition: MG_main.cxx:411
void AW_POPDOWN(AW_window *window)
Definition: AW_window.cxx:52
void AW_insert_common_property_menu_entries(AW_window_menu_modes *awmm)
Definition: AW_preset.cxx:1445
bool isNull() const
test if SmartPtr is NULp
Definition: smartptr.h:248
static void MG_save_cb(AW_window *aww, bool source_database)
Definition: MG_main.cxx:98
__ATTR__USERESULT GB_ERROR configure_macro_recording(AW_root *aw_root, const char *client_id, GBDATA *gb_main)
Definition: trackers.cxx:502
void setNull()
set SmartPtr to NULp
Definition: smartptr.h:251
void activate()
Definition: aw_window.hxx:365
GBDATA * GLOBAL_gb_dst
Definition: MG_main.cxx:31
#define AWAR_DB_SRC
Definition: merge.hxx:32
AW_awar * add_callback(const RootCallback &cb)
Definition: AW_awar.cxx:231
void GB_change_my_security(GBDATA *gbd, int level)
Definition: arbdb.cxx:1627
const char * read_char_pntr() const
Definition: AW_awar.cxx:168
bool is_performing_delayed_exit() const
WindowCallback makeHelpCallback(const char *helpfile)
Definition: aw_window.hxx:106
void MG_create_db_dependent_rename_awars(AW_root *aw_root, GBDATA *gb_src, GBDATA *gb_dst)
Definition: MG_names.cxx:58
AW_window * MG_create_merge_trees_window(AW_root *awr)
Definition: MG_trees.cxx:207
void MERGE_create_all_awars(AW_root *awr, AW_default aw_def)
Definition: MG_main.cxx:370
Generic smart pointer.
Definition: smartptr.h:149
#define mg_assert(bed)
Definition: merge.hxx:24
void AW_save_properties(AW_window *aw)
Definition: AW_preset.cxx:1452
static void MG_create_db_dependent_awars(AW_root *aw_root, GBDATA *gb_src, GBDATA *gb_dst)
Definition: MG_main.cxx:175
void create_menu(const char *name, const char *mnemonic, AW_active mask=AWM_ALL)
Definition: AW_window.cxx:472
void MG_create_extendeds_awars(AW_root *aw_root, AW_default aw_def)
void help_text(const char *id)
Definition: AW_window.cxx:116
void touch()
Definition: AW_awar.cxx:207
AW_window * MERGE_create_main_window(AW_root *aw_root, bool dst_is_new, __ATTR__NORETURN void(*exit_cb)(const char *))
Definition: MG_main.cxx:179
static void error(const char *msg)
Definition: mkptypes.cxx:96
void AW_create_fileselection_awars(AW_root *awr, const char *awar_base, const char *directories, const char *filter, const char *file_name)
Definition: AW_file.cxx:72
void MG_create_species_awars(AW_root *aw_root, AW_default aw_def)
Definition: MG_species.cxx:65
void insert_help_topic(const char *labeli, const char *mnemonic, const char *helpText, AW_active mask, const WindowCallback &cb)
Definition: AW_window.cxx:569
MG_MacroExitor(AW_root *aw_root_, bool start_dst_db_)
Definition: MG_main.cxx:79
long GB_read_clients(GBDATA *gbd)
Definition: adcomm.cxx:1682
void MG_set_renamed(bool renamed, AW_root *aw_root, const char *reason)
Definition: MG_names.cxx:114
char * read_string() const
Definition: AW_awar.cxx:198
AW_awar * awar(const char *awar)
Definition: AW_root.cxx:554
GB_ERROR GB_save_quick_as(GBDATA *gbd, const char *path)
void AW_refresh_fileselection(AW_root *awr, const char *awar_prefix)
Definition: AW_file.cxx:944
AW_window * MG_create_merge_species_window(AW_root *awr, bool dst_is_new)
GBDATA * GLOBAL_gb_src
Definition: MG_main.cxx:30
static AW_window_menu_modes_opengl * awm
GB_CSTR GB_append_suffix(const char *name, const char *suffix)
Definition: adsocket.cxx:975
AW_window * MG_create_merge_names_window(AW_root *awr)
Definition: MG_names.cxx:173
void MG_create_rename_awars(AW_root *aw_root, AW_default aw_def)
Definition: MG_names.cxx:32
void MG_create_gene_species_awars(AW_root *aw_root, AW_default aw_def)
int aw_question(const char *unique_id, const char *question, const char *buttons, bool sameSizeButtons, const char *helpfile)
Definition: AW_question.cxx:26
char * GBK_singlequote(const char *arg)
Definition: arb_msg.cxx:599
static void filename_changed_cb(AW_root *awr, const char *awar_base_name)
Definition: MG_main.cxx:388
#define AWAR_DB_DST
Definition: merge.hxx:33
bool GB_is_directory(const char *path)
Definition: arb_file.cxx:176
#define OVERRIDE
Definition: cxxforward.h:112
#define AWAR_DB_COMMENT
AW_window * MG_create_merge_SAIs_window(AW_root *awr)
void aw_message(const char *msg)
Definition: AW_status.cxx:1142
static void MG_confirm_exit_restart_if(AW_window *aww, bool start_dst_db)
Definition: MG_main.cxx:85
void insert_macro_menu_entry(AW_window *awm, bool prepend_separator)
Definition: macro_gui.cxx:233
AW_root * get_root()
Definition: aw_window.hxx:359
void GB_split_full_path(const char *fullpath, char **res_dir, char **res_fullname, char **res_name_only, char **res_suffix)
Definition: adsocket.cxx:1259
static AW_window * MG_create_save_as_window(AW_root *aw_root, bool source_database)
Definition: MG_main.cxx:123
#define NULp
Definition: cxxforward.h:116
static __ATTR__NORETURN void(* MG_exit_cb)(const char *)
Definition: MG_main.cxx:33
#define __ATTR__NORETURN
Definition: attributes.h:56
AW_window * MG_create_merge_configs_window(AW_root *awr)
Definition: MG_configs.cxx:122
GB_ERROR write_string(const char *aw_string)
const char * get_awar_name(const char *awar_base_name, const char *entry)
Definition: MG_main.cxx:384
void sep______________()
Definition: AW_window.cxx:753
static void MG_save_quick_result_cb(AW_window *aww)
Definition: MG_main.cxx:160
void callback(const WindowCallback &cb)
Definition: AW_window.cxx:133
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
Definition: AW_root.cxx:570
AW_window * MG_create_merge_alignment_window(AW_root *awr)
GB_ERROR GBT_check_data(GBDATA *Main, const char *alignment_name)
Definition: adali.cxx:218
bool GEN_is_genome_db(GBDATA *gb_main, int default_value)
Definition: adGene.cxx:20
AW_root * get_root() const
void ARB_disconnect_from_db(AW_root *aw_root, GBDATA *&gb_main_ref)
Definition: app.cxx:40
void MG_create_config_awar(AW_root *aw_root, AW_default aw_def)
Definition: MG_configs.cxx:31
void AWT_insert_DBsaveType_selector(AW_window *aww, const char *awar_name)
Definition: arb_spec.cxx:39
void init(AW_root *root, const char *wid, const char *windowname)
Definition: AW_window.cxx:2857
void aw_message_if(GB_ERROR error)
Definition: aw_msg.hxx:21
char * GBS_global_string_copy(const char *templat,...)
Definition: arb_msg.cxx:194
void AWT_insert_DBcompression_selector(AW_window *aww, const char *awar_name)
Definition: arb_spec.cxx:62
void create_button(const char *macro_name, AW_label label, const char *mnemonic=NULp, const char *color=NULp)
Definition: AW_button.cxx:448