filesel.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 793 行 · 第 1/2 页
C
793 行
}
} else {
*cln += amt;
if( amt < 0 ) {
if( *cln <= 0 ) {
while( *cln <= 0 ) {
*cln += endline;
}
*pagetop = *cln - text_lines+1;
drawbord = TRUE;
} else if( *cln < *pagetop ) {
*pagetop += amt;
drawbord = TRUE;
}
} else {
if( *cln <= endline ) {
if( *cln >= *pagetop+text_lines ) {
*pagetop += amt;
drawbord = TRUE;
}
} else {
while( *cln > endline ) {
*cln -= endline;
}
*pagetop = *cln - text_lines+1;
drawbord = TRUE;
}
}
}
if( *pagetop < 1 ) {
*pagetop = 1;
}
if( endline - *pagetop+1 < text_lines ) {
*pagetop = endline - text_lines+1;
drawbord = TRUE;
if( *pagetop < 1 ) {
*pagetop = 1;
}
}
return( drawbord );
} /* adjustCLN */
/*
* SelectLineInFile - select a line in a given file
*/
int SelectLineInFile( selflinedata *sfd )
{
int i,key=-1,rc=ERR_NO_ERR,winflag;
int leftcol=0,key2;
bool done=FALSE,redraw=TRUE;
bool hiflag=FALSE,drawbord=FALSE;
int farx,text_lines;
linenum pagetop=1,lln=1;
char tmp[MAX_STR],*ptr;
linenum cln;
linenum endline;
/*
* create the window
*/
cln = sfd->cln;
endline = sfd->f->fcb_tail->end_line;
farx = sfd->wi->x2;
if( sfd->show_lineno ) {
farx++;
}
if( sfd->hilite != NULL ) {
hiflag = TRUE;
}
i = NewWindow2( &cWin, sfd->wi );
if( i ) {
return( i );
}
if( !sfd->is_menu ) {
WindowAuxUpdate( cWin, WIND_INFO_HAS_SCROLL_GADGETS, TRUE );
DrawBorder( cWin );
}
oWin = sfd->eiw;
isMenu = sfd->is_menu;
PushMouseEventHandler( SelectLineMouseHandler );
KillCursor();
text_lines = WindowAuxInfo( cWin, WIND_INFO_TEXT_LINES );
sfd->sl = -1;
if( sfd->title != NULL ) {
WindowTitle( cWin, sfd->title );
}
pagetop = text_lines*(cln/text_lines);
if( cln % text_lines != 0 ) {
pagetop++;
}
key = 0;
if( LastEvent == VI_KEY( MOUSEEVENT ) ) {
DisplayMouse( TRUE );
}
/*
* now, allow free scrolling and selection
*/
while( !done ) {
if( redraw ) {
if( sfd->show_lineno ) {
MySprintf(tmp,"%l/%l", cln, endline );
i = sfd->wi->x2 - sfd->wi->x1;
WindowBorderData( cWin, tmp, i-strlen(tmp) );
drawbord = TRUE;
}
if( hiflag ) {
ptr = (char *) sfd->hilite;
ptr += 2*(cln-1);
if( ptr[0] == (char) -1 ) {
if( cln > lln ) {
cln++;
} else if( cln < lln ) {
cln--;
}
}
}
if( drawbord ) {
DrawBorder( cWin );
}
displayGenericLines( sfd->f, pagetop, leftcol, cln,
&(sfd->wi->hilight), sfd->hilite,
sfd->vals, sfd->valoff );
}
lln = cln;
redraw = TRUE;
drawbord = FALSE;
mouseLine = -1;
rlMenu = FALSE;
if( key == VI_KEY( MOUSEEVENT ) ) {
DisplayMouse( TRUE );
}
key = GetNextEvent( TRUE );
if( hiflag && ((key >= VI_KEY( ALT_A ) && key <= VI_KEY( ALT_Z ) )
|| (key >='a' && key <= 'z') ||
(key >= 'A' && key <= 'Z') ||
(key >= '1' && key <= '9') ) ) {
i = 0;
if( key >= VI_KEY( ALT_A ) && key <= VI_KEY( ALT_Z ) ) {
key2 = key - VI_KEY( ALT_A ) + 'A';
} else if( key >= 'a' && key <= 'z' ) {
key2 = key - 'a' + 'A';
} else {
key2 = key;
}
ptr = (char *) sfd->hilite;
while( ptr[0] != 0 ) {
if( toupper( ptr[0] ) == (char) key2 ) {
cln = i+1;
key = VI_KEY( ENTER );
break;
}
i++;
ptr += 2;
}
}
/*
* check if a return-event has been selected
*/
if( sfd->retevents != NULL ) {
i = 0;
if( key == VI_KEY( MOUSEEVENT ) ) {
if( mouseWin == oWin && LastMouseEvent == MOUSE_PRESS ) {
DisplayMouse( FALSE );
sfd->event = sfd->retevents[mouseLine];
key = VI_KEY( ENTER );
}
} else {
while( sfd->retevents[i] >= 0 ) {
if( key == sfd->retevents[i] ) {
sfd->event = key;
key = VI_KEY( ENTER );
break;
}
i++;
}
}
}
/*
* process key stroke
*/
switch( key ) {
case VI_KEY( MOUSEEVENT ):
DisplayMouse( FALSE );
if( hiflag ) {
ptr = (char *) sfd->hilite;
ptr += 2*(mouseLine);
if( ptr[0] == (char) -1 ) {
break;
}
}
if( rlMenu && sfd->allow_rl != NULL ) {
*(sfd->allow_rl) = rlMenuNum;
done = TRUE;
break;
}
if( mouseScroll != MS_NONE ) {
switch( mouseScroll ) {
case MS_UP: goto evil_up;
case MS_DOWN: goto evil_down;
case MS_PAGEUP: goto evil_pageup;
case MS_PAGEDOWN: goto evil_pagedown;
case MS_EXPOSEDOWN:
adjustCLN( &cln, &pagetop, pagetop+text_lines-cln-1,
endline, text_lines );
adjustCLN( &cln, &pagetop, 1, endline, text_lines );
drawbord = TRUE;
break;
case MS_EXPOSEUP:
adjustCLN( &cln, &pagetop, pagetop-cln, endline,
text_lines );
adjustCLN( &cln, &pagetop, -1, endline, text_lines );
drawbord = TRUE;
break;
}
break;
}
switch( LastMouseEvent ) {
case MOUSE_DRAG:
if( mouseWin != cWin ) {
break;
}
cln = mouseLine + pagetop;
break;
case MOUSE_RELEASE:
if( !sfd->is_menu ) {
break;
}
if( mouseWin == cWin ) {
cln = mouseLine + pagetop;
if( cln <= endline ) {
goto evil_enter;
}
}
break;
case MOUSE_DCLICK:
if( mouseWin != cWin ) {
AddCurrentMouseEvent();
done = TRUE;
} else {
cln = mouseLine + pagetop;
if( cln <= endline ) {
goto evil_enter;
}
}
break;
case MOUSE_PRESS_R:
if( mouseWin != cWin ) {
AddCurrentMouseEvent();
done = TRUE;
}
break;
case MOUSE_PRESS:
if( mouseWin != cWin ) {
AddCurrentMouseEvent();
done = TRUE;
} else {
cln = mouseLine + pagetop;
}
break;
}
break;
case VI_KEY( ESC ):
done = TRUE;
break;
evil_enter:
case VI_KEY( ENTER ):
case ' ':
/*
* see if we need to do a callback for this
*/
if( sfd->checkres != NULL ) {
line *cline;
fcb *cfcb;
char data[64];
i = cln-1;
GimmeLinePtr( cln, sfd->f, &cfcb, &cline );
strcpy( data,cline->data );
RemoveLeadingSpaces( data );
winflag = FALSE;
strcpy( tmp, sfd->vals[i] );
rc = sfd->checkres( data, tmp, &winflag );
if( winflag ) {
if( winflag == 2 ) {
winflag = TRUE;
} else {
winflag = FALSE;
}
}
if( winflag ) {
MoveWindowToFront( cWin );
}
if( !rc ) {
AddString2( &(sfd->vals[i]), tmp );
redraw = TRUE;
}
break;
/*
* no value window, so just return line selected
*/
} else {
if( isMenu && InvokeMenuHook( CurrentMenuNumber, cln ) == -1 ) {
break;
}
sfd->sl = cln;
done = TRUE;
}
break;
case VI_KEY( LEFT ):
case 'h':
if( sfd->allow_rl != NULL ) {
*(sfd->allow_rl) = -1;
done = TRUE;
}
break;
case VI_KEY( RIGHT ):
case 'l':
if( sfd->allow_rl != NULL ) {
*(sfd->allow_rl) = 1;
done = TRUE;
}
break;
evil_up:
case VI_KEY( UP ):
case 'k':
drawbord = adjustCLN( &cln, &pagetop, -1, endline, text_lines );
break;
evil_down:
case VI_KEY( DOWN ):
case 'j':
drawbord = adjustCLN( &cln, &pagetop, 1, endline, text_lines );
break;
case VI_KEY( CTRL_PAGEUP ):
drawbord = adjustCLN( &cln, &pagetop, -cln+1, endline, text_lines );
break;
case VI_KEY( CTRL_PAGEDOWN ):
drawbord = adjustCLN( &cln, &pagetop, endline-cln, endline, text_lines );
break;
evil_pageup:
case VI_KEY( PAGEUP ):
case VI_KEY( CTRL_B ):
drawbord = adjustCLN( &cln, &pagetop, -text_lines, endline, text_lines );
break;
evil_pagedown:
case VI_KEY( PAGEDOWN ):
case VI_KEY( CTRL_F ):
drawbord = adjustCLN( &cln, &pagetop, text_lines, endline, text_lines );
break;
case VI_KEY( HOME ):
drawbord = TRUE;
cln = 1;
pagetop = 1;
break;
case VI_KEY( END ):
drawbord = TRUE;
cln = endline;
pagetop = endline-text_lines+1;
if( pagetop < 1 ) {
pagetop = 1;
}
break;
default:
redraw = FALSE;
break;
}
}
PopMouseEventHandler();
CloseAWindow( cWin );
RestoreCursor();
SetWindowCursor();
return( rc );
} /* SelectLineInFile */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?