/******************************************************************************* * 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; } }