/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.swt.util;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
public class VerticalFillLayout extends Layout {
public int leftMargin = SWT.DEFAULT;
public int rightMargin = SWT.DEFAULT;
public static Control createSeparator(Composite parent, int height) {
Composite c = new Composite(parent, SWT.NONE);
VerticalFillLayoutData d = new VerticalFillLayoutData();
d.heightHint = height;
c.setLayoutData(d);
return c;
}
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
int w = 0;
int m = 0;
if(leftMargin != SWT.DEFAULT) m = leftMargin;
if(rightMargin != SWT.DEFAULT) m += rightMargin;
int h = 0;
Control[] cs = composite.getChildren();
for (int i = 0; i < cs.length; i++) {
// if(cs[i].isDisposed() || !cs[i].isVisible()) continue;
if(!cs[i].isVisible() && !cs[i].isEnabled()) continue;
Point p = cs[i].computeSize(wHint, SWT.DEFAULT);
Object d = cs[i].getLayoutData();
VerticalFillLayoutData data = (d instanceof VerticalFillLayoutData) ? (VerticalFillLayoutData)d : null;
if(data != null && data.heightHint != SWT.DEFAULT) {
h += data.heightHint;
} else {
h += p.y;
}
if(w < p.x) w = p.x;
}
return new Point(w + m, h);
}
protected void layout(Composite composite, boolean flushCache) {
int x = composite.getClientArea().x;
int y = composite.getClientArea().y;
int width = composite.getClientArea().width;
// int height = composite.getClientArea().height;
if(leftMargin != SWT.DEFAULT) {
x += leftMargin;
width -= leftMargin;
}
if(rightMargin != SWT.DEFAULT) {
width -= rightMargin;
}
Control[] cs = composite.getChildren();
for (int i = 0; i < cs.length; i++) {
// if(cs[i].isDisposed() || !cs[i].isVisible()) continue;
if(!cs[i].isVisible() && !cs[i].isEnabled()) continue;
Point p = cs[i].computeSize(width, SWT.DEFAULT);
Object d = cs[i].getLayoutData();
VerticalFillLayoutData data = (d instanceof VerticalFillLayoutData) ? (VerticalFillLayoutData)d : null;
int dh = (data != null && data.heightHint != SWT.DEFAULT)
? data.heightHint : p.y;
cs[i].setBounds(x, y, width, dh);
y += dh;
}
}
}