public void run(double frac) { // first pass double w = 0, h = 0; Iterator iter = m_vis.items(); while (iter.hasNext()) { VisualItem item = (VisualItem) iter.next(); item.setSize(1.0); h += item.getBounds().getHeight(); } double scale = h > m_maxHeight ? m_maxHeight / h : 1.0; Display d = m_vis.getDisplay(0); Insets ins = d.getInsets(); // second pass h = ins.top; double ih, y = 0, x = ins.left; iter = m_vis.items(); while (iter.hasNext()) { VisualItem item = (VisualItem) iter.next(); item.setSize(scale); item.setEndSize(scale); Rectangle2D b = item.getBounds(); w = Math.max(w, b.getWidth()); ih = b.getHeight(); y = h + (ih / 2); setX(item, null, x); setY(item, null, y); h += ih; } // set the display size to fit text setSize( d, (int) Math.round(2 * m_scale * w + ins.left + ins.right), (int) Math.round(h + ins.bottom)); }