#include "psppire-object.h"
#include "psppire-case-array.h"
-#include "gtkextra-marshal.h"
-#include "case.h"
+#include <gtksheet/gtkextra-marshal.h>
+
+#include <data/case.h>
/* --- prototypes --- */
static void psppire_case_array_class_init (PsppireCaseArrayClass *class);
ca->width = new_size;
}
-/* FIXME: add_case and insert_case need to be merged/refactored */
-gboolean
-psppire_case_array_add_case(PsppireCaseArray *ca,
+
+/* Append a case to the case array. If FILL_CASE_FUNC is not NULL,
+ * then use it to populate the case */
+inline gboolean
+psppire_case_array_append_case(PsppireCaseArray *ca,
psppire_case_array_fill_case_func fill_case_func,
gpointer aux)
{
- g_return_val_if_fail(ca->size < ca->capacity, FALSE);
-
- case_create(&ca->cases[ca->size], ca->width);
-
- if ( !fill_case_func(&ca->cases[ca->size], aux))
- return FALSE;
-
- ca->size++;
-
- g_signal_emit(ca, signal[CASE_INSERTED], 0, ca->size - 1);
-
- return TRUE;
+ return psppire_case_array_insert_case(ca, ca->size, fill_case_func, aux);
}
}
-void
-psppire_case_array_insert_case(PsppireCaseArray *ca, gint posn)
+/* Insert a new case before case POSN.
+ * If FILL_CASE_FUNC is not NULL, then use it to populate the new case */
+gboolean
+psppire_case_array_insert_case(PsppireCaseArray *ca, gint posn,
+ psppire_case_array_fill_case_func fill_case_func,
+ gpointer aux)
+
{
- g_return_if_fail(posn >= 0);
- g_return_if_fail(posn <= ca->size);
+ gint i;
- g_assert(ca->size + 1 <= ca->capacity);
+ g_return_val_if_fail(posn >= 0, FALSE);
+ g_return_val_if_fail(posn <= ca->size, FALSE);
- gint i;
+ g_return_val_if_fail(ca->size < ca->capacity, FALSE);
for(i = ca->size; i > posn ; --i)
case_move(&ca->cases[i], &ca->cases[i - 1]);
case_create(&ca->cases[posn], ca->width);
+ if ( fill_case_func && !fill_case_func(&ca->cases[posn], aux))
+ return FALSE;
+
ca->size++;
g_signal_emit(ca, signal[CASE_INSERTED], 0, posn);
+
+ return TRUE;
}
void
psppire_case_array_delete_cases(PsppireCaseArray *ca, gint first, gint n_cases)
{
+ gint i;
+
g_return_if_fail(n_cases > 0);
g_return_if_fail(first >= 0);
g_return_if_fail(first + n_cases < ca->size);
- gint i;
/* FIXME: Is this right ?? */
for ( i = first; i < first + n_cases ; ++i )
value_fill_func_t ff,
gpointer data)
{
+ struct ccase *cc ;
+ union value *val ;
+ gboolean changed ;
+
g_return_if_fail(c < ca->size);
- struct ccase *cc = &ca->cases[c];
+ cc = &ca->cases[c];
- union value *val = case_data_rw(cc, idx);
+ val = case_data_rw(cc, idx);
- gboolean changed = ff(val, data);
+ changed = ff(val, data);
case_unshare(cc);