Aktuelle Zeit: 18.11.2017 16:02

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 13.05.2017 19:58 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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?

????


Zuletzt geändert von ccode_new am 02.07.2017 10:46, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 14.05.2017 10:37 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
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.

_________________
BildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 14.05.2017 12:43 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 14.05.2017 13:46 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 17.06.2017 23:22 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 18.06.2017 09:24 
Offline

Registriert: 25.03.2013 09:59
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

_________________
PureBasic Linux-API-Library: http://www.chabba.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 18.06.2017 13:52 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 19.06.2017 18:41 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 19.06.2017 19:36 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Suche rtf (richedit) Control für Linux
BeitragVerfasst: 19.06.2017 20:07 
Offline

Registriert: 25.03.2013 09:59
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

_________________
PureBasic Linux-API-Library: http://www.chabba.de


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye