/** * Copyright (c) 2010 committers of YAKINDU and others. * 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 * Contributors: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.ui.editor.editor.figures; import static org.yakindu.sct.ui.editor.editor.figures.utils.GraphicsUtil.fillVerticalGradientRoundedRectangle; import static org.yakindu.sct.ui.editor.editor.figures.utils.GraphicsUtil.mixColor; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.GridLayout; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.RoundedRectangle; import org.eclipse.draw2d.StackLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel; import org.eclipse.gmf.runtime.draw2d.ui.mapmode.IMapMode; import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil; import org.eclipse.swt.graphics.Color; import org.yakindu.base.xtext.utils.gmf.figures.HighlightingWrappingLabel; import org.yakindu.sct.ui.editor.editor.figures.utils.GridDataFactory; /** * * @author andreas muelder * @author axel terfloth * */ public class StateFigure extends RoundedRectangle { public static final int BLUR_SHADOW_WIDTH = 5; private WrappingLabel nameFigure; private Figure textCompartmentPane; private Figure figureCompartmentPane; public StateFigure(IMapMode mapMode) { GridLayout layout = new GridLayout(1, false); layout.verticalSpacing = 0; layout.horizontalSpacing = 0; layout.marginHeight = 3; layout.marginWidth = 3; this.setLayoutManager(layout); this.setCornerDimensions(new Dimension(mapMode.DPtoLP(15), mapMode .DPtoLP(15))); this.setOutline(true); createContents(); } protected void createContents() { // Name Label nameFigure = new HighlightingWrappingLabel(); nameFigure.setAlignment(PositionConstants.CENTER); this.add(nameFigure, GridDataFactory.fillDefaults().grab(true, false) .getData()); // Text compartment textCompartmentPane = new Figure(); textCompartmentPane.setLayoutManager(new StackLayout()); this.add(textCompartmentPane, GridDataFactory.fillDefaults().grab(true, true).getData()); figureCompartmentPane = new Figure(); figureCompartmentPane.setLayoutManager(new StackLayout()); this.add(figureCompartmentPane, GridDataFactory.fillDefaults().grab(true, true).getData()); } public WrappingLabel getNameFigure() { return nameFigure; } public Figure getTextCompartmentPane() { return textCompartmentPane; } public Figure getFigureCompartmentPane() { return figureCompartmentPane; } @Override public Dimension getPreferredSize(int wHint, int hHint) { Dimension result = super.getPreferredSize(wHint, hHint); return new Dimension(result.width + BLUR_SHADOW_WIDTH, result.height + BLUR_SHADOW_WIDTH); } @Override public void setBounds(Rectangle rect) { // reduce the width and height with the blur shadow super.setBounds(new Rectangle(rect.x, rect.y, rect.width - BLUR_SHADOW_WIDTH, rect.height - BLUR_SHADOW_WIDTH)); } // ========= drawing related methods ============================ @Override public void paintFigure(Graphics graphics) { drawBlurredShadow(graphics); super.paintFigure(graphics); } /** * Fill the shape with a vertical color gradient. The gradient mixes a white * into the configured background color. */ @Override protected void fillShape(Graphics graphics) { Color c = mixColor(getBackgroundColor(), ColorConstants.white, 224); fillVerticalGradientRoundedRectangle(graphics, getBounds(), getCornerDimensions(), getBackgroundColor(), c); c.dispose(); } private void drawBlurredShadow(Graphics graphics) { // draw the shadow... graphics.pushState(); int size = MapModeUtil.getMapMode(this).DPtoLP(BLUR_SHADOW_WIDTH); int step = MapModeUtil.getMapMode(this).DPtoLP(-1); graphics.setForegroundColor(ColorConstants.gray); graphics.setLineWidth(MapModeUtil.getMapMode(this).DPtoLP(2)); graphics.translate(size, size); graphics.setClip(graphics.getClip(new Rectangle(getBounds())).expand( size, size)); graphics.setAlpha(20); outlineShape(graphics); graphics.translate(step, step); graphics.setAlpha(30); outlineShape(graphics); graphics.translate(step, step); graphics.setAlpha(60); outlineShape(graphics); graphics.translate(step, step); graphics.setAlpha(100); outlineShape(graphics); graphics.translate(step, step); graphics.setAlpha(150); outlineShape(graphics); graphics.popState(); } }