OSDN Git Service

* Implement: API MoveCursor(Right/Left/Up/Down) (non-tested)
authorKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Sun, 14 Jun 2015 10:40:26 +0000 (19:40 +0900)
committerKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Sun, 14 Jun 2015 10:40:26 +0000 (19:40 +0900)
* Implement: Cursor AdjustSystem for Insert/Delete Line Function

include/libedittext.h
libedittext/drd64_libedittext_cursorapi.c
libedittext/drd64_libedittext_cursorctrl.c
libedittext/drd64_libedittext_cursorctrl.h
libedittext/drd64_libedittext_cursorinfo.c
libedittext/drd64_libedittext_cursorinfo.h
libedittext/drd64_libedittext_linectrl.c
libedittext/drd64_libedittext_types.h

index 02cdba9..30cd39e 100644 (file)
@@ -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
index 78ca598..b98ed05 100644 (file)
@@ -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 );
index 86ad00b..d1775e2 100644 (file)
@@ -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 )
index d8749f0..294a9c9 100644 (file)
@@ -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
index 933a970..bc43da3 100644 (file)
@@ -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;
 }
index 72063c9..ad0726e 100644 (file)
@@ -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
index 89e142c..bb46d58 100644 (file)
@@ -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;
index e30bf91..8420f92 100644 (file)
@@ -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 */