[ge-talk] A layout manager

Christof Lutteroth lutteroth at cs.auckland.ac.nz
Mon Aug 27 00:16:19 EDT 2007


Fredrik Holmqvist wrote:
> It would be very interesting to try it. Up until now my favourite 
> layoutmanager (for java) has been https://designgridlayout.dev.java.net/

The LP model proposed by my colleagues and me is also based on the 
notion of a grid, but as far as I can see (from the few examples that I 
have read about the DesignGridLayout) it is more general and thus more 
powerful. The order in which you add controls is irrelevant, and it is 
possible to add controls that span not only several columns but also 
several rows, in addition to other things such as linear constraints and 
overlapping areas etc.

Let us consider the DesignGridLayout introductory example (a bit 
adapted), i.e. a grid with 6 buttons arranged in 2 columns and 2 rows:

DesignGridLayout layout = new DesignGridLayout( top );
layout.row().add( button1, button2 );
layout.row().add( button3, button4 );
layout.row().add( button5, button6 );


In the LP model you would do it like this:

Layout l = new Layout();
XTab x1 = new XTab();
YTab y1 = new YTab(), y2 = new YTab();
l.AddArea(l.Left, l.Top, x1, y1, button1);
l.AddArea(x1, l.Top, l.Right, y1, button2);
l.AddArea(l.Left, y1, x1, y2, button3);
l.AddArea(x1, y1, l.Right, y2, button4);
l.AddArea(l.Left, y2, x1, l.Bottom, button5);
l.AddArea(x1, y2, l.Right, l.Bottom, button6);

* XTabs and YTabs correspond to vertical and horizontal grid lines.
* l.Left, l.Top, l.Right, l.Bottom are predefined grid lines defining 
the bounds of the total layout area.
* each AddArea call defines the top, left, right and bottom gridline 
that define the bounds of a layout "area" (i.e. a rectangular part, 
usually  with a control in it)

So you could say that using DesignGridLayout is shorter for this 
example. But LP makes the definition of the areas more explicit and 
allows developers to set many more parameters in the AddArea method 
(such as margins, minsize, maxsize, alignment, etc). The actual 
dimensions of the areas are determined considering the preferred sizes 
of the buttons using linear optimization. That is, the dimensions are 
not just set as being all equal (or multiples of some size x) for the 
controls in a row.

Then, you can easily restructure the areas by merging them together. 
Say, we want to drop button6 and let button4 span vertically over two 
cells instead:

l.AddArea(l.Left, l.Top, x1, y1, button1);
l.AddArea(x1, l.Top, l.Right, y1, button2);
l.AddArea(l.Left, y1, x1, y2, button3);
l.AddArea(x1, y1, l.Right, l.Bottom, button4);
l.AddArea(l.Left, y2, x1, l.Bottom, button5);

Such changes can also be done dynamically, by changing the Area objects 
that are part of the layout. In one of my projects, I used the layout 
model to implement a fully dynamic tree view on complex structured data, 
changing synchronously with the data.

Regarding the performance, it really depends on the implementation. I 
have used a standard open-source solver, a very slow graphics renderer 
and have not used some algorithmical optimizations that could be used 
(besides code optimizations). The rendering time was in the order of 
milliseconds (about 1-50ms depending on the complexity of the layout) on 
a 3.4Ghz Pentium4. Re-rendering (e.g. after resizing) is generally much 
faster than the initial rendering due to incremental solving. Common 
layout specifications can be simplified upfront (what I didn't do), 
which makes it again faster. Other researchers have shown that also for 
slower hardware rendering times can be made to stay in the lower 
millisecond range, for small changes such as resizing usually below 
10ms. IMO this is well worth it, considering the expressiveness of 
linear constraints. Such a layout system could also be used for other 
applications such as print layout.

Cheers,
Christof


More information about the glasselevator-talk mailing list