Class TaskJuggler::TableColumnSorter
In: lib/taskjuggler/TableColumnSorter.rb
Parent: Object

This class can rearrange the columns of a table according to a new order determined by an Array of table headers. The table is an Array of table lines. Each line is another Array. The first line of the table is an Array of the headers of the columns.

Methods

new   sort  

Attributes

discontinuedColumns  [R] 

Public Class methods

Register a new table for rearranging.

[Source]

# File lib/taskjuggler/TableColumnSorter.rb, line 25
    def initialize(table)
      @oldTable = table
      @discontinuedColumns = nil
    end

Public Instance methods

Rearrange the registered table. The old table won‘t be modified. The method returns a new table (Array of Arrays). newHeaders is an Array that represents the new column headers. The columns that are not in the new header will be the last columns of the new table.

[Source]

# File lib/taskjuggler/TableColumnSorter.rb, line 34
    def sort(newHeaders)
      # Maps old index to new index.
      columnIdxMap = {}
      newHeaderIndex = newHeaders.length
      oldHeaders = @oldTable[0]
      discontinuedHeaders = []
      oldHeaders.length.times do |i|
        if (ni = newHeaders.index(oldHeaders[i]))
          # This old column is still in the new header
          columnIdxMap[i] = ni
        else
          # This old column is no longer contained in the new header. We
          # append it at the end.
          columnIdxMap[i] = newHeaderIndex
          discontinuedHeaders << oldHeaders[i]
          newHeaderIndex += 1
        end
      end

      # We construct a new table from scratch. All values from the old table
      # are copied over. columns in the new table that were not contained in
      # the old table will be filled with nil.
      newTable = []
      @oldTable.length.times do |lineIdx|
        oldLine = @oldTable[lineIdx]
        if lineIdx == 0
          # Insert the new headers. The discontinued ones will be added below.
          newTable[0] = newHeaders
        else
          # Add a line of nils to the new table.
          newTable[lineIdx] = Array.new(newHeaderIndex, nil)
        end

        # Copy the old column to the new position.
        columnIdxMap.each do |oldColIdx, newColIdx|
          newTable[lineIdx][newColIdx] = oldLine[oldColIdx]
        end
      end

      # Now we need to add the new column headers that were not in the old
      # headers.
      #newTable[0] += discontinuedHeaders

      @discontinuedColumns = discontinuedHeaders.length
      newTable
    end

[Validate]