From 9f234271499f348fc80e90a1d6f714ae299b01a6 Mon Sep 17 00:00:00 2001 From: "Koine Yuusuke(koinec)" Date: Sun, 14 Jun 2015 19:40:26 +0900 Subject: [PATCH] * Implement: API MoveCursor(Right/Left/Up/Down) (non-tested) * Implement: Cursor AdjustSystem for Insert/Delete Line Function --- include/libedittext.h | 14 +++ libedittext/drd64_libedittext_cursorapi.c | 173 +++++++++++++++++++++++++---- libedittext/drd64_libedittext_cursorctrl.c | 59 ++++++++++ libedittext/drd64_libedittext_cursorctrl.h | 2 + libedittext/drd64_libedittext_cursorinfo.c | 35 ++++++ libedittext/drd64_libedittext_cursorinfo.h | 6 + libedittext/drd64_libedittext_linectrl.c | 8 ++ libedittext/drd64_libedittext_types.h | 1 + 8 files changed, 279 insertions(+), 19 deletions(-) diff --git a/include/libedittext.h b/include/libedittext.h index 02cdba9..30cd39e 100644 --- a/include/libedittext.h +++ b/include/libedittext.h @@ -95,6 +95,20 @@ LIBEDITTEXT_API_LINEAPI #else #define LIBEDITTEXT_API_CURSORAPI extern #endif + +#define LibEditText_ForwardCursor(m,n) LibEditText_MoveRightCursor((m),(n),1) +#define LibEditText_BackCursor(m,n) LibEditText_MoveLeftCursor((m),(n),1) +#define LibEditText_UpCursor(m,n) LibEditText_MoveUpCursor((m),(n),1) +#define LibEditText_DownCursor(m,n) LibEditText_MoveDownCursor((m),(n),1) + +LIBEDITTEXT_API_CURSORAPI + int LibEditText_MoveUpCursor( int i_tinfoid, int i_curid, DWord dw_lines ); +LIBEDITTEXT_API_CURSORAPI + int LibEditText_MoveDownCursor( int i_tinfoid, int i_curid, DWord dw_lines ); +LIBEDITTEXT_API_CURSORAPI + int LibEditText_MoveRightCursor( int i_tinfoid, int i_curid, DWord dw_len ); +LIBEDITTEXT_API_CURSORAPI + int LibEditText_MoveLeftCursor( int i_tinfoid, int i_curid, DWord dw_len ); LIBEDITTEXT_API_CURSORAPI int LibEditText_JumpCursor( int i_tinfoid, int i_curid, DWord dw_line ); LIBEDITTEXT_API_CURSORAPI diff --git a/libedittext/drd64_libedittext_cursorapi.c b/libedittext/drd64_libedittext_cursorapi.c index 78ca598..b98ed05 100644 --- a/libedittext/drd64_libedittext_cursorapi.c +++ b/libedittext/drd64_libedittext_cursorapi.c @@ -48,10 +48,12 @@ Comment: DeleteString DeleteChar JoinLine - MoveCursor(Right) - MoveCursor(Left) - MoveCursor(Up) - MoveCursor(Down) + EndCursor(End) + StartCursor(Start) + * MoveCursor(Right) + * MoveCursor(Left) + * MoveCursor(Up) + * MoveCursor(Down) * JumpCursor * AllocCursor * FreeCursor @@ -60,29 +62,170 @@ Comment: /*********************************************************************** ***********************************************************************/ +/*LIBEDITTEXT_API_CURSORAPI +int + LibEditText_MoveEndCursor( + int i_tinfoid, + int i_curid ) +{ + int i_result; + LibEditText_TextInfo *p_tinfo; + LibEditText_Cursor *p_cursor; + LibEditText_LineInfo *p_line; + + p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); + if( NULL == p_tinfo ) { + return -0x01; + } + + p_cursor = LibEditText_CursorInfo_GetCursor( p_tinfo, i_curid ); + if( NULL == p_cursor ) { + return -0x02; + } + + p_line = LINFO(p_tinfo, p_cursor->dw_lineid); + if( NULL == p_line ) { + return -0x03; + } + + i_result = LibEditText_CursorMove_MoveRight( p_tinfo, p_cursor, dw_len ); + return i_result; +}*/ + + +/*********************************************************************** +***********************************************************************/ LIBEDITTEXT_API_CURSORAPI int - LibEditText_JumpCursor( - int i_tinfoid, + LibEditText_MoveUpCursor( + int i_tinfoid, int i_curid, - DWord dw_line ) + DWord dw_lines ) +{ + int i_result; + LibEditText_TextInfo *p_tinfo; + LibEditText_Cursor *p_cursor; + + p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); + if( NULL == p_tinfo ) { + return -0x01; + } + + p_cursor = LibEditText_CursorInfo_GetCursor( p_tinfo, i_curid ); + if( NULL == p_cursor ) { + return -0x02; + } + + i_result = LibEditText_CursorMove_MoveUp( p_tinfo, p_cursor, dw_lines ); + return i_result; +} + + +/*********************************************************************** +***********************************************************************/ +LIBEDITTEXT_API_CURSORAPI +int + LibEditText_MoveDownCursor( + int i_tinfoid, + int i_curid, + DWord dw_lines ) +{ + int i_result; + LibEditText_TextInfo *p_tinfo; + LibEditText_Cursor *p_cursor; + + p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); + if( NULL == p_tinfo ) { + return -0x01; + } + + p_cursor = LibEditText_CursorInfo_GetCursor( p_tinfo, i_curid ); + if( NULL == p_cursor ) { + return -0x02; + } + + i_result = LibEditText_CursorMove_MoveDown( p_tinfo, p_cursor, dw_lines ); + return i_result; +} + + +/*********************************************************************** +***********************************************************************/ +LIBEDITTEXT_API_CURSORAPI +int + LibEditText_MoveRightCursor( + int i_tinfoid, + int i_curid, + DWord dw_len ) { int i_result; LibEditText_TextInfo *p_tinfo; LibEditText_Cursor *p_cursor; - if( 0 > i_tinfoid ) { + p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); + if( NULL == p_tinfo ) { return -0x01; } + p_cursor = LibEditText_CursorInfo_GetCursor( p_tinfo, i_curid ); + if( NULL == p_cursor ) { + return -0x02; + } + + i_result = LibEditText_CursorMove_MoveRight( p_tinfo, p_cursor, dw_len ); + return i_result; +} + + +/*********************************************************************** +***********************************************************************/ +LIBEDITTEXT_API_CURSORAPI +int + LibEditText_MoveLeftCursor( + int i_tinfoid, + int i_curid, + DWord dw_len ) +{ + int i_result; + LibEditText_TextInfo *p_tinfo; + LibEditText_Cursor *p_cursor; + p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); if( NULL == p_tinfo ) { + return -0x01; + } + + p_cursor = LibEditText_CursorInfo_GetCursor( p_tinfo, i_curid ); + if( NULL == p_cursor ) { return -0x02; } + i_result = LibEditText_CursorMove_MoveLeft( p_tinfo, p_cursor, dw_len ); + return i_result; +} + + +/*********************************************************************** +***********************************************************************/ +LIBEDITTEXT_API_CURSORAPI +int + LibEditText_JumpCursor( + int i_tinfoid, + int i_curid, + DWord dw_line ) +{ + int i_result; + LibEditText_TextInfo *p_tinfo; + LibEditText_Cursor *p_cursor; + + p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); + if( NULL == p_tinfo ) { + return -0x01; + } + p_cursor = LibEditText_CursorInfo_GetCursor( p_tinfo, i_curid ); if( NULL == p_cursor ) { - return -0x03; + return -0x02; } i_result = LibEditText_CursorInfo_JumpCursor( p_tinfo, p_cursor, dw_line ); @@ -102,13 +245,9 @@ int int i_curid; LibEditText_TextInfo *p_tinfo; - if( 0 > i_tinfoid ) { - return -0x01; - } - p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); if( NULL == p_tinfo ) { - return -0x02; + return -0x01; } i_curid = LibEditText_CursorInfo_AllocCursor( p_tinfo, dw_ranges ); @@ -128,13 +267,9 @@ int int i_result; LibEditText_TextInfo *p_tinfo; - if( 0 > i_tinfoid ) { - return -0x01; - } - p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid ); if( NULL == p_tinfo ) { - return -0x02; + return -0x01; } i_result = LibEditText_CursorInfo_FreeCursor( p_tinfo, i_curid ); diff --git a/libedittext/drd64_libedittext_cursorctrl.c b/libedittext/drd64_libedittext_cursorctrl.c index 86ad00b..d1775e2 100644 --- a/libedittext/drd64_libedittext_cursorctrl.c +++ b/libedittext/drd64_libedittext_cursorctrl.c @@ -139,6 +139,65 @@ int ----------------------------------------------------------------------*/ LIBEDITTEXT_CURSORCTRL_EXTERN int + LibEditText_CursorCtrl_PreProc_DeleteLine( + LibEditText_TextInfo *p_tinfo, + DWord dw_line ) +{ + int i_cnt; + LibEditText_Cursor *p_cursor; + LibEditText_LineInfo *p_line; + + assert( NULL != p_tinfo ); + assert( 1 < p_tinfo->dw_maxline ); + + for( i_cnt = 0; i_cnt < p_tinfo->dw_maxcursors; i_cnt++ ) { + p_cursor = &(p_tinfo->t_cursor[i_cnt]); + + if( 0 == p_cursor->dw_rangelines ) { continue; } + + assert( INVALID_LINE != p_cursor->dw_lineid ); + assert( INVALID_LINE != p_cursor->dw_start_lineid ); + assert( INVALID_LINE != p_cursor->dw_end_lineid ); + + if( dw_line == p_cursor->dw_line ) { + if( dw_line + 1 == p_tinfo->dw_maxline ) + { LibEditText_CursorMove_MoveUp( p_tinfo, p_cursor, 1 ); } + else + { LibEditText_CursorMove_MoveDown( p_tinfo, p_cursor, 1 ); } + } + else if( dw_line == p_cursor->dw_start_line ) { + assert( p_cursor->dw_start_line + 1 < p_tinfo->dw_maxline ); + p_cursor->dw_start_line++; + p_line = LINFO(p_tinfo, p_cursor->dw_start_lineid); + assert( NULL != p_line ); + p_cursor->dw_start_lineid = p_line->dw_next; + } + else if( dw_line == p_cursor->dw_end_line ) { + if( p_cursor->dw_end_line + 1 == p_tinfo->dw_maxline ) { + assert( p_cursor->dw_end_line > 0 ); + p_cursor->dw_end_line--; + p_line = LINFO(p_tinfo, p_cursor->dw_end_lineid); + assert( NULL != p_line ); + p_cursor->dw_end_lineid = p_line->dw_before; + } + else { + p_cursor->dw_end_line++; + p_line = LINFO(p_tinfo, p_cursor->dw_end_lineid); + assert( NULL != p_line ); + p_cursor->dw_end_lineid = p_line->dw_next; + } + + } + } + + return 0x00; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBEDITTEXT_CURSORCTRL_EXTERN +int LibEditText_CursorCtrl_DeleteLine( LibEditText_TextInfo *p_tinfo, DWord dw_line ) diff --git a/libedittext/drd64_libedittext_cursorctrl.h b/libedittext/drd64_libedittext_cursorctrl.h index d8749f0..294a9c9 100644 --- a/libedittext/drd64_libedittext_cursorctrl.h +++ b/libedittext/drd64_libedittext_cursorctrl.h @@ -52,6 +52,8 @@ Comment: LIBEDITTEXT_CURSORCTRL_EXTERN int LibEditText_CursorCtrl_InsertLine( LibEditText_TextInfo *p_tinfo, DWord dw_line ); LIBEDITTEXT_CURSORCTRL_EXTERN + int LibEditText_CursorCtrl_PreProc_DeleteLine( LibEditText_TextInfo *p_tinfo, DWord dw_line ); +LIBEDITTEXT_CURSORCTRL_EXTERN int LibEditText_CursorCtrl_DeleteLine( LibEditText_TextInfo *p_tinfo, DWord dw_line ); #ifdef LIBEDITTEXT_CURSORCTRL_INTERNALFUNC diff --git a/libedittext/drd64_libedittext_cursorinfo.c b/libedittext/drd64_libedittext_cursorinfo.c index 933a970..bc43da3 100644 --- a/libedittext/drd64_libedittext_cursorinfo.c +++ b/libedittext/drd64_libedittext_cursorinfo.c @@ -70,6 +70,39 @@ LibEditText_Cursor * /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ +LIBEDITTEXT_CURSORINFO_EXTERN +void + LibEditText_CursorInfo_SetCurrentCursor( + LibEditText_TextInfo *p_tinfo, + int i_nowcursor ) +{ + assert( NULL != p_tinfo ); + assert( 0 <= i_nowcursor ); + assert( p_tinfo->dw_maxcursors > i_nowcursor ); + + p_tinfo->i_cursor_now = i_nowcursor; + + return; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ +LIBEDITTEXT_CURSORINFO_EXTERN +void + LibEditText_CursorInfo_ClearCurrentCursor( + LibEditText_TextInfo *p_tinfo ) +{ + assert( NULL != p_tinfo ); + + p_tinfo->i_cursor_now = DRD64_LIBEDITTEXT_DEFAULT_MAX_CURSORS; + + return; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ int LibEditText_CursorInfo_LocateCursor( LibEditText_TextInfo *p_tinfo, @@ -239,6 +272,7 @@ int } p_tinfo->dw_maxcursors = 0; + p_tinfo->i_cursor_now = DRD64_LIBEDITTEXT_DEFAULT_MAX_CURSORS; return 0x00; } @@ -254,6 +288,7 @@ int assert( NULL != p_tinfo ); p_tinfo->dw_maxcursors = 0; + p_tinfo->i_cursor_now = DRD64_LIBEDITTEXT_DEFAULT_MAX_CURSORS; return 0x00; } diff --git a/libedittext/drd64_libedittext_cursorinfo.h b/libedittext/drd64_libedittext_cursorinfo.h index 72063c9..ad0726e 100644 --- a/libedittext/drd64_libedittext_cursorinfo.h +++ b/libedittext/drd64_libedittext_cursorinfo.h @@ -54,6 +54,12 @@ LIBEDITTEXT_CURSORINFO_EXTERN LibEditText_Cursor *LibEditText_CursorInfo_GetCursor( LibEditText_TextInfo *p_tinfo, int i_curid ); LIBEDITTEXT_CURSORINFO_EXTERN + void LibEditText_CursorInfo_SetCurrentCursor( + LibEditText_TextInfo *p_tinfo, int i_nowcursor ); +LIBEDITTEXT_CURSORINFO_EXTERN + void LibEditText_CursorInfo_ClearCurrentCursor( + LibEditText_TextInfo *p_tinfo ); +LIBEDITTEXT_CURSORINFO_EXTERN int LibEditText_CursorInfo_JumpCursor( LibEditText_TextInfo *p_tinfo, LibEditText_Cursor *p_cursor, DWord dw_targline ); LIBEDITTEXT_CURSORINFO_EXTERN diff --git a/libedittext/drd64_libedittext_linectrl.c b/libedittext/drd64_libedittext_linectrl.c index 89e142c..bb46d58 100644 --- a/libedittext/drd64_libedittext_linectrl.c +++ b/libedittext/drd64_libedittext_linectrl.c @@ -62,6 +62,8 @@ int if( 1 == p_tinfo->dw_maxline ) { return 0x00; } + LibEditText_CursorCtrl_PreProc_DeleteLine( p_tinfo, dw_line ); + // Check & Remove Section --- LibEditText_Section_DeleteLine( p_tinfo, dw_line ); @@ -110,6 +112,8 @@ int p_tinfo->dw_maxline--; + LibEditText_CursorCtrl_DeleteLine( p_tinfo, dw_line ); + return 0x00; } @@ -277,6 +281,8 @@ int p_tinfo->dw_maxline++; + LibEditText_CursorCtrl_InsertLine( p_tinfo, dw_line ); + return 0x00; } @@ -367,6 +373,8 @@ goto_LibEditText_LineCtrl_AppendLine_prechecked: else if( 0x00 < i_result ) { i_result = 0x00; } p_tinfo->dw_maxline++; + + LibEditText_CursorCtrl_InsertLine( p_tinfo, (p_tinfo->dw_maxline - 1) ); } return 0x00; diff --git a/libedittext/drd64_libedittext_types.h b/libedittext/drd64_libedittext_types.h index e30bf91..8420f92 100644 --- a/libedittext/drd64_libedittext_types.h +++ b/libedittext/drd64_libedittext_types.h @@ -88,6 +88,7 @@ typedef struct { typedef struct { int i_id; /* ID of TextInfo Struct */ int i_fd; + int i_cursor_now; Word w_subtype; /* TextFile Sub-Type (.c/.h/Makefile/etc) */ Byte *pb_text; /* Buffer of TextData */ Byte *pb_attr; /* Attribute Buffer of Text */ -- 2.11.0