Beispiel #1
0
 void TrackDocument_TextChanged(object sender, MonoDevelop.Core.Text.TextChangeEventArgs e)
 {
     for (int i = 0; i < e.TextChanges.Count; ++i)
     {
         var change     = e.TextChanges[i];
         var startLine  = trackDocument.GetLineByOffset(change.NewOffset);
         var endLine    = trackDocument.GetLineByOffset(change.NewOffset + change.InsertionLength);
         var lineNumber = startLine.LineNumber;
         var oldState   = lineNumber < lineStates.Count ? lineStates [lineNumber] : null;
         if (oldState != null && oldState.state == TextDocument.LineState.Dirty)
         {
             continue;
         }
         var insertedLines = endLine.LineNumber - lineNumber;
         try {
             lineStates [lineNumber] = new LineChangeInfo(Mono.TextEditor.TextDocument.LineState.Dirty);
             if (trackDocument != null)
             {
                 trackDocument.CommitLineUpdate(lineNumber);
             }
             while (insertedLines-- > 0)
             {
                 lineStates.Insert(lineNumber, new LineChangeInfo(Mono.TextEditor.TextDocument.LineState.Dirty));
             }
         } catch (Exception ex) {
             Console.WriteLine("error while DiffTracker.TrackDocument_TextChanged:" + ex);
         }
     }
 }
		LineChangeInfo TransformLineChangeInfo(LineChangeInfo info)
		{
			if (info.Change == ChangeType.Unsaved)
				info.Change = ChangeType.Added;
			
			return info;
		}
        void HandleLineChanged(object sender, LineEventArgs e)
        {
            var lineNumber = e.Line.LineNumber;

            try {
                if (lineStates [lineNumber].state == Mono.TextEditor.TextDocument.LineState.Dirty)
                {
                    return;
                }
                lineStates [lineNumber] = new LineChangeInfo(Mono.TextEditor.TextDocument.LineState.Dirty);
                if (trackDocument != null)
                {
                    trackDocument.CommitLineUpdate(lineNumber);
                }
            } catch (Exception ex) {
                Console.WriteLine("error while DiffTracker.HandleLineChanged:" + ex);
            }
        }
Beispiel #4
0
        void TrackDocument_TextChanged(object sender, MonoDevelop.Core.Text.TextChangeEventArgs e)
        {
            var startLine     = trackDocument.GetLineByOffset(e.Offset);
            var endLine       = trackDocument.GetLineByOffset(e.Offset + e.InsertionLength);
            var lineNumber    = startLine.LineNumber;
            var insertedLines = endLine.LineNumber - lineNumber;

            try {
                lineStates [lineNumber] = new LineChangeInfo(Mono.TextEditor.TextDocument.LineState.Dirty);
                if (trackDocument != null)
                {
                    trackDocument.CommitLineUpdate(lineNumber);
                }
                while (insertedLines-- > 0)
                {
                    lineStates.Insert(lineNumber, new LineChangeInfo(Mono.TextEditor.TextDocument.LineState.Dirty));
                }
            } catch (Exception ex) {
                Console.WriteLine("error while DiffTracker.TrackDocument_TextChanged:" + ex);
            }
        }
		void ILineTracker.LineInserted(DocumentLine insertionPos, DocumentLine newLine)
		{
			int index = insertionPos.LineNumber;
			var newLineInfo = new LineChangeInfo(ChangeType.Unsaved, index, index);
			
			changeList[index] = newLineInfo;
			changeList.Insert(index + 1, newLineInfo);
		}
		void SetupInitialFileState(bool update)
		{
			if (baseDocument == null) {
				if (update)
					changeList.Transform(TransformLineChangeInfo);
				else
					changeList.InsertRange(0, document.TotalNumberOfLines + 1, LineChangeInfo.Empty);
			} else {
				changeList.Clear();
				
				Dictionary<string, int> hashes = new Dictionary<string, int>();
				
				MyersDiff.MyersDiff diff = new MyersDiff.MyersDiff(
					new DocumentSequence(baseDocument, hashes),
					new DocumentSequence(document, hashes)
				);
				
				changeList.Add(LineChangeInfo.Empty);
				int lastEndLine = 0;
				
				foreach (Edit edit in diff.GetEdits()) {
					int beginLine = edit.BeginB;
					int endLine = edit.EndB;
					
					changeList.InsertRange(changeList.Count, beginLine - lastEndLine, LineChangeInfo.Empty);
					
					LineChangeInfo change = new LineChangeInfo(edit.EditType, edit.BeginA, edit.BeginB, edit.EndA, edit.EndB);
					if (endLine == beginLine)
						changeList[changeList.Count - 1] = change;
					else
						changeList.InsertRange(changeList.Count, endLine - beginLine, change);
					
					lastEndLine = endLine;
				}
				
				changeList.InsertRange(changeList.Count, textDocument.LineCount - lastEndLine, LineChangeInfo.Empty);
			}
			
			OnChangeOccurred(EventArgs.Empty);
		}
		void HandleLineChanged (object sender, LineEventArgs e)
		{
			var lineNumber = e.Line.LineNumber;
			try {
				if (lineStates [lineNumber].state == Mono.TextEditor.TextDocument.LineState.Dirty)
					return;
				lineStates [lineNumber] = new LineChangeInfo (Mono.TextEditor.TextDocument.LineState.Dirty);
				if (trackDocument != null)
					trackDocument.CommitLineUpdate (lineNumber); 
			} catch (Exception ex) {
				Console.WriteLine ("error while DiffTracker.HandleLineChanged:" + ex);
			}
		}
		void SetupInitialFileState(bool update)
		{
			if (baseDocument == null) {
				if (update)
					changeList.Transform(TransformLineChangeInfo);
				else
					changeList.InsertRange(0, document.TotalNumberOfLines + 1, LineChangeInfo.Empty);
			} else {
				changeList.Clear();
				
				Dictionary<string, int> hashes = new Dictionary<string, int>();
				
				MyersDiff.MyersDiff diff = new MyersDiff.MyersDiff(
					new DocumentSequence(baseDocument, hashes),
					new DocumentSequence(document, hashes)
				);
				
				changeList.Add(new LineChangeInfo(ChangeType.None, ""));
				int lastEndLine = 0;
				
				foreach (Edit edit in diff.GetEdits()) {
					int beginLine = edit.BeginB;
					int endLine = edit.EndB;
					
					changeList.InsertRange(changeList.Count, beginLine - lastEndLine, LineChangeInfo.Empty);
					
					if (edit.EditType == ChangeType.Deleted) {
						LineChangeInfo change = changeList[beginLine];
						
						for (int i = edit.BeginA; i < edit.EndA; i++) {
							var line = baseDocument.GetLine(i + 1);
							change.DeletedLinesAfterThisLine += line.Text;
						}
						
						changeList[beginLine] = change;
					} else {
						var change = new LineChangeInfo(edit.EditType, "");
						changeList.InsertRange(changeList.Count, endLine - beginLine, change);
					}
					
					lastEndLine = endLine;
				}
				
				changeList.InsertRange(changeList.Count, textDocument.LineCount - lastEndLine, LineChangeInfo.Empty);
			}
			
			OnChangeOccurred(EventArgs.Empty);
		}
		void ILineTracker.LineInserted(DocumentLine insertionPos, DocumentLine newLine)
		{
			int index = insertionPos.LineNumber;
			var firstLine = changeList[index];
			var newLineInfo = new LineChangeInfo(ChangeType.Unsaved, firstLine.DeletedLinesAfterThisLine);
			
			firstLine.Change = ChangeType.Unsaved;
			firstLine.DeletedLinesAfterThisLine = "";
			
			changeList.Insert(index + 1, newLineInfo);
			changeList[index] = firstLine;
		}