source: tags/svn.1.5.4/GENOM/GEN_nds.cxx

Last change on this file was 8309, checked in by westram, 14 years ago
  • moved much code into static scope

(partly reverted by [8310])

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.6 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : GEN_nds.cxx                                       //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Coded by Ralf Westram (coder@reallysoft.de) in 2001           //
7//   Institute of Microbiology (Technical University Munich)       //
8//   http://www.arb-home.de/                                       //
9//                                                                 //
10// =============================================================== //
11
12#include "GEN.hxx"
13
14#include <nds.h>
15#include <item_sel_list.h>
16#include <awt_sel_boxes.hxx>
17#include <aw_msg.hxx>
18#include <aw_root.hxx>
19#include <aw_awar.hxx>
20
21#define gen_assert(bed) arb_assert(bed)
22
23using namespace std;
24
25// Note: this file is based on ../AWT/AWT_nds.cxx
26
27#define GEN_NDS_COUNT       10
28#define GEN_NDS_STRING_SIZE 4000
29
30struct GEN_NodeTextBuilder {
31    char  buf[GEN_NDS_STRING_SIZE];
32    char  zbuf[GEN_NDS_COUNT];
33    long  lengths[GEN_NDS_COUNT];
34    long  rek[GEN_NDS_COUNT];
35    char *dkeys[GEN_NDS_COUNT];
36    char *parsing[GEN_NDS_COUNT];
37    long  count;
38    int   errorclip;
39};
40
41static GEN_NodeTextBuilder *gen_nds_ms = 0;
42
43//  -----------------------------------------------------
44//      void GEN_make_node_text_init(GBDATA *gb_main)
45//  -----------------------------------------------------
46void GEN_make_node_text_init(GBDATA *gb_main) {
47    GBDATA     *gbz, *gbe;
48    const char *sf, *sl;
49    int         count;
50
51    sf = "flag1";
52    sl = "len1";
53
54    if (!gen_nds_ms) gen_nds_ms = (GEN_NodeTextBuilder *) GB_calloc(sizeof(GEN_NodeTextBuilder), 1);
55
56    GBDATA *gb_arb_presets = GB_search(gb_main, "arb_presets", GB_CREATE_CONTAINER);
57    count                  = 0;
58
59    for (gbz = GB_entry(gb_arb_presets, "gene_viewkey"); gbz; gbz  = GB_nextEntry(gbz)) {
60        // toggle set ?
61        if (GB_read_int(GB_entry(gbz, sf))) {
62            freeset(gen_nds_ms->dkeys[count], GB_read_string(GB_entry(gbz, "key_text")));
63            if (GB_first_non_key_char(gen_nds_ms->dkeys[count])) {
64                gen_nds_ms->rek[count] = 1;
65            }
66            else {
67                gen_nds_ms->rek[count] = 0;
68            }
69            gen_nds_ms->lengths[count] = GB_read_int(GB_entry(gbz, sl));
70            gbe = GB_entry(gbz, "pars");
71            freenull(gen_nds_ms->parsing[count]);
72            if (gbe && GB_read_string_count(gbe)>1) gen_nds_ms->parsing[count] = GB_read_string(gbe);
73            count++;
74        }
75    }
76    gen_nds_ms->errorclip = 0;
77    gen_nds_ms->count = count;
78}
79
80//  -----------------------------------------------------------------------------
81//      char *GEN_make_node_text_nds(GBDATA *gb_main, GBDATA * gbd, int mode)
82//  -----------------------------------------------------------------------------
83char *GEN_make_node_text_nds(GBDATA *gb_main, GBDATA * gbd, int mode)
84{
85    // if mode ==0 compress info else format info
86    char   *bp;
87    GBDATA *gbe;
88    long    i, j;
89    long    first;
90
91    bp = gen_nds_ms->buf;
92    gen_assert(gbd);
93
94    first = 0;
95    for (i = 0; i < gen_nds_ms->count; i++) {
96        if (gen_nds_ms->rek[i]) { // hierarchical key
97            gbe = GB_search(gbd, gen_nds_ms->dkeys[i], GB_FIND);
98        }
99        else {                  // flat entry
100            gbe = GB_entry(gbd, gen_nds_ms->dkeys[i]);
101        }
102
103        if (!mode && !gbe) continue;
104        if (!mode && first) {
105            (*bp++) = ',';
106        }
107        (*bp++) = ' ';
108        first++;
109        if (gbe) {
110            switch (GB_read_type(gbe)) {
111                case GB_INT:
112                    if (mode) {
113                        char buf[20];
114                        sprintf(buf, "%%%lii", gen_nds_ms->lengths[i]);
115                        sprintf(bp, buf, GB_read_int(gbe));
116                    }
117                    else {
118                        sprintf(bp, "%li", GB_read_int(gbe));
119                    }
120                    bp += strlen(bp);
121                    break;
122                case GB_BYTE:
123                    if (mode) {
124                        char buf[20];
125                        sprintf(buf, "%%%lii", gen_nds_ms->lengths[i]);
126                        sprintf(bp, buf, GB_read_byte(gbe));
127                    }
128                    else {
129                        sprintf(bp, "%i", GB_read_byte(gbe));
130                    }
131                    bp += strlen(bp);
132                    break;
133                case GB_STRING: {
134                    long        post;
135                    long        dlen;
136                    char       *pars = 0;
137                    const char *p    = 0;
138
139                    if (gen_nds_ms->parsing[i]) {
140                        char *p2 = GB_read_string(gbe);
141                        pars     = GB_command_interpreter(gb_main, p2, gen_nds_ms->parsing[i], gbd, 0);
142                        free(p2);
143
144                        if (!pars) {
145                            pars = strdup("<error>");
146                            if (!gen_nds_ms->errorclip++) {
147                                aw_message(GB_await_error());
148                            }
149                        }
150                        p = pars;
151                    }
152                    else {
153                        p = GB_read_char_pntr(gbe);
154                    }
155
156                    dlen = gen_nds_ms->lengths[i];
157                    if (dlen + (bp - gen_nds_ms->buf) + 256 > GEN_NDS_STRING_SIZE) {
158                        dlen = GEN_NDS_STRING_SIZE - 256 - (bp - gen_nds_ms->buf);
159                    }
160
161                    if (dlen> 0) {
162                        int len = strlen(p);
163                        j = len;
164                        if (j > dlen)   j = dlen;
165                        for (; j; j--) *bp++ = *p++;
166                        if (mode) {
167                            post = dlen - len;
168                            while (post-- > 0) *(bp++) = ' ';
169                        }
170                    }
171                    if (pars) free(pars);
172                    break;
173                }
174                case GB_FLOAT:
175                    sprintf(bp, "%4.4f", GB_read_float(gbe));
176                    bp += strlen(bp);
177                    break;
178                default:
179                    break;
180            }
181        }
182        else if (mode) {
183            j = gen_nds_ms->lengths[i];
184            if (j + (bp - gen_nds_ms->buf) + 256 > GEN_NDS_STRING_SIZE) {
185                j = GEN_NDS_STRING_SIZE - 256 - (bp - gen_nds_ms->buf);
186            }
187            for (; j > 0; j--)  *(bp++) = ' ';
188        }
189    }
190    *bp = 0;
191    return gen_nds_ms->buf;
192}
193
194
195
196void GEN_create_nds_vars(AW_root *aw_root, AW_default awdef, GBDATA *gb_main, GB_CB NDS_changed_callback) {
197    GB_ERROR  error          = GB_push_transaction(gb_main);
198    GBDATA   *gb_arb_presets = GB_search(gb_main, "arb_presets", GB_CREATE_CONTAINER);
199    GBDATA   *gb_viewkey     = 0;
200
201    for (int i=0; i<GEN_NDS_COUNT && !error; i++) {
202        char  buf[256];
203        char *keystart = buf+sprintf(buf, "tmp/gene_viewkey_%i/", i);
204
205        if (gb_viewkey) {
206            gen_assert(GB_has_key(gb_viewkey, "gene_viewkey"));
207            gb_viewkey = GB_nextEntry(gb_viewkey);
208        }
209        else {
210            gb_viewkey = GB_entry(gb_arb_presets, "gene_viewkey");
211        }
212        if (!gb_viewkey) {
213            gb_viewkey = GB_create_container(gb_arb_presets, "gene_viewkey");
214        }
215
216        if (!gb_viewkey) {
217            error = GB_await_error();
218        }
219        else {
220            GB_add_callback(gb_viewkey, GB_CB_CHANGED, NDS_changed_callback, 0);
221
222            const char *default_key = 0;
223            switch (i) {
224                case 1:  default_key = "pos_start"; break;
225                case 2:  default_key = "pos_stop"; break;
226                case 3:  default_key = "product"; break;
227                default: default_key = "name"; break;
228            }
229            GBDATA *gb_key_text     = GB_searchOrCreate_string(gb_viewkey, "key_text", default_key);
230            if (!gb_key_text) error = GB_await_error();
231            else {
232                strcpy(keystart, "key_text");
233                aw_root->awar_string(buf, "", awdef);
234                aw_root->awar(buf)->map(gb_key_text);
235            }
236        }
237
238        if (!error) {
239            GBDATA *gb_pars     = GB_searchOrCreate_string(gb_viewkey, "pars", "");
240            if (!gb_pars) error = GB_await_error();
241            else {
242                strcpy(keystart, "pars");
243                aw_root->awar_string(buf, "", awdef);
244                aw_root->awar(buf)->map(gb_pars);
245            }
246        }
247
248        if (!error) {
249            GBDATA *gb_flag1     = GB_searchOrCreate_int(gb_viewkey, "flag1", i <= 2 ? 1 : 0);
250            if (!gb_flag1) error = GB_await_error();
251            else {
252                strcpy(keystart, "flag1");
253                aw_root->awar_int(buf, 0, awdef);
254                aw_root->awar(buf)->map(gb_flag1);
255            }
256        }
257
258        if (!error) {
259            GBDATA *gb_len1     = GB_searchOrCreate_int(gb_viewkey, "len1", 30);
260            if (!gb_len1) error = GB_await_error();
261            else {
262                strcpy(keystart, "len1");
263                aw_root->awar_int(buf, 0, awdef);
264                aw_root->awar(buf)->set_minmax(0, GEN_NDS_STRING_SIZE);
265                aw_root->awar(buf)->map(gb_len1);
266            }
267        }
268    }
269
270    if (!error) {
271        GBDATA *gb_next;
272        gen_assert(GB_has_key(gb_viewkey, "gene_viewkey"));
273        while (!error && (gb_next = GB_nextEntry(gb_viewkey))) {
274            error = GB_delete(gb_next);
275        }
276    }
277
278    aw_root->awar_string("tmp/gene_viewkey/key_text", "", awdef);
279
280    error = GB_end_transaction(gb_main, error);
281    if (error) aw_message(error);
282}
283//  ---------------------------------------------------------------------------------------
284//      void GEN_create_select_nds_window(AW_window *aww,char *key_text,AW_CL cgb_main)
285//  ---------------------------------------------------------------------------------------
286static void GEN_create_select_nds_window(AW_window *aww, char *key_text, AW_CL cgb_main)
287{
288#if defined(WARN_TODO)
289#warning make this function more general like popup_select_species_field_window
290#endif
291
292    static AW_window *win = 0;
293    AW_root *aw_root = aww->get_root();
294    aw_root->awar("tmp/gene_viewkey/key_text")->map(key_text);
295    if (!win) {
296        AW_window_simple *aws = new AW_window_simple;
297        aws->init(aw_root, "NDS", "NDS_SELECT");
298        aws->load_xfig("awt/nds_sel.fig");
299        aws->button_length(13);
300
301        aws->callback(AW_POPDOWN);
302        aws->at("close");
303        aws->create_button("CLOSE", "CLOSE", "C");
304
305        create_selection_list_on_itemfields((GBDATA *)cgb_main,
306                                                aws, "tmp/gene_viewkey/key_text",
307                                                FIELD_FILTER_NDS,
308                                                "scandb", "rescandb", GEN_get_selector(), 20, 10);
309
310        win =  (AW_window*)aws;
311    }
312    win->activate();
313}
314//  -----------------------------------------------------------------------
315//      AW_window *GEN_open_nds_window(AW_root *aw_root,AW_CL cgb_main)
316//  -----------------------------------------------------------------------
317AW_window *GEN_open_nds_window(AW_root *aw_root, AW_CL cgb_main)
318{
319    static AW_window_simple *aws = 0;
320    if (!aws) {
321        aws = new AW_window_simple;
322
323        aws->init(aw_root, "GENE_NDS_PROPS", "Gene NDS");
324        aws->load_xfig("awt/nds.fig");
325        aws->auto_space(10, 5);
326
327        aws->callback(AW_POPDOWN);
328        aws->at("close");
329        aws->create_button("CLOSE", "CLOSE", "C");
330
331        aws->at("help");
332        aws->callback(AW_POPUP_HELP, (AW_CL)"props_nds.hlp");
333        aws->create_button("HELP", "HELP", "H");
334
335        aws->button_length(13);
336        int dummy, closey;
337        aws->at_newline();
338        aws->get_at_position(&dummy, &closey);
339
340        aws->create_button(0, "K");
341
342        aws->at_newline();
343
344
345        int showx, fieldselectx, fieldx, columnx, srtx, srtux;
346
347        aws->auto_space(10, 0);
348
349        int i;
350        for (i=0; i<GEN_NDS_COUNT; i++) {
351            char buf[256];
352
353            sprintf(buf, "tmp/gene_viewkey_%i/flag1", i);
354            aws->get_at_position(&showx, &dummy);
355            aws->create_toggle(buf);
356
357            aws->button_length(20);
358            sprintf(buf, "tmp/gene_viewkey_%i/key_text", i);
359            aws->get_at_position(&fieldx, &dummy);
360            aws->create_input_field(buf, 15);
361
362            aws->button_length(0);
363            aws->callback((AW_CB)GEN_create_select_nds_window, (AW_CL)strdup(buf), cgb_main);
364            aws->get_at_position(&fieldselectx, &dummy);
365            aws->create_button("SELECT_NDS", "S");
366
367            sprintf(buf, "tmp/gene_viewkey_%i/len1", i);
368            aws->get_at_position(&columnx, &dummy);
369            aws->create_input_field(buf, 4);
370
371            sprintf(buf, "tmp/gene_viewkey_%i/pars", i);
372            aws->get_at_position(&srtx, &dummy);
373
374            aws->button_length(0);
375
376            aws->callback(AWT_create_select_srtaci_window, (AW_CL)strdup(buf), 0);
377            aws->create_button("SELECT_SRTACI", "S", "S");
378
379            aws->get_at_position(&srtux, &dummy);
380            aws->create_input_field(buf, 40);
381            aws->at_newline();
382        }
383        aws->at(showx, closey);
384
385        aws->at_x(fieldselectx);
386        aws->create_button(0, "SEL");
387
388        aws->at_x(showx);
389        aws->create_button(0, "SHOW");
390
391        aws->at_x(fieldx);
392        aws->create_button(0, "FIELD");
393
394        aws->at_x(columnx);
395        aws->create_button(0, "WIDTH");
396
397        aws->at_x(srtx);
398        aws->create_button(0, "SRT");
399
400        aws->at_x(srtux);
401        aws->create_button(0, "ACI/SRT PROGRAM");
402    }
403    return aws;
404}
405
Note: See TracBrowser for help on using the repository browser.