diff options
| author | Fabien Pinckaers <fp@tinyerp.com> | 2009-03-15 20:07:01 +0100 |
|---|---|---|
| committer | Fabien Pinckaers <fp@tinyerp.com> | 2009-03-15 20:07:01 +0100 |
| commit | 81ed36a9f2e28ae426b07f4dbf4bf444728b2166 (patch) | |
| tree | f68937f7873228898c56d2808de59594b8e057e1 /bin/pychart/text_box.py | |
| parent | 4ab081becaa3822c8965933603924504694f5c11 (diff) | |
Adding Pychart due to bug in recent pychart versions
bzr revid: fp@tinyerp.com-20090315190701-996gxy21rdr47a8c
Diffstat (limited to 'bin/pychart/text_box.py')
| -rw-r--r-- | bin/pychart/text_box.py | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/bin/pychart/text_box.py b/bin/pychart/text_box.py new file mode 100644 index 00000000000..a624782f48d --- /dev/null +++ b/bin/pychart/text_box.py @@ -0,0 +1,152 @@ +# +# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com) +# +# Jockey is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any +# later version. +# +# Jockey is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +import canvas +import line_style +import pychart_util +import fill_style +import font +import chart_object +import color +import arrow +import text_box_doc +from pychart_types import * +from types import * + +class T(chart_object.T): + __doc__ = text_box_doc.doc + keys = {"text": (StringType, "???", "Text body. <<font>>"), + "loc": (TupleType, (0,0), + "The location of the text box."), + "line_style": (line_style.T, line_style.default, + """The line style of the surrounding frame."""), + "fill_style": (fill_style.T, fill_style.white, + "Specifies the fill style of the text box."), + "top_fudge": (UnitType, 0, + "The amount of space (in points) above the first line"), + "bottom_fudge": (UnitType, 5, + "The amount of space below the last line"), + "left_fudge": (UnitType, 5, + "The amount of space left of the box"), + "right_fudge": (UnitType, 5, + "The amount of space right of the box"), + "_arrows": (ListType, pychart_util.new_list, "The list of arrows. Not to be touched by the user directly"), + "radius": (UnitType, 0, + """Radius of the four corners of the rectangle. + If the value is zero, a sharp-cornered + rectangle is drawn."""), + "shadow": (ShadowType, None, + pychart_util.shadow_desc) + } +##AUTOMATICALLY GENERATED + +##END AUTOMATICALLY GENERATED + def get_dimension(self): + x = self.loc[0] - self.left_fudge + y = self.loc[1] - self.bottom_fudge + width = font.text_width(self.text) + self.right_fudge + self.left_fudge + height = (font.text_height(self.text))[0] + self.top_fudge + self.bottom_fudge + return (x, y, width, height) + + def choose_end_point(self, tipx, tipy): + (x, y, width, height) = self.get_dimension() + + minDist = -1 + minPoint = None + vertices = [(x, y), + (x+width, y), + (x+width, y+height), + (x, y+height)] + + if tipx >= x and tipx < x+width: + vertices.append((tipx, y)) + vertices.append((tipx, y+height)) + if tipy >= y and tipy < y+height: + vertices.append((x, tipy)) + vertices.append((x+width, tipy)) + + for startPoint in vertices: + dist = ((startPoint[0] - tipx) **2 + (startPoint[1] - tipy) **2) + if not minPoint or dist < minDist: + minPoint = startPoint + minDist = dist + + return minPoint + + def add_arrow(self, tipLoc, tail=None, arrow = arrow.default): + """This method adds a straight arrow that points to + @var{TIPLOC}, which is a tuple of integers. @var{TAIL} + specifies the starting point of the arrow. It is either None + or a string consisting of the following letters: 'l', 'c', + 'r', 't', 'm,', and 'b'. Letters 'l', 'c', or 'r' means to + start the arrow from the left, center, or right of the text + box, respectively. Letters 't', 'm', or 'b' means to start the + arrow from the top, middle or bottom of the text box. For + example, when @samp{tail = 'tc'} then arrow is drawn from + top-center point of the text box. ARROW specifies the style of + the arrow. <<arrow>>. + """ + self._arrows.append((tipLoc, tail, arrow)) + + def draw(self, can = None): + if can == None: + can = canvas.default_canvas() + x = self.loc[0] + y = self.loc[1] + text_width = font.text_width(self.text) + text_height = font.text_height(self.text)[0] + (halign, valign, angle) = font.get_align(self.text) + + if self.line_style or self.fill_style: + width = text_width+self.left_fudge+self.right_fudge + height = text_height+self.bottom_fudge+self.top_fudge + can.round_rectangle(self.line_style, self.fill_style, + x-self.left_fudge, y-self.bottom_fudge, + x-self.left_fudge+width, y-self.bottom_fudge+height, + self.radius, self.shadow) + + if halign == 'L': + can.show(x, y, self.text) + elif halign == 'C': + can.show(x+text_width/2.0, y, self.text) + elif halign == 'R': + can.show(x+text_width, y, self.text) + else: + raise Exception, "Unsupported alignment (" + halign + ")" + + # draw arrows + for t in self._arrows: + (tipLoc, tail, arrow) = t + if tail: + (x, y, width, height) = self.get_dimension() + origin = [x, y] + for ch in tail: + if ch == 'l': + origin[0] = x + elif ch == 'c': + origin[0] = x+width/2.0 + elif ch == 'r': + origin[0] = x+width + elif ch == 'b': + origin[1] = y + elif ch == 'm': + origin[1] = y+height/2.0 + elif ch == 't': + origin[1] = y+height + else: + raise ValueError, tail + ": unknown tail location spec." + else: + origin = self.choose_end_point(tipLoc[0], tipLoc[1]) + arrow.draw((origin, tipLoc), can) + + |
