ParaUserDefinedAttributes?

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

Moderator: Moderatoren

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

ParaUserDefinedAttributes?

Beitrag von Stephan » Fr, 03.05.2019 19:57

Hallo,

in den Absatzeigenschaften von Textdokumenten existiert die Eigenschaft ParaUserDefinedAttributes (Object):
http://www.openoffice.org/api/docs/comm ... Attributes

Das ist also ein Container für eine Collection von XML-Attributen des Absatzes. Hat jemand ein Code-Beispiel wie ich dort eben solche Eigenschaften reinschreiben kann?

Wozu soll das gut sein?
Ich möchte dort nur etwas Text hinterlegen wozu in den Eigenschaftsnamen und den Inhalt der Eigenschaft zweckentfremden will. Ich hoffe das das geht.

Was suche ich eigentlich?
irgend eine Absatzeigenschaft in der ich per Makro etwas Text oder ein paar Zahlen hinterlegen kann ohne das ein Anwender dort über die Programmoberfläche etwas daran ändern kann.
Momentan nutze ich testweise .ParaBackGraphicURL (die auch tatsächlich beliebigen Text aufnimmt und wenn dieser Text keiner Bild-URL entspricht einfach kein Bild anzeigt), Problem ist halt nur wenn der Anwender ein Bild zuweist ist mein Text futsch.


Gruß
Stephan

frankes
*
Beiträge: 16
Registriert: Sa, 05.07.2003 15:19
Kontaktdaten:

Re: ParaUserDefinedAttributes?

Beitrag von frankes » Mo, 03.06.2019 23:03

Hallo Stefan

War leider schon länger nicht mehr hier, aber vielleicht hilft dir diese Antwort.
Ich wende die UserDefinedAttributes auf Shapes im Writer-Dokument an.

Hintergrund:
Ich verwende die Shape für Lösungsfelder auf Mathematikarbeitsblättern und blende Ergebnisse dadurch aus, dass ich das Ergebnis der Rechnung (text) in die UserDefinedAttributes schreibe und den Text im Shape lösche und umgekehrt.

Anwendungsmöglichkeiten gibt es für die UserDefinedAttributes sicher noch mehr.

Unten habe ich dir die sub kopiert, mit der ich Attribute setzte.
Du musst allerdings darauf achten, dass du einzelne Attribute nicht einfach den UserDefinedAttributes zuweisen kannst.
In diesem Fall ist es notwendig ein eigens Objekt mit den Atributen zu erzeugen und dieses den UserDefinedAttributes zuzuweisen.
Oder halt die UserDefinedAttributes aus dem Objekt kopieren, ändern und wieder zuweisen.

Code: Alles auswählen

rem add userdefiendAttribute
' add a userdefined attrbute to the given object/ shape
' is used :
'   1) on solution shapes to show and hide solutions (strings)
Sub addUserdefindAttribute(oObject As Object, sName As String, sValue As String)
  Dim oAttributeData As New com.sun.star.xml.AttributeData
  Dim oObjectData    As Variant
  
  oObjectData          =oObject.UserDefinedAttributes
  oAttributeData.Type  ="CDATA"
  oAttributeData.Value =sValue
  
  If oObjectData.hasByName(sName) Then
    'update attribute
    oObjectData.replaceByName(sName, oAttributeData)
    
  Else
    'create a new attribute
    oObjectData.insertByName(sName, oAttributeData)
    
  End If
  
  oObject.UserDefinedAttributes =oObjectData

End Sub
Abrufen kann ich sie wieder mit:

Code: Alles auswählen

oObject.UserDefinedAttributes.getByName("AttributeName").Value
Ich gehe eigentlich davon aus, dass dies in deinem gewünschten Objekt ähnlich funktioniert.

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

Re: ParaUserDefinedAttributes?

Beitrag von Stephan » Di, 04.06.2019 08:21

Ja, Danke.

Folgendes funktioniert für meine Anforderungen:

Code: Alles auswählen

Sub Main
	'es ist Fliesstext selektiert
	x = ThisComponent.getCurrentSelection
	addUserdefindAttribute(x(0),"uda1","Ein Testattribut")
End Sub

Sub addUserdefindAttribute(oObject As Object, sName As String, sValue As String)
  Dim oAttributeData As New com.sun.star.xml.AttributeData
  Dim oObjectData    As Variant
  
  oObjectData          =oObject.ParaUserDefinedAttributes
  oAttributeData.Type  ="CDATA"
  oAttributeData.Value =sValue
  
  If oObjectData.hasByName(sName) Then
    'update attribute
    oObjectData.replaceByName(sName, oAttributeData)
    
  Else
    'create a new attribute
    oObjectData.insertByName(sName, oAttributeData)
    
  End If
  
  oObject.ParaUserDefinedAttributes =oObjectData

End Sub
und lesen mit:

Code: Alles auswählen

Sub auslesen()
	x = ThisComponent.getCurrentSelection
	With x(0).ParaUserDefinedAttributes
		Msgbox "uda1: " & .getByName("uda1").Value
	End With
End Sub

Unklar ist mir ob bei

Code: Alles auswählen

oAttributeData.Type  ="CDATA"
auch andere Werte akzeptiert würden und wenn ja, Welche? Ein Test mit:

Code: Alles auswählen

oAttributeData.Type  ="MyData"
führt dazu das es einfach ignoriert wird (ohne Fehlermeldung) und für .Type wird "CDATA" automatisch verwendet.

in:
https://www.openoffice.org/api/docs/com ... eData.html
heißt es: "For non validating parsers this must be CDATA."
Was zwar eigentlich eindeutig ist, nur ist das so zu verstehen das es für "validating parsers" (also sinngemäß XML-Validierungsprogramme) anders sein dürfte und welchen Sinn hätte das?



Gruß
Stephan

frankes
*
Beiträge: 16
Registriert: Sa, 05.07.2003 15:19
Kontaktdaten:

Re: ParaUserDefinedAttributes?

Beitrag von frankes » Di, 11.06.2019 08:48

Nun, da bleibt mir auch nur zu spekulieren.

Aus A. Pitonyak: Basic-Makros für OpenOffice und Libreoffice, 01,2018 (deutsch) - Kap. 15.3 Nicht übersetzte XML-Attribute
OpenOffice.org speichert Dokumente im XML-Format. Wenn ein OOo-Dokument gelesen wird,
wird es von einem XML-Parser zergliedert. Benutzerdefinierte Attribute werden vom Parser nicht
übersetzt, sie werden einfach nur gelesen, gespeichert und dann geschrieben. Somit kann ein Parser
Attribute speichern, die er selbst beim Lesen einer XML-Datei nicht verarbeiten kann. Wenn die Da-
tei wieder gespeichert wird, können die unbekannten Attribute ohne Verlust zurückgeschrieben wer-
den.
Nicht übersetzte Attribute bieten Ihnen die Möglichkeit, eigene Eigenschaften hinzuzufügen, die mit
dem Dokument gespeichert werden. Benutzerdefinierte Attribute haben die Eigenschaften Name-
space (XML-Namensraum als String), Type (XML-Typ als String) und Value (String).
Und Wikipedia zu CData (https://de.wikipedia.org/wiki/CDATA):
CDATA (engl. Character Data) ist ein Schlüsselwort in SGML und XML. Mit CDATA werden Zeichendaten gekennzeichnet, deren Inhalt vom Parser nicht analysiert wird.
Es könnte also sein, dass CData von OOo/LO als Signalwort interpretiert wird, diese Attribute nicht zu verwenden.
Das ist aber wie gesagt reine Spekulation und dein Versuch zeigt eher, dass OOo alle unbekannten Datentypen als CData interpretiert.

Was ich aber auch immer Mal erlebe ist, dass durch die Objektorientierung man Zugriff auf Attribute/Funktionen hat, die von einem Objekt geerbt aber eigentlich nicht unterstützt werden. Auch diese werden von LO (nutze LO, daher Aussagen nur dazu) einfach ignoriert, ohne Warnung oder Fehlermeldung. Ob dieses Verhalten von der API kommt, oder vom Starbasic kann ich nicht bewerten.

Dieses Verhalten, "Fehler" zu ignorieren hat mich schon viele Stunden vor dem Rechner gekostet. Hier würde ich mir wirklich wünschen, dass LO sich etwas gesprächiger zeigt und bei ignorierten Parametern zumindest eine Warnung auswirft.

Antworten