Class TaskJuggler::ReportTable
In: lib/taskjuggler/reports/ReportTable.rb
Parent: Object

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.

Methods

addColumn   addLine   lines   minWidth   new   to_csv   to_html  

Constants

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

Attributes

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

Public Class methods

Create a new ReportTable object.

[Source]

# 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
    end

Public Instance methods

This function should only be called by the ReportTableColumn constructor.

[Source]

# File lib/taskjuggler/reports/ReportTable.rb, line 50
    def addColumn(col)
      @columns << col
    end

This function should only be called by the ReportTableLine constructor.

[Source]

# File lib/taskjuggler/reports/ReportTable.rb, line 55
    def addLine(line)
      @lines << line
    end

Return the number of registered lines for this table.

[Source]

# File lib/taskjuggler/reports/ReportTable.rb, line 60
    def lines
      @lines.length
    end

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

[Source]

# File lib/taskjuggler/reports/ReportTable.rb, line 66
    def minWidth
      width = 1
      @columns.each do |column|
        cw = column.minWidth
        width += cw + 1 if cw
      end
      width
    end

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

[Source]

# File lib/taskjuggler/reports/ReportTable.rb, line 135
    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

Output the table as HTML.

[Source]

# File lib/taskjuggler/reports/ReportTable.rb, line 76
    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

[Validate]