psppire-selector.c: Remove unused preprocessor macro
[pspp] / src / ui / gui / psppire-selector.c
index 3b1bfe00abd41d208d6a924f00da269d0a118901..027f31203b64d5ce7559e643c08b1b699fd4fd2b 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2009, 2010, 2012 Free Software Foundation
+   Copyright (C) 2007, 2009, 2010, 2012, 2015 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
@@ -19,7 +19,7 @@
   This module provides a widget, PsppireSelector derived from
   GtkButton.
 
-  It contains a GtkArrow, and is used for selecting objects from a
+  It contains a GtkImage (to indicate the arrow), and is used for selecting objects from a
   GtkTreeView and putting them into a destination widget (often
   another GtkTreeView).  Typically this is used in psppire for
   selecting variables, thus:
@@ -59,9 +59,9 @@
 #include <config.h>
 
 #include "psppire-dictview.h"
-#include "psppire-var-view.h"
 #include "psppire-dict.h"
 #include "psppire-select-dest.h"
+#include "psppire-means-layer.h"
 
 #include <gtk/gtk.h>
 
@@ -133,8 +133,6 @@ static GObjectClass * parent_class = NULL;
 
 
 
-#define SELECTOR_DEBUGGING 0
-
 static void
 dump_hash_entry (gpointer key, gpointer value, gpointer obj)
 {
@@ -213,9 +211,6 @@ static void on_click (GtkButton *b);
 static void on_realize (GtkWidget *selector);
 
 
-static void update_subjects (PsppireSelector *selector);
-
-
 static void
 psppire_selector_set_property (GObject         *object,
                               guint            prop_id,
@@ -232,15 +227,15 @@ psppire_selector_set_property (GObject         *object,
       break;
     case PROP_PRIMARY:
       selector->primary_requested = TRUE;
-      update_subjects (selector);
+      psppire_selector_update_subjects (selector);
       break;
     case PROP_SOURCE_WIDGET:
       selector->source = g_value_dup_object (value);
-      update_subjects (selector);
+      psppire_selector_update_subjects (selector);
       break;
     case PROP_DEST_WIDGET:
       selector->dest = g_value_dup_object (value);
-      update_subjects (selector);
+      psppire_selector_update_subjects (selector);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -439,8 +434,7 @@ psppire_selector_init (PsppireSelector *selector)
   selector->allow_selection = NULL;
   selector->filter = NULL;
 
-  selector->arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
-
+  selector->arrow = gtk_image_new_from_icon_name ("pan-start-symbolic", GTK_ICON_SIZE_BUTTON);
 
   gtk_container_add (GTK_CONTAINER (selector), selector->arrow);
 
@@ -479,16 +473,16 @@ set_direction (PsppireSelector *selector, enum psppire_selector_dir d)
       switch (selector->orientation)
        {
        case   PSPPIRE_SELECT_SOURCE_BEFORE_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_RIGHT, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-end-symbolic", NULL);
          break;
        case   PSPPIRE_SELECT_SOURCE_AFTER_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_LEFT, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-start-symbolic", NULL);
          break;
        case   PSPPIRE_SELECT_SOURCE_ABOVE_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_DOWN, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-down-symbolic", NULL);
          break;
        case   PSPPIRE_SELECT_SOURCE_BELOW_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_UP, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-up-symbolic", NULL);
          break;
        default:
          g_assert_not_reached ();
@@ -500,22 +494,21 @@ set_direction (PsppireSelector *selector, enum psppire_selector_dir d)
       switch (selector->orientation)
        {
        case   PSPPIRE_SELECT_SOURCE_BEFORE_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_LEFT, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-start-symbolic", NULL);
          break;
        case   PSPPIRE_SELECT_SOURCE_AFTER_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_RIGHT, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-end-symbolic", NULL);
          break;
        case   PSPPIRE_SELECT_SOURCE_ABOVE_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_UP, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-up-symbolic", NULL);
          break;
        case   PSPPIRE_SELECT_SOURCE_BELOW_DEST:
-         g_object_set (selector->arrow, "arrow-type", GTK_ARROW_DOWN, NULL);
+         g_object_set (selector->arrow, "icon-name", "pan-down-symbolic", NULL);
          break;
        default:
          g_assert_not_reached ();
          break;
        };
-
     }
 }
 
@@ -530,6 +523,7 @@ on_dest_treeview_select (GtkTreeSelection *treeselection, gpointer data)
   set_direction (selector, PSPPIRE_SELECTOR_DEST_TO_SOURCE);
 }
 
+
 /* Callback for source deselection, when the dest is GtkEntry */
 static void
 de_select_selection_entry (PsppireSelector *selector)
@@ -537,23 +531,47 @@ de_select_selection_entry (PsppireSelector *selector)
   gtk_entry_set_text (GTK_ENTRY (selector->dest), "");
 }
 
+
+static void  de_select_tree_model (GtkTreeSelection *selection, GtkTreeModel *model);
+
+/* Callback for source deselection, when the dest is PsppireMeansLayer */
+static void
+de_select_selection_means_layer (PsppireSelector *selector)
+{
+  PsppireMeansLayer *ml = PSPPIRE_MEANS_LAYER (selector->dest);
+  GtkTreeView *tv = GTK_TREE_VIEW (ml->var_view);
+  GtkTreeSelection *selection = gtk_tree_view_get_selection (tv);
+
+  GtkTreeModel *model = psppire_means_layer_get_model (ml);
+
+  g_return_if_fail (selector->select_items);
+
+  de_select_tree_model (selection, model);
+}
+
 /* Callback for source deselection, when the dest is GtkTreeView */
 static void
 de_select_selection_tree_view (PsppireSelector *selector)
 {
-  GList *item;
-
   GtkTreeSelection* selection =
     gtk_tree_view_get_selection ( GTK_TREE_VIEW (selector->dest));
 
   GtkTreeModel *model =
     gtk_tree_view_get_model (GTK_TREE_VIEW (selector->dest));
 
+  g_return_if_fail (selector->select_items);
+
+  de_select_tree_model (selection, model);
+}
+
+static void 
+de_select_tree_model (GtkTreeSelection *selection, GtkTreeModel *model)
+{
+  GList *item;
+
   GList *selected_rows =
     gtk_tree_selection_get_selected_rows (selection, NULL);
 
-  g_return_if_fail (selector->select_items);
-
   /* Convert paths to RowRefs */
   for (item = g_list_first (selected_rows);
        item != NULL;
@@ -616,6 +634,9 @@ de_select_selection (PsppireSelector *selector)
   else if ( GTK_IS_ENTRY (selector->dest))
     de_select_selection_entry (selector);
 
+  else if ( PSPPIRE_IS_MEANS_LAYER (selector->dest))
+    de_select_selection_means_layer (selector);
+
   else
     g_assert_not_reached ();
 
@@ -883,6 +904,12 @@ on_dest_data_delete (GtkTreeModel *tree_model,
 }
 
 
+static void
+remove_selector_handlers (PsppireSelector *selector, GObject *sel)
+{
+  g_signal_handlers_disconnect_by_data (sel, selector);
+}
+
 static void
 on_dest_model_changed (PsppireSelector *selector)
 {
@@ -896,6 +923,8 @@ on_dest_model_changed (PsppireSelector *selector)
   
   g_signal_connect (model, "row-deleted", G_CALLBACK (on_dest_data_delete),
                    selector);
+
+  g_signal_connect (selector, "destroy", G_CALLBACK (remove_selector_handlers), model);
   
   if ( selector->selecting ) return;
   
@@ -920,7 +949,18 @@ set_tree_view_dest (PsppireSelector *selector,
                            G_CALLBACK (on_dest_model_changed), selector);
 }
 
+static void
+set_layer_dest (PsppireSelector *selector,
+                   PsppireMeansLayer *dest)
+{
+  GtkTreeSelection* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (dest->var_view));
+
+  gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
+
 
+  g_signal_connect (selection, "changed", G_CALLBACK (on_dest_treeview_select),
+                   selector);
+}
 
 
 /* Callback for when the DEST GtkEntry is selected (clicked) */
@@ -968,8 +1008,8 @@ set_default_filter (PsppireSelector *selector)
 }
 
 
-static void
-update_subjects (PsppireSelector *selector)
+void
+psppire_selector_update_subjects (PsppireSelector *selector)
 {
   if ( NULL == selector->dest )
     return;
@@ -997,10 +1037,14 @@ update_subjects (PsppireSelector *selector)
     {
       set_tree_view_dest (selector, GTK_TREE_VIEW (selector->dest));
     }
-
   else if ( GTK_IS_ENTRY (selector->dest))
-    set_entry_dest (selector, GTK_ENTRY (selector->dest));
-
+    {
+      set_entry_dest (selector, GTK_ENTRY (selector->dest));
+    }
+  else if (PSPPIRE_IS_MEANS_LAYER (selector->dest))
+    {
+      set_layer_dest (selector, PSPPIRE_MEANS_LAYER (selector->dest));
+    }
   else if (GTK_IS_TEXT_VIEW (selector->dest))
     {
       /* Nothing to be done */
@@ -1070,15 +1114,17 @@ GType
 psppire_selector_orientation_get_type (void)
 {
   static GType etype = 0;
-  if (etype == 0) {
-    static const GEnumValue values[] = {
-      { PSPPIRE_SELECT_SOURCE_BEFORE_DEST, "PSPPIRE_SELECT_SOURCE_BEFORE_DEST", "source before destination" },
-      { PSPPIRE_SELECT_SOURCE_AFTER_DEST, "PSPPIRE_SELECT_SOURCE_AFTER_DEST", "source after destination" },
-      { PSPPIRE_SELECT_SOURCE_ABOVE_DEST, "PSPPIRE_SELECT_SOURCE_ABOVE_DEST", "source above destination" },
-      { PSPPIRE_SELECT_SOURCE_BELOW_DEST, "PSPPIRE_SELECT_SOURCE_BELOW_DEST", "source below destination" },
-      { 0, NULL, NULL }
-    };
-    etype = g_enum_register_static (g_intern_static_string ("PsppireSelectorOrientation"), values);
-  }
+  if (etype == 0)
+    {
+      static const GEnumValue values[] =
+       {
+         { PSPPIRE_SELECT_SOURCE_BEFORE_DEST, "PSPPIRE_SELECT_SOURCE_BEFORE_DEST", "source before destination" },
+         { PSPPIRE_SELECT_SOURCE_AFTER_DEST, "PSPPIRE_SELECT_SOURCE_AFTER_DEST", "source after destination" },
+         { PSPPIRE_SELECT_SOURCE_ABOVE_DEST, "PSPPIRE_SELECT_SOURCE_ABOVE_DEST", "source above destination" },
+         { PSPPIRE_SELECT_SOURCE_BELOW_DEST, "PSPPIRE_SELECT_SOURCE_BELOW_DEST", "source below destination" },
+         { 0, NULL, NULL }
+       };
+      etype = g_enum_register_static (g_intern_static_string ("PsppireSelectorOrientation"), values);
+    }
   return etype;
 }