Today we describe the additional changes that were included in the 6.16.0 release, beyond those in the 6.13.0 release.
#preferredExtentChanged
We have added a new event #preferredExtentChanged to the mix.
This is triggered whenever the affect of adding or removing an attribute to a pane, or changing the model, might cause the preferred extent to change.... Pretty obvious there.
This occurs in the following general circumstances:
Whenever a border is added or removed from a pane
In any enumeration pane (ListBox, Grid, TreeView), when items are added or removed from the list
In any editing pane (TextEdit & InputField) when text is added or removed, or the attributes of a run of text is changed.
In any pane that supports scrollbars, when scrollbars are turned on or off.
In any pane that supports subpanes, when a subpane is added or removed
In any pane that has a label, when the text of the label is added, removed or changed
Also in the following specific circumstances
Pane
Trigering Action
Divider
Thickness changes
Grid
Adding columns, turning on or off row or column headers, adding or removing row or column lines or resizing a column
Region
Turning on or off the edge line or changing the size of the edge line
ProgressBar
Turning on or off percent done display or turning on or off the percent done tenths display
ResizingSplitter
Turning on or off the noDisplay attribute
Slider
Changing to/from vertical/horizontal or changing the display of ticks
SpinButton
Doing an increment or decrement (having the effect of changing the value displayed)
TabControl
Turning on or off the display of the tabs, adding a page, turning on or off the interior decoration
MenuBar
Adding or removing items or changing the hidden attribute of an item
Toolbar
Adding or removing items or changing the hidden attribute of an item
TreeView
Expanding or collapsing an item, turning on or off the showing of expanders or turning on or off of item images
New Pane : ActiveImage
The ActiveImage is a new pane that will in the future replace the image part of the CheckBox and RadioButton.
The ActiveImage acts like a toggle for images, but has no specific model itself. The typical minimum image is the primaryImage, and if this is all that is specified, it acts just like a DisplayImage. If a secondaryImage is specified, when the mouse is pressed over the ActiveImage then released within it's bounds, the image changes to the secondaryImage.
If a transitionImage is specified, then this image is displayed when the mouse is pressed over the ActiveImage and when the mouse is released in the bounds of the ActiveImage, the ActiveImage changes either to the secondary image if there is one, or to the primary image if there is no secondary image.
If a flyOverImage is specified, then this image is displayed when the mouse is moved over the ActiveImage in a non pressed state.
The disabledPrimaryImage and disabledSecondaryImage, if specified, are used when the ActiveImage is told to be disabled, depending if there is a corresponding primary/secondary image, and the current state of the ActiveImage.
The state of the activeImage (showingPrimary) can be changed with the #showPrimary: method. If there is no secondary image, then the showPrimary value will change, but the view will not
ActiveImage, unlike its cousin DisplayImage, does not "build" the images from images and masks, instead it simply has images that it uses. Thus, the parts can be any the usual Image things, such as Images, CachedImages, OpaqueImages and OpaqueImageWithEnablement.
If an OpaqueImageWithEnablement is used for the Primary image or Secondary image, then that image will be used as the disabled image (disabled of course) if there is no corresponding primary/secondary disabled image.
Events Triggered
Event
Description
#aboutToChangeView
Triggered when ActiveImage is about to change its view if there are both primary and secondary images. This event is vetoable, and if VetoAction is raised in the scope of this event, then the pane will not change its view
#changingView
Triggered before the ActiveImage changes it's view if there are both primary and secondary images and the #aboutToChangeView event is not vetoed.
#changedView
Triggered before the ActiveImage changes it's view if there are both primary and secondary images and the #aboutToChangeView event is not vetoed.
Specification Synchronization
These changes are mostly in the guts of the Specifications, how they're built and decomposed into XML and LiteralArrays. Instance variables have been changed in the specs, along with accessing methods.... For instance, backgroundColor has become background, to match the same thing in Panes.
The point to this set of changes, and there were many, was to make the Specifications more polymorphic with Panes, where possible. This will allow the UI Painter in the future to build Panes from Specifications, or Specifications from Panes, and code from and to either.
There were very few actual changes in the APIs of the Panes themselves:
TextEdit had #beWordWrapped(:), and Label had #wordWrapped(:), so we changed TextEdit to use #wordWrapped(:) and got rid of #beWordWrapped(:).
ScheduledWindow now has #openingPosition:, #minimumSize:, #maximumSize: and #specifiedSize: methods, which talk to the underlying frame, thus removing the need to have to send stuff like "window frame maximumSize: <aPoint>" and so on.
Button has two new methods: #beCancel: <aBoolean> and #beDefault: <aBoolean> which do the right things by making a Button behave like a cancel button (execute itself when the ESC key is pressed anywhere in the pane) or behave like a default button (execute itself when the Enter/Return key is pressed anywhere in a non TextEdit pane).
noDecoration: fix
Any pane that had scrollbars, and also the TabControl also had a #noDecoration: <aBoolean> method. However, it simply removed the decoration including the scrollbar! That was wrong. Now, it simply removes the default interior border for these panes, still allowing you to turn on or off scrollbars or in the case of the TabControl, the tabs.
No More
Well, that's all the big changes. There are many smaller bug fixes in there also, but making things work right is hardly a notable/blogable thing.
I have no idea what's next. How about some suggestions on what I should post about next.