~ubuntu-branches/ubuntu/trusty/monodevelop/trusty-proposed

« back to all changes in this revision

Viewing changes to src/core/Mono.Texteditor/Mono.TextEditor/Document/TextDocument.cs

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-05-12 09:46:03 UTC
  • mto: This revision was merged to the branch mainline in revision 29.
  • Revision ID: package-import@ubuntu.com-20130512094603-mad323bzcxvmcam0
Tags: upstream-4.0.5+dfsg
ImportĀ upstreamĀ versionĀ 4.0.5+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
 
39
39
namespace Mono.TextEditor
40
40
{
41
 
        public class TextDocument : AbstractAnnotatable, IBuffer, ICSharpCode.NRefactory.Editor.IDocument
 
41
        public class TextDocument : AbstractAnnotatable, ICSharpCode.NRefactory.Editor.IDocument
42
42
        {
43
43
                readonly IBuffer buffer;
44
44
                readonly ILineSplitter splitter;
58
58
                        }
59
59
                        set {
60
60
                                if (mimeType != value) {
61
 
                                        mimeType = value;
62
 
                                        SyntaxMode = SyntaxModeService.GetSyntaxMode (this);
 
61
                                        lock (this) {
 
62
                                                mimeType = value;
 
63
                                                SyntaxMode = SyntaxModeService.GetSyntaxMode (this, value);
 
64
                                        }
63
65
                                }
64
66
                        }
65
67
                }
66
68
                
 
69
                string fileName;
67
70
                public string FileName {
68
 
                        get;
69
 
                        set;
 
71
                        get {
 
72
                                return fileName;
 
73
                        }
 
74
                        set {
 
75
                                fileName = value;
 
76
                                OnFileNameChanged (EventArgs.Empty);
 
77
                        }
70
78
                }       
71
 
                
 
79
 
 
80
                public event EventHandler FileNameChanged;
 
81
 
 
82
                protected virtual void OnFileNameChanged (EventArgs e)
 
83
                {
 
84
                        EventHandler handler = this.FileNameChanged;
 
85
                        if (handler != null)
 
86
                                handler (this, e);
 
87
                }
 
88
 
72
89
                public bool HeightChanged {
73
90
                        get;
74
91
                        set;
116
133
                        splitter.LineChanged += SplitterLineSegmentTreeLineChanged;
117
134
                        splitter.LineRemoved += HandleSplitterLineSegmentTreeLineRemoved;
118
135
                        foldSegmentTree.tree.NodeRemoved += HandleFoldSegmentTreetreeNodeRemoved; 
 
136
                        textSegmentMarkerTree.InstallListener (this);
119
137
                }
120
138
 
121
139
                void HandleFoldSegmentTreetreeNodeRemoved (object sender, RedBlackTree<FoldSegment>.RedBlackTreeNodeEventArgs e)
166
184
                        }
167
185
                        set {
168
186
                                var args = new DocumentChangeEventArgs (0, Text, value);
 
187
                                textSegmentMarkerTree.Clear ();
169
188
                                OnTextReplacing (args);
170
189
                                buffer.Text = value;
 
190
                                extendingTextMarkers = new List<TextLineMarker> ();
171
191
                                splitter.Initalize (value);
172
192
                                ClearFoldSegments ();
173
193
                                OnTextReplaced (args);
178
198
                        }
179
199
                }
180
200
 
181
 
                public void Insert (int offset, string text)
 
201
                public void Insert (int offset, string text, ICSharpCode.NRefactory.Editor.AnchorMovementType anchorMovementType = AnchorMovementType.Default)
182
202
                {
183
 
                        Replace (offset, 0, text);
 
203
                        Replace (offset, 0, text, anchorMovementType);
184
204
                }
185
205
                
186
206
                public void Remove (int offset, int count)
195
215
 
196
216
                public void Replace (int offset, int count, string value)
197
217
                {
 
218
                        Replace (offset, count, value, AnchorMovementType.Default);
 
219
                }
 
220
 
 
221
                public void Replace (int offset, int count, string value, ICSharpCode.NRefactory.Editor.AnchorMovementType anchorMovementType = AnchorMovementType.Default)
 
222
                {
198
223
                        if (offset < 0)
199
224
                                throw new ArgumentOutOfRangeException ("offset", "must be > 0, was: " + offset);
200
225
                        if (offset > TextLength)
205
230
                        InterruptFoldWorker ();
206
231
                        
207
232
                        //int oldLineCount = LineCount;
208
 
                        var args = new DocumentChangeEventArgs (offset, count > 0 ? GetTextAt (offset, count) : "", value);
 
233
                        var args = new DocumentChangeEventArgs (offset, count > 0 ? GetTextAt (offset, count) : "", value, anchorMovementType);
209
234
                        OnTextReplacing (args);
210
 
                        value = args.InsertedText;
 
235
                        value = args.InsertedText.Text;
211
236
                        UndoOperation operation = null;
212
237
                        if (!isInUndo) {
213
238
                                operation = new UndoOperation (args);
454
479
                        if (lineNr < DocumentLocation.MinLine)
455
480
                                return DocumentLocation.Empty;
456
481
                        DocumentLine line = GetLine (lineNr);
457
 
                        return new DocumentLocation (lineNr, System.Math.Min (line.LengthIncludingDelimiter, offset - line.Offset) + 1);
 
482
                        var col = System.Math.Max (1, System.Math.Min (line.LengthIncludingDelimiter, offset - line.Offset) + 1);
 
483
                        return new DocumentLocation (lineNr, col);
458
484
                }
459
485
 
460
486
                public string GetLineIndent (int lineNumber)
544
570
                        
545
571
                        public virtual void Undo (TextDocument doc)
546
572
                        {
547
 
                                doc.Replace (args.Offset, args.InsertionLength, args.RemovedText);
 
573
                                doc.Replace (args.Offset, args.InsertionLength, args.RemovedText.Text);
548
574
                                OnUndoDone ();
549
575
                        }
550
576
                        
551
577
                        public virtual void Redo (TextDocument doc)
552
578
                        {
553
 
                                doc.Replace (args.Offset, args.RemovalLength, args.InsertedText);
 
579
                                doc.Replace (args.Offset, args.RemovalLength, args.InsertedText.Text);
554
580
                                OnRedoDone ();
555
581
                        }
556
582
                        
666
692
//                              op.InformTextReplace (args);
667
693
//                      }
668
694
                }
669
 
                
 
695
 
 
696
                internal int UndoBeginOffset {
 
697
                        get {
 
698
                                if (undoStack.Count == 0)
 
699
                                        return -1;
 
700
                                var op = undoStack.Peek ();
 
701
                                while (op is AtomicUndoOperation)
 
702
                                        op = ((AtomicUndoOperation)op).Operations.FirstOrDefault ();
 
703
                                if (op == null)
 
704
                                        return -1;
 
705
                                return ((UndoOperation)op).Args.Offset;
 
706
                        }
 
707
                }
 
708
 
 
709
                internal int RedoBeginOffset {
 
710
                        get {
 
711
                                if (redoStack.Count == 0)
 
712
                                        return -1;
 
713
                                var op = redoStack.Peek ();
 
714
                                while (op is AtomicUndoOperation)
 
715
                                        op = ((AtomicUndoOperation)op).Operations.FirstOrDefault ();
 
716
                                if (op == null)
 
717
                                        return -1;
 
718
                                return ((UndoOperation)op).Args.Offset;
 
719
                        }
 
720
                }
 
721
 
670
722
                public bool CanUndo {
671
723
                        get {
672
724
                                return this.undoStack.Count > 0 || currentAtomicOperation != null;
797
849
                        this.RequestUpdate (new UpdateAll ());
798
850
                        this.CommitDocumentUpdate ();
799
851
                }
800
 
                
 
852
 
 
853
                public void RollbackTo (ICSharpCode.NRefactory.Editor.ITextSourceVersion version)
 
854
                {
 
855
                        var steps = Version.CompareAge (version);
 
856
                        if (steps < 0)
 
857
                                throw new InvalidOperationException ("Invalid version");
 
858
                        while (steps-- > 0) {
 
859
                                undoStack.Pop ().Undo (this);
 
860
                        }
 
861
                }
 
862
 
801
863
                internal protected virtual void OnUndone (UndoOperationEventArgs e)
802
864
                {
803
865
                        EventHandler<UndoOperationEventArgs> handler = this.Undone;
982
1044
                        if (newSegments == null) {
983
1045
                                return;
984
1046
                        }
985
 
                        Console.WriteLine ("startTask={0}, useApplicationInvoke={1}", startTask, useApplicationInvoke);
986
1047
                        
987
1048
                        InterruptFoldWorker ();
988
1049
                        bool update;
1206
1267
                
1207
1268
                public event EventHandler<FoldSegmentEventArgs> Folded;
1208
1269
                #endregion
1209
 
                
 
1270
 
 
1271
                #region Text line markers
 
1272
 
1210
1273
                public event EventHandler<TextMarkerEvent> MarkerAdded;
1211
1274
                protected virtual void OnMarkerAdded (TextMarkerEvent e)
1212
1275
                {
1224
1287
                }
1225
1288
 
1226
1289
                
1227
 
                List<TextMarker> extendingTextMarkers = new List<TextMarker> ();
 
1290
                List<TextLineMarker> extendingTextMarkers = new List<TextLineMarker> ();
1228
1291
                public IEnumerable<DocumentLine> LinesWithExtendingTextMarkers {
1229
1292
                        get {
1230
1293
                                return from marker in extendingTextMarkers where marker.LineSegment != null select marker.LineSegment;
1231
1294
                        }
1232
1295
                }
1233
1296
                
1234
 
                public void AddMarker (int lineNumber, TextMarker marker)
 
1297
                public void AddMarker (int lineNumber, TextLineMarker marker)
1235
1298
                {
1236
1299
                        AddMarker (this.GetLine (lineNumber), marker);
1237
1300
                }
1238
1301
                
1239
 
                public void AddMarker (DocumentLine line, TextMarker marker)
 
1302
                public void AddMarker (DocumentLine line, TextLineMarker marker)
1240
1303
                {
1241
1304
                        AddMarker (line, marker, true);
1242
1305
                }
1243
 
                
1244
 
                public void AddMarker (DocumentLine line, TextMarker marker, bool commitUpdate)
 
1306
 
 
1307
                public void AddMarker (DocumentLine line, TextLineMarker marker, bool commitUpdate)
1245
1308
                {
1246
1309
                        if (line == null || marker == null)
1247
1310
                                return;
1248
 
                        if (marker is IExtendingTextMarker) {
 
1311
                        if (marker is IExtendingTextLineMarker) {
1249
1312
                                lock (extendingTextMarkers) {
1250
1313
                                        HeightChanged = true;
1251
1314
                                        extendingTextMarkers.Add (marker);
1258
1321
                                this.CommitLineUpdate (line);
1259
1322
                }
1260
1323
                
1261
 
                static int CompareMarkers (TextMarker left, TextMarker right)
 
1324
                static int CompareMarkers (TextLineMarker left, TextLineMarker right)
1262
1325
                {
1263
1326
                        if (left.LineSegment == null || right.LineSegment == null)
1264
1327
                                return 0;
1265
1328
                        return left.LineSegment.Offset.CompareTo (right.LineSegment.Offset);
1266
1329
                }
1267
1330
                
1268
 
                public void RemoveMarker (TextMarker marker)
 
1331
                public void RemoveMarker (TextLineMarker marker)
1269
1332
                {
1270
1333
                        RemoveMarker (marker, true);
1271
1334
                }
1272
1335
                
1273
 
                public void RemoveMarker (TextMarker marker, bool updateLine)
 
1336
                public void RemoveMarker (TextLineMarker marker, bool updateLine)
1274
1337
                {
1275
1338
                        if (marker == null)
1276
1339
                                return;
1277
1340
                        var line = marker.LineSegment;
1278
1341
                        if (line == null)
1279
1342
                                return;
1280
 
                        if (marker is IExtendingTextMarker) {
 
1343
                        if (marker is IExtendingTextLineMarker) {
1281
1344
                                lock (extendingTextMarkers) {
1282
1345
                                        HeightChanged = true;
1283
1346
                                        extendingTextMarkers.Remove (marker);
1307
1370
                {
1308
1371
                        if (line == null || type == null)
1309
1372
                                return;
1310
 
                        if (typeof(IExtendingTextMarker).IsAssignableFrom (type)) {
 
1373
                        if (typeof(IExtendingTextLineMarker).IsAssignableFrom (type)) {
1311
1374
                                lock (extendingTextMarkers) {
1312
1375
                                        HeightChanged = true;
1313
 
                                        foreach (TextMarker marker in line.Markers.Where (marker => marker is IExtendingTextMarker)) {
 
1376
                                        foreach (TextLineMarker marker in line.Markers.Where (marker => marker is IExtendingTextLineMarker)) {
1314
1377
                                                extendingTextMarkers.Remove (marker);
1315
1378
                                        }
1316
1379
                                }
1319
1382
                        if (updateLine)
1320
1383
                                this.CommitLineUpdate (line);
1321
1384
                }
 
1385
 
 
1386
                #endregion
 
1387
 
 
1388
                #region Text segment markers
 
1389
 
 
1390
                SegmentTree<TextSegmentMarker> textSegmentMarkerTree = new SegmentTree<TextSegmentMarker> (); 
 
1391
 
 
1392
                public IEnumerable<TextSegmentMarker> GetTextSegmentMarkersAt (DocumentLine line)
 
1393
                {
 
1394
                        return textSegmentMarkerTree.GetSegmentsOverlapping (line.Segment);
 
1395
                }
 
1396
 
 
1397
                public IEnumerable<TextSegmentMarker> GetTextSegmentMarkersAt (TextSegment segment)
 
1398
                {
 
1399
                        return textSegmentMarkerTree.GetSegmentsOverlapping (segment);
 
1400
                }
 
1401
 
 
1402
                public IEnumerable<TextSegmentMarker> GetTextSegmentMarkersAt (int offset)
 
1403
                {
 
1404
                        return textSegmentMarkerTree.GetSegmentsAt (offset);
 
1405
                }
1322
1406
                
 
1407
 
 
1408
                public void AddMarker (TextSegmentMarker marker)
 
1409
                {
 
1410
                        CommitLineUpdate (GetLineByOffset (marker.Offset));
 
1411
                        textSegmentMarkerTree.Add (marker);
 
1412
                }
 
1413
 
 
1414
                /// <summary>
 
1415
                /// Removes a marker from the document.
 
1416
                /// </summary>
 
1417
                /// <returns><c>true</c>, if marker was removed, <c>false</c> otherwise.</returns>
 
1418
                /// <param name="marker">Marker.</param>
 
1419
                public bool RemoveMarker (TextSegmentMarker marker)
 
1420
                {
 
1421
                        bool wasRemoved = textSegmentMarkerTree.Remove (marker);
 
1422
                        if (wasRemoved)
 
1423
                                CommitLineUpdate (GetLineByOffset (marker.Offset));
 
1424
                        return wasRemoved;
 
1425
                }
 
1426
 
 
1427
                #endregion
 
1428
 
1323
1429
                void HandleSplitterLineSegmentTreeLineRemoved (object sender, LineEventArgs e)
1324
1430
                {
1325
 
                        foreach (TextMarker marker in e.Line.Markers) {
1326
 
                                if (marker is IExtendingTextMarker) {
 
1431
                        foreach (TextLineMarker marker in e.Line.Markers) {
 
1432
                                if (marker is IExtendingTextLineMarker) {
1327
1433
                                        lock (extendingTextMarkers) {
1328
1434
                                                HeightChanged = true;
1329
1435
                                                extendingTextMarkers.Remove (marker);
1330
1436
                                        }
1331
 
                                        UnRegisterVirtualTextMarker ((IExtendingTextMarker)marker);
 
1437
                                        UnRegisterVirtualTextMarker ((IExtendingTextLineMarker)marker);
1332
1438
                                }
1333
1439
                        }
1334
1440
                }
1537
1643
                        }
1538
1644
                }
1539
1645
                
1540
 
                Dictionary<int, IExtendingTextMarker> virtualTextMarkers = new Dictionary<int, IExtendingTextMarker> ();
1541
 
                public void RegisterVirtualTextMarker (int lineNumber, IExtendingTextMarker marker)
 
1646
                Dictionary<int, IExtendingTextLineMarker> virtualTextMarkers = new Dictionary<int, IExtendingTextLineMarker> ();
 
1647
                public void RegisterVirtualTextMarker (int lineNumber, IExtendingTextLineMarker marker)
1542
1648
                {
1543
1649
                        virtualTextMarkers[lineNumber] = marker;
1544
1650
                }
1545
1651
                
1546
 
                public IExtendingTextMarker GetExtendingTextMarker (int lineNumber)
 
1652
                public IExtendingTextLineMarker GetExtendingTextMarker (int lineNumber)
1547
1653
                {
1548
 
                        IExtendingTextMarker result;
 
1654
                        IExtendingTextLineMarker result;
1549
1655
                        if (virtualTextMarkers.TryGetValue (lineNumber, out result))
1550
1656
                                return result;
1551
1657
                        return null;
1557
1663
                /// <param name='marker'>
1558
1664
                /// marker.
1559
1665
                /// </param>
1560
 
                public void UnRegisterVirtualTextMarker (IExtendingTextMarker marker)
 
1666
                public void UnRegisterVirtualTextMarker (IExtendingTextLineMarker marker)
1561
1667
                {
1562
1668
                        var keys = new List<int> (from pair in virtualTextMarkers where pair.Value == marker select pair.Key);
1563
1669
                        keys.ForEach (key => { virtualTextMarkers.Remove (key); CommitLineUpdate (key); });
1692
1798
                        return OffsetToLocation (offset);
1693
1799
                }
1694
1800
 
 
1801
                void ICSharpCode.NRefactory.Editor.IDocument.Insert (int offset, ITextSource text)
 
1802
                {
 
1803
                        Insert (offset, text.Text);
 
1804
                }
 
1805
 
 
1806
                void ICSharpCode.NRefactory.Editor.IDocument.Replace (int offset, int count, ITextSource text)
 
1807
                {
 
1808
                        Replace (offset, count, text.Text);
 
1809
                }
 
1810
 
1695
1811
                void ICSharpCode.NRefactory.Editor.IDocument.Insert (int offset, string text)
1696
1812
                {
1697
1813
                        Insert (offset, text);
1698
1814
                }
1699
1815
 
1700
 
                public void Insert (int offset, string text, ICSharpCode.NRefactory.Editor.AnchorMovementType defaultAnchorMovementType)
1701
 
                {
1702
 
                        Insert (offset, text);
 
1816
                void ICSharpCode.NRefactory.Editor.IDocument.Insert (int offset, ITextSource text, AnchorMovementType anchorMovementType)
 
1817
                {
 
1818
                        Insert (offset, text.Text, anchorMovementType);
 
1819
                }
 
1820
 
 
1821
                void ICSharpCode.NRefactory.Editor.IDocument.Insert (int offset, string text, AnchorMovementType anchorMovementType)
 
1822
                {
 
1823
                        Insert (offset, text, anchorMovementType);
1703
1824
                }
1704
1825
 
1705
1826
                void ICSharpCode.NRefactory.Editor.IDocument.StartUndoableAction ()
1726
1847
                #endregion
1727
1848
 
1728
1849
                #region ITextSource implementation
 
1850
                void ICSharpCode.NRefactory.Editor.ITextSource.WriteTextTo (System.IO.TextWriter writer)
 
1851
                {
 
1852
                        throw new NotImplementedException ();
 
1853
                }
 
1854
 
 
1855
                void ICSharpCode.NRefactory.Editor.ITextSource.WriteTextTo (System.IO.TextWriter writer, int offset, int length)
 
1856
                {
 
1857
                        throw new NotImplementedException ();
 
1858
                }
 
1859
 
1729
1860
                ICSharpCode.NRefactory.Editor.ITextSource ICSharpCode.NRefactory.Editor.ITextSource.CreateSnapshot ()
1730
1861
                {
1731
1862
                        throw new NotImplementedException ();
1789
1920
                {
1790
1921
                        return new SnapshotDocument (Text, Version);
1791
1922
                }
 
1923
 
 
1924
 
 
1925
 
1792
1926
                #endregion
1793
1927
        }
1794
1928