root/trunk/AWT/AWT_macro.cxx

Revision 8746, 6.2 KB (checked in by westram, 5 hours ago)
  • fixed NULL pointer conversions (gcc 4.6 warnings)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// ==================================================================== //
2//                                                                      //
3//   File      : AWT_macro.cxx                                          //
4//   Purpose   :                                                        //
5//                                                                      //
6//                                                                      //
7// Coded by Ralf Westram (coder@reallysoft.de) in May 2005              //
8// Copyright Department of Microbiology (Technical University Munich)   //
9//                                                                      //
10// Visit our web site at: http://www.arb-home.de/                       //
11//                                                                      //
12// ==================================================================== //
13
14#include "awt_macro.hxx"
15
16#include <arbdb.h>
17#include <arb_file.h>
18
19#include <aw_window.hxx>
20#include <aw_edit.hxx>
21#include <aw_file.hxx>
22#include <aw_awar.hxx>
23#include <aw_msg.hxx>
24#include <aw_root.hxx>
25
26// ---------------
27//      MACROS
28
29#define AWAR_MACRO_RECORD_ID "macro_record"
30
31#define AWAR_MACRO_BASE "tmp/macro"
32
33#define AWAR_MACRO_RECORDING_MACRO_TEXT AWAR_MACRO_BASE"/button_label"
34#define AWAR_MACRO_RECORDING_EXPAND     AWAR_MACRO_BASE"/expand"
35#define AWAR_MACRO_RECORDING_RUNB4      AWAR_MACRO_BASE"/runb4"
36
37static void awt_delete_macro_cb(AW_window *aww) {
38    AW_root *awr       = aww->get_root();
39    char    *macroName = AW_get_selected_fullname(awr, AWAR_MACRO_BASE);
40
41    if (GB_unlink(macroName)<0) aw_message(GB_await_error());
42    else AW_refresh_fileselection(awr, AWAR_MACRO_BASE);
43
44    free(macroName);
45}
46
47static void macro_execution_finished(AW_root *awr, AW_CL cl_macroName) {
48    char *macroName = (char*)cl_macroName;
49
50#if defined(DEBUG)
51    fprintf(stderr, "macro_execution_finished(%s)\n", macroName);
52#endif
53
54    AW_set_selected_fullname(awr, AWAR_MACRO_BASE, macroName); // reset selected macro (needed if macro calls other macro(s))
55   
56    free(macroName);
57}
58
59static void awt_exec_macro_cb(AW_window *aww, AW_CL cl_gb_main) {
60    GBDATA  *gb_main   = (GBDATA*)cl_gb_main;
61    AW_root *awr       = aww->get_root();
62    char    *macroName = AW_get_selected_fullname(awr, AWAR_MACRO_BASE);
63
64
65    GB_ERROR error = awr->execute_macro(gb_main, macroName, macro_execution_finished, (AW_CL)macroName);
66
67    if (error) {
68        aw_message(error);
69        free(macroName); // only free in error-case (see macro_execution_finished)
70    }
71}
72
73static void awt_start_macro_cb(AW_window *aww, AW_CL cl_gb_main, AW_CL cl_app_name) {
74    const char *app_name = (const char *)cl_app_name;
75    AW_root    *awr      = aww->get_root();
76    GB_ERROR    error    = NULL;
77
78    if (awr->is_recording_macro()) {
79        error = awr->stop_macro_recording();
80    }
81    else {
82        bool expand = awr->awar(AWAR_MACRO_RECORDING_EXPAND)->read_int();
83        bool runb4  = expand && awr->awar(AWAR_MACRO_RECORDING_RUNB4)->read_int();
84
85        char *macroName = AW_get_selected_fullname(awr, AWAR_MACRO_BASE);
86        if (GB_is_directory(macroName)) {
87            error = "Please specify name of macro to record";
88        }
89        else {
90            if (runb4) awt_exec_macro_cb(aww, cl_gb_main);
91
92            char *sac = GBS_global_string_copy("%s/%s", aww->window_defaults_name, AWAR_MACRO_RECORD_ID);
93            error     = awr->start_macro_recording(macroName, app_name, sac, expand);
94            free(sac);
95        }
96        free(macroName);
97    }
98   
99    AW_refresh_fileselection(awr, AWAR_MACRO_BASE);
100    awr->awar(AWAR_MACRO_RECORDING_MACRO_TEXT)->write_string(awr->is_recording_macro() ? "STOP" : "RECORD");
101    if (error) aw_message(error);
102}
103
104static void awt_edit_macro_cb(AW_window *aww) {
105    char *path = AW_get_selected_fullname(aww->get_root(), AWAR_MACRO_BASE);
106    AW_edit(path);
107    free(path);
108}
109
110void awt_create_macro_variables(AW_root *aw_root) {
111    AW_create_fileselection_awars(aw_root, AWAR_MACRO_BASE, ".", ".amc", "");
112    aw_root->awar_string(AWAR_MACRO_RECORDING_MACRO_TEXT, "RECORD");
113    aw_root->awar_int(AWAR_MACRO_RECORDING_EXPAND, 0);
114    aw_root->awar_int(AWAR_MACRO_RECORDING_RUNB4, 0);
115}
116
117void awt_popup_macro_window(AW_window *aww, const char *application_id, GBDATA *gb_main) { 
118    static AW_window_simple *aws = 0;
119    if (!aws) {
120        AW_root *aw_root = aww->get_root();
121
122        aws = new AW_window_simple;
123        aws->init(aw_root, "MACROS", "MACROS");
124        aws->load_xfig("macro_select.fig");
125
126        awt_create_macro_variables(aw_root);
127       
128        aws->at("close"); aws->callback(AW_POPDOWN);
129        aws->create_button("CLOSE", "CLOSE", "C");
130
131        aws->at("help"); aws->callback(AW_POPUP_HELP, (AW_CL)"macro.hlp");
132        aws->create_button("HELP", "HELP");
133
134        aws->at("record"); aws->callback(awt_start_macro_cb, (AW_CL)gb_main, (AW_CL)application_id);
135        aws->create_button(AWAR_MACRO_RECORD_ID, AWAR_MACRO_RECORDING_MACRO_TEXT);
136
137        aws->at("expand"); aws->create_toggle(AWAR_MACRO_RECORDING_EXPAND);
138        aws->at("runb4");  aws->create_toggle(AWAR_MACRO_RECORDING_RUNB4);
139
140        aws->at("exec"); aws->callback(awt_exec_macro_cb, (AW_CL)gb_main);
141        aws->create_button("EXECUTE", "EXECUTE");
142
143        aws->at("edit"); aws->callback(awt_edit_macro_cb);
144        aws->create_button("EDIT", "EDIT");
145
146        aws->at("delete"); aws->callback(awt_delete_macro_cb);
147        aws->create_button("DELETE", "DELETE");
148
149        AW_create_fileselection(aws, AWAR_MACRO_BASE, "", "ARBMACROHOME^ARBMACRO");
150    }
151    aws->activate();
152}
153
154inline char *find_macro_in(const char *dir, const char *macroname) {
155    char *full = GBS_global_string_copy("%s/%s.amc", dir, macroname);
156    if (!GB_is_readablefile(full)) freenull(full);
157    return full;
158}
159
160void awt_execute_macro(GBDATA *gb_main, AW_root *root, const char *macroname) {
161    char *fullname          = find_macro_in(GB_getenvARBMACROHOME(), macroname);
162    if (!fullname) fullname = find_macro_in(GB_getenvARBMACRO(), macroname);
163
164    GB_ERROR error       = 0;
165    if (!fullname) error = "file not found";
166    else     error       = root->execute_macro(gb_main, fullname, NULL, 0);
167
168    if (error) {
169        aw_message(GBS_global_string("Can't execute macro '%s' (Reason: %s)", macroname, error));
170    }
171
172    free(fullname);
173}
Note: See TracBrowser for help on using the browser.