Changeset 8338

Show
Ignore:
Timestamp:
24/01/12 14:46:56 (4 months ago)
Author:
westram
Message:
  • do group-size calculation via update flags (first request; recalc during refresh)
  • when creating new group:
    • correctly calc group size and selection status for source group(s)
  • fixed a buffer-overflow in group_species
Location:
branches/e4fix/EDIT4
Files:
9 modified

Legend:

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

    r8337 r8338  
    294294    multi_species_manager->children->append_member(species_manager); 
    295295 
    296  
    297296    species_name_terminal = new ED4_species_name_terminal(group_name, 0, 0, MAXSPECIESWIDTH - BRACKETWIDTH, TERMINALHEIGHT, species_manager); 
    298297    species_name_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE));      // only some terminals 
     
    319318    multi_species_manager->children->append_member(group_spacer_terminal2); 
    320319 
     320    multi_species_manager->update_requested_by_child(); 
     321     
    321322    ED4_counter ++; 
    322323 
     
    634635 
    635636 
    636 void ED4_device_manager::generate_id_for_groups() { 
    637     for (int i=0; i<children->members(); i++) { 
    638         ED4_base *member = children->member(i); 
    639         if (member->is_area_manager()) { 
    640             member->to_area_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->generate_id_for_groups(); 
    641         } 
    642     } 
    643 } 
    644  
    645 void ED4_multi_species_manager::generate_id_for_groups() { 
    646     count_all_children_and_set_group_id(); 
    647 } 
    648  
    649  
    650 int ED4_multi_species_manager::count_all_children_and_set_group_id() // counts all species of a multi_species_manager 
    651 { 
    652     int   counter = 0; 
    653     int   i; 
    654     char *name; 
    655  
    656     for (i=0; i<children->members(); i++) { 
    657         ED4_base *member = children->member(i); 
    658         if (member->is_species_manager() && !member->flag.is_consensus) { 
    659             counter ++; 
    660         } 
    661         else if (member->is_group_manager()) { 
    662             counter += member->to_group_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->count_all_children_and_set_group_id(); 
    663         } 
    664     } 
    665  
    666  
     637void ED4_multi_species_manager::update_group_id() { 
    667638    ED4_base *consensus_name_terminal = get_consensus_terminal(); 
    668639    if (consensus_name_terminal) { // top managers dont show consensus 
    669         name = (char*)GB_calloc(strlen(consensus_name_terminal->id)+10, sizeof(*name)); 
    670  
    671         for (i=0; consensus_name_terminal->id[i] != '(' && consensus_name_terminal->id[i] != '\0';   i++) { 
    672             name[i] = consensus_name_terminal->id[i]; 
    673         } 
    674         if (consensus_name_terminal->id[i] != '\0') { // skip space 
     640        e4_assert(has_valid_counters()); 
     641         
     642        const char *cntid = consensus_name_terminal->id; 
     643        char       *name  = (char*)GB_calloc(strlen(cntid)+10, sizeof(*name)); 
     644 
     645        int i; 
     646        for (i=0; cntid[i] != '(' && cntid[i] != '\0';   i++) { 
     647            name[i] = cntid[i]; 
     648        } 
     649        if (cntid[i] != '\0') { // skip space 
    675650            i--; 
    676651        } 
    677652        name[i] = '\0'; 
    678         sprintf(name, "%s (%d)", name, counter); 
     653        sprintf(name, "%s (%d)", name, species); 
    679654 
    680655        freeset(consensus_name_terminal->id, name); 
    681     } 
    682     return counter; 
     656 
     657        consensus_name_terminal->set_refresh(); 
     658        consensus_name_terminal->parent->refresh_requested_by_child(); 
     659    } 
    683660} 
    684661 
  • branches/e4fix/EDIT4/ED4_cursor.cxx

    r8337 r8338  
    652652        delete string; 
    653653 
    654         insert_into_manager->generate_id_for_groups(); 
     654        insert_into_manager->invalidate_species_counters(); 
    655655    } 
    656656    if (name_term) { 
  • branches/e4fix/EDIT4/ED4_manager.cxx

    r8306 r8338  
    12081208    e4_assert(update_info.refresh); 
    12091209 
    1210     int i; 
    1211  
    1212     for (i=0; i<children->members(); i++) { 
     1210    for (int i=0; i<children->members(); i++) { 
    12131211        ED4_base *child = children->member(i); 
    12141212 
     
    12401238} 
    12411239 
     1240void ED4_manager::update_requested_by_child() { 
     1241    if (!update_info.update_requested) { 
     1242        if (parent) parent->update_requested_by_child(); 
     1243        update_info.update_requested = 1; 
     1244    } 
     1245} 
    12421246void ED4_manager::delete_requested_by_child() { 
    12431247    if (!update_info.delete_requested) { 
     
    12461250    } 
    12471251} 
    1248  
    12491252void ED4_terminal::delete_requested_children() { 
    12501253    e4_assert(update_info.delete_requested); 
     
    12551258    unlink_from_parent(); 
    12561259    delete this; 
     1260} 
     1261 
     1262void ED4_manager::update_requested_children() { 
     1263    e4_assert(update_info.update_requested); 
     1264 
     1265    for (int i=0; i<children->members(); i++) { 
     1266        ED4_base *child = children->member(i); 
     1267        if (child->update_info.update_requested) { 
     1268            child->update_requested_children(); 
     1269        } 
     1270    } 
     1271 
     1272    update_info.update_requested = 0; 
     1273} 
     1274 
     1275void ED4_multi_species_manager::update_requested_children() { 
     1276    e4_assert(update_info.update_requested); 
     1277    ED4_manager::update_requested_children(); 
     1278    update_species_counters(); 
     1279    update_group_id(); 
     1280 
     1281    ED4_base *group_base = get_parent(ED4_L_GROUP); 
     1282    if (group_base) { 
     1283        e4_assert(group_base->is_group_manager()); 
     1284        e4_assert(!group_base->is_root_group_manager()); 
     1285 
     1286        ED4_group_manager *group_man    = parent->to_group_manager(); 
     1287        ED4_base          *bracket_base = group_man->get_defined_level(ED4_L_BRACKET); 
     1288 
     1289        if (bracket_base && bracket_base->is_bracket_terminal()) { 
     1290            ED4_bracket_terminal *bracket_term = bracket_base->to_bracket_terminal(); 
     1291            bracket_term->set_refresh(); 
     1292            bracket_term->parent->refresh_requested_by_child(); 
     1293        } 
     1294    } 
    12571295} 
    12581296 
     
    12771315} 
    12781316 
     1317void ED4_multi_species_manager::delete_requested_children() { 
     1318    e4_assert(update_info.delete_requested); 
     1319    invalidate_species_counters(); 
     1320    ED4_manager::delete_requested_children(); 
     1321} 
     1322 
    12791323void ED4_terminal::Delete() { 
    12801324    if (!tflag.deleted) { 
     
    14121456        selected_species = -1; 
    14131457 
    1414         set_refresh(); 
    1415         parent->refresh_requested_by_child(); 
    1416  
    1417         e4_assert(!parent->is_root_group_manager()); 
    1418         if (parent->is_group_manager()) { 
    1419             ED4_group_manager *group_man = parent->to_group_manager(); 
    1420             ED4_base          *base      = group_man->get_defined_level(ED4_L_BRACKET); 
    1421  
    1422             if (base && base->is_bracket_terminal()) { 
    1423                 ED4_bracket_terminal *bracket_term = base->to_bracket_terminal(); 
    1424  
    1425                 bracket_term->set_refresh(); 
    1426                 bracket_term->parent->refresh_requested_by_child(); 
    1427             } 
    1428         } 
    1429  
    14301458        ED4_base *pms = get_parent(ED4_L_MULTI_SPECIES); 
    1431         if (pms) { 
    1432             pms->to_multi_species_manager()->invalidate_species_counters(); 
    1433         } 
     1459        if (pms) pms->to_multi_species_manager()->invalidate_species_counters(); 
     1460         
     1461        update_requested_by_child(); 
    14341462    } 
    14351463} 
     
    14501478        int species_diff  = no_of_species-species; 
    14511479        int selected_diff = no_of_selected-selected_species; 
    1452         int quickSet      = 1; 
    1453  
     1480 
     1481        int quickSet = 1; 
    14541482        if (species==-1 || selected_species==-1) { 
    14551483            quickSet = 0; 
    14561484        } 
    14571485 
    1458         species = no_of_species; 
     1486        species          = no_of_species; 
    14591487        selected_species = no_of_selected; 
    14601488 
     
    14701498            ED4_multi_species_manager *parent_multi_species_man = ms->to_multi_species_manager(); 
    14711499 
    1472             if (!quickSet) { 
    1473                 parent_multi_species_man->invalidate_species_counters(); 
    1474             } 
     1500            if (!quickSet) parent_multi_species_man->invalidate_species_counters(); 
    14751501 
    14761502            if (parent_multi_species_man->has_valid_counters()) { 
  • branches/e4fix/EDIT4/ED4_nds.cxx

    r8275 r8338  
    5555    if (int(refresh)) { 
    5656        ED4_calc_terminal_extentions(); 
    57         { 
    58             ARB_ERROR error = ED4_ROOT->main_manager->route_down_hierarchy(update_terminal_extension); 
    59             aw_message_if(error); 
    60         } 
     57        ED4_ROOT->main_manager->route_down_hierarchy(update_terminal_extension).expect_no_error(); 
    6158        ED4_gc_is_modified_cb(current_aww(), 0, 0); 
    6259    } 
  • branches/e4fix/EDIT4/ED4_no_class.cxx

    r8337 r8338  
    841841} 
    842842 
    843 void ED4_timer_refresh() 
    844 { 
     843void ED4_timer_refresh() { 
    845844    GB_begin_transaction(GLOBAL_gb_main);                  // for callbacks from database 
    846845    GB_tell_server_dont_wait(GLOBAL_gb_main); 
    847846    GB_commit_transaction(GLOBAL_gb_main); 
     847 
     848    // @@@ need to ED4_ROOT->refresh_all_windows(0) here 
    848849} 
    849850 
     
    10601061#define SIGNIFICANT_FIELD_CHARS 30 // length used to compare field contents (in createGroupFromSelected) 
    10611062 
    1062 static void createGroupFromSelected(GB_CSTR group_name, GB_CSTR field_name, GB_CSTR field_content) 
     1063static void createGroupFromSelected(GB_CSTR group_name, GB_CSTR field_name, GB_CSTR field_content) { 
    10631064    // creates a new group named group_name 
    10641065    // if field_name==0 -> all selected species & subgroups are moved to this new group 
    10651066    // if field_name!=0 -> all selected species containing field_content in field field_name are moved to this new group 
    1066 { 
    1067     ED4_group_manager *group_manager = NULL; 
    1068     ED4_ROOT->main_manager->create_group(&group_manager, group_name); 
     1067 
     1068    ED4_group_manager *new_group_manager = NULL; 
     1069    ED4_ROOT->main_manager->create_group(&new_group_manager, group_name); 
     1070 
    10691071    ED4_manager *top_area = ED4_ROOT->main_manager->search_spec_child_rek(ED4_L_AREA)->to_manager(); 
    1070     ED4_multi_species_manager *multi_species_manager = top_area->search_spec_child_rek(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 
    1071  
    1072     group_manager->extension.position[Y_POS] = 2; 
    1073     ED4_base::touch_world_cache(); 
    1074     multi_species_manager->children->append_member(group_manager); 
    1075     group_manager->parent = (ED4_manager *) multi_species_manager; 
    1076  
    1077     multi_species_manager = group_manager->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 
     1072 
     1073    { 
     1074        ED4_multi_species_manager *multi_species_manager = top_area->search_spec_child_rek(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 
     1075 
     1076        new_group_manager->extension.position[Y_POS] = 2; 
     1077        ED4_base::touch_world_cache(); 
     1078        multi_species_manager->children->append_member(new_group_manager); 
     1079        new_group_manager->parent = (ED4_manager *) multi_species_manager; 
     1080    } 
     1081     
     1082    ED4_multi_species_manager *new_multi_species_manager = new_group_manager->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager(); 
    10781083 
    10791084    ED4_list_elem *list_elem = ED4_ROOT->selected_objects.first(); 
     
    11111116 
    11121117        if (move_object) { 
    1113             object->parent->children->remove_member(object); 
    1114  
    11151118            ED4_base *base = object->get_parent(ED4_L_MULTI_SPECIES); 
    11161119            if (base && base->is_multi_species_manager()) { 
     
    11181121                old_multi->invalidate_species_counters(); 
    11191122            } 
    1120             multi_species_manager->children->append_member(object); 
    1121  
    1122             object->parent = (ED4_manager *)multi_species_manager; 
     1123             
     1124            object->parent->children->remove_member(object); 
     1125            new_multi_species_manager->children->append_member(object); 
     1126 
     1127            object->parent = (ED4_manager *)new_multi_species_manager; 
    11231128            object->set_width(); 
    11241129        } 
     
    11271132    } 
    11281133 
    1129     group_manager->create_consensus(group_manager, NULL); 
    1130     group_manager->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->count_all_children_and_set_group_id(); 
    1131  
     1134    new_group_manager->create_consensus(new_group_manager, NULL); 
     1135    new_multi_species_manager->invalidate_species_counters(); 
     1136     
    11321137    { 
    1133         ED4_bracket_terminal *bracket = group_manager->get_defined_level(ED4_L_BRACKET)->to_bracket_terminal(); 
     1138        ED4_bracket_terminal *bracket = new_group_manager->get_defined_level(ED4_L_BRACKET)->to_bracket_terminal(); 
    11341139        if (bracket) bracket->fold(); 
    11351140    } 
    11361141 
    1137     multi_species_manager->resize_requested_by_child(); 
    1138  
    1139     current_ed4w()->update_scrolled_rectangle(); 
    1140     current_device()->reset(); 
    1141     ED4_ROOT->refresh_all_windows(1); 
     1142    new_multi_species_manager->resize_requested_by_child(); 
    11421143} 
    11431144 
     
    12061207                                int newlen = doneLen + field_content_len + 1; 
    12071208                                char *newDone = (char*)malloc(newlen+1); 
    1208                                 GBS_global_string_to_buffer(newDone, newlen, "%s%s;", doneContents, field_content); 
     1209                                GBS_global_string_to_buffer(newDone, newlen+1, "%s%s;", doneContents, field_content); 
    12091210                                freeset(doneContents, newDone); 
    12101211                                doneLen = newlen; 
  • branches/e4fix/EDIT4/ED4_root.cxx

    r8298 r8338  
    8787    if (main_manager->update_info.delete_requested) { 
    8888        main_manager->delete_requested_children(); 
    89         get_device_manager()->generate_id_for_groups(); // update group-counters 
     89        redraw = 1; 
     90    } 
     91 
     92    if (main_manager->update_info.update_requested) { 
     93        main_manager->update_requested_children(); 
    9094        redraw = 1; 
    9195    } 
     
    525529} 
    526530 
     531static ARB_ERROR force_group_update(ED4_base *base) { 
     532    if (base->is_multi_species_manager()) { 
     533        base->to_multi_species_manager()->update_requested_by_child(); 
     534    } 
     535    return NULL; 
     536} 
     537 
    527538ED4_returncode ED4_root::create_hierarchy(char *area_string_middle, char *area_string_top) // creates internal hierarchy of editor 
    528539{ 
     
    530541    ED4_index y = 0, help = 0; 
    531542    ED4_base *x_link, *y_link, *width_link, *height_link; 
    532     ED4_window *new_window; 
    533543    long total_no_of_species, total_no_of_groups, group_count, species_count; 
    534544 
     
    629639 
    630640                y += TOP_MID_SPACER_HEIGHT; // add top-mid_spacer_terminal height 
    631  
    632                 top_multi_species_manager->generate_id_for_groups(); 
    633641            } 
    634642 
     
    671679                tree_terminal->extension.size[HEIGHT] = y - help; 
    672680 
    673                 mid_multi_species_manager->generate_id_for_groups(); 
    674                 y += 10;                                                // add top-mid_spacer_terminal height 
     681                y += 10; // add top-mid_spacer_terminal height 
    675682 
    676683                mid_bot_line_terminal = new ED4_line_terminal("Mid_Bot_Line_Terminal", 0, y, 0, 3, device_manager);    // width will be set below 
     
    708715 
    709716 
     717    main_manager->route_down_hierarchy(force_group_update).expect_no_error(); 
     718 
    710719    // build consensi 
    711720    { 
     
    731740    height_link = y_link; 
    732741 
    733     new_window = first_window; 
    734  
    735     while (new_window) { 
    736         new_window->set_scrolled_rectangle(x_link, y_link, width_link, height_link); 
    737         new_window->aww->show(); 
    738         new_window->update_scrolled_rectangle(); 
    739         ED4_refresh_window(new_window->aww); 
    740         new_window = new_window->next; 
    741     } 
    742  
    743     aw_root->add_timed_callback(2000, ED4_timer, (AW_CL)0, (AW_CL)0); 
     742    ED4_window *win = first_window; 
     743    while (win) { 
     744        win->set_scrolled_rectangle(x_link, y_link, width_link, height_link); 
     745        win->aww->show(); 
     746        win->update_scrolled_rectangle(); 
     747        win = win->next; 
     748    } 
     749 
     750    aw_root->add_timed_callback(200, ED4_timer, (AW_CL)0, (AW_CL)0); 
    744751 
    745752    ED4_finish_and_show_notFoundMessage(); 
     
    13291336} 
    13301337 
    1331 ED4_returncode ED4_root::generate_window(AW_device **device,    ED4_window **new_window) 
     1338ED4_returncode ED4_root::generate_window(AW_device **device, ED4_window **new_window) 
    13321339{ 
    13331340    AW_window_menu_modes *awmm; 
  • branches/e4fix/EDIT4/ED4_terminal.cxx

    r8337 r8338  
    632632 
    633633                                    if (member->is_area_manager()) { 
    634                                         member->to_area_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->generate_id_for_groups(); 
     634                                        member->to_area_manager()->get_defined_level(ED4_L_MULTI_SPECIES)->to_multi_species_manager()->update_requested_by_child(); 
    635635                                    } 
    636636                                } 
     
    673673    return ED4_R_OK; 
    674674} 
     675 
     676void ED4_terminal::update_requested_children() {} 
    675677 
    676678bool ED4_terminal::calc_bounding_box() { 
  • branches/e4fix/EDIT4/ed4_class.hxx

    r8337 r8338  
    10951095 
    10961096    // functions which refer to the object as a child, i.e. travelling down the hierarchy 
    1097     virtual ED4_returncode  set_refresh (int clear=1)=0; 
     1097    virtual ED4_returncode  set_refresh(int clear=1)=0; 
    10981098    virtual ED4_returncode  resize_requested_by_child()=0; 
    1099     virtual ED4_returncode  resize_requested_by_parent()=0; 
     1099    virtual ED4_returncode  resize_requested_by_parent()=0; // @@@ name is wrong! should be resize_requested_children! 
    11001100 
    11011101    virtual void delete_requested_children() = 0; 
    11021102    virtual void Delete()                    = 0; 
     1103     
     1104    inline void set_update(); 
     1105    virtual void update_requested_children() = 0; 
    11031106 
    11041107    virtual ED4_returncode  calc_size_requested_by_parent()=0; 
     
    11061109    virtual ED4_returncode  event_sent_by_parent(AW_event *event, AW_window *aww); 
    11071110    virtual ED4_returncode  move_requested_by_child(ED4_move_info *moveinfo)=0; 
     1111 
    11081112 
    11091113    virtual ED4_returncode  handle_move(ED4_move_info *moveinfo) = 0; 
     
    12041208        return const_cast<Class*>(const_cast<const ED4_base*>(this)->toName()); \ 
    12051209    } 
    1206      
     1210 
    12071211#define E4B_DECL_CASTOP(name) E4B_DECL_CASTOP_helper(concat(ED4_,name), concat(to_,name), concat(is_,name)) 
    12081212#define E4B_IMPL_CASTOP(name) E4B_IMPL_CASTOP_helper(concat(ED4_,name), concat(to_,name), concat(is_,name)) 
     
    12591263    virtual ED4_returncode  resize_requested_by_parent(); 
    12601264 
     1265    virtual void update_requested_children(); 
     1266 
    12611267    virtual void delete_requested_children(); 
    12621268    virtual void Delete(); 
     
    12811287    virtual ED4_returncode  refresh_requested_by_child(); 
    12821288    void delete_requested_by_child(); 
     1289    void update_requested_by_child(); 
    12831290     
    12841291    ED4_base *get_defined_level(ED4_level lev) const; 
     
    13271334    virtual ~ED4_manager(); 
    13281335}; 
    1329  
    13301336 
    13311337class ED4_terminal : public ED4_base { // derived from a Noncopyable 
     
    13621368    virtual ED4_returncode resize_requested_by_parent(); 
    13631369 
     1370    virtual void update_requested_children(); 
    13641371    virtual void delete_requested_children(); 
    13651372    virtual void Delete(); 
     
    16031610    ED4_device_manager  (const char *id, AW_pos x, AW_pos y, AW_pos width, AW_pos height, ED4_manager *parent); 
    16041611 
    1605     void generate_id_for_groups(); 
    16061612    DECLARE_DUMP_FOR_LEAFCLASS(ED4_manager); 
    16071613}; 
     
    16341640    DECLARE_DUMP_FOR_LEAFCLASS(ED4_manager); 
    16351641 
     1642    virtual void update_requested_children(); 
     1643    virtual void delete_requested_children(); 
     1644 
    16361645    int           count_visible_children(); // is called by a multi_species_manager 
    1637     int           count_all_children_and_set_group_id(); // counts all children of a parent 
    16381646    ED4_terminal *get_consensus_terminal(); // returns the consensus-terminal or 0 
    16391647    ED4_species_manager *get_consensus_manager() const; // returns the consensus-manager or 0 
     
    16431651    int         get_no_of_species(); 
    16441652 
    1645     void generate_id_for_groups(); 
     1653    void update_group_id(); 
    16461654 
    16471655    void        invalidate_species_counters(); 
     
    21142122// ---------------------------------------------- 
    21152123//      inlines which need complete classdefs 
     2124 
     2125inline void ED4_base::set_update() { 
     2126    if (!update_info.update_requested) { 
     2127        update_info.update_requested = 1; 
     2128        if (parent) parent->update_requested_by_child(); 
     2129    } 
     2130} 
    21162131 
    21172132inline bool ED4_terminal::setCursorTo(ED4_cursor *cursor, int seq_pos, bool unfoldGroups, ED4_CursorJumpType jump_type) { 
     
    22592274#endif 
    22602275 
    2261  
  • branches/e4fix/EDIT4/ed4_defs.hxx

    r8333 r8338  
    324324    unsigned int refresh_vertical_scrolling : 1; 
    325325    unsigned int delete_requested : 1; 
     326    unsigned int update_requested : 1; 
    326327 
    327328    void set_clear_at_refresh(int value) {