Пример #1
0
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 );
}
Пример #2
0
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 );
}