Aspose::Words::CommentRangeEnd Class Referencefinal

Detailed Description

Denotes the end of a region of text that has a comment associated with it.

To create a comment anchored to a region of text, you need to create a Comment and then create CommentRangeStart and CommentRangeEnd and set their identifiers to the same Id value.

CommentRangeEnd is an inline-level node and can only be a child of Paragraph.

See also
Aspose::Words::Comment
Aspose::Words::CommentRangeStart
Examples

Shows how print the contents of all comments and their comment ranges using a document visitor.

void CreateCommentsAndPrintAllInfo()
{
auto doc = MakeObject<Document>();
auto newComment = MakeObject<Comment>(doc);
newComment->set_Author(u"VDeryushev");
newComment->set_Initial(u"VD");
newComment->set_DateTime(System::DateTime::get_Now());
newComment->SetText(u"Comment regarding text.");
// Add text to the document, warp it in a comment range, and then add your comment.
SharedPtr<Paragraph> para = doc->get_FirstSection()->get_Body()->get_FirstParagraph();
para->AppendChild(MakeObject<CommentRangeStart>(doc, newComment->get_Id()));
para->AppendChild(MakeObject<Run>(doc, u"Commented text."));
para->AppendChild(MakeObject<CommentRangeEnd>(doc, newComment->get_Id()));
para->AppendChild(newComment);
// Add two replies to the comment.
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"New reply.");
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"Another reply.");
PrintAllCommentInfo(doc->GetChildNodes(NodeType::Comment, true));
}
static void PrintAllCommentInfo(SharedPtr<NodeCollection> comments)
{
auto commentVisitor = MakeObject<ExComment::CommentInfoPrinter>();
// Iterate over all top-level comments. Unlike reply-type comments, top-level comments have no ancestor.
std::function<bool(SharedPtr<Node> c)> haveNoAncestor = [](SharedPtr<Node> c)
{
return (System::DynamicCast<Comment>(c))->get_Ancestor() == nullptr;
};
for (auto comment : System::IterateOver<Comment>(comments->LINQ_Where(haveNoAncestor)))
{
// First, visit the start of the comment range.
auto commentRangeStart = System::DynamicCast<CommentRangeStart>(comment->get_PreviousSibling()->get_PreviousSibling()->get_PreviousSibling());
commentRangeStart->Accept(commentVisitor);
// Then, visit the comment, and any replies that it may have.
comment->Accept(commentVisitor);
for (const auto& reply : System::IterateOver<Comment>(comment->get_Replies()))
{
reply->Accept(commentVisitor);
}
// Finally, visit the end of the comment range, and then print the visitor's text contents.
auto commentRangeEnd = System::DynamicCast<CommentRangeEnd>(comment->get_PreviousSibling());
commentRangeEnd->Accept(commentVisitor);
std::cout << commentVisitor->GetText() << std::endl;
}
}
class CommentInfoPrinter : public DocumentVisitor
{
public:
CommentInfoPrinter() : mVisitorIsInsideComment(false), mDocTraversalDepth(0)
{
mBuilder = MakeObject<System::Text::StringBuilder>();
mVisitorIsInsideComment = false;
}
String GetText()
{
return mBuilder->ToString();
}
VisitorAction VisitRun(SharedPtr<Run> run) override
{
if (mVisitorIsInsideComment)
{
IndentAndAppendLine(String(u"[Run] \"") + run->get_Text() + u"\"");
}
}
VisitorAction VisitCommentRangeStart(SharedPtr<CommentRangeStart> commentRangeStart) override
{
IndentAndAppendLine(String(u"[Comment range start] ID: ") + commentRangeStart->get_Id());
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentRangeEnd(SharedPtr<CommentRangeEnd> commentRangeEnd) override
{
mDocTraversalDepth--;
IndentAndAppendLine(String(u"[Comment range end] ID: ") + commentRangeEnd->get_Id() + u"\n");
mVisitorIsInsideComment = false;
}
VisitorAction VisitCommentStart(SharedPtr<Comment> comment) override
{
IndentAndAppendLine(
String::Format(u"[Comment start] For comment range ID {0}, By {1} on {2}", comment->get_Id(), comment->get_Author(), comment->get_DateTime()));
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentEnd(SharedPtr<Comment> comment) override
{
mDocTraversalDepth--;
IndentAndAppendLine(u"[Comment end]");
mVisitorIsInsideComment = false;
}
private:
bool mVisitorIsInsideComment;
int mDocTraversalDepth;
SharedPtr<System::Text::StringBuilder> mBuilder;
void IndentAndAppendLine(String text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mBuilder->Append(u"| ");
}
mBuilder->AppendLine(text);
}
};

#include <Aspose.Words.Cpp/CommentRangeEnd.h>

+ Inheritance diagram for Aspose::Words::CommentRangeEnd:

Public Member Functions

 CommentRangeEnd (const SharedPtr< DocumentBase > &doc, int32_t id)
 Initializes a new instance of this class. More...
 
bool Accept (SharedPtr< DocumentVisitor > visitor) override
 Accepts a visitor. More...
 
int32_t get_Id () const
 Specifies the identifier of the comment to which this region is linked to. More...
 
NodeType get_NodeType () const override
 Returns CommentRangeEnd. More...
 
virtual const TypeInfoGetType () const override
 
virtual bool Is (const TypeInfo &target) const override
 
void set_Id (int32_t value)
 Setter for get_Id. More...
 
- Public Member Functions inherited from Node
SharedPtr< NodeClone (bool isCloneChildren)
 Creates a duplicate of the node. More...
 
int32_t get_CustomNodeId () const
 Specifies custom node identifier. More...
 
virtual SharedPtr< DocumentBaseget_Document () const
 Gets the document to which this node belongs. More...
 
virtual bool get_IsComposite ()
 Returns true if this node can contain other nodes. More...
 
SharedPtr< Nodeget_NextSibling ()
 Gets the node immediately following this node. More...
 
SharedPtr< CompositeNodeget_ParentNode ()
 Gets the immediate parent of this node. More...
 
SharedPtr< Nodeget_PreviousSibling ()
 Gets the node immediately preceding this node. More...
 
SharedPtr< Rangeget_Range ()
 Returns a Range object that represents the portion of a document that is contained in this node. More...
 
SharedPtr< CompositeNodeGetAncestor (NodeType ancestorType)
 Gets the first ancestor of the specified NodeType. More...
 
template<typename T >
GetAncestorOf ()
 
virtual String GetText ()
 Gets the text of this node and of all its children. More...
 
SharedPtr< NodeNextPreOrder (const SharedPtr< Node > &rootNode)
 Gets next node according to the pre-order tree traversal algorithm. More...
 
SharedPtr< NodePreviousPreOrder (const SharedPtr< Node > &rootNode)
 Gets the previous node according to the pre-order tree traversal algorithm. More...
 
void Remove ()
 Removes itself from the parent. More...
 
void set_CustomNodeId (int32_t value)
 Setter for get_CustomNodeId. More...
 
String ToString (SaveFormat saveFormat)
 Exports the content of the node into a string in the specified format. More...
 
String ToString (const SharedPtr< SaveOptions > &saveOptions)
 Exports the content of the node into a string using the specified save options. More...
 

Static Public Member Functions

static const TypeInfoType ()
 
- Static Public Member Functions inherited from Node
static String NodeTypeToString (NodeType nodeType)
 A utility method that converts a node type enum value into a user friendly string. More...
 
static const TypeInfoType ()
 

Constructor & Destructor Documentation

◆ CommentRangeEnd()

Aspose::Words::CommentRangeEnd::CommentRangeEnd ( const System::SharedPtr< Aspose::Words::DocumentBase > &  doc,
int32_t  id 
)

Initializes a new instance of this class.

When CommentRangeEnd is created, it belongs to the specified document, but is not yet part of the document and ParentNode is null.

To append a CommentRangeEnd to the document use InsertAfter or InsertBefore on the paragraph where you want the comment inserted.

Parameters
docThe owner document.
idThe comment identifier to which this object is linked.
Examples

Shows how print the contents of all comments and their comment ranges using a document visitor.

void CreateCommentsAndPrintAllInfo()
{
auto doc = MakeObject<Document>();
auto newComment = MakeObject<Comment>(doc);
newComment->set_Author(u"VDeryushev");
newComment->set_Initial(u"VD");
newComment->set_DateTime(System::DateTime::get_Now());
newComment->SetText(u"Comment regarding text.");
// Add text to the document, warp it in a comment range, and then add your comment.
SharedPtr<Paragraph> para = doc->get_FirstSection()->get_Body()->get_FirstParagraph();
para->AppendChild(MakeObject<CommentRangeStart>(doc, newComment->get_Id()));
para->AppendChild(MakeObject<Run>(doc, u"Commented text."));
para->AppendChild(MakeObject<CommentRangeEnd>(doc, newComment->get_Id()));
para->AppendChild(newComment);
// Add two replies to the comment.
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"New reply.");
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"Another reply.");
PrintAllCommentInfo(doc->GetChildNodes(NodeType::Comment, true));
}
static void PrintAllCommentInfo(SharedPtr<NodeCollection> comments)
{
auto commentVisitor = MakeObject<ExComment::CommentInfoPrinter>();
// Iterate over all top-level comments. Unlike reply-type comments, top-level comments have no ancestor.
std::function<bool(SharedPtr<Node> c)> haveNoAncestor = [](SharedPtr<Node> c)
{
return (System::DynamicCast<Comment>(c))->get_Ancestor() == nullptr;
};
for (auto comment : System::IterateOver<Comment>(comments->LINQ_Where(haveNoAncestor)))
{
// First, visit the start of the comment range.
auto commentRangeStart = System::DynamicCast<CommentRangeStart>(comment->get_PreviousSibling()->get_PreviousSibling()->get_PreviousSibling());
commentRangeStart->Accept(commentVisitor);
// Then, visit the comment, and any replies that it may have.
comment->Accept(commentVisitor);
for (const auto& reply : System::IterateOver<Comment>(comment->get_Replies()))
{
reply->Accept(commentVisitor);
}
// Finally, visit the end of the comment range, and then print the visitor's text contents.
auto commentRangeEnd = System::DynamicCast<CommentRangeEnd>(comment->get_PreviousSibling());
commentRangeEnd->Accept(commentVisitor);
std::cout << commentVisitor->GetText() << std::endl;
}
}
class CommentInfoPrinter : public DocumentVisitor
{
public:
CommentInfoPrinter() : mVisitorIsInsideComment(false), mDocTraversalDepth(0)
{
mBuilder = MakeObject<System::Text::StringBuilder>();
mVisitorIsInsideComment = false;
}
String GetText()
{
return mBuilder->ToString();
}
VisitorAction VisitRun(SharedPtr<Run> run) override
{
if (mVisitorIsInsideComment)
{
IndentAndAppendLine(String(u"[Run] \"") + run->get_Text() + u"\"");
}
}
VisitorAction VisitCommentRangeStart(SharedPtr<CommentRangeStart> commentRangeStart) override
{
IndentAndAppendLine(String(u"[Comment range start] ID: ") + commentRangeStart->get_Id());
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentRangeEnd(SharedPtr<CommentRangeEnd> commentRangeEnd) override
{
mDocTraversalDepth--;
IndentAndAppendLine(String(u"[Comment range end] ID: ") + commentRangeEnd->get_Id() + u"\n");
mVisitorIsInsideComment = false;
}
VisitorAction VisitCommentStart(SharedPtr<Comment> comment) override
{
IndentAndAppendLine(
String::Format(u"[Comment start] For comment range ID {0}, By {1} on {2}", comment->get_Id(), comment->get_Author(), comment->get_DateTime()));
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentEnd(SharedPtr<Comment> comment) override
{
mDocTraversalDepth--;
IndentAndAppendLine(u"[Comment end]");
mVisitorIsInsideComment = false;
}
private:
bool mVisitorIsInsideComment;
int mDocTraversalDepth;
SharedPtr<System::Text::StringBuilder> mBuilder;
void IndentAndAppendLine(String text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mBuilder->Append(u"| ");
}
mBuilder->AppendLine(text);
}
};

Member Function Documentation

◆ Accept()

bool Aspose::Words::CommentRangeEnd::Accept ( System::SharedPtr< Aspose::Words::DocumentVisitor visitor)
overridevirtual

Accepts a visitor.

Calls VisitCommentRangeEnd().

For more info see the Visitor design pattern.

Parameters
visitorThe visitor that will visit the node.
Returns
False if the visitor requested the enumeration to stop.
Examples

Shows how print the contents of all comments and their comment ranges using a document visitor.

void CreateCommentsAndPrintAllInfo()
{
auto doc = MakeObject<Document>();
auto newComment = MakeObject<Comment>(doc);
newComment->set_Author(u"VDeryushev");
newComment->set_Initial(u"VD");
newComment->set_DateTime(System::DateTime::get_Now());
newComment->SetText(u"Comment regarding text.");
// Add text to the document, warp it in a comment range, and then add your comment.
SharedPtr<Paragraph> para = doc->get_FirstSection()->get_Body()->get_FirstParagraph();
para->AppendChild(MakeObject<CommentRangeStart>(doc, newComment->get_Id()));
para->AppendChild(MakeObject<Run>(doc, u"Commented text."));
para->AppendChild(MakeObject<CommentRangeEnd>(doc, newComment->get_Id()));
para->AppendChild(newComment);
// Add two replies to the comment.
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"New reply.");
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"Another reply.");
PrintAllCommentInfo(doc->GetChildNodes(NodeType::Comment, true));
}
static void PrintAllCommentInfo(SharedPtr<NodeCollection> comments)
{
auto commentVisitor = MakeObject<ExComment::CommentInfoPrinter>();
// Iterate over all top-level comments. Unlike reply-type comments, top-level comments have no ancestor.
std::function<bool(SharedPtr<Node> c)> haveNoAncestor = [](SharedPtr<Node> c)
{
return (System::DynamicCast<Comment>(c))->get_Ancestor() == nullptr;
};
for (auto comment : System::IterateOver<Comment>(comments->LINQ_Where(haveNoAncestor)))
{
// First, visit the start of the comment range.
auto commentRangeStart = System::DynamicCast<CommentRangeStart>(comment->get_PreviousSibling()->get_PreviousSibling()->get_PreviousSibling());
commentRangeStart->Accept(commentVisitor);
// Then, visit the comment, and any replies that it may have.
comment->Accept(commentVisitor);
for (const auto& reply : System::IterateOver<Comment>(comment->get_Replies()))
{
reply->Accept(commentVisitor);
}
// Finally, visit the end of the comment range, and then print the visitor's text contents.
auto commentRangeEnd = System::DynamicCast<CommentRangeEnd>(comment->get_PreviousSibling());
commentRangeEnd->Accept(commentVisitor);
std::cout << commentVisitor->GetText() << std::endl;
}
}
class CommentInfoPrinter : public DocumentVisitor
{
public:
CommentInfoPrinter() : mVisitorIsInsideComment(false), mDocTraversalDepth(0)
{
mBuilder = MakeObject<System::Text::StringBuilder>();
mVisitorIsInsideComment = false;
}
String GetText()
{
return mBuilder->ToString();
}
VisitorAction VisitRun(SharedPtr<Run> run) override
{
if (mVisitorIsInsideComment)
{
IndentAndAppendLine(String(u"[Run] \"") + run->get_Text() + u"\"");
}
}
VisitorAction VisitCommentRangeStart(SharedPtr<CommentRangeStart> commentRangeStart) override
{
IndentAndAppendLine(String(u"[Comment range start] ID: ") + commentRangeStart->get_Id());
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentRangeEnd(SharedPtr<CommentRangeEnd> commentRangeEnd) override
{
mDocTraversalDepth--;
IndentAndAppendLine(String(u"[Comment range end] ID: ") + commentRangeEnd->get_Id() + u"\n");
mVisitorIsInsideComment = false;
}
VisitorAction VisitCommentStart(SharedPtr<Comment> comment) override
{
IndentAndAppendLine(
String::Format(u"[Comment start] For comment range ID {0}, By {1} on {2}", comment->get_Id(), comment->get_Author(), comment->get_DateTime()));
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentEnd(SharedPtr<Comment> comment) override
{
mDocTraversalDepth--;
IndentAndAppendLine(u"[Comment end]");
mVisitorIsInsideComment = false;
}
private:
bool mVisitorIsInsideComment;
int mDocTraversalDepth;
SharedPtr<System::Text::StringBuilder> mBuilder;
void IndentAndAppendLine(String text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mBuilder->Append(u"| ");
}
mBuilder->AppendLine(text);
}
};

Implements Aspose::Words::Node.

◆ get_Id()

int32_t Aspose::Words::CommentRangeEnd::get_Id ( ) const

Specifies the identifier of the comment to which this region is linked to.

Examples

Shows how print the contents of all comments and their comment ranges using a document visitor.

void CreateCommentsAndPrintAllInfo()
{
auto doc = MakeObject<Document>();
auto newComment = MakeObject<Comment>(doc);
newComment->set_Author(u"VDeryushev");
newComment->set_Initial(u"VD");
newComment->set_DateTime(System::DateTime::get_Now());
newComment->SetText(u"Comment regarding text.");
// Add text to the document, warp it in a comment range, and then add your comment.
SharedPtr<Paragraph> para = doc->get_FirstSection()->get_Body()->get_FirstParagraph();
para->AppendChild(MakeObject<CommentRangeStart>(doc, newComment->get_Id()));
para->AppendChild(MakeObject<Run>(doc, u"Commented text."));
para->AppendChild(MakeObject<CommentRangeEnd>(doc, newComment->get_Id()));
para->AppendChild(newComment);
// Add two replies to the comment.
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"New reply.");
newComment->AddReply(u"John Doe", u"JD", System::DateTime::get_Now(), u"Another reply.");
PrintAllCommentInfo(doc->GetChildNodes(NodeType::Comment, true));
}
static void PrintAllCommentInfo(SharedPtr<NodeCollection> comments)
{
auto commentVisitor = MakeObject<ExComment::CommentInfoPrinter>();
// Iterate over all top-level comments. Unlike reply-type comments, top-level comments have no ancestor.
std::function<bool(SharedPtr<Node> c)> haveNoAncestor = [](SharedPtr<Node> c)
{
return (System::DynamicCast<Comment>(c))->get_Ancestor() == nullptr;
};
for (auto comment : System::IterateOver<Comment>(comments->LINQ_Where(haveNoAncestor)))
{
// First, visit the start of the comment range.
auto commentRangeStart = System::DynamicCast<CommentRangeStart>(comment->get_PreviousSibling()->get_PreviousSibling()->get_PreviousSibling());
commentRangeStart->Accept(commentVisitor);
// Then, visit the comment, and any replies that it may have.
comment->Accept(commentVisitor);
for (const auto& reply : System::IterateOver<Comment>(comment->get_Replies()))
{
reply->Accept(commentVisitor);
}
// Finally, visit the end of the comment range, and then print the visitor's text contents.
auto commentRangeEnd = System::DynamicCast<CommentRangeEnd>(comment->get_PreviousSibling());
commentRangeEnd->Accept(commentVisitor);
std::cout << commentVisitor->GetText() << std::endl;
}
}
class CommentInfoPrinter : public DocumentVisitor
{
public:
CommentInfoPrinter() : mVisitorIsInsideComment(false), mDocTraversalDepth(0)
{
mBuilder = MakeObject<System::Text::StringBuilder>();
mVisitorIsInsideComment = false;
}
String GetText()
{
return mBuilder->ToString();
}
VisitorAction VisitRun(SharedPtr<Run> run) override
{
if (mVisitorIsInsideComment)
{
IndentAndAppendLine(String(u"[Run] \"") + run->get_Text() + u"\"");
}
}
VisitorAction VisitCommentRangeStart(SharedPtr<CommentRangeStart> commentRangeStart) override
{
IndentAndAppendLine(String(u"[Comment range start] ID: ") + commentRangeStart->get_Id());
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentRangeEnd(SharedPtr<CommentRangeEnd> commentRangeEnd) override
{
mDocTraversalDepth--;
IndentAndAppendLine(String(u"[Comment range end] ID: ") + commentRangeEnd->get_Id() + u"\n");
mVisitorIsInsideComment = false;
}
VisitorAction VisitCommentStart(SharedPtr<Comment> comment) override
{
IndentAndAppendLine(
String::Format(u"[Comment start] For comment range ID {0}, By {1} on {2}", comment->get_Id(), comment->get_Author(), comment->get_DateTime()));
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
}
VisitorAction VisitCommentEnd(SharedPtr<Comment> comment) override
{
mDocTraversalDepth--;
IndentAndAppendLine(u"[Comment end]");
mVisitorIsInsideComment = false;
}
private:
bool mVisitorIsInsideComment;
int mDocTraversalDepth;
SharedPtr<System::Text::StringBuilder> mBuilder;
void IndentAndAppendLine(String text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mBuilder->Append(u"| ");
}
mBuilder->AppendLine(text);
}
};

◆ get_NodeType()

Aspose::Words::NodeType Aspose::Words::CommentRangeEnd::get_NodeType ( ) const
overridevirtual

Returns CommentRangeEnd.

Examples

Shows how to traverse a composite node's tree of child nodes.

void RecurseChildren()
{
auto doc = MakeObject<Document>(MyDir + u"Paragraphs.docx");
// Any node that can contain child nodes, such as the document itself, is composite.
ASSERT_TRUE(doc->get_IsComposite());
// Invoke the recursive function that will go through and print all the child nodes of a composite node.
TraverseAllNodes(doc, 0);
}
void TraverseAllNodes(SharedPtr<CompositeNode> parentNode, int depth)
{
for (SharedPtr<Node> childNode = parentNode->get_FirstChild(); childNode != nullptr; childNode = childNode->get_NextSibling())
{
std::cout << (String(u'\t', depth)) << Node::NodeTypeToString(childNode->get_NodeType());
// Recurse into the node if it is a composite node. Otherwise, print its contents if it is an inline node.
if (childNode->get_IsComposite())
{
std::cout << std::endl;
TraverseAllNodes(System::DynamicCast<CompositeNode>(childNode), depth + 1);
}
else if (System::ObjectExt::Is<Inline>(childNode))
{
std::cout << " - \"" << childNode->GetText().Trim() << "\"" << std::endl;
}
else
{
std::cout << std::endl;
}
}
}

Implements Aspose::Words::Node.

◆ GetType()

virtual const System::TypeInfo& Aspose::Words::CommentRangeEnd::GetType ( ) const
overridevirtual

Reimplemented from Aspose::Words::Node.

◆ Is()

virtual bool Aspose::Words::CommentRangeEnd::Is ( const System::TypeInfo target) const
overridevirtual

Reimplemented from Aspose::Words::Node.

◆ set_Id()

void Aspose::Words::CommentRangeEnd::set_Id ( int32_t  value)

◆ Type()

static const System::TypeInfo& Aspose::Words::CommentRangeEnd::Type ( )
static