示例#1
0
EVENT global uiveditevent( VSCREEN *vptr, VEDITLINE *editline, EVENT ev )
/***********************************************************************/
{
    register    int                     scroll;
    register    bool                    scrollable;
    register    bool                    growing;
    auto        VBUFFER                 buffer;


    if( editline->update ) {
        if( vptr->cursor == C_OFF ) {
            vptr->cursor = C_NORMAL;
        }
        uipadblanks( editline->buffer, editline->length );
        vptr->row = editline->row;
        scroll = min( editline->scroll, editline->index );
        scroll = max( scroll, editline->index - editline->fldlen + 1 );
        editline->scroll = scroll;
        vptr->col = editline->col + editline->index - editline->scroll;
        echoline( vptr, editline );
//      uirefresh();                    not needed for QNX or DOS ??? jimg
        editline->update = FALSE;
    }
    if( ev > EV_NO_EVENT ) {
        if( uiinlist( ev ) == FALSE ) {
            growing = uiinlist( EV_BUFFER_FULL );
            scrollable = growing || ( editline->length > editline->fldlen );
            buffer.content = editline->buffer;
            buffer.length = editline->length;
            buffer.index = editline->index;
            buffer.insert = ( vptr->cursor == C_INSERT );
            buffer.dirty = FALSE;
            buffer.auto_clear = editline->auto_clear;
            ev = uieditevent( ev, &buffer );
            editline->auto_clear = buffer.auto_clear;
            editline->dirty |= buffer.dirty;
            editline->index = buffer.index;
            vptr->cursor = buffer.insert ? C_INSERT : C_NORMAL ;
            if( scrollable ) {
                scroll = min( editline->scroll, editline->index );
                scroll = max( scroll, editline->index - editline->fldlen + 1 );
            } else {
                scroll = 0;
            }
            vptr->col = editline->col + editline->index - scroll;
            if( ( scroll != editline->scroll ) || buffer.dirty ) {
                editline->scroll = scroll;
                echoline( vptr, editline );
            }
            if( ( editline->index == editline->length ) ||
                ( *(editline->buffer + editline->length - 1) != ' ' ) ) {
                if( growing ) {
                    ev = EV_BUFFER_FULL;   /* may clobber EV_BUMP_RIGHT */
                }
            }
//            if( ev != EV_NO_EVENT && !uiinlist( ev ) ) {   /* 891206 */
//                ev = EV_NO_EVENT;
//            }
        }
    }
    return( ev );
}
示例#2
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 );
}