Version 10.2.0 b34 (released October 27, 2023)

The last several months have been spent working on a major new Panorama X project that we’re not quite ready to announce yet. A number of interesting new features have been developed in the furtherance of this project, kind of like Tang and Velcro were offshoots of the space program. Even though the major project isn’t quite ready, these “side project” features are included and documented in this release. I’m especially excited about the new Instrumentation Log features, the new File System Monitoring feature, and the ability to specify one or more databases that will automatically open whenever Panorama launches. There are also new features that grew out of discussion on the Panorama forum, including safeselect and the ability to customize the View Menu. Of course there are also a few dozen minor new features and bug fixes. For all the details, see the list below.

- New Instrumentation Log window allows real time viewing of instrumentation logs from within Panorama – it’s no longer necessary to use an external program like Terminal.app, Console.app, BBEdit, etc. See Debug Instrumentation.
- New safeselect and safeselectwithin statements preserve the previous selection if there are no matches.
- The SelectRelated and SelectRecordsRelatedTo statements have a new MODE option that allows for selectwithin, selectadditional, safeselect and safeselectwithin. The SelectRelated statement also has a new UNDOMESSAGE option. It now defaults to NOT allowing undo (this is a change from previous version), and the Search menu has been modified so that undo still works when SelectRelated is triggered from this menu.
- New startfilesystemmonitor statement allows Panorama to monitor file system changes, it can run your custom code whenever a watched file or folder changes.
- The Preferences->Favorites panel now allows you to specify one or more databases to be automatically opened when Panorama is launched. A database can also be opened secretly, or as a library.
- The View Menu can now be customized to exclude individual forms and/or procedures, or exclude entire sections of the menu.
- Most Panorama X Server configuration can now be done from a remote computer, it’s no longer necessary to have physical or VNC access to the server computer.
- Panorama X Server logs can now be viewed in real time from a remote computer from within Panorama.
- Panorama X Server instrumentation logs can now be viewed in real time from your development computer, for super easy debugging of web procedure code.
- Client/Server auto-unlock is now independent for each open database. (Previously, there was only one global timer. Now there is a separate timer for each database. Keyboard activity will extend the timer of the currently active database, but not background windows.)
- Panorama no longer auto-unlocks the current record after 30 seconds if you have switched to a different window.
- Record lock “keep-alive” ticker now communicates asynchronously with the server (for smoother UI)
- The serverupdate statement now unlocks any locked record before it starts, preventing loss of uncommitted changes.
- Text Display Objects have a new option: Auto Scroll to Bottom. This is very useful for displaying dynamic log files.
- Text Display Objects are now programmable, see Text Display Programming.
- New `formRECTANGLE:` and `formWINDOWTITLE:` form events allow the position, size and title of a form window to be customized with code.
- New getstructurevalue( function makes it much easier to extract items from a nested structure of dictionaries & data arrays.
- New foldersize( function calculates the size of a folder (or a package). This returns the same size as the Finder’s Get Info window.
- The folderinfo statement now correctly calculates the size of a folder, and is also much faster.
- The foldercount( function is now significantly faster than in previous versions.
- The filesize( function now throws an error if used with a folder or package. (Use foldersize( for this.) [In the past, filesize( would return 0 as the size of folders or package. If you need this, use `catcherror(0,filesize(thepath))`]
- New obfuscate( function randomizes the letters and digits in text (but leaves punctuation alone).
- The OpenForm statement has a new “variables” option that allows windowglobal variables to set up just before the window actually opens. This lets you use windowglobal variables in graphic objects without any “flash.” This option is also available in OpenDialog, though I’m not sure it is of much use there.
- The rundialog and superalert statements have a new “timeoutbutton” option that allows the timeout to trigger cancel instead of Ok.
- New SetZLog statement allows code to turn instrumentation on/off automatically, without having to use the Instrumentation menu or preference panel.
- Changed default location of instrumentation files from the desktop folder to the application support folder (inside PanoramaX/Instrumentation).
- Maximum now works even if all values are empty (result will be empty).
- When typing into a form with no selected object, the text in the current cell is no longer wiped out when you start typing. This was a bug that was new to the Apple Silicon native version of Panorama (due to an Apple API change).
- It’s now possible to delete the first query row in the Find/Select dialog. (Assuming, of course, that there is more than one row.)
- Fixed problem of various wizards getting “stuck” (View Search, Help search, Formula Workshop, Find & Open). You no longer have to quit and relaunch Panorama to get these windows unstuck (you may have to close and reopen the window, however).
- Fixed the checkbox in the Instrumentation->Enable Coverage (Current Procedure) menu item. This has been broken ever since the enable coverage for open windows option was added.
- Fixed formulafill so that it doesn’t bork a random data cell with server IDs when used in sharing mode.
- Remote Clairvoyance (via a relation) now works correctly even if the source field contains spaces or other punctuation.
- Fixed copypartialdictionary so that it will work with an empty list of keys to copy (in that case it returns an empty dictionary).
- Fixed the jsonscriptstring( function so that it works with all special characters that need to be escaped, not just `\` and`"`.
- The PrintToPDF statement now returns an error if you attempt to print to the default printer when no default printer has been set up.
- The urltask( function now defaults to terminating the TCP session when finished, eliminating a possible memory leak.
- The Database Options dialog now works correctly if you specify a procedure as an initial window.
- Improved performance of zlog statements when instrumentation is turned off (i.e. “in production”).
- New sandbox mode that can be enabled for CGI code.
- Fixed the Window menu so that it will automatically toggle Hide/Show Toolbar.
- The openform … “title” option now “sticks” even when the database is saved.
- Panorama no longer crashes if the summary level metadata doesn’t match the actual data records (should never happen).
- Fixed error that could pop up if you closed Formula Workshop when it wasn’t the topmost window.
- Fixed the popup topic menu in the Help window.
- Revised the documentation to mention that Rich Text is only compatible with certain Text Display Line Break options (Word Wrap and Don’t Wrap). It is not compatible with the Character Wrap, Clip or Truncate options.
- Eliminated spurious entries in server performance log (caused by static file downloads via GCDWebServer).
- Added note to Site License Payment panel “Limit of one coupon per purchase.”
- Fixed the textafter( help page, it was completely messed up.
- Documentation now includes release notes for beta versions (like this page).
- Documentation corrections submitted by James Cook, Thomas Cooper, David Thompson, Gary Yonaites, Peter Newble, Robert Ameeti, John Bovenmyer, George Beauchemin, Craig MacPherson, Chris Watts, David Scott.