Class: Groonga::DatabaseViewerGtk::Table

Inherits:
Gtk::TreeView
  • Object
show all
Defined in:
lib/groonga/database-viewer-gtk/table.rb

Constant Summary collapse

ID_COLUMN_INDEX =
0
KEY_COLUMN_INDEX =
1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(grn_table, db_path, options = {}) ⇒ Table

Returns a new instance of Table.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/groonga/database-viewer-gtk/table.rb', line 31

def initialize(grn_table, db_path, options={})
  super()
  @grn_table = grn_table
  @tooltip_column_index = @grn_table.columns.size + 2
  @wrap_width = options[:wrap_width]
  @db_path = db_path
  @updated = false
  @threads = []
  signal_connect("destroy") do
    @threads.each do |thread|
      thread.kill
    end
  end
  create_tree_view
end

Instance Attribute Details

#grn_tableObject (readonly)

Returns the value of attribute grn_table.



29
30
31
# File 'lib/groonga/database-viewer-gtk/table.rb', line 29

def grn_table
  @grn_table
end

#updatedObject (readonly)

Returns the value of attribute updated.



28
29
30
# File 'lib/groonga/database-viewer-gtk/table.rb', line 28

def updated
  @updated
end

Instance Method Details

#create_column(name, index) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/groonga/database-viewer-gtk/table.rb', line 68

def create_column(name, index)
  gtk_column = Gtk::TreeViewColumn.new
  gtk_column.title = name.gsub(/_/, "__")
  gtk_column.resizable = true
  gtk_column.set_sort_column_id(index)
  append_column(gtk_column)

  renderer = Gtk::CellRendererText.new
  renderer.wrap_width = @wrap_width if @wrap_width
  gtk_column.pack_start(renderer, :expand => false)
  gtk_column.add_attribute(renderer, :text, index)
end

#create_tree_viewObject



57
58
59
60
61
62
63
64
65
66
# File 'lib/groonga/database-viewer-gtk/table.rb', line 57

def create_tree_view
  self.rules_hint = true

  create_column("_id", ID_COLUMN_INDEX)
  create_column("_key", KEY_COLUMN_INDEX)

  @grn_table.columns.each_with_index do |grn_column, i|
    create_column(grn_column.local_name, i + 2)
  end
end

#each_records(limit, query = nil) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/groonga/database-viewer-gtk/table.rb', line 135

def each_records(limit, query=nil)
  grn_records = Groonga[@grn_table.name]
  if query
    grn_records = grn_records.select(query)
  end
  if block_given?
    grn_records.take(limit).each do |grn_record|
      yield(grn_record)
    end
  else
    grn_records.take(limit)
  end
end

#load_record(model, grn_record) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/groonga/database-viewer-gtk/table.rb', line 109

def load_record(model, grn_record)
  tooltips = {}
  iter = model.append
  iter.set_value(ID_COLUMN_INDEX, grn_record._id)
  tooltips["_id"] = grn_record._id
  if grn_record.respond_to?(:_key)
    iter.set_value(KEY_COLUMN_INDEX, grn_record._key)
    tooltips["_key"] = grn_record._key
  end
  @grn_table.columns.each_with_index do |grn_column, i|
    value = nil
    if grn_column.index?
      ids = grn_column.search(grn_record._id).records.collect {|record| record._id}
      value = "#{ids.size}, #{ids.to_s}"
    else
      value = grn_record[grn_column.local_name].to_s
    end
    tooltips[grn_column.local_name] = value
    iter.set_value(2 + i, value)
    GC.start if i % 100 == 0
  end
  tooltip_json = tooltips.to_json
  escaped_tooltip_json = CGI.escapeHTML(tooltip_json)
  iter.set_value(@tooltip_column_index, escaped_tooltip_json)
end

#selected_iterObject



53
54
55
# File 'lib/groonga/database-viewer-gtk/table.rb', line 53

def selected_iter
  selection.selected
end

#selected_textObject



47
48
49
50
51
# File 'lib/groonga/database-viewer-gtk/table.rb', line 47

def selected_text
  return nil unless selected_iter
  escaped_text = selected_iter.get_value(@tooltip_column_index)
  CGI.unescapeHTML(escaped_text)
end

#update_model(limit, query = nil) ⇒ Object



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
# File 'lib/groonga/database-viewer-gtk/table.rb', line 81

def update_model(limit, query=nil)
  @threads.reject! do |thread|
    thread.kill
    true
  end

  column_types = @grn_table.columns.collect do |column|
                   # TODO
                   String
                 end
  column_types.unshift(String)   # _key
  column_types.unshift(Integer)  # _id
  column_types.push(String)      # TOOLTIP

  model = Gtk::ListStore.new(*column_types)
  self.model = model
  self.tooltip_column = @tooltip_column_index

  thread = Thread.new do
    each_records(limit, query).each do |grn_record|
      load_record(model, grn_record)
    end
  end
  @threads << thread

  @updated = true
end