/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.gef.draw2d;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.draw2d.AbstractBorder;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
/**
* @author Frank Shaka
*/
public class MultiBorder extends AbstractBorder {
private List<Border> borders;
public MultiBorder() {
this.borders = Collections.emptyList();
}
public MultiBorder( Border singleBorder ) {
this.borders = Collections.singletonList( singleBorder );
}
public MultiBorder( List<Border> borders ) {
this.borders = new ArrayList<Border>( borders );
}
public MultiBorder( Border... borders ) {
this.borders = Arrays.asList( borders );
}
public List<Border> getBorders() {
return new ArrayList<Border>( borders );
}
/**
* @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
*/
public Insets getInsets( IFigure figure ) {
Insets ins = null;
for ( Border border : borders ) {
Insets i = ( border == null ) ? IFigure.NO_INSETS : border.getInsets( figure );
ins = ( ins == null ) ? new Insets( i ) : ins.getAdded( ins );
}
return ( ins == null ) ? new Insets() : ins;
}
private static final Dimension EMPTY = new Dimension();
public Dimension getPreferredSize( IFigure f ) {
Dimension prefSize = null;
for ( Border border : borders ) {
if ( prefSize != null ) {
Insets ins = getInsets( f );
prefSize.expand( ins.getWidth(), ins.getHeight() );
}
Dimension d = ( border == null ) ? EMPTY : border.getPreferredSize( f );
prefSize = ( prefSize == null ) ? new Dimension( d ) : prefSize.expand( d );
}
return ( prefSize == null ) ? new Dimension() : prefSize;
}
public boolean isOpaque() {
boolean opaque = false;
for ( Border border : borders ) {
opaque &= ( border == null ) ? false : border.isOpaque();
}
return opaque;
}
/**
* @see org.eclipse.draw2d.Border#paint(org.eclipse.draw2d.IFigure, org.eclipse.draw2d.Graphics, org.eclipse.draw2d.geometry.Insets)
*/
public void paint( IFigure figure, Graphics graphics, Insets insets ) {
for ( Border border : borders ) {
if ( border != null ) {
graphics.pushState();
border.paint( figure, graphics, insets );
graphics.popState();
insets = insets.getAdded( border.getInsets( figure ) );
}
}
}
}