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 ); }
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 ); }