Example: Implement a flowchart GMF editor using EuGENia


  • flowchart.emf
  • ECore2GMF.eol
  • FixGMFGen.eol
  • DiamondFigure.java
  • Get it!
@namespace(uri="flowchart", prefix="flowchart")
package flowchart;

@gmf.diagram(foo="bar")
class Flowchart {
   val Node[*] nodes;
   val Transition[*] transitions;
}

@gmf.node(label="name", label.icon="false")
abstract class Node {
   attr String name;
   ref Transition[*]#source outgoing;
   ref Transition[*]#target incoming;
}

@gmf.link(label="name", source="source", target="target", target.decoration="arrow")
class Transition {
   attr String name;
   ref Node#outgoing source;
   ref Node#incoming target;
}

class Subflow extends Flowchart, Node{
   
}

@gmf.node(figure=
  "org.eclipse.epsilon.eugenia.examples.flowchart.diagram.figures.SquareFigure")
class Action extends Node {
   
}

@gmf.node(figure=
  "org.eclipse.epsilon.eugenia.examples.flowchart.diagram.figures.DiamondFigure")
class Decision extends Node {
   
}
-- Set text of transitionLabel to empty string
var transitionLabel = GmfGraph!Label.
  selectOne(l|l.name='TransitionLabelLabel');
transitionLabel.text = '';

-- Add bold font to actionLabel
var actionLabel = GmfGraph!Label.
  selectOne(l|l.name='ActionLabelFigure');
actionLabel.font = new GmfGraph!BasicFont;
actionLabel.font.style = GmfGraph!FontStyle#BOLD.instance;

-- Add italic font to actionLabel
var decisionLabel = GmfGraph!Label.
  selectOne(l|l.name='DecisionLabelFigure');
decisionLabel.font = new GmfGraph!BasicFont;
decisionLabel.font.style = GmfGraph!FontStyle#ITALIC.instance;
var genPlugin = GmfGen!GenPlugin.all.first();

genPlugin.requiredPlugins.add('org.eclipse.epsilon.eugenia.examples.flowchart.diagram.figures');
package org.eclipse.epsilon.eugenia.examples.flowchart.diagram.figures;

import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;

public class DiamondFigure extends Figure {
  
  @Override
  public void paint(Graphics graphics) {
    
    Rectangle r = getBounds();
    
    // Define the points of a diamond
    Point p1 = new Point(r.x, r.y + r.height/2);
    Point p2 = new Point(r.x + r.width/2, r.y);
    Point p3 = new Point(r.x + r.width, r.y + r.height/2);
    Point p4 = new Point(r.x + r.width/2, r.y + r.height - 1);
    
    PointList pointList = new PointList();
    pointList.addPoint(p1);
    pointList.addPoint(p2);
    pointList.addPoint(p3);
    pointList.addPoint(p4);
    
    // Fill the shape
    graphics.fillPolygon(pointList);
    
    // Draw the outline
    graphics.drawLine(p1, p2);
    graphics.drawLine(p2, p3);
    graphics.drawLine(p3, p4);
    graphics.drawLine(p4, p1);
    
    // Move the label to the centre of the diamond
    WrappingLabel label = (WrappingLabel) getChildren().get(0);
    LayoutUtil.moveToCenter(label, this, graphics);
    label.paint(graphics);
    
  }
  
}

There are two ways to get the code of this example:

  1. download the following zip archive(s), extract them and import them as new Eclipse projects
  2. or check out the code from the SVN
    • go to the SVN repository
    • navigate to trunk/examples
    • check out the org.eclipse.epsilon.eugenia.examples.flowchart project
    • check out the org.eclipse.epsilon.eugenia.examples.flowchart.diagram.figures project