@Override
  protected void markup(
      IDomNode node,
      final boolean breakAndAlign,
      final int clusterWidth,
      ITextFlow flow,
      ILayoutContext context) {

    Iterator<IDomNode> itor = node.treeIterator();
    Map<IDomNode, Integer> operatorNodes = Maps.newHashMap();
    IntegerCluster cluster = new IntegerCluster(clusterWidth);

    final LiteralHashElements access = grammarAccess.getLiteralHashAccess();
    final HashEntryElements hashAccess = grammarAccess.getHashEntryAccess();
    int previousKeyWidth = 0;
    while (itor.hasNext()) {
      IDomNode n = itor.next();
      EObject ge = n.getGrammarElement();
      if (ge == access.getLeftCurlyBracketKeyword_1()) {
        IDomNode nextLeaf = DomModelUtils.nextWhitespace(n);
        if (DomModelUtils.isWhitespace(nextLeaf) && breakAndAlign)
          nextLeaf.getStyles().add(StyleSet.withStyles(styles.oneLineBreak()));
      } else if (breakAndAlign) {
        if (ge == access.getCommaKeyword_2_1_0()) {
          IDomNode nextLeaf = DomModelUtils.nextWhitespace(n);
          if (DomModelUtils.isWhitespace(nextLeaf))
            nextLeaf.getStyles().add(StyleSet.withStyles(styles.oneLineBreak()));
        } else if (ge == hashAccess.getKeyLiteralNameOrStringParserRuleCall_0_0()) {
          DelegatingLayoutContext keyContext = new DelegatingLayoutContext(context);
          TextFlow keyFlow = new TextFlow(keyContext);
          ArrayList<IDomNode> children = Lists.newArrayList(n.getChildren());
          for (Iterator<IDomNode> subitor = children.iterator(); subitor.hasNext(); ) {
            IDomNode x = subitor.next();
            NodeType t = x.getNodeType();
            if (t == NodeType.ACTION || t == NodeType.WHITESPACE) {
              subitor.remove();
              continue;
            }
            break; // first non whitespace or action
          }
          feeder.sequence(children, keyFlow, context);
          previousKeyWidth = keyFlow.getWidthOfLastLine();
          cluster.add(previousKeyWidth);
          System.out.println("node= [" + keyFlow.getText() + "] width = " + previousKeyWidth);
        } else if (ge == hashAccess.getEqualsSignGreaterThanSignKeyword_1()) {
          operatorNodes.put(n, previousKeyWidth);
        }
      }
    }

    if (breakAndAlign) assignAlignmentAndWidths(operatorNodes, cluster);
  }
 private void assignAlignmentAndWidths(
     Map<IDomNode, Integer> operatorNodes, IntegerCluster cluster) {
   for (Entry<IDomNode, Integer> entry : operatorNodes.entrySet()) {
     int w = entry.getValue();
     entry
         .getKey()
         .getStyles()
         .add(
             StyleSet.withStyles(
                 styles.align(Alignment.right), styles.width(2 + cluster.clusterMax(w) - w)));
   }
 }