public void IncorrectStructureDoNotAdded() { Document doc = DocumentHelper.CreateDocumentFillWithDummyText(); DocumentBuilder builder = new DocumentBuilder(doc); //ExStart //ExFor:EditableRange.EditorGroup //ExSummary:Shows how to add editing group for editable ranges //Add EditableRangeStart EditableRangeStart startRange1 = builder.StartEditableRange(); builder.Writeln("EditableRange_1_1"); builder.Writeln("EditableRange_1_2"); // Sets the editor for editable range region startRange1.EditableRange.EditorGroup = EditorType.Everyone; //ExEnd MemoryStream dstStream = new MemoryStream(); doc.Save(dstStream, SaveFormat.Docx); // Assert that it's not valid structure and editable ranges aren't added to the current document NodeCollection startNodes = doc.GetChildNodes(NodeType.EditableRangeStart, true); Assert.AreEqual(0, startNodes.Count); NodeCollection endNodes = doc.GetChildNodes(NodeType.EditableRangeEnd, true); Assert.AreEqual(0, endNodes.Count); }
public void RemovesEditableRange() { //ExStart //ExFor:EditableRange.Remove //ExSummary:Shows how to remove an editable range from a document. Document doc = new Document(MyDir + "Document.docx"); DocumentBuilder builder = new DocumentBuilder(doc); // Create an EditableRange so we can remove it. Does not have to be well-formed EditableRangeStart edRange1Start = builder.StartEditableRange(); EditableRange editableRange1 = edRange1Start.EditableRange; builder.Writeln("Paragraph inside editable range"); EditableRangeEnd edRange1End = builder.EndEditableRange(); Assert.AreEqual(1, doc.GetChildNodes(NodeType.EditableRangeStart, true).Count); //ExSkip Assert.AreEqual(1, doc.GetChildNodes(NodeType.EditableRangeEnd, true).Count); //ExSkip Assert.AreEqual(0, edRange1Start.EditableRange.Id); //ExSkip Assert.AreEqual("", edRange1Start.EditableRange.SingleUser); //ExSkip // Remove the range that was just made editableRange1.Remove(); //ExEnd Assert.AreEqual(0, doc.GetChildNodes(NodeType.EditableRangeStart, true).Count); Assert.AreEqual(0, doc.GetChildNodes(NodeType.EditableRangeEnd, true).Count); }
public void Nested() { //ExStart //ExFor:DocumentBuilder.StartEditableRange //ExFor:DocumentBuilder.EndEditableRange(EditableRangeStart) //ExFor:EditableRange.EditorGroup //ExSummary:Shows how to create nested editable ranges. Document doc = new Document(); doc.Protect(ProtectionType.ReadOnly, "MyPassword"); DocumentBuilder builder = new DocumentBuilder(doc); builder.Writeln("Hello world! Since we have set the document's protection level to read-only, " + "we cannot edit this paragraph without the password."); // Create two nested editable ranges. EditableRangeStart outerEditableRangeStart = builder.StartEditableRange(); builder.Writeln("This paragraph inside the outer editable range and can be edited."); EditableRangeStart innerEditableRangeStart = builder.StartEditableRange(); builder.Writeln("This paragraph inside both the outer and inner editable ranges and can be edited."); // Currently, the document builder's node insertion cursor is in more than one ongoing editable range. // When we want to end an editable range in this situation, // we need to specify which of the ranges we wish to end by passing its EditableRangeStart node. builder.EndEditableRange(innerEditableRangeStart); builder.Writeln("This paragraph inside the outer editable range and can be edited."); builder.EndEditableRange(outerEditableRangeStart); builder.Writeln("This paragraph is outside any editable ranges, and cannot be edited."); // If a region of text has two overlapping editable ranges with specified groups, // the combined group of users excluded by both groups are prevented from editing it. outerEditableRangeStart.EditableRange.EditorGroup = EditorType.Everyone; innerEditableRangeStart.EditableRange.EditorGroup = EditorType.Contributors; doc.Save(ArtifactsDir + "EditableRange.Nested.docx"); //ExEnd doc = new Document(ArtifactsDir + "EditableRange.Nested.docx"); Assert.AreEqual("Hello world! Since we have set the document's protection level to read-only, we cannot edit this paragraph without the password.\r" + "This paragraph inside the outer editable range and can be edited.\r" + "This paragraph inside both the outer and inner editable ranges and can be edited.\r" + "This paragraph inside the outer editable range and can be edited.\r" + "This paragraph is outside any editable ranges, and cannot be edited.", doc.GetText().Trim()); EditableRange editableRange = ((EditableRangeStart)doc.GetChild(NodeType.EditableRangeStart, 0, true)).EditableRange; TestUtil.VerifyEditableRange(0, string.Empty, EditorType.Everyone, editableRange); editableRange = ((EditableRangeStart)doc.GetChild(NodeType.EditableRangeStart, 1, true)).EditableRange; TestUtil.VerifyEditableRange(1, string.Empty, EditorType.Contributors, editableRange); }
public void UnrestrictedEditableRegions() { //ExStart:UnrestrictedEditableRegions // Upload a document and make it as read-only. Document doc = new Document(MyDir + "Document.docx"); DocumentBuilder builder = new DocumentBuilder(doc); doc.Protect(ProtectionType.ReadOnly, "MyPassword"); builder.Writeln("Hello world! Since we have set the document's protection level to read-only, " + "we cannot edit this paragraph without the password."); // Start an editable range. EditableRangeStart edRangeStart = builder.StartEditableRange(); // An EditableRange object is created for the EditableRangeStart that we just made. EditableRange editableRange = edRangeStart.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. EditableRangeEnd edRangeEnd = builder.EndEditableRange(); builder.Writeln("This paragraph is outside any editable ranges, and cannot be edited."); doc.Save(ArtifactsDir + "DocumentProtection.UnrestrictedEditableRegions.docx"); //ExEnd:UnrestrictedEditableRegions }
/// <summary> /// Called when an EditableRange node is encountered in the document. /// </summary> public override VisitorAction VisitEditableRangeStart(EditableRangeStart editableRangeStart) { this.IndentAndAppendLine("[EditableRange start] ID: " + editableRangeStart.Id + " Owner: " + editableRangeStart.EditableRange.SingleUser); mDocTraversalDepth++; this.mVisitorIsInsideEditableRange = true; return(VisitorAction.Continue); }
/// <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: "******"\tContents: "); mInsideEditableRange = true; // Let the visitor continue visiting other nodes return VisitorAction.Continue; }
public void RemovesEditableRange() { //ExStart //ExFor:EditableRange.Remove //ExSummary:Shows how to remove an editable range from a document. Document doc = new Document(MyDir + "Document.doc"); DocumentBuilder builder = new DocumentBuilder(doc); // Create an EditableRange so we can remove it. Does not have to be well-formed. EditableRangeStart edRange1Start = builder.StartEditableRange(); EditableRange editableRange1 = edRange1Start.EditableRange; builder.Writeln("Paragraph inside editable range"); EditableRangeEnd edRange1End = builder.EndEditableRange(); // Remove the range that was just made. editableRange1.Remove(); //ExEnd }
/// <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:\t\t" + editableRangeStart.Id); if (editableRangeStart.EditableRange.SingleUser == string.Empty) { mBuilder.AppendLine("\tGroup:\t" + editableRangeStart.EditableRange.EditorGroup); } else { mBuilder.AppendLine("\tUser:\t" + editableRangeStart.EditableRange.SingleUser); } mBuilder.AppendLine("\tContents:"); mInsideEditableRange = true; return(VisitorAction.Continue); }
public void CreateEditableRanges() { //ExStart //ExFor:DocumentBuilder.StartEditableRange //ExFor:DocumentBuilder.EndEditableRange //ExFor:DocumentBuilder.EndEditableRange(EditableRangeStart) //ExSummary:Shows how to start and end an editable range. Document doc = new Document(MyDir + "Document.doc"); 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(); // Both the start and end automatically belong to editableRange1. Console.WriteLine(editableRange1.EditableRangeStart.Equals(edRange1Start)); // True Console.WriteLine(editableRange1.EditableRangeEnd.Equals(edRange1End)); // True // 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); // Both the start and end automatically belong to editableRange2. Console.WriteLine(editableRange2.EditableRangeStart.Equals(edRange2Start)); // True Console.WriteLine(editableRange2.EditableRangeEnd.Equals(edRange2End)); // True //ExEnd }
public void IncorrectStructureDoNotAdded() { Document doc = DocumentHelper.CreateDocumentFillWithDummyText(); DocumentBuilder builder = new DocumentBuilder(doc); EditableRangeStart startRange1 = builder.StartEditableRange(); builder.Writeln("EditableRange_1_1"); builder.Writeln("EditableRange_1_2"); startRange1.EditableRange.EditorGroup = EditorType.Everyone; doc = DocumentHelper.SaveOpen(doc); // Assert that it's not valid structure and editable ranges aren't added to the current document. NodeCollection startNodes = doc.GetChildNodes(NodeType.EditableRangeStart, true); Assert.AreEqual(0, startNodes.Count); NodeCollection endNodes = doc.GetChildNodes(NodeType.EditableRangeEnd, true); Assert.AreEqual(0, endNodes.Count); }
[Test] //ExSkip public void CreateEditableRanges() { Document doc = new Document(MyDir + "Document.doc"); 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 null by default Assert.AreEqual(null, editableRange1.SingleUser); // We have to set it ourselves if we want the ranges to belong to somebody editableRange1.SingleUser = "******"; editableRange2.SingleUser = "******"; // 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()); }
public void CreateAndRemove() { //ExStart //ExFor:DocumentBuilder.StartEditableRange //ExFor:DocumentBuilder.EndEditableRange //ExFor:EditableRange //ExFor:EditableRange.EditableRangeEnd //ExFor:EditableRange.EditableRangeStart //ExFor:EditableRange.Id //ExFor:EditableRange.Remove //ExFor:EditableRangeEnd.EditableRangeStart //ExFor:EditableRangeEnd.Id //ExFor:EditableRangeEnd.NodeType //ExFor:EditableRangeStart.EditableRange //ExFor:EditableRangeStart.Id //ExFor:EditableRangeStart.NodeType //ExSummary:Shows how to work with an editable range. Document doc = new Document(); doc.Protect(ProtectionType.ReadOnly, "MyPassword"); DocumentBuilder builder = new DocumentBuilder(doc); builder.Writeln("Hello world! Since we have set the document's protection level to read-only," + " we cannot edit this paragraph without the password."); // Editable ranges allow us to leave parts of protected documents open for editing. EditableRangeStart editableRangeStart = builder.StartEditableRange(); builder.Writeln("This paragraph is inside an editable range, and can be edited."); EditableRangeEnd editableRangeEnd = builder.EndEditableRange(); // A well-formed editable range has a start node, and end node. // These nodes have matching IDs and encompass editable nodes. EditableRange editableRange = editableRangeStart.EditableRange; Assert.AreEqual(editableRangeStart.Id, editableRange.Id); Assert.AreEqual(editableRangeEnd.Id, editableRange.Id); // Different parts of the editable range link to each other. Assert.AreEqual(editableRangeStart.Id, editableRange.EditableRangeStart.Id); Assert.AreEqual(editableRangeStart.Id, editableRangeEnd.EditableRangeStart.Id); Assert.AreEqual(editableRange.Id, editableRangeStart.EditableRange.Id); Assert.AreEqual(editableRangeEnd.Id, editableRange.EditableRangeEnd.Id); // We can access the node types of each part like this. The editable range itself is not a node, // but an entity which consists of a start, an end, and their enclosed contents. Assert.AreEqual(NodeType.EditableRangeStart, editableRangeStart.NodeType); Assert.AreEqual(NodeType.EditableRangeEnd, editableRangeEnd.NodeType); builder.Writeln("This paragraph is outside the editable range, and cannot be edited."); doc.Save(ArtifactsDir + "EditableRange.CreateAndRemove.docx"); // Remove an editable range. All the nodes that were inside the range will remain intact. editableRange.Remove(); //ExEnd Assert.AreEqual("Hello world! Since we have set the document's protection level to read-only, we cannot edit this paragraph without the password.\r" + "This paragraph is inside an editable range, and can be edited.\r" + "This paragraph is outside the editable range, and cannot be edited.", doc.GetText().Trim()); Assert.AreEqual(0, doc.GetChildNodes(NodeType.EditableRangeStart, true).Count); doc = new Document(ArtifactsDir + "EditableRange.CreateAndRemove.docx"); Assert.AreEqual(ProtectionType.ReadOnly, doc.ProtectionType); Assert.AreEqual("Hello world! Since we have set the document's protection level to read-only, we cannot edit this paragraph without the password.\r" + "This paragraph is inside an editable range, and can be edited.\r" + "This paragraph is outside the editable range, and cannot be edited.", doc.GetText().Trim()); editableRange = ((EditableRangeStart)doc.GetChild(NodeType.EditableRangeStart, 0, true)).EditableRange; TestUtil.VerifyEditableRange(0, string.Empty, EditorType.Unspecified, editableRange); }