In Pharo, we have several competing list implementations since day one. But all those implementations depend on one unique original: LazyListMorph. While this is hidden in the most used hierarchy: PluggableListMorph and children, at the end this is what we always have, if we want to use lists in our GUI. The original design worked fine in the use cases they have at the time, but it started to show age very fast (in fact, LazyListMorph is not the first list morph written, it is itself an attempt to solve performance issues).
What were the problems? Well, a short but important list:
Along with this two fundamental problems, there were some others: since the original was intended to show lists, if you want to do a table, you can't. Now, you can say a list is a particular case of a table (it is a table with just one column, after all), but the other way (a "multi-column" list) is not so easy to implement. But it was done (MulticolumnLazyListMorph and PluggableMultiColumnListMorph) and during some years that was the unique solution we had.
Other attempts have been made to solve the performance issues of this implementation, like the NewList, but it's design is based on spawning threads to fill the elements array and it never worked really fine.
So, I started to write a new list for Pharo during an insomnia night, trying to solve this problem (And honestly, really tired of seeing how the current IDE feels slow –and makes Pharo itself feels slow– when there is no real reason to it).
For me, three conditions need to be fulfilled:
Since I know some implementations outside the Pharo world, I reviewed a couple and I decided to take as inspiration the implementation of Cocoa. This is a really simple design, who is proven to work very well:
It looked fine, and after some hours of work, I finished a first version.
In general, all my benchmarks gave me a 10x increment in the speed of rendering.
And of course, showing thousands of elements cannot be compared because it was simply not possible before.
Fast table is integrated in Pharo 5.0, and it will replace all older list usages. You can check some examples of it browsing class side of FTExample class.
Here, a small example on the easiest way to use it:
FTEasyListMorph new extent: 300@550; elements: Morph methods; icon: [ :method | (FTExampleMethodModel method: method) actionOn: nil ]; display: [ :method | method selector ]; openInWindow.
EDIT: I forget to say that I also made Glamour renderers for lists and tables. They are incomplete, but you can start play with them.
To install it, just execute this:
Gofer it smalltalkhubUser: 'estebanlm' project: 'FastTable'; package: 'Glamour-FastTable'; load.
... and you will have #fastList and #fastTable presentations.