Vielen Dank für das Interesse.
Der Hintergrund für meine Fragestellung war der Umstand, dass ich eine variable Wortzählung geschrieben hatte, mit der einstellbar ist, ob Aufzählungsbullets oder Nummerierungen gezählt werden, und welche einzeln stehenden Zeichen nicht als Wort zählen sollen, z.B. Punkte, Kommas u.ä., die als Tippfehler mit Leerzeichen davor im Text auftauchen. (Übrigens zählt LO einen Einzelgedankenstrich [8211] korrekterweise nicht als Wort, aber einen Einzelbindestrich [45] doch!)
Dazu verwende ich den Absatzcursor. Für das gesamte Dokument ist es nicht so schwierig. Ich kann das Dokumenttextobjekt enumerieren und erhalte Absätze und Tabellen. In den Tabellen kann ich über das Array der Zellnamen jede Zelle erreichen. Das ganze läuft dann über die Enumeration jedes Zelltextobjekts wiederum ab, so dass auch eingebettete Tabellen gefunden werden. Textrahmen, Fuß- und Endnoten, sowie Kopf- und Fußzeilen können auf Dokumentebene gelistet werden und wiederum über deren Textenumerationen durchsucht werden.
Um dies alles zu testen, habe ich den pfiffigen Selektionsiterator verwendet, den Andrew Pitonyak in OOME vorgestellt hat. Der hat allerdings den Nachteil, dass er nur das Dokumenttextobjekt berücksichtigt. Ich habe ihn daher modifiziert, so dass auch die Textobjekte anderer Selektionen zum Zuge kommen.
So kann ich testrelevante Textbereiche auswählen, testen und gleichzeitig über die Menüfunktion "Extras|Wortzählung" überprüfen, wie LO zählt.
Im Zusammenhang mit Selektionen in Tabellen bemerke ich allerdings ein paar Besonderheiten:
- Selektionen, die vor einer Tabelle beginnen und darüber hinaus gehen, enthalten die gesamte Tabelle. Weitere Selektionen sind möglich.
- Neben Selektionen ganzer Zellbereiche einer Tabelle sind keine weiteren Selektionen möglich.
- Neben Selektionen von Zellinhalten sind weitere Selektionen möglich.
- Selektionen von ganzen Zellbereichen einer Tabelle unterstützen den Service "com.sun.star.text.TextTableCursor". In diesem Fall gibt es keine Methode "getCount"!
- Alle anderen Selektionen unterstützen den Service "com.sun.star.text.TextRanges", auch Selektionen in Textrahmen, Fußnoten u.a.
- Interessanterweise gehört eine Selektion von Tabellenzellen, die mit einer Zelle beginnt, in der Absätze mit Listen oder Nummerierungen sind (nicht einmal zwingend im ersten Absatz), zu den TextRanges. Sehr seltsam.
Um auf die einzelnen Zellen eines selektierten Tabellenzellbereichs zuzugreifen, könnte man den String RangeName parsen, was aber nur für einfache Tabellenstrukturen möglich wäre. Für komplexe Tabellen funktioniert das nicht. Eine Konversion des Cursors in einen CellRange ist bei komplexen Tabellen leider fehlerhaft.
Ich helfe mir damit, dass ich stattdessen je nach Laune entweder alle Zellen der Tabelle durchsuche oder gar keine.
Ein weiteres Problem habe ich auch noch nicht gelöst. Es kann vorkommen, dass in einer einzelnen Selektion über mehrere Absätze hinweg ein am Absatz verankerter Textrahmen komplett mit ausgewählt ist. Mein Versuch mit
oEnum = oSel.createContentEnumeration("com.sun.star.text.TextFrame")
endet in einem undifferenzierten Laufzeitfehler. Wenn ich dieses Problem, nämlich ein Textrahmentextobjekt innerhalb einer Selektion zu instantiieren, nicht lösen kann, werde ich es gesondert posten. (Es sei denn, ihr habt eine schnelle Lösung.)
Schöne Grüße
Volker