@@ -478,10 +478,6 @@ public ThemedTextDiffPresenter(TextArea area, TextDocument doc) : base(area, doc
478478 TextArea . TextView . LineTransformers . Add ( _lineStyleTransformer ) ;
479479 }
480480
481- public virtual void UpdateSelectedChunk ( double y )
482- {
483- }
484-
485481 public void GotoChange ( ViewModels . BlockNavigationDirection direction )
486482 {
487483 if ( DataContext is not ViewModels . TextDiffContext ctx )
@@ -603,6 +599,10 @@ protected override void OnSizeChanged(SizeChangedEventArgs e)
603599 }
604600 }
605601
602+ protected virtual void UpdateSelectedChunk ( double y )
603+ {
604+ }
605+
606606 private async void OnTextAreaKeyDown ( object sender , KeyEventArgs e )
607607 {
608608 if ( e . KeyModifiers . Equals ( OperatingSystem . IsMacOS ( ) ? KeyModifiers . Meta : KeyModifiers . Control ) )
@@ -889,7 +889,62 @@ public class CombinedTextDiffPresenter : ThemedTextDiffPresenter
889889 TextArea . LeftMargins . Add ( new LineModifyTypeMargin ( ) ) ;
890890 }
891891
892- public override void UpdateSelectedChunk ( double y )
892+ protected override void OnLoaded ( RoutedEventArgs e )
893+ {
894+ base . OnLoaded ( e ) ;
895+
896+ _scrollViewer = this . FindDescendantOfType < ScrollViewer > ( ) ;
897+ if ( _scrollViewer != null )
898+ {
899+ _scrollViewer . Bind ( ScrollViewer . OffsetProperty , new Binding ( "ScrollOffset" , BindingMode . TwoWay ) ) ;
900+ _scrollViewer . ScrollChanged += OnTextViewScrollChanged ;
901+ }
902+ }
903+
904+ protected override void OnUnloaded ( RoutedEventArgs e )
905+ {
906+ if ( _scrollViewer != null )
907+ _scrollViewer . ScrollChanged -= OnTextViewScrollChanged ;
908+
909+ base . OnUnloaded ( e ) ;
910+ }
911+
912+ protected override void OnDataContextChanged ( EventArgs e )
913+ {
914+ base . OnDataContextChanged ( e ) ;
915+
916+ if ( DataContext is ViewModels . CombinedTextDiff { Data : { } diff } )
917+ {
918+ var builder = new StringBuilder ( ) ;
919+ foreach ( var line in diff . Lines )
920+ {
921+ if ( line . Content . Length > 10000 )
922+ {
923+ builder . Append ( line . Content . AsSpan ( 0 , 1000 ) ) ;
924+ builder . Append ( $ "...({ line . Content . Length - 1000 } characters trimmed)") ;
925+ }
926+ else
927+ {
928+ builder . Append ( line . Content ) ;
929+ }
930+
931+ if ( line . NoNewLineEndOfFile )
932+ builder . Append ( "\u26D4 " ) ;
933+
934+ builder . AppendLine ( ) ;
935+ }
936+
937+ Text = builder . ToString ( ) ;
938+ }
939+ else
940+ {
941+ Text = string . Empty ;
942+ }
943+
944+ GC . Collect ( ) ;
945+ }
946+
947+ protected override void UpdateSelectedChunk ( double y )
893948 {
894949 if ( DataContext is not ViewModels . CombinedTextDiff { Data : { } diff } combined )
895950 return ;
@@ -988,39 +1043,75 @@ public override void UpdateSelectedChunk(double y)
9881043 }
9891044 }
9901045
1046+ private void OnTextViewScrollChanged ( object sender , ScrollChangedEventArgs e )
1047+ {
1048+ if ( ! TextArea . TextView . IsPointerOver )
1049+ TrySetChunk ( null ) ;
1050+ }
1051+
1052+ private ScrollViewer _scrollViewer = null ;
1053+ }
1054+
1055+ public class SingleSideTextDiffPresenter : ThemedTextDiffPresenter
1056+ {
1057+ public SingleSideTextDiffPresenter ( ) : base ( new TextArea ( ) , new TextDocument ( ) )
1058+ {
1059+ TextArea . LeftMargins . Add ( new LineNumberMargin ( true , false ) ) ;
1060+ TextArea . LeftMargins . Add ( new VerticalSeparatorMargin ( ) ) ;
1061+ TextArea . LeftMargins . Add ( new LineModifyTypeMargin ( ) ) ;
1062+ }
1063+
1064+ protected override void OnPropertyChanged ( AvaloniaPropertyChangedEventArgs change )
1065+ {
1066+ base . OnPropertyChanged ( change ) ;
1067+
1068+ if ( change . Property == BlockNavigationProperty )
1069+ {
1070+ if ( change . OldValue is ViewModels . BlockNavigation oldValue )
1071+ oldValue . PropertyChanged -= OnBlockNavigationPropertyChanged ;
1072+ if ( change . NewValue is ViewModels . BlockNavigation newValue )
1073+ newValue . PropertyChanged += OnBlockNavigationPropertyChanged ;
1074+ }
1075+ }
1076+
9911077 protected override void OnLoaded ( RoutedEventArgs e )
9921078 {
9931079 base . OnLoaded ( e ) ;
9941080
9951081 _scrollViewer = this . FindDescendantOfType < ScrollViewer > ( ) ;
9961082 if ( _scrollViewer != null )
9971083 {
998- _scrollViewer . Bind ( ScrollViewer . OffsetProperty , new Binding ( "ScrollOffset" , BindingMode . TwoWay ) ) ;
9991084 _scrollViewer . ScrollChanged += OnTextViewScrollChanged ;
1085+ _scrollViewer . Bind ( ScrollViewer . OffsetProperty , new Binding ( "ScrollOffset" , BindingMode . OneWay ) ) ;
10001086 }
10011087 }
10021088
10031089 protected override void OnUnloaded ( RoutedEventArgs e )
10041090 {
10051091 if ( _scrollViewer != null )
1092+ {
10061093 _scrollViewer . ScrollChanged -= OnTextViewScrollChanged ;
1094+ _scrollViewer = null ;
1095+ }
10071096
10081097 base . OnUnloaded ( e ) ;
1098+ GC . Collect ( ) ;
10091099 }
10101100
10111101 protected override void OnDataContextChanged ( EventArgs e )
10121102 {
10131103 base . OnDataContextChanged ( e ) ;
10141104
1015- if ( DataContext is ViewModels . CombinedTextDiff { Data : { } diff } )
1105+ if ( DataContext is ViewModels . TwoSideTextDiff diff )
10161106 {
10171107 var builder = new StringBuilder ( ) ;
1018- foreach ( var line in diff . Lines )
1108+ var lines = IsOld ? diff . Old : diff . New ;
1109+ foreach ( var line in lines )
10191110 {
1020- if ( line . Content . Length > 10000 )
1111+ if ( line . Content . Length > 1000 )
10211112 {
10221113 builder . Append ( line . Content . AsSpan ( 0 , 1000 ) ) ;
1023- builder . Append ( $ "...({ line . Content . Length - 1000 } character trimmed)") ;
1114+ builder . Append ( $ "...({ line . Content . Length - 1000 } characters trimmed)") ;
10241115 }
10251116 else
10261117 {
@@ -1039,29 +1130,9 @@ protected override void OnDataContextChanged(EventArgs e)
10391130 {
10401131 Text = string . Empty ;
10411132 }
1042-
1043- GC . Collect ( ) ;
10441133 }
10451134
1046- private void OnTextViewScrollChanged ( object sender , ScrollChangedEventArgs e )
1047- {
1048- if ( ! TextArea . TextView . IsPointerOver )
1049- TrySetChunk ( null ) ;
1050- }
1051-
1052- private ScrollViewer _scrollViewer = null ;
1053- }
1054-
1055- public class SingleSideTextDiffPresenter : ThemedTextDiffPresenter
1056- {
1057- public SingleSideTextDiffPresenter ( ) : base ( new TextArea ( ) , new TextDocument ( ) )
1058- {
1059- TextArea . LeftMargins . Add ( new LineNumberMargin ( true , false ) ) ;
1060- TextArea . LeftMargins . Add ( new VerticalSeparatorMargin ( ) ) ;
1061- TextArea . LeftMargins . Add ( new LineModifyTypeMargin ( ) ) ;
1062- }
1063-
1064- public override void UpdateSelectedChunk ( double y )
1135+ protected override void UpdateSelectedChunk ( double y )
10651136 {
10661137 if ( DataContext is not ViewModels . TwoSideTextDiff diff )
10671138 return ;
@@ -1163,77 +1234,6 @@ public override void UpdateSelectedChunk(double y)
11631234 }
11641235 }
11651236
1166- protected override void OnPropertyChanged ( AvaloniaPropertyChangedEventArgs change )
1167- {
1168- base . OnPropertyChanged ( change ) ;
1169-
1170- if ( change . Property == BlockNavigationProperty )
1171- {
1172- if ( change . OldValue is ViewModels . BlockNavigation oldValue )
1173- oldValue . PropertyChanged -= OnBlockNavigationPropertyChanged ;
1174- if ( change . NewValue is ViewModels . BlockNavigation newValue )
1175- newValue . PropertyChanged += OnBlockNavigationPropertyChanged ;
1176- }
1177- }
1178-
1179- protected override void OnLoaded ( RoutedEventArgs e )
1180- {
1181- base . OnLoaded ( e ) ;
1182-
1183- _scrollViewer = this . FindDescendantOfType < ScrollViewer > ( ) ;
1184- if ( _scrollViewer != null )
1185- {
1186- _scrollViewer . ScrollChanged += OnTextViewScrollChanged ;
1187- _scrollViewer . Bind ( ScrollViewer . OffsetProperty , new Binding ( "ScrollOffset" , BindingMode . OneWay ) ) ;
1188- }
1189- }
1190-
1191- protected override void OnUnloaded ( RoutedEventArgs e )
1192- {
1193- if ( _scrollViewer != null )
1194- {
1195- _scrollViewer . ScrollChanged -= OnTextViewScrollChanged ;
1196- _scrollViewer = null ;
1197- }
1198-
1199- base . OnUnloaded ( e ) ;
1200- GC . Collect ( ) ;
1201- }
1202-
1203- protected override void OnDataContextChanged ( EventArgs e )
1204- {
1205- base . OnDataContextChanged ( e ) ;
1206-
1207- if ( DataContext is ViewModels . TwoSideTextDiff diff )
1208- {
1209- var builder = new StringBuilder ( ) ;
1210- var lines = IsOld ? diff . Old : diff . New ;
1211- foreach ( var line in lines )
1212- {
1213- if ( line . Content . Length > 1000 )
1214- {
1215- builder . Append ( line . Content . AsSpan ( 0 , 1000 ) ) ;
1216- builder . Append ( $ "...({ line . Content . Length - 1000 } characters trimmed)") ;
1217- }
1218- else
1219- {
1220- builder . Append ( line . Content ) ;
1221- }
1222-
1223- if ( line . NoNewLineEndOfFile )
1224- builder . Append ( "\u26D4 " ) ;
1225-
1226- builder . AppendLine ( ) ;
1227- }
1228-
1229- Text = builder . ToString ( ) ;
1230- }
1231- else
1232- {
1233- Text = string . Empty ;
1234- }
1235- }
1236-
12371237 private void OnTextViewScrollChanged ( object sender , ScrollChangedEventArgs e )
12381238 {
12391239 if ( _scrollViewer == null || DataContext is not ViewModels . TwoSideTextDiff diff )
0 commit comments