class Canis::DefaultTreeModel

Attributes

asks_allow_children[R]
root_visible[RW]

Public Class Methods

new(node=nil, asks_allow_children=false, &block) click to toggle source
# 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

<<(nodechild, allows_children=true, &block)
Alias for: add
add(nodechild, allows_children=true, &block) click to toggle source

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
Also aliased as: <<
branch(node, &block) click to toggle source
# File lib/canis/core/widgets/tree/treemodel.rb, line 64
def branch node, &block
  add node, true, &block
end
child_at(parent, index) click to toggle source
# File lib/canis/core/widgets/tree/treemodel.rb, line 74
def child_at parent, index
end
child_count(node) click to toggle source
# File lib/canis/core/widgets/tree/treemodel.rb, line 78
def child_count node
  node.children.size
end
data=(data) click to toggle source

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
delete(obj) click to toggle source
# 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
delete_all() click to toggle source

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
delete_at(row) click to toggle source
# 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
get_value_at(row, col) click to toggle source

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
index_of_child(parent, child) click to toggle source
# File lib/canis/core/widgets/tree/treemodel.rb, line 76
def index_of_child parent, child
end
insert(row, obj) click to toggle source
# 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
insert_node_into(nodechild, nodeparent, index) click to toggle source
# 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
leaf(node, &block) click to toggle source
# File lib/canis/core/widgets/tree/treemodel.rb, line 61
def leaf node, &block
  add node, false, &block
end
root(*args, &block) click to toggle source
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
row_count() click to toggle source
# File lib/canis/core/widgets/tree/treemodel.rb, line 82
def row_count
  @data.length
end
set_value_at(row, col, val) click to toggle source
# 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
traverse(node=@root, level=0) click to toggle source

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
undo(where) click to toggle source

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