Writer-Texttabelle - Zellen aus einer UI-Selektion?

Mein Problem: Ich will im Writer mit einem Makro mit Hilfe der API auf jede einzelne von mit der Maus selektierten Zellen einer (komplexen) Texttabelle zugreifen.

Für die gesamte Tabelle gibt es die Methode getCellNames(), die fehlerlos die Namen aller Zellen ausgibt, so dass ich jede Zelle mit oTable.getCellByName(sName) instanziieren kann. So etwas fehlt sowohl für den Service CellRange als auch für TextTableCursor.

Wie kann ich mein Ziel erreichen?

Sub GetEachCellInSelection(Optional oDoc, Optional oCellSel)
   Dim oTable, oCellRange, aCellNames() As String
   Dim sRangeName&

   If IsMissing(oDoc) Then oDoc = ThisComponent
   If IsMissing(oCellSel) Then oCellSel = oDoc.CurrentSelection

   If oCellSel.supportsService("com.sun.star.text.TextTableCursor") Then
     oTable = oDoc.CurrentController.ViewCursor.TextTable
     sRangeName = oCellSel.RangeName 'Hilft mir nicht weiter
     oCellRange = oTable.getCellRangeByName(sRangeName) 'Das auch nicht
     '???
   End If
End Sub

Bin ich einfach nur blind?

Volker

Hallo Volker,

ich habe aufgrund deiner Mail ein paar Sachen ausprobiert, bin aber auch nicht weitergekommen. Dann wollte ich abwarten, ob jemand anders  etwas Schlaues beiträgt. Nun komme ich zu dem Schluss, dass wir beide nicht blind sind, sondern dass da womöglich wirklich nichts zur Verfügung gestellt wird.

Gruß

Gerhard

Hallo Volker, Gerhard,

ich klinke mich mal kurz ein. Writer-Tabellen sind nicht ganz so einfach zu verstehen. Auch wenn viele der typischen Tabellen-Methoden vorhanden sind und intern korrekt ausgefüllt werden, ist der umgekehrte Weg (also über die Eigenschaften / Methoden) auf z.B. selektierte Zellen zu kommen, nicht möglich.

Wir hatten gerade im Forum einen sehr ähnlichen Fall diskutiert - vielleicht hilft Dir das ein wenig weiter:

https://de.openoffice.info/viewtopic.php?f=18&t=72202

So ähnlich wirst Du auch vorgehen müssen...

Viele Grüße

Thomas

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

Nur zur Ergänzung: über TextPortions komme ich sicher zum Ziel. Ich wollte aber den scheinbar vorhandenen schnellen und direkten Weg über die ContentEnumeration. Warum geht das nicht? Ein Bug?

Schöne Grüße
Volker