Exemplo n.º 1
0
void GUIDrawIcon( gui_window * wnd )
{
    SAREA       area;
    int         length;
    ATTR        attr;
    char        *str;

    COPYAREA( wnd->screen.area, area );
    area.row = 0;
    area.col = 0;
    attr = wnd->colours[GUI_ICON];
    uivfill( &wnd->screen, area, attr, ' ' );
    uidrawbox( &wnd->screen, &area, attr, NULL );
    str = NULL;
    if( wnd->icon_name != NULL ) {
        str = wnd->icon_name;
    } else {
        if( wnd->screen.name != NULL ) {
            str = wnd->screen.name;
        }
    }
    if( str != NULL ) {
        length = strlen( str );
        if( length > ( area.width - 2 ) ) {
            length = area.width - 2;
        }
        uivtextput( &wnd->screen, ( area.height / 2 ), 1, attr, str, length );
    }
}
Exemplo n.º 2
0
static bool DrawRect( gui_window *wnd, gui_rect *rect, gui_attr attr,
                      bool fill, bool outline, char draw_char )
{
    SAREA       area;
    gui_coord   coord;

    if( ( rect->width == 0 ) || ( rect->height == 0 ) || ( (wnd->flags & CONTENTS_INVALID) == 0 ) ) {
        return( false );
    }
    coord.x = rect->x;
    coord.y = rect->y;
    GUIScaleToScreenR( &coord );
    area.col = coord.x;
    area.row = coord.y;
    coord.x = rect->width;
    coord.y = rect->height;
    GUIScaleToScreenR( &coord );
    area.width = coord.x;
    area.height = coord.y;
    if( AdjustRect( wnd, &area ) ) {
        if( fill ) {
            uivfill( &wnd->screen, area, wnd->colours[attr], draw_char );
        }
        if( outline ) {
            uidrawbox( &wnd->screen, &area, wnd->colours[attr], NULL );
        }
    }
    return( true );
}
Exemplo n.º 3
0
static void print_field( VSCREEN *vs, VFIELD *field, unsigned current )
{
    SAREA               *area;
    char                *str;
    ATTR                attr;
    ATTR                hotattr;
    char                ctrlbuf[CTRL_BUF_LEN+1];
    unsigned            length = 0;
    a_check             *check = NULL;
    a_radio             *radio = NULL;
    a_list              *list;
    a_combo_box         *combo;
    a_hot_spot          *hotspot;
    an_edit_control     *edit;
    VSCREEN             *c_vs;
    SAREA               c_area;
    bool                use_hottext;
    char                hotkey;

    if( field == NULL ) return;
    area = &field->area;
    str = NULL;
    use_hottext = FALSE;
    memset( ctrlbuf, '\0', CTRL_BUF_LEN+1 );

    attr = UIData->attrs[ current ? ATTR_CURR_EDIT : ATTR_EDIT ];

    switch( field->typ ) {
    case FLD_HOT :
        hotspot = field->ptr;
        if( current ) {
            hotspot->flags |= HOT_CURRENT ;
        } else {
            hotspot->flags &= (~HOT_CURRENT);
        }
        hotspot->flags |= uihotspot( vs, hotspot->str,
                            &field->area, hotspot->flags );
        return;                     // don't want to print anything
    case FLD_TEXT :
        attr = UIData->attrs[ ATTR_NORMAL ];
        str  = field->ptr;
        break;
    case FLD_LABEL :
        attr = UIData->attrs[ ATTR_NORMAL ];
        strcpy( ctrlbuf, (char *)field->ptr );
        strcat( ctrlbuf, ":" );
        length = area->width;
        break;
    case FLD_FRAME :
        uidrawbox( vs, area, UIData->attrs[ ATTR_NORMAL ], field->ptr );
        return;
    case FLD_EDIT :
    case FLD_INVISIBLE_EDIT :
        edit = field->ptr;
        if( edit->buffer != NULL ) {
            length = edit->length;
            if( length > CTRL_BUF_LEN )
                length = CTRL_BUF_LEN;
            if( length > area->width ) {
                length = area->width;
            }
            if( field->typ == FLD_INVISIBLE_EDIT ) {
                memset( ctrlbuf, '*', length );
            } else {
                strncpy( ctrlbuf, edit->buffer, length );
            }
        } else {
            length = 0;
        }
        break;
    case FLD_COMBOBOX :
        combo = field->ptr;
        edit  = &combo->edit;
        list  = &combo->list;

        if( combo->perm == FALSE ) {
            ctrlbuf[0] = UiGChar[ UI_ARROW_DOWN ];  /* JBS was 25 */
            uivtextput( vs, area->row, area->col + area->width + 1,
                        UIData->attrs[ ATTR_SCROLL_ICON ], ctrlbuf, 1 );
            ctrlbuf[0] = '\0';
        }
        if( edit->buffer != NULL ) {
            length = edit->length;
            if( length > CTRL_BUF_LEN )
                length = CTRL_BUF_LEN;
            strncpy( ctrlbuf, edit->buffer, length );
        } else {
            length = 0;
        }
        if( list->get == NULL ) {
            list->get = ( bool (*) ( void *, unsigned, char *, unsigned ) )
                            uigetlistelement;
        }
        if( list->box == NULL  &&  combo->perm == TRUE ) {
            c_area = *area;
            c_area.row += vs->area.row + 2;
            c_area.col += vs->area.col + 1;
            c_vs = uiopen( &c_area, NULL, V_DIALOGUE | V_LISTBOX );
            if( c_vs == NULL ) {
                break;
            }
            c_area.row = 0;
            c_area.col = 0;
            list->box = uibeglistbox( c_vs, &c_area, list );
        }
        break;
    case FLD_PULLDOWN :
        list = field->ptr;
        ctrlbuf[0] = UiGChar[ UI_ARROW_DOWN ];  /* JBS was 25 */
        uivtextput( vs, area->row, area->col + area->width,
                    UIData->attrs[ ATTR_SCROLL_ICON ], ctrlbuf, 1 );
        ctrlbuf[0] = '\0';
        if( list->get == NULL ) {
            list->get = ( bool (*) ( void *, unsigned, char *, unsigned ) )
                                uigetlistelement;
        }
        (*list->get)( list->data, list->choice, ctrlbuf, area->width );
        length = area->width;
        break;
    case FLD_LISTBOX:
    case FLD_EDIT_MLE:
        list = field->ptr;
        if( list->box == NULL ) {
            c_area = *area;
            c_area.row += ((VSCREEN *)vs)->area.row;
            c_area.col += ((VSCREEN *)vs)->area.col;
            c_vs = uiopen( &c_area, NULL, V_DIALOGUE | V_LISTBOX );
            if( c_vs == NULL ) {
                break;
            }
            c_area.row = 0;
            c_area.col = 0;
            list->box = uibeglistbox( c_vs, &c_area, list );
        }
        return;
    case FLD_CHECK:
        attr = UIData->attrs[ current ? ATTR_CURR_EDIT : ATTR_NORMAL ];
        check = field->ptr;

        ctrlbuf[0] = UiGChar[ UI_CHECKBOX_LEFT ];
        if( _checked( check ) ) {
            ctrlbuf[1] = UiGChar[ UI_CHECKBOX_FULL ];
        } else {
            ctrlbuf[1] = UiGChar[ UI_CHECKBOX_EMPTY ];
        }
        ctrlbuf[2] = UiGChar[ UI_CHECKBOX_RIGHT ];
        ctrlbuf[3] = ' ';

        strncat( ctrlbuf, check->str, CTRL_BUF_LEN - 4 );
        length = strlen( ctrlbuf );
        use_hottext = TRUE;
        break;
    case FLD_RADIO:
        attr = UIData->attrs[ current ? ATTR_CURR_EDIT : ATTR_NORMAL ];
        radio = field->ptr;

        ctrlbuf[0] = UiGChar[ UI_RADIO_LEFT ];
        if( radio->value == radio->group->value ) {
            ctrlbuf[1] = UiGChar[ UI_RADIO_FULL ];
        } else {
            ctrlbuf[1] = UiGChar[ UI_RADIO_EMPTY ];
        }
        ctrlbuf[2] = UiGChar[ UI_RADIO_RIGHT ];
        ctrlbuf[3] = ' ';

        strncat( ctrlbuf, radio->str, CTRL_BUF_LEN - 4 );
        length = strlen( ctrlbuf );
        use_hottext = TRUE;
        break;
    }
    if( str != NULL ) {
        uivtextput( vs, area->row, area->col, attr, str, area->width );
    } else if( use_hottext ) {
        if( current ) {
            hotattr = attr;
        } else {
            hotattr = UIData->attrs[ ATTR_RADIO_HOTSPOT ];
        }
        hotkey = uidrawhottext( vs, ctrlbuf, area, attr, hotattr, FALSE, FALSE, FALSE );
        if( field->typ == FLD_CHECK ) {
            check->hotkey = hotkey;
        } else if( field->typ == FLD_RADIO ) {
            radio->hotkey = hotkey;
        }
    } else {
        uitextfield( vs, area->row, area->col, area->width, attr,
                     ctrlbuf, length );
    }
}
Exemplo n.º 4
0
static void print_field( VSCREEN *vs, VFIELD *field, bool current )
{
    SAREA               *area;
    ATTR                attr;
    ATTR                hotattr;
    char                ctrlbuf[CTRL_BUF_LEN + 1];
    unsigned            ctrlbuf_len = 0;
    a_check             *check = NULL;
    a_radio             *radio = NULL;
    a_list              *list;
    a_combo_box         *combo;
    an_edit_control     *edit;
    VSCREEN             *c_vs;
    SAREA               c_area;
    bool                use_hottext;
    char                hotkey;
    UIPICKGETTEXT       *fn_get;

    if( field == NULL )
        return;
    area = &field->area;
    use_hottext = false;
    memset( ctrlbuf, '\0', CTRL_BUF_LEN + 1 );

    attr = UIData->attrs[( current ) ? ATTR_CURR_EDIT : ATTR_EDIT];

    switch( field->typ ) {
    case FLD_HOT :
        if( current ) {
            field->u.hs->flags |= HOT_CURRENT ;
        } else {
            field->u.hs->flags &= (~HOT_CURRENT);
        }
        uidisplayhotspot( vs, field );
        return;
    case FLD_TEXT :
        attr = UIData->attrs[ATTR_NORMAL];
        uivtextput( vs, area->row, area->col, attr, field->u.str, area->width );
        uirefresh();
        return;
    case FLD_LABEL :
        attr = UIData->attrs[ATTR_NORMAL];
        strcpy( ctrlbuf, field->u.str );
        strcat( ctrlbuf, ":" );
        ctrlbuf_len = strlen( ctrlbuf );
        break;
    case FLD_FRAME :
        uidrawbox( vs, area, UIData->attrs[ATTR_NORMAL], field->u.str );
        return;
    case FLD_EDIT :
    case FLD_INVISIBLE_EDIT :
        edit = field->u.edit;
        if( edit->buffer != NULL ) {
            ctrlbuf_len = edit->length;
            if( ctrlbuf_len > CTRL_BUF_LEN )
                ctrlbuf_len = CTRL_BUF_LEN;
            if( field->typ == FLD_INVISIBLE_EDIT ) {
                memset( ctrlbuf, '*', ctrlbuf_len );
            } else {
                strncpy( ctrlbuf, edit->buffer, ctrlbuf_len );
            }
        } else {
            ctrlbuf_len = 0;
        }
        break;
    case FLD_COMBOBOX :
        combo = field->u.combo;
        edit  = &combo->edit;
        list  = &combo->list;

        if( !combo->perm ) {
            ctrlbuf[0] = UiGChar[UI_ARROW_DOWN];
            uivtextput( vs, area->row, area->col + area->width + 1,
                        UIData->attrs[ATTR_SCROLL_ICON], ctrlbuf, 1 );
            ctrlbuf[0] = '\0';
        }
        if( edit->buffer != NULL ) {
            ctrlbuf_len = edit->length;
            if( ctrlbuf_len > CTRL_BUF_LEN )
                ctrlbuf_len = CTRL_BUF_LEN;
            strncpy( ctrlbuf, edit->buffer, ctrlbuf_len );
        } else {
            ctrlbuf_len = 0;
        }
        if( list->box == NULL && combo->perm ) {
            c_area = *area;
            c_area.row += vs->area.row + 2;
            c_area.col += vs->area.col + 1;
            c_vs = uiopen( &c_area, NULL, V_DIALOGUE | V_LISTBOX );
            if( c_vs == NULL ) {
                break;
            }
            c_area.row = 0;
            c_area.col = 0;
            list->box = uibeglistbox( c_vs, &c_area, list );
        }
        break;
    case FLD_PULLDOWN :
        list = field->u.list;
        ctrlbuf[0] = UiGChar[UI_ARROW_DOWN];
        uivtextput( vs, area->row, area->col + area->width,
                    UIData->attrs[ATTR_SCROLL_ICON], ctrlbuf, 1 );
        ctrlbuf[0] = '\0';
        fn_get = list->get;
        if( fn_get == NULL )
            fn_get = uigetlistelement;
        (*fn_get)( list->data_handle, list->choice, ctrlbuf, CTRL_BUF_LEN );
        /* ctrlbuf does not have to be null terminated */
        /* terminate it at maximum length */
        ctrlbuf[CTRL_BUF_LEN] = '\0';
        ctrlbuf_len = strlen( ctrlbuf );
        break;
    case FLD_LISTBOX:
    case FLD_EDIT_MLE:
        list = field->u.list;
        if( list->box == NULL ) {
            c_area = *area;
            c_area.row += ((VSCREEN *)vs)->area.row;
            c_area.col += ((VSCREEN *)vs)->area.col;
            c_vs = uiopen( &c_area, NULL, V_DIALOGUE | V_LISTBOX );
            if( c_vs == NULL ) {
                break;
            }
            c_area.row = 0;
            c_area.col = 0;
            list->box = uibeglistbox( c_vs, &c_area, list );
        }
        return;
    case FLD_CHECK:
        /* ctrlbuf must be null terminated for this case */
        use_hottext = true;
        attr = UIData->attrs[( current ) ? ATTR_CURR_EDIT : ATTR_NORMAL];
        check = field->u.check;

        ctrlbuf[0] = CHECKBOX_CHAR( LEFT );
        if( _checked( check ) ) {
            ctrlbuf[1] = CHECKBOX_CHAR( FULL );
        } else {
            ctrlbuf[1] = CHECKBOX_CHAR( EMPTY );
        }
        ctrlbuf[2] = CHECKBOX_CHAR( RIGHT );
        ctrlbuf[3] = ' ';

        strncat( ctrlbuf, check->str, CTRL_BUF_LEN - 4 );
        break;
    case FLD_RADIO:
        /* ctrlbuf must be null terminated for this case */
        use_hottext = true;
        attr = UIData->attrs[( current ) ? ATTR_CURR_EDIT : ATTR_NORMAL];
        radio = field->u.radio;

        ctrlbuf[0] = RADIO_CHAR( LEFT );
        if( radio->value == radio->group->value ) {
            ctrlbuf[1] = RADIO_CHAR( FULL );
        } else {
            ctrlbuf[1] = RADIO_CHAR( EMPTY );
        }
        ctrlbuf[2] = RADIO_CHAR( RIGHT );
        ctrlbuf[3] = ' ';

        strncat( ctrlbuf, radio->str, CTRL_BUF_LEN - 4 );
        break;
    }
    if( use_hottext ) {
        if( current ) {
            hotattr = attr;
        } else {
            hotattr = UIData->attrs[ATTR_RADIO_HOTSPOT];
        }
        hotkey = uidrawhottext( vs, ctrlbuf, area, attr, hotattr, false, false, false );
        if( field->typ == FLD_CHECK ) {
            check->hotkey = hotkey;
        } else if( field->typ == FLD_RADIO ) {
            radio->hotkey = hotkey;
        }
    } else {
        uitextfield( vs, area->row, area->col, area->width, attr, ctrlbuf, ctrlbuf_len );
    }
}