selrgn.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 733 行 · 第 1/2 页
C
733 行
}
return( ERR_NO_ERR );
} /* startSelectedRegion */
/*
* SelectLeft - update selected region, moving left
*/
int SelectLeft( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return MoveLeft( r, count );
} /* SelectLeft */
/*
* SelectRight - update selected region, moving right
*/
int SelectRight( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return MoveRight( r, count );
} /* SelectRight */
/*
* SelectUp - update selected region, moving up
*/
int SelectUp( void )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( EditFlags.LineBased );
if( EditFlags.LineBased ) {
return ERR_NO_ERR;
}
}
return( GoToLineRelCurs( CurrentLineNumber - 1 ) );
} /* SelectUp */
/*
* SelectDown - update selected region, moving down
*/
int SelectDown( void )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( EditFlags.LineBased );
if( EditFlags.LineBased ) {
return ERR_NO_ERR;
}
}
return( GoToLineRelCurs( CurrentLineNumber + 1 ) );
} /* SelectDown */
/*
* SelectHome - update selected region, moving to beginning of line
*/
int SelectHome( void )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( GoToColumnOnCurrentLine( 1 ) );
} /* SelectHome */
/*
* SelectEnd - update selected region, moving to end of line
*/
int SelectEnd( void )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
CurrentColumn = MAX_INPUT_LINE;
ValidateCurrentColumn();
return( GoToColumnOnCurrentLine( CurrentColumn ) );
} /* SelectEnd */
/*
* SelectPageUp - update selected region, moving one page up
*/
int SelectPageUp( void )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( EditFlags.LineBased );
if( EditFlags.LineBased ) {
return ERR_NO_ERR;
}
}
return( MovePage( -1, 1, TRUE ) );
} /* SelectPageUp */
/*
* SelectPageDown - update selected region, moving one page down
*/
int SelectPageDown( void )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( EditFlags.LineBased );
if( EditFlags.LineBased ) {
return ERR_NO_ERR;
}
}
return( MovePage( 1, 1, TRUE ) );
} /* SelectPageDown */
int SelectBackwardsWord( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( MoveBackwardsWord( r, count ) );
}
int SelectForwardWord( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( MoveForwardWord( r, count ) );
}
int SelectStartOfFile( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( MoveStartOfFile( r, count ) );
}
int SelectEndOfFile( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( MoveEndOfFile( r, count ) );
}
int SelectTopOfPage( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( MoveTopOfPage( r, count ) );
}
int SelectBottomOfPage( range *r, long count )
{
if( !EditFlags.Dragging ) {
startSelectedRegion( FALSE );
}
return( MoveBottomOfPage( r, count ) );
}
/*
* DoSelectSelection - selected region was selected, invoke aprops script
*/
int DoSelectSelection( bool doMenu )
{
linenum sl,el,tl;
int sc,ec,tc;
int rc = ERR_NO_ERR;
if( SelRgn.selected && doMenu ) {
sl = SelRgn.start_line;
el = SelRgn.end_line;
if( sl > el ) {
tl = sl;
sl = el;
el = tl;
}
if( CurrentLineNumber >= sl && CurrentLineNumber <= el ) {
if( sl == el && !SelRgn.lines ) {
sc = SelRgn.start_col;
ec = SelRgn.end_col;
if( sc > ec ) {
sc--;
tc = sc;
sc = ec;
ec = tc;
}
else
if( sc < ec ) {
ec--;
}
if( CurrentColumn >= sc && CurrentColumn <= ( ec + 1 ) ) {
rc = InvokeColSelHook( sc, ec );
}
} else {
rc = InvokeLineSelHook( SelRgn.start_line,
SelRgn.end_line );
}
UnselectRegion();
return( rc );
}
UnselectRegion();
}
if( ShiftDown() && LastEvent != '_' ) {
sc = 1;
ec = CurrentLine->len;
SetSelRegionCols( CurrentLineNumber, sc, ec );
if( doMenu ) {
rc = InvokeLineSelHook( CurrentLineNumber, CurrentLineNumber );
}
} else {
rc = GimmeCurrentEntireWordDim( &sc, &ec, FALSE );
if( rc ) {
return( ERR_NO_ERR );
}
SetSelRegionCols( CurrentLineNumber, sc, ec );
if( doMenu ) {
rc = InvokeColSelHook( sc, ec );
}
}
if( doMenu ) {
UnselectRegion();
}
return( rc );
} /* DoSelectSelection */
/*
* DoSelectSelectionPopMenu - $%!@ DoSelectSelection that always pops
*/
int DoSelectSelectionPopMenu( void )
{
return( DoSelectSelection( TRUE ) );
}
/*
* GetSelectedRegion - get the current selected region
*/
int GetSelectedRegion( range *r )
{
int rc;
rc = ERR_NO_SELECTION;
if( SelRgn.selected ) {
r->line_based = SelRgn.lines;
r->start.line = SelRgn.start_line;
r->end.line = SelRgn.end_line;
if( ( SelRgn.start_line > SelRgn.end_line ) ||
( SelRgn.start_line == SelRgn.end_line &&
SelRgn.end_col < SelRgn.start_col ) ) {
// don't include char at SelRgn.start_col
r->end.column = SelRgn.end_col;
r->start.column = SelRgn.start_col - 1;
} else {
// don't include char at SelRgn.end_col
r->end.column = SelRgn.end_col - 1;
r->start.column = SelRgn.start_col;
}
r->fix_range = FALSE;
rc = ERR_NO_ERR;
}
return( rc );
} /* GetSelectedRegion */
/*
* SetSelectedRegion - set the selected region to a specific area
*/
int SetSelectedRegion( range *r )
{
int rc;
line *line;
fcb *fcb;
UnselectRegion();
SelRgn.start_line = r->start.line;
SelRgn.end_line = r->end.line;
SelRgn.start_col_v = 1;
if( r->line_based ) {
SelRgn.lines = TRUE;
SelRgn.start_col = 1;
SelRgn.end_col = LineLength( r->end.line );
} else {
SelRgn.lines = FALSE;
if( r->start.column < r->end.column ) {
SelRgn.start_col = r->start.column + 1;
SelRgn.end_col = r->end.column + 2;
} else {
SelRgn.start_col = r->end.column + 1;
SelRgn.end_col = r->start.column + 2;
}
rc = CGimmeLinePtr( SelRgn.start_line, &fcb, &line );
if( rc == ERR_NO_ERR ) {
SelRgn.start_col_v =
WinVirtualCursorPosition( line->data, SelRgn.start_col );
}
}
SelRgn.selected = TRUE;
updateRegion();
return( ERR_NO_ERR );
} /* SetSelectedRegion */
/*
* SetSelectedRegionFromLine - set the SelRgn w/ start_v
*/
int SetSelectedRegionFromLine( range *r, linenum lineno )
{
int rc;
fcb *fcb;
line *line;
char *data;
SetSelectedRegion( r );
rc = CGimmeLinePtr( lineno, &fcb, &line );
if( rc != ERR_NO_ERR ) {
return( rc );
}
data = ( line->inf.ld.nolinedata ) ? WorkLine->data : line->data;
SelRgn.start_col_v = GetVirtualCursorPosition( data, SelRgn.start_col );
return( ERR_NO_ERR );
}
/*
* NormalizeRange - convert a range to the (external) selrgn format
*/
void NormalizeRange( range *r )
{
i_mark tmp;
if( r->start.line > r->end.line ) {
tmp = r->start;
r->start = r->end;
r->end = tmp;
} else if( r->start.line == r->end.line ) {
if( r->start.column > r->end.column ) {
tmp = r->start;
r->start = r->end;
r->end = tmp;
}
}
if( r->line_based ) {
r->start.column = 1;
if( r->fix_range && r->end.column == 1 ) {
r->end.line -= 1;
}
r->end.column = LineLength( r->end.line );
} else {
if( r->fix_range ) {
r->end.column -= 1;
if( r->end.column == 0 ) {
r->end.line -= 1;
r->end.column = LineLength( r->end.line );
}
}
}
/* change these to be zero-based instead of one-based */
r->start.column -= 1;
r->end.column -= 1;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?