org.eclipse.swt.layout.FillLayout Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.swt.gtk.linux.aarch64 Show documentation
Show all versions of org.eclipse.swt.gtk.linux.aarch64 Show documentation
Standard Widget Toolkit for GTK on aarch64
The newest version!
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Christoph Läubrich - Bug 513185
*******************************************************************************/
package org.eclipse.swt.layout;
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
/**
* FillLayout
is the simplest layout class. It lays out
* controls in a single row or column, forcing them to be the same size.
*
* Initially, the controls will all be as tall as the tallest control,
* and as wide as the widest. FillLayout
does not wrap,
* but you can specify margins and spacing. You might use it to
* lay out buttons in a task bar or tool bar, or to stack checkboxes
* in a Group
. FillLayout
can also be used
* when a Composite
only has one child. For example,
* if a Shell
has a single Group
child,
* FillLayout
will cause the Group
to
* completely fill the Shell
(if margins are 0).
*
*
* Example code: first a FillLayout
is created and
* its type field is set, and then the layout is set into the
* Composite
. Note that in a FillLayout
,
* children are always the same size, and they fill all available space.
*
*
* FillLayout fillLayout = new FillLayout();
* fillLayout.type = SWT.VERTICAL;
* shell.setLayout(fillLayout);
*
*
* @see SWT Example: LayoutExample
* @see Sample code and further information
*/
public final class FillLayout extends Layout {
/**
* type specifies how controls will be positioned
* within the layout.
*
* The default value is HORIZONTAL.
*
* Possible values are:
* - HORIZONTAL: Position the controls horizontally from left to right
* - VERTICAL: Position the controls vertically from top to bottom
*
*/
public int type = SWT.HORIZONTAL;
/**
* marginWidth specifies the number of points of horizontal margin
* that will be placed along the left and right edges of the layout.
*
* The default value is 0.
*
* @since 3.0
*/
public int marginWidth = 0;
/**
* marginHeight specifies the number of points of vertical margin
* that will be placed along the top and bottom edges of the layout.
*
* The default value is 0.
*
* @since 3.0
*/
public int marginHeight = 0;
/**
* spacing specifies the number of points between the edge of one cell
* and the edge of its neighbouring cell.
*
* The default value is 0.
*
* @since 3.0
*/
public int spacing = 0;
/**
* Constructs a new instance of this class.
*/
public FillLayout () {
}
/**
* Constructs a new instance of this class given the type.
*
* @param type the type of fill layout
*
* @since 2.0
*/
public FillLayout (int type) {
this.type = type;
}
@Override
protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) {
Control [] children = composite.getChildren ();
int count = children.length;
int maxWidth = 0, maxHeight = 0;
for (int i=0; i 0) {
if (type == SWT.HORIZONTAL && wHint != SWT.DEFAULT) {
w = Math.max (0, (wHint - (count - 1) * spacing) / count);
}
if (type == SWT.VERTICAL && hHint != SWT.DEFAULT) {
h = Math.max (0, (hHint - (count - 1) * spacing) / count);
}
}
Point size = computeChildSize (child, w, h, flushCache);
maxWidth = Math.max (maxWidth, size.x);
maxHeight = Math.max (maxHeight, size.y);
}
int width = 0, height = 0;
if (type == SWT.HORIZONTAL) {
width = count * maxWidth;
if (count != 0) width += (count - 1) * spacing;
height = maxHeight;
} else {
width = maxWidth;
height = count * maxHeight;
if (count != 0) height += (count - 1) * spacing;
}
width += marginWidth * 2;
height += marginHeight * 2;
if (wHint != SWT.DEFAULT) width = wHint;
if (hHint != SWT.DEFAULT) height = hHint;
return new Point (width, height);
}
Point computeChildSize (Control control, int wHint, int hHint, boolean flushCache) {
Object data = control.getLayoutData ();
FillData fillData;
if (data instanceof FillData) {
fillData = (FillData) data;
} else {
fillData = new FillData ();
if (data == null) {
control.setLayoutData(fillData);
}
}
Point size = null;
if (wHint == SWT.DEFAULT && hHint == SWT.DEFAULT) {
size = fillData.computeSize (control, wHint, hHint, flushCache);
} else {
// TEMPORARY CODE
int trimX, trimY;
if (control instanceof Scrollable) {
Rectangle rect = ((Scrollable) control).computeTrim (0, 0, 0, 0);
trimX = rect.width;
trimY = rect.height;
} else {
trimX = trimY = control.getBorderWidth () * 2;
}
int w = wHint == SWT.DEFAULT ? wHint : Math.max (0, wHint - trimX);
int h = hHint == SWT.DEFAULT ? hHint : Math.max (0, hHint - trimY);
size = fillData.computeSize (control, w, h, flushCache);
}
return size;
}
@Override
protected boolean flushCache (Control control) {
Object data = control.getLayoutData();
if (data instanceof FillData) {
((FillData)data).flushCache();
return true;
}
return false;
}
String getName () {
String string = getClass ().getName ();
int index = string.lastIndexOf ('.');
if (index == -1) return string;
return string.substring (index + 1, string.length ());
}
@Override
protected void layout (Composite composite, boolean flushCache) {
Rectangle rect = composite.getClientArea ();
Control [] children = composite.getChildren ();
int count = children.length;
if (count == 0) return;
int width = rect.width - marginWidth * 2;
int height = rect.height - marginHeight * 2;
if (type == SWT.HORIZONTAL) {
width -= (count - 1) * spacing;
int x = rect.x + marginWidth, extra = width % count;
int y = rect.y + marginHeight, cellWidth = width / count;
for (int i=0; i