1
#include "mysql_table_editor_fe.h"
2
#include "grtdb/db_object_helpers.h"
3
#include "treemodel_wrapper.h"
5
#include "mysql_table_editor_index_page.h"
7
#include <gtkmm/notebook.h>
8
#include <gtkmm/treeview.h>
9
#include <gtkmm/textview.h>
10
#include <gtkmm/comboboxtext.h>
11
#include <gtkmm/cellrenderercombo.h>
13
//------------------------------------------------------------------------------
14
DbMySQLTableEditorIndexPage::DbMySQLTableEditorIndexPage(DbMySQLTableEditor *owner
15
,MySQLTableEditorBE *be
16
,Glib::RefPtr<Gtk::Builder> xml)
21
_xml->get_widget("indexes", _indexes_tv);
22
_indexes_tv->set_enable_tree_lines(true);
23
_indexes_tv->set_headers_visible(true);
27
_indexes_tv->signal_cursor_changed().connect(sigc::mem_fun(*this, &DbMySQLTableEditorIndexPage::index_cursor_changed));
29
std::vector<std::string> asc_desc_list;
30
asc_desc_list.push_back("ASC");
31
asc_desc_list.push_back("DESC");
32
_sort_order_model = model_from_string_list(asc_desc_list);
34
_xml->get_widget("index_storage_combo", _index_storage_combo);
35
setup_combo_for_string_list(_index_storage_combo);
36
fill_combo_from_string_list(_index_storage_combo, _be->get_index_storage_types());
37
_index_storage_combo_conn = _index_storage_combo->signal_changed().connect(sigc::mem_fun(this, &DbMySQLTableEditorIndexPage::update_index_storage_type_in_be));
39
_owner->bind_entry_and_be_setter("index_key_block_size", this, &DbMySQLTableEditorIndexPage::set_index_key_block_size);
40
_owner->bind_entry_and_be_setter("index_parser", this, &DbMySQLTableEditorIndexPage::set_index_parser);
42
Gtk::TextView *text(0);
43
_xml->get_widget("index_comment", text);
44
_owner->add_text_change_timer(text, sigc::mem_fun(this, &DbMySQLTableEditorIndexPage::set_index_comment));
46
_order_model = model_from_string_list(std::vector<std::string>());
49
//------------------------------------------------------------------------------
50
void DbMySQLTableEditorIndexPage::switch_be(MySQLTableEditorBE* be)
52
_index_node = bec::NodeId();
54
_indexes_columns_model.clear();
55
Gtk::TreeView *tv = 0;
56
_xml->get_widget("index_columns", tv);
57
tv->remove_all_columns();
62
_be->get_indexes()->select_index(_index_node);
63
// refresh is done from TableEd
65
_indexes_tv->remove_all_columns();
67
_indexes_model = ListModelWrapper::create(_be->get_indexes(), _indexes_tv, "DbMySQLTableEditorIndexPage");
69
_indexes_model->model().append_string_column(0, "Index Name", EDITABLE, NO_ICON);
70
_indexes_model->model().append_combo_column(1, "Type", model_from_string_list(_be->get_index_types()), EDITABLE, true);
72
_indexes_tv->set_model(_indexes_model);
74
Gtk::CellRenderer* rend = _indexes_tv->get_column_cell_renderer(0);
75
rend->signal_editing_started().
76
connect(sigc::mem_fun(this, &DbMySQLTableEditorIndexPage::cell_editing_started));
79
//------------------------------------------------------------------------------
80
void DbMySQLTableEditorIndexPage::refresh()
82
Gtk::TreeView *tv = 0;
83
_xml->get_widget("index_columns", tv);
85
tv->remove_all_columns();
87
_index_node = bec::NodeId();
88
_be->get_indexes()->select_index(_index_node);
90
bec::ListModel* m = _indexes_model->get_be_model();
91
_indexes_model->set_be_model(0);
93
_indexes_tv->unset_model();
94
_indexes_tv->set_model(_indexes_model);
96
_indexes_model->set_be_model(m);
97
_indexes_model->refresh();
99
_indexes_tv->unset_model();
100
_indexes_tv->set_model(_indexes_model);
102
const bool has_columns = _be->get_columns()->count() > 1;
103
tv->set_sensitive(has_columns);
104
_indexes_tv->set_sensitive(has_columns);
106
index_cursor_changed();
109
//------------------------------------------------------------------------------
110
void DbMySQLTableEditorIndexPage::index_cursor_changed()
112
Gtk::TreeModel::Path path;
113
Gtk::TreeView::Column *column(0);
115
_indexes_tv->get_cursor(path, column);
117
bec::NodeId node = _indexes_model->get_node_for_path(path);
120
update_index_details();
123
//------------------------------------------------------------------------------
124
Glib::RefPtr<Gtk::ListStore> DbMySQLTableEditorIndexPage::recreate_order_model()
126
MySQLTableIndexListBE *indices_be = _be->get_indexes();
127
std::vector<std::string> order_list;
129
if (indices_be->count() > 1)
131
bec::IndexColumnsListBE *columns_be = indices_be->get_columns();
133
if ( columns_be && indices_be->count() > 1)
135
const int max_idx_order = columns_be->get_max_order_index();
138
for ( int i = 1; i <= max_idx_order; i++ )
140
snprintf(buf, sizeof(buf) / sizeof(*buf), "%i", i);
141
order_list.push_back(buf);
146
order_list.push_back("0");
148
recreate_model_from_string_list(_order_model, order_list);
152
//------------------------------------------------------------------------------
153
void DbMySQLTableEditorIndexPage::update_index_details()
155
MySQLTableIndexListBE *indices_be = _be->get_indexes();
158
std::string index_name;
159
indices_be->refresh();
161
Gtk::TreeView *tv = 0;
162
_xml->get_widget("index_columns", tv);
163
tv->remove_all_columns();
166
const bool got_indices = indices_be->count() > 1;
167
if (_index_node.is_valid() && got_indices && _index_node.back() < indices_be->real_count())
169
indices_be->get_field(_index_node, 0, index_name);
170
if ( !index_name.empty() )
172
indices_be->select_index(_index_node);
173
indices_be->refresh();
176
_indexes_columns_model = ListModelWrapper::create(indices_be->get_columns(), tv, "IndexesColumnsModel");
178
// negative column means value getting/setting is delegated back to us
179
_indexes_columns_model->model().append_check_column(-8, "", EDITABLE);
180
_indexes_columns_model->model().append_string_column(::bec::IndexColumnsListBE::Name, "Column", RO, NO_ICON);
181
_indexes_columns_model->model().append_combo_column(::bec::IndexColumnsListBE::OrderIndex, "#", recreate_order_model(), EDITABLE);
182
_indexes_columns_model->model().append_combo_column(-2, "Order", _sort_order_model, EDITABLE, true);
183
_indexes_columns_model->model().append_int_column(::bec::IndexColumnsListBE::Length, "Length", EDITABLE);
185
_indexes_columns_model->set_fake_column_value_getter(sigc::mem_fun(this, &DbMySQLTableEditorIndexPage::get_value));
186
_indexes_columns_model->set_fake_column_value_setter(sigc::mem_fun(this, &DbMySQLTableEditorIndexPage::set_value));
188
tv->set_model(_indexes_columns_model);
191
indices_be->get_field(_index_node, ::MySQLTableIndexListBE::StorageType, text);
192
_index_storage_combo_conn.block();
193
set_selected_combo_item(_index_storage_combo, text);
194
_index_storage_combo_conn.unblock();
198
set_selected_combo_item(_index_storage_combo, "");
201
Gtk::Entry *entry(0);
204
// Update row block size
205
_xml->get_widget("index_key_block_size", entry);
206
indices_be->get_field(_index_node, ::MySQLTableIndexListBE::RowBlockSize, text);
207
entry->set_text(text);
209
// Update index parser
210
_xml->get_widget("index_parser", entry);
211
indices_be->get_field(_index_node, ::MySQLTableIndexListBE::Parser, text);
212
entry->set_text(text);
214
Gtk::TextView* textview(0);
215
// update index comment
216
_xml->get_widget("index_comment", textview);
217
indices_be->get_field(_index_node, ::MySQLTableIndexListBE::Comment, text);
218
textview->get_buffer()->set_text(text);
220
_xml->get_widget("index_key_block_size", entry);
221
entry->set_sensitive(got_indices && _index_node.is_valid() && _index_node.back() < indices_be->real_count());
222
_xml->get_widget("index_parser", entry);
223
entry->set_sensitive(got_indices && _index_node.is_valid() && _index_node.back() < indices_be->real_count());
224
_xml->get_widget("index_comment", textview);
225
textview->set_sensitive(got_indices && _index_node.is_valid() && _index_node.back() < indices_be->real_count());
227
_index_storage_combo->set_sensitive(got_indices && _index_node.is_valid() && _index_node.back() < indices_be->real_count());
231
//--------------------------------------------------------------------------------
232
void DbMySQLTableEditorIndexPage::update_index_storage_type_in_be()
234
MySQLTableIndexListBE *indices_be = _be->get_indexes();
236
if ( indices_be && _index_node.is_valid() )
238
const std::string new_storage_type = get_selected_combo_item(_index_storage_combo);
239
indices_be->set_field(_index_node, ::MySQLTableIndexListBE::StorageType, new_storage_type);
243
//--------------------------------------------------------------------------------
244
void DbMySQLTableEditorIndexPage::cell_editing_started(Gtk::CellEditable *cell, const Glib::ustring &path)
246
bec::NodeId node(path);
247
if ( node.is_valid() )
251
//--------------------------------------------------------------------------------
252
void DbMySQLTableEditorIndexPage::get_value(const Gtk::TreeModel::iterator& iter, int column, GType type, Glib::ValueBase& value)
254
bec::IndexColumnsListBE *columns_be = _be->get_indexes()->get_columns();
255
bec::NodeId node(_indexes_columns_model->node_for_iter(iter));
257
if ( !node.is_valid() )
262
case -2: // Sort order
265
columns_be->get_field(node, ::bec::IndexColumnsListBE::Descending, val);
266
set_glib_string(value, val == 0 ? "ASC" : "DESC");
269
case -8: // Set/unset
271
const bool bv = columns_be->get_column_enabled(node);
272
set_glib_bool(value, bv);
278
//--------------------------------------------------------------------------------
279
void DbMySQLTableEditorIndexPage::set_value(const Gtk::TreeModel::iterator& iter, int column, GType type, const Glib::ValueBase& value)
281
bec::IndexColumnsListBE *columns_be = _be->get_indexes()->get_columns();
282
bec::NodeId node(_indexes_columns_model->node_for_iter(iter));
284
if ( node.is_valid() )
290
Glib::Value<std::string> v;
291
v.init(value.gobj());
293
columns_be->set_field(node, ::bec::IndexColumnsListBE::Descending, v.get() == "ASC" ? 0 : 1);
299
v.init(value.gobj());
300
columns_be->set_column_enabled(node, v.get());
301
recreate_order_model();
308
//------------------------------------------------------------------------------
309
void DbMySQLTableEditorIndexPage::set_index_key_block_size(const std::string& value)
311
MySQLTableIndexListBE *indices_be = _be->get_indexes();
312
indices_be->set_field(_index_node, ::MySQLTableIndexListBE::RowBlockSize, value);
315
//------------------------------------------------------------------------------
316
void DbMySQLTableEditorIndexPage::set_index_parser(const std::string& value)
318
MySQLTableIndexListBE *indices_be = _be->get_indexes();
319
indices_be->set_field(_index_node, ::MySQLTableIndexListBE::Parser, value);
322
//------------------------------------------------------------------------------
323
void DbMySQLTableEditorIndexPage::set_index_comment(const std::string& value)
325
MySQLTableIndexListBE *indices_be = _be->get_indexes();
326
indices_be->set_field(_index_node, ::MySQLTableIndexListBE::Comment, value);