All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.swt.custom.ScrolledCompositeLayout Maven / Gradle / Ivy

Go to download

The Rich Ajax Platform lets you build rich, Ajax-enabled Web applications.

There is a newer version: 3.29.0
Show newest version
/*******************************************************************************
 * 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;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy