Class: Rspreadsheet::RowArray

Inherits:
Object
  • Object
show all
Defined in:
lib/rspreadsheet/row.rb

Instance Method Summary collapse

Constructor Details

#initialize(aworksheet_node) ⇒ RowArray

Returns a new instance of RowArray.



9
10
11
12
13
14
15
16
17
18
19
# File 'lib/rspreadsheet/row.rb', line 9

def initialize(aworksheet_node)
  @worksheet_node = aworksheet_node

  # initialize @rowgroups from @worksheet_node
  @rowgroups = []
  unless @worksheet_node.nil?
    @worksheet_node.elements.select{|node| node.name == 'table-row'}.each do |row_source_node|
      @rowgroups << prepare_row_group(row_source_node) # it is in @worksheet_node so suffices to add object to @rowgroups
    end
  end
end

Instance Method Details

#add_row_group(size_or_xmlnode) ⇒ Object



36
37
38
39
40
41
# File 'lib/rspreadsheet/row.rb', line 36

def add_row_group(size_or_xmlnode)
  result = prepare_row_group(size_or_xmlnode)
  @rowgroups << result
  @worksheet_node << result.xmlnode
  result
end

#detach(rowi) ⇒ Object

This detaches row rowi from the group and perhaps splits the RowGroup into two pieces. This makes the row individually editable.



73
74
75
76
77
78
79
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
# File 'lib/rspreadsheet/row.rb', line 73

def detach(rowi)
  index = get_row_group_index(rowi)
  row_group = @rowgroups[index]
  range = row_group.range

  # prepare new components
  replaceby = []
  replaceby << RowGroup.new(self,range.begin..rowi-1)
  replaceby << (result = SingleRow.new(self,rowi))
  replaceby << RowGroup.new(self,rowi+1..range.end)
  
  # put original range somewhere in replaceby and shorten it
  if rowi>range.begin
    replaceby[0] = row_group
    row_group.range = range.begin..rowi-1
  else
    replaceby[2] = row_group
    row_group.range = rowi+1..range.end
  end
  
  # normalize and delete empty parts
  replaceby = replaceby.map(&:normalize).compact
  
  # do the replacement in xml
  marker = LibXML::XML::Node.new('temporarymarker')
  row_group.xmlnode.next = marker
  row_group.xmlnode.remove!
  replaceby.each{ |rg| 
    marker.prev = rg.xmlnode
  } 
  marker.remove!
  
  # do the replacement in array
  @rowgroups[index..index]=replaceby
  result
end

#detach_of_bound_row_group(rowi) ⇒ Object

prolonges the RowArray to cantain rowi and returns it



56
57
58
59
60
61
62
63
# File 'lib/rspreadsheet/row.rb', line 56

def detach_of_bound_row_group(rowi)
  fill_row_group_size = rowi-first_unused_row_index
  if fill_row_group_size>0
    add_row_group(fill_row_group_size) 
  end
  add_row_group(1)
  return get_row(rowi)
end

#first_unused_row_indexObject



64
65
66
67
68
69
70
# File 'lib/rspreadsheet/row.rb', line 64

def first_unused_row_index
  if @rowgroups.empty? 
    1
  else
    @rowgroups.last.range.end+1
  end
end

#get_row(rowi) ⇒ Object



45
46
47
48
49
50
51
52
53
54
# File 'lib/rspreadsheet/row.rb', line 45

def get_row(rowi)
  rg = get_row_group(rowi).andand.normalize
  case rg
    when SingleRow then rg
    when RowGroup then MemberOfRowGroup.new(rowi, rg)
    when nil
     if rowi>0 then UninitializedEmptyRow.new(self,rowi) else nil end
    else raise
  end
end

#get_row_group(rowi) ⇒ Object



42
43
44
# File 'lib/rspreadsheet/row.rb', line 42

def get_row_group(rowi)
  @rowgroups.find{ |rowgroup| rowgroup.range.cover?(rowi) }
end

#prepare_row_group(size_or_xmlnode) ⇒ Object

appends new RowGroup at the end



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/rspreadsheet/row.rb', line 20

def prepare_row_group(size_or_xmlnode)  # appends new RowGroup at the end
  # reading params
  if size_or_xmlnode.kind_of? LibXML::XML::Node
    size = (size_or_xmlnode['number-rows-repeated'] || 1).to_i
    node = size_or_xmlnode
  elsif size_or_xmlnode.to_i>0
    size = size_or_xmlnode.to_i
    node = nil
  else
    return nil
  end
  index = first_unused_row_index
  
  # construct result
  RowGroup.new(self,index..index+size-1,node).normalize
end