[reportlab-users] Re: Problem with spanned columns when a platypus

Robin Becker robin at reportlab.com
Wed Jan 12 06:21:07 EST 2005


Andre Reitz wrote:
> Sorry, there was one little thing...
> 
> 
> had to exchange y1<->ymin and y2<->ymax in 
> _getFirstPossibleSplitRowPosition
> 
> Here the corrected patch...
> Greetings, Andre'
> 
> 
> 
> Jean-Francois Gosset wrote:
> 
>> Message d'origine (22:51 11/01/2005 +0100) émis par (Andre Reitz) :
>>
>>> Spans currently are ignored when Tables are split.
>>>
>>> I solved this with the following patch.
>>> It would be very helpful for me and I think for other users if somebody
>>> would apply the patch to the subversion tree, so that it is available in
>>> the next release.
>>
>>
>>
>>
>> It works perfectly (tested with the little example I gave previously).
>> Just a note : the patched tables.py don't work with the 1.20 reportlab 
>> version. We need the current SVN version.
>>
>> Thank's Andre for the patch and if it could be applied to the 
>> subversion tree, it would be nice.
>>
>> JF Gosset
>>
> --------------------------------------------------------------------------------------------------------------------------- 
> 
> Index: reportlab/platypus/tables.py
> ===================================================================
> --- reportlab/platypus/tables.py    (revision 2509)
> +++ reportlab/platypus/tables.py    (working copy)
> @@ -833,16 +833,38 @@
>                 if er>=n: er = er-n
>                 self._addCommand((c[0],)+((sc, sr), (ec, er))+c[3:])
> 
> +    def _getFirstPossibleSplitRowPosition(self,availHeight):
> +        if self._spanCmds:
> +            impossible={}
> +            for xy in self._rowSpanCells:
> +                r=self._spanRanges[xy]
> +                if r!=None:
> +                    y1,y2=r[1],r[3]
> +                    if y1!=y2:
> +                        ymin=min(y1,y2) #normalize
> +                        ymax=max(y1,y2) #normalize
> +                        y=ymin+1
> +                        while 1:
> +                            if y>ymax: break
> +                            impossible[y]=None #split at position y is 
> impossible because of overlapping rowspan
> +                            y=y+1
> +        else:
> +            impossible={} # any split possible because table does *not* 
> have rowspans
> +      
> #------------------------------------------------------------------------        
> +        h = 0
> +        n = 1
> +        split_at = 0 # from this point of view 0 is the first position 
> where the table may *always* be splitted
> +        for rh in self._rowHeights:
> +            if h+rh>availHeight:
> +                break
> +            if not impossible.has_key(n):
> +                split_at=n
> +            h=h+rh
> +            n=n+1
> +        return split_at
>     def _splitRows(self,availHeight):
> -        h = 0
> -        n = 0
>         lim = len(self._rowHeights)
> -        while n<self._hmax:
> -            hn = h + self._rowHeights[n]
> -            if hn>availHeight: break
> -            h = hn
> -            n = n + 1
> -
> +        n=self._getFirstPossibleSplitRowPosition(availHeight)
>         if n<=self.repeatRows:
>             return []
> 
> @@ -931,9 +953,25 @@
> 
>         R0.hAlign = R1.hAlign = self.hAlign
>         R0.vAlign = R1.vAlign = self.vAlign
> +        if self._spanCmds:
> +            spans0,spans1=self._cloneSpanCommands(n)
> +            R0._spanCmds=spans0
> +            R1._spanCmds=spans1
>         self.onSplit(R0)
>         self.onSplit(R1)
>         return [R0,R1]
> +    def _cloneSpanCommands(self,n):
> +        spans0=[]
> +        spans1=[]
> +        for rng in self._spanRanges.values():
> +            if rng:
> +                if rng[0:2]!=rng[2:4]:
> +                    x1,y1,x2,y2=rng
> +                    assert (x1<=x2) and (y1<=y2), "_spanRanges does 
> contain unexpected values!"
> +                    assert not (y1<n and y2>=n) , "Something got wrong 
> with _getFirstPossibleSplitRowPosition! %r" % [ys,ye,n]
> +                    if y1< n and y2< n: spans0.append(("SPAN",(x1,y1  
> ),(x2,y2  )))
> +                    if y1>=n and y2>=n: 
> spans1.append(("SPAN",(x1,y1-n),(x2,y2-n)))
> +        return spans0,spans1
> 
>     def split(self, availWidth, availHeight):
>         self._calc(availWidth, availHeight)
> --------------------------------------------------------------------------------------------------------------------------- 
thanks and thanks again for the patch(es). I will check and all being well will 
apply to the svn tree.
-- 
Robin Becker


More information about the reportlab-users mailing list