Version 0.1.019 (released January 28th, 2016)
The changes in this release are quite extensive. Most of the big changes involve forms, including Z (front-to-back) order and major changes to Matrix and Text List objects.

- View-as-list forms are now supported, with some restrictions as follows: Text Editor objects may be used, but only for display, not editing. Push buttons, Data Buttons (checkboxes and radio buttons), and Pop-up Menu buttons all work, but only for the currently selected record. In other words, you first have to click on a record to select it, then you can click on the button. Text Display objects will not work as buttons.

- Added view-as-list options for Alternating Background Colors and Grid Style.

- Form object “Z” (front-to-back) order now works correctly. Now you can properly bring any type of object to the front (except for report tiles), and conversely, things like text and buttons are properly objscured when they are behind shape objects. Transparent buttons can now be overlaid on top of other objects (though this isn’t recommended for new applications, since code can be attached to any form object). Note: There is still an issue with some image objects, which now always appear on top even if you send them to the back.

- Now any type of object can have a tool tip, even basic shapes.

- Object handles and the drag selection marquee now always display above all objects, they are no longer obscured by objects on top of them.

- Implemented a new way to specify Text List columns (the old way, using the ∆ character, still works). New method – `<allfields>` to mirror all database fields. `<width:nn>` for points, `<width:nnc>` for columns (also `<w:nn>` will work). `<align:left/right/center>` for alignment. Can still use `@fieldname~ to mimic database field attributes (width and alignment). Also updated TextListTableOptions to generate specification using the new format.

- Text List objects now have an option to use the first line of the data to specify the column names (and optionally width and alignment, see previous item).

- Text List objects now support rich text (bold, colors, etc.) in the data.

- Clicking on an already selected row in a Text List now triggers the associated procedure (it used to only trigger if you clicked a different row).

- Text List no longer triggers the associated procedure when the data changes, only when it is actually clicked on.

- Major rewrite of Matrix objects. Completely eliminates the “race” problems that occured with earlier versions – CPU usage now stays low under all conditions. Performance of single column matrixes optimized so that even matrixes with thousands of rows will be very fast.

- New Matrix feature: If the name of the frame is not specified, you can use a data tile as the frame (you don’t need to set the object name of the tile). Now you don’t need to fiddle with object names if you only have one matrix in the form. (If there is more than one matrix in the form, you’ll need to specify the frame name the old fashioned way.)

- New Matrix feature: If # of columns is 1 and fixed height is zero, will automatically use the height of the frame object as the row height.

- New Matrix feature: You can now include a separate header frame that creates a header at the top of the matrix. This only works with single column matrixes. If there is no frame name, the header frame must be a Header report tile. If there is a frame name, the header frame object must have the same name as the main matrix frame but with `_Header` appended to the name. You can also specify a third frame, the Corner frame, that will be displayed above the scroll bar of the matrix (otherwise this area will be white). This is either a `Header (Corner)` report tile or an object with the same name as the main matrix frame but with `_Corner` appended to the name.

- New Matrix elastic mode: off. This only works with single column matrixes. In this mode, the row width matches the width of the frame object. If this is wider than the matrix, you can enable the horizontal scroll bar and the matrix can scroll horizontally as well as vertically. If the matrix has a header (see above), it will also scroll horizontally in sync with the main body of the matrix.

- Added PassThru and Navigate options to Matrix and Text List objects (Text List objects do not allow these to be activated separately, only together). These options can only used when the Matrix or Text List object is set up to scan a database, the options will be ignored if there is no scan database. When PassThru is enabled, actual database fields can be referenced by objects inside the matrix frame, just like a view-as-list form. In other words, you don’t have to use info(“matrixcelldata”), you can just use the field names directly, and use Text Editors, checkboxes, etc. (though they will be display only) in the frame. When using PassThru mode, the info(“matrixdata”) function will return "", so don’t use that!

  When Navigate is enabled, clicking on a matrix or list row will cause the database to jump to the corresponding record, just like clicking on a row in the data sheet. In addition, changing the current database row will change which row/cell is selected in the matrix/list object. In other words, the matrix/list will mirror the data sheet. If the current database record is moved to a record that is not currently included in the matrix, then no row/cell will be highlighted in the matrix/list. When Navigate is enabled, you don’t need to set up a variable to hold the selected value. If you do, the value will be based on the formula for the matrix. Changing the variable value will NOT affect the matrix/list selection – the only way to affect that is to move to a different database record.

- You can now use the new MatrixFrameForm property in a blueprint to move the frame object to any form in the current database. In other words, the matrix frame doesn’t have to bee in the same form as the matrix object (it does have to be in the same database). This is especially handy for use with Tab Panel objects.

- The new Matrix Draggable option only affects single column matrixes. When this option is enabled, the attached procedure starts immediately, you cannot roll down to select a different row. Use this for dragging or triggering a pop-up menu.

- New command to refresh all of the matrix objects on the form is available in the Objects menu, the context menu, and via a tool that optionally can be added to the tool bar. Use this command if you have changed the contents of the matrix frame to update the appearance of the matrix.

- New matrix related functions (note that some objects in a matrix header, like buttons, will trigger their internal code rather than the matrix code, in which case these info( functions are not available.). These functions also work with Text List objects.

  - info(“matrixclickedframe”) – returns name of matrix section that was clicked on (Body, Header or Corner)
  - info(“matrixclickedobject”) – returns name of object clicked on in matrix (if it has a name). Can be in header or corner.
  - info(“matrixclickinfo”) – returns combination frame.object

- The info(“matrixrow”) and info(“matrixcolumn”) functions now work in procedures triggered by Text Lists. The info(“matrixrow”) returns 0 if clicked in the Text List header.

- Added the ability to limit the number of cells in a text list/matrix object. This limit only affects database scans, it doesn’t affect direct array display (in that case you can use arrayrange( to limit the number of cells). There is no user interface for setting this limit, but in a blueprint it can be set with the MaxCellCount property. The default for new objects is 5,000.

- You can now specify a border (bezel or line) around Matrix and Text List objects.

- New statements for Text List objects:

  - objectaction “object”,“rowrectangle”,rowNumber,targetRectangle
  - objectaction “object”,“columnrectangle”,colNumber,targetRectangle
  - objectaction “object”,“cellrectangle”,rowNumber,columnNumber,targetRectangle
  - objectaction “object”,“pointtorowcol”,point,row,col
  - objectaction “object”,“scrolltorow”,rowNumber
  - objectaction “object”,“scrolltocol”,columnNumber

- Matrix and Text List objects will now accept cr, lf, or crlf as the separator if line break is specified as the separator.

- Changed the way `.Initialize` works. Instead of trying to run the procedure immediately, it waits and runs it after all current activity has stopped. Also, the statement `topdatawindow <database>` is prepended to the front of the source code. If you open multiple files at once (for example by selecting multiple files in the Finder and then selecting Open or dragging them onto the Panorama icon), the files will ALL open, then Panorama will go back and run each `.Initialize` procedure. The topdatawindow statement ensures that the correct window is active. This change insures that the `.Initialize` procedure runs in the normal runtime environment, so that it can do things like stop and display dialogs. (I discourage that kind of usage, but people do it anyway.)

- Added new `.PreInitialize` procedure that runs before windows are opened. This should not do anything except initialize variables. It definitely should not perform any UI changes or display, so it should NOT contain showvariables, and it should not modify the values of any fields. Just use this for setting up fileglobals. Also, don’t make any assumptions about what window is currently open – it should not reference windows at all.

- Implemented the `.CurrentRecord` “hidden trigger” procedure. Note that this procedure will NOT be triggered if a procedure is running – if the procedure wants the `.CurrentRecord` to run, it must call it explicitly.

- Added new blueprint Form options dialog sheet, makes it easy to edit the form options (view mode, background color, report options, etc.) without having to mess with editing all of the objects also (especially important if the form contains a lot of objects.)

- Added rounded corner border option for text editor, text display and image display object. Matches the Yosemite/El Capitan rounded corner used for search fields.

- New options for margins on text editor and text display objects. Left, Right, Top and Bottom margins can be set independently, but only thru blueprints – there is no access to these values in the property inspector.

- Text Editor prompts are now positioned properly for #SystemFont for sizes between 9 and 18 on Yosemite (these are the light gray prompts that can appear if the text is empty). This may need further tweaking for El Capitan. Also, the vertical position can be tweeked with the EmptyPromptVOffset blueprint option (there is no interface for this in the property inspector).

- Added ability to generate prompts in CONSTRUCTFORMDATAEDITORS. The `<autoprompt:yes/no>` tag causes each text editor to use it’s field name for the prompt value (if yes/no is missing, yes is assumed). The `<prompt:text>` tag sets the prompt for the current line (overriding the default if autoprompt is turned on).

- Added NewSearchGadget statement, which constructs a search gadget in the current form.

- Added new TopDataWindow statement, which opens the topmost data window (data sheet or form in data mode) for the specified database.

- The time( and seconds( function no longer try to guess am/pm if the input time contains colons, spaces, or other separators. It will only try to guess am/pm if a single number is entered. For example `time("2:09")` is 7740 (~2 am) but `time("209")` is 50940 (~2 pm). This is different from the time( function in Panorama 6, but I think that was a bug in Panorama 6 – it doesn’t match the documentation. I’m pretty sure previous versions of Panorama did work this way at some point.

- The superlookup( function improperly cached results. This worked with the lookup( function but will not work with the superlookup( function. Bottom line, the superlookup( function no longer caches – it will do a new search every time it is used.

- The Find command now works even if the data sheet is not open (only a form window).

- The openplain statement now works correctly.

- New nsrect( and nsrectstr( functions, with parameters in the same order as Cocoa functions.

- New pointsval( function, which converts a dimension from inches, centimeters or points into points.

- New FindID statement, which provides a faster way to search for a record by it’s ID number.

- Updated the way the Panorama icon is linked to the system. This makes the correct icon show up in the dock menu, and hopefully will fix any outstanding problems with database document icons.

- Drag receiver object now continues to work after being resized in data mode (by elastic form or changeobjects), or if a new drag receiver is created with the newformobject statement.

- Fixed broken DefineHotKeys statement.

- Removed some extraneous options from newformobject statements in CONSTRUCFORMDATAEDITORS statements, hopefully will make it a bit faster. Also fixed height of first generated editor, it wasn’t correct if the size had been changed from the default

- Fixed low-level problem that was probably causing occasional mysterious crashes.

- Multiple additional bug fixes (see Bitbucket issue tracker).

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

- findid -- The findid statement locates a record in the active database by its ID number (see info("serverrecordid").
- formoptionsblueprintsheet -- The formoptionsblueprintsheet statement opens a dialog sheet to edit the blueprint of the current form options.
- info("matrixclickedframe") -- The info("matrixclickedframe") function identifies which section of a matrix was clicked on.
- info("matrixclickedobject") -- The info("matrixclickedobject") function identifies which named object in a matrix was clicked on (if any).
- newsearchgadget -- The newsearchgadget statement creates a search gadget in the current form.
- nsrectstr( -- The nsrectstr( function converts a rectangle into text in the format x,y,width,height
- pointsval( -- The pointsval( function converts a dimension to points (possibly from inches or centimeters).
- topdatawindow -- The topdatawindow statement brings the topmost data window in the specified database to the front.

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:

- info("matrixcell") -- The info("matrixcell") function returns the current cell number within a matrix object.
- info("matrixclickedframe") -- The info("matrixclickedframe") function identifies which section of a matrix was clicked on.
- pointsval( -- The pointsval( function converts a dimension to points (possibly from inches or centimeters).
- striptonum( -- The striptonum( function removes everything but numeric digits from a text item.
- topdatawindow -- The topdatawindow statement brings the topmost data window in the specified database to the front.

See Also

- Version 0.1.001 (released July 7th, 2012) -- Summary of Version 0.1.001 (released 7/7/2012)
- Version 0.1.002 (released August 12th, 2012) -- Summary of Version 0.1.002 (released 8/12/2012)
- Version 0.1.003 (released December 2nd, 2012) -- Summary of Version 0.1.003 (released 12/2/2012)
- Version 0.1.004 (released December 10th, 2012) -- Summary of Version 0.1.004 (released 12/10/2012)
- Version 0.1.005 (released December 21st, 2012) -- Summary of Version 0.1.005 (released 12/21/2012)
- Version 0.1.006 (released December 26th, 2012) -- Summary of Version 0.1.006 (released 12/26/2012)
- Version 0.1.007 (released May 1st, 2013) -- Summary of Version 0.1.007 (released 5/1/2013)
- Version 0.1.008 (released May 22nd, 2013) -- Summary of Version 0.1.008 (released 5/22/2013)
- Version 0.1.009 (released July 9th, 2013) -- Summary of Version 0.1.009 (released 7/9/2013)
- Version 0.1.010 (released October 14th, 2013) -- Summary of Version 0.1.010 (released 10/14/2013)
- Version 0.1.011 (released December 6th, 2013) -- Summary of Version 0.1.011 (released 12/6/2013)
- Version 0.1.012 (released August 29th, 2015) -- Summary of Version 0.1.012 (released 8/29/2015)
- Version 0.1.013 (released September 6th, 2015) -- Summary of Version 0.1.013 (released 9/6/2015)
- Version 0.1.014 (released September 14th, 2015) -- Summary of Version 0.1.014 (released 9/14/2015)
- Version 0.1.015 (released September 29th, 2015) -- Summary of Version 0.1.015 (released 9/29/2015)
- Version 0.1.016 (released October 12th, 2015) -- Summary of Version 0.1.016 (released 10/12/2015)
- Version 0.1.017 (released November 11th, 2015) -- Summary of Version 0.1.017 (released 11/11/2015)
- Version 0.1.018 (released December 7th, 2015) -- Summary of Version 0.1.018 (released 12/7/2015)
- Version 0.1.020 (released February 15th, 2016) -- Summary of Version 0.1.020 (released 2/15/2016)
- Version 0.1.021 (released February 29th, 2016) -- Summary of Version 0.1.021 (released 2/29/2016)
- Version 0.1.022 (released March 1st, 2016) -- Summary of Version 0.1.022 (released 3/1/2016)
- Version 0.1.023 (released May 27th, 2016) -- Summary of Version 0.1.023 (released 5/27/2016)
- Version 0.1.024 (released June 12th, 2016) -- Summary of Version 0.1.024 (released 6/12/2016)
- Version 0.1.025 (released July 21st, 2016) -- Summary of Version 0.1.025 (released 7/21/2016)
- Version 0.1.026 (released August 29th, 2016) -- Summary of Version 0.1.026 (released 8/29/2016)
- Version 0.1.027 (released September 18th, 2016) -- Summary of Version 0.1.027 (released 9/18/2016)
- Version 0.1.028 (released November 9th, 2016) -- Summary of Version 0.1.028 (released 11/9/2016)
- Version 0.1.029 (released December 31st, 2016) -- Summary of Version 0.1.029 (released 12/31/2016)
- Version 0.1.030 (released February 12th, 2017) -- Summary of Version 0.1.030 (released 2/12/2017)
- Version 0.1.031 (released March 3rd, 2017) -- Summary of Version 0.1.031 (released 3/3/2017)
- Version 0.1.032 (released April 3rd, 2017) -- Summary of Version 0.1.032 (released 4/3/2017)
- Version 0.9 (released May 15th, 2017) -- Summary of Version 0.9 (released 5/15/2017)
- Version 0.9.001 (released July 18th, 2017) -- Summary of Version 0.9.001 (released 7/18/2017)
- Version 0.9.002 (released July 27th, 2017) -- Summary of Version 0.9.002 (released 7/27/2017)
- Version 0.9.003 (released September 10th, 2017) -- Summary of Version 0.9.003 (released 9/10/2017)
- Version 0.9.004 (released September 14th, 2017) -- Summary of Version 0.9.004 (released 9/14/2017)
- Version 0.9.005 (released September 19th, 2017) -- Summary of Version 0.9.005 (released 9/19/2017)
- Version 0.9.006 (released September 27th, 2017) -- Summary of Version 0.9.006 (released 9/27/2017)
- Version 0.9.007 (released October 3rd, 2017) -- Summary of Version 0.9.007 (released 10/3/2017)
- Version 0.9.008 (released October 12th, 2017) -- Summary of Version 0.9.008 (released 10/12/2017)
- Version 10.0.0 (released October 18th, 2017) -- Summary of Version 10.0.0 (released 10/18/2017)
- Version 10.0.01 (released December 10th, 2017) -- Summary of Version 10.0.01 (released 12/10/2017)
- Version 10.1 (released August 6th, 2018) -- Summary of Version 10.1 (released 8/6/2018)
- Version 10.1.1 (released August 30th, 2018) -- Summary of Version 10.1.1 (released 8/30/2018)
- Version 10.1.2 (released November 15th, 2018) -- Summary of Version 10.1.2 (released 11/15/2018)
- Version 10.2 (released October 7th, 2021) -- Summary of Version 10.2 (released 10/7/2021)