class Canis::DefaultTreeModel
Attributes
Public Class Methods
# File lib/canis/core/widgets/tree/treemodel.rb, line 14 def initialize node=nil, asks_allow_children=false, &block @root_visible = true root(node, asks_allow_children) if node instance_eval &block if block_given? end
Public Instance Methods
add a node to root passing a block optionally @param [String, TreeNode
, Array, Hash] node/s to add @param [Boolean] allow children to be added @see TreeNode.add
@return [TreeNode] node just added to root (NOT self)
# File lib/canis/core/widgets/tree/treemodel.rb, line 50 def add nodechild, allows_children=true, &block # calling TreeNode.add $log.debug " XXX def add of DTM #{nodechild} to root " node = @root.add nodechild, allows_children, &block if @handler # only if someone is listening, won't fire when being prepared tme = TreeModelEvent.new(row, row,:ALL_COLUMNS, self, :INSERT) fire_handler :TREE_MODEL_EVENT, tme end #return @root return node end
# File lib/canis/core/widgets/tree/treemodel.rb, line 64 def branch node, &block add node, true, &block end
# File lib/canis/core/widgets/tree/treemodel.rb, line 74 def child_at parent, index end
# File lib/canis/core/widgets/tree/treemodel.rb, line 78 def child_count node node.children.size end
for those quick cases when you wish to replace all the data and not have an event per row being generated
# File lib/canis/core/widgets/tree/treemodel.rb, line 161 def data=(data) raise "not yet used" raise "Data nil or invalid" if data.nil? or data.size == 0 delete_all @data = data tme = TreeModelEvent.new(0, @data.length-1,:ALL_COLUMNS, self, :INSERT) fire_handler :TREE_MODEL_EVENT, tme end
# File lib/canis/core/widgets/tree/treemodel.rb, line 110 def delete obj raise "not yet used" row = @data.index obj return if row.nil? ret = @data.delete obj tme = TreeModelEvent.new(row, row,:ALL_COLUMNS, self, :DELETE) fire_handler :TREE_MODEL_EVENT, tme # create tablemodelevent and fire_table_changed for all listeners return ret end
added 2009-01-17 21:36 Use with caution, does not call events per row
# File lib/canis/core/widgets/tree/treemodel.rb, line 151 def delete_all raise "not yet used" len = @data.length-1 @data=[] tme = TreeModelEvent.new(0, len,:ALL_COLUMNS, self, :DELETE) fire_handler :TREE_MODEL_EVENT, tme end
# File lib/canis/core/widgets/tree/treemodel.rb, line 120 def delete_at row raise "not yet used" if !$multiplier or $multiplier == 0 @delete_buffer = @data.delete_at row else @delete_buffer = @data.slice!(row, $multiplier) end $multiplier = 0 #ret = @data.delete_at row # create tablemodelevent and fire_table_changed for all listeners # we don;t pass buffer to event as in listeditable. how to undo later? tme = TreeModelEvent.new(row, row+@delete_buffer.length,:ALL_COLUMNS, self, :DELETE) fire_handler :TREE_MODEL_EVENT, tme return @delete_buffer end
please avoid directly hitting this. Suggested to use get_value_at
of jtable since columns could have been switched.
# File lib/canis/core/widgets/tree/treemodel.rb, line 96 def get_value_at row, col raise "not yet used" #$log.debug " def get_value_at #{row}, #{col} " raise "IndexError get_value_at #{row}, #{col}" if @data.nil? or row >= @data.size return @data[row][ col] end
# File lib/canis/core/widgets/tree/treemodel.rb, line 76 def index_of_child parent, child end
# File lib/canis/core/widgets/tree/treemodel.rb, line 68 def insert row, obj @data.insert row, obj if @handler # only if someone is listening, won't fire when being prepared tme = TreeModelEvent.new(row, row,:ALL_COLUMNS, self, :INSERT) fire_handler :TREE_MODEL_EVENT, tme end def child_at parent, index end def index_of_child parent, child end def child_count node node.children.size end def row_count @data.length end # def set_value_at row, col, val # if editing allowed raise "not yet used" @data[row][col] = val tme = TreeModelEvent.new(row, row, col, self, :UPDATE) fire_handler :TREE_MODEL_EVENT, tme end ## # please avoid directly hitting this. Suggested to use get_value_at of jtable # since columns could have been switched. def get_value_at row, col raise "not yet used" #$log.debug " def get_value_at #{row}, #{col} " raise "IndexError get_value_at #{row}, #{col}" if @data.nil? or row >= @data.size return @data[row][ col] end #def << obj #@data << obj #tme = TreeModelEvent.new(@data.length-1,@data.length-1, :ALL_COLUMNS, self, :INSERT) #fire_handler :TREE_MODEL_EVENT, tme #end # create tablemodelevent and fire_table_changed for all listeners end
# File lib/canis/core/widgets/tree/treemodel.rb, line 36 def insert_node_into nodechild, nodeparent, index $log.debug " TODO remove from existing parent to avoid bugs XXX" nodeparent.insert nodechild, index if @handler # only if someone is listening, won't fire when being prepared tme = TreeModelEvent.new(row, row,:ALL_COLUMNS, self, :INSERT) fire_handler :TREE_MODEL_EVENT, tme end self end
# File lib/canis/core/widgets/tree/treemodel.rb, line 61 def leaf node, &block add node, false, &block end
insert a node the old sucky java pain in the butt way private sets node as root
def root node, asks_allow_children
=false, &block
# File lib/canis/core/widgets/tree/treemodel.rb, line 23 def root *args, &block return @root if args.empty? node = args[0] @asks_allow_children = args[1] if !node.is_a? TreeNode n = TreeNode.new node node = n end @root = node $log.debug " XXX def root created root with #{node} " #add node, true, &block instance_eval &block if block_given? end
# File lib/canis/core/widgets/tree/treemodel.rb, line 82 def row_count @data.length end
# File lib/canis/core/widgets/tree/treemodel.rb, line 86 def set_value_at row, col, val # if editing allowed raise "not yet used" @data[row][col] = val tme = TreeModelEvent.new(row, row, col, self, :UPDATE) fire_handler :TREE_MODEL_EVENT, tme end
def ask_search_forward regex = get_string “Enter regex to search for:” ix = get_list_data_model.find_match regex if ix.nil? alert(“No matching data for: #{regex}”) else set_focus_on(ix) end end
continues previous search
def find_match regex, ix0=0, ix1=row_count() $log.debug “ find_match got #{regex} #{ix0} #{ix1}” @last_regex = regex @search_start_ix = ix0 @search_end_ix = ix1 @data.each_with_index do |row, ix| next if ix < ix0 break if ix > ix1 if row.grep(/#{regex}/) != []
if !row.match(regex).nil?
@search_found_ix = ix return ix end end return nil end def find_prev regex=@last_regex, start = @search_found_ix raise “No previous search” if @last_regex.nil? $log.debug “ find_prev #{@search_found_ix} : #{@current_index}” start -= 1 unless start == 0 @last_regex = regex @search_start_ix = start start.downto(0) do |ix| row = @data if row.grep(/#{regex}/) != [] @search_found_ix = ix return ix end end return nil
return find_match @last_regex, start, @search_end_ix
end
dtm findnext
def find_next raise “No more search” if @last_regex.nil? start = @search_found_ix && @search_found_ix+1 || 0 return find_match @last_regex, start, @search_end_ix end
just a test program
# File lib/canis/core/widgets/tree/treemodel.rb, line 219 def traverse node=@root, level=0 icon = node.is_leaf? ? "-" : "+" puts "%*s %s" % [ level+1, icon, node.user_object ] node.children.each do |e| traverse e, level+1 end end
a quick method to undo deletes onto given row. More like paste
# File lib/canis/core/widgets/tree/treemodel.rb, line 136 def undo where raise "not yet used" return unless @delete_buffer case @delete_buffer[0] when Array @delete_buffer.each do |r| insert where, r end else insert where, @delete_buffer end end