/*******************************************************************************
* Copyright (c) 2000, 2005 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.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* A viewport for {@link org.eclipse.draw2d.FreeformFigure FreeformFigures}.
* FreeformFigures can only reside in this type of viewport.
*/
public class FreeformViewport
extends Viewport
{
class FreeformViewportLayout
extends ViewportLayout
{
protected Dimension calculatePreferredSize(IFigure parent, int wHint, int hHint) {
getContents().validate();
wHint = Math.max(0, wHint);
hHint = Math.max(0, hHint);
return ((FreeformFigure)getContents())
.getFreeformExtent()
.getExpanded(getInsets())
.union(0, 0)
.union(wHint - 1, hHint - 1)
.getSize();
}
protected boolean isSensitiveHorizontally(IFigure parent) {
return true;
}
protected boolean isSensitiveVertically(IFigure parent) {
return true;
}
public void layout(IFigure figure) {
//Do nothing, contents updates itself.
}
}
/**
* Constructs a new FreeformViewport. This viewport must use graphics translation to
* scroll the FreeformFigures inside of it.
*/
public FreeformViewport() {
super(true); //Must use graphics translate to scroll freeforms.
setLayoutManager(new FreeformViewportLayout());
}
/**
* Readjusts the scrollbars. In doing so, it gets the freeform extent of the contents and
* unions this rectangle with this viewport's client area, then sets the contents freeform
* bounds to be this unioned rectangle. Then proceeds to set the scrollbar values based
* on this new information.
* @see Viewport#readjustScrollBars()
*/
protected void readjustScrollBars() {
if (getContents() == null)
return;
if (!(getContents() instanceof FreeformFigure))
return;
FreeformFigure ff = (FreeformFigure)getContents();
Rectangle clientArea = getClientArea();
Rectangle bounds = ff.getFreeformExtent().getCopy();
bounds.union(0, 0, clientArea.width, clientArea.height);
ff.setFreeformBounds(bounds);
getVerticalRangeModel().setAll(bounds.y, clientArea.height, bounds.bottom());
getHorizontalRangeModel().setAll(bounds.x, clientArea.width, bounds.right());
}
/**
* Returns <code>true</code>.
* @see Figure#useLocalCoordinates()
*/
protected boolean useLocalCoordinates() {
return true;
}
}