static void search_next_pages(GtkTreeView *tree, TraceViewStore *store, gint sel, gint col_num, gint search_val, const char *search_text) { GtkTreeModel *model; TraceViewRecord *rec; GtkTreeIter iter; gint row; gint total_rows; gboolean found = FALSE; model = (GtkTreeModel *)store; row = store->start_row + store->num_rows; total_rows = trace_view_store_get_num_actual_rows(store); trace_set_cursor(GDK_WATCH); trace_freeze_all(); for (; row < total_rows; row++) { /* Needed to process the cursor change */ if (!(row & ((1 << 5)-1))) gtk_main_iteration_do(FALSE); rec = trace_view_store_get_actual_row(store, row); iter.user_data = rec; found = test_row(model, &iter, sel, col_num, search_val, search_text); if (found) break; } trace_unfreeze_all(); trace_put_cursor(); if (!found) { trace_dialog(NULL, TRACE_GUI_INFO, "Not found"); return; } trace_view_select(GTK_WIDGET(tree), rec->timestamp); }
void test_rows() { // Create a table named "Table". auto db = grnxx::open_db(""); auto table = db->create_table("Table"); // Append the first row. grnxx::Int row_id = table->insert_row(); assert(row_id.raw() == 0); assert(table->num_rows() == 1); assert(table->max_row_id().match(row_id)); assert(!table->test_row(grnxx::Int(-1))); assert(table->test_row(grnxx::Int(0))); assert(!table->test_row(grnxx::Int(1))); // Append two more rows. assert(table->insert_row().raw() == 1); assert(table->insert_row().raw() == 2); assert(table->num_rows() == 3); assert(table->max_row_id().raw() == 2); assert(table->test_row(grnxx::Int(0))); assert(table->test_row(grnxx::Int(1))); assert(table->test_row(grnxx::Int(2))); assert(!table->test_row(grnxx::Int(3))); // Remove the second row. table->remove_row(grnxx::Int(1)); assert(table->num_rows() == 2); assert(table->max_row_id().raw() == 2); assert(table->test_row(grnxx::Int(0))); assert(!table->test_row(grnxx::Int(1))); assert(table->test_row(grnxx::Int(2))); assert(!table->test_row(grnxx::Int(3))); // Remove the first row. table->remove_row(grnxx::Int(0)); assert(table->num_rows() == 1); assert(table->max_row_id().raw() == 2); assert(!table->test_row(grnxx::Int(0))); assert(!table->test_row(grnxx::Int(1))); assert(table->test_row(grnxx::Int(2))); assert(!table->test_row(grnxx::Int(3))); // Remove the third row. table->remove_row(grnxx::Int(2)); assert(table->num_rows() == 0); assert(table->max_row_id().is_na()); assert(!table->test_row(grnxx::Int(0))); assert(!table->test_row(grnxx::Int(1))); assert(!table->test_row(grnxx::Int(2))); assert(!table->test_row(grnxx::Int(3))); }
static void search_tree(gpointer data) { struct search_info *info = data; GtkTreePath *path; GtkTreeViewColumn *col; GtkTreeModel *model; TraceViewStore *store; GtkTreeIter iter; GtkEntry *entry = GTK_ENTRY(info->entry); GtkComboBox *col_combo = GTK_COMBO_BOX(info->column); GtkComboBox *sel_combo = GTK_COMBO_BOX(info->selection); const gchar *title; const gchar *search_text; gint col_num; gint sel; gint search_val; gint start_row; gboolean found = FALSE; gint i = 0; col_num = gtk_combo_box_get_active(col_combo); sel = gtk_combo_box_get_active(sel_combo); if (col_num >= TRACE_VIEW_STORE_N_COLUMNS) return; search_text = gtk_entry_get_text(entry); if (!search_text || !strlen(search_text)) return; col = gtk_tree_view_get_column(info->treeview, col_num); if (!col) return; title = gtk_tree_view_column_get_title(col); if (!title) return; model = gtk_tree_view_get_model(info->treeview); if (!model) return; store = TRACE_VIEW_STORE(model); if (!trace_view_store_visible_rows(store)) return; start_row = trace_view_get_selected_row(GTK_WIDGET(info->treeview)); if (start_row < 0) start_row = 0; if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, start_row)) return; trace_set_cursor(GDK_WATCH); trace_freeze_all(); search_val = atoi(search_text); while (gtk_tree_model_iter_next(model, &iter)) { /* Needed to process the cursor change */ if (!(i++ & ((1 << 5)-1))) gtk_main_iteration_do(FALSE); found = test_row(model, &iter, sel, col_num, search_val, search_text); if (found) break; } trace_unfreeze_all(); trace_put_cursor(); if (!found) { GtkResponseType ret; gint pages = trace_view_store_get_pages(store); gint page = trace_view_store_get_page(store); if (page < pages) { ret = trace_dialog(NULL, TRACE_GUI_ASK, "Not found on this page\n" "Search next pages?"); if (ret == GTK_RESPONSE_YES) search_next_pages(info->treeview, store, sel, col_num, search_val, search_text); return; } trace_dialog(NULL, TRACE_GUI_INFO, "Not found"); return; } path = gtk_tree_model_get_path(model, &iter); select_row_from_path(info->treeview, path); gtk_tree_path_free(path); }