o
    vhY                     @   s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ ddlT ddlmZmZ ddlmZmZmZmZmZmZ ddlmZm Z  dd	lm!Z! dd
l"m#Z#m$Z$ ddl%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+ e,e)e*e+dZ-ddl.m/Z0 dddddddddd	dddddddddd	dZ1zddl2m3Z3 W n e4y   dZ3Y nw dddddddddd	Z5G d d! d!eZ6G d"d# d#Z7ed$d%d&d'Z8G d(d) d)e Z9eee9Z:G d*d+ d+e6Z;G d,d- d-e;Z<G d.d/ d/e<Z=eee=Z>dd0l?m@Z@ G d1d2 d2e@ZAG d3d4 d4e6ZBdS )5z3.3.0    )colors)simpleSplit)isNumberisNumberOrNoneOneOfisColorOrNoneisStringisTextAnchorisBoxAnchor	isBooleanNoneOrisInstanceOfisNoneOrStringisNoneOrCallableisSubclassOf)*)stringWidthgetAscentDescent)DrawingGroupCircleRectStringSTATE_DEFAULTS)Widget
PropHolder)
DirectDraw)XPreformattedFlowable)ParagraphStylePropertySet)TA_LEFTTA_RIGHT	TA_CENTER)startendmiddle   )	text2Pathnneesesswwnw)	r   -   Z            i  i;  xy)DirectDrawFlowableNr$   r%   r&   )	r/   r0   r.   r+   r*   r,   r)   r-   cc                
   @   sZ  e Zd ZdZed]i deedddeedddeedddeed	dd
eedddeedddeedddeedddeedddee	dddddddeedddeedddeeddd ee
d!dd"ee
d#dd$eed%dd&eeddd'eed(dd)eed*dd+eed,dd-eed.dd/eed0dd1eed2dd3eed4dd5eed6dd7eed8dd9eed:dd;eed<d=d>d?eeeed@dAd=d>dBeeeed@dCd=d>dDeeeeeefdEd=d>ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Z d\S )^LabelzA text label to attach to something else, such as a chart axis.

    This allows you to specify an offset, angle and many anchor
    properties relative to the label's origin.  It allows, for example,
    angled multiline axis labels.
    r8    descr9   dxzdelta x - offsetdyzdelta y - offsetanglezDangle of label: default (0), 90 is vertical, 180 is upside down, etc	boxAnchorzanchoring point of the labelboxStrokeColorzborder color of the boxboxStrokeWidthzborder widthboxFillColorzthe filling color of the box	boxTargetnormalantilohiz"one of ('normal','anti','lo','hi')	fillColorzlabel text colorstrokeColorzlabel text border colorstrokeWidthzlabel text border widthtextzthe actual text to displayfontNamezthe name of the font usedfontSizezthe size of the fontleadingwidthzthe width of the labelmaxWidthz#maximum width the label can grow toheightzthe height of the text
textAnchorz0the anchoring point of the text inside the labelvisible True if the label is to be drawn
topPaddingzpadding at top of boxleftPaddingzpadding at left of boxrightPaddingzpadding at right of boxbottomPaddingzpadding at bottom of boxuseAscentDescentz^If True then the font's Ascent & Descent will be used to compute default heights and baseline.customDrawChangerzDAn instance of CustomDrawChanger to modify the behavior at draw time   )r?   _advancedUsageddfNoneOrDirectDrawzA DirectDrawFlowable instanceddfKlassz=A Flowable class for direct drawing (default is XPreformattedddfStylez-A style or style class for a ddfKlass or Nonec                 K   s   | j d(i | | j d(i ddddddddddd	dd
ddddddddddddd dddd dd dd dd dd dd dtd dtd dtd dddd d!d"d#d$d%td&t| jd&d d't| jd'd  d S ))N_textzMulti-Line
StringrC   r;   rB   r   r8   r9   r@   rA   rY   rZ   r[   r\   rE         ?rD   rG   rH   rM   rF   rR   rS   rT   rU   rL   rP   rQ   rN   g?rV   r$   rW   r_   r]   Fra   rc   rd    )_setKeywordsr   r:   getattr	__class__)selfkwrg   rg   b/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/reportlab/graphics/charts/textlabels.py__init__M   s|   
	
zLabel.__init__c                 C   s
   || _ dS )zpSet the text property.  May contain embedded newline characters.
        Called by the containing chart or axis.N)re   )rk   rO   rg   rg   rm   setTextp   s   
zLabel.setTextc                 C   s   || _ || _dS )zSet the origin.  This would be the tick mark or bar top relative to
        which it is defined.  Called by the containing chart or axis.Nr7   )rk   r8   r9   rg   rg   rm   	setOriginv   s   
zLabel.setOriginc                 C   sl   t dd}|tdddtjd t }|dd d|_d|_d|_	d	|_
tj|_|d
 || |S )zyThis shows a label positioned with its top right corner
        at the top centre of the drawing, and rotated 45 degrees.   d   r2      )rL   r*   r1   r   izAnother
Multi-Line
String)r   addr   r   greenr<   rp   rC   rB   r@   rA   rD   ro   )rk   dlabrg   rg   rm   demo}   s   


z
Label.democ                 C   st   | j }|dv r8| j}t|d d d d }|d s0|| d }t|dkr0||dkr-dp.d }t|d	  | }|S )
z,hook for allowing special box anchor effects)autoxautoyih  g     F@r1   r2   rs   r   r6   )rC   rB   intabs_A2BA)rk   barB   nadarg   rg   rm   _getBoxAnchor   s   zLabel._getBoxAnchorc                 C   s>   | j rt| j| j\| _| _| j| j| j  | _d S d| _d S )Ng?)r]   r   rP   rQ   _ascent_descent_baselineRatiork   rg   rg   rm   _getBaseLineRatio   s   
zLabel._getBaseLineRatioc                 C   s   | j p
|| j | j | _| j| j | j | _| j| j | j | _| 	 }|dv r.| j | _
n|dv r:| j| j | _
nd| j | _
| j
| j | _|dv rS| j| j | _n|dv r\| j| _n| j d | _| j| j | _d S )N)r)   r*   r0   )r-   r.   r,   rf   )r*   r+   r,   )r0   r/   r.   )rU   rY   r\   _height_widthrZ   r[   _ewidth_eheightr   _top_bottom_left_right)rk   objHrC   rg   rg   rm   _computeSizeEnd   s    
zLabel._computeSizeEndc                    sh  t  dd }|sdg  _t j j j j _ js: j	 j
  _ jr9 fdd jD  _  jt j7  _n j _    jrJ j _n jrU j j  _n jd  _ jt j }nɈ jd u rmtdtd j j j jd} jstdi |}n/t jtr jjdi |}nt jtrt jtr jdi |}n
t dt j | _!    jrd	|_" j j |_n jrψ jn jd |_|j _ # } jpd
}|dkrt$|_%| j|d}|&|d
\}} jp|j'}t(| |_%| j|d  _)}|&|d
\}} js) j	 j
  _  j|j'7  _n j _ *| d S )Nrc   c                    s   g | ]
}t | j jqS rg   )r   rP   rQ   ).0liner   rg   rm   
<listcomp>   s    z%Label.computeSize.<locals>.<listcomp>333333?[DirectDrawFlowable class is not available you need the rlextra package as well as reportlabxlabel-generated)namerP   rQ   rL   rM   zddfStyle has invalid type Tr$   stylerg   )+ri   _lineWidthsr   re   rP   rQ   rT   _linesrS   rZ   r[   r   maxr   rR   _leadingr]   r   r   lenra   RuntimeErrordictrL   rM   rd   r   
isinstancer    clonetype
issubclass
ValueError_styleautoLeading_getTextAnchorr!   	alignmentwrap
_width_max_ta2al_ddfObjr   )rk   rc   r   stytaaWobj_rg   r   rm   computeSize   sp   



zLabel.computeSizec                 C   s   | j }|dkrt|   }|S )z/This can be overridden to allow special effectsboxauto)rV   _BA2TAr   )rk   r   rg   rg   rm   r      s   zLabel._getTextAnchorc                 C   s   | j }|pd| _ |   || _ t }|| j| j | j| j  || j	 t
| dd }|r2| j}n%| j| j| j  }|  }|dkrG| j}n|dkrT| j| jd  }n| j}| js`| jr{| jr{|t| j| j | j| j | j| j| j| j| jd |rt }||| j| j  || | j || |S | j| j | j!}}	}
| j"| j#| j}}}t
| di }|r| j$D ]}t%||||	|
|}||_||_"||_#|| ||8 }q|S | j$D ]}t&||||d}||_'|	|_ |
|_!||_|| ||8 }q|S )	Nr=   rc   r$   r&   rf   rM   rN   rL   	_svgAttrs)r   )(re   r   r   	translater8   r@   r9   rA   rotaterB   ri   r   r   r   r   r   r   r   rF   rD   rE   rt   r   rZ   r   r\   r   r   r   ra   r   rL   rP   rQ   rM   rN   r   
_text2Pathr   rV   )rk   re   grc   r8   r9   rV   g1rL   rP   rQ   rM   rN   rR   svgAttrsr   r-   rg   rg   rm   _rawDraw  sj   

	






zLabel._rawDrawc              	   C   sD   t | dd }|r|d|  z
|  W |d|  S |d|  w |  S )Nr^   TF)ri   r   )rk   r^   rg   rg   rm   drawD  s   
z
Label.drawNrg   )!__name__
__module____qualname____doc__AttrMapAttrMapValuer   r
   r   r   r   r   r	   r   r   r   r   r   r   r    r   _attrMaprn   ro   rp   rx   r   r   r   r   r   r   r   rg   rg   rg   rm   r<   !   s    		
"#D?r<   c                   @   sH  e Zd Zed i deedddeedddeedddeedddeedddeeddd	eeddd
eedddeedddeedddeedddeedddeedddeedddeedddeedddeedddeedddee	dddee
ddZdd Zdd Zdd ZdS )!LabelDecoratorr8   r=   r>   r9   r@   rA   rB   rC   rD   rE   rF   rL   rM   rN   r?   rP   rQ   rR   rS   rT   rU   rV   rW   rX   c                 C   s6   d| _ d| _| j D ]}t| |st| |d  qd S )Nr$   r/   )rV   rC   r   keyshasattrsetattrrk   arg   rg   rm   rn   g  s   zLabelDecorator.__init__c                 C   s>   |j \}}}}}}}	}
}}}}||jj|  || d S N)_callOutInforo   categoryAxiscategoryNamesrt   )rk   lLchartr   rowNocolNor8   r9   rS   rU   x00y00x0y0rg   rg   rm   decoratem  s   zLabelDecorator.decoratec                 C   sJ   t  }| j D ]\}}|d u rt||d }t||| q| || d S r   )r<   __dict__itemsri   r   r   )rk   r   r   r   vrg   rg   rm   __call__r  s
   zLabelDecorator.__call__Nrg   )r   r   r   r   r   r   r
   r   r   r	   r   r   rn   r   r   rg   rg   rg   rm   r   O  s^    	
r   highlowbaraxisc                   @   sL   e Zd ZeeeddeeddeeddeedddZdd Zd	d
 Z	dS )LabelOffsetzWhere to base +ve offsetr>   zValue for positive elementszWhere to base -ve offsetzValue for negative elements)posModeposnegModenegc                 C   s   d | _ | _d | _| _d S )Nr   r   )r   r   r   r   r   rg   rg   rm   rn     s   zLabelOffset.__init__c           
      C   s   |j }|j}|j}|dkr| j}| j}n| j}| j}|r |j}n|j}|rM|r+|j}	n|j}	|dkr;|	|j	 }|| S |dkrE|	}|| S |dkrM|	| }|| S )Nr   r   r   r   )
_flipXYr   joinAxisr   r   r   r   _x_y_length)
rk   r   valflipXYAjAmodedeltar   _vrg   rg   rm   	_getValue  s0   
zLabelOffset._getValueN)
r   r   r   r   r   isOffsetModer   r   rn   r   rg   rg   rg   rm   r   z  s    



r   c                   @   s.   e Zd ZeedZdd Zdd Zdd ZdS )	PMVLabelBASEc                 K   s   t j| fi | d| _d S Nr   )r<   rn   _pmvrk   kwdsrg   rg   rm   rn     s   
zPMVLabel.__init__c              
   C   s4   t | }| jdk rdddddddd	d
d	| }|S )Nr   r,   r-   r.   r+   r;   r/   r*   r)   r0   )	r0   r)   r*   r/   r;   r+   r.   r-   r,   )r<   r   r   r   rg   rg   rm   r     s   
&zPMVLabel._getBoxAnchorc                 C   s(   t | }| jdk rdddd| }|S )Nr   r%   r&   r$   )r$   r&   r%   )r<   r   r   r   rg   rg   rm   r     s   
zPMVLabel._getTextAnchorN)	r   r   r   r   r<   r   rn   r   r   rg   rg   rg   rm   r     s    r   c                   @   sj   e Zd ZdZeeeeddeeddee	ddee	ddee
ddeedd	d
dddddZdd ZdS )BarChartLabelF
    An extended Label allowing for nudging, lines visibility etc
    zNon-zero for a drawn liner>   zColor for a drawn linezNone or fixed draw ends +/-zNone or fixed draw starts +/-zNon-zero sign dependent nudgerH   rI   rJ   rK   midz(one of ('normal','anti','lo','hi','mid'))r   lineStrokeWidthlineStrokeColorfixedEnd
fixedStartnudgerG   c                 K   s4   t j| fi | d| _d | _d  | _| _d| _d S r   )r   rn   r  r  r  r  r  r   rg   rg   rm   rn     s
   
zBarChartLabel.__init__N)r   r   r   r   r   r   r   r   r   NoneOrInstanceOfLabelOffsetr   r   r   rn   rg   rg   rg   rm   r     s    





r   c                   @   s,   e Zd ZdZeeeedddZdd Z	dS )NA_Labelr   zText to be used for N/A valuesr>   )r   rO   c                 C   s   t |  d| _d S )Nzn/a)r   rn   rO   r   rg   rg   rm   rn        

zNA_Label.__init__N)
r   r   r   r   r   r   r   r   r   rn   rg   rg   rg   rm   r    s    
r  )CustomDrawChangerc                   @   s"   e Zd ZejfddZdd ZdS )RedNegativeChangerc                 C   s   t |  || _d S r   )r
  rn   rL   )rk   rL   rg   rg   rm   rn     r	  zRedNegativeChanger.__init__c                 C   s&   i }|j dr|j|d< | j|_|S )N-rL   )re   
startswithrL   )rk   r   Rrg   rg   rm   _changer  s
   
zRedNegativeChanger._changerN)r   r   r   r   redrn   r  rg   rg   rg   rm   r    s    r  c                   @   s"   e Zd ZdZeedZdd ZdS )XLabelz=like label but uses XPreFormatted/Paragraph to draw the _textr   c                 O   s:   t j| g|R i | |dt| _|d| j| _d S )Nrc   directDrawClass)r<   rn   popr   rc   ra   )rk   argsr   rg   rg   rm   rn     s   zXLabel.__init__Fc                 O   sL   | dt| _| dt}|d u rtd|| _tj| g|R i | d S )NflowableClassr  r   )r  r   _flowableClassr:   r   _ddfr<   rn   )rk   r  r   ra   rg   rg   rm   rn     s   c                 C   s$  g | _ td| j| j| j| jd }| _|   | jr%d|_	| j
| j |_n| jr+| jn| jd |_|j| _|  }| jp=d}|dkr[t|_| j| j|d}||d\}}| jpZ|j}t| |_| j| j|d | _}||d\}}| js| j| j | _|  j| jj7  _n| j| _| | d S )Nr   )rP   rQ   rL   rM   Tr   r   r$   r   )r   r   rP   rQ   rL   rM   r   r   r]   r   r   r   rR   r   r   rT   r!   r   r  re   r   r   r   _objrS   rZ   r[   r   r   )rk   r   r   r   r   r   r   rg   rg   rm   r     s8   

zXLabel.computeSizec                 C   s   | j }|pd| _ |   || _ t }|| j| j | j| j  || j	 | j
}| js2| jrM| jrM|t| j
| j | j| j | j| j| j| j| jd t }||| j| j  || | j || |S )Nr=   r   )re   r   r   r   r8   r@   r9   rA   r   rB   r   rF   rD   rE   rt   r   rZ   r   r\   r   r   r   r   r  r  )rk   re   r   r8   r   rg   rg   rm   r     s,   


zXLabel._rawDrawN)
r   r   r   r   r   r<   r   rn   r   r   rg   rg   rg   rm   r    s
    
r  )C__version__reportlab.libr   reportlab.lib.utilsr   reportlab.lib.validatorsr   r   r   r   r   r	   r
   r   r   r   r   r   r   reportlab.lib.attrmapreportlab.pdfbase.pdfmetricsr   r   reportlab.graphics.shapesr   r   r   r   r   r   reportlab.graphics.widgetbaser   r   r   reportlab.platypusr   r   reportlab.lib.stylesr   r    reportlab.lib.enumsr!   r"   r#   r   r   utilsr(   r   r~   rlextra.graphics.canvasadapterr:   ImportErrorr   r<   r   r   r   r  r   r   r  NoneOrInstanceOfNA_Labelreportlab.graphics.charts.utilsr
  r  r  rg   rg   rg   rm   <module>   sJ   <   0*&