lib/rspreadsheet/row.rb in rspreadsheet-0.2.14 vs lib/rspreadsheet/row.rb in rspreadsheet-0.2.15
- old
+ new
@@ -118,6 +118,355 @@
def parent; @worksheet end
def index; @rowi end
def set_index(value); @rowi=value end
end
+# class Row
+# def initialize
+# @readonly = :unknown
+# @cells = {}
+# end
+# def worksheet; @parent_array.worksheet end
+# def parent_array; @parent_array end # for debug only
+# def used_col_range; 1..first_unused_column_index-1 end
+# def used_range; used_col_range end
+# def first_unused_column_index; raise 'this should be redefined in subclasses' end
+# end
+
+
+# --------------------------
+
+
+# # XmlTiedArrayItemGroup is internal representation of repeated items in XmlTiedArray.
+# class XmlTiedArrayItemGroup
+# # extend Forwardable
+# # delegate [:normalize ] => :@row_group
+#
+# def normalize; @rowgroup.normalize end
+
+# end
+
+# array which synchronizes with xml structure and reflects. number-xxx-repeated attributes
+# also caches returned objects for indexes.
+# options must contain
+# :xml_items, :xml_repeated_attribute, :object_type
+
+# class XmlTiedArray < Array
+# def initialize(axmlnode, options={}) # TODO get rid of XmlTiedArray
+# @xmlnode = axmlnode
+# @options = options
+#
+# missing_options = [:xml_repeated_attribute,:xml_items_node_name,:object_type]-@options.keys
+# raise "Some options missing (#{missing_options.inspect})" unless missing_options.empty?
+#
+# unless @xmlnode.nil?
+# @xmlnode.elements.select{|node| node.name == options[:xml_items_node_name]}.each do |group_source_node|
+# self << parse_xml_to_group(group_source_node) # it is in @xmlnode so suffices to add object to @rowgroups
+# end
+# end
+# @itemcache=Hash.new()
+# end
+# def parse_xml_to_group(size_or_xmlnode) # parses xml to new RowGroup which can be added at the end
+# # reading params
+# if size_or_xmlnode.kind_of? LibXML::XML::Node
+# size = (size_or_xmlnode[@options[:xml_repeated_attribute]] || 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_index
+# # construct result
+# Rspreadsheet::XmlTiedArrayItemGroup.new(self,index..index+size-1,node)
+# end
+# def add_item_group(size_or_xmlnode)
+# result = parse_xml_to_group(size_or_xmlnode)
+# self << result
+# @xmlnode << result.xmlnode
+# result
+# end
+# def first_unused_index
+# empty? ? 1 : last.range.end+1
+# end
+# # prolonges the RowArray to cantain rowi and returns it
+# def detach_of_bound_item(index)
+# fill_row_group_size = index-first_unused_index
+# if fill_row_group_size>0
+# add_item_group(fill_row_group_size)
+# end
+# add_item_group(1)
+# get_item(index) # aby se odpoved nacacheovala
+# end
+# def get_item_group(index)
+# find{ |item_group| item_group.range.cover?(index) }
+# end
+# def detach_item(index); get_item(index) end # TODO předělat do lazy podoby, kdy tohle nebude stejny
+# def get_item(index)
+# if index>= first_unused_index
+# nil
+# else
+# @itemcache[index] ||= Rspreadsheet::XmlTiedArrayItem.new(self,index)
+# end
+# end
+# # This detaches item index from the group and perhaps splits the RowGroup
+# # into two pieces. This makes the row individually editable.
+# def detach(index)
+# group_index = get_group_index(index)
+# item_group = self[group_index]
+# range = item_group.range
+# return self if range==(index..index)
+#
+# # prepare new components
+# replaceby = []
+# replaceby << RowGroup.new(self,range.begin..index-1)
+# replaceby << (result = SingleRow.new(self,index))
+# replaceby << RowGroup.new(self,index+1..range.end)
+#
+# # put original range somewhere in replaceby and shorten it
+#
+# if index>range.begin
+# replaceby[0] = item_group
+# item_group.range = range.begin..index-1
+# else
+# replaceby[2] = item_group
+# item_group.range = index+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')
+# item_group.xmlnode.next = marker
+# item_group.xmlnode.remove!
+# replaceby.each{ |rg|
+# marker.prev = rg.xmlnode
+# }
+# marker.remove!
+#
+# # do the replacement in array
+# self[group_index..group_index]=replaceby
+# result
+# end
+# private
+# def get_group_index(index)
+# self.find_index{ |rowgroup| rowgroup.range.cover?(index) }
+# end
+# end
+
+# class XmlTiedArrayItem
+# attr_reader :index
+# def initialize(aarray,aindex)
+# @array = aarray
+# @index = aindex
+# if self.virtual?
+# @object = nil
+# else
+# @object = @array.options[:object_type].new(group.xmlnode)
+# end
+# end
+# def group; @array.get_item_group(index) end
+# def repeated?; group.repeated? end
+# def virtual?; ! self.repeated? end
+# def array
+# raise 'Group empty' if @group.nil?
+# @array
+# end
+# end
+
+# class RowArray < XmlTiedArray
+# attr_reader :row_array_cache
+# def initialize(aworksheet,aworksheet_node)
+# @worksheet = aworksheet
+# @row_array_cache = Hash.new()
+# super(aworksheet_node, :xml_items_node_name => 'table-row', :xml_repeated_attribute => xml_repeated_attribute, :object_type=>Row)
+# end
+# def get_row(rowi)
+# if @row_array_cache.has_key?(rowi)
+# return @row_array_cache[rowi]
+# end
+# item = self.get_item(rowi)
+# @row_array_cache[rowi] = if item.nil?
+# if rowi>0 then Rspreadsheet::UninitializedEmptyRow.new(self,rowi) else nil end
+# else
+# if item.repeated?
+# Rspreadsheet::MemberOfRowGroup.new(item.index, item.group.to_rowgroup)
+# else
+# Rspreadsheet::SingleRow.new_from_rowgroup(item.group.to_rowgroup)
+# end
+# end
+# end
+# # aliases
+# def first_unused_row_index; first_unused_index end
+# def worksheet; @worksheet end
+# def detach_of_bound_row_group(index)
+# super(index)
+# return get_row(index)
+# end
+# end
+
+# class Row
+# def initialize
+# @readonly = :unknown
+# @cells = {}
+# end
+# def self.empty_row_node
+# LibXML::XML::Node.new('table-row',nil, Tools.get_namespace('table'))
+# end
+# def worksheet; @parent_array.worksheet end
+# def parent_array; @parent_array end # for debug only
+# def used_col_range; 1..first_unused_column_index-1 end
+# def used_range; used_col_range end
+# def first_unused_column_index; raise 'this should be redefined in subclasses' end
+# def cells(coli)
+# coli = coli.to_i
+# return nil if coli.to_i<=0
+# @cells[coli] ||= get_cell(coli)
+# end
+# end
+
+# class RowWithXMLNode < Row
+# attr_accessor :xmlnode
+# def style_name=(value); Tools.set_ns_attribute(@xmlnode,'table','style-name',value) end
+# def get_cell(coli)
+# Cell.new(self,coli,cellnodes(coli))
+# end
+# def nonemptycells
+# nonemptycellsindexes.collect{ |index| cells(index) }
+# end
+# def nonemptycellsindexes
+# used_col_range.to_a.select do |coli|
+# cellnode = cellnodes(coli)
+# !(cellnode.content.nil? or cellnode.content.empty? or cellnode.content =='') or
+# !cellnode.attributes.to_a.reject{ |attr| attr.name == 'number-columns-repeated'}.empty?
+# end
+# end
+# def cellnodes(coli)
+# cellnode = nil
+# while true
+# curr_coli=1
+# cellnode = @xmlnode.elements.select{|n| n.name=='table-cell'}.find do |el|
+# curr_coli += (Tools.get_ns_attribute_value(el, 'table', 'number-columns-repeated') || 1).to_i
+# curr_coli > coli
+# end
+# unless cellnode.nil?
+# return cellnode
+# else
+# add_cell
+# end
+# end
+# end
+# def add_cell(repeated=1)
+# cell = Cell.new(self,first_unused_column_index)
+# Tools.set_ns_attribute(cell.xmlnode,'table','number-columns-repeated',repeated) if repeated>1
+# @xmlnode << cell.xmlnode
+# cell
+# end
+# def first_unused_column_index
+# 1 + @xmlnode.elements.select{|n| n.name=='table-cell'}.reduce(0) do |sum, el|
+# sum + (Tools.get_ns_attribute_value(el, 'table', 'number-columns-repeated') || 1).to_i
+# end
+# end
+# end
+
+# class RowGroup < RowWithXMLNode
+# @readonly = :yes_always
+# attr_reader :range
+# attr_accessor :parent_array, :xmlnode
+# def initialize(aparent_array,arange,axmlnode=nil)
+# super()
+# @parent_array = aparent_array
+# @range = arange
+# if axmlnode.nil?
+# axmlnode = Row.empty_row_node
+# Tools.set_ns_attribute(axmlnode,'table','number-rows-repeated',range.size) if range.size>1
+# end
+# @xmlnode = axmlnode
+# end
+# # returns SingleRow if size of range is 1 and nil if it is 0 or less
+# def normalize
+# case range.size
+# when 2..Float::INFINITY then self
+# when 1 then SingleRow.new_from_rowgroup(self)
+# else nil
+# end
+# end
+# def repeated; range.size end
+# def repeated?; range.size>1 end
+# def range=(arange)
+# @range=arange
+# Tools.set_ns_attribute(@xmlnode,'table','number-rows-repeated',range.size, 1)
+# end
+# end
+
+# class SingleRow < RowWithXMLNode
+# @readonly = :no
+# attr_accessor :xmlnode
+# # index Integer
+# def initialize(aparent_array,aindex,axmlnode=nil)
+# super()
+# @parent_array = aparent_array
+# @index = aindex
+# if axmlnode.nil?
+# axmlnode = Row.empty_row_node
+# end
+# @xmlnode = axmlnode
+# end
+# def self.new_from_rowgroup(rg)
+# anode = rg.xmlnode
+# Tools.remove_ns_attribute(anode,'table','number-rows-repeated')
+# SingleRow.new(rg.parent_array,rg.range.begin,anode)
+# end
+# def normalize; self end
+# def repeated?; false end
+# def repeated; 1 end
+# def range; (@index..@index) end
+# def detach; self end
+# def row; @index end
+# def still_out_of_used_range?; false end
+# end
+
+# class LazyDetachableRow < Row
+# @readonly = :yes_but_detachable
+# def initialize(rowi)
+# super()
+# @index = rowi.to_i
+# end
+# def add_cell; detach.add_cell end
+# def style_name=(value); detach.style_name=value end
+# def row; @index end
+# end
+
+# ## there are not data in this object, they are taken from RowGroup, but this is only readonly
+# class MemberOfRowGroup < LazyDetachableRow
+# @readonly = :yes_but_detachable
+# extend Forwardable
+# delegate [:repeated?, :repeated, :xmlnode, :parent_array] => :@row_group
+# attr_accessor :row_group # for dubugging
+#
+# # @index Integer
+# # @row_group RepeatedRow
+# def initialize(arowi,arow_group)
+# super(arowi)
+# @row_group = arow_group
+# raise 'Wrong parameter given - class is '+@row_group.class.to_a unless @row_group.is_a? RowGroup
+# end
+# def detach # detaches MemberOfRowGroup from its RowGroup perhaps splitting RowGroup
+# @row_group.parent_array.detach(@index)
+# end
+# def get_cell(coli)
+# c = Cell.new(self,coli,@row_group.cellnodes(coli))
+# c.mode = :repeated
+# c
+# end
+# def first_unused_column_index
+# @row_group.first_unused_column_index
+# end
+# def nonemptycells
+# @row_group.nonemptycellsindexes.collect{ |coli| cells(coli) }
+# end
+# end
+
+
end
\ No newline at end of file