/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.semantics.ui.figures; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.geometry.Rectangle; import org.whole.lang.ui.figures.ContentPaneFigure; import org.whole.lang.ui.figures.EntityFigure; import org.whole.lang.ui.figures.FigureConstants; import org.whole.lang.ui.layout.Alignment; import org.whole.lang.ui.layout.OverColumnLayout; import org.whole.lang.ui.layout.RowLayout; /** * @author Riccardo Solmi */ public class FunctionApplicationFigure extends ContentPaneFigure { protected EntityFigure lf, rf; protected boolean asStageDown; public FunctionApplicationFigure() { super(new RowLayout().withSpacing(2).withMargin(2)); initContentPanes(4); lf = new EntityFigure( new OverColumnLayout().withMinorAlignment(Alignment.TRAILING).withSpacing(2)); lf.add(createContentPane(1)); lf.add(createContentPane(0)); add(lf); rf = new EntityFigure(new RowLayout().withSpacing(16).withMarginLeft(6).withMarginRight(6)); rf.add(createContentPane(2)); rf.add(createContentPane(3)); add(rf); } public void showNameAndStage(boolean nameValue, boolean stageValue) { lf.setVisible(nameValue | stageValue); getContentPane(0).setVisible(nameValue | stageValue); getContentPane(1).setVisible(stageValue); } public void showEnvironments(final boolean value) { getContentPane(3).setVisible(value); } public void showAsStageDown(boolean value) { if (asStageDown != value) { asStageDown = value; repaint(); } } protected void paintFigure(Graphics g) { super.paintFigure(g); if (asStageDown) { Rectangle b = getBounds(); g.setBackgroundColor(FigureConstants.hostLanguageColor); g.setForegroundColor(ColorConstants.lightGray); g.fillRectangle(b.x, b.y, b.width, b.height); g.drawRectangle(b.x, b.y, b.width-1, b.height-1); } Rectangle lfb = lf.getBounds(); Rectangle rfb = rf.getBounds(); int yTop = lf.isVisible() ? Math.min(lfb.y, rfb.y) : rfb.y; int yBottom = lf.isVisible() ? Math.max(lfb.bottom(), rfb.bottom()) - 1 : rfb.bottom() - 1; int xRight = rfb.right() - 1; g.setForegroundColor(ColorConstants.black); int hsize = 5; if (rfb.height > 100) { g.setLineWidth(3); hsize += 3; } g.drawLine(rfb.x, yTop, rfb.x+hsize, yTop); g.drawLine(rfb.x, yTop, rfb.x, yBottom); g.drawLine(rfb.x, yBottom, rfb.x+hsize, yBottom); g.drawLine(xRight-hsize, yTop, xRight, yTop); g.drawLine(xRight, yTop, xRight, yBottom); g.drawLine(xRight-hsize, yBottom, xRight, yBottom); int lgap = 2; int rgap = 2; if (rfb.height > 100) { g.setLineWidth(2); lgap += 2; rgap += 1; } g.drawLine(rfb.x+lgap, yTop, rfb.x+lgap, yBottom); g.drawLine(xRight-rgap, yTop, xRight-rgap, yBottom); } }