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);
        }
Exemple #4
0
        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);
        }