Class: Groonga::DatabaseViewerGtk::TreeView

Inherits:
Gtk::TreeView
  • Object
show all
Defined in:
lib/groonga/database-viewer-gtk/window.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) ⇒ TreeView

Returns a new instance of TreeView.



164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/groonga/database-viewer-gtk/window.rb', line 164

def initialize(grn_table, db_path)
  super()
  @grn_table = grn_table
  @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.



162
163
164
# File 'lib/groonga/database-viewer-gtk/window.rb', line 162

def grn_table
  @grn_table
end

#updatedObject (readonly)

Returns the value of attribute updated.



161
162
163
# File 'lib/groonga/database-viewer-gtk/window.rb', line 161

def updated
  @updated
end

Instance Method Details

#create_column(name, index) ⇒ Object



189
190
191
192
193
194
195
196
197
198
199
# File 'lib/groonga/database-viewer-gtk/window.rb', line 189

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
  gtk_column.pack_start(renderer, :expand => false)
  gtk_column.add_attribute(renderer, :text, index)
end

#create_tree_viewObject



178
179
180
181
182
183
184
185
186
187
# File 'lib/groonga/database-viewer-gtk/window.rb', line 178

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



245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/groonga/database-viewer-gtk/window.rb', line 245

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



227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/groonga/database-viewer-gtk/window.rb', line 227

def load_record(model, grn_record)
  iter = model.append
  iter.set_value(ID_COLUMN_INDEX, grn_record._id)
  iter.set_value(KEY_COLUMN_INDEX, grn_record._key) if grn_record.respond_to?(:_key)
  @grn_table.columns.each_with_index do |grn_column, i|
    value = grn_record[grn_column.local_name]
    iter.set_value(i + 2, value.to_s)
    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
    iter.set_value(2 + i, value)
    GC.start if i % 100 == 0
  end
end

#update_model(limit, query = nil) ⇒ Object



201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/groonga/database-viewer-gtk/window.rb', line 201

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

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

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

  @updated = true
end