blob: bee006f3a67c8bac1a0f43f39bcf1079ac5c81ff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 Sybase, Inc. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.preference;
import java.util.Iterator;
import java.util.ListIterator;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* @author Bob Brodt
*
* This is an XY layout that actually observes visiblity of children figures
* when doint its layout.
*
* Apparently there is a bug in the GEF XYLayout class because it does not
* observe visibility.
*
* @see org.eclipse.draw2d.AbstractLayout#isObservingVisibility()
*/
/*package*/ class ObserveVisibleXYLayout extends FreeformLayout {
protected Dimension calculatePreferredSize(IFigure f, int wHint, int hHint) {
Rectangle rect = new Rectangle();
ListIterator children = f.getChildren().listIterator();
while (children.hasNext()) {
IFigure child = (IFigure) children.next();
// bug fix
if (isObservingVisibility() && !child.isVisible())
continue;
Rectangle r = (Rectangle) constraints.get(child);
if (r == null)
continue;
if (r.width == -1 || r.height == -1) {
Dimension preferredSize_ = child.getPreferredSize(r.width,
r.height);
r = r.getCopy();
if (r.width == -1)
r.width = preferredSize_.width;
if (r.height == -1)
r.height = preferredSize_.height;
}
rect.union(r);
}
Dimension d = rect.getSize();
Insets insets = f.getInsets();
return new Dimension(d.width + insets.getWidth(), d.height
+ insets.getHeight()).union(getBorderPreferredSize(f));
}
public void layout(IFigure parent) {
Iterator children = parent.getChildren().iterator();
Point offset = getOrigin(parent);
IFigure f;
while (children.hasNext()) {
f = (IFigure) children.next();
// bug fix
if (isObservingVisibility() && !f.isVisible())
continue;
Rectangle bounds = (Rectangle) getConstraint(f);
if (bounds == null)
continue;
if (bounds.width == -1 || bounds.height == -1) {
Dimension preferredSize_ = f.getPreferredSize(bounds.width,
bounds.height);
bounds = bounds.getCopy();
if (bounds.width == -1)
bounds.width = preferredSize_.width;
if (bounds.height == -1)
bounds.height = preferredSize_.height;
}
bounds = bounds.getTranslated(offset);
f.setBounds(bounds);
}
}
}