source: branches/profile/SL/MACROS/macro_gui.cxx

Last change on this file was 11948, checked in by westram, 11 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1// ============================================================= //
2//                                                               //
3//   File      : macro_gui.cxx                                   //
4//   Purpose   :                                                 //
5//                                                               //
6//   Coded by Ralf Westram (coder@reallysoft.de) in May 2005     //
7//   Institute of Microbiology (Technical University Munich)     //
8//   http://www.arb-home.de/                                     //
9//                                                               //
10// ============================================================= //
11
12#include "macros.hxx"
13#include "macros_local.hxx"
14#include "trackers.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 <arbdbt.h>
25#include <ad_cb.h>
26
27#define ma_assert(bed) arb_assert(bed)
28
29#define AWAR_MACRO_RECORDING_MACRO_TEXT AWAR_MACRO_BASE"/button_label"
30#define AWAR_MACRO_RECORDING_EXPAND     AWAR_MACRO_BASE"/expand"
31#define AWAR_MACRO_RECORDING_RUNB4      AWAR_MACRO_BASE"/runb4"
32
33static void delete_macro_cb(AW_window *aww) {
34    AW_root *awr       = aww->get_root();
35    char    *macroName = AW_get_selected_fullname(awr, AWAR_MACRO_BASE);
36
37    if (GB_unlink(macroName)<0) aw_message(GB_await_error());
38    else AW_refresh_fileselection(awr, AWAR_MACRO_BASE);
39
40    free(macroName);
41}
42
43static void macro_execution_finished(AW_root *awr, AW_CL cl_macroName) {
44    char *macroName = (char*)cl_macroName;
45
46#if defined(DEBUG)
47    fprintf(stderr, "macro_execution_finished(%s)\n", macroName);
48#endif
49
50    AW_set_selected_fullname(awr, AWAR_MACRO_BASE, macroName); // reset selected macro (needed if macro calls other macro(s))
51   
52    free(macroName);
53}
54
55static void exec_macro_cb(AW_window *aww, bool loop_marked) {
56    AW_root  *awr       = aww->get_root();
57    char     *macroName = AW_get_selected_fullname(awr, AWAR_MACRO_BASE); // @@@ instead use function returning plain name w/o dir
58    GB_ERROR  error     = getMacroRecorder(awr)->execute(macroName, loop_marked, macro_execution_finished, (AW_CL)macroName);
59    if (error) {
60        aw_message(error);
61        free(macroName); // only free in error-case (see macro_execution_finished)
62    }
63}
64
65inline void update_macro_record_button(AW_root *awr) {
66    awr->awar(AWAR_MACRO_RECORDING_MACRO_TEXT)->write_string(awr->is_tracking() ? "STOP" : "RECORD");
67}
68
69static void start_macro_cb(AW_window *aww) {
70    AW_root  *awr   = aww->get_root();
71    GB_ERROR  error = NULL;
72
73    if (awr->is_tracking()) {
74        error = getMacroRecorder(awr)->stop_recording();
75    }
76    else {
77        bool expand = awr->awar(AWAR_MACRO_RECORDING_EXPAND)->read_int();
78        bool runb4  = expand && awr->awar(AWAR_MACRO_RECORDING_RUNB4)->read_int();
79
80        char *macroName = AW_get_selected_fullname(awr, AWAR_MACRO_BASE);
81        if (GB_is_directory(macroName)) {
82            error = "Please specify name of macro to record";
83        }
84        else {
85            if (runb4) exec_macro_cb(aww, false);
86
87            char *sac = GBS_global_string_copy("%s/%s", aww->window_defaults_name, MACRO_RECORD_ID);
88            error = getMacroRecorder(awr)->start_recording(macroName, sac, expand);
89            free(sac);
90        }
91        free(macroName);
92    }
93
94    AW_refresh_fileselection(awr, AWAR_MACRO_BASE);
95    update_macro_record_button(awr);
96    if (error) aw_message(error);
97}
98
99static void edit_macro_cb(AW_window *aww) {
100    char *path = AW_get_selected_fullname(aww->get_root(), AWAR_MACRO_BASE);
101    AW_edit(path);
102    free(path);
103}
104
105static void macro_recording_changed_cb() {
106    update_macro_record_button(AW_root::SINGLETON);
107}
108
109static void create_macro_variables(AW_root *aw_root) {
110    AW_create_fileselection_awars(aw_root, AWAR_MACRO_BASE, ".", ".amc", "");
111    aw_root->awar_string(AWAR_MACRO_RECORDING_MACRO_TEXT, "RECORD");
112    aw_root->awar_int(AWAR_MACRO_RECORDING_EXPAND, 0);
113    aw_root->awar_int(AWAR_MACRO_RECORDING_RUNB4, 0);
114
115    {
116        UserActionTracker *tracker       = aw_root->get_tracker();
117        MacroRecorder     *macroRecorder = dynamic_cast<MacroRecorder*>(tracker);
118
119        GBDATA   *gb_main = macroRecorder->get_gbmain();
120        GB_ERROR  error   = NULL;
121
122        GB_transaction ta(gb_main);
123
124        GBDATA *gb_recording     = GB_searchOrCreate_int(gb_main, MACRO_TRIGGER_RECORDING, 0);
125        if (!gb_recording) error = GB_await_error();
126        else    error            = GB_add_callback(gb_recording, GB_CB_CHANGED, makeDatabaseCallback(macro_recording_changed_cb));
127
128        if (error) aw_message(GBS_global_string("Failed to bind macro_recording_changed_cb (Reason: %s)", error));
129    }
130
131    update_macro_record_button(aw_root);
132}
133
134static void popup_macro_window(AW_window *aww) {
135    static AW_window_simple *aws = 0;
136    if (!aws) {
137        AW_root *aw_root = aww->get_root();
138
139        aws = new AW_window_simple;
140        aws->init(aw_root, MACRO_WINDOW_ID, "MACROS");
141        aws->load_xfig("macro_select.fig");
142
143        create_macro_variables(aw_root);
144       
145        aws->at("close"); aws->callback(AW_POPDOWN);
146        aws->create_button("CLOSE", "CLOSE", "C");
147
148        aws->at("help"); aws->callback(makeHelpCallback("macro.hlp"));
149        aws->create_button("HELP", "HELP");
150
151        aws->at("record"); aws->callback(start_macro_cb);
152        aws->create_button(MACRO_RECORD_ID, AWAR_MACRO_RECORDING_MACRO_TEXT);
153
154        aws->at("expand"); aws->create_toggle(AWAR_MACRO_RECORDING_EXPAND);
155        aws->at("runb4");  aws->create_toggle(AWAR_MACRO_RECORDING_RUNB4);
156
157        aws->at("edit");   aws->callback(edit_macro_cb);   aws->create_button("EDIT",   "EDIT");
158        aws->at("delete"); aws->callback(delete_macro_cb); aws->create_button("DELETE", "DELETE");
159
160        aws->at("exec");
161        aws->callback(makeWindowCallback(exec_macro_cb, false));
162        aws->create_button(MACRO_PLAYBACK_ID, "EXECUTE");
163
164        aws->at("execWith");
165        aws->callback(makeWindowCallback(exec_macro_cb, true));
166        aws->create_autosize_button(MACRO_PLAYBACK_MARKED_ID, "Execute with each marked species");
167
168        AW_create_fileselection(aws, AWAR_MACRO_BASE, "", "ARBMACROHOME^ARBMACRO", ANY_DIR, false);
169    }
170    aws->activate();
171}
172
173void insert_macro_menu_entry(AW_window *awm, bool prepend_separator) {
174    if (getMacroRecorder(awm->get_root())) {
175        if (prepend_separator) awm->sep______________();
176        awm->insert_menu_topic("macros", "Macros ", "M", "macro.hlp", AWM_ALL, popup_macro_window);
177    }
178}
179
180void execute_macro(AW_root *root, const char *macroname) {
181    // used to execute macro passed via CLI
182    GB_ERROR error = 0;
183    {
184        // @@@ allow macro playback from client? (using server via AWAR)
185        MacroRecorder *recorder = getMacroRecorder(root);
186        if (!recorder) error    = "macro playback only available in server";
187        else           error    = recorder->execute(macroname, false, NULL, 0);
188    }
189
190    if (error) {
191        aw_message(GBS_global_string("Can't execute macro '%s' (Reason: %s)", macroname, error));
192    }
193}
Note: See TracBrowser for help on using the repository browser.