blob: 18abbe9adbc296e159928b09021e1ea26e9bc149 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - Initial API and implementation
**********************************************************************/
package org.eclipse.ui.internal.browser;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Layout;
/**
* Custom layout for the browser's toolbar.
*/
public class ToolbarLayout extends Layout {
private static final int SPACING = 5;
private static final int EXTRA_BUSY_SPACING = 2;
private static final int MARGIN = 2;
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Layout#computeSize(org.eclipse.swt.widgets.Composite, int, int, boolean)
*/
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
if (hHint != SWT.DEFAULT)
return new Point(wHint, hHint);
Control[] children = composite.getChildren();
int h = 0;
int size = children.length;
for (int i = 0; i < size; i++) {
h = Math.max(h, children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).y);
}
return new Point(wHint, h + MARGIN * 2);
}
/* (non-Javadoc)
* @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite, boolean)
*/
protected void layout(Composite composite, boolean flushCache) {
Control[] children = composite.getChildren();
Rectangle r = composite.getClientArea();
int size = children.length;
Point[] sizes = new Point[size];
for (int i = 0; i < size; i++) {
sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT);
}
int h = r.height - MARGIN * 2;
// put busy icon at right with a little extra spacing
int busy = size - 1;
children[busy].setBounds(r.x + r.width - MARGIN - sizes[busy].x,
r.y + MARGIN + (h-sizes[busy].y) / 2,
sizes[busy].x, sizes[busy].y);
// find combo
int combo = -1;
int tw = r.width - MARGIN * 2 - (size - 1) * SPACING
- sizes[size-1].x - EXTRA_BUSY_SPACING;
for (int i = 0; i < size - 1; i++) {
if (children[i] instanceof Combo)
combo = i;
else
tw -= sizes[i].x;
}
if (combo >= 0)
sizes[combo].x = tw;
// space out other children with their standard size, give combo all
// remaining space (if it exists)
int x = MARGIN;
for (int i = 0; i < size - 1; i++) {
children[i].setBounds(r.x + x, r.y + MARGIN + (h-sizes[i].y) / 2,
sizes[i].x, sizes[i].y);
x += SPACING + sizes[i].x;
}
}
}