/******************************************************************************* * 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 ); } } }