Hier einen kleinen Arbeitscode, der sich nach einigen kleinen Änderungen theoretisch auch unter Linux verwenden lassen sollte.
Habe ihn ursprünglich dazu verwendet im Editorgadget den gleichen Zeilenumbruch (Höhe und Weite in mm) zu haben, wie in den erzeugten PDF-Dokumenten.
Wenn der Text weiter als die Vorgabe ist, wird ein Zeilenumbruch Chr(10) eingefügt. Ist der Text zu lang (Höhe), wird er abgeschnitten und in der Variablen "EGCut" gespeichert.
Code: Alles auswählen
;/ WordWrap4PDF
;/ basiert auf dem Zeilenumbruch bei PurePDF (Lucky Luke)
;/ Thorsten Hoepppner (Thorsten1867)
Global EGCut.s
#FontEG = 0
Structure EGFontStructure
Name.s
Size.f
mm.f
FontID.l
CharWidth.w[256]
EndStructure
Global FontEG.EGFontStructure
Procedure Editor_SetCursorPos(GID.l, CharIdx.l)
Range.CHARRANGE
Range\cpMin = CharIdx
Range\cpMax = CharIdx
SendMessage_(GadgetID(GID),#EM_EXSETSEL,0,Range)
EndProcedure
Procedure.l Editor_GetCursorPos(GID.l)
; returns relative Position of Cursor
SendMessage_(GadgetID(GID),#EM_EXGETSEL,0,Range.CHARRANGE)
ProcedureReturn Range\cpMax
EndProcedure
Procedure Editor_GetModify(GID) ; Editorgadget geändert?
If IsGadget(GID)
ProcedureReturn GetGadgetData(GID)
EndIf
EndProcedure
Procedure Editor_SetModify(GID) ; Editorgadget geändert
If IsGadget(GID)
ProcedureReturn SetGadgetData(GID, #True)
EndIf
EndProcedure
Procedure.l SetEditorFont(Font.s, Size.w) ; Zeichensatz für Editorfelder
Protected vCharWidth.w
FontEG\Size = Size
FontEG\mm = Size/(72/25.4)
Select Font
Case "Arial", "Helvetica"
FontEG\Name = "Arial"
FontEG\FontID = LoadFont(#FontEG, "Arial", Size, 0)
Restore Helvetica
Case "Times", "Times New Roman"
FontEG\Name = "Times New Roman"
FontEG\FontID = LoadFont(#FontEG, "Times New Roman", Size, 0)
Restore Times
EndSelect
For j = 0 To 255
Read vCharWidth
FontEG\CharWidth[j] = vCharWidth
Next
ProcedureReturn FontEG\FontID
EndProcedure
Procedure GetMaxRows(height.f) ; max. Zeilenzahl im EditorGadget
ProcedureReturn Round(height/(Round(FontEG\mm*10,1)/10),0)
EndProcedure
SetEditorFont("Arial", 11)
Procedure.s SetEditorText(GID.l, text.s, w.f, h.f, Align.s="J", modify.b=#True) ; Text mit autom. Zeilenumbruch setzen
If IsGadget(GID) ;{ modifiziert bzw. ungültig
CharIdx.l = Editor_GetCursorPos(GID) ; Cursorposition
If SendMessage_(GadgetID(GID) , #EM_GETMODIFY , 0 , 0) = #False And modify
ProcedureReturn "|"
EndIf
Else
ProcedureReturn "|" ; Ungültiges Gadget
EndIf ;}
Protected s.s, c.s, pdfWs.f = 0, Text$ = "", wMax.f, maxline.l = 0, part.s
Editor_SetModify(GID)
If h > 0
maxline = Round(h/(Round(FontEG\mm*10,1)/10),0)
Else
maxline = 0
EndIf
wMax = (w-2)*1000/FontEG\mm
s = ReplaceString(text, #CRLF$, " ")
s = RemoveString(s, Chr(13)) : s = RemoveString(s, Chr(10))
s = ReplaceString(s, Chr(10), Chr(182))
nb = Len(s) ; Textlänge
sep = -1 : i = 1 : j = 0 : l = 0 : ns = 0 : nl = 1 : c.s = ""
While ( i < nb )
c = Mid(s,i,1) ; Nächstes Zeichen
Select c ; --- aktueller Buchstabe ---
Case Chr(182) ; Zeilenumbruch
If pdfWs > 0 : pdfWs = 0 : EndIf
part = RemoveString(Mid(s,j,i-j), Chr(182))
If nl = 1
Text$ + RTrim(part) + Chr(182) + Chr(10)
ElseIf Right(Trim(part),1) = "-"
Text$ + Trim(part) + Chr(182) + Chr(10)
Else
Text$ + LTrim(part) + Chr(182) + Chr(10)
EndIf
i = i + 1
sep = -1 : j = i : l = 0 : ns = 0
nl= nl +1
Continue
Case " " ; Leerzeichen
sep = i : ls = l : ns=ns+1
EndSelect
l = l + FontEG\CharWidth[Asc(c)] ; aktuelle Textbreite
If l > wMax ; Textzeile zu lang
If sep = -1 ;{ automatischer Zeilenumbruch
If i = j ; Anfang = Ende (Textzeile)
i = i +1
EndIf
If pdfWs > 0 : pdfWs = 0 : EndIf
part = Mid(s,j,i-j)
If nl = 1
Text$ + RTrim(part) + Chr(10)
ElseIf Right(Trim(part),1) = "-"
Text$ + Trim(part) + Chr(10)
Else
Text$ + LTrim(part) + Chr(10)
EndIf
;}
Else
If Align = "J" ;{ Blocksatz
If ns > 1
pdfWs = (wMax-ls)/1000*FontEG\Size/(ns-1)
Else
pdfWs = 0
EndIf
EndIf ;}
part = Mid(s,j,sep-j)
If nl = 1
Text$ + RTrim(part) + Chr(10)
ElseIf Right(Trim(part),1) = "-"
Text$ + Trim(part) + Chr(10)
Else
Text$ + LTrim(part) + Chr(10)
EndIf
i = sep + 1
EndIf
sep = -1 : j = i : l = 0 : ns = 0
nl = nl + 1
If maxline > 0 And nl > maxline ;{ max. Zeilen überschritten
If Right(Text$, 1) = Chr(10) : Text$ = Left(Text$, Len(Text$)-1) : EndIf ; Zeilenumbruch entfernen
If Right(Text$, 1) = Chr(13) : Text$ = Left(Text$, Len(Text$)-1) : EndIf
SetGadgetText(GID, Text$) ; Text -> EditorGadget
Editor_SetCursorPos(GID, CharIdx) ; Cursor auf vorherige Position
SendMessage_(GadgetID(GID) , #EM_SETMODIFY , 0 , 0) ; Flag (Modify) zurücksetzen
EGCut = Right(s, Len(s)-i+1)+"|"+Str(maxline)
ProcedureReturn Right(s, Len(s)-i+1)+"|"+Str(maxline)
EndIf ;}
Else
i = i + 1
EndIf
Wend
If pdfWs > 0 : pdfWs = 0 : EndIf ; Rest
Text$ + LTrim(Mid(s,j,i-j + 1))
If Right(Text$, 1) = Chr(10) : Text$ = Left(Text$, Len(Text$)-1) : EndIf ; Zeilenumbruch entfernen
If Right(Text$, 1) = Chr(13) : Text$ = Left(Text$, Len(Text$)-1) : EndIf
SetGadgetText(GID, Text$) ; Text -> EditorGadget
Editor_SetCursorPos(GID, CharIdx) ; Cursor auf vorherige Position
SendMessage_(GadgetID(GID) , #EM_SETMODIFY , 0 , 0) ; Flag (modify) zurücksetzen
EGCut = "|"+Str(maxline)
ProcedureReturn EGCut
EndProcedure
Procedure.s GetEditorText(GID.l) ; Text auslesen (autom. Zeilenumbruch entfernen)
Text$ = ReplaceString(GetGadgetText(GID), #CRLF$, " ")
ProcedureReturn Trim(ReplaceString(Text$, Chr(10)+" ", Chr(10)))
EndProcedure
;- ===== Fontdefinitionen (WordWrap) =====
DataSection
Helvetica:
Data.w 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278
Data.w 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 355, 556
Data.w 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556
Data.w 556, 556, 556, 556, 278, 278, 584, 584, 584, 556,1015, 667, 667, 722, 722, 667, 611, 778
Data.w 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667
Data.w 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500
Data.w 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334
Data.w 584, 350, 556, 350, 222, 556, 333,1000, 556, 556, 333,1000, 667, 333,1000, 350, 611, 350
Data.w 350, 222, 222, 333, 333, 350, 556,1000, 333,1000, 500, 333, 944, 350, 500, 667, 278, 333
Data.w 556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 333, 737, 333, 400, 584, 333, 333
Data.w 333, 556, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667
Data.w 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584
Data.w 778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556
Data.w 556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 584, 611, 556, 556, 556
Data.w 556, 500, 556, 500
Times:
Data.w 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250
Data.w 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 333, 408, 500
Data.w 500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500
Data.w 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722
Data.w 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722
Data.w 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500
Data.w 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480
Data.w 541, 350, 500, 350, 333, 500, 444,1000, 500, 500, 333,1000, 556, 333, 889, 350, 611, 350
Data.w 350, 333, 333, 444, 444, 350, 500,1000, 333, 980, 389, 333, 722, 350, 444, 722, 250, 333
Data.w 500, 500, 500, 500, 200, 500, 333, 760, 276, 500, 564, 333, 760, 333, 400, 564, 300, 300
Data.w 333, 500, 453, 250, 333, 300, 310, 500, 750, 750, 750, 444, 722, 722, 722, 722, 722, 722
Data.w 889, 667, 611, 611, 611, 611, 333, 333, 333, 333, 722, 722, 722, 722, 722, 722, 722, 564
Data.w 722, 722, 722, 722, 722, 722, 556, 500, 444, 444, 444, 444, 444, 444, 667, 444, 444, 444
Data.w 444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 564, 500, 500, 500, 500
Data.w 500, 500, 500, 500
EndDataSection