/******************************************************************************* * Copyright (c) 2010 Oak Ridge National Laboratory. * 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 ******************************************************************************/ package org.csstudio.swt.xygraph.toolbar; import org.eclipse.draw2d.AbstractLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Rectangle; /**Arrange children in multiple rows if necessary. * @author Xihui Chen * */ public class WrappableToolbarLayout extends AbstractLayout { @Override protected Dimension calculatePreferredSize(IFigure container, int hint, int hint2) { int width = hint; int height = hint2; if(width > 0){ int w =0; int h =0; int maxH=0; for(Object child : container.getChildren()){ IFigure figure = (IFigure)child; Dimension preferSize = figure.getPreferredSize(); if(w + preferSize.width < width){ w +=preferSize.width; if(maxH < preferSize.height){ maxH = preferSize.height; } } else { h+=maxH; maxH = preferSize.height; w = preferSize.width; } } h += maxH; if(height < 0) height = h; return new Dimension(width, height); }else{ // int w =0; int maxH = 0; for(Object child : container.getChildren()){ IFigure figure = (IFigure)child; Dimension preferSize = figure.getPreferredSize(); // w += preferSize.width; if(maxH < preferSize.height){ maxH = preferSize.height; } } if(height < 0) height = maxH; return new Dimension(width, height); } } @Override public void layout(IFigure container) { Rectangle clientArea = container.getClientArea(); int w = 0; int h = 0; int maxH =0; for(Object child : container.getChildren()){ IFigure figure = (IFigure)child; Dimension preferSize = figure.getPreferredSize(); if(w + preferSize.width < clientArea.width){ figure.setBounds(new Rectangle(clientArea.x + w, clientArea.y + h, preferSize.width, preferSize.height)); w += preferSize.width; if(maxH < preferSize.height){ maxH = preferSize.height; } }else{ h+=maxH; w=0; figure.setBounds(new Rectangle(clientArea.x + w, clientArea.y + h, preferSize.width, preferSize.height)); w = preferSize.width; maxH = preferSize.height; } } } }