00001
00020 #include "mfcpch.h"
00021 #include <ctype.h>
00022 #include "sbdmenu.h"
00023 #include "submen.h"
00024 #include "varblwin.h"
00025 #include "notdll.h"
00026
00027 const ERRCODE NOT_ASSOCIATED = "Cant find associated VARIABLES_WINDOW";
00028
00029 ASSOCIATION_LIST
00030 VARIABLES_WINDOW::win_assocs;
00031
00032
00033 ELISTIZE (ASSOC)
00034
00035
00036
00037
00038
00042 void ASSOCIATION_LIST::add(
00043 WINDOW new_fd,
00044 VARIABLES_WINDOW *new_var_win
00045 ) {
00046 ASSOC_IT it(&associations);
00047
00048 it.add_to_end (new ASSOC (new_fd, new_var_win));
00049 }
00050
00051
00055 void ASSOCIATION_LIST::remove(
00056 WINDOW fd
00057 ) {
00058 ASSOC_IT it(&associations);
00059
00060 if (!it.empty ()) {
00061 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00062 if (fd == it.data ()->fd) {
00063 it.extract ();
00064 return;
00065 }
00066 }
00067 }
00068 NOT_ASSOCIATED.error ("ASSOCIATION_LIST::remove", ABORT, NULL);
00069 }
00070
00071
00075 VARIABLES_WINDOW *ASSOCIATION_LIST::lookup(
00076 WINDOW fd
00077 ) {
00078 ASSOC_IT it(&associations);
00079
00080 if (!it.empty ()) {
00081 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00082 if (fd == it.data ()->fd)
00083 return it.data ()->var_win;
00084 }
00085 }
00086 NOT_ASSOCIATED.error ("ASSOCIATION_LIST::lookup", ABORT, NULL);
00087 return NULL;
00088 }
00089
00090
00094 void ASSOCIATION_LIST::plot_all() {
00095 ASSOC_IT it(&associations);
00096
00097 if (!it.empty ()) {
00098 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) {
00099 it.data ()->var_win->plot ();
00100 }
00101 }
00102 }
00103
00104
00108 void ASSOCIATION_LIST::turn_off_interrupts() {
00109 ASSOC_IT it(&associations);
00110
00111 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
00112
00113 set_click_handler (it.data ()->fd, NULL);
00114 }
00115
00116
00120 void ASSOCIATION_LIST::turn_on_interrupts(
00121 EVENT_HANDLER interrupt_proc) {
00122 ASSOC_IT it(&associations);
00123
00124 for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ())
00125 set_click_handler (it.data ()->fd, interrupt_proc);
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00138 void VARIABLES_WINDOW::v_event(
00139 GRAPHICS_EVENT &g_event) {
00140 INT32 cmd_event;
00141 char new_value[80];
00142 char buff[80];
00143
00144 COMMAND_WINDOW::event(g_event, &cmd_event, new_value);
00145
00146 switch (cmd_event) {
00147 case NULL_COMMAND:
00148 break;
00149 case WRITE_ALL_CMD:
00150 write_vars(new_value, FALSE);
00151 break;
00152 case WRITE_CHANGED_CMD:
00153 write_vars(new_value, TRUE);
00154 break;
00155 case KILL_WINDOW_CMD:
00156 win_assocs.remove (g_event.fd);
00157 destroy_window (g_event.fd);
00158 my_creator->child_closed ();
00159 delete this;
00160 break;
00161 default:
00162 sprintf (buff, "UNPROCESSED EVENT code " INT32FORMAT, cmd_event);
00163 msg(buff);
00164 }
00165 }
00166
00167
00171 BOOL8 VARIABLES_WINDOW::internal_prompt(
00172 const char *msg_str,
00173 char *response_str
00174 ) {
00175 BOOL8 result;
00176
00177 win_assocs.turn_off_interrupts ();
00178 result = COMMAND_WINDOW::internal_prompt (msg_str, response_str);
00179 win_assocs.turn_on_interrupts (VARIABLES_WINDOW::interrupt_handler);
00180 set_click_handler(fd, VARIABLES_WINDOW::interrupt_handler);
00181 return result;
00182 }
00183
00184
00189 void VARIABLES_WINDOW::interrupt_handler(
00190 GRAPHICS_EVENT *g_event
00191 ) {
00192 (win_assocs.lookup (g_event->fd))->v_event (*g_event);
00193
00194 overlap_picture_ops(TRUE);
00195 }
00196
00197
00201 VARIABLES_WINDOW::VARIABLES_WINDOW (
00202
00203 const char *name,
00204 MENU_ROOT * menu_root,
00205 VAR_SUB_MENU * creator
00206 ):
00207 COMMAND_WINDOW(name, menu_root) {
00208 win_assocs.add (fd, this);
00209 my_creator = creator;
00210 set_click_handler(fd, VARIABLES_WINDOW::interrupt_handler);
00211 }
00212
00213
00217 void VARIABLES_WINDOW::write_vars(
00218 char *filename,
00219 BOOL8 changes_only
00220 ) {
00221 FILE *fp;
00222 char msg_str[MAX_CHARS + 1];
00223 char response_str[MAX_CHARS + 1];
00224 char *token;
00225
00226
00227 if ((fp = fopen (filename, "r")) != NULL) {
00228 fclose(fp);
00229 sprintf (msg_str, "Overwrite file " "%s" "? (Y/N)", filename);
00230 response_str[0] = '\0';
00231 if (!prompt (msg_str, response_str))
00232 return;
00233 token = strtok (response_str, " ");
00234 if (tolower (token[0]) != 'y')
00235 return;
00236 }
00237
00238 fp = fopen (filename, "w");
00239 if (fp == NULL) {
00240 sprintf (msg_str, "Cant write to file " "%s" "", filename);
00241 msg(msg_str);
00242 return;
00243 }
00244 menu_root->write_vars (fp, changes_only);
00245 fclose(fp);
00246 }