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 33
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 54
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 59
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 64
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 70
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 139
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 80
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

Private Instance Methods

determineMaxIndents() click to toggle source

Some columns need to be indented when the data is sorted in tree mode. This function determines the largest needed indentation of all lines. The result is stored in the _@maxIndent_ variable.

# File lib/taskjuggler/reports/ReportTable.rb, line 167
def determineMaxIndents
  @maxIndent = 0
  @lines.each do |line|
    @maxIndent = line.indentation if line.indentation > @maxIndent
  end
end
hasScrollbar?() click to toggle source

Returns true if any of the columns has a scrollbar.

# File lib/taskjuggler/reports/ReportTable.rb, line 175
def hasScrollbar?
  @columns.each { |col| return true if col.scrollbar }
  false
end