Quintiq file version 2.0
#parent: CustomDrawComponentContainer/CustomDrawDataLayerLink
Response OnDrawObject (
  LibOpt_Link object
) id:Response_CustomDrawComponentContainer_CustomDrawDataLayerLink_OnDrawObject
{
  #keys: '[139164.3.980131598]'
  Body:
  [*
    scale_x := ValueHolderScaleX.Data();
    scale_y := ValueHolderScaleY.Data();
    
    // Fix issue that it thinks the Brush is already Black, but is actually White.
    // This prevents me from making the Brush black (as it thinks it is already Black).
    surface.Brush().Color( Color::White() );
    
    // Retrieve UI Color of Link
    color_string := object.TaskTransporter().UIColor();
    color := null( Color, owning );
    
    // Convert color code to Decimal, if its format is Hexadecimal
    if( color_string.SubString( 0, 1 ) = '#' )
    {
      color_num := LibOpt_Utility::GetColorFromHex( color_string.SubString( 1, color_string.Length() - 1 ) );
      color := Color::Color( color_num );
    }
    else
    {
      color := Color::Color( color_string );
    }
    
    // Set link color to grey, if the origin component cannot be called
    if( not object.GetOrigin().CanBeCalled() )
    {                               
      color := Color::Color( color, 0.5 );
    }  
    surface.Pen().Color( color );
    surface.Brush().Color( color );
    
    // Retrieve UI Style of Link
    style_string := object.TaskTransporter().UIStyle();
    style := PenSpecification::StyleNull();
    
    // Define the PenSpecification style depending on the UI Style of the Link
    if( style_string = 'Solid' )
    {
      style := PenSpecification::StyleSolid();
    }
    else if( style_string = 'Dashed' )
    {
      style := PenSpecification::StyleDashed();
    }
    else if( style_string = 'Dotted' )
    {
      style := PenSpecification::StyleDotted();
    }
    
    // Set the style of the Pen based on the PenSpecification style
    surface.Pen().Style( style );
    
    surface.Draw( shape );
    
    text := text.TrimBoth();
    if( text <> '' )
    {
      scale := minvalue( scale_x, scale_y );
      arrow_size := maxvalue( 3, 12 - maxvalue( 2, 2 / scale ) );
      arrow_size_x := [Number] ( arrow_size * scale / 2 / scale_x );
    
      // Get the relative X coordinate of the outgoing part
      x := object.First().First().X() - min( object, UIGraphArc.UIGraphArcPoint, p, p.X() - ifexpr( isnull( p.Next() ) and isnull( p.UIGraphArc().Next() ), arrow_size_x, 0 ) );
      
      origin := object.First().Origin()
      width := origin.Width() / ( origin.Outgoing( relsize ) + 1 );
      
      format := TextFormat::Construct();
      format.AlignCenter();
      format.AlignMiddle();
      
      surface.Fill( [Number] ( ( x - width / 2 ) * scale_x ),
                    0,
                    [Number] ( width * scale_x ),
                    [Number] ( 12 * scale_y ), Color::White() ); 
      
      surface.TextColor( color );
      surface.TextFit( [Number] ( ( x - width / 2 ) * scale_x ),
                       [Number] ( 2 * scale_y ),
                       [Number] ( width * scale_x ),
                       [Number] ( 10 * scale_y ),
                       text, 1, format );
    }
  *]
  CanBindMultiple: false
  DefinitionID: 'Responsedef_CustomDrawDataLayer_OnDrawObject'
}
