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 + -
显示快捷键?