blob: 1813496018237cc4556ebd164544334a297d838a [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.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* Layout for a viewport. A viewport is a flexible window onto a figure.
*/
public class ViewportLayout extends AbstractHintLayout {
/**
* Returns the minimum size required by the input viewport figure. Since
* viewport is flexible, the minimum size required would be the just the
* size of the borders.
*
* @see AbstractHintLayout#calculateMinimumSize(IFigure, int, int)
*/
protected Dimension calculateMinimumSize(IFigure figure, int wHint,
int hHint) {
Viewport viewport = (Viewport) figure;
Dimension min = new Dimension();
Insets insets = viewport.getInsets();
return min.getExpanded(insets.getWidth(), insets.getHeight());
}
/**
* Calculates and returns the preferred size of the figure based on the
* given hints. The given wHint is ignored unless the viewport (parent) is
* tracking width. The same is true for the height hint.
*
* @param parent
* the Viewport whose preferred size is to be calculated
* @param wHint
* the width hint
* @param hHint
* the height hint
* @return the Preferred size of the given viewport
* @since 2.0
*/
protected Dimension calculatePreferredSize(IFigure parent, int wHint,
int hHint) {
Viewport viewport = (Viewport) parent;
Insets insets = viewport.getInsets();
IFigure contents = viewport.getContents();
if (viewport.getContentsTracksWidth() && wHint > -1)
wHint = Math.max(0, wHint - insets.getWidth());
else
wHint = -1;
if (viewport.getContentsTracksHeight() && hHint > -1)
hHint = Math.max(0, hHint - insets.getHeight());
else
hHint = -1;
if (contents == null) {
return new Dimension(insets.getWidth(), insets.getHeight());
} else {
Dimension minSize = contents.getMinimumSize(wHint, hHint);
if (wHint > -1)
wHint = Math.max(wHint, minSize.width);
if (hHint > -1)
hHint = Math.max(hHint, minSize.height);
return contents.getPreferredSize(wHint, hHint).getExpanded(
insets.getWidth(), insets.getHeight());
}
// Layout currently does not union border's preferred size.
}
/**
* @see org.eclipse.draw2d.AbstractHintLayout#isSensitiveHorizontally(IFigure)
*/
protected boolean isSensitiveHorizontally(IFigure parent) {
return ((Viewport) parent).getContentsTracksWidth();
}
/**
* @see org.eclipse.draw2d.AbstractHintLayout#isSensitiveHorizontally(IFigure)
*/
protected boolean isSensitiveVertically(IFigure parent) {
return ((Viewport) parent).getContentsTracksHeight();
}
/**
* @see org.eclipse.draw2d.LayoutManager#layout(IFigure)
*/
public void layout(IFigure figure) {
Viewport viewport = (Viewport) figure;
IFigure contents = viewport.getContents();
if (contents == null)
return;
Point p = viewport.getClientArea().getLocation();
p.translate(viewport.getViewLocation().getNegated());
// Calculate the hints
Rectangle hints = viewport.getClientArea();
int wHint = viewport.getContentsTracksWidth() ? hints.width : -1;
int hHint = viewport.getContentsTracksHeight() ? hints.height : -1;
Dimension newSize = viewport.getClientArea().getSize();
Dimension min = contents.getMinimumSize(wHint, hHint);
Dimension pref = contents.getPreferredSize(wHint, hHint);
if (viewport.getContentsTracksHeight())
newSize.height = Math.max(newSize.height, min.height);
else
newSize.height = Math.max(newSize.height, pref.height);
if (viewport.getContentsTracksWidth())
newSize.width = Math.max(newSize.width, min.width);
else
newSize.width = Math.max(newSize.width, pref.width);
contents.setBounds(new Rectangle(p, newSize));
}
}