public TextChangeMap(TextChange change, ColumnsLayout columnsLayout) : base(change.Type, change.LineIndex, change.NewLine) { NewLineMap = new CobolTextLine(NewLine, columnsLayout); }
/// <summary> /// Send a change notification including all the text lines /// </summary> private void SendSocumentChangeEvent() { TextChangedEvent initialEvent = new TextChangedEvent(); int lineIndex = 0; foreach (ITextLine textLine in Lines) { TextChange lineAdded = new TextChange(TextChangeType.LineInserted, lineIndex, textLine); initialEvent.TextChanges.Add(lineAdded); lineIndex++; } RaiseTextChanged(initialEvent); }
/// <summary> /// Send a change notification including all the text lines /// </summary> private void SendDocumentChangeEvent() { TextChangedEvent textLoadedEvent = new TextChangedEvent(); foreach (var line in lines) { TextChange textChange = new TextChange(TextChangeType.LineInserted, line.LineIndex, line); textLoadedEvent.TextChanges.Add(textChange); } EventHandler<TextChangedEvent> textChangedEvent = TextChanged; if (textChangedEvent != null) { textChangedEvent(this, textLoadedEvent); } }
public override void OnDidChangeTextDocument(DidChangeTextDocumentParams parameters) { Uri objUri = new Uri(parameters.uri); if (objUri.IsFile) { string fileName = Path.GetFileName(objUri.LocalPath); var fileCompiler = typeCobolWorkspace.OpenedFileCompilers[fileName]; #region Convert text changes format from multiline range replacement to single line updates // THIS CONVERSION STILL NEEDS MORE WORK : much more complicated than you would think TextChangedEvent textChangedEvent = new TextChangedEvent(); foreach (var contentChange in parameters.contentChanges) { // Split the text updated into distinct lines string[] lineUpdates = null; bool replacementTextStartsWithNewLine = false; if(contentChange.text != null && contentChange.text.Length > 0) { replacementTextStartsWithNewLine = contentChange.text[0] == '\r' || contentChange.text[0] == '\n'; lineUpdates = contentChange.text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); } // Document cleared if (contentChange.range == null) { var textChange = new TextChange(TextChangeType.DocumentCleared, 0, null); textChangedEvent.TextChanges.Add(textChange); if (lineUpdates != null) { for (int i = 0; i < lineUpdates.Length; i++) { textChange = new TextChange(TextChangeType.LineInserted, i, new TextLineSnapshot(i, lineUpdates[i], null)); textChangedEvent.TextChanges.Add(textChange); } } } // Document updated else { // Check if the first line was inserted int firstLineIndex = contentChange.range.start.line; int firstLineChar = contentChange.range.start.character; if (replacementTextStartsWithNewLine) { firstLineIndex++; firstLineChar = 0; } // Check if the last line was deleted int lastLineIndex = contentChange.range.end.line; bool lastLineDeleted = false; if (contentChange.range.end.line > contentChange.range.start.line && contentChange.range.end.character == 0) { lastLineIndex--; lastLineDeleted = true; } if(!lastLineDeleted && contentChange.text.Length == 0) { lineUpdates = new string[0]; } // Get original lines text before change string originalFirstLineText = fileCompiler.CompilationResultsForProgram.CobolTextLines[contentChange.range.start.line].Text; string originalLastLineText = originalFirstLineText; if(lastLineIndex > firstLineIndex) { originalLastLineText = fileCompiler.CompilationResultsForProgram.CobolTextLines[lastLineIndex].Text; } // Text not modified at the beginning of the first replaced line string startOfFirstLine = null; if (firstLineChar > 0) { startOfFirstLine = originalFirstLineText.Substring(0, contentChange.range.start.character); } // Text not modified at the end of the last replaced line string endOfLastLine = null; if (!lastLineDeleted && contentChange.range.end.character < originalLastLineText.Length) { endOfLastLine = originalLastLineText.Substring(contentChange.range.end.character); } // Remove all the old lines for (int i = firstLineIndex; i <= lastLineIndex; i++) { var textChange = new TextChange(TextChangeType.LineRemoved, firstLineIndex, null); textChangedEvent.TextChanges.Add(textChange); } // Insert the updated lines if (!(startOfFirstLine == null && lineUpdates == null && endOfLastLine == null)) { int lineUpdatesCount = (lineUpdates != null && lineUpdates.Length > 0) ? lineUpdates.Length : 1; for (int i = 0; i < lineUpdatesCount; i++) { string newLine = (lineUpdates != null && lineUpdates.Length > 0) ? lineUpdates[i] : String.Empty; if (i == 0) { newLine = startOfFirstLine + newLine; } if(i == lineUpdatesCount - 1) { newLine = newLine + endOfLastLine; if (lastLineDeleted) break; } var textChange = new TextChange(TextChangeType.LineInserted, firstLineIndex + i, new TextLineSnapshot(firstLineIndex + i, newLine, null)); textChangedEvent.TextChanges.Add(textChange); } } } } #endregion // Update the source file with the computed text changes typeCobolWorkspace.UpdateSourceFile(fileName, textChangedEvent); // DEBUG information RemoteConsole.Log("Udpated source file : " + fileName); foreach(var textChange in textChangedEvent.TextChanges) { RemoteConsole.Log(" - " + textChange.ToString()); } } }