blob: daf0aa65aeed0c7a044b10e8b03721e8c7ce4c75 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.swt.custom;
// import org.eclipse.swt.*;
// import org.eclipse.swt.graphics.*;
// import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.*;
/**
* This class provides the layout for CBanner
*
* @see CBanner
*/
class CBannerLayout extends Layout {
protected Point computeSize( Composite composite,
int wHint,
int hHint,
boolean flushCache )
{
CBanner banner = ( CBanner )composite;
Control left = banner.left;
Control right = banner.right;
Control bottom = banner.bottom;
boolean showCurve = left != null && right != null;
int height = hHint;
int width = wHint;
// Calculate component sizes
Point bottomSize = new Point( 0, 0 );
if( bottom != null ) {
int trim = computeTrim( bottom );
int w = wHint == SWT.DEFAULT
? SWT.DEFAULT
: Math.max( 0, width - trim );
bottomSize = computeChildSize( bottom, w, SWT.DEFAULT, flushCache );
}
Point rightSize = new Point( 0, 0 );
if( right != null ) {
int trim = computeTrim( right );
int w = SWT.DEFAULT;
if( banner.rightWidth != SWT.DEFAULT ) {
w = banner.rightWidth - trim;
if( left != null ) {
w = Math.min( w, width
- banner.curve_width
+ 2
* banner.curve_indent
- CBanner.MIN_LEFT
- trim );
}
w = Math.max( 0, w );
}
rightSize = computeChildSize( right, w, SWT.DEFAULT, flushCache );
if( wHint != SWT.DEFAULT ) {
width -= rightSize.x + banner.curve_width - 2 * banner.curve_indent;
}
}
Point leftSize = new Point( 0, 0 );
if( left != null ) {
int trim = computeTrim( left );
int w = wHint == SWT.DEFAULT
? SWT.DEFAULT
: Math.max( 0, width - trim );
leftSize = computeChildSize( left, w, SWT.DEFAULT, flushCache );
}
// Add up sizes
width = leftSize.x + rightSize.x;
height = bottomSize.y;
if( bottom != null && ( left != null || right != null ) ) {
height += CBanner.BORDER_STRIPE + 2;
}
if( left != null ) {
if( right == null ) {
height += leftSize.y;
} else {
height += Math.max( leftSize.y,
banner.rightMinHeight == SWT.DEFAULT
? rightSize.y
: banner.rightMinHeight );
}
} else {
height += rightSize.y;
}
if( showCurve ) {
width += banner.curve_width - 2 * banner.curve_indent;
height += CBanner.BORDER_TOP
+ CBanner.BORDER_BOTTOM
+ 2
* CBanner.BORDER_STRIPE;
}
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();
if( data == null || !( data instanceof CLayoutData ) ) {
data = new CLayoutData();
control.setLayoutData( data );
}
return ( ( CLayoutData )data ).computeSize( control,
wHint,
hHint,
flushCache );
}
int computeTrim( Control c ) {
if( c instanceof Scrollable ) {
Rectangle rect = ( ( Scrollable )c ).computeTrim( 0, 0, 0, 0 );
return rect.width;
}
return c.getBorderWidth() * 2;
}
protected boolean flushCache( Control control ) {
Object data = control.getLayoutData();
if( data != null && data instanceof CLayoutData )
( ( CLayoutData )data ).flushCache();
return true;
}
protected void layout( Composite composite, boolean flushCache ) {
CBanner banner = ( CBanner )composite;
Control left = banner.left;
Control right = banner.right;
Control bottom = banner.bottom;
Sash separator = banner.separator;
Point size = banner.getSize();
boolean showCurve = left != null && right != null;
int width = size.x - 2 * banner.getBorderWidth();
int height = size.y - 2 * banner.getBorderWidth();
Point bottomSize = new Point( 0, 0 );
if( bottom != null ) {
int trim = computeTrim( bottom );
int w = Math.max( 0, width - trim );
bottomSize = computeChildSize( bottom, w, SWT.DEFAULT, flushCache );
height -= bottomSize.y + CBanner.BORDER_STRIPE + 2;
}
if( showCurve )
height -= CBanner.BORDER_TOP
+ CBanner.BORDER_BOTTOM
+ 2
* CBanner.BORDER_STRIPE;
height = Math.max( 0, height );
Point rightSize = new Point( 0, 0 );
if( right != null ) {
int trim = computeTrim( right );
int w = SWT.DEFAULT;
if( banner.rightWidth != SWT.DEFAULT ) {
w = banner.rightWidth - trim;
if( left != null ) {
w = Math.min( w, width
- banner.curve_width
+ 2
* banner.curve_indent
- CBanner.MIN_LEFT
- trim );
}
w = Math.max( 0, w );
}
rightSize = computeChildSize( right, w, SWT.DEFAULT, flushCache );
width = width
- ( rightSize.x - banner.curve_indent + banner.curve_width - banner.curve_indent );
}
Point leftSize = new Point( 0, 0 );
if( left != null ) {
int trim = computeTrim( left );
int w = Math.max( 0, width - trim );
leftSize = computeChildSize( left, w, SWT.DEFAULT, flushCache );
}
int x = 0;
int y = 0;
int oldStart = banner.curveStart;
Rectangle leftRect = null;
Rectangle rightRect = null;
Rectangle bottomRect = null;
Rectangle curveRect = null;
if( bottom != null ) {
bottomRect = new Rectangle( x,
y + size.y - bottomSize.y,
bottomSize.x,
bottomSize.y );
}
if( showCurve )
y += CBanner.BORDER_TOP + CBanner.BORDER_STRIPE;
if( left != null ) {
leftRect = new Rectangle( x, y, leftSize.x, leftSize.y );
banner.curveStart = x + leftSize.x - banner.curve_indent;
x += leftSize.x
- banner.curve_indent
+ banner.curve_width
- banner.curve_indent;
}
if( right != null ) {
if( left != null ) {
rightSize.y = Math.max( leftSize.y,
banner.rightMinHeight == SWT.DEFAULT
? rightSize.y
: banner.rightMinHeight );
}
rightRect = new Rectangle( x, y, rightSize.x, rightSize.y );
}
// if( banner.curveStart < oldStart ) {
// banner.redraw( banner.curveStart - CBanner.CURVE_TAIL,
// 0,
// oldStart
// + banner.curve_width
// - banner.curveStart
// + CBanner.CURVE_TAIL
// + 5,
// size.y,
// false );
// }
// if( banner.curveStart > oldStart ) {
// banner.redraw( oldStart - CBanner.CURVE_TAIL, 0, banner.curveStart
// + banner.curve_width
// - oldStart
// + CBanner.CURVE_TAIL
// + 5, size.y, false );
// }
if( rightRect != null ) {
curveRect = new Rectangle( banner.curveStart,
y,
banner.curve_width,
height );
}
/*
* The paint events must be flushed in order to make the curve draw smoothly
* while the user drags the divider. On Windows, it is necessary to flush
* the paints before the children are resized because otherwise the children
* (particularly toolbars) will flash.
*/
// banner.update();
banner.curveRect = new Rectangle( banner.curveStart,
0,
banner.curve_width,
size.y );
if( bottomRect != null )
bottom.setBounds( bottomRect );
if( rightRect != null )
right.setBounds( rightRect );
if( leftRect != null )
left.setBounds( leftRect );
if( curveRect != null ) {
separator.setBounds( curveRect );
}
}
}