/* * Copyright (c) 2005, 2007 Borland Software Corporation * * 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: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.internal.bridge.genmodel; import java.util.LinkedHashSet; import org.eclipse.gmf.codegen.gmfgen.DefaultSizeAttributes; import org.eclipse.gmf.codegen.gmfgen.FigureViewmap; import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory; import org.eclipse.gmf.codegen.gmfgen.ResizeConstraints; import org.eclipse.gmf.codegen.gmfgen.StyleAttributes; import org.eclipse.gmf.codegen.gmfgen.Viewmap; import org.eclipse.gmf.codegen.gmfgen.ViewmapLayoutType; import org.eclipse.gmf.gmfgraph.Canvas; import org.eclipse.gmf.gmfgraph.Compartment; import org.eclipse.gmf.gmfgraph.Connection; import org.eclipse.gmf.gmfgraph.DefaultSizeFacet; import org.eclipse.gmf.gmfgraph.DiagramElement; import org.eclipse.gmf.gmfgraph.DiagramLabel; import org.eclipse.gmf.gmfgraph.Dimension; import org.eclipse.gmf.gmfgraph.Direction; import org.eclipse.gmf.gmfgraph.Figure; import org.eclipse.gmf.gmfgraph.FlowLayout; import org.eclipse.gmf.gmfgraph.Layout; import org.eclipse.gmf.gmfgraph.LayoutRef; import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.gmfgraph.VisualFacet; import org.eclipse.gmf.gmfgraph.XYLayout; import org.eclipse.gmf.gmfgraph.util.GMFGraphSwitch; /** * @author artem */ public class DefaultViewmapProducer extends ViewmapProducer { private final LayoutTypeSwitch myLayoutTypeSwitch = new LayoutTypeSwitch(); protected final LinkedHashSet<String> myDependencies = new LinkedHashSet<String>(); public DefaultViewmapProducer() { myDependencies.add("org.eclipse.draw2d"); //$NON-NLS-1$ } public Viewmap create(Canvas canvasElement) { FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); v.setFigureQualifiedClassName("org.eclipse.draw2d.FreeformLayer"); return v; } public Viewmap create(Node node) { FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); v.setFigureQualifiedClassName("org.eclipse.draw2d.RoundedRectangle"); return v; } public Viewmap create(Connection link) { FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); v.setFigureQualifiedClassName("org.eclipse.gmf.runtime.draw2d.ui.figures.PolylineConnectionEx"); myDependencies.add("org.eclipse.gmf.runtime.draw2d.ui"); //$NON-NLS-1$ return v; } public Viewmap create(Compartment compartment) { FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); // ShapeCompartmentFigure | NestedResizableCompartmentFigure v.setFigureQualifiedClassName("XXX"); return v; } public Viewmap create(DiagramLabel label) { FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); v.setFigureQualifiedClassName("org.eclipse.draw2d.Label"); return v; } @Override public String[] dependencies() { return myDependencies.toArray(new String[myDependencies.size()]); } protected final void setupResizeConstraints(Viewmap viewmap, Node diagramNode){ Direction direction = diagramNode.getResizeConstraint(); if (direction == null || direction.getValue() == Direction.NSEW){ return; } ResizeConstraints constraints = GMFGenFactory.eINSTANCE.createResizeConstraints(); constraints.setResizeHandles(direction.getValue()); viewmap.getAttributes().add(constraints); } protected final void setupLayoutType(Viewmap viewmap, Node diagramNode){ Figure figure = diagramNode.getFigure().getActualFigure(); ViewmapLayoutType type = myLayoutTypeSwitch.getLayoutType(figure.getLayout()); viewmap.setLayoutType(type); } protected final void setupStyleAttributes(Viewmap viewmap, Figure figure){ if (viewmap == null || figure == null) { return; } StyleAttributes attributes = GMFGenFactory.eINSTANCE.createStyleAttributes(); boolean fixedSomething = false; if (figure.getFont() != null){ attributes.setFixedFont(true); fixedSomething = true; } if (figure.getForegroundColor() != null){ attributes.setFixedForeground(true); fixedSomething = true; } if (figure.getBackgroundColor() != null){ attributes.setFixedBackground(true); fixedSomething = true; } if (fixedSomething){ viewmap.getAttributes().add(attributes); } } /** * Intentionally limited to Node's. * It does not make sense to setup default size for labels, compartments, etc. */ protected final void setupDefaultSize(Viewmap viewmap, Node node) { Figure figure = node.getFigure().getActualFigure(); Dimension defaultSize; DefaultSizeFacet facet = findVF(node, DefaultSizeFacet.class); if (facet != null){ defaultSize = facet.getDefaultSize(); } else { defaultSize = figure.getPreferredSize(); } if (defaultSize != null){ DefaultSizeAttributes attributes = GMFGenFactory.eINSTANCE.createDefaultSizeAttributes(); attributes.setHeight(defaultSize.getDy()); attributes.setWidth(defaultSize.getDx()); viewmap.getAttributes().add(attributes); } } protected static <T extends VisualFacet> T findVF(DiagramElement de, Class<T> facetClass) { for (VisualFacet vf : de.getFacets()) { if (facetClass.isInstance(vf)) { return facetClass.cast(vf); } } return null; } private static class LayoutTypeSwitch extends GMFGraphSwitch<ViewmapLayoutType> { public ViewmapLayoutType getLayoutType(Layout layout){ if (layout == null) { return ViewmapLayoutType.UNKNOWN_LITERAL; } return doSwitch(layout instanceof LayoutRef ? ((LayoutRef) layout).getActual() : layout); } @Override public ViewmapLayoutType caseLayout(Layout object) { return ViewmapLayoutType.UNKNOWN_LITERAL; } @Override public ViewmapLayoutType caseFlowLayout(FlowLayout layout) { return layout.isForceSingleLine() ? ViewmapLayoutType.TOOLBAR_LAYOUT_LITERAL : ViewmapLayoutType.FLOW_LAYOUT_LITERAL; } @Override public ViewmapLayoutType caseXYLayout(XYLayout object) { return ViewmapLayoutType.XY_LAYOUT_LITERAL; } } }