/*******************************************************************************
* Copyright (c) 2000, 2010, 2012 IBM Corporation, Gerhardt Informatics Kft. 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
* Gerhardt Informatics Kft. - GEFGWT port
*******************************************************************************/
package org.eclipse.gef.internal.ui.palette.editparts;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
/**
* Special FlowLayout to display the palette in the columns view.
*
* @author Pratik Shah
*/
public class ColumnsLayout extends PaletteContainerFlowLayout {
private Dimension defaultConstraint = null;
private Dimension cachedConstraint = null;
/**
* Constructs a new layout
*/
public ColumnsLayout() {
super(true);
setMinorSpacing(0);
setMajorSpacing(0);
setStretchMinorAxis(true);
setDefaultConstraint(new Dimension(55, 55));
}
/**
* @see org.eclipse.draw2d.FlowLayout#getChildSize(IFigure, int, int)
*/
protected Dimension getChildSize(IFigure child, int wHint, int hHint) {
if (!(child instanceof SeparatorEditPart.SeparatorFigure)) {
Dimension hints = getMinimumHints(child, wHint, hHint);
int numOfColumns = (wHint + majorSpacing)
/ (hints.width + majorSpacing);
// numOfColumns = Math.min(numOfColumns,
// maxChildrenInRowWith(child));
if (numOfColumns == 0) {
wHint = hints.width;
} else {
wHint = (wHint - ((numOfColumns - 1) * majorSpacing))
/ numOfColumns;
}
hHint = hints.height;
}
return super.getChildSize(child, wHint, hHint);
}
/*
* Returns a dimension which has a width that is the greater of the
* following two: the default width (set on defaultConstraint), and the
* minimum width of the widest child.
*/
private Dimension getMinimumHints(IFigure figure, int wHint, int hHint) {
if (cachedConstraint == null) {
cachedConstraint = defaultConstraint.getCopy();
List children = figure.getParent().getChildren();
for (Iterator iter = children.iterator(); iter.hasNext();) {
IFigure child = (IFigure) iter.next();
Dimension childSize = (child instanceof PinnablePaletteStackFigure) ? ((PinnablePaletteStackFigure) child)
.getHeaderPreferredSize(cachedConstraint.width,
cachedConstraint.height) : child
.getPreferredSize(cachedConstraint.width,
cachedConstraint.height);
cachedConstraint.width = Math.max(cachedConstraint.width,
childSize.width);
}
cachedConstraint.height = hHint;
}
return cachedConstraint;
}
/**
* @see org.eclipse.draw2d.AbstractHintLayout#invalidate()
*/
public void invalidate() {
super.invalidate();
cachedConstraint = null;
}
/**
* For use by the palette
*
* @param d
* The constraints to be respected by the children of the figure
* that has this layout; Should not be <code>null</code>.
*/
public void setDefaultConstraint(Dimension d) {
defaultConstraint = d;
}
}