| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GetLeafTypes ( | 
|   internal[Type] root, | 
|   internal[Type] excludetype | 
| ) as structured[internal[Type]] id:Method_LibOpt_DialogConditionalTypes_GetLeafTypes | 
| { | 
|   #keys: '[143908.0.758167613]' | 
|   Body: | 
|   [* | 
|     // Get all leaf types of the 'root' type.  | 
|     // A type is a leaf type of some root type if the leaf type is non-abstract and if the type is an (indirect) subtype of the root type.  | 
|     // The 'excludetype' type (and all subclasses of that type) are excluded from the set of leaf types.   | 
|      | 
|     leafs := construct( structured[internal[Type]] ); | 
|      | 
|     // The LibOpt_Breakpoint type and all LibOpt_DatasetCopyConditionalNotSelectable subtypes (e.g. LibOpt_DatasetCopyUnconditional) are excluded because of this if-statement. | 
|     if( root <> excludetype ) | 
|     { | 
|       // recursion end: roottype is a leaf. | 
|       if( root.Specializations( relsize ) = 0 ) | 
|       { | 
|         leafs.Add( root ); | 
|       } | 
|       else | 
|       { | 
|         // recursive calls: the root's leafs are the union of its childrens' leafs: | 
|         traverse( root, Specializations, child ) | 
|         { | 
|           leafs := leafs.Union( this.GetLeafTypes( child, excludetype ) ); | 
|         } | 
|       } | 
|     } | 
|     return & leafs; | 
|   *] | 
|   ReturnsOwning: true | 
| } |