org.eclipse.swt.custom.ScrolledCompositeLayout Maven / Gradle / Ivy
/*******************************************************************************
* 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.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.ScrollBar;
/**
* This class provides the layout for ScrolledComposite
*
* @see ScrolledComposite
*/
final class ScrolledCompositeLayout extends Layout {
private static final int DEFAULT_WIDTH = 64;
private static final int DEFAULT_HEIGHT = 64;
private boolean inLayout = false;
protected Point computeSize( Composite composite, int wHint, int hHint, boolean flushCache ) {
ScrolledComposite sc = ( ScrolledComposite )composite;
Point size = new Point( DEFAULT_WIDTH, DEFAULT_HEIGHT );
if( sc.content != null ) {
Point preferredSize = sc.content.computeSize( wHint, hHint, flushCache );
Point currentSize = sc.content.getSize();
size.x = sc.getExpandHorizontal() ? preferredSize.x : currentSize.x;
size.y = sc.getExpandVertical() ? preferredSize.y : currentSize.y;
}
size.x = Math.max( size.x, sc.minWidth );
size.y = Math.max( size.y, sc.minHeight );
if( wHint != SWT.DEFAULT ) {
size.x = wHint;
}
if( hHint != SWT.DEFAULT ) {
size.y = hHint;
}
return size;
}
protected boolean flushCache( Control control ) {
return true;
}
protected void layout( Composite composite, boolean flushCache ) {
if( inLayout ) {
return;
}
ScrolledComposite sc = ( ScrolledComposite )composite;
if( sc.content == null ) {
return;
}
ScrollBar hBar = sc.getHorizontalBar();
ScrollBar vBar = sc.getVerticalBar();
if( hBar != null ) {
if( hBar.getSize().y >= sc.getSize().y ) {
return;
}
}
if( vBar != null ) {
if( vBar.getSize().x >= sc.getSize().x ) {
return;
}
}
inLayout = true;
Rectangle contentRect = sc.content.getBounds();
if( !sc.alwaysShowScroll ) {
boolean hVisible = sc.needHScroll( contentRect, false );
boolean vVisible = sc.needVScroll( contentRect, hVisible );
if( !hVisible && vVisible ) {
hVisible = sc.needHScroll( contentRect, vVisible );
}
if( hBar != null ) {
hBar.setVisible( hVisible );
}
if( vBar != null ) {
vBar.setVisible( vVisible );
}
}
Rectangle hostRect = sc.getClientArea();
if( sc.expandHorizontal ) {
contentRect.width = Math.max( sc.minWidth, hostRect.width );
}
if( sc.expandVertical ) {
contentRect.height = Math.max( sc.minHeight, hostRect.height );
}
if( hBar != null ) {
hBar.setMaximum( contentRect.width );
hBar.setThumb( Math.min( contentRect.width, hostRect.width ) );
int hPage = contentRect.width - hostRect.width;
int hSelection = hBar.getSelection();
if( hSelection >= hPage ) {
if( hPage <= 0 ) {
hSelection = 0;
hBar.setSelection( 0 );
}
contentRect.x = -hSelection;
}
}
if( vBar != null ) {
vBar.setMaximum( contentRect.height );
vBar.setThumb( Math.min( contentRect.height, hostRect.height ) );
int vPage = contentRect.height - hostRect.height;
int vSelection = vBar.getSelection();
if( vSelection >= vPage ) {
if( vPage <= 0 ) {
vSelection = 0;
vBar.setSelection( 0 );
}
contentRect.y = -vSelection;
}
}
sc.content.setBounds( contentRect );
inLayout = false;
}
}