EditableRangeStartId Property |
Namespace: Aspose.Words
public void CreateEditableRanges() { Document doc = new Document(MyDir + "Document.docx"); DocumentBuilder builder = new DocumentBuilder(doc); // Start an editable range EditableRangeStart edRange1Start = builder.StartEditableRange(); // An EditableRange object is created for the EditableRangeStart that we just made EditableRange editableRange1 = edRange1Start.EditableRange; // Put something inside the editable range builder.Writeln("Paragraph inside first editable range"); // An editable range is well-formed if it has a start and an end // Multiple editable ranges can be nested and overlapping EditableRangeEnd edRange1End = builder.EndEditableRange(); // Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with EditableRangeStart edRange2Start = builder.StartEditableRange(); builder.Writeln("Paragraph inside second editable range"); EditableRange editableRange2 = edRange2Start.EditableRange; EditableRangeEnd edRange2End = builder.EndEditableRange(edRange2Start); // Editable range starts and ends have their own respective node types Assert.AreEqual(NodeType.EditableRangeStart, edRange1Start.NodeType); Assert.AreEqual(NodeType.EditableRangeEnd, edRange1End.NodeType); // Editable range IDs are unique and set automatically Assert.AreEqual(0, editableRange1.Id); Assert.AreEqual(1, editableRange2.Id); // Editable range starts and ends always belong to a range Assert.AreEqual(edRange1Start, editableRange1.EditableRangeStart); Assert.AreEqual(edRange1End, editableRange1.EditableRangeEnd); // They also inherit the ID of the entire editable range that they belong to Assert.AreEqual(editableRange1.Id, edRange1Start.Id); Assert.AreEqual(editableRange1.Id, edRange1End.Id); Assert.AreEqual(editableRange2.Id, edRange2Start.EditableRange.Id); Assert.AreEqual(editableRange2.Id, edRange2End.EditableRangeStart.EditableRange.Id); // If the editable range was found in a document, it will probably have something in the single user property // But if we make one programmatically, the property is empty by default Assert.AreEqual(string.Empty, editableRange1.SingleUser); // We have to set it ourselves if we want the ranges to belong to somebody editableRange1.SingleUser = "john.doe@myoffice.com"; editableRange2.SingleUser = "jane.doe@myoffice.com"; // Initialize a custom visitor for editable ranges that will print their contents EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter(); // Both the start and end of an editable range can accept visitors, but not the editable range itself edRange1Start.Accept(editableRangeReader); edRange2End.Accept(editableRangeReader); // Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor editableRangeReader.Reset(); doc.Accept(editableRangeReader); Console.WriteLine(editableRangeReader.ToText()); } /// <summary> /// Visitor implementation that prints attributes and contents of ranges. /// </summary> public class EditableRangeInfoPrinter : DocumentVisitor { public EditableRangeInfoPrinter() { mBuilder = new StringBuilder(); } public string ToText() { return mBuilder.ToString(); } public void Reset() { mBuilder.Clear(); mInsideEditableRange = false; } /// <summary> /// Called when an EditableRangeStart node is encountered in the document. /// </summary> public override VisitorAction VisitEditableRangeStart(EditableRangeStart editableRangeStart) { mBuilder.AppendLine(" -- Editable range found! -- "); mBuilder.AppendLine("\tID: " + editableRangeStart.Id); mBuilder.AppendLine("\tUser: " + editableRangeStart.EditableRange.SingleUser); mBuilder.AppendLine("\tContents: "); mInsideEditableRange = true; // Let the visitor continue visiting other nodes return VisitorAction.Continue; } /// <summary> /// Called when an EditableRangeEnd node is encountered in the document. /// </summary> public override VisitorAction VisitEditableRangeEnd(EditableRangeEnd editableRangeEnd) { mBuilder.AppendLine(" -- End of editable range -- "); mInsideEditableRange = false; // Let the visitor continue visiting other nodes return VisitorAction.Continue; } /// <summary> /// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded. /// </summary> public override VisitorAction VisitRun(Run run) { if (mInsideEditableRange) mBuilder.AppendLine("\t\"" + run.Text + "\""); // Let the visitor continue visiting other nodes return VisitorAction.Continue; } private bool mInsideEditableRange; private readonly StringBuilder mBuilder; }