On the B4J forum, liulifeng77 asked the question how he could draw a QR Code in an ABMaterial web page.
I had 5 minutes to spare, so I created the QRCode component using ABMCustomComponent. It is using this javascript library: https://github.com/davidshimjs/qrcodejs
The component class CompQRCode:
'Class module Sub Class_Globals Public ABMComp As ABMCustomComponent Public myText As String Public myWidth As Int Public myHeight As Int Public myColorDark As String Public myColorLight As String Public myCorrectLevel As String End Sub 'Initializes the object. You can add parameters to this method if needed. Public Sub Initialize(InternalPage As ABMPage, ID As String, text As String, width As Int, height As Int, colorDark As String, colorLight As String, correctLevel As String) ABMComp.Initialize("ABMComp", Me, InternalPage, ID) myText = text myWidth = width myHeight = height myColorDark = colorDark myColorLight = colorLight myCorrectLevel = correctLevel End Sub Sub ABMComp_Build(internalID As String) As String Return $" <div id="${internalID}svg"/></div> <script>var qrcode${internalID};</script>"$ End Sub ' Is useful to run some initalisation script. Sub ABMComp_FirstRun(InternalPage As ABMPage, internalID As String) Dim script As String = $"qrcode${internalID} = new QRCode(document.getElementById("${internalID}svg"), { text: "${myText}", width: ${myWidth}, height: ${myHeight}, colorDark : "${myColorDark}", colorLight : "${myColorLight}", correctLevel : ${myCorrectLevel} });"$ InternalPage.ws.Eval(script, Array As Object(ABMComp.ID)) ' flush not needed, it's done in the refresh method in the lib End Sub ' runs when a refresh is called Sub ABMComp_Refresh(InternalPage As ABMPage, internalID As String) Dim script As String = $"qrcode${internalID}.clear(); qrcode${internalID}.makeCode("${myText}");"$ InternalPage.ws.Eval(script, Array As Object(ABMComp.ID)) End Sub ' do the stuff needed when the object is removed Sub ABMComp_CleanUp(InternalPage As ABMPage, internalID As String) End Sub
Usage (if you want to change its text at run time, put the declaration in Class_globals):
Dim QRCode As CompQRCode
In BuildPage() load the javascript library:
page.AddExtraJavaScriptFile("custom/qrcode.min.js")
In ConnectPage():
QRCode.Initialize(page, "qrcode", "Alwaysbusy's ABMaterial", 128,128, "#000000", "transparent", "QRCode.CorrectLevel.H") page.Cell(3,1).AddComponent(QRCode.ABMComp)
Et voila, another new component!
Alwaysbusy