The major changes in this release are:

Saving Databases

The biggest change in this release is of course the ability to actually save databases in the new format. New database files are saved with an extension of .pandb. Note: Most likely databases saved now will continue to be compatible with new releases from now on, but this is not absolutely guaranteed yet.

Standard Document Handling

In addition to saving, this new version supports the entire suite of standard Cocoa document handling features. In the File menu, the New, Open, Open Recent, Save a Version, Duplicate and Revert Document commands all work as expected for Cocoa applications (if you are using Mountain Lion or Mavericks, some of these items will have different names). Note: The RagelUnicode window no longer has an Open Database button, use File>Open instead.

Panorama also now supports standard Cocoa auto-save and versioning. These features were a bit controversial when 10.7 Lion came out, but they are the standard, and Panorama is 100% compatible with the Apple standard in this regard. The Revert Document command opens Apple’s “Time Machine” style screen for selecting previously saved versions. This mostly works, but I need to work on some edge cases (for example, reverting to a previous version where an open form didn’t exist may crash or do something unexpected).

Multi Level Undo

In addition to document versions, Panorama now supports multi-level undo. Currently there is no limit, though this may change to some fixed number (99? 24?) in the future to limit resource usage. I think multi-level undo may wind up being a “killer” feature of this new release. It’s pretty awesome to be able to undo even after doing things like deleting fields, deleting thousands of records, etc., especially since you don’t have to do so right away. I don’t think there has ever been any database with this capability. Note: One thing that can’t be undone out of the box is your own procedures, but they can be modified to support undo – it generally takes just one startdatabasechange statement to add undo support to any procedure.

Previous alpha versions basically had only “dummy” menus. This version has actual menus with actual Panorama menus commands. Just like in Panorama 6 and earlier, the menus automatically adjust as you switch from data sheet to form to graphics mode to procedure. This isn’t the final menu configuration – some commands still need to be added, some will be removed (especially some of the field properties, which will be in an inspector panel), and the entire menu configuration may be revamped. However, at least there are now menu commands that allow the program to be used without having to type in a program for every operation.

This version also adds context menus for the data sheet – right click on any data cell or on a column header to use them.

The menus now contain commands for adding, removing and modifying fields. The UI is a bit awkward, but you can now create a new database and set up the fields as needed. Note: Still on the to-do list are a field property inspector (which will replace many of the menu items), dragging fields to re-arrange them, and the ability to selectively hide fields. You may notice that there is an option to make a field non-editable in the data sheet (this isn’t really a security feature, it can still be modified by a procedure or form).

Custom Menus

In addition to standard menus, this version now supports fully customizable Live Menus. This feature is a superset of the Live Menu feature in previous versions of Panorama. With this feature you have the same control over menu appearance as Cocoa developers have when using XCode’s Interface Builder. In fact, it’s even better because you can easily create dynamic menus, which can’t be done with IB. You can even embed Panorama code into individual menu items, eliminating the need for a .CustomMenu procedure (it is still supported). To learn about all the details see LMSL, menu(, menuitem( and filemenubar.

In the past, if you wanted a custom version of a standard menu (for example File or Edit) you would have to create the menu completely from scratch, writing your own programming for every standard command in the menu. This is no longer required – you can now customize standard menu items on a line by line basis – for example adding an extra command or two in the File menu above the Print command. See the standardfilemenu( function to learn how this is done.

Inside Baseball: Starting with this version, all of Panorama’s standard menus (and context menus) are actually created using Live Menus. This means it’s super easy for me to change menu configuration. In fact, at some point (probably not version 1.0) I may add a user interface for users to create their own custom menu setup. I originally wasn’t planning to include Panorama 6’s “classic menu” option, but now I probably will.


Text import is now supported. The import feature should be more robust than previous versions of Panorama. One change is the CSV parser, which is much more robust and should be able to handle anything you throw at it. Previous versions of Panorama would look at the first line of imported data to see how many columns were there – this new version will add new fields as necessary to accomodate all of the fields in the imported text (of course this feature can be turned off). You also have more control over the importer – for example you can customize the separators (if the separator is not explicitly specified, it will still auto-detect between tabs and commas).

One change you will notice – import is now done through the import statement instead of the openfile statement, and importusing is now an option to the import statement instead of being separate. So procedures that import data will need to be tweaked a bit.

The improved CSV parser is also available separately – the csvtotsv( function will take comma separated text and convert it to tab separated text, with proper handling for quoted fields. The importline statement allows you to import a single line of data.

The import statement does not handle HTML tables, this may be added in the future, or may be a separate statement or function.

New Statements and Functions

Over 300 additional statements and functions have been implemented in this version (see below for the complete list). This sounds great, but unfortunately there are still hundreds more to go :( This version does include for the first time a couple of custom statement libraries, but these are invisible to you (unless you go poking around in the application bundle). So far only a handful of custom statements are defined, but obviously this number will go up rapidly in future versions.

Procedure Mode

Earlier I stated that this new version of Panorama would not have procedure mode. Well, I changed my mind, sort of. There is no mode, but you can set up both spreadsheet style formulas and a procedure for each field! It’s the best of both worlds. When transferring from a Panorama 6 database, the contents of the Panorama 6 field’s formula are automatically moved into the field procedure (with the new formula left blank). This may require some tweaking. In Panorama 6 and earlier, procedure mode could look like this:


The last line could be a procedure name, which would be called. If you do this, it needs to be changed like this:

call procedurename

In fact, you may now use any valid procedure, complete with if’s, subroutine calls, assignments – whatever you like. In the past, procedure mode wasn’t really a procedure, but just sort of “procedure like”, but now, it literally allows you to assign a procedure to be run whenever a field is modified. (You can also set up spreadsheet formulas, if both are specified the spreadsheet formulas will run first, then the procedure.)

Permanent Variables

Since saving is implemented, naturally permanent variables have also been implemented. They work exactly the same as in Panorama 6.

Full Screen Mode

Works pretty much as you would expect.

Procedure Errors in View and Action Menus

This is kind of cool – you can now see at a glance any procedures that have errors. If a procedure has an error, a red circle with an exclamation point will appear in the menu next to the procedure name.


The encrypt( function encrypts data using AES-256 encryption, the decrypt( function decrypts it. AES-256 is considered state of the art encryption (for whatever that is worth these days). In future versions you’ll be able to encrypt all or part of your database using AES-256 (for example the data, or the procedures, or both).

Handling Forms & Procedures Separately

You can now export forms and procedures (using the exportform( and exportprocedure( function as separate entities, and then import them later into the same or a different database. You could, for example, use this feature to update some or all of a database’s forms and procedures while leaving the data untouched. (The new Panorama database format actually stores forms and procedures separately from the data, but at this time I am not recommending manipulating these files directly.)

By the way, the New Form command in the View menu now works. (By the way, the View menu now works somewhat similarly to the View menu in Panorama 6, I’m not sure if that will be retained, modified slightly, or completely replaced. But it works for now.)

Sorted Lookups

As suggested by Dave Thompson, the superlookup( function now has a “wrap” option that can enable huge performance gains when doing lookups between two sorted databases.

That’s All Folks

Well, not really – there are other little gems if you peruse the detailed list below. Did I mention that you can send actions to the current Cocoa first responder? Yeah, that’s too technical, but really cool, take my word for it. See sendaction and menuitem(.

Brand new features implemented in this release (features that were not included in Panorama 6):

Features implemented in this release that work differently than they did in Panorama 6.

Features implemented in this release that work exactly the same as they did in Panorama 6.

ALL features that were added or changed in this release:

See Also