blob: 50e2cc20a605e1245315e6ef069f254f4661a73f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.draw2d;
import org.eclipse.draw2d.geometry.Point;
/**
* A class which implements automatic horizontal and/or vertical scrolling for a
* single IFigure child.
* <p>
* ScrollBar visibilites are represented by integer class constants:
* <ul>
* <li>NEVER: Never show the ScrollBar
* <li>AUTOMATIC: Show as needed, when the ScrollPane can no longer contain its
* view
* <li>ALWAYS: Always show the ScrollBar
* </ul>
* To use, instantiate a ScrollPane object and call its setView(IFigure) method
* passing the IFigure that is desired to have scrolling ability.
*/
public class ScrollPane extends Figure {
/** Constant indicating to never show the ScrollBar */
public static final int NEVER = 0;
/**
* Constant indicating to show as needed, when the ScrollPane can't contain
* its view
*/
public static final int AUTOMATIC = 1;
/** Constant indicating to always show the ScrollBar */
public static final int ALWAYS = 2;
/** The viewport being scrolled */
protected Viewport viewport;
/** The horizontal scrollbar */
protected ScrollBar hBar;
/** The vertical scrollbar */
protected ScrollBar vBar;
private int hVisibility = AUTOMATIC, vVisibility = AUTOMATIC;
/**
* Constructs a new ScrollPane with a ScrollPaneLayout.
*
* @since 2.0
*/
public ScrollPane() {
setLayoutManager(new ScrollPaneLayout());
}
/**
* Creates a new horizontally oriented ScrollBar and adds it to this
* ScrollPane.
*
* @since 2.0
*/
protected void createHorizontalScrollBar() {
ScrollBar bar = new ScrollBar();
bar.setHorizontal(true);
setHorizontalScrollBar(bar);
}
/**
* Creates a new Viewport and adds it to this ScrollPane.
*
* @since 2.0
*/
protected void createViewport() {
setViewport(new Viewport());
}
/**
* Creates a new vertically oriented ScrollBar and adds it to this
* ScrollPane.
*
* @since 2.0
*/
protected void createVerticalScrollBar() {
ScrollBar bar = new ScrollBar();
setVerticalScrollBar(bar);
}
/**
* Returns the ScrollPane's horizontal ScrollBar.
*
* @return the horizontal scrollbar
* @since 2.0
*/
public ScrollBar getHorizontalScrollBar() {
if (hBar == null)
createHorizontalScrollBar();
return hBar;
}
/**
* Returns the visibility of the ScrollPane's horizontal ScrollBar. These
* are represented by the integer class constants {@link #NEVER},
* {@link #AUTOMATIC}, and {@link #ALWAYS}. The default is
* {@link #AUTOMATIC}.
*
* @return the visiblity of the horizontal scrollbar
* @since 2.0
*/
public int getHorizontalScrollBarVisibility() {
return hVisibility;
}
/**
* Returns the ScrollPane's vertical ScrollBar.
*
* @return teh vertical scrollbar
* @since 2.0
*/
public ScrollBar getVerticalScrollBar() {
if (vBar == null)
createVerticalScrollBar();
return vBar;
}
/**
* Returns the visibility of the ScrollPane's vertical ScrollBar. These are
* represented by the integer class constants {@link #NEVER},
* {@link #AUTOMATIC}, and {@link #ALWAYS}. The default is
* {@link #AUTOMATIC}.
*
* @return the visibility of the vertical scrollbar
* @since 2.0
*/
public int getVerticalScrollBarVisibility() {
return vVisibility;
}
/**
* Returns the contents of the viewport.
*
* @return the contents of the viewport
*/
public IFigure getContents() {
return getView();
}
/**
* Returns the ScrollPane's view. The view is the IFigure that is the
* contents of the ScrollPane.
*
* @return the contents
* @deprecated use getContents()
* @since 2.0
*/
public IFigure getView() {
return getViewport().getContents();
}
/**
* Returns the ScrollPane's {@link Viewport}.
*
* @return the viewport
* @since 2.0
*/
public Viewport getViewport() {
if (viewport == null)
createViewport();
return viewport;
}
/**
* Returns true because ScrollPanes are always opaque.
*
* @see IFigure#isOpaque()
*/
public boolean isOpaque() {
return true;
}
/**
* Scrolls the Scrollpane horizontally x pixels from its left-most position.
*
* @param x
* the amount to scroll horizontally
* @since 2.0
*/
public void scrollHorizontalTo(int x) {
getViewport().setHorizontalLocation(x);
}
/**
* Scrolls the Scrollpane horizontally from its left-most position by
* location.x pixels and vertically from its top-most position by location.y
* pixels.
*
* @param location
* the point to scroll to
* @since 2.0
*/
public void scrollTo(Point location) {
scrollHorizontalTo(location.x);
scrollVerticalTo(location.y);
}
/**
* Scrolls the Scrollpane vertically y pixels from its top-most position.
*
* @param y
* the amount to scroll vertically
* @since 2.0
*/
public void scrollVerticalTo(int y) {
getViewport().setVerticalLocation(y);
}
/**
* Sets the contents of the current viewport.
*
* @param figure
* the contents of the viewport
*/
public void setContents(IFigure figure) {
setView(figure);
}
/**
* Sets the ScrollPane's horizontal ScrollBar to the passed ScrollBar.
*
* @param bar
* the new horizontal scrollbar
* @since 2.0
*/
public void setHorizontalScrollBar(ScrollBar bar) {
if (hBar != null) {
remove(hBar);
hBar.getRangeModel().removePropertyChangeListener(hBar);
}
hBar = bar;
if (hBar != null) {
add(hBar);
hBar.setRangeModel(getViewport().getHorizontalRangeModel());
}
}
/**
* Sets the horizontal ScrollBar visibility of the ScrollPane to the passed
* value. These are represented by the integer class constants
* {@link #NEVER}, {@link #AUTOMATIC}, and {@link #ALWAYS}. The default is
* {@link #AUTOMATIC}.
*
* @param v
* the new horizontal visibility
* @since 2.0
*/
public void setHorizontalScrollBarVisibility(int v) {
if (hVisibility == v)
return;
hVisibility = v;
revalidate();
}
/**
* Sets both the horizontal and vertical ScrollBar visibilities of the
* ScrollPane to the passed value. These are represented by the integer
* class constants {@link #NEVER}, {@link #AUTOMATIC}, and {@link #ALWAYS}.
* The default is {@link #AUTOMATIC}.
*
* @param v
* the new vertical and horizontal visibility
* @since 2.0
*/
public void setScrollBarVisibility(int v) {
setHorizontalScrollBarVisibility(v);
setVerticalScrollBarVisibility(v);
}
/**
* Sets the ScrollPane's vertical ScrollBar to the passed Scrollbar.
*
* @param bar
* the new vertical scrollbar
* @since 2.0
*/
public void setVerticalScrollBar(ScrollBar bar) {
if (vBar != null) {
remove(vBar);
vBar.getRangeModel().removePropertyChangeListener(vBar);
}
vBar = bar;
if (vBar != null) {
add(vBar);
vBar.setRangeModel(getViewport().getVerticalRangeModel());
}
}
/**
* Sets the vertical ScrollBar visibility of the ScrollPane to the passed
* value. These are represented by the integer class constants
* {@link #NEVER}, {@link #AUTOMATIC}, and {@link #ALWAYS}. The default is
* {@link #AUTOMATIC}.
*
* @param v
* the new vertical scrollbar visibility
* @since 2.0
*/
public void setVerticalScrollBarVisibility(int v) {
if (vVisibility == v)
return;
vVisibility = v;
revalidate();
}
/**
* Sets the ScrollPane's view to the passed IFigure. The view is the
* top-level IFigure which represents the contents of the ScrollPane.
*
* @param figure
* the new contents
* @deprecated call setContents(IFigure) instead
* @since 2.0
*/
public void setView(IFigure figure) {
getViewport().setContents(figure);
}
/**
* Sets the ScrollPane's Viewport to the passed value.
*
* @param vp
* the new viewport
* @since 2.0
*/
public void setViewport(Viewport vp) {
if (viewport != null)
remove(viewport);
viewport = vp;
if (vp != null)
add(vp, 0);
}
/**
* @see IFigure#validate()
*/
public void validate() {
super.validate();
getHorizontalScrollBar().validate();
getVerticalScrollBar().validate();
}
}