Probleme beim Auswerten einer Text-Selektion

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Stephan
********
Beiträge: 11286
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Probleme beim Auswerten einer Text-Selektion

Beitrag von Stephan » Do, 16.05.2019 10:47

Hallo,

in einem Textdokument (odt) befindet sich etwas Text und innerhalb des Textes eine Texttabelle:

Beispieltext.gif
Beispieltext.gif (47.62 KiB) 1936 mal betrachtet


Ich benutze folgendes Makro:

Code: Alles auswählen

Sub Selektion_auswerten()
	akt_sel = ThisComponent.getCurrentSelection
	sel_count = akt_sel.getCount()
	For i = 0 To sel_count-1
		If LEN(TRIM(akt_sel.getByIndex(i).String)) > 0 Then
			enum_all = akt_sel.getByIndex(i).CreateEnumeration
			Do While enum_all.hasMoreElements()
				akt_enum = enum_all.NextElement
				If akt_enum.supportsService("com.sun.star.text.Paragraph") Then
						Msgbox akt_enum.String
						
					ElseIf akt_enum.supportsService("com.sun.star.text.TextTable") Then
						' nix tun
						
					Else
						'nix tun
				End If
					
			Loop
		End If
	Next i
End Sub

Markiere ich nun per Maus und STRG die gelb markierten Textteile zeigt das Makro mit den ersten Absatz (ABS1, siehe Screenshot) in einer Msgbox an - richtig, so soll es sein.

Markiere ich aber die gelben UND den grünen Textteil zeigt mir das Makro den ersten (ABS1) und den dritten Absatz (ABS3) an.

Wieso passiert das?


Beobachtet in AOO und LO, Testdatei anhängend.


Gruß
Stephan
Dateianhänge
testdummy.odt
(23.04 KiB) 51-mal heruntergeladen

Toxitom
********
Beiträge: 3629
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Probleme beim Auswerten einer Text-Selektion

Beitrag von Toxitom » Do, 16.05.2019 16:25

Hey Stephan,

kann es sein, dass Du das völlig falsch angehest?

Ich schätze, Du willst den Inhalt des kompletten Paragraphen ausgeben, der teilweise markiert ist?

Code: Alles auswählen

sel_count = akt_sel.getCount()
liefert Dir "3 " bei den zwei Markierungen: 0. Texttabelle 1. Teil-Absatz 1, 2. Teil-Absatz innerhalb des Paragrafen Tabelle-Abs2.

Die Teile musst Du anders aufdröseln. Auch ein normaler Absatz unterstützt übrigens den Service ""com.sun.star.text.TextTable" - auch die Unterscheidung Deiner If-Liste ist nicht wirklich zielführend;)

Absätze oder Absatzteile, die Teil einer Tabelle sind, bei denen ist die Eigenschaft "TextTables" nicht leer - sondern beinhaltet das Objekt der Tabelle. Ich schätze, über den Weg müsstest Du gehen.

Also:
- Auswerten der Selektionsobjekte über Deine For-Schleife
- evt. Speichern der Texttabelle (Name) in Selektion 0
- Prüfen, ob die Selektion Teil der Tabelle ist - dann musst Du sicher anders vorgehen
- ansonsten - Ausgabe des Textes nach Enumeration.

Prüfst Du Deinen Code mit xray (oder so), gibt es viele "Merkwürdigkeiten:

Selektion 0 - keine Aktion , da String nicht vorhanden.
Selektion 1 - Dein Abs1 - Enumeration - liefert Abs. 1 (würde auch mit Abs 2 gehen;))
Selektion 2 - liefert den Teilstring innerhalb der Tabelle - die Enumeration aber liefert die Tabelle - und dann wohl alle Zellen etc. Warum irgendwann die weiteren Absätze folgen, kann ich Dir auch nicht sagen.

Wie gesagt - ich glaube, da musst Du anders vorgehen.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

Stephan
********
Beiträge: 11286
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Probleme beim Auswerten einer Text-Selektion

Beitrag von Stephan » Do, 16.05.2019 18:50

Ich schätze, Du willst den Inhalt des kompletten Paragraphen ausgeben, der teilweise markiert ist?
ich möchte für Absätze die markiert sind die Zeilennummerierung einschalten UND für unterschiedliche Absätze unterschiedliche Startwerte der Zählung vorgeben, weshalb ich auch nicht versuchen kann für die komplette Markierung gleichzeitig die Zeilennummerierung zu aktivieren, denn dann ginge ja nur immer gleicher Startwert für alle betroffenen Absätze.
(ausdrücklich direkt über den Absatz, weil die Absätze ansich diverse Absatzvorlagen haben können und also normalerweise garnicht gleich formatiert sind wie in meiner Beispieldatei)

Weil das eine absatzweite Eigenschaft ist reicht es ein Stück des Absatzes zu markieren, was sich in Praxis, bei umfangreichen mehrteiligen Markierungen, als einfacher erweist.

Auf das Problem nach dem ich frage bin ich rein zufällig gestoßen, möglicherweise ist das auch ein Fehler in OO/LO, ich weiß es bisher nicht. Wenn es ein Fehler wäre, scheint mir ein Workaround schwierig, weil es ja auch sein kann das "ABS3" ganz regulär markiert ist.
Wie gesagt - ich glaube, da musst Du anders vorgehen.
aber wie?


Gruß
Stephan

Toxitom
********
Beiträge: 3629
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Probleme beim Auswerten einer Text-Selektion

Beitrag von Toxitom » Do, 16.05.2019 20:20

hey Stefan,
..aber wie?
tia... das ist nicht so einfach. Vielleicht einen Denkanstoss:

Code: Alles auswählen

Sub Selektion_auswerten2()
	akt_sel = ThisComponent.getCurrentSelection
	sel_count = akt_sel.getCount()
	For i = 0 To sel_count-1
	  If LEN(TRIM(akt_sel.getByIndex(i).String)) > 0 Then  'warum nicht ;)
	       sel_einzel = akt_sel.getByIndex(i)
	       
	       REM nun Unterscheidung, ob Fliesstext oder Tabelle
	        if not isempty(sel_einzel.textTable) then  'TextTabelle       
	         msgbox "Tabelle"
	         
	         enum_all = sel_einzel.text.createEnumeration()    'Zelle - alle Absätze
	       
	         Do While enum_all.hasMoreElements()
	         
	         Rem jetzt folgen alle Absäte der aktuellen Zelle - nur die ist per Selektion aktiviert.
	         REM hier musst Du halt noch irgendetwas finden, die tatsächlich markierte Textstelle zu identifizieren
		    akt_enum = enum_all.NextElement         
	            xray akt_enum       
	         loop       
	       'elseif      '<-- hier müssten noch andere Unterscheidungen (Bereiche etc) eingefügt werden??
	                
	       else   ' Fliesstext
	       
	         msgbox "Absatz"         
	         'xray sel_einzel
	         enum_all = sel_einzel.createEnumeration()    'Zelle - alle Absätze         
	         Do While enum_all.hasMoreElements()
				akt_enum = enum_all.NextElement
	            n = 1
	            msgbox n
	            msgbox akt_enum.string            
	            n = n+1 
	         loop         
	       end if
	    end if    
	 next i
end sub
Soweit werden zumindest die Absätze angezeigt. Dein alter Code hatte noch andere "Haken" - so wurden durch die Enumeration alle Absätze des Textes instanziert - ohne Hinweis auf die Tabelle. Das führt dann wohl auch zum Anzeigen des 3. Absatzes... aber da steckt sicher noch einiges an Grundlagenarbeit drin;)

Vielleicht hilft es ja zum Anfang.

VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

Stephan
********
Beiträge: 11286
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Probleme beim Auswerten einer Text-Selektion

Beitrag von Stephan » Fr, 17.05.2019 08:22

tia... das ist nicht so einfach. Vielleicht einen Denkanstoss:
danke, Dein Code scheint besser zu funktionieren bzgl. ABS3 denn da wird ungewollt zunächst nichts angezeigt, ich muss das mal in Ruhe durchgehen

Für die Absätze in der Tabelle hatte ich schon eine Unterroutine, hier mal nur informationshalber (aus dem Zusammenhang gerissen):

Code: Alles auswählen

'-->Inhalt der einzelligen Tabellen prüfen und ggf. korrigieren-----------------
	IF UBOUND(einzellige_Tabellen()) >= 0 Then 'mindestens eine Tabelle
		For i = 0 To UBOUND(einzellige_Tabellen())
			akt_tabelle = ThisComponent.getTextTables.getByName(einzellige_Tabellen(i))
			
			cn = akt_tabelle.getCellNames
			enum_all = akt_tabelle.getCellByName(cn(0)).Text.createEnumeration
			aa = 0
			Do While enum_all.hasMoreElements
				akt_enum = enum_all.nextElement
				If akt_enum.supportsService("com.sun.star.text.Paragraph") Then
					akt_enum.ParaLeftMargin = 0 : akt_enum.ParaRightMargin = 0 'Einzug korrigieren
					
					'#neu:
					If aa = 0 Then
							akt_enum.ParaLineNumberCount = True
							akt_enum.ParaIsNumberingRestart = True
							akt_enum.ParaLineNumberStartValue = 1
							aa = 1
						Else
							akt_enum.ParaLineNumberCount = True
							akt_enum.ParaIsNumberingRestart = False
							akt_enum.ParaLineNumberStartValue = ""
					End If
					
					'-->BorderShadow
					Dim ps As Object
					ps = akt_enum.ParaShadowFormat
					ps.Location = 0 'com.sun.star.table.ShadowLocation.NONE
					ps.ShadowWidth = 0
					ps.Color = RGB(255,255,255)
					akt_enum.ParaShadowFormat = ps


					'Absatzumrandung
					Dim aLBorder As New com.sun.star.table.BorderLine
				    aLBorder.OuterLineWidth = 2 '(2 entspricht ca. 0,05pt)
				    aLBorder.Color = RGB(0,0,0)
				    aLBorder.LineDistance = 97 '(97 -> mit XRAY ausgelesen für 0,1cm in Tabelleneigenschaften-Dialog)
				    
				    akt_enum.LeftBorder = aLBorder
				    akt_enum.RightBorder = aLBorder
				    akt_enum.TopBorder = aLBorder
				    akt_enum.BottomBorder = aLBorder
				    
				    akt_enum.ParaIsConnectBorder = True 'Verschmelzen Umrandung
				    
				End If
			Loop
		Next i
	End If 
	'----------------------------------------------------------------------------
<--

'warum nicht ;)
weil auch noch unterschieden werden soll zwischen Leerabsätzen die nicht in die Zeilennummerierung einbezogen werden und Solchen die einbezogen werden bei gleichzeitiger Option "Leerzeilen nicht zählen" in der Zeilenzählung selbst.
Dadurch ergibt sich ein anderes Verhalten von Leerabsätzen beim späteren hinzufügen von Text.


Gruß
Stephan

Toxitom
********
Beiträge: 3629
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Probleme beim Auswerten einer Text-Selektion

Beitrag von Toxitom » Fr, 17.05.2019 08:46

Moin Stephan,
..warum nicht ;)
weil auch noch unterschieden werden soll zwischen Leerabsätzen die nicht in die Zeilennummerierung einbezogen werden.....
Dann brauchst Du noch andere Unterscheidungsmerkmale. Selektierst Du einen Abschnitt innerhalb einer Texttabelle, so erscheint bei den Array "Selektion" zunächst ein leerer Absatz (schätze, das ist der für die Fixierung der Tabelle?) und dann erst als nächstes Element der Teil des Absatzes innerhalb der Tabelle.
Da typischerweise ein leerer Absatz gar nicht alleine markiert werden kann, kam meine Bemerkung mit "..warum nicht ;)" zu Stande - evt. die Lösung zur Identifikation der nicht benötigten Selektion. Aber dann brauchste Du wohl ein anderes Kriterium.

Na, da haste Dir ja was vorgenommen ... hihi

VG Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic

Stephan
********
Beiträge: 11286
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Probleme beim Auswerten einer Text-Selektion

Beitrag von Stephan » Fr, 17.05.2019 10:47

Hallo Tom,
Da typischerweise ein leerer Absatz gar nicht alleine markiert werden kann
wie Du vielleicht ahnst geht es hier um ein Kundenprojekt und es müssen ganz 'übliche' Dateien bearbeitet werden, also Dateien bei denen Teile des Layouts, genauer der Positionierung, mit Enter- und Leer-Taste gemacht sind


Gruß
Stephan

Antworten