/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.notation.uml.figure;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.FreeformLayout;
import org.eclipse.draw2d.FreeformViewport;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ScrollPane;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.teiid.designer.diagram.ui.figure.AbstractDiagramFigure;
import org.teiid.designer.diagram.ui.figure.ContainerFigure;
import org.teiid.designer.diagram.ui.model.DiagramModelNode;
import org.teiid.designer.diagram.ui.util.colors.ColorPalette;
/**
* UmlClassifierContainerFigure
*
* @since 8.0
*/
public class UmlClassifierContainerFigure extends AbstractDiagramFigure implements ContainerFigure {
private int numContainedItems = 0;
private static int ySpacing = 2;
private static int leftMargin = 5;
private Vector containedItems;
private int initialY = 0;
private ScrollPane scrollpane;
private IFigure pane;
private int stackOrderValue = 0;
/**
* Construct an instance of UmlClassifierContainerFigure.
*
*/
public UmlClassifierContainerFigure(DiagramModelNode diagramNode, ColorPalette colorPalette) {
super(colorPalette);
setDiagramModelNode(diagramNode);
init();
createComponent();
}
private void init() {
this.setBackgroundColor(getColor(ColorPalette.SECONDARY_BKGD_COLOR_ID));
initialY = ySpacing*2;
containedItems = new Vector();
scrollpane = new ScrollPane();
pane = new FreeformLayer();
pane.setLayoutManager(new FreeformLayout());
setLayoutManager(new StackLayout());
add(scrollpane);
scrollpane.setViewport(new FreeformViewport());
scrollpane.setContents(pane);
setOpaque(true);
}
private void createComponent() {
int maxWidth = 10;
int rectHeight = 10;
maxWidth = getMinimumWidth() + 20;
rectHeight = getMinimumHeight() + 20;
this.setSize(maxWidth, rectHeight);
layoutFigure();
}
@Override
public IFigure getContentsPane() {
return pane;
}
@Override
public void layoutFigure() {
numContainedItems = 0;
Collection items = new HashSet();
// This constainer should have attribute type children
// Reconcile
int currentY = initialY;
Figure nextLabel = null;
List childFigures = getContentsPane().getChildren();
Iterator iter = childFigures.iterator();
Object nextObject = null;
while( iter.hasNext() ) {
nextObject = iter.next();
if( !items.contains(nextObject) ) {
nextLabel = (Figure)nextObject;
nextLabel.setLocation(new Point(leftMargin, currentY) );
currentY += nextLabel.getBounds().height;
items.add(nextObject);
numContainedItems++;
}
}
containedItems = new Vector(items);
int minHeight = getMinimumHeight();
Dimension dim = new Dimension(getMinimumWidth(), minHeight);
if( getDiagramModelNode().isHeightFixed() ) {
dim.height = getDiagramModelNode().getFixedHeight(); //DiagramModelNode.DEFAULT_FIXED_HEIGHT;
}
this.setSize(dim.width, dim.height);
}
public int getMinimumWidth() {
int minimumWidth = 20;
Figure nextLabel = null;
for( int i=0; i<numContainedItems; i++ ) {
nextLabel = (Figure)containedItems.get(i);
minimumWidth = Math.max(minimumWidth, (nextLabel.getSize().width ) );
}
minimumWidth += leftMargin*3;
return minimumWidth;
}
public int getMinimumHeight() {
int minimumHeight = 10;
Figure nextLabel = null;
if(numContainedItems > 0 )
minimumHeight = initialY;
for( int i=0; i<numContainedItems; i++ ) {
nextLabel = (Figure)containedItems.get(i);
minimumHeight += nextLabel.getBounds().height;
}
minimumHeight += ySpacing*4;
return minimumHeight;
}
@Override
public void refreshFont() {
layoutFigure();
}
/**
* @return
*/
public int getStackOrderValue() {
return stackOrderValue;
}
/**
* @param i
*/
public void setStackOrderValue(int i) {
stackOrderValue = i;
}
}