Our Blog, FileMaker only, Xojo only, Archive (older)     Follow us on Twitter, Xing, LinkedIn or Facebook.

MBS Birthday Sale


We celebrate in April 2020 the 20th anniversary of our company. Founded on 1st April 2000 as a sole proprietorship, we later upgraded in 2005 to a GmbH (limited) and over the years even got staff. As we trade as Monkeybread Software, we got a trademark for this name. Since 2001 we provide Xojo plugins and since 2006 we provide a FileMaker plugin.

Thanks to the thousands of customers around the world, who support us by buying licenses over the years. Thank you for the feedback, the greetings and the good testimonials we got.

Our party got moved to 2021 where we celebrate 20+1 years of the Monkeybread Software next year. Same party may also celebrate 15 years of MBS FileMaker Plugin, my 40th birthday and 20 years of our MBS Xojo Plugins.

As a thank you for all our existing and new customers, we offer for April a 20% discount on purchases for all our licenses. Coupon code 20years needs to be entered for web shop to get the discount. For links to PayPal directly from our website, we can just reduce the amount automatically.

If you need a license or an update, please enjoy the discount. This includes our licenses as well as DynaPDF licenses. If your license expires in the future, you can order this month and extend your license for up to five years in the future!

Otherwise have a great spring time at home, stay healthy and see you at the next conferences!

Build System Updates for new targets


As you may have noticed the Xojo Inc. announced in the XDC 2020 keynote (see Youtube playlist), that we'll get plugins for iOS later this year. For us it is time to update the build system to duplicate a lot of scripts for new targets.

First we tested how to build iOS dylibs from command line which worked quickly. The more difficult part will be to change code to use #if to enable it for iOS. And of course to later add iOS specific code to get functionality.

Next we worked on trying Linux ARM in 64bit. While not announced, we expect Xojo Inc. to do this someday when they see the need and an engineer has a few days to start the process. For us building ARM 64-bit seems to work fine. It's more or less just duplication of scripts and changing 32 to 64 for the bit count and using separate folder/file names for libraries.

To be prepared in case the Mac with ARM rumors turn up true, we added MacARM as possible build target. The scripts seem to work except that we get errors as the Mac SDK shipping currently does not support arm.

Finally we added the Android platform as target with both simulator and device modes. But we have not yet compiled anything this is a bit new for us. But we expect to learn from Xojo Inc. on how to setup a build environment as they need to do this for their own internal plugins, e.g. XML classes.

All the work is a bit preliminary and subject to change. Once Xojo comes with support for new targets, we can make sure we use the right compilation flags to produce matching libraries.

The new targets added here are:
  • iOS Simulator 64-bit
  • iOS Device 64-bit
  • Linux ARM 64-bit
  • Mac ARM 64-bit
  • Android ARM Simulator 64-bit
  • Android ARM Device 64-bit
Not sure if we get those targets all this year, but at least the build system is prepared. Over 20 libraries do compile for iOS and Linux 64bit already. Some plugins like the CURL and DynaPDF ones do compile for those platforms just fine.

Looking forward for the new targets and thanks to everyone who supports us by testing new functionality and keeping license current.

XDC 2020 MBS Plugins Presentation


Christian Schmitz presents what is new in MBS Xojo Plugins since the last conference and what is coming soon.

Enjoy and if you have questions, please don't hesitate to contact us.

XDC 2020 SceneKit Presentation


Stefanie Juchmes presents SceneKit and what coming soon for next plugin version: Enjoy and if you have questions, please don't hesitate to contact us.

20 year party moved to 2021


After long discussions we decide to move our 20 year party to the year 2021. Same location, same setup, but simply a year later.

In April 2020 our company will turn 20 years old and we celebrate a bit at home.
We'll plan to have a big party next year in Germany near our office with over 100 guests.

All people invited for this year will be asked to contact us in early 2021 whether they join the party in April 2021. We'll send new invitations next year to remind everyone.

The new date has the advantage that it's close to XDC 2021, so customers from America may extend their stay in Europe and join our party.

Please stay healthy and enjoy some time home with family.

News from the MBS Xojo Plugins Version 20.1


In this article I want to introduce you the new functionalities from the MBS Xojo Plugins in version 20.1.

Data from Images
The classes JPEGImporterMBS, GMImageMBS and GM16ImageMBS got the new property ExifThumbnail. This property extracts an embedded thumbnail in EXIF data and return it as a string. With this string we can use the method getData method of the Picture class or our JPEG functions to decompress and display the thumbnail.

The class JPEGImporterMBS got the ExifOrientation property that queries the orientation from the Exif data. We receive the orientation as an integer and you can use this number to determine and adjust the alignment if necessary.

The classes GMImageMBS and GM16ImageMBS include the new shared method FontMap. We can use this method to find out which fonts are currently available. The method can also help us to debug and find out the reason why a font is not loaded. The function returns a string with a XML structure. (more)

Background Color for TextArea control


For next plugin version we add four new properties to TextArea class: So you can control the background color of text for MacOS and Windows.

Coming soon for next plugin pre-release.

Tip of the day: Do Copy and Paste yourself in Xojo desktop app on Windows


On Windows in a Xojo project if you have no menu bar on a window, the usual shortcuts like Control-C won't work. But if you like to get copy & paste to work, you may just handle the Control key plus various shortcuts yourself. So here some code you can copy & paste to your project if you have a window where textfields don't do the shortcuts. Best may be to put it in a TextField subclass to have it working in multiple fields without duplicating the code a lot of times:

EventHandler Function KeyDown(Key As String) As Boolean #If TargetWindows Dim a As Integer = Asc(key) If Keyboard.ControlKey Then Select Case a Case 1 // Control-A Me.SelStart = 0 Me.SelLength = Len(Me.Text) Return True Case 3 // Control-C Dim cl As New Clipboard cl.SetText Me.SelText Return True Case 22 // Control-V Dim cl As New Clipboard Me.SelText = cl.Text Return True Case 24 // Control-X Dim cl As New Clipboard cl.SetText Me.SelText Me.SelText = "" Return True Else Return False // ignore? End Select End If #EndIf End EventHandler
If you have questions, please don't hesitate to contact us.

Congratulations to the 2020 Xojo Design Award Winners!


Looks like we were supposed to receive an Xojo Design Award at the cancelled Xojo.Connect conference:

Congratulations to the 2020 Xojo Design Award Winners!

Best Consumer App - HDRtist NX, Ohanaware
Best iOS App - PropertyMe Manager, PropertyMe
Best Lifestyle App - Crossword Wizard, Rush Software
Best Vertical Market App - qwireCast, qWire
Best Developer Tool - RegExRX, MacTechnologies Consulting
Best Vertical Market App - bMD Medical Software
Best Plugin - MBS Plugins, MonkeyBread Software

*Yes, there are 2 Best Vertical Market Apps, they were both so good we had no choice but to award them both!

View the winners here!

Thanks Xojo, Inc. and see you all next year in London for Xojo.Connect from 21st to 23rd April 2021.

Tip of the day: Step for Textfield in Xojo


Today a client asked if we could change the step count for number fields in a Xojo web app. As the HTML Input element offers a step feature, we could easily implement the step and also offer a min and max values, too. For example you can put this lines in an Open or Shown event of the WebTextField object on your webpage:

Me.ExecuteJavascript("document.getElementById('" + Me.ControlID + "_inner').step=10;") Me.ExecuteJavascript("document.getElementById('" + Me.ControlID + "_inner').min=0;") Me.ExecuteJavascript("document.getElementById('" + Me.ControlID + "_inner').max=100;")
Optionally we could make this one call to ExecuteJavascript, but for the client here, we subclass WebTextField, add properties for the inspector in the IDE to set them and then run those lines in the Shown event to pass to the browser if they are set.

Trip to New York and Nashville cancelled


Due to the decision of the US government to ban us from coming to the USA (see press release), we cancel our trips to the USA.
  • For the FileMaker meeting on Thursday we'll try to join via WebEx.
  • The Xojo meeting in New York in the steak house could take place, but just without us.
  • For the Xojo.Connect conference we expect to find some solution. We'll probably provide our session as video on our website. Maybe we can hold it via video conferencing from today. This also offers the chance for Xojo Inc. to allow virtual attendance to the conference by streaming the sessions.
  • The Claris Engage conference is in August and we hope the flu season is over by then. But we will not book/pay a booth and tickets until we know the ban is liften and doesn't get extended till summer.

PS: The Xojo.Connect conference is cancelled. Also the PauseOnError in St. Louis for FileMaker developers is cancelled.

Checking out the party location


We went to the party location for our 20 years Monkeybread Software event. Our mascot directly found a chair at the bar, but the bartender didn't show up that day.

In April 2020 our company will turn 20 years old and we celebrate.
We'll plan to have a big party here in Germany near our office with over 100 guests.

We hope for good weather and plan to do some barbecue and have a bouncy castle for the kids. They have a lovely terrasse for sitting outside, a big smoker for some great barbecue and be hired a DJ to entertain us.

If you like to join and you miss an invitation, you can contact us and ask whether your invitation got lost. Today we sent a few more invitations. In total something like 600 people invited, but most can't come. As people confirm they are coming, we'll add them to the guest list. If we run out of space, we may put people on the wait list. If you can't make it, please respond soon, so we don't need to contact you again later.

MonkeyBread Software Releases the MBS Xojo Plugins in version 20.1


Nickenich, Germany - (March 10th, 2020) -- MonkeyBread Software today is pleased to announce MBS Xojo Plugins 20.1 for macOS, Linux and Windows, the latest update to their product that is easily the most powerful plugin collection currently available for Xojo. MBS Xojo Plugins have been updated and now includes over 2600 classes and 68,000 documented features, and the versatile plugins have gained more new functions:

Since Xojo 2019r3 uses a newer version of Chromium Embedded Framework for the Webkit enabled HTMLViewer controls, we updated our classes to support this. You can use the MBS Xojo Win Plugin with three different CEF versions depending on the version included with your Xojo version. For the ChromiumBrowserMBS class we have a new RegisterExtension function to register JavaScript based extensions.

Our JavaScriptEngineMBS class got upgraded to pass memoryblocks with copying in normal parameters, results and properties. The Memoryblock is available as UInt8 array in JavaScript. The new GlobalMemoryBlock function passes memory blocks to properties by reference to allow you to reference the same memory in Xojo and JavaScript. With our new MT methods you can call functions or evaluate code snippets on a preemptive thread to run them in background and keep your user interface responsive. Use JavaScriptDateComponentsMBS class to work with dates in JavaScript.

In MacOS you can now support Airplay devices. Use AVRouteDetectorMBS class to detect available devices and use AVRoutePickerViewControlMBS control to display the standard user interface to pick a target device. When using our WebKit 2.x browser control, you can now configure it using WKPreferencesMBS and WKWebViewConfigurationMBS classes. Use WKHTTPCookieStoreMBS to work with the cookies there.

For Windows check the new Navigate method in IEWebBrowserMBS class. You can use it to load a website with GET or POST operation and include POST data, e.g. to send a form directly and show resulting webpage. Pass additional headers with the request including a different user-agent, e.g. to pass a browser check which does not like Internet Explorer.

Check our new Windows file dialog classes around WinFileDialogMBS class. You can customize them including custom controls in the dialog like labels, buttons, checkboxes, textfields and popup menus. We provide a lot of events, so you can react to user interaction and enable/disable or query values.

For JPEGImporterMBS and GMImageMBS class we added EXIF thumbnail functions, so you can quickly get a thumbnail picture embedded in EXIF metadata. Use our new LTCMBS class to generate or recognize time codes in audio streams. For our Encryption plugin we added a BCryptMBS class to encrypt and hash passwords with bcrypt algorithm.

Finally we updated to CURL version 7.69.0, DynaPDF to 4.0.37.107, SQLAPI to 5.0.5 and SQLite to 3.31.0.

See release notes for a complete list of changes.

WebPicture from PDF Page HiDPI


Today we updated our WebPicture from PDF Page example project for Xojo to better handle HiDPI support when rendering PDF pages with DynaPDFMBS class in MBS Xojo DynaPDF Plugin.

The WebPicture class has a couple of constructors, but sadly none to provide both width and height and image data. So we need to create the WebPicture based on a low resolution version to get the right size in. Later we replace data with high resolution image data to get the sharp image to show in browser. Here is our sample code:

Function RenderPDFWebPicture(file as FolderItem, pageIndex as integer, width as integer, height as integer) As WebPicture Dim pdf As New MyDynaPDFMBS // create PDF environment and setup If pdf.CreateNewPDF(Nil) Then if pdf.SetImportFlags(pdf.kifImportAsPage + pdf.kifImportAll) then // open source file If pdf.OpenImportFile(file, 0, "") >= 0 Then // import file if pdf.Append then If pdf.ImportPageEx(PageIndex, 1.0, 1.0) >= 0 Then if pdf.EndPage then // make a jpeg If pdf.SetJPEGQuality(80) Then // render 1x If pdf.RenderPageToImage(pageIndex, Nil, 72, width, height, pdf.krfDefault, pdf.kpxfRGB, pdf.kcfJPEG, pdf.kifmJPEG) Then Dim LowData As String = pdf.GetImageBuffer // render 2x If pdf.RenderPageToImage(pageIndex, Nil, 144, width, height, pdf.krfDefault, pdf.kpxfRGB, pdf.kcfJPEG, pdf.kifmJPEG) Then Dim HighData As String = pdf.GetImageBuffer // now build 1x picture Dim w As New WebPicture(LowData, "page.jpg") // and put in 2x data w.data = HighData // and return with HiDPI content Return w end if end if end if end if end if end if end if end if End If End Function

As you can see, we create new MyDynaPDFMBS object, our subclass to fill error event and learn about why things may go wrong. The OpenImportFile function may fail to open the PDF file on the server. Otherwise use OpenImportBuffer to pass PDF as data block directly. We import first page, set JPEG quality and then render two versions of the image, one with 72 dpi and one with 144 dpi. Both are then combined into a WebPicture object.

Please do not hesitate to contact us if you have questions. The example will be included in MBS Plugin 20.1 download.

MBS Xojo Plugins, version 20.1pr7


New in this prerelease of the 20.1 plugins:
  • Updated CURL to version 7.69.0.
  • Added BCryptMBS module.
  • Added NSImageMBS.imageWithTintColor method.
  • Fixed FileListMBS to not report logical file sizes correctly for newer Mac implementation.
Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

xDev 18.2 Issue


The March/April (18.2) issue of xDev Magazine is now available. Here's a quick preview of what's inside:

More Fun with Comics by Marc Zeedar
Updating an old networking app for the modern era.

On the Scene Again by Stefanie Juchmes
More with Apple's 3D graphics toolkit, SceneKit.

From Oops to OOP by Markus Winter
An object-oriented approach to custom drawing into the Listbox control.

Your First Web App -- Part Five by Paul Budd
How to deploy the Web app as a standalone app.

Drawing PDFs by Stefanie Juchmes
Using MBS plugin to draw your own PDFs.

MapKit 3 by Markus Winter
More on getting MapKit to work with Xojo.

PLUS: Xojo Bookmarks, Backwards Compatibility, Managing Yourself, Xojo + Catalina, Best of the Web, and more!

MBS Xojo Plugins, version 20.1pr6


New in this prerelease of the 20.1 plugins: Download: monkeybreadsoftware.com/xojo/download/plugin/Prerelease/.
Or ask us to be added to our shared Dropbox folder.

20 Years Monkeybread Software Party


This year in April our company will turn 20 years old.
We'll plan to have a big party here in Germany near our office with over 100 guests.

We hope for good weather and look forward to get the bouncer castle we ever rented.

If you like to join and you miss an invitation, you can contact us and ask whether your invitation got lost. Today we sent a few more invitations. In total something like 600 people invited, but most can't come.

As people confirm they are coming, we'll add them to the guest list. If we run out of space, we may put people on the wait list. If you can't make it, please respond soon, so we don't need to contact you again later.

Crop a two side page document to a single page document


Have you ever had the problem that you scan documents that’s are printed with two pages on each side and you need this document as a single page Document?

The MBS Xojo Plugins can help you with this problem in Xojo. Our Xojo Plugins includes a GraphicsMagick plugin. With the classes in this plugin you can do a lot of graphic editing, like using graphics effects, add text on an image or crop an image by a given area. Compared to Xojo pictures, we can work even with 16bit color depth here and use exact same functions cross platform.

In this article I want to show you how to cut the pages and set a serial page number at the bottom of each page. At first we load the scanned pictures from a folder to our application. For that we query the folder items to an array. With the method SortedFilesMBS we get an array that is sorted by name already. In the parameters of this method, we can set as the second Parameter that we want to sort the array by filenames. My scanned documents are names Scan_1, Scan_2 and so on.

Dim folder As FolderItem = SpecialFolder.Desktop.Child("Scan")
Dim files() As FolderItem = folder.SortedFilesMBS(False, True, False)

Then we want to loop over this array and cut the pages:

Dim u As Integer = files.Ubound
For i As Integer = 0 To u

We load the current file in two GMImage Objects. One for the Left side (imageL) and one to the right side (imageR). Instead of loading the file twice, we use the copy constructor to get two identical image objects.

Dim imageL As New GMImageMBS(files(i))
Dim imageR As New GMImageMBS(imageL) // copy constructor

If no exception is raised, we determine the height and width of the target pictures. We imagine we have a Din A4 paper on which two pages are printed. The long site is at the bottom side. The page is halved on this side. Therefore we need the full height of the sheet but only half the width. The clipping area is defined as GMGeometryMBS object. In the parameters we can defined the height and width of the cropping rectangle and optional the position of the top left edge coordinates. The default position coordinates are 0/0. That’s why we don’t need to set the coordinates for the left mask. For the left side we only need the height and width of the output. The right side has the same size but the x position is different. It is the half of the long bottom page side and that is w.

Dim h As Integer = imageL.height
Dim w As Integer = imageL.width / 2
Dim geoL As New GMGeometryMBS(w, h)
Dim geoR As New GMGeometryMBS(w, h, w, 0)

With the method crop we cut out the pages.

imageL.crop(geoL)
imageR.crop(geoR)

Then we want to write a page number in the bottom of each page. For drawing on a GMImage we set a graphic object as a property of the image.Then we set the color, the stroke width and the font, before we setting the text and the position of the page number. Afterwards we can draw the page number to the image. We need to take care about the stroke width, because if the value is too big the number is no longer legible. We need to calculate the text of the page number. With each loop run we manage two pages, we multiply it with two. Our variable i starts at 0, but our first left side has the number 1. That's why we add 1 for the left side and add 2 for the right side. For this reason we have for the left side the formula: I * 2 + 1 and for the right side the formula I * 2 + 2.

The code for the right page number looks similar.

Dim drawL As GMGraphicsMBS = imageL.Graphics
drawL.strokeColor(New GMColorRGBMBS("black"))
drawL.strokeWidth(1)
drawL.Font("/Library/Fonts/Verdana.ttf")
drawL.Text(w / 2, h - 100, str(i * 2 + 1))
drawL.Draw

Next we set the format of the image, create folder items and save the images on our desktop in a folder named “Output”, creating it if necessary.

imageL.magick = "PNG"
imageR.magick = "PNG"
Dim Output as folderitem = SpecialFolder.Desktop.Child("Output")
Output.CreateAsFolder
Dim sl As FolderItem = Output.Child(Str(i) + "a.png")
Dim sr As FolderItem = Output.Child(Str(i) + "b.png")

imageL.write(sl)
imageR.write(sr)
Next

I hope that you like this example. We wish you lots of fun with the GraphicsMagick classes and functionalities. If you have any questions, please do not hesitate to contact us.

Xojo developer meeting in New York City


The Xojo.Connect conference will take place March 25-27 in Nashville, TN. On our way to Nashville we stop in New York for a few days and we like to organize another Xojo developer meeting, this time in New York City.

Date set: 20th March 2020.
Please email us if you like to be added to the guest list.

We meet in a nice restaurant somewhere in New York City, so we can shop talk about Xojo and have dinner together. Time will probably be around 18 to 22 o'clock and you can of course come later or leave earlier.

If you are interested in private time for consulting, training or discussion MBS or Xojo topics, we can of course schedule a meeting. Please contact me directly interested.

Older blog entries:

2020-02-26 Multithreaded JavaScript usage
2020-02-25 One month till Xojo.Connect 2020 in Nashville
2020-02-24 MBS Xojo Plugins, version 20.1pr5
2020-02-23 Reading JPEG Thumbnails from EXIF
2020-02-18 Programming your own Solar System with Xojo + MBS SceneKit
2020-02-16 Upgrading WebKit for Windows support
2020-02-15 MBS Xojo Plugins, version 20.1pr4
2020-02-13 Improve your work live balance with do not disturb
2020-02-13 Multithreaded plugin functions can increase speed of Xojo application
2020-02-12 Building slides for Xojo.Connect
2020-02-10 MBS Xojo Plugins, version 20.1pr3
2020-02-07 Customized File Open and Save Dialogs for Windows
2020-02-04 Our JavaScript engine, a game changer
2020-02-04 20 Years Monkeybread Software Party
2020-02-03 MBS Xojo Plugins, version 20.1pr2
2020-02-02 Airplay related classes for AVFoundation
2020-02-02 Tips for our JavaScript functions
2020-02-01 17 Years Xojo Developer Magazine
2020-01-31 Comparing JavaScriptEngineMBS to XojoScript
2020-01-30 MBS Xojo Plugins, version 20.1pr1

Archives

Mar 2020
Feb 2020
Jan 2020
Dec 2019
Nov 2019
Oct 2019
Sep 2019
Aug 2019
Jul 2019
Jun 2019
May 2019
Apr 2019
Mar 2019
Feb 2019
Jan 2019
Dec 2018
Nov 2018
Oct 2018
Sep 2018
Aug 2018
Jul 2018
Jun 2018
May 2018
Apr 2018
Mar 2018
Feb 2018
Jan 2018
Dec 2017
Nov 2017
Oct 2017
Sep 2017
Aug 2017
Jul 2017
Jun 2017
May 2017
Apr 2017
Mar 2017
Feb 2017
Jan 2017
Dec 2016
Nov 2016
Oct 2016
Sep 2016
Aug 2016
Jul 2016
Jun 2016
May 2016
Apr 2016
Mar 2016
Feb 2016
Jan 2016
Dec 2015
Nov 2015
Oct 2015
Sep 2015
Aug 2015
Jul 2015
Jun 2015
May 2015
Apr 2015
Mar 2015
Feb 2015
Jan 2015
Dec 2014
Nov 2014
Oct 2014
Sep 2014
Aug 2014
Jul 2014
Jun 2014
May 2014
Apr 2014
Mar 2014
Feb 2014
Jan 2014
Dec 2013
Nov 2013
Oct 2013
Sep 2013
Aug 2013
Jul 2013
Jun 2013
May 2013
Apr 2013
Mar 2013
Feb 2013
Jan 2013
Dec 2012
Nov 2012
Oct 2012
Sep 2012
Aug 2012
Jul 2012
Jun 2012
May 2012
Apr 2012
Mar 2012
Feb 2012
Jan 2012
Dec 2011
Nov 2011
Oct 2011
Sep 2011
Aug 2011
Jul 2011
Jun 2011
May 2011
Apr 2011
Mar 2011
Feb 2011
Jan 2011
Dec 2010
Nov 2010
Oct 2010
Sep 2010
Aug 2010
Jul 2010
Jun 2010
May 2010
Apr 2010
Mar 2010
Feb 2010
Jan 2010
Dec 2009
Nov 2009
Oct 2009
Sep 2009
Aug 2009
Jul 2009
Apr 2009
Mar 2009
Feb 2009
Dec 2008
Nov 2008
Oct 2008
Aug 2008
May 2008
Apr 2008
Mar 2008
Feb 2008
XML: RSS Feed XML: Atom Feed