Aspose::Words::DocumentVisitor::VisitShapeStart method
Contents
[
Hide
]DocumentVisitor::VisitShapeStart method
Called when enumeration of a shape has started.
virtual Aspose::Words::VisitorAction Aspose::Words::DocumentVisitor::VisitShapeStart(System::SharedPtr<Aspose::Words::Drawing::Shape> shape)
Parameter | Type | Description |
---|---|---|
shape | System::SharedPtr<Aspose::Words::Drawing::Shape> | The object that is being visited. |
ReturnValue
A VisitorAction value that specifies how to continue the enumeration.
Examples
Shows how to create a group of shapes, and print its contents using a document visitor.
void GroupOfShapes()
{
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
// If you need to create "NonPrimitive" shapes, such as SingleCornerSnipped, TopCornersSnipped, DiagonalCornersSnipped,
// TopCornersOneRoundedOneSnipped, SingleCornerRounded, TopCornersRounded, DiagonalCornersRounded
// please use DocumentBuilder.InsertShape methods.
auto balloon = MakeObject<Shape>(doc, ShapeType::Balloon);
balloon->set_Width(200);
balloon->set_Height(200);
balloon->get_Stroke()->set_Color(System::Drawing::Color::get_Red());
auto cube = MakeObject<Shape>(doc, ShapeType::Cube);
cube->set_Width(100);
cube->set_Height(100);
cube->get_Stroke()->set_Color(System::Drawing::Color::get_Blue());
auto group = MakeObject<GroupShape>(doc);
group->AppendChild(balloon);
group->AppendChild(cube);
ASSERT_TRUE(group->get_IsGroup());
builder->InsertNode(group);
auto printer = MakeObject<ExDrawing::ShapeGroupPrinter>();
group->Accept(printer);
std::cout << printer->GetText() << std::endl;
}
class ShapeGroupPrinter : public DocumentVisitor
{
public:
ShapeGroupPrinter()
{
mBuilder = MakeObject<System::Text::StringBuilder>();
}
String GetText()
{
return mBuilder->ToString();
}
VisitorAction VisitGroupShapeStart(SharedPtr<GroupShape> groupShape) override
{
mBuilder->AppendLine(u"Shape group started:");
return VisitorAction::Continue;
}
VisitorAction VisitGroupShapeEnd(SharedPtr<GroupShape> groupShape) override
{
mBuilder->AppendLine(u"End of shape group");
return VisitorAction::Continue;
}
VisitorAction VisitShapeStart(SharedPtr<Shape> shape) override
{
mBuilder->AppendLine(String(u"\tShape - ") + System::ObjectExt::ToString(shape->get_ShapeType()) + u":");
mBuilder->AppendLine(String(u"\t\tWidth: ") + shape->get_Width());
mBuilder->AppendLine(String(u"\t\tHeight: ") + shape->get_Height());
mBuilder->AppendLine(String(u"\t\tStroke color: ") + shape->get_Stroke()->get_Color());
mBuilder->AppendLine(String(u"\t\tFill color: ") + shape->get_Fill()->get_ForeColor());
return VisitorAction::Continue;
}
VisitorAction VisitShapeEnd(SharedPtr<Shape> shape) override
{
mBuilder->AppendLine(u"\tEnd of shape");
return VisitorAction::Continue;
}
private:
SharedPtr<System::Text::StringBuilder> mBuilder;
};
Shows how to use a DocumentVisitor implementation to remove all hidden content from a document.
void RemoveHiddenContentFromDocument()
{
auto doc = MakeObject<Document>(MyDir + u"Hidden content.docx");
auto hiddenContentRemover = MakeObject<ExFont::RemoveHiddenContentVisitor>();
// Below are three types of fields which can accept a document visitor,
// which will allow it to visit the accepting node, and then traverse its child nodes in a depth-first manner.
// 1 - Paragraph node:
auto para = System::ExplicitCast<Paragraph>(doc->GetChild(NodeType::Paragraph, 4, true));
para->Accept(hiddenContentRemover);
// 2 - Table node:
SharedPtr<Table> table = doc->get_FirstSection()->get_Body()->get_Tables()->idx_get(0);
table->Accept(hiddenContentRemover);
// 3 - Document node:
doc->Accept(hiddenContentRemover);
doc->Save(ArtifactsDir + u"Font.RemoveHiddenContentFromDocument.docx");
}
class RemoveHiddenContentVisitor : public DocumentVisitor
{
public:
VisitorAction VisitFieldStart(SharedPtr<FieldStart> fieldStart) override
{
if (fieldStart->get_Font()->get_Hidden())
{
fieldStart->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitFieldEnd(SharedPtr<FieldEnd> fieldEnd) override
{
if (fieldEnd->get_Font()->get_Hidden())
{
fieldEnd->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitFieldSeparator(SharedPtr<FieldSeparator> fieldSeparator) override
{
if (fieldSeparator->get_Font()->get_Hidden())
{
fieldSeparator->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitRun(SharedPtr<Run> run) override
{
if (run->get_Font()->get_Hidden())
{
run->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitParagraphStart(SharedPtr<Paragraph> paragraph) override
{
if (paragraph->get_ParagraphBreakFont()->get_Hidden())
{
paragraph->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitFormField(SharedPtr<FormField> formField) override
{
if (formField->get_Font()->get_Hidden())
{
formField->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitGroupShapeStart(SharedPtr<GroupShape> groupShape) override
{
if (groupShape->get_Font()->get_Hidden())
{
groupShape->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitShapeStart(SharedPtr<Shape> shape) override
{
if (shape->get_Font()->get_Hidden())
{
shape->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitCommentStart(SharedPtr<Comment> comment) override
{
if (comment->get_Font()->get_Hidden())
{
comment->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitFootnoteStart(SharedPtr<Footnote> footnote) override
{
if (footnote->get_Font()->get_Hidden())
{
footnote->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitSpecialChar(SharedPtr<SpecialChar> specialChar) override
{
if (specialChar->get_Font()->get_Hidden())
{
specialChar->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitTableEnd(SharedPtr<Table> table) override
{
// The content inside table cells may have the hidden content flag, but the tables themselves cannot.
// If this table had nothing but hidden content, this visitor would have removed all of it,
// and there would be no child nodes left.
// Thus, we can also treat the table itself as hidden content and remove it.
// Tables which are empty but do not have hidden content will have cells with empty paragraphs inside,
// which this visitor will not remove.
if (!table->get_HasChildNodes())
{
table->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitCellEnd(SharedPtr<Cell> cell) override
{
if (!cell->get_HasChildNodes() && cell->get_ParentNode() != nullptr)
{
cell->Remove();
}
return VisitorAction::Continue;
}
VisitorAction VisitRowEnd(SharedPtr<Row> row) override
{
if (!row->get_HasChildNodes() && row->get_ParentNode() != nullptr)
{
row->Remove();
}
return VisitorAction::Continue;
}
};
See Also
- Enum VisitorAction
- Class Shape
- Class DocumentVisitor
- Namespace Aspose::Words
- Library Aspose.Words for C++