| 328 | | // ADD button |
| 329 | | // (add current selected candidate to references) |
| | 311 | |
| | 312 | |
| | 313 | static char **read_references(AW_root *aw_root) { |
| | 314 | char *ref_string = aw_root->awar(AWAR_REMAP_SPECIES_LIST)->read_string(); |
| | 315 | char **refs = GBT_split_string(ref_string, " \n,;", true, NULL); |
| | 316 | |
| | 317 | free(ref_string); |
| | 318 | return refs; |
| | 319 | } |
| | 320 | static void write_references(AW_root *aw_root, const char *const *ref_array) { |
| | 321 | char *ref_string = GBT_join_names(ref_array, '\n'); |
| | 322 | aw_root->awar(AWAR_REMAP_SPECIES_LIST)->write_string(ref_string); |
| | 323 | aw_root->awar(AWAR_REMAP_ENABLE)->write_int(ref_string[0] != 0); |
| | 324 | free(ref_string); |
| | 325 | } |
| | 326 | static void select_reference(AW_root *aw_root, const char *ref_to_select) { |
| | 327 | aw_root->awar(AWAR_REMAP_SEL_REFERENCE)->write_string(ref_to_select); |
| | 328 | } |
| | 329 | static char *get_selected_reference(AW_root *aw_root) { |
| | 330 | return aw_root->awar(AWAR_REMAP_SEL_REFERENCE)->read_string(); |
| | 331 | } |
| | 332 | |
| | 333 | static void refresh_reference_list_cb(AW_root *aw_root, AW_CL cl_para) { |
| | 334 | preserve_para *para = (preserve_para*)cl_para; |
| | 335 | char **refs = read_references(aw_root); |
| | 336 | para->window->init_selection_list_from_array(para->ref_id, refs, ""); |
| | 337 | GBT_free_names(refs); |
| | 338 | } |
| | 339 | |
| 331 | | preserve_para *para = (preserve_para*)cl_para; |
| 332 | | AW_window *aww = para->window; |
| 333 | | AW_root *awr = aww->get_root(); |
| 334 | | |
| 335 | | char *current = awr->awar(AWAR_REMAP_CANDIDATE)->read_string(); |
| 336 | | char *references = awr->awar(AWAR_REMAP_SPECIES_LIST)->read_string(); |
| 337 | | if (references && references[0]) { |
| 338 | | string ref = string(references); |
| 339 | | size_t pos = ref.find(current); |
| 340 | | int len = strlen(current); |
| 341 | | |
| 342 | | for (; |
| 343 | | pos != string::npos; |
| 344 | | pos = ref.find(current, pos+1)) |
| 345 | | { |
| 346 | | if (pos == 0 || ref[pos-1] == '\n') { |
| 347 | | if ((pos+len) == ref.length()) break; // at eos -> skip |
| 348 | | char behind = ref[pos+len]; |
| 349 | | if (behind == '\n') break; // already there -> skip |
| 350 | | } |
| 351 | | } |
| 352 | | |
| 353 | | if (pos == string::npos) { |
| 354 | | string appended = ref+'\n'+current; |
| 355 | | awr->awar(AWAR_REMAP_SPECIES_LIST)->write_string(appended.c_str()); |
| 356 | | } |
| 357 | | } |
| 358 | | else { |
| 359 | | awr->awar(AWAR_REMAP_SPECIES_LIST)->write_string(current); |
| 360 | | } |
| 361 | | |
| 362 | | free(references); |
| 363 | | free(current); |
| 364 | | |
| 365 | | awr->awar(AWAR_REMAP_ENABLE)->write_int(1); |
| 366 | | } |
| 367 | | |
| 368 | | // CLEAR button |
| 369 | | // (clear references) |
| | 341 | // ADD button (add currently selected candidate to references) |
| | 342 | |
| | 343 | preserve_para *para = (preserve_para*)cl_para; |
| | 344 | AW_root *aw_root = para->window->get_root(); |
| | 345 | |
| | 346 | char **refs = read_references(aw_root); |
| | 347 | char *candidate = aw_root->awar(AWAR_REMAP_CANDIDATE)->read_string(); |
| | 348 | char *selected = get_selected_reference(aw_root); |
| | 349 | int cand_index = GBT_names_index_of(refs, candidate); |
| | 350 | int sel_index = GBT_names_index_of(refs, selected); |
| | 351 | |
| | 352 | if (cand_index == -1) GBT_names_add(refs, sel_index+1, candidate); |
| | 353 | else GBT_names_move(refs, cand_index, sel_index); |
| | 354 | |
| | 355 | write_references(aw_root, refs); |
| | 356 | select_reference(aw_root, candidate); |
| | 357 | |
| | 358 | free(selected); |
| | 359 | free(candidate); |
| | 360 | GBT_free_names(refs); |
| | 361 | |
| | 362 | para->window->move_selection(para->cand_id, 1); |
| | 363 | } |
| | 364 | |
| 371 | | AW_root *awr = aww->get_root(); |
| 372 | | awr->awar(AWAR_REMAP_SPECIES_LIST)->write_string(""); |
| 373 | | awr->awar(AWAR_REMAP_ENABLE)->write_int(0); |
| 374 | | } |
| 375 | | |
| 376 | | // SELECT PRESERVES window |
| | 366 | // CLEAR button (clear references) |
| | 367 | aww->get_root()->awar(AWAR_REMAP_SPECIES_LIST)->write_string(""); |
| | 368 | } |
| | 369 | |
| | 370 | static void del_reference_cb(AW_window *aww) { |
| | 371 | AW_root *aw_root = aww->get_root(); |
| | 372 | char **refs = read_references(aw_root); |
| | 373 | char *selected = get_selected_reference(aw_root); |
| | 374 | int sel_index = GBT_names_index_of(refs, selected); |
| | 375 | |
| | 376 | if (sel_index >= 0) { |
| | 377 | select_reference(aw_root, refs[sel_index+1]); |
| | 378 | GBT_names_erase(refs, sel_index); |
| | 379 | write_references(aw_root, refs); |
| | 380 | } |
| | 381 | |
| | 382 | free(selected); |
| | 383 | GBT_free_names(refs); |
| | 384 | } |
| | 385 | |
| | 386 | static void lower_reference_cb(AW_window *aww) { |
| | 387 | AW_root *aw_root = aww->get_root(); |
| | 388 | char **refs = read_references(aw_root); |
| | 389 | char *selected = get_selected_reference(aw_root); |
| | 390 | int sel_index = GBT_names_index_of(refs, selected); |
| | 391 | |
| | 392 | if (sel_index >= 0) { |
| | 393 | GBT_names_move(refs, sel_index, sel_index+1); |
| | 394 | write_references(aw_root, refs); |
| | 395 | } |
| | 396 | |
| | 397 | free(selected); |
| | 398 | GBT_free_names(refs); |
| | 399 | } |
| | 400 | static void raise_reference_cb(AW_window *aww) { |
| | 401 | AW_root *aw_root = aww->get_root(); |
| | 402 | char **refs = read_references(aw_root); |
| | 403 | char *selected = get_selected_reference(aw_root); |
| | 404 | int sel_index = GBT_names_index_of(refs, selected); |
| | 405 | |
| | 406 | if (sel_index > 0) { |
| | 407 | GBT_names_move(refs, sel_index, sel_index-1); |
| | 408 | write_references(aw_root, refs); |
| | 409 | } |
| | 410 | |
| | 411 | free(selected); |
| | 412 | GBT_free_names(refs); |
| | 413 | } |
| | 414 | |
| | 415 | static void test_references_cb(AW_window *aww) { |
| | 416 | char *reference_species_names = aww->get_root()->awar(AWAR_REMAP_SPECIES_LIST)->read_string(); |
| | 417 | GB_transaction tm(GLOBAL_gb_merge); |
| | 418 | GB_transaction td(GLOBAL_gb_dest); |
| | 419 | |
| | 420 | MG_remaps test_mapping(GLOBAL_gb_merge, GLOBAL_gb_dest, true, reference_species_names); // will raise aw_message's in case of problems |
| | 421 | |
| | 422 | free(reference_species_names); |
| | 423 | } |
| | 424 | |
| | 425 | static void init_preserve_awars(AW_root *aw_root) { |
| | 426 | aw_root->awar_string(AWAR_REMAP_ALIGNMENT, "", GLOBAL_gb_dest); |
| | 427 | aw_root->awar_string(AWAR_REMAP_CANDIDATE, "", GLOBAL_gb_dest); |
| | 428 | aw_root->awar_string(AWAR_REMAP_SEL_REFERENCE, "", GLOBAL_gb_dest); |
| | 429 | } |
| | 430 | |
| 398 | | aws->create_text_field(AWAR_REMAP_SPECIES_LIST); |
| 399 | | |
| 400 | | preserve_para *para = new preserve_para; // do not free (is passed to callback) |
| 401 | | para->window = aws; |
| 402 | | |
| 403 | | aws->at("candidate"); |
| 404 | | para->cand_id = aws->create_selection_list(AWAR_REMAP_CANDIDATE, 0, "", 10, 30); |
| 405 | | |
| 406 | | aws->at("ali"); |
| 407 | | para->ali_id = aws->create_selection_list(AWAR_REMAP_ALIGNMENT, 0, "", 10, 30); |
| | 462 | // aws->create_text_field(AWAR_REMAP_SPECIES_LIST); // @@@ needs to be a selection list! |
| | 463 | para->ref_id = aws->create_selection_list(AWAR_REMAP_SEL_REFERENCE, 0, "", 10, 30); |
| | 464 | |
| | 465 | aws->button_length(8); |
| | 466 | |
| | 467 | aws->at("clear"); |
| | 468 | aws->callback(clear_references_cb); |
| | 469 | aws->create_button("CLEAR", "Clear", "C"); |
| | 470 | |
| | 471 | aws->at("del"); |
| | 472 | aws->callback(del_reference_cb); |
| | 473 | aws->create_button("DEL", "Del", "L"); |
| | 474 | |
| | 475 | aws->at("up"); |
| | 476 | aws->callback(raise_reference_cb); |
| | 477 | aws->create_button("UP", "Up", "U"); |
| | 478 | |
| | 479 | aws->at("down"); |
| | 480 | aws->callback(lower_reference_cb); |
| | 481 | aws->create_button("DOWN", "Down", "D"); |
| | 482 | |
| | 483 | aws->at("test"); |
| | 484 | aws->callback(test_references_cb); |
| | 485 | aws->create_button("TEST", "Test", "T"); |
| | 486 | |
| | 487 | // ---------- |
| 421 | | aws->button_length(8); |
| 422 | | |
| 423 | | aws->at("add"); |
| 424 | | aws->callback(add_selected_cb, (AW_CL)para); |
| 425 | | aws->create_button("ADD", "Add", "A"); |
| 426 | | |
| 427 | | aws->at("clear"); |
| 428 | | aws->callback(clear_references_cb); |
| 429 | | aws->create_button("CLEAR", "Clear", "C"); |
| | 508 | { |
| | 509 | AW_awar *awar_list = aw_root->awar(AWAR_REMAP_SPECIES_LIST); |
| | 510 | awar_list->add_callback(refresh_reference_list_cb, (AW_CL)para); |
| | 511 | awar_list->touch(); // trigger callback |
| | 512 | } |