static void sync_iter_with_selection (GdauiCloud *cloud) { GSList *list; gint selrow = -1; if (! cloud->priv->iter) return; /* locate selected row */ for (list = cloud->priv->selected_tags; list; list = list->next) { gint row; row = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (list->data), "row")) - 1; if (row >= 0) { if (selrow == -1) selrow = row; else { selrow = -1; break; } } } /* update iter */ if ((selrow == -1) || !gda_data_model_iter_move_to_row (cloud->priv->iter, selrow)) { gda_data_model_iter_invalidate_contents (cloud->priv->iter); g_object_set (G_OBJECT (cloud->priv->iter), "current-row", -1, NULL); } }
gboolean symbol_db_engine_iterator_set_position (SymbolDBEngineIterator *dbi, gint pos) { SymbolDBEngineIteratorPriv *priv; g_return_val_if_fail (dbi != NULL, FALSE); priv = dbi->priv; return gda_data_model_iter_move_to_row (priv->data_iter, pos); }
/** * Set the iterator at the first node. */ gboolean symbol_db_engine_iterator_first (SymbolDBEngineIterator *dbi) { SymbolDBEngineIteratorPriv *priv; g_return_val_if_fail (dbi != NULL, FALSE); priv = dbi->priv; return gda_data_model_iter_move_to_row (priv->data_iter, 0); }
static void selection_changed_cb (GdauiDataSelector *sel, UiFormGrid *formgrid) { GdaDataModelIter *iter; GdauiDataSelector *tosel; gint row; if (sel == (GdauiDataSelector*) formgrid->priv->raw_grid) tosel = (GdauiDataSelector*) formgrid->priv->raw_form; else tosel = (GdauiDataSelector*) formgrid->priv->raw_grid; iter = gdaui_data_selector_get_data_set (sel); g_assert (iter); row = gda_data_model_iter_get_row (iter); /*g_print ("Moved %s to row %d\n", sel == (GdauiDataSelector*) formgrid->priv->raw_grid ? "grid" : "form", row);*/ iter = gdaui_data_selector_get_data_set (tosel); if (iter) { g_signal_handlers_block_by_func (tosel, G_CALLBACK (selection_changed_cb), formgrid); gda_data_model_iter_move_to_row (iter, row >= 0 ? row : 0); g_signal_handlers_unblock_by_func (tosel, G_CALLBACK (selection_changed_cb), formgrid); } }
static const GValue * gda_data_access_wrapper_get_value_at (GdaDataModel *model, gint col, gint row, GError **error) { GdaDataAccessWrapper *imodel; g_return_val_if_fail (GDA_IS_DATA_ACCESS_WRAPPER (model), NULL); imodel = (GdaDataAccessWrapper*) model; g_return_val_if_fail (imodel->priv, NULL); g_return_val_if_fail (imodel->priv->model, NULL); g_return_val_if_fail (row >= 0, NULL); if (col >= imodel->priv->nb_cols) { g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_COLUMN_OUT_OF_RANGE_ERROR, _("Column %d out of range (0-%d)"), col, imodel->priv->nb_cols - 1); return NULL; } if (!imodel->priv->rows) { /* imodel->priv->model is a random access model, use it */ if (imodel->priv->rows_mapping) return gda_data_model_get_value_at (imodel->priv->model, imodel->priv->rows_mapping [col], row, error); else return gda_data_model_get_value_at (imodel->priv->model, col, row, error); } else { GdaRow *gda_row; gint tmp; tmp = row; gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp); if (gda_row) { GValue *val = gda_row_get_value (gda_row, col); if (gda_row_value_is_valid (gda_row, val)) return val; else return NULL; } else { g_assert (imodel->priv->iter); if (imodel->priv->iter_row < 0) { if (gda_data_model_iter_move_next (imodel->priv->iter)) { tmp = row; gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp); if (row == imodel->priv->iter_row) { GValue *val = gda_row_get_value (gda_row, col); if (gda_row_value_is_valid (gda_row, val)) return val; else return NULL; } } else { g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR, "%s", _("Can't set iterator's position")); return NULL; } } gda_row = NULL; if (row != imodel->priv->iter_row) { if (row > imodel->priv->iter_row) { /* need to move forward */ while ((imodel->priv->iter_row < row) && gda_data_model_iter_move_next (imodel->priv->iter)); } else { /* need to move backwards */ g_assert (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD); while ((imodel->priv->iter_row > row) && gda_data_model_iter_move_prev (imodel->priv->iter)) ; } } if (! (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_CURSOR_BACKWARD) || ! (imodel->priv->model_access_flags & GDA_DATA_MODEL_ACCESS_CURSOR_FORWARD)) { tmp = row; gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp); if (gda_row) { GValue *val = gda_row_get_value (gda_row, col); if (gda_row_value_is_valid (gda_row, val)) return val; else return NULL; } } else { /* in this case iter can be moved forward and backward at will => we only * need to keep a pool of GdaRow for performances reasons */ tmp = row; gda_row = g_hash_table_lookup (imodel->priv->rows, &tmp); if (!gda_row) { if (! imodel->priv->rows_buffer_array) { imodel->priv->rows_buffer_array = g_array_sized_new (FALSE, FALSE, sizeof (GdaRow*), ROWS_POOL_SIZE); imodel->priv->rows_buffer_index = g_array_sized_new (FALSE, FALSE, sizeof (gint), ROWS_POOL_SIZE); } else if (imodel->priv->rows_buffer_array->len == ROWS_POOL_SIZE) { /* get rid of the oldest row (was model's index_row row)*/ gint index_row; index_row = g_array_index (imodel->priv->rows_buffer_index, gint, ROWS_POOL_SIZE - 1); g_array_remove_index (imodel->priv->rows_buffer_array, ROWS_POOL_SIZE - 1); g_array_remove_index (imodel->priv->rows_buffer_index, ROWS_POOL_SIZE - 1); g_hash_table_remove (imodel->priv->rows, &index_row); } if (gda_data_model_iter_move_to_row (imodel->priv->iter, row)) { gda_row = create_new_row (imodel); g_array_prepend_val (imodel->priv->rows_buffer_array, gda_row); g_array_prepend_val (imodel->priv->rows_buffer_index, imodel->priv->iter_row); } } GValue *val; val = gda_row ? gda_row_get_value (gda_row, col) : NULL; if (gda_row && gda_row_value_is_valid (gda_row, val)) return val; else return NULL; } } } g_set_error (error, GDA_DATA_MODEL_ERROR, GDA_DATA_MODEL_ACCESS_ERROR, "%s", _("Can't access data")); return NULL; }