Print PDF dialog with copies and collate options

A client asked about why the print dialog for printing PDF with DynaPDF missed options for copies and collate?

Well, for next pre-release, we will add those options after I found the right flags for the Windows print dialog:

To enable those options, we have to opt-in via putting in a flag to allow it. But that's not enough as the option won't show unless you also tell the dialog how many pages you have. But as that also shows the page number selection, we have to ask the dialog to hide that.

For next version, you can try DynaPDF.Print in FileMaker or PrintPDFFileWithDialog and PrintPDFPageWithDialog methods in DynaPDFMBS class for Xojo.

TextInputCanvas Update

As you may know there is an open source project called TextInputCanvas. It provides some better text input events to Xojo apps using custom text control like the Formatted Text Control.

Recently Xojo 2017r2 was released which uses GTK in version 3.0 on Linux. Previous versions used GTK 2.

You can load a copy on my plugin download page.

This plugin is build with my plugin build system, so it has MBS in the name and includes libraries for Mac, Windows and Linux including ARM, so you can use it in all projects. If you find a bug related to the building it, please tell me.

A speciality of MBS Plugins with GTK is, that we built plugins to link dynamically to GTK and use either GTK 2 or GTK 3 depending on the Xojo version. This should help to have just one set of plugins to work with Xojo 2013 up to 2020.

MBS Xojo Plugins, version 20.5pr6

New in this prerelease of the 20.5 plugins:
  • Updated MacCG, MacBase, MacCloud and MacCI plugins.
  • Reduced usage of deprecated SDK functions.
  • Added IsAliasFile to NSURLMBS and CFURLMBS classes.
  • Rewrote handling of DateTime for variants.
  • Added ADateTime, BDateTime, CDateTime and MDateTime properties to ArchiveEntryMBS class.
  • Added Clone method in IMPixelInfo7MBS class.
  • Updated CURL library to version 7.73.0.
  • Updated freetype library to version 2.10.4.
  • Fixed a few declarations to keep plugins compile with older Xojo versions before 2013.
  • Renamed Open/Close events for NSViewControlMBS control to distinguish ours form the normal control events.
  • Added datetime properties to EKEventMBS and EKAlarmMBS classes.
  • Added DateTime property to CURLSFileInfoMBS class.
  • Added kError_Quic_Connect_Error and kError_HTTP3 constants and GetInfoProxyError method to CURLSMBS class.
  • Fixed an error in BuildRecordSetMBS function with empty value array.
Or ask us to be added to our shared Dropbox folder.

20 Years Monkeybread Software Party postponed

As you may know we celebrated 20 years of Monkeybread Software in April 2020. Sadly the party had to be cancelled due to the Covid-19 pandemic.

We moved the date to 2021 and it's now six months till that date. But as the pandemic is getting even bigger over the winter, we don't expect anyone to want a party in April 2021. As airplane travel is limited and most clients invited live outside of Germany, travel may be impossible. We talked to the manager of the venue and decided to postpone the party date to somewhere in the future. We hope this will be before we celebrate 25 years! But for international travel, we may have to decide on a date at least six months in advance.

One thing you should know is that a business event would have to define a hygiene concept and make sure the planned measures would be enforced. But a party with 1.5 meter distance between guests, no hugs and touching, no buffet and wearing masks all day doesn't sound very pleasant. If anything would happen, we would face serious trouble including 4 to 5 digit penalties.

Let's wait until the situation improves, a hygiene concept is no longer needed, flights between Europe and America run normally and masks are no longer are mandatory.

Please stay safe and healthy!

MBS Xojo Plugins, version 20.5pr5

New in this prerelease of the 20.5 plugins:
  • Fixed a bug in ChartDirector with a failed assertion on quitting the app on Windows.
  • Fixed target flags for newer plugin SDK.
  • Fixed problem in DynaPDFMBS class where we set erroneously a default font for you (since v20.3).
Or ask us to be added to our shared Dropbox folder.

MBS Xojo Plugins, version 20.5pr4

New in this prerelease of the 20.5 plugins:
  • Updated to newer plugin SDK.
  • Deprecated CFXMLParserMBS, CFXMLNodeMBS and related classes.
  • Updated LibXL to version 3.9.2.
  • Added SCPreferencesMBS.Available function.
  • Added AllFontsEx function for WindowsFontFamilyMBS class.
  • Changed SQL Plugin to better work together with Actual Tech SQL Server ODBC Drivers.
  • Updated DynaPDF to version
Or ask us to be added to our shared Dropbox folder.

14 years of Xojo versions supported

Did you know you can still use latest MBS Plugins in the ancient REALbasic 2006r4, the version that introduced 64-bit integer data types?

Our plugins can be used with REALbasic, Real Studio and Xojo for over a decade of years.
See Xojo versions supported

Most customers are on the latest versions, but some have to stay on older versions, e.g. for Web 1 API or older GDI drawing on Windows.

So whatever Xojo version you use, you can always relay on recent plugins to get the latest new classes and bug fixes available for your development.

Please do not hesitate to contact us in case you have questions.

MBS Xojo Plugins, version 20.5pr3

New in this prerelease of the 20.5 plugins: Download:
Or ask us to be added to our shared Dropbox folder.

SSH Terminal example for Xojo

For next pre-release we upgrade our MBS Xojo Network Plugin with new DataAvailable event for SSH2ChannelMBS class. This allows to easier use the SSH connection and react event based on incoming data. And we used the chance to build a new example for a GUI based SSH Terminal application example:

Like the TCPSockets in Xojo, the trick is a timer running in the background to check regularly for new data. We start it when you call Execute method and then the timer checks for new data. If you don't use the DataAvailable event, we disable the timer of course, so you can just read yourself.

Originally we started the SSH classes to solve the problem, that normal SSH command line tool doesn't accept password as parameter or via pipe input. With our SSH2SessionMBS class you can provide password, use keyboard interactive password passing or private key file. The last one is the most secure of course.

Will come later this week with 20.5pr3. Please do not hesitate to contact us if you have questions.

DynaPDF WriteFText with links inside

For the next pre-release we include the new DynaPDF library in version The WriteFText function can now create links within the text:

  • to a web site
  • to a named destination within the same PDF.
  • to a named destination within another PDF document

You include \LK[] command in the text as command in your text and then specify the website. Within the brackets you specify 4 to 5 parameters:

  • IsNamedDest (false or 0, true or 1)
  • IsExternalLink (false or 0, true or 1)
  • OpenInNewWindow (false or 0, true or 1)
  • URL or name of a named destination (see DynaPDF.CreateNamedDest())
  • PDF file in which the named destination is located

As you see you can specify booleans either as true/false or 1/0. Whitespace before/after is ignored. To give a few examples:

  • \LK[false, TRUE, false,]Test\EK#
  • \LK[0,1,0,]Test\EK#
  • \LK[true, true, true, NameOfADestination, test.pdf]Test\EK#
  • \LK[true, true, true, DestName, file name with spaces.pdf ]Test\EK#

You may want to use DynaPDF.SetLinkHighlightMode function before calling DynaPDF.WriteFText to set the highlight mode for clicking the link. You can have a border around the link defined with DynaPDF.SetLineWidth or DynaPDF.SetStrokeColor functions.

It may be good to combine this link feature with underline \ul# and then switch color with \FC[] and the right color. For blue, we use 16711680, which is 255 * 256 * 256 as returned by DynaPDF.RGB funtion:

\FC[16711680]\ul#\LK[false, TRUE, false,]Test\EK#\ul#\FC[0]

Looks like this: Test. As you see we pick blue color, underline and the text with link inside. But on the end we turn underline off and set text color to black (0).

In FileMaker use this with DynaPDF.WriteFText or DynaPDF.WriteFTextEx functions. For DynaPDF.WriteStyledText, this won't work as we escape the backslash. So use a placeholder like "$link$", call DynaPDF.ConvertStyledText to convert text and then replace the placeholder with the command above.

In Xojo use this with WriteFText and WriteFTextEx functions in DynaPDFMBS class. If you like to use styled text from TextArea control, please use ConvertStyledText function to get the text converted for WriteFText. Then you can add links after that and before you pass text to WriteFText funtions.

MBS Xojo Plugins, version 20.5pr2

New in this prerelease of the 20.5 plugins: Download:
Or ask us to be added to our shared Dropbox folder.

Variant Helper functions in MBS Xojo Plugins

Over time we collected a few functions in our plugins to help with variants. Beside the internal routines to convert from/to various classes like SAValue, NSObject, CFObject, PROPVARIANT and VARAINT and Xojo variants, we got a lot of useful helps for your daily coding.


We often encounter variants containing arrays and like to assign them to a local variable in Xojo. But you can't just assign an array inside a variant to an array of variant in Xojo. This raises a TypeMismatchException without explanation message. See Feedback case 24167.
Our GetVariantArrayMBS function checks whether the variant contains an array of type object. If so, we return it as an array of variant and you can use it.


When you have a variant of some type of array, you have no way in Xojo to know the upper bound easily (see Feedback case 31799). You would have to query the type of array, then assign to a matching local variable, handle over 20 types for that then know the upper bound. Our GetVariantArrayUboundMBS function makes this easier as it works for all array types.


The GetVariantArrayValueMBS function allows you to query an array values independent of the type of array as variant. No need to query type and assign to local variable, risking a TypeMismatchException. You simply pass index, we lookup type of array and carefully check which variant value to return. As our plugin knows the upper bound, we can do bounds checking and raise an OutOfBoundsException if needed and include a message text of course.

The functions GetVariantArrayValueMBS and GetVariantArrayUboundMBS allow us to look into all arrays in our Web Starter Kit, where we have a memory browser feature.


Need to set a value in an array? You can use SetVariantArrayValueMBS function to set a value in any type of array universally.


The GetVariantAsDictionaryArrayMBS function is relatively new in one of the last releases. Our code to convert JSON to Xojo objects uses dictionary arrays, but how to cast them correctly? Well, in Xojo you have no way to check whether an array is of type object/variant and then check whether all items inside are Dictionary (or nil). Our plugin function does exactly that and helps to process easily arrays of Dictionary stored in variant.
We put in some safe guards, so it will raise an exception if something isn't as expected. Feedback case 61541.


We just added this function to expose our way to know in the plugin, whether a variant contains an unsigned integer. The built-in VarType() function as well as variant.type property will return 2 for both Int32 and UInt32 and 3 for both Int64 and UInt64. Our GetVariantTypeMBS function returns 102 for UInt32 and 103 for UInt64. Adding 100 to the constant value seems to be the easiest for now. There is a feature request for Xojo (Feedback case 36888) to add their own constants and use them everywhere. In case that gets implemented, we could change our functions to return the new values. So be sure you define yourself a kVariantTypeUInt32 = 102 and kVariantTypeUInt64 = 103 constant, so you have one place in future to adjust those values if needed.

The new GetVariantTypeMBS function is coming for version 20.5pr2 of our plugins together with better UInt32/UInt64 variant handling in a dozen classes.

Please do not hesitate to contact us with questions or if you have ideas for new functionality!

MBS Xojo Plugins, version 20.5pr1

New in this prerelease of the 20.5 plugins:
  • Added CopyColumn method for XLSheetMBS class.
  • Added CubeSQLLastInsertID to SQLDatabaseMBS and SQLConnectionMBS classes.
  • Added imageWithSystemSymbolName method to NSImageMBS class to get SF Symbols.
  • Added phoneticOrganizationName property for CNContactMBS class and phoneticOrganizationName property for CNMutableContactMBS class.
  • Added predicateForContactsMatchingEmailAddress and predicateForContactsMatchingPhoneNumber methods for CNContactMBS class.
  • Added WindowsML classes to do machine learning on Windows 10: see WinLearningModelMBS class
  • Changed setappearance, appearance and effectiveAppearance methods in NSAppearanceMBS class to accept application or NSApplicationMBS objects.
  • Fixed an issue with plugin trying to show dialog in web app.
  • Fixed exception raised by AllFetchKeys function in CNContactStoreMBS class.
  • Fixed loading of UserNotifications framework.
  • Updated DynaPDF to version
  • Updated OpenSSL to version 1.1.1h.
  • Updated SQLAPI to 5.1.2.
  • Updated to Xcode 11.7.
Or ask us to be added to our shared Dropbox folder.
The biggest plugin in space...


Nov 2020
Oct 2020
Sep 2020
Aug 2020
Jul 2020
Jun 2020
May 2020
Apr 2020
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