source: tags/ms_r16q2/EDIT4/ED4_visualizeSAI.cxx

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