Suche rtf (richedit) Control für Linux
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?
????
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?
????
Zuletzt geändert von ccode_new am 02.07.2017 10:46, insgesamt 3-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
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.
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.
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.
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 [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.
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 [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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
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 ... GtkDemo.pb
Textstyle kann man ja nun direkt z.B über Buttons/Toolbar, etc.. so ändern:
Bsp.:
Meine Frage:
-> Wie kann man einen formatierten Text abspeichern und auch wieder laden ?
Danke an alle Linux-Freaks!!!
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 ... GtkDemo.pb
Textstyle kann man ja nun direkt z.B über Buttons/Toolbar, etc.. so ändern:
Bsp.:
Code: Alles auswählen
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
-> Wie kann man einen formatierten Text abspeichern und auch wieder laden ?
Danke an alle Linux-Freaks!!!
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Suche rtf (richedit) Control für Linux
Hallo ccode_new,
zuerst mal zumRespekt, du hast schnell einen kritischen Punkt gefunden
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:oder unter Verwendung des ursprünglichen Importes:
für PB5.60+ ...oder als Ersatz für frühere PBs ohne TF8() z.B. ...
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' .
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
zuerst mal zum
Code: Alles auswählen
gtk_text_buffer_create_tag(buffer, efont, "family", @efont) ; Ist das so korrekt ?
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: Alles auswählen
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"
für PB5.60+ ...
Code: Alles auswählen
gtk_text_buffer_create_tag(buffer, efont, "family", UTF8(efont))
Code: Alles auswählen
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))
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' .
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
PureBasic Linux-API-Library: http://www.chabba.de
Re: Suche rtf (richedit) Control für Linux
Hi "Omi" !!!
Danke für deine Hilfe.
Das mit den Schriftarten funktioniert so toll:
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:
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:
Ob das so gut ist ?
Eine weitere kritische Frage ist:
Danke für jede Hilfe.
Danke für deine Hilfe.
Das mit den Schriftarten funktioniert so toll:
Code: Alles auswählen
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
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: Alles auswählen
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)
Aber nie BEIDE Anweisungen.
Warum ?
....
Man könnte es ja auch so machen:
Code: Alles auswählen
gtk_text_buffer_insert(savBuffer, @istart, "<b>", 3)
gtk_text_buffer_insert_at_cursor(savBuffer, "</b>", Len("</b>"))
Eine weitere kritische Frage ist:
Code: Alles auswählen
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 ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Suche rtf (richedit) Control für Linux
Hi Leute ich hab's hinbekommen.
Es werden weitere Imports benötigt:
Hier die Funktionen zum formatierten Laden und Speichern.
Es funktioniert !!!!
Bin happy
Es werden weitere Imports benötigt:
Code: Alles auswählen
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)
Code: Alles auswählen
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
Bin happy
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
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!
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!
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
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
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
PureBasic Linux-API-Library: http://www.chabba.de