| Quintiq file version 2.0 | 
| #parent: #root | 
| Method SequenceNodes | 
| { | 
|   Description: 'Determine the sequence the nodes should be in.' | 
|   TextBody: | 
|   [* | 
|     rows := selectsortedset( this, UIGraphRow, row, true, row.RowNr() ); | 
|      | 
|     toprow := this.First(); | 
|     topnodes := selectsortedset( this, UIGraphNode, node, node.Row() = toprow.RowNr(), | 
|                                  -1 * counter( node.GetSubgraph(), Elements, n, not isnull( n.Component() ) ), | 
|                                  node.Name() ); | 
|      | 
|     tailrows := selectset( this, UIGraphRow, r, not isnull( r.Previous() ) ); | 
|      | 
|     nodes := construct( LibOpt_UIGraphNodes ); | 
|      | 
|     traverse( topnodes, Elements, topnode ) | 
|     { | 
|       if( toprow.UIGraphNode( relsize ) > 0 ) | 
|       { | 
|         // Calculate the position of the nodes | 
|         this.PositionNodes(); | 
|       } | 
|        | 
|       subgraph := topnode.GetSubgraph(); | 
|        | 
|       new := selectsortedset( subgraph.Difference( nodes ), Elements, node, true, | 
|                               -node.Row() ); | 
|       nodes := nodes.Union( subgraph ); | 
|       not_added := construct( LibOpt_UIGraphNodes ); | 
|        | 
|       // Interpolate desired X value from children | 
|       traverse( new, Elements, node ) | 
|       { | 
|         children := selectset( node, Outgoing, arc, not isnull( arc.Destination().UIGraphRow() ) ); | 
|         if( children.Size() > 0 ) | 
|         { | 
|           node.X( average( children, Elements, arc, arc.Destination().X() ) ); | 
|           node.UIGraphRow( relset, rows.Element( node.Row() ) ); | 
|         } | 
|         else | 
|         { | 
|           not_added.Add( node ); | 
|         } | 
|       } | 
|        | 
|       // Add the elements that were not added yet | 
|       traverse( not_added, Elements, node ) | 
|       { | 
|         node.UIGraphRow( relset, rows.Element( node.Row() ) ); | 
|         node.X( guard( node.UIGraphRow().Last().X() + 1, 0 ) ); | 
|       } | 
|        | 
|       // Sort top row | 
|       toprow.SortNodes( selectsortedset( toprow, UIGraphNode, node, | 
|                                          true, | 
|                                          node.X(), node.Name() ) ); | 
|        | 
|       // Sort top down | 
|       traverse( tailrows, Elements, row ) | 
|       { | 
|         row.SortTopDown(); | 
|       } | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |