OSDN Git Service

* Implement: LibEditText_ExecRedo() API & surround functions. (Non-Tested)
authorKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Fri, 7 Aug 2015 01:13:38 +0000 (10:13 +0900)
committerKoine Yuusuke(koinec) <koinec@users.sourceforge.jp>
Fri, 7 Aug 2015 01:13:38 +0000 (10:13 +0900)
include/libedittext.h
libedittext/drd64_libedittext_types.h
libedittext/drd64_libedittext_undoedit.c
libedittext/drd64_libedittext_undoedit.h
libedittext/drd64_libedittext_undoinfo.c
libedittext/drd64_libedittext_undoinfo.h

index fb30931..a86801e 100644 (file)
@@ -176,6 +176,8 @@ LIBEDITTEXT_API_CURSORAPI_MOVE
        #define LIBEDITTEXT_API_UNDOEDIT        extern
 #endif
 LIBEDITTEXT_API_UNDOEDIT
+       int LibEditText_ExecRedo( int i_tinfoid );
+LIBEDITTEXT_API_UNDOEDIT
        int LibEditText_ExecUndo( int i_tinfoid );
 
 
index 2b3fd0b..b35951c 100644 (file)
@@ -121,6 +121,7 @@ typedef struct      {
        Byte                                    *pb_undo;
        Byte                                    b_undo_flagchain;
        DWord                                   dw_undo_bufsize;
+       DWord                                   dw_undo_lastsize;
        DWord                                   dw_undo_last;
        DWord                                   dw_undo_end;
        DWord                                   dw_undo_line;
index 9534a9a..9e00415 100644 (file)
@@ -45,36 +45,66 @@ Comment:
 
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
-LIBEDITTEXT_UNDOEDIT_EXTERN
 int
-       LibEditText_UndoEdit_ExecReDoInfo(
+       LibEditText_UndoEdit_ExecRedoInfo(
                        LibEditText_TextInfo    *p_tinfo,
-                       LibEditText_UndoInfo    *p_udinfo )
+                       LibEditText_UndoInfo    *p_udinfo,
+                       DWord                                   dw_line,
+                       DWord                                   dw_pos )
 {
        int                                             i_result        = 0x00;
-       LibEditText_LineInfo    *p_line;
+       DWord                                   dw_linfoid;
+       LibEditText_LineInfo    *p_line         = NULL;
        
+       if( dw_line < p_tinfo->dw_maxline )
+               { p_line        = LibEditText_Section_SearchLine( p_tinfo, dw_line ); }
 
        if( LIBEDITTEXT_UNDOCMD_INSERTLINE == p_udinfo->b_cmd )         {
+               if( dw_line == p_tinfo->dw_maxline )    {
+                       assert( INVALID_LINE != p_tinfo->dw_line_end );
+                       dw_linfoid      = LibEditText_LineCtrl_AddLine(
+                                                                       p_tinfo, p_tinfo->dw_line_end, (dw_line - 1), 0, 0x00, 0x01 );
+               }
+               else    {
+                       assert( NULL != p_line );
+                       dw_linfoid      = LibEditText_LineCtrl_PushLine(
+                                                                       p_tinfo, p_line->dw_id, dw_line, 0, 0x01 );
+               }
 
+               if( INVALID_LINE == dw_linfoid )        {
+                       i_result        = -0x01;
+               }
        }
        else if( LIBEDITTEXT_UNDOCMD_DELETELINE == p_udinfo->b_cmd )    {
-
+               assert( NULL != p_line );
+               i_result        = LibEditText_LineCtrl_DeleteLine(
+                                                               p_tinfo, p_line, dw_line, 0x01 );
        }
        else if( LIBEDITTEXT_UNDOCMD_INSERTSTRING == p_udinfo->b_cmd )  {
-
+               assert( NULL != p_line );
+               i_result        = LibEditText_LineEdit_InsertString(
+                                                               p_tinfo, p_line, dw_line, dw_pos, 
+                                                               p_udinfo->pb_str, p_udinfo->dw_data, 0x01 );
        }
        else if( LIBEDITTEXT_UNDOCMD_DELETESTRING == p_udinfo->b_cmd )  {
-
+               assert( NULL != p_line );
+               i_result        = LibEditText_LineEdit_DeleteString(
+                                                               p_tinfo, p_line, dw_line, dw_pos, p_udinfo->dw_data, 0x01 );
        }
        else if( LIBEDITTEXT_UNDOCMD_INSERTCHAR == p_udinfo->b_cmd )    {
-
+               assert( NULL != p_line );
+               i_result        = LibEditText_LineEdit_InsertString(
+                                                               p_tinfo, p_line, dw_line, dw_pos, 
+                                                               &(p_udinfo->b_data), 1, 0x01 );
        }
        else if( LIBEDITTEXT_UNDOCMD_DELETECHAR == p_udinfo->b_cmd )    {
-
+               assert( NULL != p_line );
+               i_result        = LibEditText_LineEdit_DeleteString(
+                                                               p_tinfo, p_line, dw_line, dw_pos, 1, 0x01 );
        }
        else    {
-
+               // INVALID UndoCommand ---
+               i_result        = -0x02;
        }
        
        return i_result;
@@ -85,7 +115,88 @@ int
 ----------------------------------------------------------------------*/
 LIBEDITTEXT_UNDOEDIT_EXTERN
 int
-       LibEditText_UndoEdit_ExecUnDoInfo(
+       LibEditText_UndoEdit_ExecRedo(
+                       LibEditText_TextInfo    *p_tinfo )
+{
+       int                                             i_result        = 0x00;
+       Byte                                    *pb_undo;
+       Byte                                    *pb_last;
+       DWord                                   dw_line;
+       DWord                                   dw_pos;
+       DWord                                   dw_undosize;
+       LibEditText_UndoInfo    t_udinfo;
+
+       assert( NULL != p_tinfo );
+
+       if( 0 == p_tinfo->dw_undo_last )        {
+               return 0x01;
+       }
+       
+       if( p_tinfo->dw_undo_lastsize == p_tinfo->dw_undo_last )        {
+               return 0x02;
+       }
+
+       pb_undo         = p_tinfo->pb_undo + p_tinfo->dw_undo_last;
+       pb_last         = NULL;
+       dw_line         = p_tinfo->dw_undo_line;
+       dw_pos          = p_tinfo->dw_undo_pos;
+       dw_undosize     = pb_undo - p_tinfo->pb_undo;
+
+       memset( &t_udinfo, 0x00, sizeof( LibEditText_UndoInfo ) );
+
+       do{
+               
+               i_result        = LibEditText_UndoInfo_ReadUndoInfo(
+                                                       p_tinfo, &t_udinfo, dw_line, dw_pos, pb_undo, 0x01 );
+               
+               // Exec Redo ---
+               i_result        = LibEditText_UndoEdit_ExecRedoInfo( p_tinfo, &t_udinfo, dw_line, dw_pos );
+               if( 0x00 != i_result )  { return i_result; }
+
+               LibEditText_UndoInfo_ReSetRedoFlag( pb_undo );
+
+               dw_line         += t_udinfo.dw_plusline;
+               dw_pos          += t_udinfo.dw_pluspos;
+               dw_undosize     += t_udinfo.dw_uinfosize;
+               pb_undo         += t_udinfo.dw_uinfosize;
+
+       }while(( p_tinfo->dw_undo_lastsize > dw_undosize ) && ( 0x00 == t_udinfo.t_udflag.bf_chain ));
+
+       p_tinfo->dw_undo_last   = dw_undosize;
+       p_tinfo->dw_undo_end    = dw_undosize - t_udinfo.dw_uinfosize;
+       p_tinfo->dw_undo_line   = dw_line;
+       p_tinfo->dw_undo_pos    = dw_pos;
+
+       return i_result;
+}
+
+
+/***********************************************************************
+***********************************************************************/
+LIBEDITTEXT_API_UNDOEDIT
+int
+       LibEditText_ExecRedo( int i_tinfoid )
+{
+       int                                             i_result        = 0x00;
+       LibEditText_TextInfo    *p_tinfo;
+
+       p_tinfo = LibEditText_System_GetTextInfo( i_tinfoid );
+       if( NULL == p_tinfo )   {
+               i_result        = -0x01;
+               goto    goto_LibEditText_ExecRedo_post;
+       }
+
+       i_result        = LibEditText_UndoEdit_ExecRedo( p_tinfo );
+
+goto_LibEditText_ExecRedo_post:
+       return i_result;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+int
+       LibEditText_UndoEdit_ExecUndoInfo(
                        LibEditText_TextInfo    *p_tinfo,
                        LibEditText_UndoInfo    *p_udinfo,
                        DWord                                   dw_line,
@@ -189,7 +300,7 @@ int
                dw_line         -= t_udinfo.dw_plusline;
                dw_pos          -= t_udinfo.dw_pluspos;
                
-               i_result        = LibEditText_UndoEdit_ExecUnDoInfo( p_tinfo, &t_udinfo, dw_line, dw_pos );
+               i_result        = LibEditText_UndoEdit_ExecUndoInfo( p_tinfo, &t_udinfo, dw_line, dw_pos );
                if( 0x00 != i_result )  { return i_result; }
 
                LibEditText_UndoInfo_SetRedoFlag( pb_undo );
index 15cddd1..2caf181 100644 (file)
@@ -50,6 +50,8 @@ Comment:
 #endif
 
 LIBEDITTEXT_UNDOEDIT_EXTERN
+       int LibEditText_UndoEdit_ExecRedo( LibEditText_TextInfo *p_tinfo );
+LIBEDITTEXT_UNDOEDIT_EXTERN
        int LibEditText_UndoEdit_ExecUndo( LibEditText_TextInfo *p_tinfo );
 
 
index c5df820..997a1e9 100644 (file)
@@ -348,6 +348,8 @@ int
        pb_now  = LibEditText_UndoInfo_ReadDiffValue(
                                                &(pt_udinfo->dw_pos), pb_now, (Byte)(pt_udflag->bf_pos), b_direct );
 
+       pt_udinfo->dw_uinfosize = pb_now - pb_undo;
+
        return 0x00;
 }
 
@@ -356,6 +358,25 @@ int
 ----------------------------------------------------------------------*/
 LIBEDITTEXT_UNDOINFO_EXTERN
 void
+       LibEditText_UndoInfo_ReSetRedoFlag(
+                       Byte                                    *pb_undo )
+{
+       LibEditText_UndoFlag    *pt_udflag;
+
+       assert( NULL != pb_undo );
+
+       pt_udflag       = (LibEditText_UndoFlag *)(pb_undo + 1);
+
+       pt_udflag->bf_redone            = 0x00;
+
+       return;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBEDITTEXT_UNDOINFO_EXTERN
+void
        LibEditText_UndoInfo_SetRedoFlag(
                        Byte                                    *pb_undo )
 {
@@ -583,10 +604,11 @@ int
        pt_udflag->bf_pos       = LibEditText_UndoInfo_SetDiffValue(
                                                                                &pb_now, dw_pos, p_tinfo->dw_undo_pos );
 
-       p_tinfo->dw_undo_line   = dw_afterline;
-       p_tinfo->dw_undo_pos    = dw_afterpos;
-       p_tinfo->dw_undo_end    = p_tinfo->dw_undo_last;
-       p_tinfo->dw_undo_last   = pb_now - p_tinfo->pb_undo;;
+       p_tinfo->dw_undo_line           = dw_afterline;
+       p_tinfo->dw_undo_pos            = dw_afterpos;
+       p_tinfo->dw_undo_end            = p_tinfo->dw_undo_last;
+       p_tinfo->dw_undo_last           = pb_now - p_tinfo->pb_undo;;
+       p_tinfo->dw_undo_lastsize       = p_tinfo->dw_undo_last;
 
        return 0x00;
 }
@@ -615,6 +637,7 @@ int
 
        p_tinfo->pb_undo                        = pb_undo;
        p_tinfo->dw_undo_bufsize        = 0;
+       p_tinfo->dw_undo_lastsize       = 0;
        p_tinfo->dw_undo_last           = 0;
        p_tinfo->dw_undo_line           = 0;
        p_tinfo->dw_undo_pos            = 0;
@@ -641,6 +664,7 @@ int
 
        p_tinfo->pb_undo                        = NULL;
        p_tinfo->dw_undo_bufsize        = 0;
+       p_tinfo->dw_undo_lastsize       = 0;
        p_tinfo->dw_undo_last           = 0;
        p_tinfo->dw_undo_line           = 0;
        p_tinfo->dw_undo_pos            = 0;
index 0ed5618..9e1e91f 100644 (file)
@@ -77,6 +77,8 @@ typedef struct        {
 
        DWord                                   dw_plusline;
        DWord                                   dw_pluspos;
+
+       DWord                                   dw_uinfosize;
 } LibEditText_UndoInfo;
 
 
@@ -85,6 +87,8 @@ LIBEDITTEXT_UNDOINFO_EXTERN
                        LibEditText_TextInfo *p_tinfo, LibEditText_UndoInfo *pt_udinfo,
                        DWord dw_line, DWord dw_pos, Byte *pb_undo, Byte b_direct );
 LIBEDITTEXT_UNDOINFO_EXTERN
+       void LibEditText_UndoInfo_ReSetRedoFlag( Byte *pb_undo );
+LIBEDITTEXT_UNDOINFO_EXTERN
        void LibEditText_UndoInfo_SetRedoFlag( Byte *pb_undo );
 LIBEDITTEXT_UNDOINFO_EXTERN
        void LibEditText_UndoInfo_CommitUndo( LibEditText_TextInfo *p_tinfo, int i_flag );