require 'rubyXL/objects/ooxml_object' module RubyXL # http://www.schemacentral.com/sc/ooxml/e-ssml_col-1.html class ColumnRange < OOXMLObject define_attribute(:min, :uint, :required => true) define_attribute(:max, :uint, :required => true) define_attribute(:width, :double) define_attribute(:style, :uint, :default => 0, :accessor => :style_index) define_attribute(:hidden, :bool, :default => false) define_attribute(:bestFit, :bool, :default => false) define_attribute(:customWidth, :bool, :default => false) define_attribute(:phonetic, :bool, :default => false) define_attribute(:outlineLevel, :int, :default => 0) define_attribute(:collapsed, :bool, :default => false) define_element_name 'col' def delete_column(col_index) col = col_index + 1 self.min -=1 if min >= col self.max -=1 if max >= col end def insert_column(col_index) col = col_index + 1 self.min +=1 if min >= col self.max +=1 if max >= col - 1 end def include?(col_index) ((min-1)..(max-1)).include?(col_index) end DEFAULT_WIDTH = 9 end class ColumnRanges < OOXMLContainerObject define_child_node(RubyXL::ColumnRange, :collection => true) define_element_name 'cols' # Locate an existing column range, make a new one if not found, # or split existing column range into multiples. def get_range(col_index) col_num = col_index + 1 old_range = self.locate_range(col_index) if old_range.nil? then new_range = RubyXL::ColumnRange.new else if old_range.min == col_num && old_range.max == col_num then return old_range # Single column range, OK to change in place elsif old_range.min == col_num then new_range = old_range.dup old_range.min += 1 elsif old_range.max == col_num then new_range = old_range.dup old_range.max -= 1 else range_before = old_range.dup range_before.max = col_index # col_num - 1 self << range_before old_range.min = col_num + 1 new_range = RubyXL::ColumnRange.new end end new_range.min = new_range.max = col_num self << new_range return new_range end def locate_range(col_index) self.find { |range| range.include?(col_index) } end def insert_column(col_index) self.each { |range| range.insert_column(col_index) } end def before_write_xml self.sort_by!{ |r| r.min } !(self.empty?) end end end