class TaskJuggler::ReportTable

This class models the intermediate format of all report tables. The generators for all the table reports create the report in this intermediate format. The to_* member functions can then output the table in the appropriate format.

Constants

SCROLLBARHEIGHT

The height in pixels of a horizontal scrollbar on an HTML page. This value should be large enough to work for all browsers.

Attributes

auxDir[RW]
embedded[RW]
equiLines[RW]
headerFontSize[R]
headerLineHeight[R]
maxIndent[R]
selfcontained[RW]

Public Class Methods

new() click to toggle source

Create a new ReportTable object.

# File lib/taskjuggler/reports/ReportTable.rb, line 32
def initialize
  # The height if the header lines in screen pixels.
  @headerLineHeight = 19
  # Size of the font used in the header
  @headerFontSize = 15
  # Array of ReportTableColumn objects.
  @columns = []
  # Array of ReportTableLine objects.
  @lines = []
  @maxIndent = 0
  # Whether or not all table lines must have same height.
  @equiLines = false
  # True if the table is embedded as a column of another ReportTable.
  @embedded = false
  # True if the report does not rely on the data of other files.
  @selfcontained = false
  # Path to the auxiliary data directory.
  @auxDir = ''
end

Public Instance Methods

addColumn(col) click to toggle source

This function should only be called by the ReportTableColumn constructor.

# File lib/taskjuggler/reports/ReportTable.rb, line 53
def addColumn(col)
  @columns << col
end
addLine(line) click to toggle source

This function should only be called by the ReportTableLine constructor.

# File lib/taskjuggler/reports/ReportTable.rb, line 58
def addLine(line)
  @lines << line
end
lines() click to toggle source

Return the number of registered lines for this table.

# File lib/taskjuggler/reports/ReportTable.rb, line 63
def lines
  @lines.length
end
minWidth() click to toggle source

Return the minimum required width for the table. If we don't have a mininum with, nil is returned.

# File lib/taskjuggler/reports/ReportTable.rb, line 69
def minWidth
  width = 1
  @columns.each do |column|
    cw = column.minWidth
    width += cw + 1 if cw
  end
  width
end
to_csv(csv = [[ ]], startColumn = 0) click to toggle source

Convert the intermediate representation into an Array of Arrays. csv is the destination Array of Arrays. It may contain columns already.

# File lib/taskjuggler/reports/ReportTable.rb, line 138
def to_csv(csv = [[ ]], startColumn = 0)
  # Generate the header line.
  columnIdx = startColumn
  @columns.each do |col|
    columnIdx += col.to_csv(csv, columnIdx)
  end

  if @embedded
    columnIdx - startColumn
  else
    # Content of embedded tables is inserted when generating the
    # respective Line.
    lineIdx = 1
    @lines.each do |line|
      # Insert a new Array for each line.
      csv[lineIdx] = []
      line.to_csv(csv, startColumn, lineIdx)
      lineIdx += 1
    end
    csv
  end
end
to_html() click to toggle source

Output the table as HTML.

# File lib/taskjuggler/reports/ReportTable.rb, line 79
def to_html
  determineMaxIndents

  attr = { 'class' => 'tj_table',
           'cellspacing' => '1' }
  attr['style'] = 'width:100%; ' if @embedded
  table = XMLElement.new('table', attr)
  table << (tbody = XMLElement.new('tbody'))

  # Generate the 1st table header line.
  allCellsHave2Rows = true
  lineHeight = @headerLineHeight
  @columns.each do |col|
    if col.cell1.rows != 2 && !col.cell1.special
      allCellsHave2Rows = false
      break;
    end
  end
  if allCellsHave2Rows
    @columns.each { |col| col.cell1.rows = 1 }
    lineHeight = @headerLineHeight * 2 + 1
  end

  tbody << (tr =
            XMLElement.new('tr', 'class' => 'tabhead',
                           'style' => "height:#{lineHeight}px; " +
                                      "font-size:#{@headerFontSize}px;"))
  @columns.each { |col| tr << col.to_html(1) }

  unless allCellsHave2Rows
    # Generate the 2nd table header line.
    tbody << (tr =
              XMLElement.new('tr', 'class' => 'tabhead',
                             'style' => "height:#{@headerLineHeight}px; " +
    "font-size:#{@headerFontSize}px;"))
    @columns.each { |col| tr << col.to_html(2) }
  end

  # Generate the rest of the table.
  @lines.each { |line| tbody << line.to_html }

  # In case we have columns with scrollbars, we generate an extra line with
  # cells for all columns that don't have a scrollbar. The scrollbar must
  # have a height of SCROLLBARHEIGHT pixels or less.
  if hasScrollbar?
    tbody << (tr = XMLElement.new('tr',
                                  'style' => "height:#{SCROLLBARHEIGHT}px"))
    @columns.each do |column|
      unless column.scrollbar
        tr << XMLElement.new('td')
      end
    end
  end

  table
end