als Nachtrag zu dem Thema: http://www.purebasic.fr/german/viewtopi ... 21&t=28296 (Danke an CodeCommander für die Links) wollte ich meinen ersten Lösungsansatz präsentieren:
Code: Alles auswählen
EnableExplicit
ImportC ""
gtk_text_buffer_create_tag(*buffer.GtkTextBuffer,tag_name.p-Ascii,first_property_name.p-ascii,tag_value ,null=0) As "gtk_text_buffer_create_tag"
gtk_text_buffer_apply_tag_by_name(*buffer.GtkTextBuffer, name.p-Ascii,*start,*end) As "gtk_text_buffer_apply_tag_by_name"
EndImport
Procedure AddFormatedText(Gadget.i, Text.s)
Static.b initialized
Static.l pangoStyleNormal, pangoStyleItalic, pangoUnderlineNone, pangoUnderineSingle, pangoWeightNormal, pangoWeightBold
Static.s pangoPropertyItalic, pangoPropertyUnderline, pangoPropertyBold, pangoPropertyColor, tagBold, tagItalic, tagUnderline, tagColorRed, tagColorGreen, startBracket, endBracket, regExp
Static.GDKColor gdkColorRed, gdkColorGreen
Protected.l startPosI, endPosI, startPosU, endPosU, startPosB, endPosB, startPosR, endPosR, startPosG, endPosG, lenDiff
Protected.i textBuffer
Protected.s tempText
Protected.GtkTextIter startIter, endIter
If initialized = #False
pangoStyleNormal = 0
pangoStyleItalic = 2
pangoUnderlineNone = 0
pangoUnderineSingle = 1
pangoWeightNormal = 400
pangoWeightBold = 700
pangoPropertyItalic = "style"
pangoPropertyUnderline = "underline"
pangoPropertyBold = "weight"
pangoPropertyColor = "foreground-gdk"
tagItalic = "i"
tagUnderline = "u"
tagBold = "b"
tagColorRed = "r"
tagColorGreen = "g"
gdkColorRed\red = $A8 * $A8
gdkColorRed\green = $38 * $38
gdkColorRed\blue = $38 * $38
gdkColorRed\pixel = 1
gdkColorGreen\red = $98 * $98
gdkColorGreen\green = $C8 * $C8
gdkColorGreen\blue = $98 * $98
gdkColorGreen\pixel = 2
startBracket = "["
endBracket = "]"
regExp = "["+startBracket+"]["+tagItalic+tagUnderline+tagBold+tagColorRed+tagColorGreen+"]["+endBracket+"]"
initialized = #True
EndIf
tempText = Text
If CreateRegularExpression(0, regExp)
Text = ReplaceRegularExpression(0, Text, "")
SetGadgetText(Gadget, Text)
textBuffer = gtk_text_view_get_buffer_(GadgetID(Gadget))
gtk_text_buffer_create_tag(textBuffer, tagItalic, pangoPropertyItalic, pangoStyleItalic)
gtk_text_buffer_create_tag(textBuffer, tagUnderline, pangoPropertyUnderline, pangoUnderineSingle)
gtk_text_buffer_create_tag(textBuffer, tagBold, pangoPropertyBold, pangoWeightBold)
gtk_text_buffer_create_tag(textBuffer, tagColorRed, pangoPropertyColor, gdkColorRed)
gtk_text_buffer_create_tag(textBuffer, tagColorGreen, pangoPropertyColor, gdkColorGreen)
If ExamineRegularExpression(0, tempText)
While NextRegularExpressionMatch(0)
If lenDiff = 0
lenDiff = 1
Else
lenDiff + 3
EndIf
If RegularExpressionMatchString(0) = startBracket+tagItalic+endBracket And startPosI <= 0
startPosI = RegularExpressionMatchPosition(0) - lenDiff
ElseIf RegularExpressionMatchString(0) = startBracket+tagItalic+endBracket And startPosI > 0
endPosI = RegularExpressionMatchPosition(0) - lenDiff
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosI)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosI)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagItalic, @startIter, @endIter)
startPosI = 0
ElseIf RegularExpressionMatchString(0) = startBracket+tagUnderline+endBracket And startPosU <= 0
startPosU = RegularExpressionMatchPosition(0) - lenDiff
ElseIf RegularExpressionMatchString(0) = startBracket+tagUnderline+endBracket And startPosU > 0
endPosU = RegularExpressionMatchPosition(0) - lenDiff
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosU)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosU)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagUnderline, @startIter, @endIter)
startPosU = 0
ElseIf RegularExpressionMatchString(0) = startBracket+tagBold+endBracket And startPosB <= 0
startPosB = RegularExpressionMatchPosition(0) - lenDiff
ElseIf RegularExpressionMatchString(0) = startBracket+tagBold+endBracket And startPosB > 0
endPosB = RegularExpressionMatchPosition(0) - lenDiff
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosB)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosB)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagBold, @startIter, @endIter)
startPosB = 0
ElseIf RegularExpressionMatchString(0) = startBracket+tagColorRed+endBracket And startPosR <= 0
startPosR = RegularExpressionMatchPosition(0) - lenDiff
ElseIf RegularExpressionMatchString(0) = startBracket+tagColorRed+endBracket And startPosR > 0
endPosR = RegularExpressionMatchPosition(0) - lenDiff
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosR)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosR)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorRed, @startIter, @endIter)
startPosR = 0
ElseIf RegularExpressionMatchString(0) = startBracket+tagColorGreen+endBracket And startPosG <= 0
startPosG = RegularExpressionMatchPosition(0) - lenDiff
ElseIf RegularExpressionMatchString(0) = startBracket+tagColorGreen+endBracket And startPosG > 0
endPosG = RegularExpressionMatchPosition(0) - lenDiff
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosG)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosG)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorGreen, @startIter, @endIter)
startPosG = 0
EndIf
Wend
EndIf
FreeRegularExpression(0)
EndIf
lenDiff = Len(Text)-1
If startPosI > 0 And endPosI = 0
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosI)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagItalic, @startIter, @endIter)
EndIf
If startPosU > 0 And endPosU = 0
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosU)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagUnderline, @startIter, @endIter)
EndIf
If startPosB > 0 And endPosB = 0
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosB)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagBold, @startIter, @endIter)
EndIf
If startPosR > 0 And endPosR = 0
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosR)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorRed, @startIter, @endIter)
EndIf
If startPosG > 0 And endPosG = 0
gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosG)
gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorGreen, @startIter, @endIter)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 600, 300, "EditTest", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
EditorGadget(0, 10, 10, 580, 280)
EndIf
AddFormatedText(0, "Dies ist [b]fetter Text[b] und der folgende ist [u]unterstrichen[u]."+#LF$+#LF$+"Nun folgt noch [i]Italic[i]."+#LF$+#LF$+"Und jetzt noch ein [r]dunkel roter Text[r]."+#LF$+#LF$+"[g][b]Dieser Text soll nun fett und grün sein![b][g] Und jetzt wieder normal.")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
End