PureBoard
http://forums.purebasic.com/german/

Suche rtf (richedit) Control für Linux
http://forums.purebasic.com/german/viewtopic.php?f=21&t=30153
Seite 1 von 4

Autor:  ccode_new [ 13.05.2017 19:58 ]
Betreff des Beitrags:  Suche rtf (richedit) Control für Linux

Hi Leute,

für Windows gibt es ja eine gute Rtf-Editor Lösung, aber gibt es auch eine für Linux?

Ich würde mich zur Not auch mit Linux-Api beschäftigen.

Kennt hier jemand eine Richedit-Lösung für Purebasic unter Linux.

Scintilla funktioniert ja z.B. auch unter Linux.

Nur wie kann man das evtl. als RTF-Editor verwenden?

????

Autor:  RSBasic [ 14.05.2017 10:37 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Laut PB-Blog-Seite wird GtkTextView beim EditorGadget unter Linux verwendet.
Beispielcodes zum Formatieren des Textes findest du hier: http://chabba.de > Linux-PureBasic-API > EditorGadget
Ansonsten auch hier: http://www.purebasic.fr/english/search.php
RTF wirst du unter Linux nirgends finden. Das ist von Microsoft.
Entweder benutzt du Scintilla oder GTK. Du kannst natürlich auch einen eigenen Editor basierend auf die RTF-Syntax bauen, aber das ist sehr umfangreich.

Autor:  Shardik [ 14.05.2017 12:43 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Makke hatte schon einmal diese RTF-ähnliche Lösung für Linux gezeigt, die sicherlich als Ausgangspunkt für Dich dienen könnte. Ausgangspunkt seiner Frage war dieser Thread, der aber leider nach kurzer Zeit in Anschuldigungen und Pöbeleien ausartete und daher gesperrt wurde.

Autor:  ccode_new [ 14.05.2017 13:46 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Ok, danke euch beiden.

An Shardik:

Cool! Genau so ein Ansatz ist nicht schlecht.

Mir reichen nur die grundlegenden Formatierungsmöglichkeiten, Bilder, etc. müssen nicht unbedingt unterstützt werden.

Ich werde mir das Beispiel mal genauer ansehen.

Mit dem Ziel das Veränderungen über [u] [i] [b] [r] [g], ...

direkt angezeigt werden sollen.
("direkter - Was ich editiere möchte ich gleich sehen - Editor")

Als mögliche Alternative sehe ich bis jetzt nur eine Lösung über Webgadget mit der Anzeige einer angepassten Javascript-Editor-Komponente (z.B. ckeditor).

Aber gibt es nicht noch irgend eine gute Lib (.so) für Linux?
Mit Beispielen zur Nutzung?

Für Lazarus (Delphi) scheint es noch etwas zu geben, aber ich weiß jetzt nicht wie ich das mit PureBasic nutzen könnte.
(http://wiki.freepascal.org/KControls)
-> Das scheint aber auch ziemlich fehlerhaft/instabil zu sein.

Autor:  ccode_new [ 17.06.2017 23:22 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Hallo liebe Leute,

ich möchte das Thema mit dem RTF oder Text-Style-Editor nochmal aufgreifen.

Auf http://www.chabba.de/ gibt es ja ein tolles Beispiel:

http://www.chabba.de/Linux/EditorGadget/Editor_GtkDemo.pb

Textstyle kann man ja nun direkt z.B über Buttons/Toolbar, etc.. so ändern:

Bsp.:
Code:
Procedure Editor_Bold(buffer)
  Protected.GtkTextIter istart, iend
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, "bold", @istart, @iend)
EndProcedure

Procedure Editor_Font(efont.s, size, buffer)
  Protected.GtkTextIter istart, iend
  gtk_text_buffer_create_tag(buffer, efont, "family", @efont) ; Ist das so korrekt ?
  gtk_text_buffer_create_tag(buffer, "new_size", "size", size * #PANGO_SCALE)
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, "bold", @istart, @iend)
EndProcedure

Procedure Editor_Normal(buffer)
  Protected.GtkTextIter istart, iend
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_remove_all_tags_(buffer, @istart, @iend)
EndProcedure


Meine Frage:
-> Wie kann man einen formatierten Text abspeichern und auch wieder laden ?

Danke an alle Linux-Freaks!!!

Autor:  Omi [ 18.06.2017 09:24 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Hallo ccode_new,

zuerst mal zum
Code:
gtk_text_buffer_create_tag(buffer, efont, "family", @efont) ; Ist das so korrekt ?
Respekt, du hast schnell einen kritischen Punkt gefunden :wink:
Das Problem ist hier die starre Parameterübergabe in PureBasic die in C mal ein Integer oder String (Pointer) sein kann.
In Linux wird bei einem String UTF8 erwartet. Wird in PB ein Pointer auf den String übergeben, passt es bei den hier möglichen 'Bezeichnungen' in Ascii fast immer (Ascii und UTF8 sind identisch) und es funktioniert einen Zeiger zu übergeben, in Unicode wird UCS2 (2-byte'ig) übergeben und die API verschluckt sich.

Die downloadbare Demo-Übersetzung hat gerade hier noch einen Fehler (z.B. bei "monospace)" und könnte für ähnliche Fälle folgendermaßen umgangen werden ...
Einen Import-Abkömmling für Strings als 'value'-Parameter anlegen:
Code:
gtk_text_buffer_create_tagS(*buffer.GtkTextBuffer, tag_name.p-utf8, first_property_name.p-utf8, value.p-utf8, term= #Null) As "gtk_text_buffer_create_tag"
oder unter Verwendung des ursprünglichen Importes:
für PB5.60+ ...
Code:
gtk_text_buffer_create_tag(buffer, efont, "family", UTF8(efont))
oder als Ersatz für frühere PBs ohne TF8() z.B. ...
Code:
Procedure.s Pb2sUTF8(sPB.s);                        converts PB-Format to UTF8, Returns pointer to string, free *gMem after each use
   Protected *gMem= AllocateMemory(StringByteLength(sPB, #PB_UTF8) + 1);Mem for string in UTF8
   PokeS(*gMem, sPB, -1,  #PB_UTF8)
   Protected.s sUTF8= PeekS(*gMem, -1)
   FreeMemory(*gMem)
   ProcedureReturn sUTF8
EndProcedure

gtk_text_buffer_create_tag(buffer, efont, "family", Pb2sUTF8(efont))

Erstmal schön dass Du hier den Mut hast in die Hände zu spucken. Mir fehlt und fehlte die Zeit um hier weiter zu machen.
Wenn man mal etwas 'Suchmaschin't' sieht man, dass unter Linux auch auf andere Programmiersprachen die RTF-Anfragen häufig im Selbermachen enden.

Auf Grund der auch mir fehlenden Vision (und keinen Dunst von RTF) wie ich es vernünftig speichern könnte, den Möglichkeiten der Tagverwaltung (über API oder selbstgestrickt), den verschiedenen Arten die Tags anzuwenden (bitte mal die Suche in den PB-Foren betätigen), dem Editier-Problem (innerhalb welcher Tags steht der Cursor gerade, bold?, size?, etc., auch hier hilft einem die API aber es ist komplex), dem auszuarbeitenden Import hab ich's erst mal 'verschoben' :roll: .

Leider bin ich mittlerweile vom Thema wieder ziemlich raus, denke aber, man sollte mal bescheiden beginnen (Textgrößen, Stil/Attribute) und das Ganze wirken lassen, ob das Konzept Zukunft hat.

Gruß Charly

Autor:  ccode_new [ 18.06.2017 13:52 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Hi "Omi" !!!

Danke für deine Hilfe.

Das mit den Schriftarten funktioniert so toll:

Code:
Procedure Editor_Font(efont.s, size, buffer)
  Protected.GtkTextIter istart, iend
  Protected *fontbuffer
  *fontbuffer = UTF8(efont)
  gtk_text_buffer_create_tag(buffer, efont, "family", *fontbuffer)
  gtk_text_buffer_create_tag(buffer, "new_size", "size", size * #PANGO_SCALE)
  gtk_text_buffer_get_selection_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, efont, @istart, @iend)
  gtk_text_buffer_apply_tag_by_name(buffer, "new_size", @istart, @iend)
  FreeMemory(*fontbuffer)
EndProcedure


Aber das mit dem Speichern und Laden ist noch so ein Problem.

Meine Fragen:

Wie implementiert man folgende Api-Funktion korrekt in PureBasic:

gtk_text_buffer_register_deserialize_tagset(..)
gtk_text_buffer_deserialize(..)
gtk_text_buffer_serialize(..)
gtk_text_buffer_new (GtkTextTagTable *table)

Wie arbeitet man korrekt mit GtkTextTagTable ?
Dies braucht man z.B für gtk_text_buffer_register_deserialize_tagset(..)

oder für die Konstruktor-Funktion: gtk_text_buffer_new()

Mein Vorhaben ist es mehrere Tags (z.B <b> und </b>, <i> und </i> ) zu parsen.
Das heißt an entsprechender Positionen <b>, ... speichern und diese später wieder auslesen. Damit man daraufhin den Text formatieren kann.

...........................
ES IST NERVIG ! :?

Ich habe mir gedacht einen zweiten Buffer anzulegen in dem ich zusätzlich zum ersten Buffer die Sonderanweisungen (<b>, </b>, ...) mit speichere.
Der erste Buffer soll nur angezeigt werden damit man die Sonderbefehle nicht sieht.
Soweit ok!
Weiter gedacht:
Man soll ja auch selber die Zeichen <b>, </b>, <i> , .... im Text eingeben können.
Nichts leichter als das: Einfach ein "ReplaceString" für alle echten Vorkommen der jeweiligen Sonderanweisungen bevor diese gespeichert werden und die Trenner hinzugefügt werden. (Aus <b> wird dann z.Bsp. %#x und aus </b> (§$< oder so ähnlich)

Soviel zur Theorie.

Wie kann man jetzt z.B. ein <b> vor der jeweiligen Selektion hinzufügen und ein </b> danach ?

Das geht z.Bsp. nicht:
Code:
gtk_text_buffer_get_selection_bounds_(savBuffer,@istart,@iend)
gtk_text_buffer_insert(savBuffer, @istart, "<b>", 3)
gtk_text_buffer_insert(savBuffer, @iend, "</b>", 4)


Je nachdem welche Insert-Anweisung ich weglasse wird entweder das <b> davor, oder das </b> danach eingefügt.
Aber nie BEIDE Anweisungen.

Warum ?

....
Man könnte es ja auch so machen:
Code:
gtk_text_buffer_insert(savBuffer, @istart, "<b>", 3) 
gtk_text_buffer_insert_at_cursor(savBuffer, "</b>", Len("</b>"))

Ob das so gut ist ?

Eine weitere kritische Frage ist:
Code:
gtk_text_buffer_get_bounds_(buffer, @istart, @iend)
gtk_text_buffer_get_text_(buffer, @istart, @iend, 0) ; Wie kann ich den Bufferinhalt als String erhalten ?


Danke für jede Hilfe.

Autor:  ccode_new [ 19.06.2017 18:41 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Hi Leute ich hab's hinbekommen.

Es werden weitere Imports benötigt:

Code:
  gtk_text_buffer_register_serialize_tagset(*buffer.GtkTextBuffer, *tag)
  gtk_text_buffer_register_deserialize_tagset(*buffer.GtkTextBuffer, *tag)
  gtk_text_buffer_deserialize(*regbuffer.GtkTextBuffer, *contbuffer.GtkTextBuffer, *format, *iter, *gdata, slen, term = #Null)
  gtk_text_buffer_serialize(*regbuffer.GtkTextBuffer, *contbuffer.GtkTextBuffer, *format, *start, *end_, slen)
  gtk_text_buffer_unregister_serialize_format(*buffer.GtkTextBuffer, *format)
  gtk_text_buffer_unregister_deserialize_format(*buffer.GtkTextBuffer, *format)
  gtk_text_buffer_insert_at_cursor(*buffer.GtkTextBuffer, text.p-utf8, slen)
  g_file_set_contents(dstFileName.p-utf8, *mem, slen, term = #Null)
  g_file_get_contents(dstFileName.p-utf8, *mem, slen, term = #Null)
  gtk_text_buffer_deserialize_set_can_create_tags(*buffer.GtkTextBuffer, *format)
  gtk_text_buffer_delete(*buffer.GtkTextBuffer, *start, *end_)
  g_free(*mem)


Hier die Funktionen zum formatierten Laden und Speichern.

Code:
Procedure Editor_Save(buffer, filename.s)
  Protected.GtkTextIter istart, iend
  Protected grtSerializeFormat
  Protected serializedData
  Protected plen
  Protected.b success
 
  grtSerializeFormat = gtk_text_buffer_register_serialize_tagset(buffer, #Null$)
  gtk_text_buffer_get_bounds_(buffer, @istart, @iend)
  serializedData = gtk_text_buffer_serialize(buffer, buffer, grtSerializeFormat, @istart, @iend, @plen)
  success = g_file_set_contents(filename, serializedData, plen, #Null)
  g_free(serializedData)
  gtk_text_buffer_unregister_serialize_format(buffer, grtSerializeFormat)
EndProcedure

Procedure Editor_Load(buffer, filename.s)
  Protected.GtkTextIter istart, iend
  Protected grtDeserializeFormat
  Protected serializedData
  Protected plen
  Protected.b success
 
  success = g_file_get_contents(filename, @serializedData, @plen, #Null)
  grtDeserializeFormat = gtk_text_buffer_register_deserialize_tagset(buffer, #Null$)
  gtk_text_buffer_deserialize_set_can_create_tags(buffer, grtDeserializeFormat)
  gtk_text_buffer_get_bounds_(buffer, @istart, @iend)
  gtk_text_buffer_delete(buffer, @istart, @iend)
  success = gtk_text_buffer_deserialize(buffer, buffer, grtDeserializeFormat, @istart, serializedData, plen, #Null)
  g_free(serializedData)
  gtk_text_buffer_unregister_serialize_format(buffer, grtDeserializeFormat)
EndProcedure


Es funktioniert !!!!

Bin happy :bounce:

Autor:  ccode_new [ 19.06.2017 19:36 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Ich hab dann mal noch ne Frage.

Hätte jemand eine Idee wie ich den Save-Stream ((serialisierte Daten)- also das was in die Datei gespeichert wird) in einen String umleiten kann?

Ich möchte dabei nicht den Umweg über das auslesen des Files gehen.

Dank 'schön für jede Hilfe!

Autor:  Omi [ 19.06.2017 20:07 ]
Betreff des Beitrags:  Re: Suche rtf (richedit) Control für Linux

Hallo ccode_new,

hätte grad mal im Telegrammstil geantwortet (tut mir Leid, bin grad im Umzugsstress).
Dann erstmal Glückwunsch. Habs noch nicht getestet - sieht aber nach sehr sauber umgesetzt aus. Respekt!
So weit hätte ich Dir auf Anhieb eh nicht helfen können.

Du hättest die serializedData gerne als String?
Da in g_file_set_contents() der Parametertyp const gchar *contents ist, denke ich (ungetestet) dass Irgendwas$= PeekS(serializedData, -1, #PB_UTF8) funktionieren könnte.

Da Du Dich doch sehr gut ins Thema reinarbeitest schick ich Dir die nächsten Tage per PM noch 2 ältere unfertige Experimentiercodes bzgl. EditorGadget-Formatierung (müssen noch lauffähig aufbereitet werden). Vielleicht kannst Du was brauchen daraus.

Gruß Charly

Seite 1 von 4 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/