Navigation avec Curseur

Lorsque vous travaillez avec un document, même s’il est court ou long, vous devrez naviguer dans votre document. La navigation avec un curseur virtuel représente la possibilité de naviguer entre différents nœuds d’un document.

Dans un document court, se déplacer dans un document est simple car vous pouvez déplacer le point d’insertion même en utilisant les touches fléchées du clavier ou en cliquant sur la souris pour localiser le point d’insertion où vous le souhaitez. Mais une fois que vous avez un document volumineux contenant de nombreuses pages, ces techniques de base seront insuffisantes.

Cet article explique comment se déplacer dans un document et naviguer avec un curseur virtuel vers différentes parties de celui-ci.

Détection De La Position Actuelle Du Curseur

Avant de commencer le processus de navigation dans votre document, vous devrez obtenir le nœud actuellement sélectionné. Vous pouvez obtenir la position exacte du curseur sur un nœud sélectionné en utilisant la propriété CurrentNode. De plus, au lieu d’obtenir le nœud actuel, vous pouvez obtenir le paragraphe actuellement sélectionné ou la section actuellement sélectionnée en utilisant les propriétés CurrentParagraph et CurrentSection.

Toutes les opérations d’insertion que vous effectuez à l’aide du DocumentBuilder seront insérées avant le CurrentNode. Lorsque le paragraphe actuel est vide ou que le curseur est positionné juste avant la fin du paragraphe, le CurrentNode renvoie nullptr.

Lorsque vous modifiez du texte, il est important de savoir comment naviguer dans votre document et où se déplacer exactement dans celui-ci. Aspose.Words vous permet de vous déplacer dans un document et de naviguer vers ses différentes sections et parties – ceci est similaire à la fonctionnalité du volet de navigation dans Microsoft Word pour accéder à une page ou à un en-tête dans un document Word sans faire défiler.

La méthode principale est de pouvoir déplacer la position du curseur vers un nœud spécifique de votre document, vous pouvez y parvenir en utilisant la méthode MoveTo.

L’exemple de code suivant montre comment déplacer le DocumentBuilder vers différents nœuds d’un document:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder->StartBookmark(u"MyBookmark");
builder->Writeln(u"Bookmark contents.");
builder->EndBookmark(u"MyBookmark");
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
ASSERT_EQ(doc->get_Range()->get_Bookmarks()->idx_get(0)->get_BookmarkEnd(), builder->get_CurrentParagraph()->get_FirstChild());
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder->MoveToBookmark(u"MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
ASSERT_EQ(doc->get_Range()->get_Bookmarks()->idx_get(0)->get_BookmarkStart(), builder->get_CurrentParagraph()->get_FirstChild());
// We can move the builder to an individual node,
// which in this case will be the first node of the first paragraph, like this.
builder->MoveTo(doc->get_FirstSection()->get_Body()->get_FirstParagraph()->GetChildNodes(NodeType::Any, false)->idx_get(0));
ASSERT_EQ(NodeType::BookmarkStart, builder->get_CurrentNode()->get_NodeType());
ASSERT_TRUE(builder->get_IsAtStartOfParagraph());
// A shorter way of moving the very start/end of a document is with these methods.
builder->MoveToDocumentEnd();
ASSERT_TRUE(builder->get_IsAtEndOfParagraph());
builder->MoveToDocumentStart();
ASSERT_TRUE(builder->get_IsAtStartOfParagraph());

Mais en plus de la méthode de base MoveTo, il y en a des plus spécifiques.

Accéder au début ou à la fin d’un document

Vous pouvez aller au début ou à la fin de votre document en utilisant les méthodes MoveToDocumentStart et MoveToDocumentEnd.

L’exemple de code suivant montre comment déplacer la position du curseur au début ou à la fin d’un document:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"Document.docx");
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Move the cursor position to the beginning of your document.
builder->MoveToDocumentStart();
builder->Writeln(u"This is the beginning of the document.");
// Move the cursor position to the end of your document.
builder->MoveToDocumentEnd();
builder->Writeln(u"This is the end of the document.");

Vous pouvez marquer un endroit que vous souhaitez trouver et vous y déplacer à nouveau facilement. Vous pouvez insérer autant de signets que vous le souhaitez dans votre document, puis les parcourir en identifiant les signets avec des noms uniques. Vous pouvez accéder à un signet en utilisant la méthode MoveToBookmark.

Les exemples de code suivants montrent comment déplacer la position du curseur vers un signet:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder->StartBookmark(u"MyBookmark");
builder->Writeln(u"Bookmark contents.");
builder->EndBookmark(u"MyBookmark");
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder->MoveToBookmark(u"MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
ASSERT_EQ(doc->get_Range()->get_Bookmarks()->idx_get(0)->get_BookmarkStart(), builder->get_CurrentParagraph()->get_FirstChild());
// We can move the builder to an individual node,
// which in this case will be the first node of the first paragraph, like this.
builder->MoveTo(doc->get_FirstSection()->get_Body()->get_FirstParagraph()->GetChildNodes(NodeType::Any, false)->idx_get(0));
ASSERT_EQ(NodeType::BookmarkStart, builder->get_CurrentNode()->get_NodeType());

Accédez aux cellules du tableau

Vous pouvez accéder à une cellule de tableau à l’aide de la méthode MoveToCell. Cette méthode vous permettra de naviguer avec votre curseur dans n’importe quelle cellule d’un tableau spécifique. De plus, vous pouvez spécifier un index pour déplacer le curseur vers n’importe quelle position ou caractère spécifié dans une cellule de la méthode MoveToCell.

L’exemple de code suivant montre comment déplacer la position d’un curseur vers une cellule de tableau spécifiée:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"Tables.docx");
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Move the builder to row 3, cell 4 of the first table.
builder->MoveToCell(0, 2, 3, 0);
builder->Write(u"\nCell contents added by DocumentBuilder");
auto table = System::DynamicCast<Tables::Table>(doc->GetChild(NodeType::Table, 0, true));
ASSERT_EQ(table->get_Rows()->idx_get(2)->get_Cells()->idx_get(3), builder->get_CurrentNode()->get_ParentNode()->get_ParentNode());
ASSERT_EQ(table->get_Rows()->idx_get(2)->get_Cells()->idx_get(2)->GetText().Trim(), u"Cell contents added by DocumentBuilderCell 3 contents\a");

Vous pouvez accéder à un champ spécifique de votre document en utilisant la méthode MoveToField. De plus, vous pouvez accéder à un champ de fusion spécifique en utilisant la méthode MoveToMergeField.

L’exemple de code suivant montre comment déplacer le curseur du générateur de documents vers un champ spécifique:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Insert a field using the DocumentBuilder and add a run of text after it.
auto field = builder->InsertField(u"MERGEFIELD field");
builder->Write(u" Text after the field.");
// The builder's cursor is currently at end of the document.
ASSERT_EQ(builder->get_CurrentNode(), nullptr);
// We can move the builder to a field like this, placing the cursor at immediately after the field.
builder->MoveToField(field, true);
// Note that the cursor is at a place past the FieldEnd node of the field, meaning that we are not actually inside the field.
// If we wish to move the DocumentBuilder to inside a field,
// we will need to move it to a field's FieldStart or FieldSeparator node using the DocumentBuilder.MoveTo() method.
ASSERT_EQ(field->get_End(), builder->get_CurrentNode()->get_PreviousSibling());
builder->Write(u" Text immediately after the field.");

Accédez à un en-tête ou un pied de page

Vous pouvez passer au début d’un en-tête ou d’un pied de page en utilisant la méthode MoveToHeaderFooter.

L’exemple de code suivant montre comment déplacer le curseur du générateur de documents vers un en-tête ou un pied de page de document:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Specify that we want headers and footers different for first, even and odd pages.
builder->get_PageSetup()->set_DifferentFirstPageHeaderFooter(true);
builder->get_PageSetup()->set_OddAndEvenPagesHeaderFooter(true);
// Create the headers.
builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
builder->Write(u"Header for the first page");
builder->MoveToHeaderFooter(HeaderFooterType::HeaderEven);
builder->Write(u"Header for even pages");
builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);
builder->Write(u"Header for all other pages");
// Create two pages in the document.
builder->MoveToSection(0);
builder->Writeln(u"Page1");
builder->InsertBreak(BreakType::PageBreak);
builder->Writeln(u"Page2");
System::String outputPath = outputDataDir + u"DocumentBuilderMovingCursor.HeadersAndFooters.doc";
doc->Save(outputPath);

Accédez à une section ou un paragraphe

Vous pouvez passer à une section ou un paragraphe spécifique en utilisant les méthodes MoveToParagraph ou MoveToSection. De plus, vous pouvez spécifier un index pour déplacer le curseur vers n’importe quelle position ou un caractère spécifié dans un paragraphe dans la méthode MoveToParagraph.

L’exemple de code suivant montre comment passer à une section spécifique et à un paragraphe spécifique dans un document:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Create a blank document and append a section to it, giving it two sections.
auto doc = System::MakeObject<Document>();
doc->AppendChild(System::MakeObject<Section>(doc));
// Move a DocumentBuilder to the second section and add text.
auto builder = System::MakeObject<DocumentBuilder>(doc);
builder->MoveToSection(1);
builder->Writeln(u"Text added to the 2nd section.");
// Create document with paragraphs.
auto doc = System::MakeObject<Document>(inputDataDir + u"Paragraphs.docx");
auto paragraphs = doc->get_FirstSection()->get_Body()->get_Paragraphs();
ASSERT_EQ(paragraphs->get_Count(), 22);
// When we create a DocumentBuilder for a document, its cursor is at the very beginning of the document by default,
// and any content added by the DocumentBuilder will just be prepended to the document.
auto builder = System::MakeObject<DocumentBuilder>(doc);
ASSERT_EQ(paragraphs->IndexOf(builder->get_CurrentParagraph()), 0);
// You can move the cursor to any position in a paragraph.
builder->MoveToParagraph(0, 14);
ASSERT_EQ(paragraphs->IndexOf(builder->get_CurrentParagraph()), 2);
builder->Writeln(u"This is a new third paragraph. ");
ASSERT_EQ(paragraphs->IndexOf(builder->get_CurrentParagraph()), 3);