blob: 37ceb2f63d8d99c18969b1821e5e66dea7d78732 [file] [log] [blame]
/*
* 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;
}
}
}