blob: 29685c8cc2422779297481f08e5a676d1bf7dc5e [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.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;
}
}