Changeset 8286
- Timestamp:
- 09/12/11 09:46:51 (6 months ago)
- Location:
- branches/e4fix/EDIT4
- Files:
-
- 6 modified
-
ED4_base.cxx (modified) (6 diffs)
-
ED4_cursor.cxx (modified) (2 diffs)
-
ED4_manager.cxx (modified) (3 diffs)
-
ED4_root.cxx (modified) (2 diffs)
-
ED4_terminal.cxx (modified) (1 diff)
-
ed4_class.hxx (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/e4fix/EDIT4/ED4_base.cxx
r8276 r8286 21 21 } 22 22 23 bool ED4_base::remove_deleted_children()24 {25 e4_assert(0);26 return false;27 }28 29 bool ED4_terminal::remove_deleted_children()30 {31 if (tflag.deleted) {32 if (get_species_pointer() != 0) {33 #if defined(DEBUG)34 printf("ED4_terminal: has non-zero species_pointer in remove_deleted_children (resetting to zero)\n");35 #endif // DEBUG36 set_species_pointer(0);37 }38 ED4_ROOT->announce_deletion(this);39 parent->children->remove_member(this);40 return true;41 }42 43 return false;44 }45 bool ED4_sequence_info_terminal::remove_deleted_children()46 {47 if (tflag.deleted) {48 if (get_species_pointer() != 0) {49 #if defined(DEBUG)50 printf("ED4_sequence_info_terminal: has non-zero species_pointer in remove_deleted_children (resetting to zero)\n");51 #endif // DEBUG52 set_species_pointer(0);53 }54 ED4_ROOT->announce_deletion(this);55 parent->children->remove_member(this);56 return true;57 }58 59 return false;60 }61 62 bool ED4_manager::remove_deleted_children()63 {64 int i;65 bool deletion_occurred = false;66 67 restart :68 69 for (i=0; i<children->members(); i++) {70 ED4_base *child = children->member(i);71 if (child->remove_deleted_children()) {72 deletion_occurred = true;73 goto restart; // because order of children may have changed74 }75 }76 77 if (!children->members()) {78 if (parent) {79 ED4_ROOT->announce_deletion(this);80 parent->children->remove_member(this);81 return true;82 }83 #if defined(DEBUG)84 printf("ED4_manager::remove_deleted_children: I have no parent\n");85 #endif // DEBUG86 }87 else if (deletion_occurred) {88 parent->refresh_requested_by_child();89 }90 91 return false;92 }93 94 23 void ED4_base::changed_by_database() 95 24 { … … 100 29 101 30 void ED4_manager::changed_by_database() { 102 remove_deleted_children();103 31 set_refresh(1); 104 32 if (parent) { … … 195 123 dynamic_prop = ED4_properties(dynamic_prop&~(ED4_P_CONSENSUS_RELEVANT|ED4_P_ALIGNMENT_DATA)); 196 124 197 // @@@ hide all cursors pointing to this terminal! 198 199 const char *data = (const char*)GB_read_old_value(); 200 int data_len = GB_read_old_size(); 201 202 ED4_multi_species_manager *multi_species_man = get_parent(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 203 204 if (was_consensus_relevant) { 125 if (was_consensus_relevant) { 126 const char *data = (const char*)GB_read_old_value(); 127 int data_len = GB_read_old_size(); 128 129 ED4_multi_species_manager *multi_species_man = get_parent(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 130 205 131 multi_species_man->update_bases(data, data_len, 0); 206 132 multi_species_man->rebuild_consensi(get_parent(ED4_L_SPECIES)->to_species_manager(), ED4_U_UP); … … 220 146 multi_man->rebuild_consensi(species_man, ED4_U_UP); 221 147 GB_pop_transaction(GLOBAL_gb_main); 222 223 ED4_device_manager *device_manager = ED4_ROOT->get_device_manager();224 225 for (int i=0; i<device_manager->children->members(); i++) { // when killing species numbers have to be recalculated226 ED4_base *member = device_manager->children->member(i);227 228 if (member->is_area_manager()) {229 member->to_area_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->generate_id_for_groups();230 }231 }232 148 233 149 if (parent) parent->resize_requested_by_child(); … … 797 713 798 714 799 void ED4_manager::generate_id_for_groups() { 800 int i; 801 802 for (i=0; i<children->members(); i++) { 803 if (children->member(i)->is_group_manager()) { 804 ED4_multi_species_manager *multi_man = children->member(i)->to_group_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 805 806 multi_man->count_all_children_and_set_group_id(); 807 } 808 } 715 void ED4_device_manager::generate_id_for_groups() { 716 for (int i=0; i<children->members(); i++) { 717 ED4_base *member = children->member(i); 718 if (member->is_area_manager()) { 719 member->to_area_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->generate_id_for_groups(); 720 } 721 } 722 } 723 724 void ED4_multi_species_manager::generate_id_for_groups() { 725 count_all_children_and_set_group_id(); 809 726 } 810 727 … … 828 745 829 746 ED4_base *consensus_name_terminal = get_consensus_terminal(); 830 name = (char*)GB_calloc(strlen(consensus_name_terminal->id)+10, sizeof(*name)); 831 832 for (i=0; consensus_name_terminal->id[i] != '(' && consensus_name_terminal->id[i] != '\0'; i++) { 833 name[i] = consensus_name_terminal->id[i]; 834 } 835 if (consensus_name_terminal->id[i] != '\0') { // skip space 836 i--; 837 } 838 name[i] = '\0'; 839 sprintf(name, "%s (%d)", name, counter); 840 841 freeset(consensus_name_terminal->id, name); 842 747 if (consensus_name_terminal) { // top managers dont show consensus 748 name = (char*)GB_calloc(strlen(consensus_name_terminal->id)+10, sizeof(*name)); 749 750 for (i=0; consensus_name_terminal->id[i] != '(' && consensus_name_terminal->id[i] != '\0'; i++) { 751 name[i] = consensus_name_terminal->id[i]; 752 } 753 if (consensus_name_terminal->id[i] != '\0') { // skip space 754 i--; 755 } 756 name[i] = '\0'; 757 sprintf(name, "%s (%d)", name, counter); 758 759 freeset(consensus_name_terminal->id, name); 760 } 843 761 return counter; 844 762 } -
branches/e4fix/EDIT4/ED4_cursor.cxx
r8276 r8286 648 648 if (gbd) { 649 649 char *data = GB_read_string(gbd); 650 int len = GB_read_string_count(gbd); 651 group_man->table().add(data, len); 650 int len = GB_read_string_count(gbd); 651 652 group_man->update_bases(0, 0, data, len); 652 653 } 653 654 } … … 664 665 } 665 666 delete string; 667 668 insert_into_manager->generate_id_for_groups(); 666 669 } 667 670 if (name_term) { -
branches/e4fix/EDIT4/ED4_manager.cxx
r8275 r8286 187 187 } 188 188 } 189 190 e4_assert(!subbed_base->is_root_group_manager()); 191 if (subbed_base->is_group_manager()) { // sub a group 192 return update_bases(&subbed_base->to_group_manager()->table(), 0); 193 } 194 195 e4_assert(0); // wrong type 196 189 else { 190 e4_assert(!subbed_base->is_root_group_manager()); 191 if (subbed_base->is_group_manager()) { // sub a group 192 return update_bases(&subbed_base->to_group_manager()->table(), 0); 193 } 194 e4_assert(0); // wrong type 195 } 197 196 return ED4_R_OK; 198 197 } … … 1252 1251 e4_assert(tflag.deleted); 1253 1252 1253 ED4_ROOT->announce_deletion(this); 1254 1254 1255 unlink_from_parent(); 1255 1256 delete this; … … 1269 1270 1270 1271 if (!children->members()) { 1272 ED4_ROOT->announce_deletion(this); 1273 1271 1274 unlink_from_parent(); 1272 1275 delete this; -
branches/e4fix/EDIT4/ED4_root.cxx
r8277 r8286 81 81 if (main_manager->update_info.delete_requested) { 82 82 main_manager->delete_requested_children(); 83 get_device_manager()->generate_id_for_groups(); // update group-counters 83 84 redraw = 1; 84 85 } … … 333 334 } 334 335 335 void ED4_window::announce_deletion(ED4_base *object) { 336 if (cursor.owner_of_cursor == object) { // about to delete owner_of_cursor 337 cursor.HideCursor(); 338 e4_assert(!cursor.owner_of_cursor); 339 } 340 } 341 void ED4_root::announce_deletion(ED4_base *object) { 342 // remove any links which might point to the object 343 // @@@ not triggered by kill_object() 344 for (ED4_window *win = first_window; win; win = win->next) { 345 ED4_LocalWinContext uses(win); 346 win->announce_deletion(object); 347 } 348 } 349 350 351 ED4_returncode ED4_root::add_to_selected(ED4_terminal *object) 352 { 336 ED4_returncode ED4_root::add_to_selected(ED4_terminal *object) { 353 337 ED4_base *tmp_object; 354 338 ED4_level mlevel; -
branches/e4fix/EDIT4/ED4_terminal.cxx
r8276 r8286 283 283 } 284 284 285 ED4_returncode ED4_terminal::kill_object() 286 { 285 inline void remove_from_consensus(ED4_manager *group_or_species_man) { 286 GB_transaction ta(GLOBAL_gb_main); 287 ED4_manager *parent_manager = group_or_species_man->parent; 288 parent_manager->update_consensus(parent_manager, NULL, group_or_species_man); 289 parent_manager->rebuild_consensi(parent_manager, ED4_U_UP); 290 } 291 292 ED4_returncode ED4_terminal::kill_object() { 287 293 ED4_species_manager *species_manager = get_parent(ED4_L_SPECIES)->to_species_manager(); 288 ED4_manager *parent_manager = species_manager->parent; 289 ED4_group_manager *group_manager = 0; 290 291 if (species_manager->flag.is_consensus) // whole group has to be killed 292 { 293 if (parent_manager->is_multi_species_manager() && ED4_new_species_multi_species_manager()==parent_manager) { 294 295 if (species_manager->flag.is_consensus) { // kill whole group 296 if (ED4_new_species_multi_species_manager()==species_manager->parent) { 294 297 aw_message("This group has to exist - deleting it isn't allowed"); 295 298 return ED4_R_IMPOSSIBLE; 296 299 } 297 300 298 parent_manager = species_manager; 299 e4_assert(!parent_manager->is_root_group_manager()); 300 while (!parent_manager->is_group_manager()) { 301 parent_manager = parent_manager->parent; 302 e4_assert(!parent_manager->is_root_group_manager()); 303 } 304 group_manager = parent_manager->to_group_manager(); 305 306 parent_manager = group_manager->parent; 307 parent_manager->children->remove_member(group_manager); 308 309 GB_push_transaction (GLOBAL_gb_main); 310 parent_manager->update_consensus(parent_manager, NULL, group_manager); 311 parent_manager->rebuild_consensi(parent_manager, ED4_U_UP); 312 GB_pop_transaction (GLOBAL_gb_main); 313 species_manager = NULL; 314 } 315 else 316 { 317 parent_manager->children->remove_member(species_manager); 318 GB_push_transaction (GLOBAL_gb_main); 319 parent_manager->update_consensus(parent_manager, NULL, species_manager); 320 parent_manager->rebuild_consensi(species_manager, ED4_U_UP); 321 GB_pop_transaction (GLOBAL_gb_main); 322 } 323 324 ED4_device_manager *device_manager = ED4_ROOT->get_device_manager(); 325 326 for (int i=0; i<device_manager->children->members(); i++) { // when killing species numbers have to be recalculated 327 ED4_base *member = device_manager->children->member(i); 328 329 if (member->is_area_manager()) { 330 member->to_area_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->generate_id_for_groups(); 331 } 332 } 333 334 if (species_manager) { 335 species_manager->parent = NULL; 336 species_manager->remove_all_callbacks(); 337 delete species_manager; 338 } 339 340 if (group_manager) { 341 group_manager->parent = NULL; 342 group_manager->route_down_hierarchy(ed4_remove_species_manager_callbacks).expect_no_error(); 343 delete group_manager; 344 } 301 ED4_manager *group_manager = species_manager->get_parent(ED4_L_GROUP)->to_group_manager(); 302 remove_from_consensus(group_manager); 303 group_manager->Delete(); 304 } 305 else { // kill single species/SAI 306 remove_from_consensus(species_manager); 307 species_manager->Delete(); 308 } 309 310 ED4_ROOT->refresh_all_windows(0); 345 311 346 312 return ED4_R_OK; -
branches/e4fix/EDIT4/ed4_class.hxx
r8276 r8286 573 573 void invalidate(); 574 574 575 void announce_deletion(const ED4_base *object) { 576 if (object == calced4base) invalidate(); 577 e4_assert(calced4base != object); 578 } 579 575 580 int get_base_position(const ED4_base *base, int sequence_position); 576 581 int get_sequence_position(const ED4_base *base, int base_position); … … 652 657 653 658 void set_to_terminal(AW_window *aww, ED4_terminal *terminal, int seq_pos, ED4_CursorJumpType jump_type); 659 660 void announce_deletion(ED4_base *object) { 661 base_position.announce_deletion(object); 662 if (object == owner_of_cursor) owner_of_cursor = NULL; // no need to delete the cursor (deletion triggers full redraw) 663 } 654 664 655 665 void init(); … … 689 699 ED4_window *get_matching_ed4w(AW_window *aww); 690 700 691 void announce_deletion(ED4_base *object) ;692 701 void announce_deletion(ED4_base *object) { cursor.announce_deletion(object); } 702 693 703 // functions concerned the scrolled area 694 704 ED4_returncode update_scrolled_rectangle(); … … 1020 1030 virtual void changed_by_database(); 1021 1031 virtual void deleted_from_database(); 1022 1023 virtual bool remove_deleted_children();1024 1032 1025 1033 // functions concerned with graphic output … … 1209 1217 virtual void deleted_from_database(); 1210 1218 1211 virtual bool remove_deleted_children();1212 1213 1219 // functions concerned with graphics 1214 1220 virtual ED4_returncode Show(int refresh_all=0, int is_cleared=0); … … 1264 1270 virtual ED4_returncode update_bases_and_rebuild_consensi(const char *old_seq, int old_len, ED4_base *species, ED4_update_flag update_flag, PosRange range = PosRange::whole()); 1265 1271 1266 void generate_id_for_groups();1267 1268 1272 // handle moves across the hierarchy 1269 1273 virtual ED4_returncode handle_move(ED4_move_info *moveinfo); … … 1307 1311 virtual void changed_by_database(); 1308 1312 virtual void deleted_from_database(); 1309 1310 virtual bool remove_deleted_children();1311 1313 1312 1314 // functions concerning graphic output … … 1475 1477 ED4_returncode refresh_all_windows(int redraw); 1476 1478 1477 void announce_deletion(ED4_base *object); // before deleting an object, announce here1479 inline void announce_deletion(ED4_base *object); // before deleting an object, use this to announce 1478 1480 1479 1481 // functions concerned with list of selected objects … … 1513 1515 }; 1514 1516 1517 inline void ED4_root::announce_deletion(ED4_base *object) { 1518 for (ED4_window *win = first_window; win; win = win->next) { 1519 ED4_LocalWinContext uses(win); 1520 win->announce_deletion(object); 1521 } 1522 } 1515 1523 1516 1524 // ------------------------ … … 1550 1558 ED4_device_manager (const char *id, AW_pos x, AW_pos y, AW_pos width, AW_pos height, ED4_manager *parent); 1551 1559 1560 void generate_id_for_groups(); 1552 1561 DECLARE_DUMP_FOR_LEAFCLASS(ED4_manager); 1553 1562 }; … … 1588 1597 int get_no_of_selected_species(); 1589 1598 int get_no_of_species(); 1599 1600 void generate_id_for_groups(); 1590 1601 1591 1602 void invalidate_species_counters(); … … 1999 2010 2000 2011 virtual int get_length() const { return 1+strlen(id); } 2001 2002 virtual bool remove_deleted_children();2003 2012 2004 2013 DECLARE_DUMP_FOR_LEAFCLASS(ED4_text_terminal);
