/*
* 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 org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.SimpleRaisedBorder;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.teiid.designer.diagram.ui.actions.ScaledFont;
import org.teiid.designer.diagram.ui.actions.ScaledFontManager;
/**
* @author blafond
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*
* @since 8.0
*/
public class UmlClassifierHeader extends RectangleFigure {
private Label stereotypeLabel;
private Label nameLabel;
private Label locationLabel;
private Color defaultBkgdColor;
private int nameFontStyle = ScaledFont.PLAIN_STYLE;
private int topInset = 4;
private int bottomInset = 4;
private int editIconSize = 16;
private int leftButtonSize = 0;
private boolean hasLeftButton = false;
private IFigure expandcontrol;
/**
*
*/
public UmlClassifierHeader(String stereotype, String name, String location, Image icon, Color fgdColor) {
super();
this.setForegroundColor(fgdColor);
init(stereotype, name, location, icon);
createComponent();
}
public void setDefaultBkgdColor(Color bkgdColor) {
defaultBkgdColor = bkgdColor;
this.setBackgroundColor(defaultBkgdColor);
}
private void init(String stereotype, String name, String location, Image icon) {
this.setBorder(new SimpleRaisedBorder());
if( hasLeftButton )
leftButtonSize = editIconSize;
else
leftButtonSize = 0;
if (stereotype != null) {
if (stereotypeLabel == null) {
stereotypeLabel = new Label(stereotype);
this.add(stereotypeLabel);
} else {
stereotypeLabel.setText(stereotype);
}
stereotypeLabel.setForegroundColor(ColorConstants.darkGray);
}
if (name != null) {
if (nameLabel == null) {
if( icon != null ) {
nameLabel = new Label(name);
nameLabel.setIcon(icon);
} else
nameLabel = new Label(name);
this.add(nameLabel);
} else {
nameLabel.setText(name);
}
nameLabel.setForegroundColor(ColorConstants.black);
}
if (location != null) {
if (locationLabel == null) {
locationLabel = new Label(location);
this.add(locationLabel);
} else {
locationLabel.setText(location);
}
locationLabel.setForegroundColor(ColorConstants.darkGray);
}
//Now Initialize Fonts and Sizes
refreshFont();
}
private void createComponent() {
this.setSize(getInitialMinimumSize());
layoutThisFigure();
}
public void layoutThisFigure() {
int centerX = leftButtonSize + (this.getSize().width - leftButtonSize) / 2;
int currentY = topInset;
if (stereotypeLabel != null) {
stereotypeLabel.setLocation(new Point(centerX - stereotypeLabel.getBounds().width / 2, currentY));
currentY += stereotypeLabel.getBounds().height + leftButtonSize/4;
}
if (nameLabel != null) {
nameLabel.setLocation(new Point(centerX - nameLabel.getBounds().width / 2, currentY));
currentY += nameLabel.getBounds().height;
}
if (locationLabel != null) {
locationLabel.setLocation(new Point(centerX - locationLabel.getBounds().width / 2, currentY));
currentY += nameLabel.getBounds().height;
}
currentY += bottomInset;
this.setSize(this.getSize().width, currentY);
}
public Dimension getInitialMinimumSize() {
int maxWidth = 10 + leftButtonSize;
if (stereotypeLabel != null)
maxWidth = Math.max(maxWidth, stereotypeLabel.getBounds().width + leftButtonSize);
if (nameLabel != null)
maxWidth = Math.max(maxWidth, nameLabel.getBounds().width + leftButtonSize);
if (locationLabel != null)
maxWidth = Math.max(maxWidth, locationLabel.getBounds().width + leftButtonSize);
maxWidth += 20;
int rectHeight = topInset + leftButtonSize/4;
if (nameLabel != null)
rectHeight += nameLabel.getBounds().height;
if (stereotypeLabel != null)
rectHeight += stereotypeLabel.getBounds().height;
if (locationLabel != null)
rectHeight += locationLabel.getBounds().height;
rectHeight += bottomInset;
return new Dimension( maxWidth, rectHeight);
}
@Override
protected boolean useLocalCoordinates() {
return true;
}
public Label getNameLabel() {
return nameLabel;
}
public IFigure getNameFigure() {
return nameLabel;
}
public void refreshName(String newName) {
init(null, newName, null, null);
createComponent();
}
public void refreshPath(String newPath) {
init(null, null, newPath, null);
createComponent();
}
private void setLabelSize(Label label) {
Font theFont = label.getFont();
int hanging = FigureUtilities.getFontMetrics(theFont).getDescent();
int labelWidth = FigureUtilities.getStringExtents(label.getText(), theFont).width;
if (label.getIcon() != null)
labelWidth += label.getIcon().getBounds().width + 30;
int labelHeight = FigureUtilities.getStringExtents(label.getText(), theFont).height + hanging;
label.setSize(labelWidth, labelHeight);
label.setPreferredSize(labelWidth, labelHeight);
}
public void refreshFont() {
// always run this; it may have changed since the last time layout was called...
Font smallerFont = getSmallerFont();
Font nameFont = ScaledFontManager.getFont(nameFontStyle);
if (stereotypeLabel != null) {
stereotypeLabel.setFont(smallerFont);
setLabelSize(stereotypeLabel);
}
if (nameLabel != null) {
nameLabel.setFont(nameFont);
setLabelSize(nameLabel);
}
if (locationLabel != null) {
locationLabel.setFont(smallerFont);
setLabelSize(locationLabel);
}
createComponent();
}
private Font getSmallerFont() {
return ScaledFontManager.getFont(ScaledFont.SMALLER_PLAIN_STYLE);
}
public void hiliteBackground(Color hiliteColor) {
if( hiliteColor == null )
this.setBackgroundColor(defaultBkgdColor);
else
this.setBackgroundColor(hiliteColor);
nameLabel.setForegroundColor(ColorConstants.black);
}
/**
* @param b
*/
public void setNameFontStyle(int style) {
nameFontStyle = style;
}
public void setLeftButton(boolean leftButton) {
this.hasLeftButton = leftButton;
if ( expandcontrol != null ) {
leftButtonSize = expandcontrol.getSize().width;
}
if( hasLeftButton ) {
leftButtonSize += editIconSize;
}
}
public void setExpandControl(IFigure expandcontrol) {
this.expandcontrol = expandcontrol;
if( hasLeftButton ) {
leftButtonSize = editIconSize + 3 + expandcontrol.getSize().width;
} else
leftButtonSize = expandcontrol.getSize().width;
}
@Override
public void paint(Graphics graphics) {
graphics.pushState();
graphics.setForegroundColor(getLocalBackgroundColor());
graphics.setBackgroundColor(getLocalForegroundColor());
graphics.fillGradient(this.getBounds(), true);
this.paintChildren(graphics);
graphics.popState();
graphics.restoreState();
}
}