/**
* 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.factories;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
import org.eclipse.gmf.runtime.notation.Bounds;
import org.eclipse.gmf.runtime.notation.DecorationNode;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.gmf.runtime.notation.ShapeStyle;
import org.eclipse.gmf.runtime.notation.View;
import org.yakindu.sct.model.sgraph.Entry;
import org.yakindu.sct.model.sgraph.EntryKind;
import org.yakindu.sct.model.sgraph.Region;
import org.yakindu.sct.model.sgraph.SGraphFactory;
import org.yakindu.sct.model.sgraph.State;
import org.yakindu.sct.model.sgraph.Statechart;
import org.yakindu.sct.model.sgraph.Transition;
import org.yakindu.sct.ui.editor.DiagramActivator;
import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
import org.yakindu.sct.ui.editor.providers.SemanticHints;
/**
* Convenience methods for semantic and notation model element creation.
*
* @author muelder
*
*/
public final class FactoryUtils {
private static final String INITIAL_SPECIFICATION = "interface:\n// Define events and\n// and variables here";
private static final int INITIAL_REGION_WIDTH = 400;
private static final int INITIAL_REGION_HEIGHT = 400;
private static final String INITIAL_REGION_NAME = "main region";
private static final int INITIAL_TEXT_COMPARTMENT_X = 10;
private static final int INITIAL_TEXT_COMPARTMENT_Y = 10;
private static final int INITIAL_TEXT_COMPARTMENT_HEIGHT = 400;
private static final int INITIAL_TEXT_COMPARTMENT_WIDTH = 200;
private static final int SPACING = 10;
private FactoryUtils() {
}
/**
* Creates a Label view
*
* @param owner
* @param hint
* @return
*/
@SuppressWarnings("unchecked")
public static Node createLabel(View owner, String hint) {
DecorationNode nameLabel = NotationFactory.eINSTANCE.createDecorationNode();
nameLabel.setType(hint);
ShapeStyle style = NotationFactory.eINSTANCE.createShapeStyle();
style.setFontColor(FigureUtilities.RGBToInteger(ColorConstants.black.getRGB()));
nameLabel.getStyles().add(style);
ViewUtil.insertChildView(owner, nameLabel, ViewUtil.APPEND, true);
nameLabel.setLayoutConstraint(NotationFactory.eINSTANCE.createLocation());
return nameLabel;
}
/**
* Creates a Statechart with an initial Region and an initial State
*
* @return instanceof {@link Statechart}
*/
public static void createStatechartModel(Resource resource) {
createStatechartModel(resource, DiagramActivator.DIAGRAM_PREFERENCES_HINT);
}
/**
* Creates a Statechart with an initial Region and an initial State
*
* @return instanceof {@link Statechart}
*/
public static void createStatechartModel(Resource resource, PreferencesHint preferencesHint) {
// Create a statechart
Statechart statechart = SGraphFactory.eINSTANCE.createStatechart();
String lastSegment = resource.getURI().lastSegment();
String statechartName = lastSegment.substring(0, lastSegment.indexOf('.'));
statechart.setName(statechartName);
statechart.setSpecification(INITIAL_SPECIFICATION);
Diagram diagram = ViewService.createDiagram(statechart, StatechartDiagramEditor.ID, preferencesHint);
diagram.setElement(statechart);
// Add to resource
resource.getContents().add(statechart);
resource.getContents().add(diagram);
// Create an initial region
Region region = SGraphFactory.eINSTANCE.createRegion();
region.setName(INITIAL_REGION_NAME);
statechart.getRegions().add(region);
Node regionView = ViewService.createNode(diagram, region, SemanticHints.REGION, preferencesHint);
setRegionViewLayoutConstraint(regionView);
// // Create an initial state
Entry initialState = SGraphFactory.eINSTANCE.createEntry();
initialState.setKind(EntryKind.INITIAL);
region.getVertices().add(initialState);
Node initialStateView = ViewService.createNode(getRegionCompartmentView(regionView), initialState,
SemanticHints.ENTRY, preferencesHint);
setInitialStateViewLayoutConstraint(initialStateView);
// Create the first state
State state = SGraphFactory.eINSTANCE.createState();
state.setName("StateA");
region.getVertices().add(state);
Node stateNode = ViewService.createNode(getRegionCompartmentView(regionView), state, SemanticHints.STATE,
preferencesHint);
setStateViewLayoutConstraint(stateNode);
// Create the transition from Initial State to State
Transition transition = SGraphFactory.eINSTANCE.createTransition();
transition.setSource(initialState);
transition.setTarget(state);
initialState.getOutgoingTransitions().add(transition);
ViewService.createEdge(initialStateView, stateNode, transition, SemanticHints.TRANSITION, preferencesHint);
// Create the textcompartment for events / variables
Node textCompartment = ViewService.createNode(diagram, statechart, SemanticHints.STATECHART_TEXT,
preferencesHint);
setTextCompartmentLayoutConstraint(textCompartment);
}
private static void setStateViewLayoutConstraint(Node stateNode) {
Bounds bounds = NotationFactory.eINSTANCE.createBounds();
bounds.setX(40);
bounds.setY(80);
stateNode.setLayoutConstraint(bounds);
}
private static void setInitialStateViewLayoutConstraint(Node initialStateView) {
Bounds bounds = NotationFactory.eINSTANCE.createBounds();
bounds.setX(70);
bounds.setY(20);
initialStateView.setLayoutConstraint(bounds);
}
private static View getRegionCompartmentView(View regionView) {
return (View) regionView.getChildren().get(1);
}
private static void setTextCompartmentLayoutConstraint(Node textCompartment) {
Bounds bounds = NotationFactory.eINSTANCE.createBounds();
bounds.setX(INITIAL_TEXT_COMPARTMENT_X);
bounds.setY(INITIAL_TEXT_COMPARTMENT_Y);
bounds.setHeight(INITIAL_TEXT_COMPARTMENT_HEIGHT);
bounds.setWidth(INITIAL_TEXT_COMPARTMENT_WIDTH);
textCompartment.setLayoutConstraint(bounds);
}
private static void setRegionViewLayoutConstraint(Node regionView) {
Bounds bounds = NotationFactory.eINSTANCE.createBounds();
bounds.setX(INITIAL_TEXT_COMPARTMENT_WIDTH + INITIAL_TEXT_COMPARTMENT_X + SPACING);
bounds.setY(INITIAL_TEXT_COMPARTMENT_Y);
bounds.setHeight(INITIAL_REGION_HEIGHT);
bounds.setWidth(INITIAL_REGION_WIDTH);
regionView.setLayoutConstraint(bounds);
}
}