/* * Copyright (c) 2006 Eclipse.org * * 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: * Dmitry Stadnik - initial API and implementation */ package org.eclipse.gmf.internal.bridge.ui.dashboard; import org.eclipse.draw2d.AbstractLayout; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.ImageFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MarginBorder; import org.eclipse.draw2d.PolygonDecoration; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.PointList; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; /** * @author dstadnik */ public class DashboardFigure extends RectangleFigure { private static final int LINE_WIDTH = 6; private static final int TEXT_GAP = LINE_WIDTH + 3; private static final int ARROW_LENGTH = 15; private static final Color DASHBOARD_BG = new Color(null, 113, 104, 209); private static final Color DASHBOARD_FG = new Color(null, 169, 164, 227); private static final Color MODEL_BG = ColorConstants.white; private ImageFigure logoFigure; private IFigure statusFigure; // models private ModelFigure dgmFigure; private ModelFigure gdmFigure; private ModelFigure dmFigure; private ModelFigure tdmFigure; private ModelFigure mmFigure; private ModelFigure gmFigure; // flows private FlowFigure dm2dgmFlow; private FlowFigure dm2gdmFlow; private FlowFigure dm2tdmFlow; private FlowFigure dm2mmFlow; private FlowFigure gdm2mmFlow; private FlowFigure tdm2mmFlow; private FlowFigure mm2gmFlow; // flow actions private FlowActionFigure dm2dgmFigure; private FlowActionFigure dm2gdmFigure; private FlowActionFigure dm2tdmFigure; private FlowActionFigure dm2mmFigure; private FlowActionFigure mm2gmFigure; public DashboardFigure() { add(logoFigure = new ImageFigure() { protected void paintFigure(Graphics graphics) { if (getImage() != null) { graphics.drawImage(getImage(), new Rectangle(getImage().getBounds()), getBounds()); } } }); Image logoImage = Plugin.getDefault().getImageRegistry().get(Plugin.GMF_LOGO_IMAGE); if (logoImage != null) { logoFigure.setImage(logoImage); } add(dgmFigure = createModelFigure(Messages.DashboardFigure_DGM, Plugin.DGM_ICON)); add(gdmFigure = createModelFigure(Messages.DashboardFigure_GDM, Plugin.GDM_ICON)); add(dmFigure = createModelFigure(Messages.DashboardFigure_DM, Plugin.DM_ICON)); add(tdmFigure = createModelFigure(Messages.DashboardFigure_TDM, Plugin.TDM_ICON)); add(mmFigure = createModelFigure(Messages.DashboardFigure_MM, Plugin.MM_ICON)); add(gmFigure = createModelFigure(Messages.DashboardFigure_GM, Plugin.GM_ICON)); add(dm2dgmFlow = createFlowFigure(true)); add(dm2gdmFlow = createFlowFigure(true)); add(dm2tdmFlow = createFlowFigure(true)); add(dm2mmFlow = createFlowFigure(true)); add(gdm2mmFlow = createFlowFigure(false)); add(tdm2mmFlow = createFlowFigure(false)); add(mm2gmFlow = createFlowFigure(true)); add(dm2dgmFigure = createFlowActionFigure()); add(dm2gdmFigure = createFlowActionFigure()); add(dm2tdmFigure = createFlowActionFigure()); add(dm2mmFigure = createFlowActionFigure()); add(mm2gmFigure = createFlowActionFigure()); add(statusFigure = new Figure()); statusFigure.setFont(JFaceResources.getBannerFont()); ToolbarLayout statusLayout = new ToolbarLayout(); statusLayout.setStretchMinorAxis(false); statusFigure.setLayoutManager(statusLayout); statusFigure.add(new Label()); statusFigure.add(new Label()); setLayoutManager(new DashboardLayout()); setBorder(new MarginBorder(10)); setBackgroundColor(DASHBOARD_BG); setForegroundColor(DASHBOARD_FG); } public ModelFigure getDGMFigure() { return dgmFigure; } public ModelFigure getGDMFigure() { return gdmFigure; } public ModelFigure getDMFigure() { return dmFigure; } public ModelFigure getTDMFigure() { return tdmFigure; } public ModelFigure getMMFigure() { return mmFigure; } public ModelFigure getGMFigure() { return gmFigure; } public FlowActionFigure getDM2DGMFigure() { return dm2dgmFigure; } public FlowActionFigure getDM2GDMFigure() { return dm2gdmFigure; } public FlowActionFigure getDM2TDMFigure() { return dm2tdmFigure; } public FlowActionFigure getDM2MMFigure() { return dm2mmFigure; } public FlowActionFigure getMM2GMFigure() { return mm2gmFigure; } public Label getStatusLine(int i) { return (Label) statusFigure.getChildren().get(i); } protected ModelFigure createModelFigure(String description, String iconKey) { ModelFigure modelFigure = new ModelFigure(); modelFigure.setDescription(description); Image image = Plugin.getDefault().getImageRegistry().get(iconKey); if (image != null) { modelFigure.setIcon(image); } modelFigure.setBackgroundColor(MODEL_BG); modelFigure.setForegroundColor(DASHBOARD_FG); modelFigure.setLineWidth(LINE_WIDTH); modelFigure.setSpacing(TEXT_GAP); return modelFigure; } protected FlowFigure createFlowFigure(boolean directed) { FlowFigure flowFigure = new FlowFigure(); if (directed) { PolygonDecoration decoration = new PolygonDecoration(); PointList template = new PointList(); template.addPoint(0, -LINE_WIDTH / 2); template.addPoint(0, LINE_WIDTH / 2); template.addPoint(-ARROW_LENGTH, LINE_WIDTH / 2 + 10); template.addPoint(-ARROW_LENGTH, -(LINE_WIDTH / 2 + 10)); decoration.setTemplate(template); decoration.setScale(1, 1); flowFigure.setTargetDecoration(decoration); } flowFigure.setForegroundColor(DASHBOARD_FG); flowFigure.setLineWidth(LINE_WIDTH); return flowFigure; } protected FlowActionFigure createFlowActionFigure() { FlowActionFigure flowActionFigure = new FlowActionFigure(); ToolbarLayout flowActionLayout = new ToolbarLayout(); flowActionLayout.setStretchMinorAxis(false); flowActionLayout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER); flowActionFigure.setLayoutManager(flowActionLayout); flowActionFigure.setBackgroundColor(MODEL_BG); flowActionFigure.setForegroundColor(DASHBOARD_FG); flowActionFigure.setLineWidth(LINE_WIDTH / 3); flowActionFigure.setBorder(new MarginBorder(TEXT_GAP / 2)); return flowActionFigure; } protected void outlineShape(Graphics graphics) { } private class DashboardLayout extends AbstractLayout { private static final int MAX_BOX_WIDTH = 300; private static final int BOX_SPACING = 20; protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) { Dimension d = getLayoutData().getSize(); Insets insets = container.getInsets(); d = new Dimension(d.width + insets.getWidth(), d.height + insets.getHeight()); return d.union(getBorderPreferredSize(container)); } public void layout(IFigure container) { getLayoutData().apply(container.getClientArea().getLocation()); } protected LayoutData getLayoutData() { Dimension dgmSize = dgmFigure.getPreferredSize(); dgmSize.width = Math.min(dgmSize.width, MAX_BOX_WIDTH); Dimension dmSize = dmFigure.getPreferredSize(); dmSize.width = Math.min(dmSize.width, MAX_BOX_WIDTH);; Dimension gdmSize = gdmFigure.getPreferredSize(); gdmSize.width = Math.min(gdmSize.width, MAX_BOX_WIDTH); Dimension tdmSize = gdmFigure.getPreferredSize(); tdmSize.width = Math.min(tdmSize.width, MAX_BOX_WIDTH); Dimension mmSize = mmFigure.getPreferredSize(); mmSize.width = Math.min(mmSize.width, MAX_BOX_WIDTH);; Dimension gmSize = gmFigure.getPreferredSize(); gmSize.width = Math.min(gmSize.width, MAX_BOX_WIDTH); Dimension dm2dgmSize = dm2dgmFigure.getPreferredSize(); Dimension dm2gdmSize = dm2gdmFigure.getPreferredSize(); Dimension dm2tdmSize = dm2tdmFigure.getPreferredSize(); Dimension dm2mmSize = dm2mmFigure.getPreferredSize(); Dimension mm2gmSize = mm2gmFigure.getPreferredSize(); LayoutData data = new LayoutData(); // boxes int dmY = gdmSize.height + BOX_SPACING; int dgmY = dmY + dmSize.height + BOX_SPACING; data.dgmBox = new Rectangle(0, dgmY, dgmSize.width, dgmSize.height); data.dm2dgmBox = new Rectangle((data.dgmBox.width - dm2dgmSize.width) / 2, dmY + (dmSize.height - dm2dgmSize.height) / 2, dm2dgmSize.width, dm2dgmSize.height); data.dmBox = new Rectangle(data.dm2dgmBox.x + data.dm2dgmBox.width + BOX_SPACING, dmY, dmSize.width, dmSize.height); int dm2tdmX = data.dmBox.x + (data.dmBox.width - dm2tdmSize.width) / 2; int gap1 = dm2tdmX - (data.dgmBox.x + data.dgmBox.width); if (gap1 < BOX_SPACING) { int delta = BOX_SPACING - gap1; data.dmBox.x += delta; dm2tdmX += delta; } data.dm2gdmBox = new Rectangle(data.dmBox.x + (data.dmBox.width - dm2gdmSize.width) / 2, (gdmSize.height - dm2gdmSize.height) / 2, dm2gdmSize.width, dm2gdmSize.height); data.gdmBox = new Rectangle(data.dm2gdmBox.x + data.dm2gdmBox.width + BOX_SPACING + ARROW_LENGTH, 0, gdmSize.width, gdmSize.height); int tdmY = data.dmBox.y + data.dmBox.height + BOX_SPACING; data.dm2tdmBox = new Rectangle(dm2tdmX, tdmY + (tdmSize.height - dm2tdmSize.height) / 2, dm2tdmSize.width, dm2tdmSize.height); data.tdmBox = new Rectangle(data.dm2tdmBox.x + data.dm2tdmBox.width + BOX_SPACING + ARROW_LENGTH, tdmY, tdmSize.width, tdmSize.height); data.dm2mmBox = new Rectangle(data.dmBox.x + data.dmBox.width + BOX_SPACING, data.dmBox.y + (data.dmBox.height - dm2mmSize.height) / 2, dm2mmSize.width, dm2mmSize.height); data.mmBox = new Rectangle(data.dm2mmBox.x + data.dm2mmBox.width + BOX_SPACING + ARROW_LENGTH, data.dmBox.y, mmSize.width, mmSize.height); int gmY = data.mmBox.y + data.mmBox.height + BOX_SPACING; data.mm2gmBox = new Rectangle(data.mmBox.x + data.mmBox.width + BOX_SPACING, data.mmBox.y + (data.mmBox.height - mm2gmSize.height) / 2, mm2gmSize.width, mm2gmSize.height); data.gmBox = new Rectangle(data.mm2gmBox.x - (gmSize.width - mm2gmSize.width) / 2, gmY, gmSize.width, gmSize.height); int gap2 = data.gmBox.x - (data.tdmBox.x + data.tdmBox.width); if (gap2 < BOX_SPACING) { int delta = BOX_SPACING - gap2; data.mm2gmBox.x += delta; data.gmBox.x += delta; } // points int pointsY = data.dmBox.y + data.dmBox.height / 2; data.dm2dgmPoints = new PointList(3); data.dm2dgmPoints.addPoint(data.dmBox.x, pointsY); data.dm2dgmPoints.addPoint(data.dm2dgmBox.x + data.dm2dgmBox.width / 2, pointsY); data.dm2dgmPoints.addPoint(data.dm2dgmBox.x + data.dm2dgmBox.width / 2, data.dgmBox.y); int pointsX = data.dmBox.x + data.dmBox.width / 2; data.dm2gdmPoints = new PointList(3); data.dm2gdmPoints.addPoint(pointsX, data.dmBox.y); data.dm2gdmPoints.addPoint(pointsX, data.dm2gdmBox.y + data.dm2gdmBox.height / 2); data.dm2gdmPoints.addPoint(data.gdmBox.x, data.dm2gdmBox.y + data.dm2gdmBox.height / 2); data.dm2tdmPoints = new PointList(3); data.dm2tdmPoints.addPoint(pointsX, data.dmBox.y + data.dmBox.height); data.dm2tdmPoints.addPoint(pointsX, data.dm2tdmBox.y + data.dm2tdmBox.height / 2); data.dm2tdmPoints.addPoint(data.tdmBox.x, data.dm2tdmBox.y + data.dm2tdmBox.height / 2); data.dm2mmPoints = new PointList(2); data.dm2mmPoints.addPoint(data.dmBox.x + data.dmBox.width, pointsY); data.dm2mmPoints.addPoint(data.mmBox.x, pointsY); int crossX = data.dm2mmBox.x + data.dm2mmBox.width / 2; data.gdm2mmPoints = new PointList(2); data.gdm2mmPoints.addPoint(crossX, data.gdmBox.y + data.gdmBox.height); data.gdm2mmPoints.addPoint(crossX, pointsY); data.tdm2mmPoints = new PointList(2); data.tdm2mmPoints.addPoint(crossX, data.tdmBox.y); data.tdm2mmPoints.addPoint(crossX, pointsY); data.mm2gmPoints = new PointList(3); data.mm2gmPoints.addPoint(data.mmBox.x + data.mmBox.width, pointsY); data.mm2gmPoints.addPoint(data.mm2gmBox.x + data.mm2gmBox.width / 2, pointsY); data.mm2gmPoints.addPoint(data.mm2gmBox.x + data.mm2gmBox.width / 2, data.gmBox.y); // logo and status int logoMaxWidth = data.dm2gdmBox.x - BOX_SPACING; int logoMaxHeight = data.dmBox.y - BOX_SPACING; Dimension logoSize = logoFigure.getPreferredSize(); if (logoSize.width > logoMaxWidth || logoSize.height > logoMaxHeight) { double scale = Math.min((double) logoMaxWidth / logoSize.width, (double) logoMaxHeight / logoSize.height); logoSize.width *= scale; logoSize.height *= scale; } data.logoBox = new Rectangle(0, 0, logoSize.width, logoSize.height); Dimension statusSize = statusFigure.getPreferredSize(); int statusX = Math.max(data.gmBox.x + data.gmBox.width - statusSize.width, data.gdmBox.x + data.gdmBox.width + BOX_SPACING); //int statusY = (data.mmBox.y - statusSize.height) / 2; data.statusBox = new Rectangle(statusX, 0, statusSize.width, statusSize.height); return data; } private class LayoutData { public Rectangle logoBox; public Rectangle statusBox; public Rectangle dgmBox; public Rectangle gdmBox; public Rectangle dmBox; public Rectangle tdmBox; public Rectangle mmBox; public Rectangle gmBox; public PointList dm2dgmPoints; public PointList dm2gdmPoints; public PointList dm2tdmPoints; public PointList dm2mmPoints; public PointList gdm2mmPoints; public PointList tdm2mmPoints; public PointList mm2gmPoints; public Rectangle dm2dgmBox; public Rectangle dm2gdmBox; public Rectangle dm2tdmBox; public Rectangle dm2mmBox; public Rectangle mm2gmBox; public void apply(Point offset) { logoFigure.setBounds(logoBox.getTranslated(offset)); statusFigure.setBounds(statusBox.getTranslated(offset)); dgmFigure.setBounds(dgmBox.getTranslated(offset)); gdmFigure.setBounds(gdmBox.getTranslated(offset)); dmFigure.setBounds(dmBox.getTranslated(offset)); tdmFigure.setBounds(tdmBox.getTranslated(offset)); mmFigure.setBounds(mmBox.getTranslated(offset)); gmFigure.setBounds(gmBox.getTranslated(offset)); dm2dgmFlow.setPoints(getTranslated(dm2dgmPoints, offset)); dm2gdmFlow.setPoints(getTranslated(dm2gdmPoints, offset)); dm2tdmFlow.setPoints(getTranslated(dm2tdmPoints, offset)); dm2mmFlow.setPoints(getTranslated(dm2mmPoints, offset)); gdm2mmFlow.setPoints(getTranslated(gdm2mmPoints, offset)); tdm2mmFlow.setPoints(getTranslated(tdm2mmPoints, offset)); mm2gmFlow.setPoints(getTranslated(mm2gmPoints, offset)); dm2dgmFigure.setBounds(dm2dgmBox.getTranslated(offset)); dm2gdmFigure.setBounds(dm2gdmBox.getTranslated(offset)); dm2tdmFigure.setBounds(dm2tdmBox.getTranslated(offset)); dm2mmFigure.setBounds(dm2mmBox.getTranslated(offset)); mm2gmFigure.setBounds(mm2gmBox.getTranslated(offset)); } private PointList getTranslated(PointList source, Point offset) { PointList target = new PointList(source.size()); target.addAll(source); target.translate(offset); return target; } public Dimension getSize() { Rectangle bounds = logoBox.getCopy(); bounds.union(statusBox); bounds.union(dgmBox); bounds.union(gdmBox); bounds.union(dmBox); bounds.union(tdmBox); bounds.union(mmBox); bounds.union(gmBox); return bounds.getSize(); } } } }