package org.eclipse.uml2.diagram.common.compartments; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MarginBorder; import org.eclipse.draw2d.Shape; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gmf.runtime.common.core.util.StringStatics; import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure; import org.eclipse.gmf.runtime.draw2d.ui.figures.ConstrainedToolbarLayout; import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; public class U2TCompartmentFigure extends ResizableCompartmentFigure { private CenteredLine myTextPane; /** * XXX. we will set this flag immediately after super(); * This is because super() calls public method that we are going to override. */ private boolean myTextPaneReplaced; private String myTitle; public U2TCompartmentFigure(String name, IMapMode mapMode) { super(name, mapMode); ConstrainedToolbarLayout withStrecthMinorAxis = new ConstrainedToolbarLayout(); withStrecthMinorAxis.setStretchMinorAxis(true); setLayoutManager(withStrecthMinorAxis); int oldTextPaneIndex = getChildren().indexOf(super.getTextPane()); remove(super.getTextPane()); myTextPane = new CenteredLine(this); myTextPaneReplaced = true; add(myTextPane, oldTextPaneIndex); setTitle(name); setBorder(new MarginBorder(0, 0, 0, 0)); //sic } public void setFont(Font f) { getTextPane().setFont(f); } public void setFontColor(Color c) { //getTextPane().setForegroundColor(c); } @Override public Figure getTextPane() { if (!myTextPaneReplaced) { //HACK: this is called from super() //we would like to set our textPane instead //but setTextPane() is final in super class return super.getTextPane(); } return myTextPane; } @Override public void setSelected(boolean b) { //ignore, that gray borders are ugly } @Override public void setTitle(String title) { myTitle = title; } public String getTitleNotNull() { return myTitle == null ? StringStatics.BLANK : myTitle; } public Rectangle getTextPaneBounds() { return myTextPane.getBounds(); } private static class CenteredLine extends Shape { private static final int DEFAULT_HEIGHT = 10; private final U2TCompartmentFigure myHost; private int myLineBorderGap = 0; private Label myTextMeasure; public CenteredLine(U2TCompartmentFigure host) { myHost = host; myTextMeasure = new Label(); setFill(true); } @Override public void setFont(Font f) { super.setFont(f); } @Override public Dimension getMaximumSize() { return new Dimension(Integer.MAX_VALUE, getPreferredSize().width); } @Override public Dimension getPreferredSize(int wHint, int hHint) { Dimension result = new Dimension(wHint, DEFAULT_HEIGHT); String title = myHost.getTitleNotNull(); if (getFont() != null) { myTextMeasure.setFont(getFont()); myTextMeasure.setText(title); Dimension textSize = myTextMeasure.getPreferredSize(wHint, hHint); result.height = textSize.height; if (wHint == SWT.DEFAULT) { result.width = textSize.width; } } return result; } @Override public Dimension getMinimumSize(int wHint, int hHint) { Dimension result = new Dimension(-1, -1); String title = myHost.getTitleNotNull(); if (getFont() != null) { myTextMeasure.setFont(getFont()); myTextMeasure.setText(title); Dimension textSize = myTextMeasure.getMinimumSize(wHint, hHint); result.setSize(textSize); } return result; } @Override protected void outlineShape(Graphics graphics) { graphics.translate(getLocation()); // draw big horizontal line graphics.setLineWidth(getLineWidth()); graphics.setLineStyle(getLineStyle()); Rectangle localBounds = getBounds(); if (localBounds.width > 2 * myLineBorderGap) { final int lineY = localBounds.height / 2 - getLineWidth() / 2 + 1; graphics.drawLine(myLineBorderGap, lineY, localBounds.width - myLineBorderGap, lineY); } } @Override protected void fillShape(Graphics graphics) { // } public void setLineBorderGap(int lineBorderGap) { myLineBorderGap = lineBorderGap; } } }