class TaskJuggler::ReportTableCell

This class models the output format independent version of a cell in a TableReport. It belongs to a certain ReportTableLine and ReportTableColumn. Normally a cell contains text on a colored background. By help of the @special variable it can alternatively contain any object the provides the necessary output methods such as to_html.

Attributes

alignment[RW]
bold[RW]
category[RW]
cellColor[RW]
columns[RW]
data[RW]
fontColor[RW]
fontSize[RW]
hidden[RW]
icon[RW]
iconTooltip[RW]
indent[RW]
line[R]
padding[RW]
rows[RW]
showTooltipHint[RW]
special[RW]
text[RW]
tooltip[RW]
width[RW]

Public Class Methods

new(line, query, text = nil, headerCell = false) click to toggle source

Create the ReportTableCell object and initialize the attributes to some default values. line is the ReportTableLine this cell belongs to. text is the text that should appear in the cell. headerCell is a flag that must be true only for table header cells.

# File lib/taskjuggler/reports/ReportTableCell.rb, line 34
def initialize(line, query, text = nil, headerCell = false)
  @line = line
  @line.addCell(self) if line

  # Specifies whether this is a header cell or not.
  @headerCell = headerCell
  # A copy of a Query object that is needed to access project data via the
  # query function.
  @query = query ? query.dup : nil
  # The cell textual content. This may be a String or a
  # RichTextIntermediate object.
  self.text = text || ''
  # A custom text for the tooltip.
  @tooltip = nil
  # Determines if the tooltip is triggered by an special hinting icon or
  # the whole cell.
  @showTooltipHint = true
  # The original data of the cell content (optional, nil if not provided)
  @data = nil
  # Determines the background color of the cell.
  @category = nil
  # True of the cell is hidden (because other cells span multiple rows or
  # columns)
  @hidden = false
  # How to horizontally align the cell
  @alignment = :center
  # Horizontal padding between frame and cell content
  @padding = 3
  # Whether or not to indent the cell. If not nil, it is a Fixnum
  # indicating the indentation level.
  @indent = nil
  # The basename of the icon file
  @icon = nil
  # A custom tooltip for the cell icon
  @iconTooltip = nil
  # Font size of the cell text in pixels
  @fontSize = nil
  # The background color of the cell. Overwrite the @category color.
  @cellColor = nil
  # The color of the cell text font.
  @fontColor = nil
  # True of a bold font is to be used for the cell text.
  @bold = false
  # The width of the column in pixels
  @width = nil
  # The number of rows the cell spans
  @rows = 1
  # The number of columns the cell spans
  @columns = 1
  # Ignore everything and use this reference to generate the output.
  @special = nil
end

Public Instance Methods

==(c) click to toggle source

Return true if two cells are similar enough so that they can be merged in the report to a single, wider cell. c is the cell to compare this cell with.

# File lib/taskjuggler/reports/ReportTableCell.rb, line 90
def ==(c)
  @text == c.text &&
  @tooltip == c.tooltip &&
  @alignment == c.alignment &&
  @padding == c.padding &&
  @indent == c.indent &&
  @cellColor == c.cellColor &&
  @category == c.category
end
to_csv(csv, columnIdx, lineIdx) click to toggle source

Add the text content of the cell to an Array of Arrays form of the table.

# File lib/taskjuggler/reports/ReportTableCell.rb, line 154
def to_csv(csv, columnIdx, lineIdx)
  # We only support left indentation in CSV files as the spaces for right
  # indentation will be disregarded by most applications.
  indent = @indent && @alignment == :left ? '  ' * @indent : ''
  columns = 1
  if @special
    # This is for nested tables. They will be inserted as whole columns
    # in the existing table.
    csv[lineIdx][columnIdx] = nil
    columns = @special.to_csv(csv, columnIdx)
  else
    cell =
      if @data && @data.is_a?(String)
        @data
      elsif @text
        if @text.respond_to?('functionHandler')
          @text.setQuery(@query)
        end
        str = @text.to_s
        # Remove any trailing line breaks. These don't really make much
        # sense in CSV files.
        while str[-1] == ?\n
          str.chomp!
        end
        str
      end

    # Try to convert numbers and other types to their native Ruby type if
    # they are supported by CSVFile.
    native = CSVFile.strToNative(cell)

    # Only for String objects, we add the indentation.
    csv[lineIdx][columnIdx] = (native.is_a?(String) ? indent + native :
                                                      native)
  end

  return columns
end
to_html() click to toggle source

Turn the abstract cell representation into an HTML element tree.

# File lib/taskjuggler/reports/ReportTableCell.rb, line 101
def to_html
  return nil if @hidden
  return @special.to_html if @special

  # Determine cell attributes
  attribs = { }
  attribs['rowspan'] = "#{@rows}" if @rows > 1
  attribs['colspan'] = "#{@columns}" if @columns > 1
  attribs['class'] = @category ? @category : 'tabcell'
  style = ''
  style += "background-color: #{@cellColor}; " if @cellColor
  attribs['style'] = style unless style.empty?
  cell = XMLElement.new('td', attribs)

  cell << (table = XMLElement.new('table',
    'class' => @category ? 'tj_table_cell' : 'tj_table_header_cell',
    'cellspacing' => '0', 'style' => cellStyle))
  table << (row = XMLElement.new('tr'))

  calculateIndentation

  # Insert a padding cell for the left side indentation.
  if @leftIndent && @leftIndent > 0
    row << XMLElement.new('td', 'style' => "width:#{@leftIndent}px; ")
  end
  row << cellIcon(cell)

  labelDiv, tooltip = cellLabel
  row << labelDiv

  # Overwrite the tooltip if the user has specified a custom tooltip.
  tooltip = @tooltip if @tooltip
  if tooltip && !tooltip.empty? && !selfcontained
    if @showTooltipHint
      row << (td = XMLElement.new('td'))
      td << XMLElement.new('img',
                           'src' => "#{auxDir}icons/details.png",
                           'class' => 'tj_table_cell_tooltip')
      addHtmlTooltip(tooltip, td, cell)
    else
      addHtmlTooltip(tooltip, cell)
    end
  end

  # Insert a padding cell for the right side indentation.
  if @rightIndent && @rightIndent > 0
    row << XMLElement.new('td', 'style' => "width:#{@rightIndent}px; ")
  end

  cell
end