root/trunk/EDIT4/EDB_root_bact.cxx

Revision 8630, 29.4 KB (checked in by westram, 5 weeks ago)

merge from e4fix [8430] [8431] [8432] [8433] [8434] [8435] [8436] [8437] [8438] [8440] [8441] [8442]

  • fixed display concerns
    • wrong mark boxes for unmarked species when (slowly) scrolling vertically
    • tiny gaps when moving cursor leftwards (best visible if species is selected)
    • do not draw all spacer terminals
    • rewrote ED4_bracket_terminal::draw (increased bracket-width by 1 pixel)
  • marked_species_select and selected_species_mark produced wrong counters since [8625]. fixed
  • signature of AW_device::clear_part now same as box_impl
  • Rectangle::distinct_from() no longer counts adjacent rectangles as distinct
  • AW_screen_area_conversion_mode
    • removed FAULTY_OLD_CONVERSION
    • added UPPER_LEFT_OUTLINE
  • added functions using namespace-AW-Positions
    • coordinate transformation
    • ED4_base::get_screen_area
  • no need for virtual adjust_clipping_rectangle()
    • both methods (ED4_base and ED4_terminal) were identical
  • get_screen_area -> get_win_area
    • decrement size by 1
    • use in ED4_bracket_terminal::draw and ED4_base::adjust_clipping_rectangle (eliminating confusing -1 offsets at both places)
  • added get_multi_species_manager() to ED4_area_manager and ED4_group_manager
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : EDB_root_bact.cxx                                 //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include <ed4_extern.hxx>
12#include "ed4_class.hxx"
13
14#include <aw_msg.hxx>
15#include <arb_progress.h>
16#include <arbdbt.h>
17#include <arb_strbuf.h>
18#include <ad_config.h>
19
20#define NAME_BUFFERSIZE 100
21
22void EDB_root_bact::calc_no_of_all(char *string_to_scan, long *group, long *species)
23{
24    long i=0;
25
26    *group = 0;
27    *species = 0;
28
29    if (!string_to_scan)
30        return;
31
32    while (string_to_scan[i]) {
33        if (string_to_scan[i] == 1) {
34            if (string_to_scan[i+1] == 'L' || string_to_scan[i+1] == 'S') {
35                (*species)++;
36                i++;
37            }
38            else if (string_to_scan[i+1] == 'F' || string_to_scan[i+1] == 'G') {
39                (*group)++;
40                i++;
41            }
42        }
43        i++;
44    }
45}
46
47ED4_returncode EDB_root_bact::fill_data(ED4_multi_species_manager  *multi_species_manager,
48                                        ED4_sequence_info_terminal *ref_sequence_info_terminal,
49                                        ED4_sequence_terminal      *ref_sequence_terminal,
50                                        char                       *str,
51                                        ED4_index                  *y,
52                                        ED4_index                   curr_local_position,
53                                        ED4_index                  *length_of_terminals,
54                                        int                         group_depth,
55                                        ED4_datamode                datamode)
56{
57    ED4_species_manager        *species_manager;
58    ED4_multi_name_manager     *multi_name_manager;
59    ED4_name_manager           *name_manager;
60    ED4_species_name_terminal  *species_name_terminal;
61    ED4_multi_sequence_manager *multi_sequence_manager;
62    char                        namebuffer[NAME_BUFFERSIZE];
63    int                         count_too   = 0;
64    ED4_index                   name_coords = 0, seq_coords = 0, local_count_position = 0, terminal_height;
65    GBDATA                     *gb_datamode = NULL;
66
67    switch (datamode) {
68        case ED4_D_EXTENDED: {
69            gb_datamode = GBT_find_SAI(GLOBAL_gb_main, str);
70            break;
71        }
72        case ED4_D_SPECIES: {
73            gb_datamode = GBT_find_species(GLOBAL_gb_main, str);
74            break;
75        }
76    }
77
78    if (!gb_datamode) { // didn't find this species
79        char dummy[150];
80        not_found_counter++;
81        if (not_found_counter <= MAX_SHOWN_MISSING_SPECIES) {
82            sprintf(dummy, "%zu. %s\n", not_found_counter, str);
83            GBS_strcat(not_found_message, dummy);
84        }
85        return ED4_R_BREAK;
86    }
87
88        // check whether sequence has data in desired alignment
89    bool has_alignment = 0 != GB_entry(gb_datamode, ED4_ROOT->alignment_name);
90    if (!has_alignment) {
91        if (datamode == ED4_D_SPECIES) { // only warn about species w/o data (SAIs are skipped silently)
92            char dummy[150];
93            not_found_counter++;
94            if (not_found_counter <= MAX_SHOWN_MISSING_SPECIES) {
95                sprintf(dummy, "%zu. %s (no data in alignment)\n", not_found_counter, str);
96                GBS_strcat(not_found_message, dummy);
97            }
98        }
99        return ED4_R_BREAK;
100    }
101
102    terminal_height = TERMINALHEIGHT;
103    local_count_position = curr_local_position;
104
105    sprintf(namebuffer, "Species_Manager.%ld.%d", ED4_counter, count_too);
106
107    ED4_species_type spec_type = (datamode == ED4_D_EXTENDED) ? ED4_SP_SAI : ED4_SP_SPECIES;
108    species_manager            = new ED4_species_manager(spec_type, namebuffer, 0, local_count_position, 0, 0, multi_species_manager);
109
110    species_manager->set_property(ED4_P_MOVABLE);
111    if (spec_type == ED4_SP_SAI) {
112        ED4_abstract_group_manager *group_man = species_manager->get_parent(ED4_level(ED4_L_GROUP|ED4_L_ROOTGROUP))->to_abstract_group_manager();
113        group_man->table().ignore_me(); // ignore SAI tables (does not work - instead ignore SAIs when calculating consensus)
114    }
115    species_manager->set_species_pointer(gb_datamode);
116    multi_species_manager->children->append_member(species_manager);
117
118    sprintf(namebuffer, "MultiName_Manager.%ld.%d", ED4_counter, count_too);
119    multi_name_manager = new ED4_multi_name_manager(namebuffer, 0, 0, 0, 0, species_manager);
120    species_manager->children->append_member(multi_name_manager);
121
122    sprintf(namebuffer, "MultiSeq_Manager.%ld.%d", ED4_counter, count_too++);
123    multi_sequence_manager = new ED4_multi_sequence_manager(namebuffer, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), 0, 0, 0, species_manager);
124    species_manager->children->append_member(multi_sequence_manager);
125
126    sprintf(namebuffer, "Name_Manager%ld.%d", ED4_counter, count_too ++);                          // hier fehlt noch y
127    name_manager = new ED4_name_manager(namebuffer, 0, 0*terminal_height, 0, 0, multi_name_manager);            // hier fehlt noch y
128    name_manager->set_property(ED4_P_MOVABLE);                            // only Speciesname should be movable !!!!
129    multi_name_manager->children->append_member(name_manager);
130
131    sprintf(namebuffer, "Species_Name_Term%ld.%d", ED4_counter, count_too ++);
132    species_name_terminal = new ED4_species_name_terminal(namebuffer, 0, 0, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), terminal_height, name_manager);
133    species_name_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE));
134    species_name_terminal->set_links(NULL, ref_sequence_terminal);
135    species_name_terminal->set_species_pointer(GB_entry(gb_datamode, "name"));
136    name_manager->children->append_member(species_name_terminal);
137
138    name_coords += terminal_height;
139
140    search_sequence_data_rek(multi_sequence_manager, ref_sequence_info_terminal, ref_sequence_terminal, gb_datamode,
141                             count_too, &seq_coords, &max_seq_terminal_length, ED4_A_DEFAULT, datamode == ED4_D_EXTENDED);
142
143    local_count_position += max(name_coords, seq_coords);
144    name_coords = seq_coords = 0;
145
146    if (!(multi_species_manager->flag.hidden)) {
147        *length_of_terminals = local_count_position-curr_local_position;
148        *y += *length_of_terminals; // needed for global coordinates of manager
149    }
150
151    return ED4_R_OK;
152}
153
154ED4_returncode EDB_root_bact::search_sequence_data_rek(ED4_multi_sequence_manager *multi_sequence_manager,
155                                                       ED4_sequence_info_terminal *ref_sequence_info_terminal,
156                                                       ED4_sequence_terminal      *ref_sequence_terminal,
157                                                       GBDATA                     *gb_datamode,
158                                                       int                         count_too,
159                                                       ED4_index                  *seq_coords,
160                                                       ED4_index                  *max_sequence_terminal_length,
161                                                       ED4_alignment               alignment_flag,
162                                                       bool                        isSAI)
163{
164    AW_device *device;
165    int        j          = 0;
166    int        pixel_length;
167    GBDATA    *gb_ali_xxx = NULL;
168    GBDATA    *gb_alignment;
169    long       string_length;
170    char       namebuffer[NAME_BUFFERSIZE];
171
172    device = ED4_ROOT->first_window->get_device();
173
174    if (alignment_flag == ED4_A_DEFAULT) {
175        gb_ali_xxx = GB_entry(gb_datamode, ED4_ROOT->alignment_name);
176    }
177    else if (alignment_flag == ED4_A_CONTAINER) {
178        gb_ali_xxx = gb_datamode;
179    }
180    if (!gb_ali_xxx) return ED4_R_OK;
181
182    j=0;
183    for (gb_alignment = GB_child(gb_ali_xxx); gb_alignment; gb_alignment = GB_nextChild(gb_alignment)) {
184        GB_TYPES type = GB_read_type(gb_alignment);
185
186        if (type == GB_INTS || type == GB_FLOATS) {
187            continue;
188        }
189
190        if (type == GB_DB) {  // we have to unpack container
191            search_sequence_data_rek(multi_sequence_manager, ref_sequence_info_terminal, ref_sequence_terminal,
192                                     gb_alignment, count_too, seq_coords, max_sequence_terminal_length, ED4_A_CONTAINER, isSAI);
193        }
194        else { // otherwise we enter the data
195            char *key_string = GB_read_key(gb_alignment);
196            if (key_string[0] != '_') { // don't show sequences starting with an underscore
197                sprintf(namebuffer, "Sequence_Manager.%ld.%d", ED4_counter, count_too++);
198                ED4_sequence_manager *seq_manager = new ED4_sequence_manager(namebuffer, 0, j*TERMINALHEIGHT, 0, 0, multi_sequence_manager);
199                seq_manager->set_property(ED4_P_MOVABLE);
200                multi_sequence_manager->children->append_member(seq_manager);
201
202                ED4_sequence_info_terminal *sequence_info_terminal =
203                    new ED4_sequence_info_terminal(key_string, 0, 0, SEQUENCEINFOSIZE, TERMINALHEIGHT, seq_manager);
204                sequence_info_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE));
205                sequence_info_terminal->set_links(ref_sequence_info_terminal, ref_sequence_info_terminal);
206                sequence_info_terminal->set_species_pointer(gb_alignment);
207                seq_manager->children->append_member(sequence_info_terminal);
208
209                ED4_text_terminal *text_terminal = 0;
210
211                bool is_data    = false;
212                bool is_data2   = false;
213                bool is_bits    = false;
214                bool is_quality = false;
215
216                if      (strcmp(key_string, "data")    == 0) is_data    = true; // SAI or species
217                else if (strcmp(key_string, "data2")   == 0) is_data2   = true; // used by SAIs with two entries (e.g. first and second digit of 2-digit-numbers)
218                else if (strcmp(key_string, "bits")    == 0) is_bits    = true; // used by binary SAIs (e.g. MARKERLINE)
219                else if (strcmp(key_string, "quality") == 0) is_quality = true; // used by "quality" entry written by chimera check; see ../STAT/ST_quality.cxx@chimera_check_quality_string
220
221                bool is_aligned = is_data || is_data2 || is_bits || is_quality;
222
223                if (is_aligned) {
224                    bool shall_display_secinfo = is_data;
225
226                    if (isSAI) {
227                        GBDATA *gb_sai        = GB_get_grandfather(gb_alignment);
228                        GBDATA *gb_disp_sec   = GB_searchOrCreate_int(gb_sai, "showsec", 0);
229                        shall_display_secinfo = GB_read_int(gb_disp_sec);
230                    }
231
232                    sprintf(namebuffer, "Sequence_Term%ld.%d", ED4_counter, count_too++);
233                    ED4_sequence_terminal *seq_term = new ED4_sequence_terminal(namebuffer, SEQUENCEINFOSIZE, 0, 0, TERMINALHEIGHT, seq_manager, shall_display_secinfo);
234                    seq_term->species_name          = seq_term->get_name_of_species();
235
236                    if (is_data) seq_term->set_property(ED4_P_CONSENSUS_RELEVANT);
237                    seq_term->set_property(ED4_P_ALIGNMENT_DATA);
238
239                    text_terminal = seq_term;
240                }
241                else {
242                    sprintf(namebuffer, "PureText_Term%ld.%d", ED4_counter, count_too++);
243                    text_terminal = new ED4_pure_text_terminal(namebuffer, SEQUENCEINFOSIZE, 0, 0, TERMINALHEIGHT, seq_manager);
244                }
245
246                text_terminal->set_property(ED4_P_CURSOR_ALLOWED);
247                text_terminal->set_links(ref_sequence_terminal, ref_sequence_terminal);
248                seq_manager->children->append_member(text_terminal);
249#if defined(DEBUG)
250                // ensure only 1 terminal is consensus-relevant!
251                if (is_data) {
252                    seq_manager->get_consensus_relevant_terminal(); // does an error otherwise!
253                }
254#endif // DEBUG
255                text_terminal->set_species_pointer(gb_alignment);
256
257                if (gb_alignment) {
258                    string_length = GB_read_count(gb_alignment);
259                }
260                else {
261                    string_length = 100;
262                }
263
264                pixel_length = device->get_string_size(ED4_G_SEQUENCES, NULL, string_length) + 100;
265
266                *max_sequence_terminal_length = max(*max_sequence_terminal_length, pixel_length);
267                text_terminal->extension.size[WIDTH] = pixel_length;
268
269                if (MAXSEQUENCECHARACTERLENGTH < string_length) {
270                    MAXSEQUENCECHARACTERLENGTH = string_length;
271                    ref_sequence_terminal->extension.size[WIDTH] = pixel_length;
272                }
273
274                if (!ED4_ROOT->scroll_links.link_for_hor_slider) {
275                    ED4_ROOT->scroll_links.link_for_hor_slider = text_terminal;
276                }
277                else if (*max_sequence_terminal_length > ED4_ROOT->scroll_links.link_for_hor_slider->extension.size[WIDTH]) {
278                    ED4_ROOT->scroll_links.link_for_hor_slider = text_terminal;
279                }
280
281                *seq_coords += TERMINALHEIGHT;
282                j++;
283            }
284            free(key_string);
285        }
286    }
287
288    return ED4_R_OK;
289}
290
291
292char* EDB_root_bact::make_string()
293{
294    const char *sep_name     = "\1"; // Trennzeichen
295    char*       configstring = new char[500];
296
297    strcpy(configstring, sep_name);
298
299    strcat(configstring, "FGruppe1lang");
300    strcat(configstring, sep_name);
301    strcat(configstring, "SHELIX_PAIRS");
302    strcat(configstring, sep_name);
303    strcat(configstring, "SHELIX_LINE");
304    strcat(configstring, sep_name);
305    strcat(configstring, "E");
306    strcat(configstring, sep_name);
307    strcat(configstring, "GFltDorot");  // Speciesmark L
308    strcat(configstring, sep_name);
309    strcat(configstring, "LCasElega");
310    strcat(configstring, sep_name);
311    strcat(configstring, "E");
312    strcat(configstring, sep_name);
313    strcat(configstring, "LBaeFrag3");
314    strcat(configstring, sep_name);
315    strcat(configstring, "LFlaFerr2");
316    strcat(configstring, sep_name);
317    strcat(configstring, "LCytLyti3");
318    strcat(configstring, "\0");
319
320    return configstring;
321}
322
323char* EDB_root_bact::make_top_bot_string()          // is only called when started manually
324{
325    char* configstring;
326    configstring = new char[400];
327    sprintf(configstring, "%cFSAI's%cSHELIX_PAIRS%cSHELIX_LINE%cSALI_ERR%cSALI_CON%cSALI_INT%cSALI_BIND%cSantibiot%cSmodnuc%cSelong%cStRNA%cSALI_BOR%cSALI_PRE_I%cSALI_PRE%cSALI_INSERTS%cSinseuca2%cSregaps%cSallr5%cSbacr5%cSarcr5%cSeucr5%cSgplr5%cSinsEuca%cSprimer1%cSprimer2%cSbetar5%cSprimer3%cE", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
328
329    strcat(configstring, "\0");
330
331    return configstring;
332}
333
334
335ED4_returncode  EDB_root_bact::fill_species(ED4_multi_species_manager  *multi_species_manager,
336                                            ED4_sequence_info_terminal *ref_sequence_info_terminal,
337                                            ED4_sequence_terminal      *ref_sequence_terminal,
338                                            char                       *str,
339                                            int                        *index,
340                                            ED4_index                  *y,
341                                            ED4_index                   curr_local_position,
342                                            ED4_index                  *length_of_terminals, // height of terminals is meant
343                                            int                         group_depth,
344                                            arb_progress               *progress)
345{
346#define SHIPSIZE 1024
347
348    char         *ship;
349    int           lauf                        = 0;
350    ED4_index     local_count_position        = 0;
351    ED4_index     height_of_created_terminals = 0;
352    bool          word                        = 0;
353    ED4_datamode  datamode                    = ED4_D_SPECIES;
354    ED4_returncode retCode                    = ED4_R_OK;
355
356    ship = (char*)GB_calloc(SHIPSIZE, sizeof(*ship));
357    local_count_position = curr_local_position;
358
359    do {
360        if (word == 0) { // word is needed for jump over separator
361            if (str[(*index)+1] == 'L') {
362                datamode = ED4_D_SPECIES;
363            }
364            else if (str[(*index)+1] == 'S') {
365                datamode = ED4_D_EXTENDED;
366            }
367            else {
368
369                const char *entry = str+*index+1;
370                char        tag   = entry[0];
371                const char *sep   = strchr(entry, 1);
372
373                if (sep) {
374                    int   len     = sep-entry+1;
375                    char *content = (char*)GB_calloc(len+1, 1);
376                    memcpy(content, entry+1, len);
377
378                    char *message = GBS_global_string_copy("Unknown or misplaced tag-id '%c' (with content '%s'). Error in configuration-data!\nTrying to continue..", tag, content);
379                    fprintf(stderr, "ARB_EDIT4: %s\n", message);
380                    aw_message(message);
381
382                    free(message);
383                    free(content);
384                    retCode = ED4_R_WARNING;
385
386                    (*index) += sep-entry+1; // set index to next separator
387                    continue;
388                }
389                else {
390                    fprintf(stderr, "Error reading configuration: Unexpected end of data (at '%s')\n", str+*index);
391
392                    e4_assert(0);
393                    retCode = ED4_R_ERROR;
394                    break;
395                }
396                e4_assert(0); // never reached!
397            }
398
399            (*index) += 2;
400        }
401
402        if (str[*index] != 1) {
403            ship[lauf++] = str[*index];
404            word = 1;
405            (*index)++;
406        }
407
408        if (str[*index] == 1 || str[*index] == '\0') {
409            ship[lauf] = '\0'; // speciesname-generation is finished
410            lauf = 0;
411
412            if (progress) {
413                progress->inc();
414                if (progress->aborted()) ED4_exit();
415            }
416
417            fill_data(multi_species_manager, ref_sequence_info_terminal, ref_sequence_terminal, ship /* species name */,
418                      y, local_count_position, &height_of_created_terminals, group_depth, datamode);
419
420            ED4_counter++;
421            local_count_position += height_of_created_terminals;
422            *length_of_terminals += height_of_created_terminals;
423            word = 0;
424        }
425    } while (!((str[(*index)] == 1) && (str[(*index)+1] == 'G' || str[(*index)+1]=='E' || str[(*index)+1]=='F'))
426             && (str[*index] != '\0'));
427
428    free(ship);
429    return retCode;
430#undef SHIPSIZE
431}
432
433ED4_index EDB_root_bact::scan_string(ED4_multi_species_manager  *parent,
434                                     ED4_sequence_info_terminal *ref_sequence_info_terminal,
435                                     ED4_sequence_terminal      *ref_sequence_terminal,
436                                     char                       *str,
437                                     int                        *index,
438                                     ED4_index                  *y,
439                                     arb_progress&               progress)
440{
441    ED4_multi_species_manager *multi_species_manager = NULL;
442    ED4_bracket_terminal      *bracket_terminal      = NULL;
443    ED4_spacer_terminal       *group_spacer_terminal = NULL;
444    char                       namebuffer[NAME_BUFFERSIZE];
445    char                       groupname[GB_GROUP_NAME_MAX];
446    ED4_index                  y_old                 = 0;
447    ED4_index                  lauf                  = 0;
448    ED4_index                  local_count_position  = 0;
449    ED4_index                  length_of_terminals   = 0;
450    static int                 group_depth           = 0;
451    bool                       is_folded             = 0;
452
453    if (!parent->parent->is_area_manager()) {       // add 25 if group is not child of; not the first time!
454        local_count_position = TERMINALHEIGHT + SPACERHEIGHT;   // a folded group
455    }
456
457    while (str[(*index)] != '\0' && str[(*index)+1] != 'E') { // E =
458        if (str[(*index)+1] == 'L' || str[(*index)+1] == 'S') {   // L = species, S = SAI
459            length_of_terminals = 0;
460
461            fill_species(parent, ref_sequence_info_terminal, ref_sequence_terminal, str, index,
462                         y, local_count_position, &length_of_terminals, group_depth, &progress);
463
464            local_count_position += length_of_terminals;
465            ED4_counter ++;     // counter is only needed to generate
466        }
467
468        if (str[(*index)] && (str[(*index)+1] == 'G' || str[(*index)+1] == 'F')) { // Group or folded group
469            group_depth++;
470            is_folded = str[(*index)+1]=='F';
471
472            for (*index += 2, lauf = 0; str[*index] != 1; (*index)++) {  // Jump over 'G' and Blank to get Groupname
473                groupname[lauf++] = str[*index];
474            }
475            groupname[lauf] = '\0';
476
477            create_group_header(parent, ref_sequence_info_terminal, ref_sequence_terminal, &multi_species_manager, &bracket_terminal,
478                                y, groupname, group_depth, is_folded, local_count_position);
479
480            y_old = local_count_position;
481            ED4_counter++;
482
483            local_count_position += scan_string(multi_species_manager, ref_sequence_info_terminal, ref_sequence_terminal, str, index, y, progress);
484            sprintf(namebuffer, "Group_Spacer_Terminal_End.%ld", ED4_counter);
485
486            local_count_position += SPACERHEIGHT;
487
488            bracket_terminal->extension.size[HEIGHT] = local_count_position - y_old;
489            group_spacer_terminal = new ED4_spacer_terminal(namebuffer, false, 0, local_count_position - y_old + SPACERHEIGHT, 10, SPACERHEIGHT, multi_species_manager);
490            bracket_terminal->set_links(NULL, multi_species_manager);
491
492            (*y) += SPACERHEIGHT;
493
494            multi_species_manager->children->append_member(group_spacer_terminal);
495
496            if (is_folded) {
497                multi_species_manager->hide_children();
498                is_folded = 0;
499            }
500        }
501    }
502
503    if (str[(*index)] && str[(*index)+1] == 'E') {
504        (*index)+=2;
505        group_depth--;
506    }
507
508    return local_count_position;
509}
510
511ED4_returncode EDB_root_bact::create_group_header(ED4_multi_species_manager   *parent,
512                                                  ED4_sequence_info_terminal  *ref_sequence_info_terminal,
513                                                  ED4_sequence_terminal       *ref_sequence_terminal,
514                                                  ED4_multi_species_manager  **multi_species_manager,
515                                                  ED4_bracket_terminal       **bracket_terminal,
516                                                  ED4_index                   *y,
517                                                  char                        *groupname,
518                                                  int                          group_depth,
519                                                  bool                         is_folded,
520                                                  ED4_index                    local_count_position)
521{
522    ED4_species_manager        *species_manager        = NULL;
523    ED4_species_name_terminal  *species_name_terminal  = NULL;
524    ED4_sequence_manager       *sequence_manager       = NULL;
525    ED4_sequence_info_terminal *sequence_info_terminal = NULL;
526    ED4_sequence_terminal      *sequence_terminal      = NULL;
527    ED4_spacer_terminal        *group_spacer_terminal  = NULL;
528    ED4_group_manager          *group_manager          = NULL;
529
530
531    char namebuffer[NAME_BUFFERSIZE];
532    int height_spacer;
533    int height_terminal;
534    int pixel_length;
535    AW_device *device;
536
537
538    height_terminal = TERMINALHEIGHT;
539    height_spacer   = SPACERHEIGHT;
540
541    sprintf(namebuffer, "Group_Manager.%ld", ED4_counter);                              // create new group manager
542    group_manager = new ED4_group_manager(namebuffer, 0, local_count_position, 0, 0, parent);
543    parent->children->append_member(group_manager);
544
545    sprintf(namebuffer, "Bracket_Terminal.%ld", ED4_counter);
546    *bracket_terminal = new ED4_bracket_terminal(namebuffer, 0, 0, BRACKETWIDTH, 0, group_manager);
547    group_manager->children->append_member(*bracket_terminal);
548
549    sprintf(namebuffer, "MultiSpecies_Manager.%ld", ED4_counter);                           // create new multi_species_manager
550    *multi_species_manager = new ED4_multi_species_manager(namebuffer, BRACKETWIDTH, 0, 0, 0, group_manager);   // Objekt Gruppen name_terminal noch
551    group_manager->children->append_member(*multi_species_manager);                     // auszeichnen
552
553    if (is_folded)                                              // only set FOLDED-flag if group
554    {                                                   // is folded
555        group_manager->set_property((ED4_properties) (ED4_P_IS_FOLDED | ED4_P_MOVABLE));
556        (*multi_species_manager)->set_property((ED4_properties) (ED4_P_IS_FOLDED | ED4_P_IS_HANDLE));
557        (*bracket_terminal)->set_property((ED4_properties) (ED4_P_IS_FOLDED | ED4_P_IS_HANDLE));
558    }
559    else
560    {
561        group_manager->set_property(ED4_P_MOVABLE);
562        (*multi_species_manager)->set_property(ED4_P_IS_HANDLE);
563        (*bracket_terminal)->set_property(ED4_P_IS_HANDLE);
564    }
565
566    sprintf(namebuffer, "Group_Spacer_Terminal_Beg.%ld", ED4_counter);                      // Spacer at beginning of group
567    group_spacer_terminal = new ED4_spacer_terminal(namebuffer, false, 0, 0, 10, height_spacer, *multi_species_manager);     // For better Overview
568    (*multi_species_manager)->children->append_member(group_spacer_terminal);
569
570    sprintf(namebuffer, "Consensus_Manager.%ld", ED4_counter);                             // Create competence terminal
571    species_manager = new ED4_species_manager(ED4_SP_CONSENSUS, namebuffer, 0, height_spacer, 0, 0, *multi_species_manager);
572    species_manager->set_property(ED4_P_MOVABLE);
573    (*multi_species_manager)->children->append_member(species_manager);
574
575    species_name_terminal = new ED4_species_name_terminal(groupname, 0, 0, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH),   height_terminal, species_manager);
576    species_name_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE));      // only some terminals
577    species_name_terminal->set_links(NULL, ref_sequence_terminal);
578    species_manager->children->append_member(species_name_terminal);                            // properties
579
580    sprintf(namebuffer, "Consensus_Seq_Manager.%ld", ED4_counter);
581    sequence_manager = new ED4_sequence_manager(namebuffer, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), 0, 0, 0, species_manager);
582    sequence_manager->set_property(ED4_P_MOVABLE);
583    species_manager->children->append_member(sequence_manager);
584
585    sequence_info_terminal = new ED4_sequence_info_terminal("CONS", 0, 0, SEQUENCEINFOSIZE, height_terminal, sequence_manager);  // Info fuer Gruppe
586    sequence_info_terminal->set_links(ref_sequence_info_terminal, ref_sequence_info_terminal);
587    sequence_info_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE));
588    sequence_manager->children->append_member(sequence_info_terminal);
589
590    device = ED4_ROOT->first_window->get_device();
591    pixel_length = device->get_string_size(ED4_G_SEQUENCES, CONSENSUS,   0);
592
593    sequence_terminal = new ED4_consensus_sequence_terminal(CONSENSUS, SEQUENCEINFOSIZE, 0, pixel_length + 10, height_terminal, sequence_manager);
594    sequence_terminal->set_property(ED4_P_CURSOR_ALLOWED);
595    sequence_terminal->set_links(ref_sequence_terminal, ref_sequence_terminal);
596    sequence_manager->children->append_member(sequence_terminal);
597
598    (*y) += height_terminal + height_spacer;
599
600    return ED4_R_OK;
601}
602
603char *EDB_root_bact::generate_config_string(char *confname)                 // and save it in database
604{
605    int i;
606    long string_length;
607    char *generated_string = NULL;
608    int counter = 0;
609    GBDATA *gb_area;
610    ED4_device_manager *device_manager = ED4_ROOT->get_device_manager();
611
612    for (i=0; i<device_manager->children->members(); i++) {
613        if (device_manager->children->member(i)->is_area_manager()) {
614            GB_begin_transaction(GLOBAL_gb_main);
615            device_manager->children->member(i)->generate_configuration_string(&generated_string);
616
617            string_length = strlen(generated_string);
618            if (generated_string[string_length - 1] == 1)
619                generated_string[string_length - 1] = '\0';
620
621            GBDATA *gb_configuration = GBT_create_configuration(GLOBAL_gb_main, confname);
622
623            if (counter == 0) {
624                gb_area = GB_search(gb_configuration, "top_area", GB_STRING);
625                counter ++;
626            }
627            else {
628                gb_area = GB_search(gb_configuration, "middle_area", GB_STRING);
629            }
630
631            GB_ERROR error = 0;
632            error = GB_write_string(gb_area, generated_string);
633            if (error) aw_message(error);
634
635            GB_commit_transaction(GLOBAL_gb_main);
636
637            delete [] generated_string;
638            generated_string = NULL;
639        }
640    }
641
642    return generated_string;
643}
Note: See TracBrowser for help on using the browser.