Page 1 of 1
Dialog - TextGadget misses linebreak support
Posted: Sat Sep 06, 2014 10:42 pm
by Andre
I can imagine, that automatically linebreaks are difficult to support in resizable Dialogs (because PB will automatically calculate the maximum needed box/window width according to the text-length...), but unlike the regular TextGadget() it doesn't even support a linebreak forced by the programmer.
See this examples:
Example 1 - manually Gadget coding:
Code: Select all
a$ = "Very very looooooong name + another loooooonnnnggggg term" ; for this long text-line a linebreak will automatically be done, if the TextGadget is small...
a$ + Chr(10) + "further text on a new line..." ; the Chr(10) will force a linebreak
If OpenWindow(0, 0, 0, 270, 160, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(0, 10, 10, 250, 70, a$)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Example 2 - the same text displayed in a dialog misses even the Chr(10) forced linebreaks:
Code: Select all
CompilerIf #PB_Compiler_Unicode
#XmlEncoding = #PB_UTF8
CompilerElse
#XmlEncoding = #PB_Ascii
CompilerEndIf
#Dialog = 0
#Xml = 0
a$ = "Very very looooooong name + another loooooonnnnggggg term"
a$ + Chr(10) + "further text on a new line..."
; If OpenWindow(0, 0, 0, 270, 160, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
; TextGadget(0, 10, 10, 250, 70, a$)
; Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
; EndIf
XML$ = "<window id='#PB_Any' name='test' text='test' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
" <vbox>" +
" <text text='" + a$ + "' />" +
" </vbox>" +
"</window>"
If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Else
Debug "Dialog error: " + DialogError(#Dialog)
EndIf
Else
Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Re: Dialog - TextGadget misses linebreak support
Posted: Tue Jan 19, 2016 11:15 pm
by Andre
As this problem occurs more often when I try to rewrite all my GUI stuff into new Dialog XML descriptions (causing Dialog windows to be much widther because of one-line textgadgets, which could easily be using a higher height value and display texts multi-line) I need a workaround as long Fred doesn't implement this wish natively.
Any ideas?
Re: Dialog - TextGadget misses linebreak support
Posted: Wed Jan 20, 2016 12:00 am
by PureLust
Andre wrote:Any ideas?
Hey André, ... if you create the Text-Element without Text and set the width manually, you can apply the Multiline-Text to the Textgadget afterwards (with SetGadgetText()).
Using this method, the Text-Element will do word-wrap automatically and also supports the CHR(10) as Linefeed.
Greetz, Albert.
Code: Select all
CompilerIf #PB_Compiler_Unicode
#XmlEncoding = #PB_UTF8
CompilerElse
#XmlEncoding = #PB_Ascii
CompilerEndIf
#Dialog = 0
#Xml = 0
a$ = "Very very looooooong name + another loooooonnnnggggg term"
a$ + Chr(10) + Chr(10) + "further text on a new line..."
XML$ = "<window id='#PB_Any' name='test' text='test' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
" <vbox>" +
" <text name='TextFeld' width='80' height='55' />" +
" </vbox>" +
"</window>"
If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
ResizeWindow(DialogWindow(#Dialog), #PB_Ignore, #PB_Ignore, 220, #PB_Ignore)
SetGadgetText(DialogGadget(#Dialog, "TextFeld"), a$)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Else
Debug "Dialog error: " + DialogError(#Dialog)
EndIf
Else
Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Re: Dialog - TextGadget misses linebreak support
Posted: Wed Jan 20, 2016 12:59 am
by PureLust
Andre wrote:I can imagine, that automatically linebreaks are difficult to support in resizable Dialogs ...
I just recognized, that 'RefreshDialog()' resizes an MultiLined-Textgadget (including CHR(10)) the way, you would expect from the beginning.
So it seems, that there is already a routine which can calculate the right size.
It looks like, that PB just uses a different (simpler) algorithm when it creates the Text-Element, than it does with 'RefreshDialog()'.
So maybe it's not a big deal for Fred to use the 'ResfeshDialog()' routine for the creation process of a Text-Element as well ?!?
Code: Select all
CompilerIf #PB_Compiler_Unicode
#XmlEncoding = #PB_UTF8
CompilerElse
#XmlEncoding = #PB_Ascii
CompilerEndIf
#Dialog = 0
#Xml = 0
Runtime Enumeration Gadgets
#gadText
#gadButton
EndEnumeration
a$ = "Try to resize the Windows to see the word-wrap in action."
a$ + Chr(10) + Chr(10) + "Yes ... I'm a working New-Line..."
XML$ = "<window id='#PB_Any' name='test' text='test' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
" <hbox>" +
" <text name='TextFeld' width='100' height='5' expand='yes'/>" +
" <button id='#gadButton' text='RefreshDialog()'/>" +
" </hbox>" +
"</window>"
If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding) And XMLStatus(#Xml) = #PB_XML_Success
If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
ResizeWindow(DialogWindow(#Dialog), #PB_Ignore, #PB_Ignore, 280,48)
SetGadgetText(DialogGadget(#Dialog, "TextFeld"), a$)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventType() = #PB_EventType_LeftClick
RefreshDialog(#Dialog) ; <--- you can use RefreshDialog, to resize the Text-Element to the width/height you would have expected during creation.
EndIf
Until Event = #PB_Event_CloseWindow
Else
Debug "Dialog error: " + DialogError(#Dialog)
EndIf
Else
Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Re: Dialog - TextGadget misses linebreak support
Posted: Wed Jan 20, 2016 11:47 pm
by Andre
Good idea, thank you!
I successfully implemented the 'Save the multi-line text in strings, create the dialog with empty TextGadgets, and do SetGadgetText() and a RefreshDialog() after dialog creation' in my project.
Of course this "complicates" the dialog creation and should be considered for implementing the directly at dialog creation:
a) support for multi-line texts given at dialog creation
b) automatically linebreaks when there are sizes for the <TextGadget> given and/or parent objects like <SingleBox> etc. are set
Re: Dialog - TextGadget misses linebreak support
Posted: Thu Jan 21, 2016 5:09 pm
by PureLust
Hi André, ... little update on this:
I just become aware, that Multiline-Support works fine, if you do it the right way.
Because CatchXML() needs a proper XML-Text, you just have to use the right XML-Code instead of 'CHR(10)', which is ' ' for a NewLine.
Maybe
THIS PAGE will be helpfull with other special Characters (like '&') as well.
Greetz and have fun,
Albert.
[EDIT:]
Here is a little Routine, that will do the Job for you:
(It converts all unsupported or problematic ASCii-Character into their equivelant HTML-Code.)
Code: Select all
Procedure.s Text2HTML(Text$) ; converts all unsupported ASCii-Chars into HTML-Code
Protected Pos=1
Text$ = ReplaceString(Text$, "&", "&")
Text$ = ReplaceString(Text$, Chr(9), "	")
Text$ = ReplaceString(Text$, Chr(10), " ")
Text$ = ReplaceString(Text$, Chr(39), "'")
Text$ = ReplaceString(Text$, Chr(60), "<")
Text$ = ReplaceString(Text$, Chr(62), ">")
While pos < Len(Text$)
If Asc(Mid(Text$,Pos,1)) < 32
Text$ = Left(Text$,Pos-1)+Mid(Text$,pos+1)
Else
Pos + 1
EndIf
Wend
ProcedureReturn Text$
EndProcedure
Re: Dialog - TextGadget misses linebreak support
Posted: Thu Jan 21, 2016 11:14 pm
by Andre
Hi Albert,
thank you for this tipp! I already tried it successfully in my project - this could avoid the additionally SetGadgetText() and allows directly including the needed text content in the XML definition, just like it should....
I had already built me a similar conversion procedure, but until now mainly for characters which are breaking the XML definition or lead to a wrong display, like: " ' & etc.
So we have the needed workarounds now. Now it's up to Fred and would be very welcome, to implement a native linebreak / correct height calculation of longer texts, without making pre-calculations and manually inserting linebreaks...
Re: Dialog - TextGadget misses linebreak support
Posted: Fri Jan 22, 2016 7:49 am
by Andre
@Albert: Do you have already checked, if all chars listet on the mentioned website (
http://dev.w3.org/html5/html-author/charref) are problemativ for XML dialog definitions? If yes, I think it's worth adding a note about this (problematic chars + need for a conversion, link to the table) to the PB manual...
Re: Dialog - TextGadget misses linebreak support
Posted: Fri Jan 22, 2016 3:45 pm
by PureLust
Hi André,
yes, I've already checked that.
All characters which i found out were problematic, are covered by the Text2HTML() routine above.
So, as you can see in the code, only the Chars from 0-31, and
& ' < > results in Problems and have to be converted.
As you can see in the result of the sample-code in
THIS post, the conversion works quit well.
