blob: 30f766240db5d4508030eecab069bf5f409ba1b8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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.gef.internal.ui.palette.editparts;
import java.util.List;
import org.eclipse.draw2d.FlowLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
/**
* Extends <code>FlowLayout</code> to allow the pane of a pinnable stack in icon
* mode to occupy the row following the row in which the icon of the palette
* stack header appears.
*
* @author crevells
* @since 3.4
*/
public class PaletteContainerFlowLayout extends FlowLayout {
/**
* Constructs a PaletteContainerFlowLayout with horizontal orientation.
*/
public PaletteContainerFlowLayout() {
}
/**
* Constructs a PaletteContainerFlowLayout whose orientation is given in the
* input.
*
* @param isHorizontal
* <code>true</code> if the layout should be horizontal
*/
public PaletteContainerFlowLayout(boolean isHorizontal) {
setHorizontal(isHorizontal);
}
/**
* Overridden to include the size of the expanded pane of an expanded
* pinnable palette stack.
*
* @see org.eclipse.draw2d.AbstractLayout#calculatePreferredSize(IFigure,
* int, int)
*/
protected Dimension calculatePreferredSize(IFigure container, int wHint,
int hHint) {
Dimension prefSize = super.calculatePreferredSize(container, wHint,
hHint);
List children = container.getChildren();
IFigure child;
// Build the sizes for each row, and update prefSize accordingly
Dimension expandedPaneSize = null;
for (int i = 0; i < children.size(); i++) {
child = (IFigure) children.get(i);
if (child instanceof PinnablePaletteStackFigure
&& ((PinnablePaletteStackFigure) child).isExpanded()) {
// Subtract out the insets from the hints
if (wHint > -1)
wHint = Math.max(0, wHint
- container.getInsets().getWidth());
if (hHint > -1)
hHint = Math.max(0, hHint
- container.getInsets().getHeight());
// Figure out the new hint that we are interested in based on
// the
// orientation. Ignore the other hint (by setting it to -1).
// NOTE:
// The children of the parent figure will then be asked to
// ignore
// that hint as well.
if (isHorizontal()) {
hHint = -1;
} else {
wHint = -1;
}
expandedPaneSize = ((PinnablePaletteStackFigure) child)
.getExpandedContainerPreferredSize(wHint, hHint);
break; // there can only be one expanded stack
}
}
if (expandedPaneSize != null) {
// increment height to account for expanded stack
prefSize.height += transposer.t(expandedPaneSize).height;
prefSize.union(getBorderPreferredSize(container));
}
return prefSize;
}
/**
* Overridden to handle <code>PinnablePaletteStackFigure</code>.
*
* @see FlowLayout#getChildSize(IFigure, int, int)
*/
protected Dimension getChildSize(IFigure child, int wHint, int hHint) {
if (child instanceof PinnablePaletteStackFigure) {
return ((PinnablePaletteStackFigure) child).getHeaderPreferredSize(
wHint, hHint);
} else {
return child.getPreferredSize(wHint, hHint);
}
}
/**
* Overridden to include the size of the expanded pane of an expanded
* pinnable palette stack during the layout.
*
* @see FlowLayout#layoutRow(IFigure)
*/
protected void layoutRow(IFigure parent) {
int majorAdjustment = 0;
int minorAdjustment = 0;
int correctMajorAlignment = majorAlignment;
int correctMinorAlignment = minorAlignment;
majorAdjustment = data.area.width - data.rowWidth + getMinorSpacing();
switch (correctMajorAlignment) {
case ALIGN_LEFTTOP:
majorAdjustment = 0;
break;
case ALIGN_CENTER:
majorAdjustment /= 2;
break;
case ALIGN_RIGHTBOTTOM:
break;
}
int expandedPaneHeight = 0;
for (int j = 0; j < data.rowCount; j++) {
if (fill) {
data.bounds[j].height = data.rowHeight;
} else {
minorAdjustment = data.rowHeight - data.bounds[j].height;
switch (correctMinorAlignment) {
case ALIGN_LEFTTOP:
minorAdjustment = 0;
break;
case ALIGN_CENTER:
minorAdjustment /= 2;
break;
case ALIGN_RIGHTBOTTOM:
break;
}
data.bounds[j].y += minorAdjustment;
}
data.bounds[j].x += majorAdjustment;
IFigure child = data.row[j];
setBoundsOfChild(parent, data.row[j], transposer.t(data.bounds[j]));
if (child instanceof PinnablePaletteStackFigure
&& ((PinnablePaletteStackFigure) child).isExpanded()) {
int wHint = -1;
int hHint = -1;
if (isHorizontal())
wHint = parent.getClientArea().width;
else
hHint = parent.getClientArea().height;
expandedPaneHeight = ((PinnablePaletteStackFigure) child)
.getExpandedContainerPreferredSize(wHint, hHint).height;
child.setBounds(new Rectangle(data.area.x, data.area.y
+ data.rowY, data.area.width, data.rowHeight
+ expandedPaneHeight));
}
}
data.rowY += getMajorSpacing() + data.rowHeight + expandedPaneHeight;
initRow();
}
/**
* Overridden to set the bounds for <code>PinnablePaletteStackFigures</code>
* .
*
* @see FlowLayout#setBoundsOfChild(IFigure, IFigure, Rectangle)
*/
protected void setBoundsOfChild(IFigure parent, IFigure child,
Rectangle bounds) {
if (child instanceof PinnablePaletteStackFigure
&& ((PinnablePaletteStackFigure) child).isExpanded()) {
parent.getClientArea(Rectangle.SINGLETON);
bounds.translate(Rectangle.SINGLETON.x, Rectangle.SINGLETON.y);
((PinnablePaletteStackFigure) child)
.setHeaderBoundsLayoutHint(bounds);
} else {
super.setBoundsOfChild(parent, child, bounds);
}
}
}