Indicate filtered cases in data sheet.
authorJohn Darrington <john@darrington.wattle.id.au>
Mon, 16 Mar 2009 09:02:24 +0000 (18:02 +0900)
committerJohn Darrington <john@darrington.wattle.id.au>
Mon, 16 Mar 2009 09:02:24 +0000 (18:02 +0900)
Add feature to indicate filtered out cases
on data sheet.  Closes bug #20828

lib/gtk-contrib/gtkextra-sheet.h
lib/gtk-contrib/psppire-sheet.c
src/ui/gui/psppire-data-editor.c
src/ui/gui/psppire-data-store.c
src/ui/gui/psppire-data-store.h
src/ui/gui/psppire-var-store.c
src/ui/gui/sheet/psppire-sheetmodel.c
src/ui/gui/sheet/psppire-sheetmodel.h

index 16d6b5b470e396a710f83647039c6dc79e2e2660..6cad27fc4054c427bbd3cab9bd9a0cddb157da28 100644 (file)
@@ -40,6 +40,7 @@ struct _PsppireSheetButton
   gboolean label_visible;
 
   GtkJustification justification;
+  gboolean overstruck;
 };
 
 struct _PsppireSheetCell
index 74b8be9723185e39d4ad59b64072a696c926b4f7..8a5375368cd5f19ff075a89df7807729962d2257 100644 (file)
@@ -4747,6 +4747,26 @@ draw_button (PsppireSheet *sheet, GdkWindow *window,
                   allocation.x, allocation.y,
                   allocation.width, allocation.height);
 
+  if ( button->overstruck)
+    {
+      GdkPoint points[2] = {
+       {allocation.x,  allocation.y},
+       {allocation.x + allocation.width,
+        allocation.y + allocation.height}
+      };
+
+      gtk_paint_polygon (sheet->button->style,
+                        window,
+                        button->state,
+                        shadow_type,
+                        NULL,
+                        GTK_WIDGET (sheet),
+                        "button",
+                        points,
+                        2,
+                        TRUE);
+    }
+
   if (button->label_visible)
     {
       text_height = DEFAULT_ROW_HEIGHT -
@@ -5335,6 +5355,7 @@ psppire_sheet_button_new (void)
   button->label = NULL;
   button->label_visible = TRUE;
   button->justification = GTK_JUSTIFY_FILL;
+  button->overstruck = FALSE;
 
   return button;
 }
index 861191917e4160e524ed3927e30a1f3389aac42b..a608e6de29e8745d089b885189e0249dc5b36570 100644 (file)
@@ -380,9 +380,15 @@ psppire_data_editor_set_property (GObject         *object,
       g_object_ref (de->data_store);
 
       for (i = 0 ; i < 4 ; ++i )
-       g_object_set (de->data_sheet[i],
-                     "model", de->data_store,
-                     NULL);
+       {
+         g_object_set (de->data_sheet[i],
+                       "model", de->data_store,
+                       NULL);
+
+         g_signal_connect_swapped (de->data_store->dict, "filter-changed",
+                                   G_CALLBACK (gtk_widget_queue_draw),
+                                   de->data_sheet[i]);
+       }
 
       g_signal_connect (de->data_store->dict, "backend-changed",
                        G_CALLBACK (new_variables_callback), de);
index c8804f48ba0ee5a0a974fe459302e38e8fe4dd9a..f36fe38acb798c64eae63532862fbc8855c0ab50 100644 (file)
@@ -263,6 +263,7 @@ static GtkJustification get_column_justification (const PsppireSheetModel *model
 
 static gchar * get_row_button_label (const PsppireSheetModel *model, gint row);
 static gboolean get_row_sensitivity (const PsppireSheetModel *model, gint row);
+static gboolean get_row_overstrike (const PsppireSheetModel *model, gint row);
 
 
 static void
@@ -285,6 +286,7 @@ psppire_data_store_sheet_model_init (PsppireSheetModelIface *iface)
 
   iface->get_row_title = get_row_button_label;
   iface->get_row_sensitivity = get_row_sensitivity;
+  iface->get_row_overstrike = get_row_overstrike;
 }
 
 
@@ -1003,3 +1005,30 @@ psppire_data_store_insert_values (PsppireDataStore *ds,
 
   return TRUE;
 }
+
+static gboolean
+get_row_overstrike (const PsppireSheetModel *model, gint row)
+{
+  union value val;
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (model);
+
+  const struct dictionary *dict = ds->dict->dict;
+
+  const struct variable *filter = dict_get_filter (dict);
+
+  if ( row < 0 || row >= datasheet_get_row_cnt (ds->datasheet))
+    return FALSE;
+
+  if ( ! filter)
+    return FALSE;
+
+  g_assert (var_is_numeric (filter));
+
+  if ( ! datasheet_get_value (ds->datasheet, row,
+                             var_get_case_index (filter),
+                             &val, 0) )
+    return FALSE;
+
+
+  return (val.f == 0.0);
+}
index 5ffd85d68e458137b2b7c2cc25177fc3ce38b42b..bbb44ee20b08a9130d59f84fb8dd90d84cba17ba 100644 (file)
@@ -116,6 +116,11 @@ gboolean psppire_data_store_set_string (PsppireDataStore *ds,
                                        const gchar *text,
                                        glong row, glong column);
 
+
+gboolean psppire_data_store_filtered (PsppireDataStore *ds,
+                                     glong row);
+
+
 casenumber psppire_data_store_get_case_count (const PsppireDataStore *ds);
 size_t psppire_data_store_get_value_count (const PsppireDataStore *ds);
 
index 82a7ef1094d5d915ff6722835037edb4c8be7b4a..b092de30939f6a76cb7d31eddf11faccd266ba13 100644 (file)
@@ -301,6 +301,8 @@ psppire_var_store_sheet_model_init (PsppireSheetModelIface *iface)
 
   iface->get_row_title = get_row_title;
   iface->get_row_sensitivity = get_row_sensitivity;
+
+  iface->get_row_overstrike = NULL;
 }
 
 /**
index 61b667d41aa4c27ccf4e7d1ff7e73eb35614c04f..a948d4535d6b7c8693aa48506fe1880cff9e7f8c 100644 (file)
@@ -1,5 +1,5 @@
 /* PsppireSheetModel --- an abstract model for the PsppireSheet widget.
* Copyright (C) 2006, 2008 Free Software Foundation
  Copyright (C) 2006, 2008 Free Software Foundation
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -482,6 +482,8 @@ psppire_sheet_model_get_column_button (const PsppireSheetModel *model,
   if ( PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_column_title)
     button->label = PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_column_title (model, col);
 
+  button->overstruck = FALSE;
+
   return button;
 }
 
@@ -534,7 +536,12 @@ psppire_sheet_model_get_row_button (const PsppireSheetModel *model,
   g_return_val_if_fail (PSPPIRE_IS_SHEET_MODEL (model), NULL);
 
   if ( PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_row_title)
-    button->label = PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_row_title (model, row);
+    button->label =
+      PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_row_title (model, row);
+
+  if ( PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_row_overstrike)
+    button->overstruck =
+      PSPPIRE_SHEET_MODEL_GET_IFACE (model)->get_row_overstrike (model, row);
 
   return button;
 }
index 7869791e206d562ddbfc0455397a97ffd901b95d..c8519077be67a46067db3c1a738bfcb597329378 100644 (file)
@@ -128,6 +128,8 @@ struct _PsppireSheetModelIface
   gchar * (*get_row_subtitle) (const PsppireSheetModel *, gint row);
   glong (*get_row_count) (const PsppireSheetModel *model);
   gboolean (*get_row_sensitivity) (const PsppireSheetModel *, gint row);
+
+  gboolean (*get_row_overstrike) (const PsppireSheetModel *, gint row);
 };