@@ -647,6 +647,108 @@ public void JumpToChangeBlock(int changeBlockIdx)
647647 }
648648 }
649649
650+ public void GotoPrevChange ( )
651+ {
652+ var view = TextArea . TextView ;
653+ var lines = GetLines ( ) ;
654+ var firstLineIdx = lines . Count ;
655+ foreach ( var line in view . VisualLines )
656+ {
657+ if ( line . IsDisposed || line . FirstDocumentLine == null || line . FirstDocumentLine . IsDeleted )
658+ continue ;
659+
660+ var index = line . FirstDocumentLine . LineNumber - 1 ;
661+ if ( index >= lines . Count )
662+ continue ;
663+
664+ if ( firstLineIdx > index )
665+ firstLineIdx = index ;
666+ }
667+
668+ var firstLineType = lines [ firstLineIdx ] . Type ;
669+ var isChangeFirstLine = firstLineType != Models . TextDiffLineType . Normal && firstLineType != Models . TextDiffLineType . Indicator ;
670+ if ( isChangeFirstLine )
671+ {
672+ for ( var i = firstLineIdx - 1 ; i >= 0 ; i -- )
673+ {
674+ var prevType = lines [ i ] . Type ;
675+ if ( prevType == Models . TextDiffLineType . Normal || prevType == Models . TextDiffLineType . Indicator )
676+ {
677+ ScrollToLine ( i + 2 ) ;
678+ return ;
679+ }
680+ }
681+ }
682+ else
683+ {
684+ var prevChangeEnd = - 1 ;
685+ for ( var i = firstLineIdx - 1 ; i >= 0 ; i -- )
686+ {
687+ var prevType = lines [ i ] . Type ;
688+ if ( prevType == Models . TextDiffLineType . None ||
689+ prevType == Models . TextDiffLineType . Added ||
690+ prevType == Models . TextDiffLineType . Deleted )
691+ {
692+ prevChangeEnd = i ;
693+ break ;
694+ }
695+ }
696+
697+ if ( prevChangeEnd <= 0 )
698+ return ;
699+
700+ for ( var i = prevChangeEnd - 1 ; i >= 0 ; i -- )
701+ {
702+ var prevType = lines [ i ] . Type ;
703+ if ( prevType == Models . TextDiffLineType . Normal || prevType == Models . TextDiffLineType . Indicator )
704+ {
705+ ScrollToLine ( i + 2 ) ;
706+ return ;
707+ }
708+ }
709+ }
710+ }
711+
712+ public void GotoNextChange ( )
713+ {
714+ var view = TextArea . TextView ;
715+ var lines = GetLines ( ) ;
716+ var lastLineIdx = - 1 ;
717+ foreach ( var line in view . VisualLines )
718+ {
719+ if ( line . IsDisposed || line . FirstDocumentLine == null || line . FirstDocumentLine . IsDeleted )
720+ continue ;
721+
722+ var index = line . FirstDocumentLine . LineNumber - 1 ;
723+ if ( index >= lines . Count )
724+ continue ;
725+
726+ if ( lastLineIdx < index )
727+ lastLineIdx = index ;
728+ }
729+
730+ var lastLineType = lines [ lastLineIdx ] . Type ;
731+ var findNormalLine = lastLineType == Models . TextDiffLineType . Normal || lastLineType == Models . TextDiffLineType . Indicator ;
732+ for ( var idx = lastLineIdx + 1 ; idx < lines . Count ; idx ++ )
733+ {
734+ var nextType = lines [ idx ] . Type ;
735+ if ( nextType == Models . TextDiffLineType . None ||
736+ nextType == Models . TextDiffLineType . Added ||
737+ nextType == Models . TextDiffLineType . Deleted )
738+ {
739+ if ( findNormalLine )
740+ {
741+ ScrollToLine ( idx + 1 ) ;
742+ return ;
743+ }
744+ }
745+ else if ( ! findNormalLine )
746+ {
747+ findNormalLine = true ;
748+ }
749+ }
750+ }
751+
650752 public override void Render ( DrawingContext context )
651753 {
652754 base . Render ( context ) ;
0 commit comments