Ejemplo n.º 1
0
void uipaintlistbox( a_list *list )
{
    ORD         i;
    char        *buf;
    bool        ok;
    int         length;
    ATTR        attr;

    if( list->box == NULL ) {
        return;
    }

    length = list->box->area.width + 1;
    buf = ( char * )uimalloc( length );

    for( i = 0 ; i < list->box->area.height ; ++i ) {
        attr = ATTR_NORMAL;
        if( list->box->row == i + list->box->line ) {
            attr = list->box->attr;
        }
        ok = (*list->get)( list->data, list->box->line + i, buf, length );
        if( ok ) {
            uitextfield( list->box->vs, list->box->area.row + i,
                         list->box->area.col, list->box->area.width,
                         UIData->attrs[ attr ], buf, strlen( buf ) );
        } else {
            break;
        }
    }
    for( ; i < list->box->area.height; ++i ) {
        uitextfield( list->box->vs, list->box->area.row + i,
                     list->box->area.col, list->box->area.width,
                     UIData->attrs[ ATTR_NORMAL ], "", 0 );
    }
    uifree( buf );
}
Ejemplo n.º 2
0
static void echoline( VSCREEN *vptr, VEDITLINE *editline )
/********************************************************/
{
    SAREA       area;
    unsigned    start;
    unsigned    trim;

    if( editline->invisible ) {
        area.row = editline->row;
        area.col = editline->col;
        area.height = 1;
        area.width = editline->fldlen;
        uivfill( vptr, area, editline->attr, ' ' );
        for( trim = editline->length ; trim > editline->index ; --trim ) {
            if( editline->buffer[ trim - 1 ] != ' ' ) break;
        }
        area.width = min( editline->fldlen, trim - editline->scroll );
        uivfill( vptr, area, editline->attr, '*' );
    } else {
        uitextfield( vptr, editline->row, editline->col, editline->fldlen,
            editline->attr,
            editline->buffer + editline->scroll,
            editline->length - editline->scroll );
    }
    if( editline->marking ) {
        area.row = editline->row;
        area.height = 1;
        if( editline->mark_anchor < editline->index ) {
            start = editline->mark_anchor;
            area.width = editline->index - editline->mark_anchor;
        } else {
            start = editline->index;
            area.width = editline->mark_anchor - editline->index;
        }
        if( area.width + start >= editline->scroll  &&  area.width > 0 ) {
            if( start > editline->scroll ) {
                area.col = editline->col + start - editline->scroll;
            } else {
                area.col = editline->col;
                area.width = area.width - editline->scroll + start;
            }
            if( area.width + area.col > editline->col + editline->fldlen ) {
                area.width =    editline->fldlen + editline->col - area.col;
            }
            uivattribute( vptr, area, editline->mark_attr );
        }
    }
}
Ejemplo 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 );
    }
}
Ejemplo 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 );
    }
}