mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-25 09:22:21 +00:00
113 lines
3.5 KiB
Python
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),)
|
|
)
|