source: tags/ms_r16q3/WINDOW/AW_option_toggle.cxx

Last change on this file was 15061, checked in by westram, 8 years ago
  • document invariant
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.7 KB
Line 
1// ============================================================== //
2//                                                                //
3//   File      : AW_option_toggle.cxx                             //
4//   Purpose   : option-menu- and toggle-code                     //
5//                                                                //
6//   Institute of Microbiology (Technical University Munich)      //
7//   http://www.arb-home.de/                                      //
8//                                                                //
9// ============================================================== //
10
11#include "aw_at.hxx"
12#include "aw_window.hxx"
13#include "aw_awar.hxx"
14#include "aw_window_Xm.hxx"
15#include "aw_root.hxx"
16#include "aw_xargs.hxx"
17#include "aw_varupdate.hxx"
18
19#include <Xm/MenuShell.h>
20#include <Xm/RowColumn.h>
21#include <Xm/ToggleB.h>
22#include <Xm/Label.h>
23#include <Xm/PushB.h>
24
25__ATTR__NORETURN inline void option_type_mismatch(const char *triedType) { type_mismatch(triedType, "option-menu"); }
26__ATTR__NORETURN inline void toggle_type_mismatch(const char *triedType) { type_mismatch(triedType, "toggle"); }
27
28// ----------------------
29//      Options-Menu
30
31AW_option_menu_struct *AW_window::create_option_menu(const char *awar_name, bool /*fallback2default*/) {
32    // Note: fallback2default has no meaning in motif-version (always acts like 'false', i.e. never does fallback)
33    // see also .@create_selection_list
34
35    Widget optionMenu_shell;
36    Widget optionMenu;
37    Widget optionMenu1;
38    int    x_for_position_of_menu;
39
40    const char *tmp_label = _at->label_for_inputfield;
41    if (tmp_label && !tmp_label[0]) {
42        aw_assert(0); // do not specify empty labels (causes misalignment)
43        tmp_label = NULL;
44    }
45
46    _at->saved_x           = _at->x_for_next_button - (tmp_label ? 0 : 10);
47    x_for_position_of_menu = 10;
48
49    optionMenu_shell = XtVaCreatePopupShell ("optionMenu shell",
50                                             xmMenuShellWidgetClass,
51                                             INFO_WIDGET,
52                                             XmNwidth, 1,
53                                             XmNheight, 1,
54                                             XmNallowShellResize, true,
55                                             XmNoverrideRedirect, true,
56                                             XmNfontList, p_global->fontlist,
57                                             NULL);
58
59    optionMenu = XtVaCreateWidget("optionMenu_p1",
60                                  xmRowColumnWidgetClass,
61                                  optionMenu_shell,
62                                  XmNrowColumnType, XmMENU_PULLDOWN,
63                                  XmNfontList, p_global->fontlist,
64                                  NULL);
65    {
66        aw_xargs args(3);
67        args.add(XmNfontList, (XtArgVal)p_global->fontlist);
68        if (!_at->attach_x && !_at->attach_lx) args.add(XmNx, x_for_position_of_menu);
69        if (!_at->attach_y && !_at->attach_ly) args.add(XmNy, _at->y_for_next_button-5);
70
71        if (tmp_label) {
72            int   width_help_label, height_help_label;
73            calculate_label_size(&width_help_label, &height_help_label, false, tmp_label);
74            // @@@ FIXME: use height_help_label for Y-alignment
75#if defined(DUMP_BUTTON_CREATION)
76            printf("width_help_label=%i label='%s'\n", width_help_label, tmp_label);
77#endif // DUMP_BUTTON_CREATION
78
79            {
80                aw_assert(!AW_IS_IMAGEREF(tmp_label)); // using images as labels for option menus will work in gtk (wont fix in motif)
81
82                char *help_label = this->align_string(tmp_label, width_help_label);
83                optionMenu1      = XtVaCreateManagedWidget("optionMenu1",
84                                                           xmRowColumnWidgetClass,
85                                                           (_at->attach_any) ? INFO_FORM : INFO_WIDGET,
86                                                           XmNrowColumnType, XmMENU_OPTION,
87                                                           XmNsubMenuId, optionMenu,
88                                                           RES_CONVERT(XmNlabelString, help_label),
89                                                           NULL);
90                free(help_label);
91            }
92        }
93        else {
94            _at->x_for_next_button = _at->saved_x;
95
96            optionMenu1 = XtVaCreateManagedWidget("optionMenu1",
97                                                  xmRowColumnWidgetClass,
98                                                  (_at->attach_any) ? INFO_FORM : INFO_WIDGET,
99                                                  XmNrowColumnType, XmMENU_OPTION,
100                                                  XmNsubMenuId, optionMenu,
101                                                  NULL);
102        }
103        args.assign_to_widget(optionMenu1);
104    }
105
106#if 0
107    // setting background color for radio button only does not work.
108    // works only for label and button together, but that's not what we want.
109    TuneBackground(optionMenu_shell, TUNE_BUTTON); // set background color for radio button
110    XtVaSetValues(optionMenu1, // colorizes background and label
111                  XmNbackground, _at->background_color,
112                  NULL);
113#endif
114
115    get_root()->number_of_option_menus++;
116
117    AW_awar *vs = root->awar(awar_name);
118    {
119        AW_option_menu_struct *next =
120            new AW_option_menu_struct(get_root()->number_of_option_menus,
121                                      awar_name,
122                                      vs->variable_type,
123                                      optionMenu1,
124                                      optionMenu,
125                                      _at->x_for_next_button - 7,
126                                      _at->y_for_next_button,
127                                      _at->correct_for_at_center);
128
129        if (p_global->option_menu_list) {
130            p_global->last_option_menu->next = next;
131            p_global->last_option_menu = p_global->last_option_menu->next;
132        }
133        else {
134            p_global->last_option_menu = p_global->option_menu_list = next;
135        }
136    }
137
138    p_global->current_option_menu = p_global->last_option_menu;
139
140    vs->tie_widget((AW_CL)p_global->current_option_menu, optionMenu, AW_WIDGET_CHOICE_MENU, this);
141    root->make_sensitive(optionMenu1, _at->widget_mask);
142
143    return p_global->current_option_menu;
144}
145
146static void remove_option_from_option_menu(AW_root *aw_root, AW_widget_value_pair *os) {
147    aw_root->remove_button_from_sens_list(os->widget);
148    XtDestroyWidget(os->widget);
149}
150
151void AW_window::clear_option_menu(AW_option_menu_struct *oms) {
152    p_global->current_option_menu = oms; // define as current (for subsequent inserts)
153
154    AW_widget_value_pair *next_os;
155    for (AW_widget_value_pair *os = oms->first_choice; os; os = next_os) {
156        next_os  = os->next;
157        os->next = 0;
158        remove_option_from_option_menu(root, os);
159        delete os;
160    }
161
162    if (oms->default_choice) {
163        remove_option_from_option_menu(root, oms->default_choice);
164        oms->default_choice = 0;
165    }
166
167    oms->first_choice   = 0;
168    oms->last_choice    = 0;
169}
170
171void *AW_window::_create_option_entry(AW_VARIABLE_TYPE IF_ASSERTION_USED(type), const char *name, const char */*mnemonic*/, const char *name_of_color) {
172    Widget                 entry;
173    AW_option_menu_struct *oms = p_global->current_option_menu;
174
175    aw_assert(oms->variable_type == type); // adding wrong entry type
176
177    TuneOrSetBackground(oms->menu_widget, name_of_color, TUNE_BUTTON); // set background color for radio button entries
178    entry = XtVaCreateManagedWidget("optionMenu_entry",
179                                    xmPushButtonWidgetClass,
180                                    oms->menu_widget,
181                                    RES_CONVERT(XmNlabelString, name), // force text (as gtk version does)
182                                    XmNfontList, p_global->fontlist,
183                                    XmNbackground, _at->background_color,
184                                    NULL);
185    AW_label_in_awar_list(this, entry, name);
186    return (void *)entry;
187}
188
189inline void option_menu_add_option(AW_option_menu_struct *oms, AW_widget_value_pair *os, bool default_option) {
190    if (default_option) {
191        oms->default_choice = os;
192    }
193    else {
194        if (oms->first_choice) {
195            oms->last_choice->next = os;
196            oms->last_choice       = oms->last_choice->next;
197        }
198        else {
199            oms->last_choice = oms->first_choice = os;
200        }
201    }
202}
203
204// ----------------------------------------------------------------------
205// force-diff-sync 917381378912 (remove after merging back to trunk)
206// ----------------------------------------------------------------------
207
208void AW_window::insert_option_internal(AW_label option_name, const char *mnemonic, const char *var_value, const char *name_of_color, bool default_option) {
209    AW_option_menu_struct *oms = p_global->current_option_menu;
210    aw_assert(oms != NULL); // "current" option menu has to be set (insert-functions may only be used between create_option_menu/clear_option_menu and update_option_menu)
211
212    if (oms->variable_type != AW_STRING) {
213        option_type_mismatch("string");
214    }
215    else {
216        Widget        entry = (Widget)_create_option_entry(AW_STRING, option_name, mnemonic, name_of_color);
217        AW_cb *cbs   = _callback; // user-own callback
218
219        // callback for new choice
220        XtAddCallback(entry, XmNactivateCallback,
221                      (XtCallbackProc) AW_variable_update_callback,
222                      (XtPointer) new VarUpdateInfo(this, NULL, AW_WIDGET_CHOICE_MENU, root->awar(oms->variable_name), var_value, cbs));
223
224        option_menu_add_option(p_global->current_option_menu, new AW_widget_value_pair(var_value, entry), default_option);
225        root->make_sensitive(entry, _at->widget_mask);
226        this->unset_at_commands();
227    }
228}
229void AW_window::insert_option_internal(AW_label option_name, const char *mnemonic, int var_value, const char *name_of_color, bool default_option) {
230    AW_option_menu_struct *oms = p_global->current_option_menu;
231    aw_assert(oms != NULL); // "current" option menu has to be set (insert-functions may only be used between create_option_menu/clear_option_menu and update_option_menu)
232
233    if (oms->variable_type != AW_INT) {
234        option_type_mismatch("int");
235    }
236    else {
237        Widget        entry = (Widget)_create_option_entry(AW_INT, option_name, mnemonic, name_of_color);
238        AW_cb *cbs   = _callback; // user-own callback
239
240        // callback for new choice
241        XtAddCallback(entry, XmNactivateCallback,
242                      (XtCallbackProc) AW_variable_update_callback,
243                      (XtPointer) new VarUpdateInfo(this, NULL, AW_WIDGET_CHOICE_MENU, root->awar(oms->variable_name), var_value, cbs));
244
245        option_menu_add_option(p_global->current_option_menu, new AW_widget_value_pair(var_value, entry), default_option);
246        root->make_sensitive(entry, _at->widget_mask);
247        this->unset_at_commands();
248    }
249}
250void AW_window::insert_option_internal(AW_label option_name, const char *mnemonic, float var_value, const char *name_of_color, bool default_option) {
251    AW_option_menu_struct *oms = p_global->current_option_menu;
252    aw_assert(oms != NULL); // "current" option menu has to be set (insert-functions may only be used between create_option_menu/clear_option_menu and update_option_menu)
253
254    if (oms->variable_type != AW_FLOAT) {
255        option_type_mismatch("float");
256    }
257    else {
258        Widget        entry = (Widget)_create_option_entry(AW_FLOAT, option_name, mnemonic, name_of_color);
259        AW_cb *cbs   = _callback; // user-own callback
260
261        // callback for new choice
262        XtAddCallback(entry, XmNactivateCallback,
263                      (XtCallbackProc) AW_variable_update_callback,
264                      (XtPointer) new VarUpdateInfo(this, NULL, AW_WIDGET_CHOICE_MENU, root->awar(oms->variable_name), var_value, cbs));
265
266        option_menu_add_option(p_global->current_option_menu, new AW_widget_value_pair(var_value, entry), default_option);
267        root->make_sensitive(entry, _at->widget_mask);
268        this->unset_at_commands();
269    }
270}
271
272// ----------------------------------------------------------------------
273// force-diff-sync 917234982173 (remove after merging back to trunk)
274// ----------------------------------------------------------------------
275
276void AW_window::insert_option        (const char *on, const char *mn, const char *vv, const char *noc) { insert_option_internal(on, mn, vv, noc, false); }
277void AW_window::insert_default_option(const char *on, const char *mn, const char *vv, const char *noc) { insert_option_internal(on, mn, vv, noc, true); }
278void AW_window::insert_option        (const char *on, const char *mn, int vv,         const char *noc) { insert_option_internal(on, mn, vv, noc, false); }
279void AW_window::insert_default_option(const char *on, const char *mn, int vv,         const char *noc) { insert_option_internal(on, mn, vv, noc, true); }
280void AW_window::insert_option        (const char *on, const char *mn, float vv,       const char *noc) { insert_option_internal(on, mn, vv, noc, false); }
281void AW_window::insert_default_option(const char *on, const char *mn, float vv,       const char *noc) { insert_option_internal(on, mn, vv, noc, true); }
282// (see insert_option_internal for longer parameter names)
283
284void AW_window::update_option_menu() {
285    AW_option_menu_struct *oms = p_global->current_option_menu;
286    refresh_option_menu(oms);
287
288    if (_at->attach_any) aw_attach_widget(oms->label_widget, _at);
289
290    short width;
291    short height;
292    XtVaGetValues(oms->label_widget, XmNwidth, &width, XmNheight, &height, NULL);
293    int   width_of_last_widget  = width;
294    int   height_of_last_widget = height;
295
296    if (!_at->to_position_exists) {
297        if (oms->correct_for_at_center_intern == 0) {   // left aligned
298            XtVaSetValues(oms->label_widget, XmNx, short(_at->saved_x), NULL);
299        }
300        if (oms->correct_for_at_center_intern == 1) {   // middle centered
301            XtVaSetValues(oms->label_widget, XmNx, short(_at->saved_x - width/2), NULL);
302            width_of_last_widget = width_of_last_widget / 2;
303        }
304        if (oms->correct_for_at_center_intern == 2) {   // right aligned
305            XtVaSetValues(oms->label_widget, XmNx, short(_at->saved_x - width), NULL);
306            width_of_last_widget = 0;
307        }
308    }
309
310    width_of_last_widget += SPACE_BEHIND_BUTTON;
311
312    this->unset_at_commands();
313    this->increment_at_commands(width_of_last_widget, height_of_last_widget);
314}
315
316void AW_window::refresh_option_menu(AW_option_menu_struct *oms) {
317    if (get_root()->changer_of_variable != oms->label_widget) {
318        AW_widget_value_pair *active_choice = oms->first_choice;
319        {
320            AW_scalar global_var_value(root->awar(oms->variable_name));
321            while (active_choice && global_var_value != active_choice->value) {
322                active_choice = active_choice->next;
323            }
324        }
325
326        if (!active_choice) active_choice = oms->default_choice;
327        if (active_choice) XtVaSetValues(oms->label_widget, XmNmenuHistory, active_choice->widget, NULL);
328
329    }
330}
331
332// -------------------------------------------------------
333//      toggle field (actually this are radio buttons)
334
335void AW_window::create_toggle_field(const char *var_name, AW_label labeli, const char */*mnemonic*/) {
336    /*!
337     * Begins a radio button group with a label
338     */
339    if (labeli) {
340        this->label(labeli);
341    }
342    create_toggle_field(var_name);
343}
344
345void AW_window::create_toggle_field(const char *var_name, int orientation /*= 0*/) {
346    /*!
347     * Begins a radio button group
348     * @param var_name    name of awar
349     * @param orientation 0 -> vertical, != 0 horizontal layout
350     */
351
352    Widget label_for_toggle;
353    Widget toggle_field;
354
355    int xoff_for_label           = 0;
356    int width_of_label           = 0;
357    int x_for_position_of_option = 0;
358
359    const char *tmp_label = "";
360
361    if (_at->label_for_inputfield) {
362        tmp_label = _at->label_for_inputfield;
363    }
364
365    if (_at->correct_for_at_center) {
366        _at->saved_x = _at->x_for_next_button;
367        x_for_position_of_option = 10;
368    }
369    else {
370        x_for_position_of_option = _at->x_for_next_button;
371    }
372
373    if (tmp_label) {
374        int height_of_label;
375        calculate_label_size(&width_of_label, &height_of_label, true, tmp_label);
376        // @@@ FIXME: use height_of_label for Y-alignment
377        // width_of_label = this->calculate_string_width( this->calculate_label_length() );
378        label_for_toggle = XtVaCreateManagedWidget("label",
379                                                   xmLabelWidgetClass,
380                                                   INFO_WIDGET,
381                                                   XmNx, (int)_at->x_for_next_button,
382                                                   XmNy, (int)(_at->y_for_next_button) + this->get_root()->y_correction_for_input_labels,
383                                                   XmNwidth, (int)(width_of_label + 2),
384                                                   RES_CONVERT(XmNlabelString, tmp_label),
385                                                   XmNrecomputeSize, false,
386                                                   XmNalignment, XmALIGNMENT_BEGINNING,
387                                                   XmNfontList, p_global->fontlist,
388                                                   NULL);
389
390        _at->saved_xoff_for_label = xoff_for_label = width_of_label + 10;
391
392        p_w->toggle_label = label_for_toggle;
393    }
394    else {
395        p_w->toggle_label = NULL;
396        _at->saved_xoff_for_label = 0;
397    }
398
399    {
400        aw_xargs args(6);
401        args.add(XmNx,              x_for_position_of_option + xoff_for_label);
402        args.add(XmNy,              _at->y_for_next_button - 2);
403        args.add(XmNradioBehavior,  True);
404        args.add(XmNradioAlwaysOne, True);
405        args.add(XmNfontList,       (XtArgVal)p_global->fontlist);
406        args.add(XmNorientation,    orientation ? XmHORIZONTAL : XmVERTICAL);
407
408        toggle_field = XtVaCreateManagedWidget("rowColumn for toggle field", xmRowColumnWidgetClass, (_at->attach_any) ? INFO_FORM : INFO_WIDGET, NULL);
409
410        args.assign_to_widget(toggle_field);
411    }
412    if (_at->attach_any) {
413        aw_attach_widget(toggle_field, _at, 300);
414    }
415
416    AW_awar *vs = root->awar(var_name);
417
418    p_w->toggle_field = toggle_field;
419    free((p_w->toggle_field_var_name));
420    p_w->toggle_field_var_name = strdup(var_name);
421    p_w->toggle_field_var_type = vs->variable_type;
422
423    get_root()->number_of_toggle_fields++;
424
425    if (p_global->toggle_field_list) {
426        p_global->last_toggle_field->next = new AW_toggle_field_struct(get_root()->number_of_toggle_fields, var_name, vs->variable_type, toggle_field, _at->correct_for_at_center);
427        p_global->last_toggle_field = p_global->last_toggle_field->next;
428    }
429    else {
430        p_global->last_toggle_field = p_global->toggle_field_list = new AW_toggle_field_struct(get_root()->number_of_toggle_fields, var_name, vs->variable_type, toggle_field, _at->correct_for_at_center);
431    }
432
433    vs->tie_widget(get_root()->number_of_toggle_fields, toggle_field, AW_WIDGET_TOGGLE_FIELD, this);
434    root->make_sensitive(toggle_field, _at->widget_mask);
435}
436
437static Widget _aw_create_toggle_entry(AW_window *aww, Widget toggle_field,
438                                      const char *labeltext, const char *mnemonic,
439                                      VarUpdateInfo *awus,
440                                      AW_widget_value_pair *toggle, bool default_toggle) {
441    AW_root *root = aww->get_root();
442
443    Label label(labeltext, aww);
444    Widget toggleButton = XtVaCreateManagedWidget("toggleButton",
445                                                  xmToggleButtonWidgetClass,
446                                                  toggle_field,
447                                                  RES_LABEL_CONVERT(label),
448                                                  RES_CONVERT(XmNmnemonic, mnemonic),
449                                                  XmNindicatorSize, 16,
450                                                  XmNfontList, p_global->fontlist,
451                                                  NULL);
452
453    toggle->widget = toggleButton;
454    awus->set_widget(toggleButton);
455    XtAddCallback(toggleButton, XmNvalueChangedCallback,
456                  (XtCallbackProc) AW_variable_update_callback,
457                  (XtPointer) awus);
458    if (default_toggle) {
459        delete p_global->last_toggle_field->default_toggle;
460        p_global->last_toggle_field->default_toggle = toggle;
461    }
462    else {
463        if (p_global->last_toggle_field->first_toggle) {
464            p_global->last_toggle_field->last_toggle->next = toggle;
465            p_global->last_toggle_field->last_toggle = toggle;
466        }
467        else {
468            p_global->last_toggle_field->last_toggle = toggle;
469            p_global->last_toggle_field->first_toggle = toggle;
470        }
471    }
472    root->make_sensitive(toggleButton, aww->get_at().widget_mask);
473
474    aww->unset_at_commands();
475    return  toggleButton;
476}
477
478
479// ----------------------------------------------------------------------
480// ----------------------------------------------------------------------
481// force-diff-sync 189273814273 (remove after merging back to trunk)
482// ----------------------------------------------------------------------
483// ----------------------------------------------------------------------
484
485
486void AW_window::insert_toggle_internal(AW_label toggle_label, const char *mnemonic, const char *var_value, bool default_toggle) {
487    if (p_w->toggle_field_var_type != AW_STRING) {
488        toggle_type_mismatch("string");
489    }
490    else {
491        _aw_create_toggle_entry(this, p_w->toggle_field, toggle_label, mnemonic,
492                                new VarUpdateInfo(this, NULL, AW_WIDGET_TOGGLE_FIELD, root->awar(p_w->toggle_field_var_name), var_value, _callback),
493                                new AW_widget_value_pair(var_value, 0),
494                                default_toggle);
495    }
496}
497void AW_window::insert_toggle_internal(AW_label toggle_label, const char *mnemonic, int var_value, bool default_toggle) {
498    if (p_w->toggle_field_var_type != AW_INT) {
499        toggle_type_mismatch("int");
500    }
501    else {
502        _aw_create_toggle_entry(this, p_w->toggle_field, toggle_label, mnemonic,
503                                new VarUpdateInfo(this, NULL, AW_WIDGET_TOGGLE_FIELD, root->awar(p_w->toggle_field_var_name), var_value, _callback),
504                                new AW_widget_value_pair(var_value, 0),
505                                default_toggle);
506    }
507}
508void AW_window::insert_toggle_internal(AW_label toggle_label, const char *mnemonic, float var_value, bool default_toggle) {
509    if (p_w->toggle_field_var_type != AW_FLOAT) {
510        toggle_type_mismatch("float");
511    }
512    else {
513        _aw_create_toggle_entry(this, p_w->toggle_field, toggle_label, mnemonic,
514                                new VarUpdateInfo(this, NULL, AW_WIDGET_TOGGLE_FIELD, root->awar(p_w->toggle_field_var_name), var_value, _callback),
515                                new AW_widget_value_pair(var_value, 0),
516                                default_toggle);
517    }
518}
519
520
521// ----------------------------------------------------------------------
522// ----------------------------------------------------------------------
523// force-diff-sync 381892714273 (remove after merging back to trunk)
524// ----------------------------------------------------------------------
525// ----------------------------------------------------------------------
526
527
528void AW_window::insert_toggle        (const char *toggle_label, const char *mnemonic, const char *var_value) { insert_toggle_internal(toggle_label, mnemonic, var_value, false); }
529void AW_window::insert_default_toggle(const char *toggle_label, const char *mnemonic, const char *var_value) { insert_toggle_internal(toggle_label, mnemonic, var_value, true); }
530void AW_window::insert_toggle        (const char *toggle_label, const char *mnemonic, int var_value)         { insert_toggle_internal(toggle_label, mnemonic, var_value, false); }
531void AW_window::insert_default_toggle(const char *toggle_label, const char *mnemonic, int var_value)         { insert_toggle_internal(toggle_label, mnemonic, var_value, true); }
532void AW_window::insert_toggle        (const char *toggle_label, const char *mnemonic, float var_value)       { insert_toggle_internal(toggle_label, mnemonic, var_value, false); }
533void AW_window::insert_default_toggle(const char *toggle_label, const char *mnemonic, float var_value)       { insert_toggle_internal(toggle_label, mnemonic, var_value, true); }
534
535void AW_window::update_toggle_field() {
536    this->refresh_toggle_field(get_root()->number_of_toggle_fields);
537}
538
539
540void AW_window::refresh_toggle_field(int toggle_field_number) {
541#if defined(DEBUG)
542    static int inside_here = 0;
543    aw_assert(!inside_here);
544    inside_here++;
545#endif // DEBUG
546
547    AW_toggle_field_struct *toggle_field_list = p_global->toggle_field_list;
548    {
549        while (toggle_field_list) {
550            if (toggle_field_number == toggle_field_list->toggle_field_number) {
551                break;
552            }
553            toggle_field_list = toggle_field_list->next;
554        }
555    }
556
557    if (toggle_field_list) {
558        AW_widget_value_pair *active_toggle = toggle_field_list->first_toggle;
559        {
560            AW_scalar global_value(root->awar(toggle_field_list->variable_name));
561            while (active_toggle && active_toggle->value != global_value) {
562                active_toggle = active_toggle->next;
563            }
564            if (!active_toggle) active_toggle = toggle_field_list->default_toggle;
565        }
566
567        // iterate over all toggles including default_toggle and set their state
568        for (AW_widget_value_pair *toggle = toggle_field_list->first_toggle; toggle;) {
569            XmToggleButtonSetState(toggle->widget, toggle == active_toggle, False);
570
571            if (toggle->next)                                     toggle = toggle->next;
572            else if (toggle != toggle_field_list->default_toggle) toggle = toggle_field_list->default_toggle;
573            else                                                  toggle = 0;
574        }
575
576        // @@@ code below should go to update_toggle_field
577        {
578            short length;
579            short height;
580            XtVaGetValues(p_w->toggle_field, XmNwidth, &length, XmNheight, &height, NULL);
581            length                += (short)_at->saved_xoff_for_label;
582
583            int width_of_last_widget  = length;
584            int height_of_last_widget = height;
585
586            if (toggle_field_list->correct_for_at_center_intern) {
587                if (toggle_field_list->correct_for_at_center_intern == 1) {   // middle centered
588                    XtVaSetValues(p_w->toggle_field, XmNx, (short)((short)_at->saved_x - (short)(length/2) + (short)_at->saved_xoff_for_label), NULL);
589                    if (p_w->toggle_label) {
590                        XtVaSetValues(p_w->toggle_label, XmNx, (short)((short)_at->saved_x - (short)(length/2)), NULL);
591                    }
592                    width_of_last_widget = width_of_last_widget / 2;
593                }
594                if (toggle_field_list->correct_for_at_center_intern == 2) {   // right centered
595                    XtVaSetValues(p_w->toggle_field, XmNx, (short)((short)_at->saved_x - length + (short)_at->saved_xoff_for_label), NULL);
596                    if (p_w->toggle_label) {
597                        XtVaSetValues(p_w->toggle_label, XmNx, (short)((short)_at->saved_x - length),    NULL);
598                    }
599                    width_of_last_widget = 0;
600                }
601            }
602
603            this->unset_at_commands();
604            this->increment_at_commands(width_of_last_widget, height_of_last_widget);
605        }
606    }
607    else {
608        GBK_terminatef("update_toggle_field: toggle field %i does not exist", toggle_field_number);
609    }
610
611#if defined(DEBUG)
612    inside_here--;
613#endif // DEBUG
614}
Note: See TracBrowser for help on using the repository browser.