U
    '1e0                 	   @   s  d Z dZdZddlmZmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlm Z m!Z! ddlm"Z" ddl#m$Z$ ddddddZ%ddddddZ&G dd de	Z'G dd dZ(dd Z)dd Z*dd Z+dXd!d"Z,ej-fd#d$Z.d%d& Z/d'd( Z0d)d* Z1dej-fd+d,Z2G d-d. d.e3Z4G d/d0 d0e3Z5e$d1d2Z6e$d3d4Z7d5Z8G d6d7 d7eZ9d8d9d9d:d;d<d=d>d?Z:G d@dA dAe9Z;e<e:= Z>G dBdC dCZ?dDdE Z@dFdG ZAe(dHdIdJdKejBfdLgZCe(dMdIdJdNejBfdLgZDe(dOdIdJdKejBfdMdIdJdejBfdPdIdQdejBfdRdIdSdejBfdLgZEe(dOdIdJdKejBfdMdIdJdejFfdPdIdQdejBfdRdIdSdejBfdLgZGe(dTdIdQdejHfdTdUdJdKejBfdPdSdJdejHfdLgZIeJdVkrddWlKmLZL eL  dS )Y)Table
TableStyle	CellStyle	LongTablez3.5.21a  
Tables are created by passing the constructor a tuple of column widths, a tuple of row heights and the data in
row order. Drawing of the table can be controlled by using a TableStyle instance. This allows control of the
color and weight of the lines (if any), and the font, alignment and padding of the text.

None values in the sequence of row heights or column widths, mean that the corresponding rows
or columns should be automatically sized.

All the cell values should be convertible to strings; embedded newline '\n' characters
cause the value to wrap (ie are like a traditional linefeed).

See the test output from running this module as a script for a discussion of the method for constructing
tables and table styles.
    )FlowablePreformatted)	rl_config)PropertySetParagraphStyle_baseFontName)colors)annotateExceptionIdentStrflattenisStrasNativestrTypes	__UNSET__)isListOfNumbersOrNone)fp_str)ABagstringWidth)IndenterNullActionFlowable)
LIIndenter)
namedtupleN      )NZbuttroundZ
projectingZsquared)NZmiterZmitrer   Zbevelc                   @   sX   e Zd ZeZdZdZdZdZdZ	dZ
dZdZdZdZd	Zd
Zd
ZdddZdddZd
S )r   
            r   blackLEFTZwhiteBOTTOMNc                 C   s   || _ |d k	r||  d S N)namecopy)selfr(   parent r,   =/tmp/pip-unpacked-wheel-109iniqw/reportlab/platypus/tables.py__init__9   s    zCellStyle.__init__c                 C   sB   |d krt | j}t| D ]"}|dr*qt||t| | q|S )N_)r   r(   dir
startswithsetattrgetattr)r*   resultr(   r,   r,   r-   r)   =   s    

 zCellStyle.copy)N)N)__name__
__module____qualname__r   fontnamefontsizeleadingleftPaddingrightPadding
topPaddingbottomPaddingZfirstLineIndentcolor	alignmentZ
backgroundvalignhrefdestinationr.   r)   r,   r,   r,   r-   r   *   s    
r   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )r   Nc                 K   sp   |rD|  d d  }|j| _dD ] }t||r t| |t|| q ng }|t|pRg  | _i | _| j| d S )NspaceBefore
spaceAfter)getCommands_optshasattrr2   r3   list_cmdsupdate)r*   cmdsr+   kwZpcmdsar,   r,   r-   r.   F   s    
zTableStyle.__init__c                 G   s   | j | d S r'   )rK   append)r*   cmdr,   r,   r-   addV   s    zTableStyle.addc                 C   s   dd tt| j S )Nz!TableStyle(
%s
) # end TableStylez  
)joinmapreprrK   r*   r,   r,   r-   __repr__X   s    zTableStyle.__repr__c                 C   s   | j S r'   )rK   rV   r,   r,   r-   rG   Z   s    zTableStyle.getCommands)NN)r5   r6   r7   r.   rR   rW   rG   r,   r,   r,   r-   r   E   s   
r   c                 C   s   t | ttf rdpt| S Nr   )
isinstancetuplerJ   len)xr,   r,   r-   _rowLen]   s    r]   c                 C   s\  g }|j }g }|j }g }|j }|}d }	}
| D ]}t|trt| }|sZd}|
d7 }
q|drt|dd }|	|7 }	|t| q|dkr|t| qt|}||8 }n|dkr|
d7 }
n||8 }|| q.td|}|td|	 }|D ] }||  |9  < ||| 8 }qtd|}t|}|rX|
dkr@|| pBd}|D ]}|||< qH|S )	a  check list V for percentage or * values
    1) absolute values go through unchanged
    2) percentages are used as weights for unconsumed space
    3) if no None values were seen '*' weights are
    set equally with unclaimed space
    otherwise * weights are assigned as None        Nr   %*g      Y@r   )	rP   rY   r   strstripendswithfloatr[   max)VZavailRrIiJjswnvfmr,   r,   r-   _calc_pc`   sL    







rt   c                 C   sZ  |dkr| S d| d d | d d   d| d d | d d   f}d| d d | d d   d| d d | d d   f}d| d d | d d   d| d d | d d   f}d|d |d   d|d |d   f}d|d |d   d|d |d   f}d|d |d   d|d |d   f}|dkrF| d |||gS |||| d gS dS )zVcalculate all or half of a bezier curve
    kind==0 all, 1=first half else second halfr         ?r   r   r#   Nr,   )PkindZQ0ZQ1ZQ2R0R1ZS0r,   r,   r-   _calcBezierPoints   s    888(((rz   
left-rightW[?c                 C   s  || }| dkrN|dkrN|\}}	|| |	f|| |	f||	| f||	| fg}
n| dkr|dkr|\}}||| f||| f|| |f|| |fg}
n| dkr|dkr|\}}|| |f|| |f||| f||| fg}
n\| dkr$|dkr$|\}}	||	| f||	| f|| |	f|| |	fg}
nt d| |f|dkrZ|
d d |
d d ks~|d	kr|
d d
 |
d d
 kr|
  t|
|}
|
S )Nrightbottomtopleftz&Unknown quadrant position (xpos,ypos)=r{   r   r`   
bottom-topr   )
ValueErrorreverserz   )xposyposZcornerri   rw   	directionrs   tZxhiZylorv   ZyhiZxlor,   r,   r-   _quadrantDef   s$    ....H
r   c                 C   s   |r| |d}|r<||d d | ks<||d d | krL| |||| nd}t|}||| k r||k r|| \}}	|	|| ks||| kr|d7 }qXt||}
t||	}|
|kr| |||
| |}qX||| k r| |||| dS )z
    Draw horizontal lines; do not draw through regions specified in hBlocks
    This also serves for vertical lines with a suitable canvLine
    Nr`   r   r   )getr[   rf   min)canvLinescpecpyhBlocksFUZZrk   rp   x0x1Zi0i1r,   r,   r-   _hLine   s$     ,

  r   c                 C   s@   d|d  | }||7 }t |D ]}|| ||| ||8 }q d S )Nru   r   )range)r   r   r   r   wscountoffsetidxr,   r,   r-   
_multiLine   s
    r   c              	   C   sz   z
||  W S  t k
rZ   z.t| }||  kr8|krFn n
|W  Y S W n   Y nX Y nX td| d|  d|dS )zLprivate converter tries map(value) low<=int(value)<=high or finally an errorzBad z value z in N)KeyErrorintr   )valuerT   lowhighr(   rQ   Zivaluer,   r,   r-   _convert2int   s    
 r   c                 C   s    z|  |W S    Y dS X d S Nr   )rd   )objrn   r,   r,   r-   	_endswith   s    r   c                    s   i  |st }ttdd | D D ]\}\}}||kr@q*|d7 }t fddt||D }||| krtq*fddt||D }	|	sq*||8 }|tt |	 }|	D ]}
 |
d|  |
< qq*  D ]\}
}|
  |7  < qd S )Nc                 s   s   | ]\}}||fV  qd S r'   r,   ).0ZikZivr,   r,   r-   	<genexpr>   s     zspanFixDim.<locals>.<genexpr>r   c                    s    g | ]}|   |d  qS r   )r   r   r\   )Mrg   r,   r-   
<listcomp>   s     zspanFixDim.<locals>.<listcomp>c                    s   g | ]} | d kr|qS r'   r,   r   )V0r,   r-   r      s      r   )r[   reversedsorteditemssumr   re   r   )r   rg   spanConslimr   rq   r   r   r   Xr\   r,   )r   rg   r   r-   
spanFixDim   s&     &   r   c                   @   s   e Zd ZdS )_ExpandedCellTupleN)r5   r6   r7   r,   r,   r,   r-   r      s   r   c                   @   s   e Zd Zdd ZdS )_ExpandedCellTupleExc                 C   s"   t | |}||_||_||_|S r'   )rZ   __new__tagTypealtTextextras)clsseqr   r   r   r*   r,   r,   r-   r      s
    z_ExpandedCellTupleEx.__new__N)r5   r6   r7   r   r,   r,   r,   r-   r      s   r   ZRoundingRectDefszx0 y0 w h x1 y1 ar SLRoundingRectLinez&xs ys xe ye weight color cap dash join)
splitfirst	splitlastinrowsplitstartinrowsplitendc                   @   s  e Zd ZddddddddddddddddddedfddZdd Zdd	 ZdmddZdd Zdd Z	dnddZ
doddZdpddZdd ZdqddZdd Zdd Zdrd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dsdJdKZ&dtdMdNZ'dudOdPZ(dvdQdRZ)dSdT Z*dwdUdVZ+dWdX Z,dxdYdZZ-d[d\ Z.e/e.Z.dyd]d^Z0d_d` Z1e2j3fdadbZ4dcdd Z5dedf Z6dgdh Z7didj Z8dkdl Z9dS )zr   Nr   r   c           !   
   C   s&  |
| _ |pd| _|pd| _t|ttfs8td|   || _t	| | _
}g | _t|ttf}t|ttf}|rtttt| | _}n|r|rt	|}nd}|	stj}	|d krt| dtjn|| _|r|st|	dkrt|   dn|	dkrHt| _d	tt  kr*td	atjt_tjt_t | d
| jj!||f t n(|	dkrZt"| _nt| #  d|	d S |r|| _n| $| | _}|s||g }nt	||kr$tj%rt|trt	|}||k r|| |d g ||d < n|d | }n"t|   d| dt	| d|s6||g }n0t	||krft|   d| dt	| dt&|D ]l\}}t	|}||krntj%rt|tr|| dg ||d < n$t|   d| d| d| dqn| | _'| _(| | _)| _*|d krNg }t+|D ]:}g }t+|D ]}|,t-t.||f q|,| q
|| _/n|| _/g | _0g | _1g | _2g | _3g | _4g | _5|| _6|| _7|| _8|| _9|r| :| |t;k	r| <| || _=|d k	r|| _>|d k	r|| _?|d krt	|} | stdn | |k r|||  |d  }|| _@d S )NCENTERMIDDLEz%s invalid data typer   _longTableOptimizeerrorz$ must have at least a row and columnZindicate_emptyTableStylez	%s(%d,%d)ignorez bad emptyTableAction: r`   z data error - z columns in data but z column widthsz rows in data but z row heights z
 expected z not z columns in row !zJ{self.idenity()} Supplied mismatching minimum row heights of length {lmrh}r   )AidenthAlignvAlignrY   rZ   rJ   r   identity	_renderCBr[   _nrows_cellvaluesrf   rT   r]   _ncolsr   emptyTableActionr3   longTableOptimizer   r   	__class__globalskeysr
   r   r   redZ	textColorZyellowZ	backColorr.   r5   r   Z	identitiynormalizeDataZallowShortTableRows	enumerate_rowHeights_argH
_colWidths_argWr   rP   r   rU   _cellStyles_bkgrndcmds	_linecmds	_spanCmds_nosplitCmds	_srflcmds_sircmds
repeatRows
repeatCols
splitByRow
splitInRowsetStyler   _setCornerRadii_rowSplitRangerE   rF   _minRowHeights)!r*   data	colWidths
rowHeightsstyler   r   r   r   r   r   r   r   normalizedData
cellStylesZrowSplitRangerE   rF   r   minRowHeightscornerRadiirenderCBnrowsZ_seqCWZ_seqRHncolsrp   rk   dZcellrowsZcellcolsrm   Zlmrhr,   r,   r-   r.     s    

  
 


 
" "
(








zTable.__init__c                 C   sV   t | dd}t | dd}t | dd}ddl}||}|dd}d	| jj|||f S )
z#incomplete, but better than nothingr   z	[unknown]r   r   r   N
z
  z3%s(
 rowHeights=%s,
 colWidths=%s,
%s
) # end table)r3   pprintpformatreplacer   r5   )r*   ri   ccvr   r,   r,   r-   rW   v  s    
zTable.__repr__c                    s6   dd  g }|D ] } fdd|D }| | q|S )zTakes a block of input data (list of lists etc.) and
        - coerces unicode strings to non-unicode UTF8
        - coerces nulls to ''
        -

        c                 S   s$   | d krdS t | rt| S | S d S )Nr   )r   r   )stuffr,   r,   r-   normCell  s
    z%Table.normalizeData.<locals>.normCellc                    s   g | ]} |qS r,   r,   )r   cellr   r,   r-   r     s     z'Table.normalizeData.<locals>.<listcomp>)rP   )r*   r   ZoutDatarowZoutRowr,   r   r-   r     s    zTable.normalizeData   c                 C   s  | j r| j S d}t| dd}t| dd}t| dd}t| dd}|rjd||fkrjd}t|D ]}t|D ]}	|| |	 }
t|
tttfrt|
ttfs|
f}
d}|
D ]&}||}|r|d	d d
kr qq|r|d	d d
kr||	|df\}}}}nV|
dkrdpt|
}
||	|
  }}}|r<t|
t	r<dp>d}|rR|d| }|rn q^qn|r` qjq`|rdt
t| }nd}|rd||t|f }nd}d| jjt| ||||f S )z'Identify our selves as well as possibleNr   unknownr   r   r   r   r   z>...r   z(tallest row %d)z with cell(%d,%d) containing
%sz...z"<%s@0x%8.8X %s rows x %s cols%s>%s)r   r3   r   rY   rJ   rZ   r   r   rb   r   r   rf   rU   r   r5   id)r*   maxLenZvxnrZncr   rhbrk   rm   rq   ri   ZvijixZjxtallestr,   r,   r-   r     sL      
   zTable.identityc                 c   sH   t | dd }|D ]2}t |dd r<||||D ]
}|V  q.q|V  qd S )NcanvZ__split_only__)r3   ZsplitOn)r*   CaWaHr  r   r   r,   r,   r-   _cellListIter  s    
zTable._cellListIterc                 C   s   t |tr|}nt |tr |fnt|}d }g j}| |||D ]f}t |tr|s^tddd}|| |j	dk r@|j
dk r@d }q@|r|t||j	|j
d q@|| q@t|drt|j|j|j|j}n
t|j}|S )Nr   )_leftExtraIndent_rightExtraIndentg:0yE>)Z
leftIndentZrightIndentr   )rY   r   r   r   rP   r  r   	CellFrameZframeActionr  r  r   rI   r   __self__r   r   r   )r*   rq   r  r  r  framerh   r   r,   r,   r-   _cellListProcess  s(    





zTable._cellListProcess@ c                 C   s  |sdS ||j  |j }||j |j }d}d}t| dd }	d }
t|tr|| ||}t|	d|j
 d }t|||fS |D ]p}||	||\}}| }| }|d k	r|| |d k	r|| t||}||| | 7 }|
d kr|}
q|||
 | fS )Nr   r   r   r  r   333333?)r;   r<   r=   r>   r3   rY   rb   _elementWidthr[   splitr9   rf   wrapOngetSpaceBeforegetSpaceAfterrP   )r*   rg   ro   rn   WHr  r  r   r  Zsb0ZvwZvhrq   Zsbsar,   r,   r-   _listCellGeom  s2     
 
 

zTable._listCellGeomc                    s6   |sdS d}d}t | dd t fdd|D S )Nr  r   r  c                    s   g | ]}|  d  qS r   )r  )r   rq   r  r  r  r,   r-   r     s     z)Table._listValueWidth.<locals>.<listcomp>)r3   rf   )r*   rg   r  r  r   ro   r,   r#  r-   _listValueWidth  s     zTable._listValueWidthc                 C   s  t | dd rd S |s t| j|}d |krt | dd }d }| jrN| j}| j}nd}i }i }|| jkrv|}|d d  }n|d d  }| j}	| j}
d |kr|d }d}t	|	D ]\}}|| }|
| | }||f}|
|d }||kr|sd}n| ||}|d kr0td|  d| d| d	| d
 ||j|j 7 }|r|d }|d }||kr||f}t|
|||||< d}||kr|}q|||< q|rzt||| W n$   td|  |||f  Y nX || _d}dg| _|D ]}|| }| j| q|| _d| _d S )N_width_calculated_oncer  r,   r   r^   	Flowable 	 in cell(,) can't have auto width
r  r   z.
spanning problem in %s
W0=%r W=%r
spanCons=%rr   )r3   rt   r   r   _colSpanCells_spanRangesr   r   indexr   r   r  r   r   r;   r<   rf   r   r   r   _colpositionsrP   _widthr%  )r*   
availWidthr  r  savedcolSpanCells
spanRangesr   ZW0rg   Srm   ro   rk   ZVirq   rn   jispanr   c0c1r\   widthr,   r,   r-   _calc_width  sp      




*
 
zTable._calc_widthc                    sX  t |ttfrDd}|D ](}| ||}|d kr4 d S t||}q|S t |tr|jrt|drtt |jt	t
frt|jS t|drt |jt	t
fr|jS t|drzt|d|d W S    Y nX t|drz | }t |t
t	fr|W S W n tk
r   Y nX |d krdS zt|d}W n   Y dS X |j |jt fdd|D S )	Nr   r8  	drawWidthZ__styledWrap__minWidthr   c                    s   g | ]}t | qS r,   r   r   ZfontNameZfontSizer,   r-   r   `  s     z'Table._elementWidth.<locals>.<listcomp>)rY   rJ   rZ   r  rf   r   _fixedWidthrI   r8  r   re   r:  r3   r;  AttributeErrorrb   r  r8   r9   )r*   rq   rn   ro   eewr,   r<  r-   r  =  sF     
  
 

zTable._elementWidthc           &      C   s`  | j }|st| j|}t| }}| j}d |kr| j}t| dd }	d }
| jrh| j}| j	}| j
}| j}nd }}i }|	r|	j|	j|	jf}
|}|d d  }|| _i }tj}d |kr|d }| j| }| j| }d}d}ttt|||D ]<\}\}}}||f}||d }||kr&|s&qnt|tttfr| ||d  }||< |d kr| |std|d   d| d| d| d |	r|j |j!|j"pd	|j!   |	_|	_|	_||kr|sqt#||d
 d  ||d   |pd}| $||p| %||\}}|	r.|
\|	_|	_|	_||j& |j' }tj(s||krddl)m*} |d|d dt+|t+|||t+|| df n8|d k	rt,|pd-d}|j"pd	|j! t| }||j.|j/ 7 }|r|d }|d } || kr|| f}!t#||!||||!< d}||kr|}q|r@t#|| |n|||< |r|d }t0|d | }"|"|kr|rt#dd |1 D }#||#krqqd |kr|}|rzt2||| W n,   t3d|  |||||||f  Y nX g  | _4}d }"}$t5|d ddD ]4}|6|" || |$ }%|"|% }||" |% }$|}"q|6|" |"| _7|8  || _9d S )Nr  r,   r   r&  r'  r(  r)  r  r  r   r   )LayoutErrorzGFlowable %s (%sx%s points) too wide for cell(%d,%d) (%sx* points) in
%sr   r   r#   c                 s   s   | ]}|d  V  qdS )r   Nr,   r   r,   r,   r-   r     s     z%Table._calc_height.<locals>.<genexpr>zK
spanning problem in %s hmax=%s lim=%s avail=%s x %s
H0=%r H=%r
spanCons=%rr`   ):r   rt   r   r[   r   r   r3   r   _rowSpanCellsr*  r+  r-  Z	_fontnameZ	_fontsizeZ_leadingr   r   _FUZZr,  r   r   r   rJ   zipr   rY   rZ   r   r  _canGetWidthr   r   r8   r9   r:   rf   r"  r$  r;   r<   allowTableBoundsErrorsreportlab.platypus.doctemplaterA  r   rb   r  r>   r=   r   r   r   r   _rowpositionsr   rP   _heightr   _hmax)&r*   availHeightr/  r   r  hmaxr   	longTabler   r  r0  ZrowSpanCellsr1  r2  colpositionsZH0r   r   rk   rg   r3  hrm   rq   rn   ro   r4  r5  ZdWr   rA  r0r1r\   heightZmsrr   r   r,   r,   r-   _calc_heightb  s     
 



$. (
 ( 8
 
 &


zTable._calc_heightc                 C   s   d | j ksd| j kr(|  r(| |}nd }| jrR|   d | jkrR| j||d | jr`|   | j	|||d | j||d | jr| 
  d S )Nra   )r  )r   _hasVariWidthElements_calcPreliminaryWidthsr   _calcSpanRangesr   r9  r   _calcNoSplitRangesrS  _calcSpanRects)r*   r/  rK  r  r,   r,   r-   _calc  s    
zTable._calcc                 C   s    | j }t|}||}d| S )zReturn a string describing the tallest element.

        Usually this is what causes tables to fail to split.  Currently
        tables are the only items to have a '_culprit' method. Doctemplate
        checks for it.
        ztallest cell %0.1f points)r   rf   r,  )r*   r  r  ZrowNumr,   r,   r-   _culprit  s    
zTable._culpritc                 C   sX   |dkr| j }tt| j |D ]4}t| jD ]$}| j| | }| |s,  dS q,qdS )zCheck for flowables in table cells and warn up front.

        Allow a couple which we know are fixed size such as
        images and graphics.Nr   r   )r   r   r   r   r   rE  )r*   ZupToRowr  colr   r,   r,   r-   rT    s     
zTable._hasVariWidthElementsc                 C   sD   t |ttfr,|D ]}| |s dS qdS t |tr<|jS dS dS )z"Can we work out the width quickly?r   r   N)rY   rJ   rZ   rE  r   r=  )r*   thingelemr,   r,   r-   rE    s    

zTable._canGetWidthc           $      C   s  t | j}d}d}d}d}d}|D ]r}|dkr8|d7 }q"|dkrR|d7 }|d7 }q"t|drz|d7 }|t|dd 7 }q"t|ttfst|| }q"g }	g }
g }i }d}| j}t| j	D ]}|| }|dks|dkst|dr~d}d}t| j
D ]Z}| j| | }| j| | }|||p"d}||j|j 7 }t||}|oL| |}q|rb|
| n
|| |||< ||7 }q|	| qt|	| j	krdS |||  }|dkrp|t| d }||7 }|r|dk r|p|}d| t| }d}|t| | }nd }}g }d}|}| D ]\}}|| }t|dr^t|dd | | }n"|dkrn|}n| r||p~d}||kr|||< n&||| |||f ||7 }||7 }q(|r|t| } |  g }!|D ]\\}"}}}| | }#|#|k r*|||< ||8 }||8 }|r:|t| } n|!|||f q|!D ]*\}}}| | }#|#|ksbt|#||< qBn| D ]\}}|||< qx| | _| _|S )	zFallback algorithm for when main one fails.

        Where exact width info not given but things like
        paragraphs might be present, do a preliminary scan
        and assign some best-guess values.r^   r   Nr   ra   r_   r`   d   )rJ   r   r   re   rY   r   AssertionErrorr  r   r   r   r   r   r;   r<   rf   rE  rP   r[   r   sortr   )$r*   r/  r  ZtotalDefinedZpercentDefinedZpercentTotalZnumberUndefinedZnumberGreedyUndefinedro   givenZsizeableZ
unsizeableZminimumsZtotalMinimumelementWidthcolNoZsizfinalrowNor   r   new	remainingZdefinedPercentageZ	undefinedZdefaultWeightZdefaultDesiredZdesiredWidthsZtotalDesiredZeffectiveRemainingZminimumZdesiredZ
proportionZfinalSetZdisappointmentadjustedr,   r,   r-   rU    s    













zTable._calcPreliminaryWidthsc                 C   s   t | j}d}| j}t| j}| j}| j}tt|D ]}|| }|d ks\|dks\t|drd}	|D ]<}
||
 | }||
 | }||||j	 |j
 }t|	|}	qd||	7 }q6|t|7 }q6|S )Nr   ra   r_   )rJ   r   r  r   r   r   r   r[   r   r;   r<   rf   re   )r*   r  r8  rb  ZrowNosvaluesZstylesrc  ro   rd  re  r   r   rf  r,   r,   r-   r;    s,    


zTable.minWidthc                 C   s  i  | _ }t| jD ](}t| jD ]}||||f|||f< q"qg | _g | _| jj}| jj}| jD ]f\}}}|\}	}
|\}}|	dk r|	| j }	|dk r|| j }|
dk r|
| j }
|dk r|| j }|	|kr||	 }	}|
|kr||
 }
}|	|ks|
|kr`|	|kr:t|
|d D ](}t|	|d D ]}|||f q"q|
|kr|t|
|d D ](}t|	|d D ]}|||f qdqRt|
|d D ](}t|	|d D ]}d|||f< qq|	|
||f||	|
f< q`dS )a  Work out rects for tables which do row and column spanning.

        This creates some mappings to let the later code determine
        if a cell is part of a "spanned" range.
        self._spanRanges shows the 'coords' in integers of each
        'cell range', or None if it was clobbered:
        (col, row) -> (col0, row0, col1, row1)

        Any cell not in the key is not part of a spanned region
        r   r   N)r+  r   r   r   r*  rB  rP   r   )r*   r2  r\   r   csarsarQ   startstopr   y0r   y1r,   r,   r-   rV    sH    
 
 
 
 
 
 


zTable._calcSpanRangesc                 C   s  i  | _ }t| jD ](}t| jD ]}||||f|||f< q"qg | _g | _| jj}| jj}| jD ]f\}}}|\}	}
|\}}|	dk r|	| j }	|dk r|| j }|
dk r|
| j }
|dk r|| j }|	|kr||	 }	}|
|kr||
 }
}|	|ks|
|kr`|	|kr:t|
|d D ](}t|	|d D ]}|||f q"q|
|kr|t|
|d D ](}t|	|d D ]}|||f qdqRt|
|d D ](}t|	|d D ]}d|||f< qq|	|
||f||	|
f< q`dS )ab  
        This creates some mappings to let the later code determine
        if a cell is part of a "nosplit" range.
        self._nosplitRanges shows the 'coords' in integers of each
        'cell range', or None if it was clobbered:
        (col, row) -> (col0, row0, col1, row1)

        Any cell not in the key is not part of a spanned region
        r   r   N)_nosplitRangesr   r   r   Z_colNoSplitCells_rowNoSplitCellsrP   r   )r*   ZnosplitRangesr\   r   rj  rk  rQ   rl  rm  r   rn  r   ro  r,   r,   r-   rW    sH    

 
 
 
 
 
 


zTable._calcNoSplitRangesc                 C   s  t | di }t | dd}| j}|r8|r0|| jks4|s8dS | j}| j}i }i }t|d }| j D ]6\}	}
|
dkr~d||	< qbz|
\}}}}||krW qb|	\}}|| dkrt|d |d D ]*}|	|| g 
||d  || f q|| dkr8t|d |d D ],}|	|| g 
|| ||d  f q
|| }||d  }||d  | }|| | }||||f||	< W qb   td|  f  Y qbX qb||fD ]}| D ]}
|
  qq|| _|| _|| _|| _dS )a  Work out rects for tables which do row and column spanning.

        Based on self._spanRanges, which is already known,
        and the widths which were given or previously calculated,
        self._spanRects shows the real coords for drawing:

            (col, row) -> (x, y, width, height)

        for each cell.  Any cell which 'does not exist' as another
        has spanned over it will get a None entry on the right
        
_spanRectsrJ  Nr   r   z
spanning problem in %s)r3   r   Z_hmax_spanRectsr-  rH  r[   r+  r   r   
setdefaultrP   r   r   ri  r`  rr  _vBlocks_hBlocks)r*   	spanRectsrL  rM  rN  rowpositionsvBlocksr   ZrlimZcoordr   Zcol0Zrow0Zcol1Zrow1r[  r  r/   r\   r   r8  rR  r,   r,   r-   rX    sL    
 (*zTable._calcSpanRectsc                 C   s   t |tst|}| D ]}t|dkr|dd \}\}}\}}t |ts|t |ts|t |trj|tks|t |tr|tkrtd|dt| | q|j	 D ]\}}	t
| ||	 qdD ]*}
t| |
st||
rt
| |
t||
 qd S )Nr#   r   zbad style command zN illegal of invalid string coordinate
only rows may be strings with values in rD   )rY   r   rG   r[   rb   _SPECIALROWSr   _addCommandrH   r   r2   rI   r3   )r*   ZtblstylerQ   r   scsrecerkrq   rO   r,   r,   r-   r   O  s*    
zTable.setStylec                 C   sx   |dk r|| j  }|dk r$|| j  }|dk r6|| j }|dk rH|| j }td|t| j d |td|t| jd |fS )z0ensure cell range ends are with the table boundsr   r   )r   r   rf   r   )r*   r{  r}  r|  r~  r,   r,   r-   normCellRangea  s     
 
 
 
zTable.normCellRangec                 C   s|  |d dkr| j | n\|d dkr8| j| n@|d dkrT| j| n$t|rt|}t|dk rtd|t|dk r|d nt|d t	dd	d
|}||d< t|dk r|d  t|dk r|d nt|d t
dd	d|}||d< t|dk r|d n,|d }|d kr:d}||d< |dksHtt|dk rf||d  n"|d }|d kr|d }||d< t|dkst| jt| n|d dkr| |d  n|d d |dd   \}\}}\}	}
}|tkr|d dkr| jn| j| nZ| ||	||
\}}	}}
|	d7 }	t||
d D ]*}t||	D ]}t| j|||| qZqLd S )Nr   )Z
BACKGROUNDROWBACKGROUNDSCOLBACKGROUNDSZSPANZNOSPLIT   zbad line command r"   r   r   cap      rS   	   r    r#   ZROUNDEDCORNERSrn   )r   rP   r   r   _isLineCommandrJ   r[   r   r   LINECAPS	LINEJOINSr_  r   rZ   r   ry  r   r   r  r   _setCellStyler   )r*   rQ   r  rS   Z	lineCountspaceopr{  r|  r}  r~  ri  rk   rm   r,   r,   r-   rz  i  sZ    
  
  
 
(
"zTable._addCommandc                    s~  d\}}}| j }|  | jr`j}g |d d < |j|j  fdd}||_z| jD ]\
}\}}	\}
}}}t|	tr|	t	krqhd kr|kr|
 }d ksʈg kr|d k	r|  d }n|kr| }d k	r|kr| }| ||
|	|\}}
}	}t| t|d||	f|
|f|| qhW 5 rj|_X |  d | _d S )N)NNNc                    sh   | |kr| j ks8| jks8||krV|jks8|jkrV t| |||	 n| ||| d S r'   )r   r   ro  rn  r   )xsysxeyeZaSLr  r?   dashrS   Z	ocanvlineZrrdweightr,   r-   
rcCanvLine  s    z$Table._drawLines.<locals>.rcCanvLine_drawUnknown)r  	saveState_roundingRectDefSLlinerP   r   rY   r   ry  
setLineCapsetDashsetLineJoinr  r3   
_LineOpMapr   restoreState	_curcolor)r*   ccapcdashcjoinr  r  r  r  r{  r|  r}  r~  r   r  r,   r  r-   
_drawLines  sD    
	& 


.zTable._drawLinesc           	      C   s*   dd l }|djd }td|d S )Nr   r   r  zUnknown line command )sys	_getframef_localsr   )	r*   rl  endr  r?   r   r  r  r  r,   r,   r-   r    s    zTable._drawUnknownc                 C   s,   |  |||||| | |||||| d S r'   )_drawBox_drawInnerGrid)r*   rl  r  r  r?   r   r  r,   r,   r-   	_drawGrid  s    zTable._drawGridc                 C   s   |\}}|\}	}
|  ||f|	|f|||| |  ||
d f|	|
d f|||| | ||f||
f|||| | |	d |f|	d |
f|||| d S rX   _drawHLines_drawVLinesr*   rl  r  r  r?   r   r  r{  r|  r}  r~  r,   r,   r-   r    s    $zTable._drawBoxc                 C   sT   |\}}|\}	}
|  ||d f|	|
f|||| | |d |f|	|
f|||| d S rX   r  r  r,   r,   r-   r    s     zTable._drawInnerGridc                 C   sD   |r || j kr | j| || _ |r@|| jkr@| j| || _d S r'   )r  r  ZsetStrokeColor
_curweightZsetLineWidth)r*   r  r?   r,   r,   r-   	_prepLine  s    zTable._prepLinec                 C   s   |\}}|\}	}
| j ||	d  }| j||
d  }t|dksLt|dk rPd S | || |d }|d }t| di }| jj}|dkr|D ]}t||||| qn.||| |fdd}|D ]}t||||| qd S )Nr   r   r   r`   ru  c                 S   s   t | |||||S r'   r   r   rn  r   ro  r   r   r   r,   r,   r-   <lambda>      z#Table._drawHLines.<locals>.<lambda>)r-  rH  r[   r  r3   r  r  r   )r*   rl  r  r  r?   r   r  r{  r|  r}  r~  r   rpr   r   r   r   lfr,   r,   r-   r    s"     zTable._drawHLinesc                 C   s8   |\}}|\}	}
|  ||d f|	|
d f|||| d S rX   )r  r  r,   r,   r-   _drawHLinesB  s    zTable._drawHLinesBc                 C   s   |\}}|\}	}
| j ||
d  }| j||	d  }t|dksLt|dk rPd S | || |d }|d }t| di }| jjfdd}|dkr|D ]}t||||| qn.||| |fdd}|D ]}t||||| qd S )	Nr   r   r   r`   rt  c                 S   s   ||| ||S r'   r,   )rn  r   ro  r   _liner,   r,   r-   r    r  z#Table._drawVLines.<locals>.<lambda>c                 S   s   t | |||||S r'   r  r  r,   r,   r-   r    r  )rH  r-  r[   r  r3   r  r  r   )r*   rl  r  r  r?   r   r  r{  r|  r}  r~  ZerpcpZsrprx  r   r\   r  r,   r,   r-   r    s"     zTable._drawVLinesc                 C   s8   |\}}|\}	}
|  |d |f|	d |
f|||| d S rX   )r  r  r,   r,   r-   _drawVLinesA  s    zTable._drawVLinesAc                 C   s   |  || || _| j| jfS r'   )rY  r/  r.  rI  )r*   r/  rK  r,   r,   r-   wrap$  s    z
Table.wrapc                 C   s   dS )z
        This method will be called when the Table is split.
        Special purpose tables can override to do special stuff.
        Nr,   )r*   TZbyRowr,   r,   r-   onSplit)  s    zTable.onSplitFc                 C   s2  | j }|D ] }|dd \\}}	\}
}|	tkr|	d dkr| | |	dkr
|r
|dk rb||7 }|
dk rr|
|7 }
| |d f||d f|
|d ff t|dd    q
|sq
| | |	dkrq
|d  }	}|	dk r|	|7 }	|	|krq
||kr|d }| |d f||	f|
|ff t|dd    q
d S )Nr   r#   r   rk   r   r   )r   ry  rz  rZ   )r*   rp   rM   Znr0doInRowSplit	_srflModer   r   r{  r|  r}  r~  r,   r,   r-   _cr_00  s4    

  8 
    zTable._cr_0c              
   C   s<  t |}t|}| j}	|D ]}
|
dd \\}}\}}|tkr|d dkr| |
 |dkr|r|dk rr||	7 }|dk r||	7 }| |
d f||f||ff t|
dd    q|sq| |
 |dkrq| }}|dk r||7 }|dk r||7 }tt||d |@ }|r^t|}| |
d f||t	|f||t
|ff t|
dd    ||k rjqt
|| d| }t
|| d| }| |
d f||f||ff t|
dd    q| j}|r8|\}}|dk r||7 }|dk r||7 }||k r
d | _n.t
|| d| }t
|| d| }||f| _d S Nr   r#   r   rk   r   r   )r[   setr   ry  rz  rZ   r   rJ   r,  r   rf   r   )r*   rp   ZnRowsr   rM   r  r  ZnrrZrrSr   r   r{  r|  r}  r~  ZcSr,   r,   r-   _cr_1_1G  s\    

  0 
   D
 2
 
 
zTable._cr_1_1c           
      C   s>  |D ]2}|dd \\}}\}}	|t kr|d dkr| | |dkr|r|dk r\|t7 }|dk rl|t7 }| |d f|df|dff t|dd    q|sq| | |dkrq| }}	|	dkr|	|k rq|dkr||k rd}||kr||8 }|	|kr|	|8 }	| |d f||f||	ff t|dd    qd S r  )ry  rz  r   rZ   )
r*   rp   rM   r  r  r   r{  r|  r}  r~  r,   r,   r-   _cr_1_0p  s6    

  0 
    
 zTable._cr_1_0c                 C   sj  ||j  }||j |  }t|ttfrHg }g }	d}
| |||d }|jdkr^|| d }nd}|D ]}|
r|j|kr|	| ||j8 }ng   S qf||j |kr|| ||j7 }qf|||| }|r||d  |	|d  nD|s|jdkr*|j|kr |	| ||j8 }ng   S ng   S d}
qft|t|	fS t|t	rf|d}d	|j
 }|jpr|t| }|jdkr||kr|d
fS |jdkr||krd
|fS |jdkr||krd
|fS |d
fS nt|dk rg S |jdkr|| }n2|jdkr&t|||  }n|| | d|  }t|}d|d | d||d  fS dS )NFr   r   r   r   TOPTr   r  r   r&   )r   r   )r=   rY   rZ   rJ   r"  rA   rR  rP   r  rb   r9   r:   r[   r   rS   )r*   r   r   	oldHeight	newHeightr8  Zheight0Zheight1ZnewCellContentZpostponedContentr  Z
cellHeight
usedHeightZflowablesplitsrows
lineHeightZcontentHeight
splitPointr,   r,   r-   
_splitCell  sj    












$zTable._splitCellc                 C   s  | j }| j}g }| jD ]\
}\}}\}	}
}}}}}}}t|tr|tkr||||f|	|f|||||||f
 |dkr|d  }}
nX|dkr|}|}
nF|dk r||7 }|	dk r|	|7 }	|||f|	|f|||||||f
|d< q|dk r||7 }|	dk r|	|7 }	|dk r||7 }|
dk r"|
|7 }
|dkr||k r@|
|ksP|r||kr|d||f|	|f|||||||f
 |d||f||
f|||||||f
 |d	|	|f|	|
f|||||||f
 |d
||
f|	|
f|||||||f
 |dkr|rJ|d||f|	|d f|||||||f
 |d||f|	|
f|||||||f
 nz|d
||d f|	|d f|||||||f
 |d||f|	|f|||||||f
 |d||f|	|
f|||||||f
 n&||||f|	|
f|||||||f
 q|dkr||k rf|
|krf|sf|d
||d f|	|d f|||||||f
 |d||f|	|f|||||||f
 ||||f|	|
f|||||||f
 q|d
kr||k r|
|d kr|d||f|	|f|||||||f
 ||||f|	|
f|||||||f
 q|dkrr||krJ|
|krJ|d
||d f|	|d f|||||||f
 ||||f|	|
f|||||||f
 q||||f|	|
f|||||||f
 q|S )Nr   r   r   r   r`   )BOXOUTLINEGRID	LINEABOVE
LINEBEFORE	LINEAFTER	LINEBELOWr  	INNERGRID)r   r   r   rY   r   ry  rP   )r*   rp   r  r   r   Ar  r{  r|  r}  r~  r  r?   r  r  rS   r   r  r,   r,   r-   _splitLineCmds  sl    (&  $  
 
 
$&&&&
*(.&((
.&(
&(
.((zTable._splitLineCmdsc                 C   s   g j }|D ]}|dd \}\}}\}	}
|tks8|
tkrB|| q
|
dk rR|
|7 }
|dk rb||7 }|
|krt|
d7 }
n(|
|kr||k s||kr|dkr|
d7 }
||ks||kr|dkr|d7 }||||f|	|
ff|dd   q
|jS )a2  Stretches the commands when a row is split

        The row start is sr, the row end is er.

         sr   | er  | result
        ---------------------------------------------------------------------
          <n  |  <n | Do nothing.
              | >=n | A command that spans the break, extend end.
        ---------------------------------------------------------------------
         ==n  | ==n | Zero height. Extend the end, unless it's a LINEABOVE
              |     | commands, it's between rows so do nothing.
              |     | For LINEBELOW increase both.
              |  >n | A command that spans the break, extend end.
        ---------------------------------------------------------------------
          >n  |  >n | This command comes after the break, increase both.
        ---------------------------------------------------------------------

        Summary:
        1. If er > n then increase er
        2. If sr > n then increase sr
        3. If er == n and sr < n, increase er
        4. If er == sr == n and cmd is not line, increase er

        r   r#   r   r  r  N)rP   ry  r  )r*   rp   rM   ZoldrowcountZ	stretchedr   rQ   r{  r|  r}  r~  r,   r,   r-   _stretchCommands  s&    
$zTable._stretchCommandsc           ^         sl  | j ||d}| j}t|tr"|n
t|d }|r:||k sF|sJ||krJg S t| j}||krb| gS | j}|r|\}}|dk r||7 }|dk r||7 }||kr| j|t	| j||  |dS ||k rg S | j
}	|s|  | jnddd | jD | jr|| j| k rg S t	| jd | }
| j| }| j| }| j}| j| }d}d}d}tt|||D ]\}\}}}| jr| j||fd d krq^t|ttfr| |||\}}||j|j 7 }||kr8|}nft|tr^|d}d|j }|t| |j |j }t|||j }t|||j }||kr^|}q^|| |ksX|||
 k
rX| jsdg S t }t| jD ]}||f}|| jkrt| j||fd d krt| j  D ]\\}}|d krĐq|\}}}} ||kr||kr||kr|| kr|!|  qtqqt|sg S g }!| jD ]|\}"\}#}$\}%}&|#dk rJ|#| j7 }#|%dk r^|%| j7 }%|$dk rr|$| j"7 }$|&dk r|&| j"7 }&|!#|"|#|$f|%|&ff q$d	d | jD }'| j$}(|D ]X}| j| \})}*}+},| j%| }-|-d
 }.t	| j|*| }/|'|* |) }0| &| j|* |) |0|.|/|}1|1s.g   S |1d |* |)< |1d | |)< g }2|!D ]\}"}3}4|)|*f|3kr|+|,f|4kr|d |*ks|)|+kr|2#|"|)|*f|+|d ff ||,k s|)|+kr|2#|"|)|f|+|,ff n|2#|"|3|4f qV|2}!g }5|(D ]p\}"}3}4}6|3|)|*fkrZ|5#|"|3|4d |d f|6f |5#|"|3d |f|4d |f|6f n|5#|"|3|4|6f q|5}(|0' }7|0j(dkr|1d r|1d rd|0_(d|7_(n^| |8d p|8d ||0d }9||9 d }:|8d r|0 j|:7  _n|8d r|7 j|:7  _|7|'| |)< q| j)| j| j| j| j
| j*| j+d|'| j,t-| dd | j.t-| dd t-| dd d |( _$|! _| j/ _/| j0 _0| j1 _1| j2 _2| j3 _3 4   5   6  g };| j7D ]}<|<\
}=\}#}$\}%}&}>}6}?}@}A}B}C|&dk r|& j"7 }&|%dk r
|% j7 }%|=dksP|=dkr2|$|ksP|&|ksP|=dkr||$|k sP|&|kr||=dkr|;#d|#|$f|%|d f|>|6|?|@|A|B|Cf
 |;#d|#|f|%|&f|>|6|?|@|A|B|Cf
 |;#d|#|d f|%|d f|>|6|?|@|A|B|Cf
 |=dkr|;#d|#|$f|%|$f|>|6|?|@|A|B|Cf
 |;#d|#|&f|%|&f|>|6|?|@|A|B|Cf
 |;#d|#|$f|#|&f|>|6|?|@|A|B|Cf
 |;#d|%|$f|%|&f|>|6|?|@|A|B|Cf
 n|;#|< qq|D ]}g }D|;D ]}<|<\
}=\}#}$\}%}&}>}6}?}@}A}B}C| j| \})}*}+},|=dkr|&|*kr|$|,k	s|=dk
r.|&|*k
r.|$|,k 
r.|#|+k
r.|%|)k
r.|=dk	r@|*}E|,d }Fn|*d }E|,}F|$|Ek	r||D#|=|#|$f|%|Ef|>|6|?|@|A|B|Cf
 |)|#k	r|D#|=|#t|E|$f|)d t8|&|Ff|>|6|?|@|A|B|Cf
 |+|%k 	r|D#|=|+d t|E|$f|%t8|&|Ff|>|6|?|@|A|B|Cf
 |&|Fk
r8|D#|=|#|Ff|%|&f|>|6|?|@|A|B|Cf
 n
|D#|< q|D};q|; _7 j|ddS t8||
 || }G|Gd | j+k 
r~g S | j9|G }H|H| j+k 
rg S g }Id}Jg }Kd}Lg }Mt|||D ]>\}}}| &||||G|}8|8
sg   S |' }7|j(dkrx|8d r|8d rd|_(d|7_(n^| |8d p.|8d ||d }9||9 d }:|8d r`| j|:7  _n|8d rx|7 j|:7  _|I#|8d  |K#|8d  | |8d ||d |j |j }Nt|J|N}J| |8d ||d |j |j }Ot|L|O}L|M#|7 
qt8|G|J}Pt|L| j| |P }Q| jd d  }R|R:|d |Q |P|R|< | jd d  }'|':|d |M d | |Ig |Kg |d d   | j)| j|R| j| j
| j*| j+d|'| j,t-| dd | j.t-| dd t-| dd d | ;|| j7| _7| ;|| j$| _$| ;|| j| _| ;|| j/| _/| ;|| j0| _0| ;|| j1| _1|d }| j,}S|SrXt<|S}S j.}T|Trl jn j=t-| dd }Ut-| dd }V| j)d |  jd | ||	| j*| j+d jd | |St-| dd |T|Ur|Ud d nd |Vd}I j"}W j}X j>||d}Y|I?||Y|W| |Ij?| j$|W|dd |I?| j|W| |I?| j/|W|  j0D ]v}Z|I@|Z |Zd d dkrxqT|Zdd
 \\}#}$\}%}&|I@|Zd f|#|d f|%|d ff t|Zd
d    qT|Srt<|S}S|rt|tr d | }[d | }\ jd | }]tt|}nBttA|}fd d|D }[fd!d|D }\ fd"d|D }]| j)|[|d    j|\|d   t||	| j*| j+d|] j|d   |St-| d#d |T|U|Vd$}K|KB||W||Y| |KjB||W| j$|dd |KB||W| j| |KB||W| j/| n| j)|d   j|d  ||	| j*| j+d j|d  |St-| d#d |T|Urrddg|Udd   nd |Vd$}K|KC||Y| |KjC| j$|dd |KC| j| |KC| j/|  j0D ]n}Z|K@|Z |Zd d d%krq|Zdd
 \\}#}$\}%}&|K@|Zd f|#df|%dff t|Zd
d    qĈ jD |I_D|K_D jE |I_E|K_E| F|I | F|K |I|KgS )&N)ignoreSpansr   r   r  c                 S   s   g | ]}|d d  qS r'   r,   r   r/   r,   r,   r-   r   n  s     z$Table._splitRows.<locals>.<listcomp>r   r  c                 S   s   g | ]}|d d  qS r'   r,   r  r,   r,   r-   r     s     r#   r   r&   r  r   rE   _cornerRadiir   )r   r   r   r   r   r   r   r   r   rE   r   r   r   r  r  r  )r  r  r  )r  r  r  r  r  FT)r  r   c                    s   g | ]} | qS r,   r,   r   rk   )r   r,   r-   r     s     c                    s   g | ]} | qS r,   r,   r  )splitHr,   r-   r     s     c                    s   g | ]} j | qS r,   )r   r  )r  r,   r-   r     s     rF   )r   r   r   r   r   r   r   r   r   rF   r   r   r   r   )G!_getFirstPossibleSplitRowPositionr   rY   r   rf   r[   r   r   
_splitRowsr   r   r   r   r   r   r   rD  r   r+  r   rZ   rJ   r"  r=   r>   rb   r  r9   r  r   r   rB  r   rR   r   rP   r   rr  r  r)   rA   r   r   r   r   r3   r   r   r   r   r-  rH  rW  rV  rX  r   r   rI  insertr  r   r   r  r  rz  r   r  r  r   r   r  )^r*   rK  r  rp   r   Z	maxrepeatr   lohir   ZusedHeightsZ
cellvaluesr   Z
cellWidthsZcurRowHeightZminSplitZmaxSplitZ	maxHeightcolumnr   r   r8  ro   rR  r  r  Z
splitCellsr   r5  Z	start_colZ	start_rowZend_colZend_rowZspanCmdsrQ   r{  r|  r}  r~  ZnewCellStylesZ
bkgrndcmdsZspan_scZspan_srZspan_ecZspan_erZspanRectr  r  ZoldStyleresZnewSpanCmdsrl  r  Znewbkgrndcmdsr?   ZnewStylerq   rO  marginZnewlinecmdsZlinecmdr  r  r  r  rS   r   r  Z
moddedcmdsZstartrowZendrowr  rg  rx   ZR0Heightry   ZR1HeightZR1StylesZh0h1r  ZnewRowHeightZnewRowHeightsr   Zltor   r   r   r   r   r   ZiRowsZiRowHZiCSr,   )r  r   r  r-   r  N  s   
    



 

















   
$ 


    


 



(
*&.
&&&(


 



.
.

 

"
"

(
    


     



 <   
   


 4

zTable._splitRowsc           
      C   sp   |D ]f}|| }|d kr|d |d  }}||krt ||}t||}|d }	|	|krXqd | |	< |	d7 }	qNqd S )Nr   r#   )r   rf   )

impossiblecellsrangesZxyri   ro  y2ZyminZymaxr   r,   r,   r-   _getRowImpossible&  s    

 zTable._getRowImpossiblec                 C   s   i }| j r |s | || j| j | jr8| || j| j d}d}d}| jD ]0}|| |kr^ q|||krj|}|| }|d }qJ|S )Nr   r   )r   r  rB  r+  r   rq  rp  r   )r*   rK  r  r  rO  rp   Zsplit_atr  r,   r,   r-   r  5  s     


z'Table._getFirstPossibleSplitRowPositionc                 C   s`   |  || | js| jr\tjs,| j|kr,g S | j|| j d}|rF|S | jr\| j|| jdS g S )Nr  )rY  r   r   r   rF  r.  r  )r*   r/  rK  r4   r,   r,   r-   r  I  s     zTable.splitc              	      s
  d _ tdd   r"t |kr&d S j}j} fddtdd|d f|d df|d |d ffD }j}j}|d }|| }|| }	|d }
|	| }|
| }t|||||	|
|g _ j	
 }|||||| j	}|d |j|dd |d	 d S )
Nr  c                    s0   g | ](\}\}}t j| j|  | qS r,   )r   r   r   )r   r  rk   rm   r   r*   r,   r-   r   c  s   
z1Table._makeRoundedCornersClip.<locals>.<listcomp>r  r   r   z%begin table rect clipstrokez%end table rect clip)r  r3   rf   r   r   r   rH  r-  RoundingRectDefr  	beginPathZ	roundRectZ
addLiteralclipPath)r*   r   r   r   arr  r  r   rn  r   ro  ro   rO  rv   r   r,   r  r-   _makeRoundedCornersClip]  s:     



zTable._makeRoundedCornersClipc              
   C   s  | j \}}}}}}}}|sd S | j}	|	  d  }
 } } | _| _|	j}| j}|D ]:\	}}}}}}}}}|d kr|
|kr|	| |}
|d ks|g kr|d k	r|	  d }n||kr|	| |}|d k	r||kr|		| |}| 
|| ||kr||ks||k r||||| qT||kr>d}|d }|d }nd}|d }|d }||| kr~||| kr~||||| qT||| k rtd|||f|ddd	nd }||| krtd
|||f|ddd	nd }n||ks||k r||||| qT||krd}|d }|d }nd
}|d }|d }||| krX||| krX||||| qT||| k r~t|d||f|ddd	nd }||| krt|d||f|ddd	nd }|	 }|r|j|d   ||d d |d d |d d |d d |d d |d d  n||| |s.||| nR|j|d   ||d d |d d |d d |d d |d d |d d  |	j|ddd qT|	  d S )Nr~   r   r#   r   r   r   r   r{   )rw   r   r}   r   r  fill)r  r  r  r  r  r  r  r  r  r  r  r   r  ZmoveToZcurveToZlineToZdrawPathr  )r*   r   rn  ro   rO  r   ro  r  r  r  r  r  r  r  r   r  r  r  r  r  r?   r  r  rS   r   rP  rQ  r6  r7  r   rv   r,   r,   r-   _restoreRoundingObscuredLines{  s     





*,

**FDz#Table._restoreRoundingObscuredLinesc                 C   s2  | j }|  d  | _ | _| _t| d}|rB|| d || d |   |   |r`|| d | js|r*t	t
| j| j| jdd  | jD ]\}\}}}}|| d| t	t
||| jd d | jD ]P\}\}	}
}}|| d|||	|
||f||f | |	|
||f||f || d	 q|| d
 qnxt
| j| j| jdd  | jD ]X\}}}}t	t
||| jd d | jD ]*\}\}	}
}}| |	|
||f||f qrqHn>|rht| jD ]}|| d| t| jD ]}| j||f }|d k	r|\}}}}| j| | }	| j| | }
|| d|||	|
||f||f | |	|
||f||f || d	 q|| d
 qn|t| jD ]p}t| jD ]^}| j||f }|d k	r|\}}}}| j| | }	| j| | }
| |	|
||f||f qqr|r|| d |   |r|| d || d |  | jr.|   d S )Nr   
startTablestartBGendBGr   startRowr`   	startCellendCellendRow
startLinesendLinesendTable)r  r  r  r  _curcellstyler3   r  _drawBkgrndr   r   rD  r   r   rH  r   r-  r   	_drawCellr   r   r   rr  r  r  r  r  )r*   r   r   re  r  Zrowstylerowpos	rowheightrc  cellval	cellstylecolposcolwidthZcellRectr\   r   r8  rR  r,   r,   r-   draw  sj    


 
2.*.$

  


z
Table.drawc           +   
   C   s  | j }| j}| j}| j}| j}| j}| j}t| dd }| jD ]\}	\}
}\}}}|t	kr\q<|
dk rl|
| }
|dk r||| }|dk r|| }|dk r|| }||
 }|| }|t
|d | }|t
|d | }|| ||  }}t|dr|| ||||| q<|	dkrtttj|}t|}|| d }t|D ]N}|||  }|||  }|r||| |j|||| ddd || }q8q<|	dkrtttj|}t|}||
 d }t|D ]L}|||  }||
|  }|r|| |j||||ddd || }qq<|rt|ttfr|d dkr||
krn||krn|rn||
|f}|rn|\}}}}|d |dd   }}|  | }||||| |j|dd	 |d
kr|j|||| ||dd n|dkr.||d  }|j|||||dd |j|||| ||d d d dd nl|dkr||d  }|j|||||dd |j||||| |d d d dd n|dkr|j||||| |dd n|dkrxdt|  krdkr`n n|d d \\} }!\}"}#|| |  } ||"|  }"||!|  }!||#|  }#|d }$|d }%t|dkrB|d nd }&|j| |!|"|#|%|&|$d ntdtd|n"|dkrdt|  krdkrn n|d \}'}(||'|  }'||(|  }(|d \})}*|*dkr|}*nZ|*dkr|}*nJ|*dkrt
||}*n4|*dkrt||}*ntd|d d td||)|*9 })|d }$|d }%t|dkrj|d nd }&|j|'|(|)|%|&|$d ntdtd| |  q<t|}|r<||
kr||kr|r||
|f}|r|\}}}}|| |j||||ddd q<d S )!Nrr  r   r   __call__r  r  r  )VERTICAL
HORIZONTAL	VERTICAL2HORIZONTAL2LINEARGRADIENTRADIALGRADIENTr  r  F)extendr         @r`   r  r  r     r  r   r#   )Z	positionsr  zWrong length for z arguments r  r8  rR  r   rf   zBad radius, z, for ) r   r   r  r-  rH  r   r   r3   r   ry  r   rI   rJ   rT   r   ZtoColorOrNoner[   r   setFillColorZrectrY   rZ   r   r  r  r  linearGradientr   r  rf   radialGradientr  )+r*   r   r   r  rN  rw  r   r   rv  rQ   r{  r|  r}  r~  argr   rn  r   ro  ro   rO  Z
colorCycler   ZrowCountrk   r?   ZcolCountZxywhZarg0pxhZyhZax0Zay0Zax1Zay1r  r  rv   ZxcZycri   refr,   r,   r-   r  	  s         






(
(

 
 






zTable._drawBkgrndc                 C   s  |\}}|\}}| j |k	r| j }	|	d ks4|j|	jkrB| j|j |	d ksn|j|	jksn|j|	jksn|j|	jkr| j|j|j|j || _ |j}
|j	}t
|tttfrt
|ttfs|f}g }g }| j||||||d\}}|dkr|| |j }n6|dkr||j | }n|||j |j | d  }|rB||d  7 }t|||D ]\}}}|
dkrn||j }n^|
dkr|| |j | }n@|
dkr|||j |j | d  }ntd	|
d
t| || 8 }||8 }|| j|| || 8 }qNn|
dkr"| jj}||j }n~|
dkrN| jj}|||j |j d  }nR|
dkrp| jj}|| |j }n0|
dkr| jj}|| |j }ntd	|
t|d}t|}|j}|j}|dkr||j ||  | }n\|dkr|| |j | }n>|dkr2||j| |j ||  d  | }ntd||D ]}|||| ||8 }qDt |dd }|r|| j|j!|j" |j#r| jj$|j#|||| || fdd |j%r| jj&d|j%|||| || fdd d S )N)r  r   r  r  r&   r  r   r%   RIGHT)ZCENTREr   zInvalid justification z for ru   ZDECIMALr   r   zBad valign: onDrawr   )relativer   )ZRectr   )'r  r?   r  r  r:   r8   r9   ZsetFontr@   rA   rY   rZ   rJ   r   r"  r=   r>   r  rD  r;   r<   r   typeZdrawOnr  Z
drawStringZdrawCentredStringZdrawRightStringZdrawAlignedStringrb   r  r[   r3   rw   labelrB   ZlinkURLrC   ZlinkRect)r*   r  r	  possizer
  r  r  r  curZjustrA   r  r   ro   rO  r   rq   r\   r  valsrp   r:   r9   r  r,   r,   r-   r  	  s    
, 
 
 
 







&$zTable._drawCellc                 C   sF   t |r4|sd nt|tdt| ddg  | _ntd|d S )Nr  r   z@cornerRadii should be None or a list/tuple of numeric radii
not )r   rJ   rf   r[   r  r   )r*   r   r,   r,   r-   r   	  s    ,zTable._setCornerRadii)r  )NNr  )r  r  )N)NN)N)r   )F)F)F)r   )r   )r   ):r5   r6   r7   r   r.   rW   r   r   r  r  r"  r$  r9  r  rS  rY  rZ  rT  rE  rU  r;  rV  rW  rX  r   r  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  staticmethodr  r  r   rC  r  r  r  r  r  r   r,   r,   r,   r-   r     s               
p

(	


?%
b!
 /04=.


)
Z
<3
   [
M; Pr   r  r  r  r  r  r  r  )r  r  r  r  r  r  r  r  c                   @   s   e Zd ZdZdZdS )r   z+Henning von Bargen's changes will be activer   N)r5   r6   r7   __doc__r   r,   r,   r,   r-   r   	  s   r   c                   @   sh   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )TableRenderCBzDtable render callback abstract base klass to be called in Table.drawc                 G   sN   t |tstdt| dt| |d }|s<td| ||f|  d S )NzTableRenderCB first argument, z is not a Tablezinvalid TablerenderCB cmd )rY   r   r   rU   r3   )r*   r  rQ   argsmethr,   r,   r-   r  	  s    
  zTableRenderCB.__call__c                 C   s   t dd S )Nr  NotImplementedErrorr*   r  r,   r,   r-   r  	  s    zTableRenderCB.startTablec                 C   s   t dd S )Nr  r,  r.  r,   r,   r-   r   
  s    zTableRenderCB.startBGc                 C   s   t dd S )Nr  r,  r.  r,   r,   r-   r  
  s    zTableRenderCB.endBGc                 C   s   t dd S )Nr  r,  )r*   r  re  r,   r,   r-   r  
  s    zTableRenderCB.startRowc                 C   s   t dd S )Nr  r,  )r*   r  re  rc  r  r	  r#  r$  r,   r,   r-   r  
  s    zTableRenderCB.startCellc                 C   s   t dd S )Nr  r,  r.  r,   r,   r-   r  
  s    zTableRenderCB.endCellc                 C   s   t dd S )Nr  r,  r.  r,   r,   r-   r  

  s    zTableRenderCB.endRowc                 C   s   t dd S )Nr   r,  r.  r,   r,   r-   r   
  s    zTableRenderCB.startLinesc                 C   s   t dd S )Nr  r,  r.  r,   r,   r-   r  
  s    zTableRenderCB.endLinesc                 C   s   t dd S )Nr  r,  r.  r,   r,   r-   r  
  s    zTableRenderCB.endTableN)r5   r6   r7   r(  r  r  r  r  r  r  r  r  r   r  r  r,   r,   r,   r-   r)  	  s   r)  c                 C   s   | d t kS r   )LINECOMMANDS)rQ   r,   r,   r-   r  
  s    r  c                 C   sj  | | | }|dkr\t |}|d |_|dkrX|d |_|dkrL|d |_n|jd |_n
|dkrp|d |_n|dkr|d |_n|dkr|d |_n|d	krt|d tddd|_n|d
kr|d |_n|dkr|d |_	n|dkr|d |_
nl|dkr|d |_nV|dkr&|d |_n@|dkr<|d |_n*|dkrR|d |_n|dkrf|d |_d S )NZFONTr   r   r   r  )ZFONTNAMEZFACE)ZSIZEZFONTSIZEZLEADINGZ	TEXTCOLOR)ALIGNZ	ALIGNMENTZVALIGNZLEFTPADDINGZRIGHTPADDINGZ
TOPPADDINGZBOTTOMPADDINGZHREFZDESTINATION)r[   r8   r9   r:   r   ZtoColorZColorr?   r@   rA   r;   r<   r=   r>   rB   rC   )r   rk   rm   r  ri  rf  rp   r,   r,   r-   r  
  sB    






r  r  r  r`   r`   g      ?)r0  )r   r   r1  r  r  ru   r  r  )r`   r   r  )r   r`   r  )r   r   __main__)old_tables_test)r   r{   r|   )M__all____version__r(  Zreportlab.platypus.flowablesr   r   Z	reportlabr   Zreportlab.lib.stylesr	   r
   r   Zreportlab.libr   Zreportlab.lib.utilsr   r   r   r   r   r   r   Zreportlab.lib.validatorsr   Zreportlab.lib.rl_accelr   Zreportlab.lib.abagr   r  Zreportlab.pdfbase.pdfmetricsr   rG  r   r   r   collectionsr   r  r  r   r   r]   rt   rz   r   rC  r   r   r   r   r   rZ   r   r   r  r   ry  r   r  r   rJ   r   r/  r)  r  r  r$   Z
GRID_STYLEZ	BOX_STYLEZLABELED_GRID_STYLEr   ZCOLORED_GRID_STYLEZgreenZ
LIST_STYLEr5   Ztests.test_platypus_tablesr3  r,   r,   r,   r-   <module>   s   $0


                 t	'

