Class: TaskJuggler::ReportTable

Inherits:
Object
  • Object
show all
Defined in:
lib/taskjuggler/reports/ReportTable.rb

Overview

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.

Direct Known Subclasses

ColumnTable

Constant Summary collapse

SCROLLBARHEIGHT =

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

20

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeReportTable

Create a new ReportTable object.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 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

Instance Attribute Details

#auxDirObject

Returns the value of attribute auxDir.



30
31
32
# File 'lib/taskjuggler/reports/ReportTable.rb', line 30

def auxDir
  @auxDir
end

#embeddedObject

Returns the value of attribute embedded.



30
31
32
# File 'lib/taskjuggler/reports/ReportTable.rb', line 30

def embedded
  @embedded
end

#equiLinesObject

Returns the value of attribute equiLines.



30
31
32
# File 'lib/taskjuggler/reports/ReportTable.rb', line 30

def equiLines
  @equiLines
end

#headerFontSizeObject (readonly)

Returns the value of attribute headerFontSize.



29
30
31
# File 'lib/taskjuggler/reports/ReportTable.rb', line 29

def headerFontSize
  @headerFontSize
end

#headerLineHeightObject (readonly)

Returns the value of attribute headerLineHeight.



29
30
31
# File 'lib/taskjuggler/reports/ReportTable.rb', line 29

def headerLineHeight
  @headerLineHeight
end

#maxIndentObject (readonly)

Returns the value of attribute maxIndent.



29
30
31
# File 'lib/taskjuggler/reports/ReportTable.rb', line 29

def maxIndent
  @maxIndent
end

#selfcontainedObject

Returns the value of attribute selfcontained.



30
31
32
# File 'lib/taskjuggler/reports/ReportTable.rb', line 30

def selfcontained
  @selfcontained
end

Instance Method Details

#addColumn(col) ⇒ Object

This function should only be called by the ReportTableColumn constructor.



54
55
56
# File 'lib/taskjuggler/reports/ReportTable.rb', line 54

def addColumn(col)
  @columns << col
end

#addLine(line) ⇒ Object

This function should only be called by the ReportTableLine constructor.



59
60
61
# File 'lib/taskjuggler/reports/ReportTable.rb', line 59

def addLine(line)
  @lines << line
end

#linesObject

Return the number of registered lines for this table.



64
65
66
# File 'lib/taskjuggler/reports/ReportTable.rb', line 64

def lines
  @lines.length
end

#minWidthObject

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



70
71
72
73
74
75
76
77
# 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) ⇒ Object

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



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# 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_htmlObject

Output the table as HTML.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
# 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