if (children.length == 0) new Point (marginLeft + marginWidth * 2 + marginRight, marginTop + marginHeight * 2 + marginBottom);
Point layoutVertical (Composite composite, boolean move, boolean wrap, int height, boolean flushCache) {	int count = 0;	Control [] children = composite.getChildren ();	for (int i=0; i<children.length; i++) {		Control control = children [i];		RowData data = (RowData) control.getLayoutData ();		if (data == null || !data.exclude) {			children [count++] = children [i];		} 	}	int childWidth = 0, childHeight = 0, maxWidth = 0;	if (!pack) {		for (int i=0; i<count; i++) {			Control child = children [i];			Point size = computeSize (child, flushCache);			childWidth = Math.max (childWidth, size.x);			childHeight = Math.max (childHeight, size.y);		}		maxWidth = childWidth;	}	int clientX = 0, clientY = 0;	if (move) {		Rectangle rect = composite.getClientArea ();		clientX = rect.x;		clientY = rect.y;	}	int [] wraps = null;	boolean wrapped = false;	Rectangle [] bounds = null;	if (move && (justify || fill)) {		bounds = new Rectangle [count];		wraps = new int [count];	}	int maxY = 0, x = marginLeft + marginWidth, y = marginTop + marginHeight;	for (int i=0; i<count; i++) {		Control child = children [i];		if (pack) {			Point size = computeSize (child, flushCache);			childWidth = size.x;			childHeight = size.y;		}		if (wrap && (i != 0) && (y + childHeight > height)) {			wrapped = true;			if (move && (justify || fill)) wraps [i - 1] = maxWidth;			x += spacing + maxWidth;			y = marginTop + marginHeight;			if (pack) maxWidth = 0;		}		if (pack || fill) {			maxWidth = Math.max (maxWidth, childWidth);		}		if (move) {			int childX = x + clientX, childY = y + clientY;			if (justify || fill) {				bounds [i] = new Rectangle (childX, childY, childWidth, childHeight);			} else {				child.setBounds (childX, childY, childWidth, childHeight);			}		}		y += spacing + childHeight;		maxY = Math.max (maxY, y);	}	maxY = Math.max (clientY + marginTop + marginHeight, maxY - spacing);	if (!wrapped) maxY += marginBottom + marginHeight;	if (move && (justify || fill)) {		int space = 0, margin = 0;		if (!wrapped) {			space = Math.max (0, (height - maxY) / (count + 1));			margin = Math.max (0, ((height - maxY) % (count + 1)) / 2);		} else {			if (fill || justify) {				int last = 0;				if (count > 0) wraps [count - 1] = maxWidth;				for (int i=0; i<count; i++) {					if (wraps [i] != 0) {						int wrapCount = i - last + 1;						if (justify) {							int wrapY = 0;							for (int j=last; j<=i; j++) {								wrapY += bounds [j].height + spacing;							}							space = Math.max (0, (height - wrapY) / (wrapCount + 1));							margin = Math.max (0, ((height - wrapY) % (wrapCount + 1)) / 2);						}						for (int j=last; j<=i; j++) {							if (justify) bounds [j].y += (space * (j - last + 1)) + margin;							if (fill) bounds [j].width = wraps [i];						}						last = i + 1;					}				}			}		}		for (int i=0; i<count; i++) {			if (!wrapped) {				if (justify) bounds [i].y += (space * (i + 1)) + margin;				if (fill) bounds [i].width = maxWidth;			}			children [i].setBounds (bounds [i]);		}	}	return new Point (x + maxWidth + marginRight + marginWidth, maxY);}