示例#1
0
static void drawgadget( p_gadget g )
{
    int                 i;
    int                 length;

    uiunprotect( g->win );
    length = g->end - g->start - 1;
    for( i=g->start; i <= g->end; ++i ){
        if( g->dir == VERTICAL ) {
            uivtextput( g->win, row(g,i), col(g,i), _ATTR, VertScrollFrame, 0 );
        } else {
            uivtextput( g->win, row(g,i), col(g,i), _ATTR, HorzScrollFrame, 0 );
        }
    }
    /* don't draw scroll thumb in g->total_size <= page_size */
    if( ( g->total_size > g->page_size ) && ( length > 1 ) ) {
        if( g->dir == HORIZONTAL ) {
            uivtextput( g->win, g->anchor, g->linear, _ATTR_SLIDER, SliderChar, 0 );
        } else {
            uivtextput( g->win, g->linear, g->anchor, _ATTR_SLIDER, SliderChar, 0 );
        }
    }
    if( g->dir == HORIZONTAL ){
        uivtextput( g->win, g->anchor, g->start, _ATTR, LeftPoint, 0 );
        uivtextput( g->win, g->anchor, g->end, _ATTR, RightPoint, 0 );
    } else {
        uivtextput( g->win, g->start, g->anchor, _ATTR, UpPoint, 0 );
        uivtextput( g->win, g->end, g->anchor, _ATTR, DownPoint, 0 );
    }
    uiprotect( g->win );
}
示例#2
0
void uidrawbox( VSCREEN *vs, SAREA *area, ATTR attr, const char *title )
/**********************************************************************/
{
    int         length;
    int         col;

    if( area->width < 2 ) {
        return;
    }

    drawbox( &(vs->window.type.buffer), *area, (char *)&UiGChar[ UI_SBOX_TOP_LEFT ],
             attr, FALSE );

    if( title == NULL ) {
        return;
    }

    length = strlen( title );
    col = area->col + 1;

    if( length >= area->width - 2 ) {
        length = area->width;
    }

    uivtextput( vs, area->row, col, attr, title, length );
}
示例#3
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 );
    }
}
示例#4
0
static void open( void )
/**********************/
{
    ui_event    ui_ev;

    if( uivopen( &opwin ) ) {
        uipushlist( oplist );
        uivtextput( &opwin, 1, 2, UIData->attrs[ATTR_NORMAL], "Enter file name.", 16 );
        inputline.attr = UIData->attrs[ATTR_EDIT];
        /* blank out the buffer */
        inputline.index = 0;
        inputline.scroll = 0;
        inputline.update = true;
        for( ;; ) {
            ui_ev = uiveditline( &opwin, &inputline );
            if( ui_ev != EV_NO_EVENT ) {
                break;
            }
        }
        if( ui_ev == EV_ENTER ) {
            /* open file */
        } else if( ui_ev == EV_ESCAPE ) {
            /* do nothing */
        } else {
            /* must be an event handled in the mainline */
            uiungetevent();
        }
        uipoplist( /* oplist */ );
        uivclose( &opwin );
    }
}
示例#5
0
static EVENT setfield( VSCREEN *vptr, VFIELDEDIT *header, VFIELD *cur, ORD col )
/*********************************************/
{
    register    EVENT                   ev;
    register    VFIELD*                 prev;

    if( cur != header->curfield ) {
        prev = header->curfield;
        if( prev ) {
            /* change attribute on field being left */
            uivtextput( vptr, prev->row, prev->col, header->exit,
                header->buffer, prev->length );
        }
        header->prevfield = prev;
        header->curfield = cur;
        header->fieldpending = true;
        ev = EV_FIELD_CHANGE;
    } else {
        ev = EV_NO_EVENT;
    }
    if( cur != NULL ) {
        vptr->row = cur->row;
        vptr->col = cur->col + col;
    }
    return( ev );
}
示例#6
0
static void putline( char *buffer, int line )
{
    int                 i;
    int                 start;

    helpScreen.col = 0;
    i = 0;
    while( buffer[i] && helpScreen.col < helpScreen.area.width ) {
        start = i;
        while( buffer[i] && buffer[i] != HELP_ESCAPE &&
               helpScreen.col+i-start<=helpScreen.area.width ) {
            if( (unsigned char)buffer[i] == 0xFF )
                buffer[i] = 0x20;
            ++i;
        }
        if( i - start > 0 ) {
            uivtextput( &helpScreen, line, helpScreen.col, currentAttr, &buffer[start], i - start );
        }
        helpScreen.col += i-start;
        if( buffer[i] == HELP_ESCAPE ) {
            switch( buffer[i+1] ) {
            case H_UNDERLINE:
                currentColour |= C_ULINE;
                ++i;
                break;
            case H_UNDERLINE_END:
                currentColour &= ~C_ULINE;
                ++i;
                break;
            case H_BOLD:
                currentColour |= C_BOLD;
                ++i;
                break;
            case H_BOLD_END:
                currentColour &= ~C_BOLD;
                ++i;
                break;
            }
            ++i;
            switch( currentColour ) {
            case C_PLAIN:
                currentAttr = AT( ATTR_NORMAL );
                break;
            case C_ULINE:
                currentAttr = AT( ATTR_BRIGHT );
                break;
            case C_BOLD:
                currentAttr = AT( ATTR_BRIGHT );
                break;
            case C_ULBOLD:
                currentAttr = AT( ATTR_BRIGHT );
                break;
            }
        }
    }
}
示例#7
0
void uicntrtext( VSCREEN *vs, SAREA *area, ATTR attr, unsigned field_len, const char *text )
/******************************************************************************************/
{
    ORD                 col;

    if( field_len > 0 ) {
        col = area->col;
        if( field_len < area->width ) {
            col += ( area->width - field_len ) / 2;
        } else {
            field_len = area->width;
        }
        uivtextput( vs, area->row, col, attr, text, field_len );
    }
}
示例#8
0
void uidrawbox( VSCREEN *vs, SAREA *area, ATTR attr, const char *title )
/**********************************************************************/
{
    uisize      field_len;

    if( area->width > 1 ) {
        drawbox( &(vs->window.type.buffer), *area, SBOX_CHARS(), attr, false );
        if( title != NULL ) {
            field_len = strlen( title );
            if( field_len > area->width - 2 ) {
                field_len = area->width - 2;
            }
            uivtextput( vs, area->row, area->col + 1, attr, title, field_len );
        }
    }
}
示例#9
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 );
    }
}
示例#10
0
void main( void )
/***************/
{
    ui_event            ui_ev;
    SAREA               area;
    char                buff[80];
    an_event_string     *ptr;
    ORD                 evrow = TOP_ROW;
    int                 mrow, mcol;
    int                 diff;

    if( uistart() ) {
#ifdef CHARMAP
        uiinitgmouse( INIT_MOUSE_INITIALIZED ); /* the 0=mouseless,1=mouse,2=initialized mouse */
//      uivgaattrs();
        FlipCharacterMap();
#else
        initmouse( INIT_MOUSE_INITIALIZED );
#endif
        uimenus( barmenu, pulldownuimenus, EV_F1 );
        UIData->mouse_clk_delay = uiclockdelay( 250  /* ms */ );
        UIData->tick_delay      = uiclockdelay( 3000 /* ms */ );
        mainwin.area.height = UIData->height - 7;
        if( uivopen( &mainwin ) ) {
            for( ;; ) {
                uipushlist( evlist );
                ui_ev = uivgetevent( &mainwin );
                uipoplist( /* evlist */ );
                if( ui_ev == EV_MOUSE_PRESS_R ) {
                    uimousepos( NULL, &mrow, &mcol );
                    mrow++;
                    mcol++;
                    uipushlist( evlist );
                    ui_ev = uicreatepopup( mrow, mcol, filemenu, false, true, EV_NO_EVENT );
                    uipoplist( /* evlist */ );
                }
                switch( ui_ev ) {
                case EV_QUIT:
                    break;
                case EV_BACKGROUND_RESIZE:
                    uivclose( &mainwin );
                    mainwin.area.height = UIData->height - 7;
                    uivopen( &mainwin );
                    if( evrow > mainwin.area.height ) {
                        evrow = TOP_ROW;
                    }
                    break;
                case EV_SAMPLE_DIALOG:
                    sample_dialog();
                    break;
                case EV_OPEN:
                    open();
                    break;
                case EV_GO:
                    uispawnstart();
                    uiblankscreen();
                    printf( "Type exit to return\n" );
#if defined( __QNX__ ) || defined( __UNIX__ )
                    system( "" );
#elif defined( __WINDOWS__ )
                    // do nothing
#else
                    {
                        const char  *command;

                        command = getenv( "COMSPEC" );
                        if( command == NULL ) {
                            command = "c:\\command.com";
                        }
                        system( command );
                    }
#endif
                    uispawnend();
//                      uibackground( "wf.img" );
                    area.row = 0;
                    area.col = 0;
                    area.height = UIData->height;
                    area.width = UIData->width;
                    uidirty( area );
                    break;
                case EV_F1:
                    area.width = 10;
                    area.height = 10;
                    area.row = 1;
                    area.col = 1;
                    uivattribute( &mainwin, area, (ATTR) 1 );
                    break;
                }
                if( ui_ev == EV_QUIT ) {
                    break;
                } else if( ui_ev != EV_NO_EVENT ) {
                    for( ptr = evstrs; ; ++ptr ) {
                        if( ptr->ui_ev == EV_NO_EVENT ) {
                            sprintf( buff, "event 0x%4.4x", ui_ev );
                            break;
                        } else if( ptr->ui_ev == ui_ev ) {
                            sprintf( buff, "event 0x%4.4x (%s)", ui_ev, ptr->str );
                            break;
                        }
                    }
                    uivtextput( &mainwin, evrow, 2, UIData->attrs[ATTR_NORMAL], buff, 40 );
                    if( ++evrow >= mainwin.area.height ) {
                        evrow = TOP_ROW;
                    }
                    uivtextput( &mainwin, evrow, 2, UIData->attrs[ATTR_NORMAL], "", 40 );
                    switch( ui_ev ) {
                    case EV_MOUSE_PRESS:
                        BandOn = 1;
                        uimousepos( NULL, &mrow, &mcol );
                        BandArea.row = mrow;
                        BandArea.col = mcol;
                        BandArea.width = 0;
                        BandArea.height = 0;
                        uibandinit( BandArea, UIData->attrs[ATTR_ACTIVE] );
                        break;
                    case EV_MOUSE_DRAG:
                        if( BandOn ) {
                            uimousepos( NULL, &mrow, &mcol );
                            diff = mcol - BandArea.col;
                            if( diff < 0 )
                                diff = 0;
                            BandArea.width = diff;
                            diff = mrow - BandArea.row;
                            if( diff < 0 )
                                diff = 0;
                            BandArea.height = diff;
                            uibandmove( BandArea );
                        }
                        break;
                    case EV_MOUSE_RELEASE:
                        if( BandOn )
                            uibandfini();
                        BandOn = 0;
                        break;
                    }
                }
            }
            uivclose( &mainwin );
        }
        uinomenus();
        uiswap();
        uirestorebackground();  /* must be after uiswap */
#ifdef CHARMAP
        FlipCharacterMap();
        uifinigmouse();
#else
        finimouse();
#endif
        uistop();
    }
}
示例#11
0
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
                    LPSTR lpCmdLine, int nShowCmd ) {

    EVENT               ev;
    SAREA               area;
    char                buff[80];
    an_event_string     *ptr;
    ORD                 evrow = TOP_ROW;
    BOOL                fixup = FALSE;
    int                 mrow, mcol;
    int                 diff;

    hInstance = hInstance;
    hPrevInstance = hPrevInstance;
    lpCmdLine = lpCmdLine;
    nShowCmd = nShowCmd;
    if( InitSwapper() ) return( 0 ); // Yes - well, I would make the swapper
                                     // return 1 on error, unlike everything
                                     // else, wouldn't I?
    if( !uistart() ) return( 0 );
    ToCharacter();

    initmouse( 2 );
    uimenus( barmenu, pulldownuimenus, EV_FUNC( 1 ) );
    UIData->mouse_clk_delay = uiclockdelay( 250 );
    UIData->tick_delay = uiclockdelay( 3000 );
    mainwin.area.height = UIData->height - 7;

    area.row = 0;
    area.col = 0;
    area.width = UIData->width;
    area.height = UIData->height;
    uidirty( area );
    uirefresh();

    if( uivopen( &mainwin ) ) {
        uirefresh();
        sprintf( buff, "screen height : %d\0", UIData->height );
        uivtextput( &mainwin, TOP_ROW - 1, 2,
                  UIData->attrs[ ATTR_NORMAL ],
                  buff, 30 );
        for( ; ; ) {
            uipushlist( evlist );
            ev = uivgetevent( NULL );
            uipoplist();
            if( ev == EV_QUIT ) break;
            if( ev == EV_ALT_R ) break;
            if( ev == EV_MOUSE_PRESS_R ) {
                uimousepos( NULL, &mrow, &mcol );
                mrow++;
                mcol++;
                uipushlist( evlist );
                ev = uicreatepopup( mrow, mcol, &filemenu, FALSE, TRUE, NULL );
                uipoplist();
            }
            switch ( ev ) {
                case EV_SAMPLE_DIALOG:
                    sample_dialog();
                    break;
                case EV_OPEN:
                    open();
                    break;
                case EV_FUNC(1):
                    area.width = 10;
                    area.height = 10;
                    area.row = 1;
                    area.col = 1;
                    uivattribute( &mainwin, area, (ATTR) 1 );
                    break;
                case EV_CURSOR_RIGHT:
                    mainwin.col++;
                    if( mainwin.col >= mainwin.area.width ) mainwin.col--;
                    fixup = TRUE;
                    break;
                case EV_CURSOR_DOWN:
                    mainwin.row++;
                    if( mainwin.row >= mainwin.area.height ) mainwin.row--;
                    fixup = TRUE;
                    break;
                case EV_CURSOR_LEFT:
                    if( mainwin.col > 0 ) {
                        mainwin.col--;
                        fixup = TRUE;
                    }
                    break;
                case EV_CURSOR_UP:
                    if( mainwin.row > 0 ) {
                        mainwin.row--;
                        fixup = TRUE;
                    }
                    break;
            }
            if( fixup ) {
                fixup = FALSE;
                uivsetcursor( &mainwin );
            }
            if( ev != EV_NO_EVENT ) {
                for( ptr=evstrs; ; ++ptr ){
                    if( ptr->ev == EV_NO_EVENT ) {
                        sprintf( buff, "event 0x%4.4x", ev );
                        break;
                    } else if( ptr->ev == ev ) {
                        strcpy( buff, ptr->str );
                        break;
                    }
                }
                uivtextput( &mainwin, evrow, 2,
                          UIData->attrs[ ATTR_NORMAL ],
                          buff, 30 );
                if( ++evrow >= mainwin.area.height ){
                    evrow = TOP_ROW;
                }
                uivtextput( &mainwin, evrow, 2,
                          UIData->attrs[ ATTR_NORMAL ],
                          "", 30 );
                switch( ev ) {
                case EV_MOUSE_PRESS:
                    BandOn = 1;
                    uimousepos( NULL, &mrow, &mcol );
                    BandArea.row = mrow;
                    BandArea.col = mcol;
                    BandArea.width = 0;
                    BandArea.height = 0;
                    uibandinit( BandArea, UIData->attrs[ ATTR_ACTIVE ] );
                    break;
                case EV_MOUSE_DRAG:
                    if( BandOn ) {
                        uimousepos( NULL, &mrow, &mcol );
                        diff = mcol - BandArea.col;
                        if( diff < 0 ) diff = 0;
                        BandArea.width = diff;
                        diff = mrow - BandArea.row;
                        if( diff < 0 ) diff = 0;
                        BandArea.height = diff;
                        uibandmove( BandArea );
                    }
                    break;
                case EV_MOUSE_RELEASE:
                    if( BandOn ) uibandfini();
                    BandOn = 0;
                    break;
                }
            }
        }
        uivclose( &mainwin );
    }
    uinomenus();
    uiswap();
    uirestorebackground();      /* must be after uiswap */
    finimouse();
    ToGraphical();
    uistop();
    FiniSwapper();
    return( 0 );
}
示例#12
0
EVENT UIAPI uivfieldedit( VSCREEN *vptr, VFIELDEDIT *header )
/************************************************************/
{
    register    EVENT                   ev;
    register    VFIELD*                 cur;
    auto        VBUFFER                 buffer;
    auto        SAREA                   area;

    if( header->reset ) {
        header->reset = false;
        header->prevfield = NULL;
        header->curfield = NULL;
        header->cursor = true;
        area.height = 1;
        for( cur = header->fieldlist ; cur != NULL ; cur = cur->link ) {
            area.row = cur->row;
            area.col = cur->col;
            area.width = cur->length;
            uivattribute( vptr, area, header->exit );
        }
    }
    if( header->cursor ) {
        header->cursor = false;
        header->delpending = false;
        header->fieldpending = false;
        header->cancel = false;
        if( vptr->cursor == C_OFF ) {
            vptr->cursor = C_NORMAL;
        }
        return( movecursor( vptr, header, vptr->row, vptr->col ) );
    }
    if( header->fieldpending ) {
        header->update = true;
        if( header->cancel ) {
            header->cancel = false;
            header->curfield = NULL;
            setfield( vptr, header, header->prevfield, 0 );
        }
        header->fieldpending = false;
    }
    cur = header->curfield;
    if( header->update ) {
        header->update = false;
        if( cur ) {     /* this should always be non-NULL */
            uipadblanks( header->buffer, cur->length );
            if( header->delpending ) {
                buffer.content = header->buffer;
                buffer.length = cur->length;
                buffer.index = vptr->col - cur->col;
                uieditevent( EV_DELETE, &buffer );
                header->dirty = true;
                header->delpending = false;
            }
            uivtextput( vptr, cur->row, cur->col, header->enter,
                    header->buffer, cur->length );
        }
    }
    if( header->oktomodify ) {
        uipushlist( livefieldevents );
    } else {
        uipushlist( deadfieldevents );
    }
    ev = uivgetevent( vptr );
    if( ev > EV_NO_EVENT ) {
        if( uiintoplist( ev ) ) {
            if( cur ) {
                buffer.content = header->buffer;
                buffer.length = cur->length;
                buffer.index = vptr->col - cur->col;
                buffer.insert = ( vptr->cursor == C_INSERT );
                buffer.dirty = false;
                uieditevent( ev, &buffer );
                header->dirty |= buffer.dirty;
            }
            switch( ev ) {
            case EV_HOME:
                if( cur != NULL ) break; /* home is within field */
                /* WARNING: this case falls through to the next */
            case EV_TAB_FORWARD:
            case EV_TAB_BACKWARD:
                cur = tabfield( vptr, header->fieldlist, ev == EV_TAB_FORWARD );
                /* WARNING: the EV_HOME case falls through */
                if( cur != NULL ) {
                    ev = setfield( vptr, header, cur, 0 );
                    cur = NULL; /* kludge - avoid calling movecursor */
                }
                break;
            case EV_INSERT:
                if( vptr->cursor == C_INSERT ) {
                    vptr->cursor = C_NORMAL ;
                } else {
                    vptr->cursor = C_INSERT ;
                }
                break;
            case EV_CURSOR_UP:
                ev = movecursor( vptr, header, vptr->row - 1, vptr->col );
                break;
            case EV_CURSOR_DOWN:
                ev = movecursor( vptr, header, vptr->row + 1, vptr->col );
                break;
            case EV_RUB_OUT:
                header->delpending = true;
                /* WARNING: this case falls through to the next !!!! */
            case EV_CURSOR_LEFT:
                if( cur ) {
                    if( vptr->col > cur->col ) {
                        break; /* cursor movement within field */
                    }
                }
                ev = movecursor( vptr, header, vptr->row, vptr->col - 1 );
                break;
            case EV_CURSOR_RIGHT:
            case ' ':
                if( header->curfield ) {
                    if( vptr->col < cur->col + cur->length - 1 ) {
                        break; /* cursor movement within field */
                    }
                }
                ev = movecursor( vptr, header, vptr->row, vptr->col + 1 );
                break;
            }
            if( ev != EV_FIELD_CHANGE ) {
                if( cur ) {
                    ev = movecursor( vptr, header,
                           vptr->row, cur->col + buffer.index );
                    if( buffer.dirty && ( ev == EV_NO_EVENT ) ) {
                        uivtextput( vptr, cur->row, cur->col, header->enter,
                            header->buffer, cur->length );
                    }
                } else {
                    ev = EV_NO_EVENT;
                }
                header->delpending = false;
            }
        }
    }
    uipoplist();
    return( ev );
}
示例#13
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 );
    }
}
示例#14
0
void GUIXDrawText( gui_window *wnd, const char *text, size_t length, gui_coord *in_pos,
                  gui_attr attr, gui_ord extentx, bool draw_extent )
{
    int         vscroll;        /* vertical scroll adjust amount */
    int         hscroll;        /* horizontal scroll adjust amount */
    size_t      my_length;      /* actual length of text (may be > length) */
    gui_coord   my_pos;         /* pos in screen coords */
    int         pos;            /* position to draw on VSCREEN */
    int         col;            /* index into string */
    gui_coord   extent;
    SAREA       area;
    int         width;
    int         frame_adjust;

    if( attr >= wnd->num_attrs ) {
        return;
    }
    if( !( wnd->style & GUI_VISIBLE ) ) {
         return;
    }

    if( wnd->style & GUI_NOFRAME ) {
        frame_adjust = 0;
    } else {
        frame_adjust = 1;
    }

    my_pos.x = in_pos->x;
    my_pos.y = in_pos->y;
    GUIScaleToScreenR( &my_pos );

    /* adjust for scrolling */
    vscroll = 0;
    if( ( wnd->vgadget != NULL ) && ( !GUI_VSCROLL_EVENTS_SET( wnd ) ) ) {
        vscroll += wnd->vgadget->pos;
    }
    hscroll = 0;
    if( ( wnd->hgadget != NULL ) && !GUI_HSCROLL_EVENTS_SET( wnd ) ) {
        hscroll += wnd->hgadget->pos;
    }

    if( ( my_pos.y - vscroll + frame_adjust ) < frame_adjust ) {
        /* row to draw is not visible with vertical scrolling */
        return;
    }

    if( text != NULL ) {
        my_length = strlen( text );
        if( my_length < length ) {
            length = my_length;
        }
    } else {
        my_length = 0;
    }

    /* if text shows even with scrolling */
    if( ( my_pos.x + length ) > hscroll ) {
        pos = frame_adjust;  /* position on VSCREEN */
        col = 0;             /* index into curr string */

        /* start of text in dirty region */
        if( ( ( wnd->dirty.col - 1 ) <= ( my_pos.x - hscroll ) ) &&
            ( my_pos.x >= hscroll ) ) {
            pos += ( my_pos.x - hscroll );
        } else {
            /* start of text to left of dirty region */
            pos += wnd->dirty.col - 1;
            if( my_pos.x < hscroll ) {
                /* start of text scrolled off screen */
                col    += ( hscroll - my_pos.x + wnd->dirty.col - 1 );
                length -= ( hscroll - my_pos.x + wnd->dirty.col - 1 );
            } else {
                /* start of text visible but to left of dirty region */
                col    += ( wnd->dirty.col  - 1 + hscroll - my_pos.x );
                length -= ( wnd->dirty.col  - 1 + hscroll - my_pos.x );
            }
        }
        /* should deal with decreasing length due to text off screen
            to right */
        if( ( length > 0 ) &&
            ( ( col - hscroll ) < ( wnd->dirty.col + wnd->dirty.width ) ) ) {
            if( ( pos + length ) > ( wnd->dirty.col + wnd->dirty.width ) ) {
                length = wnd->dirty.col + wnd->dirty.width - pos;
            }
            if( length > 0 ) {
                char        *p;
                const char  *cp;

                for( cp = text; cp < text+col; cp += GUICharLen( *cp ) ) ;
                if( cp != text + col ) {
                    p = alloca( length );
                    cp = memcpy( p, text+col, length );
                    p[0] = ' ';
                }
                uivtextput( &wnd->screen, my_pos.y - vscroll + frame_adjust,
                            pos, wnd->colours[attr], cp, length );
            } else {
                length = 0;
            }
        } else {
            length = 0;
        }
    } else {
        pos = -length + 1; /* so (pos+length) will be 1 for drawing extent */
    }
    if( draw_extent ) {
        if( extentx == GUI_NO_COLUMN ) {
            /* this is the most that will be covered.  It will be adjust for
               starting position and dirty rect */
            extentx = wnd->use.width;
        } else {
            /* record total width user wants to cover, adjusting for
             * portion not visible due to scrolling scrolling
             */
            extent.x = extentx + in_pos->x;
            GUIScaleToScreenR( &extent );
            extentx = extent.x - hscroll;
        }

        if( ( pos + length ) <= extentx ) {
            area.row = my_pos.y - vscroll + frame_adjust;
            area.height = 1;
            area.col = pos + length;
            /* adjust left border for dirty area */
            if( area.col < wnd->dirty.col ) {
                area.col = wnd->dirty.col;
            }
            width = extentx - area.col + 1;
            /* adjust right border for dirty area */
            if( ( area.col + width ) > ( wnd->dirty.col + wnd->dirty.width ) ) {
                width = wnd->dirty.width + wnd->dirty.col - area.col;
            }
            if( width > 0 )  {
                area.width = width;
                uivfill( &wnd->screen, area, wnd->colours[attr], ' ' );
            }
        }
    }
}