diff --git a/src/obiview.c b/src/obiview.c index 8e76047..acc7312 100644 --- a/src/obiview.c +++ b/src/obiview.c @@ -2281,18 +2281,30 @@ int obi_view_add_column(Obiview_p view, obidebug(1, "\nError opening a column to add to a view"); return -1; } - // Check that, if it's not the first column in the view, the column's line count is at least the view's line count if there's a line selection - // Otherwise it should be the same line count - // TODO rediscuss. When cloning a view, if there's a line selection associated, - // when re-adding the columns to the cloned view, it is normal that the columns have a line count greater than the view's. - if (((view->infos)->column_count > 0) - && (((view->line_selection != NULL) && ((column->header)->lines_used < (view->infos)->line_count)) - || ((view->line_selection == NULL) && ((column->header)->lines_used != (view->infos)->line_count)))) - { + // - If there is a line selection: + // - The column's lines_used attribute must be at least the view's line count + // - If there is no line selection: + // - If it's the first column in the view: + // - The view's line count is set to the column's lines_used attribute + // - If it's not the first column in the view: + // - The column's lines_used attribute must be equal to the view's line count + if ((view->line_selection != NULL) && ((column->header)->lines_used < (view->infos)->line_count)) + { // - If there is a line selection, the column's lines_used attribute must be at least the view's line count obi_set_errno(OBIVIEW_ERROR); - obidebug(1, "\nError adding an existing column to a view: the column's line count (%lld) must be at least the view's (%lld) (when there is a line selection)", (column->header)->line_count, (view->infos)->line_count); + obidebug(1, "\nError adding an existing column to a view: the column's lines_used attribute (%lld) must be equal to or greater than the view's line count (%lld)", (column->header)->lines_used, (view->infos)->line_count); return -1; } + else if (view->line_selection == NULL) + { // If there is no line selection: + if ((view->infos)->column_count == 0) // If it's the first column in the view: + (view->infos)->line_count = (column->header)->lines_used; // The view's line count is set to the column's lines_used attribute + else if ((column->header)->lines_used != (view->infos)->line_count) + { // If it's not the first column in the view, the column's lines_used attribute must be equal to the view's line count + obi_set_errno(OBIVIEW_ERROR); + obidebug(1, "\nError adding an existing column to a view: the column's lines_used attribute (%lld) must be equal to the view's line count (%lld)", (column->header)->lines_used, (view->infos)->line_count); + return -1; + } + } } // Store column pointer in the view structure @@ -2311,10 +2323,6 @@ int obi_view_add_column(Obiview_p view, // Save column alias strcpy((((view->infos)->column_references)[(view->infos)->column_count]).alias, alias); - // If it's the first column of the view, set the view's line count to the column's line count, except if there's a line selection associated - if (((view->infos)->column_count == 0) && (view->line_selection == NULL)) - (view->infos)->line_count = (column->header)->lines_used; - // Update column count in view (view->infos)->column_count++; diff --git a/src/obiview.h b/src/obiview.h index c9b43b3..641178c 100644 --- a/src/obiview.h +++ b/src/obiview.h @@ -340,6 +340,14 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name); /** * @brief Adds a column to a view. * + * - If there is a line selection: + * - The column's lines_used attribute must be at least the view's line count + * - If there is no line selection: + * - If it's the first column in the view: + * - The view's line count is set to the column's lines_used attribute + * - If it's not the first column in the view: + * - The column's lines_used attribute must be equal to the view's line count + * * @warning The view must be writable. * * @param view A pointer on the view.