Changeset 8286 for branches

Show
Ignore:
Timestamp:
09/12/11 09:46:51 (6 months ago)
Author:
westram
Message:
  • cleaned ED4-object-deletion (what a mess)
    • rewrote ED4_terminal::kill_object using Delete()
      • let deletion occur during refresh, like done when sth is deleted from DB
    • regenerate group-ids during refresh (after deletion took place)
    • DRYed delete mechanisms
      • removed remove_deleted_children() from hierarchy
      • announce_deletion from delete_requested_children()
    • announce_deletion down to ED4_base_position (to invalidate its cache)
  • 'Get' selected species failed to
    • update bases-tables of parent-managers (that was one cause for folding errors!)
    • regenerate group-ids
  • fixed wrong assertion failure in ED4_manager::check_out_bases
Location:
branches/e4fix/EDIT4
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • branches/e4fix/EDIT4/ED4_base.cxx

    r8276 r8286  
    2121} 
    2222 
    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 // DEBUG 
    36             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 // DEBUG 
    52             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 changed 
    74         } 
    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 // DEBUG 
    86     } 
    87     else if (deletion_occurred) { 
    88         parent->refresh_requested_by_child(); 
    89     } 
    90  
    91     return false; 
    92 } 
    93  
    9423void ED4_base::changed_by_database() 
    9524{ 
     
    10029 
    10130void ED4_manager::changed_by_database() { 
    102     remove_deleted_children(); 
    10331    set_refresh(1); 
    10432    if (parent) { 
     
    195123    dynamic_prop = ED4_properties(dynamic_prop&~(ED4_P_CONSENSUS_RELEVANT|ED4_P_ALIGNMENT_DATA)); 
    196124 
    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 
    205131        multi_species_man->update_bases(data, data_len, 0); 
    206132        multi_species_man->rebuild_consensi(get_parent(ED4_L_SPECIES)->to_species_manager(), ED4_U_UP); 
     
    220146        multi_man->rebuild_consensi(species_man, ED4_U_UP); 
    221147        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 recalculated 
    226             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         } 
    232148 
    233149        if (parent) parent->resize_requested_by_child(); 
     
    797713 
    798714 
    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     } 
     715void 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 
     724void ED4_multi_species_manager::generate_id_for_groups() { 
     725    count_all_children_and_set_group_id(); 
    809726} 
    810727 
     
    828745 
    829746    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    } 
    843761    return counter; 
    844762} 
  • branches/e4fix/EDIT4/ED4_cursor.cxx

    r8276 r8286  
    648648            if (gbd) { 
    649649                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); 
    652653            } 
    653654        } 
     
    664665        } 
    665666        delete string; 
     667 
     668        insert_into_manager->generate_id_for_groups(); 
    666669    } 
    667670    if (name_term) { 
  • branches/e4fix/EDIT4/ED4_manager.cxx

    r8275 r8286  
    187187        } 
    188188    } 
    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    } 
    197196    return ED4_R_OK; 
    198197} 
     
    12521251    e4_assert(tflag.deleted); 
    12531252 
     1253    ED4_ROOT->announce_deletion(this); 
     1254 
    12541255    unlink_from_parent(); 
    12551256    delete this; 
     
    12691270 
    12701271    if (!children->members()) { 
     1272        ED4_ROOT->announce_deletion(this); 
     1273         
    12711274        unlink_from_parent(); 
    12721275        delete this; 
  • branches/e4fix/EDIT4/ED4_root.cxx

    r8277 r8286  
    8181    if (main_manager->update_info.delete_requested) { 
    8282        main_manager->delete_requested_children(); 
     83        get_device_manager()->generate_id_for_groups(); // update group-counters 
    8384        redraw = 1; 
    8485    } 
     
    333334} 
    334335 
    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 { 
     336ED4_returncode ED4_root::add_to_selected(ED4_terminal *object) { 
    353337    ED4_base            *tmp_object; 
    354338    ED4_level            mlevel; 
  • branches/e4fix/EDIT4/ED4_terminal.cxx

    r8276 r8286  
    283283} 
    284284 
    285 ED4_returncode ED4_terminal::kill_object() 
    286 { 
     285inline 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 
     292ED4_returncode ED4_terminal::kill_object() { 
    287293    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) { 
    294297            aw_message("This group has to exist - deleting it isn't allowed"); 
    295298            return ED4_R_IMPOSSIBLE; 
    296299        } 
    297300 
    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); 
    345311 
    346312    return ED4_R_OK; 
  • branches/e4fix/EDIT4/ed4_class.hxx

    r8276 r8286  
    573573    void invalidate(); 
    574574 
     575    void announce_deletion(const ED4_base *object) { 
     576        if (object == calced4base) invalidate(); 
     577        e4_assert(calced4base != object); 
     578    } 
     579 
    575580    int get_base_position(const ED4_base *base, int sequence_position); 
    576581    int get_sequence_position(const ED4_base *base, int base_position); 
     
    652657 
    653658    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    } 
    654664 
    655665    void init(); 
     
    689699    ED4_window *get_matching_ed4w(AW_window *aww); 
    690700 
    691     void announce_deletion(ED4_base *object); 
    692  
     701    void announce_deletion(ED4_base *object) { cursor.announce_deletion(object); } 
     702     
    693703    // functions concerned the scrolled area 
    694704    ED4_returncode      update_scrolled_rectangle(); 
     
    10201030    virtual void changed_by_database(); 
    10211031    virtual void deleted_from_database(); 
    1022  
    1023     virtual bool remove_deleted_children(); 
    10241032 
    10251033    // functions concerned with graphic output 
     
    12091217    virtual void deleted_from_database(); 
    12101218 
    1211     virtual bool  remove_deleted_children(); 
    1212  
    12131219    // functions concerned with graphics 
    12141220    virtual ED4_returncode  Show(int refresh_all=0, int is_cleared=0); 
     
    12641270    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()); 
    12651271 
    1266     void            generate_id_for_groups(); 
    1267  
    12681272    // handle moves across the hierarchy 
    12691273    virtual ED4_returncode  handle_move(ED4_move_info *moveinfo); 
     
    13071311    virtual void changed_by_database(); 
    13081312    virtual void deleted_from_database(); 
    1309  
    1310     virtual bool  remove_deleted_children(); 
    13111313 
    13121314    // functions concerning graphic output 
     
    14751477    ED4_returncode refresh_all_windows(int redraw); 
    14761478 
    1477     void announce_deletion(ED4_base *object); // before deleting an object, announce here 
     1479    inline void announce_deletion(ED4_base *object); // before deleting an object, use this to announce  
    14781480 
    14791481    // functions concerned with list of selected objects 
     
    15131515}; 
    15141516 
     1517inline 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} 
    15151523 
    15161524// ------------------------ 
     
    15501558    ED4_device_manager  (const char *id, AW_pos x, AW_pos y, AW_pos width, AW_pos height, ED4_manager *parent); 
    15511559 
     1560    void generate_id_for_groups(); 
    15521561    DECLARE_DUMP_FOR_LEAFCLASS(ED4_manager); 
    15531562}; 
     
    15881597    int         get_no_of_selected_species(); 
    15891598    int         get_no_of_species(); 
     1599 
     1600    void generate_id_for_groups(); 
    15901601 
    15911602    void        invalidate_species_counters(); 
     
    19992010 
    20002011    virtual int get_length() const { return 1+strlen(id); } 
    2001  
    2002     virtual bool remove_deleted_children(); 
    20032012 
    20042013    DECLARE_DUMP_FOR_LEAFCLASS(ED4_text_terminal);