source: tags/arb_5.1/EDIT4/ED4_visualizeSAI.cxx

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