EVENT GUICreateMenuPopup( gui_window *wnd, gui_point *location, MENUITEM *menu, gui_mouse_track track, gui_ctl_id *curr_id ) { EVENT ev; gui_ctl_id id; ATTR attr_active; ATTR attr_hot; ATTR attr_curr_active; ATTR attr_hot_curr; ATTR attr_inactive; ATTR attr_curr_inactive; ATTR attr_menu; gui_window *top; SAREA area; DESCMENU desc; MenuWnd = wnd; if( MenuState == MENU_NONE ) { MenuState = MENU_SYS; } if( menu == NULL ) { return( EV_NO_EVENT ); } attr_active = UIData->attrs[ATTR_ACTIVE]; attr_hot = UIData->attrs[ATTR_HOT]; attr_curr_active = UIData->attrs[ATTR_CURR_ACTIVE]; attr_hot_curr = UIData->attrs[ATTR_HOT_CURR]; attr_inactive = UIData->attrs[ATTR_INACTIVE]; attr_curr_inactive = UIData->attrs[ATTR_CURR_INACTIVE]; attr_menu = UIData->attrs[ATTR_MENU]; UIData->attrs[ATTR_ACTIVE] = wnd->colours[GUI_MENU_PLAIN]; UIData->attrs[ATTR_HOT] = wnd->colours[GUI_MENU_STANDOUT]; UIData->attrs[ATTR_CURR_ACTIVE] = wnd->colours[GUI_MENU_ACTIVE]; UIData->attrs[ATTR_HOT_CURR] = wnd->colours[GUI_MENU_ACTIVE_STANDOUT]; UIData->attrs[ATTR_INACTIVE] = wnd->colours[GUI_MENU_GRAYED]; UIData->attrs[ATTR_CURR_INACTIVE] = wnd->colours[GUI_MENU_GRAYED_ACTIVE]; UIData->attrs[ATTR_MENU] = wnd->colours[GUI_MENU_FRAME]; ev = 0; if( ( curr_id != NULL ) && ( *curr_id != 0 ) ) { ev = ID2EV( *curr_id ); } top = GUIGetTopWnd( wnd ); COPYAREA( top->use, area ); area.row += top->screen.area.row; area.col += top->screen.area.col; if( !uiposfloatingpopup( menu, &desc, wnd->screen.area.row + location->y, wnd->screen.area.col + location->x, &area, NULL ) ) { return( EV_NO_EVENT ); } ev = uicreatepopupinarea( menu, &desc, track & GUI_TRACK_LEFT, track & GUI_TRACK_RIGHT, ev, &area, false ); if( ev == EV_KILL_UI ) { uiforceevadd( EV_KILL_UI ); ev = EV_NO_EVENT; } GUIProcessMenuCurr( NULL ); UIData->attrs[ATTR_ACTIVE] = attr_active; UIData->attrs[ATTR_HOT] = attr_hot; UIData->attrs[ATTR_CURR_ACTIVE] = attr_curr_active; UIData->attrs[ATTR_HOT_CURR] = attr_hot_curr; UIData->attrs[ATTR_INACTIVE] = attr_inactive; UIData->attrs[ATTR_CURR_INACTIVE] = attr_curr_inactive; UIData->attrs[ATTR_MENU] = attr_menu; if( ( ev != EV_MOUSE_DCLICK ) && ( ev != EV_NO_EVENT ) ) { if( IS_CTLEVENT( ev ) ) { id = EV2ID( ev ); GUIEVENTWND( wnd, GUI_CLICKED, &id ); if( curr_id != NULL ) { *curr_id = id; } } else { GUIProcessSysMenuEvent( ev, wnd ); } } if( MenuState == MENU_SYS ) { MenuState = MENU_NONE; } MenuWnd = NULL; return( ev ); }
bool GUIDoAddControl( gui_control_info *ctl_info, gui_window *wnd, VFIELD *field ) { a_radio *radio; a_check *check; a_combo_box *combo_box; an_edit_control *edit_control; bool group_allocated; SAREA area; bool ok; group_allocated = false; if( (ctl_info->style & GUI_GROUP) && (ctl_info->control_class == GUI_RADIO_BUTTON) ) { if( !Group ) { RadioGroup = (a_radio_group *)GUIMemAlloc( sizeof( a_radio_group ) ); if( RadioGroup == NULL ) { return( false ); } RadioGroup->value = -1; RadioGroup->caption = GUIStrDup( ctl_info->text, &ok ); if( !ok ) { CleanUpRadioGroups(); return( false ); } Group = true; group_allocated = true; } } GUIGetSAREA( wnd, &area ); if( !GUISetDialogArea( wnd, &field->area, &ctl_info->rect, &area ) ) { return( false ); } field->typ = ui_types[ctl_info->control_class]; if( field->typ == FLD_EDIT && ( ctl_info->style & GUI_EDIT_INVISIBLE ) ) { field->typ = FLD_INVISIBLE_EDIT; } switch( field->typ ) { case FLD_HOT : if( !GUICreateHot( ctl_info, field ) ) { return( false ); } break; case FLD_RADIO : radio = (a_radio *)GUIMemAlloc( sizeof( a_radio ) ); field->u.radio = radio; ok = false; if( radio != NULL ) { radio->str = GUIStrDup( ctl_info->text, &ok ); } if( !ok ) { if( group_allocated ) { CleanUpRadioGroups(); } return( false ); } radio->value = ID2EV( ctl_info->id ); radio->group = RadioGroup; if( ( ctl_info->style & GUI_CHECKED ) && ( ctl_info->style & GUI_AUTOMATIC ) ) { RadioGroup->def = radio->value; RadioGroup->value = radio->value; } break; case FLD_CHECK : check = (a_check *)GUIMemAlloc( sizeof( a_check ) ); field->u.check = check; ok = false; if( check != NULL ) check->str = GUIStrDup( ctl_info->text, &ok ); if( !ok ) { return( false ); } check->val = 0; if( ( ctl_info->style & GUI_CHECKED ) && ( ctl_info->style & GUI_AUTOMATIC ) ) { check->def = true; } else { check->def = false; } break; case FLD_COMBOBOX : combo_box = (a_combo_box *)GUIMemAlloc( sizeof( a_combo_box ) ); if( combo_box == NULL ) { return( false ); } field->u.combo = combo_box; combo_box->edit.buffer = NULL; combo_box->edit.length = 0; if( !GUIFillInListBox( &combo_box->list ) ) { return( false ); } if( ctl_info->text != NULL ) { if( !GUISetEditText( &combo_box->edit, ctl_info->text, false ) ) { return( false ); } } combo_box->perm = false; break; case FLD_EDIT : case FLD_INVISIBLE_EDIT : edit_control = (an_edit_control *)GUIMemAlloc( sizeof( an_edit_control ) ); if( edit_control == NULL ) { return( false ); } field->u.edit = edit_control; edit_control->buffer = NULL; GUISetEditText( edit_control, ctl_info->text, field->typ != FLD_EDIT ); break; case FLD_PULLDOWN : case FLD_LISTBOX : field->u.list = (a_list *)GUICreateListBox(); if( field->u.list == NULL ) { return( false ); } break; case FLD_EDIT_MLE: field->u.list = (a_list *)GUICreateEditMLE( ctl_info->text ); if( field->u.list == NULL ) { return( false ); } break; case FLD_TEXT : case FLD_FRAME : field->u.str = GUIStrDup( ctl_info->text, &ok ); if( !ok ) { return( false ); } break; default : return( false ); break; } if( (ctl_info->style & GUI_GROUP) && (ctl_info->control_class == GUI_RADIO_BUTTON) ) { if( Group && !group_allocated ) { RadioGroup = NULL; Group = false; } } return( true ); }