source: branches/profile/AWTC/AWTC_submission.cxx

Last change on this file was 12223, checked in by westram, 5 years ago
  • fix: impossible to create a new submission form (name always fell back to 'default')
    • caused by selectionlist-defaultfallback via option-menu
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.6 KB
Line 
1// ================================================================ //
2//                                                                  //
3//   File      : AWTC_submission.cxx                                //
4//   Purpose   :                                                    //
5//                                                                  //
6//   Institute of Microbiology (Technical University Munich)        //
7//   http://www.arb-home.de/                                        //
8//                                                                  //
9// ================================================================ //
10
11#include <aw_window.hxx>
12#include <aw_awars.hxx>
13#include <aw_edit.hxx>
14#include <aw_root.hxx>
15#include <aw_msg.hxx>
16
17#include <arbdbt.h>
18#include <arb_strbuf.h>
19#include <arb_strarray.h>
20
21#define awtc_assert(bed) arb_assert(bed)
22
23#define AWAR_SUBMIT_PARSER "tmp/submission/parser"
24#define AWAR_SUBMIT_PARSED "tmp/submission/parsed"
25
26#define AWAR_SUBMIT_SOURCE "submission/source"
27#define AWAR_SUBMIT_FILE   "submission/file"
28#define AWAR_SUBMIT_PRIVAT "submission/privat"
29
30void AWTC_create_submission_variables(AW_root *root, AW_default db1) {
31    root->awar_string(AWAR_SUBMIT_SOURCE, "",                         db1);
32    root->awar_string(AWAR_SUBMIT_PARSER, "press READ INFO",          db1);
33    root->awar_string(AWAR_SUBMIT_PARSED, "",                         db1);
34    root->awar_string(AWAR_SUBMIT_FILE,   "",                         db1);
35    root->awar_string(AWAR_SUBMIT_PRIVAT, "$(ADDRESS)=TUM Munich:\n", db1);
36}
37
38static void ed_calltexe_event(AW_window *aww, const char *varname) {
39    AW_edit(aww->get_root()->awar(varname)->read_char_pntr());
40}
41
42static AW_window *create_calltexe_window(AW_root *root, const char *varname) {
43    AW_window_simple *aws = new AW_window_simple;
44    {
45        char *var_id    = GBS_string_2_key(varname);
46        char *window_id = GBS_global_string_copy("SUBM_TEXTEDIT_%s", var_id);
47        aws->init(root, window_id, "START TEXT EDITOR");
48        free(window_id);
49        free(var_id);
50    }
51
52    aws->load_xfig("calltexe.fig");
53    aws->label_length(18);
54    aws->button_length(8);
55
56    aws->at("close");
57    aws->callback(AW_POPDOWN);
58    aws->create_button("CLOSE", "CLOSE", "O");
59
60    aws->at("file");
61    aws->create_input_field(varname, 34);
62
63    aws->at("edit");
64    aws->callback(makeWindowCallback(ed_calltexe_event, varname));
65    aws->create_button("EDIT", "EDIT", "E");
66
67    return aws;
68}
69
70static void ed_submit_info_event_rm(char *string)
71{
72    char *p = string;
73    int c;
74    while ((c=*p) != 0) {
75        if (c==':') *p = ';';
76        if (c=='=') *p = '-';
77        p++;
78    }
79}
80
81static void ed_submit_info_event(AW_window *aww, GBDATA *gb_main) {
82    AW_root *aw_root = aww->get_root();
83   
84    GB_transaction  ta(gb_main);
85    char           *species_name = aw_root->awar(AWAR_SPECIES_NAME)->read_string();
86    GBDATA         *gb_species   = GBT_find_species(gb_main, species_name);
87    GBS_strstruct  *strstruct    = GBS_stropen(1000);
88
89    if (gb_species) {
90        for (GBDATA *gb_entry = GB_child(gb_species); gb_entry; gb_entry = GB_nextChild(gb_entry)) {
91            int type = GB_read_type(gb_entry);
92            switch (type) {
93                case GB_STRING:
94                case GB_INT:
95                case GB_BITS:
96                case GB_FLOAT: {
97                    char *key = GB_read_key(gb_entry);
98
99                    GBS_strcat(strstruct, "$(");
100                    GBS_strcat(strstruct, key);
101                    GBS_strcat(strstruct, ")=");
102                    free(key);
103
104                    key = GB_read_as_string(gb_entry);
105                    ed_submit_info_event_rm(key);
106                    GBS_strcat(strstruct, key);
107                    free(key);
108
109                    GBS_strcat(strstruct, ":\n");
110                    break;
111                }
112                default:
113                    break;
114            }
115        }
116        char *seq_info = GBS_string_eval(" ", "*="
117                                         "$(SEQ_LEN)\\=*(|sequence|len(.-))\\:\n"
118                                         "$(SEQ_A)\\=*(|sequence|count(aA))\\:\n"
119                                         "$(SEQ_C)\\=*(|sequence|count(cC))\\:\n"
120                                         "$(SEQ_G)\\=*(|sequence|count(gG))\\:\n"
121                                         "$(SEQ_T)\\=*(|sequence|count(tT))\\:\n"
122                                         "$(SEQ_U)\\=*(|sequence|count(uU))\\:\n"
123                                         "$(SEQUENCE)\\=*(|sequence|remove(.-)|format_sequence(firsttab\\=12;tab\\=12;width\\=60;numleft;gap\\=10))\\:\n"
124                                         , gb_species);
125        if (seq_info) {
126            GBS_strcat(strstruct, seq_info);
127            free(seq_info);
128        }
129        else {
130            aw_message(GB_await_error());
131        }
132    }
133    else {
134        GBS_strcat(strstruct, "Species not found");
135    }
136
137    char *parser = GBS_strclose(strstruct);
138    aw_root->awar(AWAR_SUBMIT_PARSER)->write_string(parser);
139
140    free(parser);
141    free(species_name);
142}
143
144static void ed_save_var_to_file(AW_window *aww, const char *data_var, const char *file_var) {
145    AW_root *aw_root   = aww->get_root();
146    char    *data      = aw_root->awar(data_var)->read_string();
147    char    *file_name = aw_root->awar(file_var)->read_string();
148    FILE    *out       = fopen(file_name, "w");
149   
150    if (out) {
151        fprintf(out, "%s", data);
152        fclose(out);
153    }
154    else {
155        aw_message(GB_IO_error("saving info", file_name));
156    }
157    free(file_name);
158    free(data);
159}
160static void ed_submit_parse_event(AW_window *aww)
161{
162    AW_root *aw_root = aww->get_root();
163    char *parser = aw_root->awar(AWAR_SUBMIT_PARSER)->read_string();
164    char    *dest;
165    char    *dest2;
166    char    *privat;
167    char    *p, *d;
168    int c;
169
170    for (d = p = parser; *p; p++) {
171        if ((c=*p)==':') {
172            if (p[1] == '\n') p++; // skip newline
173        }
174        *(d++) = c;
175    }
176    *d = 0;
177    char *sub_file = aw_root->awar(AWAR_SUBMIT_SOURCE)->read_string();
178    char *source = GB_read_file(sub_file);
179    if (source) {
180        dest = GBS_string_eval(source, parser, 0);
181        if (!dest) dest = strdup(GB_await_error());
182    }
183    else {
184        dest = GBS_global_string_copy("submission form not found\n(Reason: %s)", GB_await_error());
185    }
186
187    awtc_assert(dest); // should contain partly filled form or error message
188
189    privat = aw_root->awar(AWAR_SUBMIT_PRIVAT)->read_string();
190    for (d = p = privat; *p; p++) {
191        if ((c=*p)==':') {
192            if (p[1] == '\n') p++; // skip newline
193        }
194        *(d++) = c;
195    }
196    *d = 0;
197
198    dest2             = GBS_string_eval(dest, privat, 0);
199    if (!dest2) dest2 = strdup(GB_await_error());
200
201    aw_root->awar(AWAR_SUBMIT_PARSED)->write_string(dest2);
202
203    free(dest);
204    free(dest2);
205    free(privat);
206    free(source);
207    free (sub_file);
208    free(parser);
209}
210
211static void ed_submit_gen_event(AW_window *aww)
212{
213    AW_root *aw_root = aww->get_root();
214    char buffer[256];
215    char *name = aw_root->awar(AWAR_SPECIES_NAME)->read_string();
216    sprintf(buffer, "%s.submit", name);
217    free(name);
218    aw_root->awar(AWAR_SUBMIT_FILE)->write_string(buffer);
219}
220
221
222AW_window *AWTC_create_submission_window(AW_root *root, GBDATA *gb_main) {
223    AW_window_simple *aws = new AW_window_simple;
224    aws->init(root, "SUBMISSION", "SUBMISSION");
225
226    aws->load_xfig("submiss.fig");
227    aws->label_length(18);
228    aws->button_length(8);
229
230    aws->at("close");
231    aws->callback(AW_POPDOWN);
232    aws->create_button("CLOSE", "CLOSE", "O");
233
234    aws->callback(makeHelpCallback("submission.hlp"));
235    aws->at("help");
236    aws->create_button("HELP", "HELP", "H");
237
238    aws->button_length(15);
239
240    aws->at("privat");
241    aws->create_text_field(AWAR_SUBMIT_PRIVAT, 80, 5);
242
243    aws->at("parsed_info");
244    aws->create_text_field(AWAR_SUBMIT_PARSER, 80, 6);
245
246    aws->at("parsed");
247    aws->create_text_field(AWAR_SUBMIT_PARSED, 80, 13);
248
249    aws->at("species");
250    aws->label("Species Name:");
251    aws->create_input_field(AWAR_SPECIES_NAME, 12);
252
253    aws->at("submission");
254    {
255        StrArray submits;
256        GBS_read_dir(submits, GB_path_in_ARBLIB("submit"), NULL);
257
258        if (!submits.empty()) {
259            aws->label("Select a Form");
260            aws->create_option_menu(AWAR_SUBMIT_SOURCE, false);
261            for (int i = 0; submits[i]; ++i) {
262                aws->insert_option(submits[i], "", submits[i]);
263            }
264            aws->insert_default_option("default", "d", "default");
265            aws->update_option_menu();
266        }
267    }
268
269    aws->at("gen");
270    aws->label("Gen File Name");
271    aws->callback(ed_submit_gen_event);
272    aws->create_button("GEN_FILE_NAME", "CREATE NAME", "C");
273
274    aws->at("file");
275    aws->label("or enter");
276    aws->create_input_field(AWAR_SUBMIT_FILE, 30);
277
278    aws->at("info");
279    aws->callback(makeWindowCallback(ed_submit_info_event, gb_main));
280    aws->create_button("READ_INFO", "READ INFO", "R");
281
282    aws->at("parse");
283    aws->callback(ed_submit_parse_event);
284    aws->create_button("FILL_OUT_FORM", "FILL THE FORM", "F");
285
286    aws->at("write");
287    aws->callback(makeWindowCallback(ed_save_var_to_file, AWAR_SUBMIT_PARSED, AWAR_SUBMIT_FILE));
288    aws->create_button("SAVE", "SAVE TO FILE", "S");
289
290    aws->button_length(20);
291    aws->at("edit");
292    aws->callback(makeCreateWindowCallback(create_calltexe_window, AWAR_SUBMIT_SOURCE));
293    aws->create_button("EDIT_FORM", "EDIT FORM", "R");
294
295    aws->at("editresult");
296    aws->callback(makeCreateWindowCallback(create_calltexe_window, AWAR_SUBMIT_FILE));
297    aws->create_button("EDIT_SAVED", "EDIT SAVED", "S");
298
299    aws->at("privatlabel");
300    aws->create_button(0, "Your private data");
301
302    return aws;
303}
Note: See TracBrowser for help on using the repository browser.