Class: Prawn::FlexibleTable::Cell

Inherits:
Object
  • Object
show all
Defined in:
lib/prawn/flexible-table/cell.rb

Overview

A cell is a special-purpose bounding box designed to flow text within a bordered area. This is used by Prawn’s Document::FlexibleTable implementation but can also be used standalone for drawing text boxes via Document#f_cell

Direct Known Subclasses

CellFake

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Cell

Creates a new cell object. Generally used indirectly via Document#f_cell

Of the available options listed below, :point, :width, and :text must be provided. If you are not using the Document#f_cell shortcut, the :document must also be provided.

:point

Absolute [x,y] coordinate of the top-left corner of the cell.

:document

The Prawn::Document object to render on.

:text

The text to be flowed within the cell

:text_color

The color of the text to be displayed

:width

The width in PDF points of the cell.

:height

The height in PDF points of the cell.

:horizontal_padding

The horizontal padding in PDF points

:vertical_padding

The vertical padding in PDF points

:padding

Overrides both horizontal and vertical padding

:align

One of :left, :right, :center

:borders

An array of sides which should have a border. Any of :top, :left, :right, :bottom

:border_width

The border line width. Defaults to 1.

:border_style

One of :all, :no_top, :no_bottom, :sides, :none, :bottom_only. Defaults to :all.

:border_color

The color of the cell border.

:font_size

The font size for the cell text.

:font_style

The font style for the cell text.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/prawn/flexible-table/cell.rb', line 31

def initialize(options={})
  @point        = options[:point]
  @document     = options[:document]
  @text         = options[:text].to_s
  @text_color   = options[:text_color]
  @width        = options[:width]
  @height       = options[:height]
  @borders      = options[:borders]
  @border_width = options[:border_width] || 1
  @border_style = options[:border_style] || :all
  @border_color = options[:border_color]
  @background_color = options[:background_color]
  @align            = options[:align] || :left
  @font_size        = options[:font_size]
  @font_style       = options[:font_style]

  @horizontal_padding = options[:horizontal_padding] || 0
  @vertical_padding   = options[:vertical_padding]   || 0

  if options[:padding]
    @horizontal_padding = @vertical_padding = options[:padding]
  end

  @rowspan = options[:rowspan] || 1
  @colspan = options[:colspan] || 1
end

Instance Attribute Details

#alignObject

Returns the value of attribute align.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def align
  @align
end

#background_colorObject

Returns the value of attribute background_color.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def background_color
  @background_color
end

#border_colorObject

Returns the value of attribute border_color.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def border_color
  @border_color
end

#border_styleObject

Returns the value of attribute border_style.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def border_style
  @border_style
end

#border_widthObject

Returns the value of attribute border_width.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def border_width
  @border_width
end

#borders=(value) ⇒ Object

Sets the attribute borders

Parameters:

  • value

    the value to set the attribute borders to.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def borders=(value)
  @borders = value
end

#colspanObject

Returns the value of attribute colspan.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def colspan
  @colspan
end

#documentObject

Returns the value of attribute document.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def document
  @document
end

#font_sizeObject

Returns the value of attribute font_size.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def font_size
  @font_size
end

#font_styleObject

Returns the value of attribute font_style.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def font_style
  @font_style
end

#heightObject

The height of the cell in PDF points



81
82
83
# File 'lib/prawn/flexible-table/cell.rb', line 81

def height
  @height || text_area_height + 2*@vertical_padding
end

#horizontal_paddingObject

Returns the value of attribute horizontal_padding.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def horizontal_padding
  @horizontal_padding
end

#pointObject

Returns the value of attribute point.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def point
  @point
end

#rowspanObject

Returns the value of attribute rowspan.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def rowspan
  @rowspan
end

#text_colorObject

Returns the value of attribute text_color.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def text_color
  @text_color
end

#vertical_paddingObject

Returns the value of attribute vertical_padding.



58
59
60
# File 'lib/prawn/flexible-table/cell.rb', line 58

def vertical_padding
  @vertical_padding
end

#widthObject

The width of the cell in PDF points



76
77
78
# File 'lib/prawn/flexible-table/cell.rb', line 76

def width
  @width || (@document.width_of(@text, :size => @font_size)) + 2*@horizontal_padding
end

Instance Method Details

#drawObject

Draws the cell onto the PDF document



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/prawn/flexible-table/cell.rb', line 99

def draw
  rel_point = @point

  if @background_color
    @document.mask(:fill_color) do
      @document.fill_color @background_color
      h  = borders.include?(:bottom) ?
        height - border_width : height + border_width / 2.0
      @document.fill_rectangle [rel_point[0] + border_width / 2.0,
                                rel_point[1] - border_width / 2.0 ],
          width - border_width, h
    end
  end

  if @border_width > 0
    @document.mask(:line_width) do
      @document.line_width = @border_width

      @document.mask(:stroke_color) do
        @document.stroke_color @border_color if @border_color

        if borders.include?(:left)
          @document.stroke_line [rel_point[0], rel_point[1] + (@border_width / 2.0)],
            [rel_point[0], rel_point[1] - height - @border_width / 2.0 ]
        end

        if borders.include?(:right)
          @document.stroke_line(
            [rel_point[0] + width, rel_point[1] + (@border_width / 2.0)],
            [rel_point[0] + width, rel_point[1] - height - @border_width / 2.0] )
        end

        if borders.include?(:top)
          @document.stroke_line(
            [ rel_point[0] + @border_width / 2.0, rel_point[1] ],
            [ rel_point[0] - @border_width / 2.0 + width, rel_point[1] ])
        end

        if borders.include?(:bottom)
          @document.stroke_line [rel_point[0], rel_point[1] - height ],
                              [rel_point[0] + width, rel_point[1] - height]
        end
      end

    end

    borders

  end

  @document.bounding_box( [@point[0] + @horizontal_padding,
                           @point[1] - @vertical_padding],
                          :width   => text_area_width,
                          :height  => height - @vertical_padding) do
    @document.move_down((@document.font.line_gap - @document.font.descender)/2)

    options = {:align => @align, :final_gap => false}

    options[:size] = @font_size if @font_size
    options[:style] = @font_style if @font_style

    @document.mask(:fill_color) do
      @document.fill_color @text_color if @text_color
      @document.text @text, options
    end
  end
end

#text_area_heightObject

The height of the text area excluding the vertical padding



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/prawn/flexible-table/cell.rb', line 86

def text_area_height
  text_height = 0
  if @font_size
    @document.font_size(@font_size) do
      text_height = @document.height_of(@text, :width => text_area_width)
    end
  else
    text_height = @document.height_of(@text, :width => text_area_width)
  end
  text_height
end

#text_area_widthObject

The width of the text area excluding the horizonal padding



71
72
73
# File 'lib/prawn/flexible-table/cell.rb', line 71

def text_area_width
  width - 2*@horizontal_padding
end

#to_sObject

Returns the cell’s text as a string.



66
67
68
# File 'lib/prawn/flexible-table/cell.rb', line 66

def to_s
  @text
end