root/trunk/EDIT4/ED4_visualizeSAI.cxx

Revision 8729, 28.5 KB (checked in by westram, 13 days ago)
  • [readability]
    • renamed most selection lists still called 'id' or similar
    • renamed some globals (aw_help_global->HELP, pd_gl->PD)
  • removed a few more obsolete AW_window*
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : ED4_visualizeSAI.cxx                              //
4//   Purpose   : Visualize sequence associated information (SAI)   //
5//               in the Editor                                     //
6//                                                                 //
7//   Coded by Yadhu Kumar (yadhu@mikro.biologie.tu-muenchen.de)    //
8//   Institute of Microbiology (Technical University Munich)       //
9//   http://www.arb-home.de/                                       //
10//                                                                 //
11// =============================================================== //
12
13#include <ed4_extern.hxx>
14#include "ed4_class.hxx"
15
16#include <aw_awars.hxx>
17#include <awt_canvas.hxx>
18#include <awt_sel_boxes.hxx>
19#include <aw_preset.hxx>
20#include <aw_msg.hxx>
21#include <aw_root.hxx>
22#include <aw_question.hxx>
23#include <aw_select.hxx>
24
25#include <arbdbt.h>
26#include <arb_strbuf.h>
27
28#include <iostream>
29
30// --------------------------------------------------------------------------------
31
32#define AWAR_SAI_CLR_TAB              "saicolors/"
33#define AWAR_SAI_VISUALIZED           AWAR_SAI_CLR_TAB "select"             // current visualized SAI
34#define AWAR_SAI_CLR_DEF              AWAR_SAI_CLR_TAB "clr_trans_tab/"     // container for definitions
35#define AWAR_SAI_ENABLE               AWAR_SAI_CLR_TAB "enable"             // global enable of visualization
36#define AWAR_SAI_ALL_SPECIES          AWAR_SAI_CLR_TAB "all_species"        // 1 = all / 0 = marked
37#define AWAR_SAI_AUTO_SELECT          AWAR_SAI_CLR_TAB "auto_select"        // 1 = auto select / 0 = manual select
38#define AWAR_SAI_CLR_TRANS_TABLE      AWAR_SAI_CLR_TAB "clr_trans_table"    // current translation table
39#define AWAR_SAI_CLR_TRANS_TAB_NAMES  AWAR_SAI_CLR_TAB "clr_trans_tab_names" // ;-separated list of existing translation tables
40#define AWAR_SAI_CLR_TRANS_TAB_REL    AWAR_SAI_CLR_TAB "sai_relation/"      // container to store trans tables for each SAI
41#define AWAR_SAI_CLR_DEFAULTS_CREATED AWAR_SAI_CLR_TAB "defaults_created"   // whether defaults have been created (create only once)
42
43#define AWAR_SAI_CLR_TRANS_TAB_NEW_NAME "tmp/sai/clr_trans_tab_new_name" // textfield to enter translation table name
44#define AWAR_SAI_CLR                    "tmp/sai/color_0" // the definition of the current translation table (number runs from 0 to 9)
45#define AWAR_SAI_CLR_COUNT              10
46
47#define ED4_VIS_CREATE  1
48#define ED4_VIS_COPY    0
49
50// --------------------------------------------------------------------------------
51
52extern GBDATA *GLOBAL_gb_main;
53
54static bool clrDefinitionsChanged       = false;
55static bool inCallback                  = false; // used to avoid multiple refreshes
56static bool in_colorDefChanged_callback = false; // used to avoid colorDef correction
57
58// --------------------------------------------------------------------------------
59
60#define BUFSIZE 100
61static const char *getAwarName(int awarNo) {
62    static char buf[BUFSIZE];
63
64    strcpy(buf, AWAR_SAI_CLR);
65    (strchr(buf, 0)-1)[0] = '0'+awarNo;
66
67    return buf;
68}
69
70static const char *getClrDefAwar(const char *awarName) {
71    static char buf[BUFSIZE];
72
73    e4_assert(awarName);
74    e4_assert(awarName[0]); // empty awar is bad
75
76    IF_ASSERTION_USED(int size =) sprintf(buf, AWAR_SAI_CLR_DEF "%s", awarName);
77    e4_assert(size<BUFSIZE);
78    return buf;
79}
80#undef BUFSIZE
81
82// ---------------------------------------------------------
83
84static void setVisualizeSAI_cb(AW_root *awr) {
85    ED4_ROOT->visualizeSAI = awr->awar(AWAR_SAI_ENABLE)->read_int();
86    ED4_ROOT->request_refresh_for_sequence_terminals();
87}
88
89static void setVisualizeSAI_options_cb(AW_root *awr) {
90    ED4_ROOT->visualizeSAI_allSpecies = awr->awar(AWAR_SAI_ALL_SPECIES)->read_int();
91    ED4_ROOT->request_refresh_for_sequence_terminals();
92}
93
94static bool colorTransTable_exists(AW_root *awr, const char *name) {
95    char       *tableNames = awr->awar(AWAR_SAI_CLR_TRANS_TAB_NAMES)->read_string();
96    const char *searchFrom = tableNames;
97    int         len        = strlen(name);
98
99    while (searchFrom) {
100        const char *found = strstr(searchFrom, name);
101
102        if (found) {
103            if ((found == tableNames || found[-1] == '\n') && // found start of entry
104                (found[len] == '\n' || found[len] == 0)) // avoid partial entry
105            {
106                break; // exists!
107            }
108            else {              // search next match
109                searchFrom = found+1;
110            }
111        }
112        else {
113            searchFrom = 0;
114        }
115    }
116
117    free(tableNames);
118    return searchFrom != 0;
119}
120
121static void colorDefChanged_callback(AW_root *awr, AW_CL cl_awarNo) {
122    clrDefinitionsChanged = true;
123
124    if (!in_colorDefChanged_callback) { // this callback is special, because it may change all other color defs
125        LocallyModify<bool> flag(in_colorDefChanged_callback, true);
126
127        {
128            LocallyModify<bool> in_cb(inCallback, true);
129
130            char *clrTabName = awr->awar(AWAR_SAI_CLR_TRANS_TABLE)->read_string();
131            if (clrTabName[0]) {
132                unsigned char charUsed[256]; memset(charUsed, 255, 256);
133
134                {
135                    for (int i=0; i<10;  i++) {
136                        char *awarString_next = awr->awar_string(getAwarName(i))->read_string();
137                        for (int c=0; awarString_next[c]; ++c) {
138                            charUsed[(unsigned char)awarString_next[c]] = i;
139                        }
140                        free(awarString_next);
141                    }
142
143                    int   awarNo     = (int)cl_awarNo;
144                    char *awarString = awr->awar_string(getAwarName(awarNo))->read_string();
145                    for (int c=0; awarString[c]; ++c) {
146                        charUsed[(unsigned char)awarString[c]] = awarNo;
147                    }
148                    free(awarString);
149                }
150
151                typedef unsigned char mystr[256];
152                mystr s[10];
153                for (int i=0; i<10; i++)  s[i][0]=0; // initializing the strings
154
155                for (int i=0; i<256; i++) {
156                    int table = charUsed[i];
157                    if (table != 255) {
158                        char *eos = strchr((char *)s[table], 0); // get pointer to end of string
159                        eos[0] = char(i);
160                        eos[1] = 0;
161                    }
162                }
163
164                {
165                    GBS_strstruct *clrDefStr = GBS_stropen(500);            // create output stream
166                    for (int i=0; i<10; i++) {
167                        awr->awar_string(getAwarName(i))->write_string((char *)s[i]);
168
169                        char *escaped = GBS_escape_string((char*)s[i], ";", '&');
170                        GBS_strcat(clrDefStr, escaped);
171                        free(escaped);
172                        GBS_chrcat(clrDefStr, ';');
173                    }
174
175                    char    *colorDef = GBS_strclose(clrDefStr);
176                    AW_awar *awar_def = awr->awar_string(getClrDefAwar(clrTabName), "", AW_ROOT_DEFAULT);
177                    awar_def->write_string(colorDef); // writing clr definition to clr trans table awar
178                    free(colorDef);
179                }
180            }
181            else {
182                if (!in_cb.old_value()) { // only warn when user really changed the setting
183                    aw_message("Please select a VALID Color Translation Table to EDIT.");
184                }
185            }
186            free(clrTabName);
187        }
188
189        if (!inCallback) ED4_ROOT->request_refresh_for_sequence_terminals();
190    }
191}
192
193static void colorDefTabNameChanged_callback(AW_root *awr) {
194    char *clrTabName     = awr->awar(AWAR_SAI_CLR_TRANS_TABLE)->read_string();
195    {
196        LocallyModify<bool> flag(inCallback, true);
197        {
198            LocallyModify<bool> flag2(in_colorDefChanged_callback, true); // avoid correction
199
200            // clear current translation table definition
201            for (int i=0; i<10; i++) {
202                AW_awar *transDef_awar = awr->awar_string(getAwarName(i), "", AW_ROOT_DEFAULT);
203                transDef_awar->write_string("");
204            }
205
206            if (clrTabName[0]) {
207                AW_awar *clrTabDef_awar = awr->awar_string(getClrDefAwar(clrTabName), "", AW_ROOT_DEFAULT);
208                char    *clrTabDef      = clrTabDef_awar->read_string();
209
210                if (clrTabDef[0]) {
211                    int i        = 0;
212                    int tokStart = 0;
213
214                    for (int si = 0; clrTabDef[si]; ++si) {
215                        if (clrTabDef[si] == ';') {
216                            e4_assert(i >= 0 && i<10);
217                            AW_awar *awar = awr->awar(getAwarName(i));
218
219                            if (tokStart == si) { // empty definition
220                                awar->write_string("");
221                            }
222                            else {
223                                int toklen = si-tokStart;
224
225                                e4_assert(toklen > 0);
226                                e4_assert(clrTabDef[tokStart+toklen] == ';');
227                                clrTabDef[tokStart+toklen] = 0;
228
229                                char *unescaped = GBS_unescape_string(clrTabDef+tokStart, ";", '&');
230                                awar->write_string(unescaped);
231                                free(unescaped);
232
233                                clrTabDef[tokStart+toklen] = ';';
234                            }
235                            ++i;
236                            tokStart = si+1;
237                        }
238                    }
239                    e4_assert(i == 10);
240                }
241                free(clrTabDef);
242            }
243        }
244        colorDefChanged_callback(awr, 0); // correct first def manually
245        {
246            // store the selected table as default for this SAI:
247            char *saiName = awr->awar(AWAR_SAI_VISUALIZED)->read_string();
248            if (saiName[0]) {
249                char buf[100];
250                sprintf(buf, AWAR_SAI_CLR_TRANS_TAB_REL "%s", saiName);
251                awr->awar_string(buf, "", AW_ROOT_DEFAULT); // create an AWAR for the selected SAI and
252                awr->awar(buf)->write_string(clrTabName); // write the existing clr trans table names to the same
253            }
254            free(saiName);
255        }
256    }
257    free(clrTabName);
258
259    if (!inCallback && clrDefinitionsChanged) ED4_ROOT->request_refresh_for_sequence_terminals();
260}
261
262static void refresh_display_cb(GBDATA *, int *, GB_CB_TYPE cb_type) {
263    if ((cb_type & GB_CB_CHANGED) &&
264        ED4_ROOT->aw_root->awar(AWAR_SAI_ENABLE)->read_int())
265    {
266        clrDefinitionsChanged = 1;
267        ED4_ROOT->request_refresh_for_sequence_terminals();
268    }
269}
270
271static void saiChanged_callback(AW_root *awr) {
272    char *saiName = 0;
273    {
274        LocallyModify<bool> flag(inCallback, true);
275        {
276            static GBDATA *gb_last_SAI = 0;
277
278            if (gb_last_SAI) {
279                GB_transaction dummy(GLOBAL_gb_main);
280                GB_remove_callback(gb_last_SAI, GB_CB_CHANGED, refresh_display_cb, 0);
281                gb_last_SAI = 0;
282            }
283
284            saiName = awr->awar(AWAR_SAI_VISUALIZED)->read_string();
285            char *transTabName = 0;
286
287            if (saiName[0]) {
288                char  buf[100];
289                sprintf(buf, AWAR_SAI_CLR_TRANS_TAB_REL "%s", saiName);
290                awr->awar_string(buf, "", AW_ROOT_DEFAULT);
291                transTabName = awr->awar(buf)->read_string();
292            }
293
294            {
295                GB_transaction dummy(GLOBAL_gb_main);
296                gb_last_SAI = GBT_find_SAI(GLOBAL_gb_main, saiName);
297                if (gb_last_SAI) {
298                    GB_add_callback(gb_last_SAI, GB_CB_CHANGED, refresh_display_cb, 0);
299                }
300            }
301            awr->awar(AWAR_SAI_CLR_TRANS_TABLE)->write_string(transTabName ? transTabName : "");
302            free(transTabName);
303
304            clrDefinitionsChanged = true; // SAI changed -> update needed
305        }
306    }
307   
308    if (!inCallback && clrDefinitionsChanged) {
309        // SAI changed notify Global SAI Awar AWAR_SAI_GLOBAL
310        awr->awar(AWAR_SAI_GLOBAL)->write_string(saiName);
311        ED4_ROOT->request_refresh_for_sequence_terminals();
312    }
313    free(saiName);
314}
315
316static void update_ClrTransTabNamesList_cb(AW_root *awr, AW_CL cl_colorTransList) {
317    AW_selection_list *colorTransList   = (AW_selection_list*)cl_colorTransList;
318    char              *clrTransTabNames = awr->awar(AWAR_SAI_CLR_TRANS_TAB_NAMES)->read_string();
319
320    colorTransList->clear();
321
322    for (char *tok = strtok(clrTransTabNames, "\n"); tok; tok = strtok(0, "\n")) {
323        colorTransList->insert(tok, tok);
324    }
325    colorTransList->insert_default("????", "");
326    colorTransList->update();
327
328    free(clrTransTabNames);
329}
330
331static void autoselect_cb(AW_root *aw_root) {
332    char *curr_sai = aw_root->awar(AWAR_SAI_NAME)->read_string();
333#if defined(DEBUG)
334    printf("curr_sai='%s'\n", curr_sai);
335#endif // DEBUG
336    aw_root->awar(AWAR_SAI_VISUALIZED)->write_string(curr_sai);
337    free(curr_sai);
338}
339
340static void set_autoselect_cb(AW_root *aw_root) {
341    static bool callback_active = false;
342
343    if (aw_root->awar(AWAR_SAI_AUTO_SELECT)->read_int()) { // auto select is activated
344        aw_root->awar(AWAR_SAI_NAME)->add_callback(autoselect_cb);
345        callback_active = true;
346    }
347    else {
348        if (callback_active) { // only remove if added
349            aw_root->awar(AWAR_SAI_NAME)->remove_callback(autoselect_cb);
350            callback_active = false;
351        }
352    }
353}
354
355static void addOrUpdateTransTable(AW_root *aw_root, const char *newClrTransTabName, const char *defaultDefinition, bool autoselect) {
356    AW_awar *table_def_awar = aw_root->awar_string(getClrDefAwar(newClrTransTabName), defaultDefinition,  AW_ROOT_DEFAULT);
357    table_def_awar->write_string(defaultDefinition);
358
359    if (!colorTransTable_exists(aw_root, newClrTransTabName)) {
360        AW_awar    *names_awar = aw_root->awar(AWAR_SAI_CLR_TRANS_TAB_NAMES);
361        const char *old_names  = names_awar->read_char_pntr();
362        names_awar->write_string(old_names[0]
363                                 ? GBS_global_string("%s\n%s", old_names, newClrTransTabName)
364                                 : newClrTransTabName); // add new name
365    }
366
367    if (autoselect) {
368        aw_root->awar(AWAR_SAI_CLR_TRANS_TABLE)->write_string(newClrTransTabName); // select new
369    }
370}
371
372static void addDefaultTransTable(AW_root *aw_root, const char *newClrTransTabName, const char *defaultDefinition) {
373    addOrUpdateTransTable(aw_root, newClrTransTabName, defaultDefinition, false);
374}
375
376void ED4_createVisualizeSAI_Awars(AW_root *aw_root, AW_default aw_def) {  // --- Creating and initializing AWARS -----
377    aw_root->awar_int(AWAR_SAI_ENABLE,      0, aw_def);
378    aw_root->awar_int(AWAR_SAI_ALL_SPECIES, 0, aw_def);
379    aw_root->awar_int(AWAR_SAI_AUTO_SELECT, 0, aw_def);
380
381    aw_root->awar_string(AWAR_SAI_VISUALIZED,             "", aw_def);
382    aw_root->awar_string(AWAR_SAI_CLR_TRANS_TABLE,        "", aw_def);
383    aw_root->awar_string(AWAR_SAI_CLR_TRANS_TAB_NEW_NAME, "", aw_def);
384    aw_root->awar_string(AWAR_SAI_CLR_TRANS_TAB_NAMES,    "", aw_def);
385
386    for (int i=0; i<10; i++) { // initializing 10 color definition string AWARS
387       AW_awar *def_awar = aw_root->awar_string(getAwarName(i), "", aw_def);
388       def_awar->add_callback(colorDefChanged_callback, (AW_CL)i);
389    }
390    aw_root->awar(AWAR_SAI_ENABLE)         ->add_callback(setVisualizeSAI_cb);
391    aw_root->awar(AWAR_SAI_ALL_SPECIES)    ->add_callback(setVisualizeSAI_options_cb);
392    aw_root->awar(AWAR_SAI_AUTO_SELECT)    ->add_callback(set_autoselect_cb);
393    aw_root->awar(AWAR_SAI_VISUALIZED)     ->add_callback(saiChanged_callback);
394    aw_root->awar(AWAR_SAI_CLR_TRANS_TABLE)->add_callback(colorDefTabNameChanged_callback);
395
396    ED4_ROOT->visualizeSAI            = aw_root->awar(AWAR_SAI_ENABLE)->read_int();
397    ED4_ROOT->visualizeSAI_allSpecies = aw_root->awar(AWAR_SAI_ALL_SPECIES)->read_int();
398
399    // create some defaults:
400    aw_root->awar_int(AWAR_SAI_CLR_DEFAULTS_CREATED, 1,  aw_def); // @@@ Feb 2012 - remove me in some years
401
402    addDefaultTransTable(aw_root, "numeric",   "0;1;2;3;4;5;6;7;8;9;");
403    addDefaultTransTable(aw_root, "binary",    ".0;;+1;;;;;;;;");
404    addDefaultTransTable(aw_root, "consensus", "=ACGTU;;acgtu;.;;;;;;;");
405    addDefaultTransTable(aw_root, "helix",     ";;<>;;;;;[];;;");
406    addDefaultTransTable(aw_root, "xstring",   ";x;;;;;;;;;");
407    addDefaultTransTable(aw_root, "gaps",      ";-.;;;;;;;;;");
408
409    LocallyModify<bool> flag(inCallback, true); // avoid refresh
410    saiChanged_callback(aw_root);
411    colorDefTabNameChanged_callback(aw_root); // init awars for selected table
412    set_autoselect_cb(aw_root);
413}
414
415static void createCopyClrTransTable(AW_window *aws, AW_CL cl_mode) {
416    // mode = ED4_VIS_COPY   copies the selected color translation table
417    // mode = ED4_VIS_CREATE creates a new (empty) color translation table
418
419    int      mode               = (int)cl_mode;
420    AW_root *aw_root            = aws->get_root();
421    char    *newClrTransTabName = 0;
422    char    *clrTabSourceName   = 0;
423
424    switch (mode) {
425    case ED4_VIS_CREATE:
426        newClrTransTabName = GBS_string_2_key(aw_root->awar(AWAR_SAI_CLR_TRANS_TAB_NEW_NAME)->read_char_pntr());
427
428        if (strcmp(newClrTransTabName, "__") == 0) { // user entered nothing
429            aw_message("Please enter a translation table name");
430        }
431        else if (colorTransTable_exists(aw_root, newClrTransTabName)) {
432            aw_message(GBS_global_string("Color translation table '%s' already exists.", newClrTransTabName));
433        }
434        else {
435            addOrUpdateTransTable(aw_root, newClrTransTabName, "", true);
436        }
437        break;
438
439    case ED4_VIS_COPY:
440        newClrTransTabName = GBS_string_2_key(aw_root->awar(AWAR_SAI_CLR_TRANS_TAB_NEW_NAME)->read_char_pntr());
441        clrTabSourceName   = aw_root->awar(AWAR_SAI_CLR_TRANS_TABLE)->read_string();
442
443        if (!clrTabSourceName[0]) {
444            aw_message("Please select a valid Color Translation Table to COPY!");
445        }
446        else if (colorTransTable_exists(aw_root, newClrTransTabName)) {
447            aw_message(GBS_global_string("Color Translation Table \"%s\" EXISTS! Please enter a different name.", newClrTransTabName));
448        }
449        else {
450            char *old_def = aw_root->awar(getClrDefAwar(clrTabSourceName))->read_string();
451            addOrUpdateTransTable(aw_root, newClrTransTabName, old_def, true);
452            free(old_def);
453        }
454        break;
455
456    default:
457        break;
458    }
459    free(clrTabSourceName);
460    free(newClrTransTabName);
461}
462
463static void deleteColorTranslationTable(AW_window *aws) {
464    bool delete_table = aw_ask_sure("del_color_table", "Are you sure you want to delete the selected COLOR TRANSLATION TABLE?");
465    if (delete_table) {
466        AW_root *aw_root = aws->get_root();
467        char *clrTabName = aw_root->awar_string(AWAR_SAI_CLR_TRANS_TABLE)->read_string();
468
469        if (clrTabName[0]) {
470            AW_awar       *awar_tabNames    = aw_root->awar(AWAR_SAI_CLR_TRANS_TAB_NAMES);
471            char          *clrTransTabNames = awar_tabNames->read_string();
472            GBS_strstruct *newTransTabName  = GBS_stropen(strlen(clrTransTabNames));
473
474            for (const char *tok = strtok(clrTransTabNames, "\n"); tok; tok = strtok(0, "\n")) {
475                if (strcmp(clrTabName, tok) != 0) { // merge all not to delete
476                    GBS_strcat(newTransTabName, tok);
477                    GBS_strcat(newTransTabName, "\n");
478                }
479            }
480
481            aw_root->awar_string(getClrDefAwar(clrTabName))->write_string("");
482            char *new_name = GBS_strclose(newTransTabName);
483            awar_tabNames->write_string(new_name); // updates selection list
484            free(new_name);
485
486            free(clrTransTabNames);
487        }
488        else {
489            aw_message("Selected Color Translation Table is not VALID and cannot be DELETED!");
490        }
491        free(clrTabName);
492    }
493}
494
495static AW_selection_list *buildClrTransTabNamesList(AW_window *aws) {
496    AW_root           *awr            = aws->get_root();
497    AW_selection_list *colorTransList = aws->create_selection_list(AWAR_SAI_CLR_TRANS_TABLE);
498
499    update_ClrTransTabNamesList_cb(awr, (AW_CL)colorTransList);
500
501    return colorTransList;
502}
503
504const char *ED4_getSaiColorString(AW_root *awr, int start, int end) {
505    static int   seqBufferSize = 0;
506    static char *saiColors     = 0;
507    static int   lastStart     = -1;
508    static int   lastEnd       = -1;
509    static bool  lastVisualize = false;
510
511    e4_assert(start<=end);
512
513    if (lastStart==start && lastEnd==end  && !clrDefinitionsChanged && lastVisualize) {
514        return saiColors-start;    // if start and end positions are same as the previous positions and no settings
515    }                              // were changed return the last calculated saiColors string
516
517    lastStart = start; lastEnd = end; clrDefinitionsChanged = false; // storing start and end positions
518
519    int seqSize = end-start+1;
520
521    if (seqSize>seqBufferSize) {
522        free(saiColors);
523        seqBufferSize = seqSize;
524        saiColors =  (char*)GB_calloc(seqBufferSize, sizeof(char));
525    }
526    else memset(saiColors, 0, sizeof(char)*seqSize);
527
528    char *saiSelected = awr->awar(AWAR_SAI_VISUALIZED)->read_string();
529
530    GB_push_transaction(GLOBAL_gb_main);
531    char   *alignment_name = GBT_get_default_alignment(GLOBAL_gb_main);
532    GBDATA *gb_extended    = GBT_find_SAI(GLOBAL_gb_main, saiSelected);
533    bool    visualize      = false; // set to true if all goes fine
534
535    if (gb_extended) {
536        GBDATA *gb_ali = GB_entry(gb_extended, alignment_name);
537        if (gb_ali) {
538            const char *saiData      = 0;
539            bool        free_saiData = false;
540
541            {
542                GBDATA *saiSequence = GB_entry(gb_ali, "data"); // search "data" entry (normal SAI)
543                if (saiSequence) {
544                    saiData = GB_read_char_pntr(saiSequence); // not allocated
545                }
546                else {
547                    saiSequence = GB_entry(gb_ali, "bits"); // search "bits" entry (binary SAI)
548                    if (saiSequence) {
549                        saiData      = GB_read_as_string(saiSequence); // allocated
550                        free_saiData = true; // free saiData below
551                    }
552                }
553            }
554
555            if (saiData) {
556                char trans_table[256];
557                {
558                    // build the translation table:
559                    memset(trans_table, 0, 256);
560                    for (int i = 0; i<AWAR_SAI_CLR_COUNT; ++i) {
561                        char *def      = awr->awar(getAwarName(i))->read_string();
562                        int   clrRange = ED4_G_CBACK_0 + i;
563
564                        for (char *d = def; *d; ++d) {
565                            trans_table[(unsigned char)*d] = clrRange;
566                        }
567                        free(def);
568                    }
569                }
570
571                // translate SAI to colors
572                for (int i = start; i <= end; ++i) {
573                    saiColors[i-start] = trans_table[(unsigned char)saiData[i]];
574                }
575
576                visualize = true;
577            }
578
579            if (free_saiData) {
580                free(const_cast<char*>(saiData)); // in this case saiData is allocated (see above)
581            }
582        }
583    }
584    free(alignment_name);
585    free(saiSelected);
586    GB_pop_transaction(GLOBAL_gb_main);
587
588    lastVisualize = visualize;
589    if (visualize) {
590        e4_assert(saiColors);
591        return saiColors-start;
592    }
593
594    return 0; // don't visualize (sth went wrong)
595}
596
597
598// -------------------- Creating Windows and Display dialogs --------------------
599
600static AW_window *create_copyColorTranslationTable_window(AW_root *aw_root) { // creates copy color translation table window
601    AW_window_simple *aws = new AW_window_simple;
602    aws->init(aw_root, "COPY_CLR_TR_TABLE", "Copy Color Translation Table");
603    aws->load_xfig("ad_al_si.fig");
604
605    aws->at("close");
606    aws->callback((AW_CB0)AW_POPDOWN);
607    aws->create_button("CLOSE", "CLOSE", "C");
608
609    aws->at("label");
610    aws->create_autosize_button(0, "Please enter the new name\nfor the Color Translation Table");
611
612    aws->at("input");
613    aws->create_input_field(AWAR_SAI_CLR_TRANS_TAB_NEW_NAME, 15);
614
615    aws->at("ok");
616    aws->callback(createCopyClrTransTable, (AW_CL)ED4_VIS_COPY);
617    aws->create_button("GO", "GO", "G");
618
619    return (AW_window *)aws;
620}
621
622static AW_window *create_createColorTranslationTable_window(AW_root *aw_root) { // creates create color translation table window
623    AW_window_simple *aws = new AW_window_simple;
624    aws->init(aw_root, "CREATE_CLR_TR_TABLE", "Create Color Translation Table");
625    aws->load_xfig("ad_al_si.fig");
626
627    aws->at("close");
628    aws->callback((AW_CB0)AW_POPDOWN);
629    aws->create_button("CLOSE", "CLOSE", "C");
630
631    aws->at("label");
632    aws->create_autosize_button(0, "Please enter the name\nfor the Color Translation Table");
633
634    aws->at("input");
635    aws->create_input_field(AWAR_SAI_CLR_TRANS_TAB_NEW_NAME, 15);
636
637    aws->at("ok");
638    aws->callback(createCopyClrTransTable, (AW_CL)ED4_VIS_CREATE);
639    aws->create_button("GO", "GO", "G");
640
641    return (AW_window *)aws;
642}
643
644static void reverseColorTranslationTable(AW_window *aww) {
645    AW_root *aw_root = aww->get_root();
646
647    int j = AWAR_SAI_CLR_COUNT-1;
648    for (int i = 0; i<AWAR_SAI_CLR_COUNT/2+1; ++i, --j) {
649        if (i<j) {
650            AW_awar *aw_i = aw_root->awar(getAwarName(i));
651            AW_awar *aw_j = aw_root->awar(getAwarName(j));
652
653            char *ci = aw_i->read_string();
654            char *cj = aw_j->read_string();
655
656            aw_i->write_string(cj);
657            aw_j->write_string(ci);
658
659            free(ci);
660            free(cj);
661        }
662    }
663}
664
665static AW_window *create_editColorTranslationTable_window(AW_root *aw_root) { // creates edit color translation table window
666    static AW_window_simple *aws = 0;
667    if (aws) return (AW_window *)aws;
668
669    aws = new AW_window_simple;
670    aws->init(aw_root, "EDIT_CTT", "Color Translation Table");
671    aws->load_xfig("saiColorRange.fig");
672
673    char at_name[] = "rangex";
674    char *dig      = strchr(at_name, 0)-1;
675
676    for (int i = 0; i<AWAR_SAI_CLR_COUNT; ++i) {
677        dig[0] = '0'+i;
678        aws->at(at_name);
679        aws->create_input_field(getAwarName(i), 20);
680    }
681
682    aws->at("close");
683    aws->callback(AW_POPDOWN);
684    aws->create_button("CLOSE", "CLOSE", "C");
685
686    aws->at("reverse");
687    aws->callback(reverseColorTranslationTable);
688    aws->create_button("REVERSE", "Reverse", "R");
689
690    aws->at("colors");
691    aws->callback(AW_POPUP, (AW_CL)AW_create_gc_window, (AW_CL)ED4_ROOT->aw_gc_manager);
692    aws->button_length(0);
693    aws->create_button("COLORS", "#colors.xpm");
694
695    return (AW_window *)aws;
696}
697
698AW_window *ED4_createVisualizeSAI_window(AW_root *aw_root) {
699    static AW_window_simple *aws = 0;
700    if (!aws) {
701
702        aws = new AW_window_simple;
703
704        aws->init(aw_root, "VISUALIZE_SAI", "Visualize SAIs");
705        aws->load_xfig("visualizeSAI.fig");
706
707        aws->callback(AW_POPUP_HELP, (AW_CL)"visualizeSAI.hlp");
708        aws->at("help");
709        aws->create_button("HELP", "HELP", "H");
710
711        aws->at("close");
712        aws->callback((AW_CB0)AW_POPDOWN);
713        aws->create_button("CLOSE", "CLOSE", "C");
714
715        aws->at("enable");
716        aws->create_toggle(AWAR_SAI_ENABLE);
717
718        aws->at("sai");
719        aws->button_length(30);
720        awt_create_SAI_selection_button(GLOBAL_gb_main, aws, AWAR_SAI_VISUALIZED);
721
722        aws->at("auto_select");
723        aws->create_toggle(AWAR_SAI_AUTO_SELECT);
724
725        aws->at("clrTrList");
726        AW_selection_list *clrTransTableLst = buildClrTransTabNamesList(aws);
727
728        aws->at("edit");
729        aws->button_length(10);
730        aws->callback(AW_POPUP, (AW_CL)create_editColorTranslationTable_window, 0);
731        aws->create_button("EDIT", "EDIT");
732
733        aws->at("create");
734        aws->callback(AW_POPUP, (AW_CL)create_createColorTranslationTable_window, 0);
735        aws->create_button("CREATE", "CREATE");
736
737        aws->at("copy");
738        aws->callback(AW_POPUP, (AW_CL)create_copyColorTranslationTable_window, 0);
739        aws->create_button("COPY", "COPY");
740
741        aws->at("delete");
742        aws->callback((AW_CB1)deleteColorTranslationTable, 0);
743        aws->create_button("DELETE", "DELETE");
744
745        aws->at("marked");
746        aws->create_toggle_field(AWAR_SAI_ALL_SPECIES, 1);
747        aws->insert_toggle("MARKED SPECIES", "M", 0);
748        aws->insert_toggle("ALL SPECIES", "A", 1);
749        aws->update_toggle_field();
750
751        AW_awar *trans_tabs = aw_root->awar(AWAR_SAI_CLR_TRANS_TAB_NAMES);
752        trans_tabs->add_callback(update_ClrTransTabNamesList_cb, (AW_CL)clrTransTableLst);
753        trans_tabs->touch();        // force update
754    }
755    aws->show();
756
757    return aws;
758}
Note: See TracBrowser for help on using the browser.