Files
PyRIGS/z3c/rml/storyplace.py
2014-12-07 17:32:25 +00:00

113 lines
3.5 KiB
Python

##############################################################################
#
# Copyright (c) 2012 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""``pdfInclude`` Directive.
"""
__docformat__ = "reStructuredText"
from reportlab.platypus import flowables
from z3c.rml import attr, flowable, interfaces, occurence
class StoryPlaceFlowable(flowables.Flowable):
def __init__(self, x, y, width, height, origin, flows):
flowables.Flowable.__init__(self)
self.x = x
self.y = y
self.width = width
self.height = height
self.origin = origin
self.flows = flows
def wrap(self, *args):
return (0, 0)
def draw(self):
saveState = False
x, y = self.x, self.y
self.canv.restoreState()
if self.origin == 'frame':
x += self._frame._x1
y += self._frame._y1
elif self.origin == 'local':
x += self._frame._x
y += self._frame._y
else:
# origin == 'page'
pass
width, height = self.width, self.height
y += height
for flow in self.flows.flow:
flowWidth, flowHeight = flow.wrap(width, height)
if flowWidth <= width and flowHeight <= height:
y -= flowHeight
flow.drawOn(self.canv, x, y)
height -= flowHeight
else:
raise ValueError("Not enough space")
self.canv.saveState()
class IStoryPlace(interfaces.IRMLDirectiveSignature):
"""Draws a set of flowables on the canvas within a given region."""
x = attr.Measurement(
title=u'X-Coordinate',
description=(u'The X-coordinate of the lower-left position of the '
u'place.'),
required=True)
y = attr.Measurement(
title=u'Y-Coordinate',
description=(u'The Y-coordinate of the lower-left position of the '
u'place.'),
required=True)
width = attr.Measurement(
title=u'Width',
description=u'The width of the place.',
required=False)
height = attr.Measurement(
title=u'Height',
description=u'The height of the place.',
required=False)
origin = attr.Choice(
title=u'Origin',
description=u'The origin of the coordinate system for the story.',
choices=('page', 'frame', 'local'),
default = 'page',
required=False)
class StoryPlace(flowable.Flowable):
signature = IStoryPlace
def process(self):
x, y, width, height, origin = self.getAttributeValues(
select=('x', 'y', 'width', 'height', 'origin'), valuesOnly=True)
flows = flowable.Flow(self.element, self.parent)
flows.process()
self.parent.flow.append(
StoryPlaceFlowable(x, y, width, height, origin, flows))
flowable.Flow.factories['storyPlace'] = StoryPlace
flowable.IFlow.setTaggedValue(
'directives',
flowable.IFlow.getTaggedValue('directives') +
(occurence.ZeroOrMore('storyPlace', IStoryPlace),)
)