source: tags/ms_r16q3/EDIT4/ED4_visualizeSAI.cxx

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