[goffice] Fixed crash when using data labels after gtk+ behavior change. [#684889]



commit b5d1bea81b6c959eca1962b9af5e42fc4036eec5
Author: Jean Brefort <jean brefort normalesup org>
Date:   Thu Sep 27 19:11:45 2012 +0200

    Fixed crash when using data labels after gtk+ behavior change. [#684889]

 ChangeLog                                |    7 +++++
 NEWS                                     |    1 +
 goffice/graph/gog-series-labels-prefs.ui |   42 +++++++++++++++++++++++-----
 goffice/graph/gog-series-labels.c        |   43 ++++++++++++++++--------------
 4 files changed, 65 insertions(+), 28 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index ce602b9..4e1c4e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2012-09-27  Jean Brefort  <jean brefort normalesup org>
+
+	* goffice/graph/gog-series-labels-prefs.ui: allow multiple selection.
+	* goffice/graph/gog-series-labels.c (used_selection_changed_cb),
+	(add_cb), (remove_cb), (gog_series_labels_update): fixed crash after gtk+
+	behavior change. [#684889]
+
 2012-09-27   Chris Leonard  <cjlhomeaddress gmail com>
 
 	* goffice/gtk/go-locale-sel.c: updated locales. [#682749]
diff --git a/NEWS b/NEWS
index 005ffdc..9962337 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,7 @@ Jean:
 	* Don't crash when no valid data is available for histograms. [#684047]
 	* Clip histograms to the plot area. [#684195]
 	* Fix backplane position when data are nearly all the same. [#684599]
+	* Fixed crash when using data labels after gtk+ behavior change. [#684889]
 
 --------------------------------------------------------------------------
 goffice 0.9.6:
diff --git a/goffice/graph/gog-series-labels-prefs.ui b/goffice/graph/gog-series-labels-prefs.ui
index f444d7a..b3f3582 100644
--- a/goffice/graph/gog-series-labels-prefs.ui
+++ b/goffice/graph/gog-series-labels-prefs.ui
@@ -9,6 +9,11 @@
       <column type="guint"/>
     </columns>
   </object>
+  <object class="GtkAdjustment" id="offset-adj">
+    <property name="upper">10</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
   <object class="GtkListStore" id="used-list">
     <columns>
       <!-- column-name text -->
@@ -17,11 +22,6 @@
       <column type="guint"/>
     </columns>
   </object>
-  <object class="GtkAdjustment" id="offset-adj">
-    <property name="upper">10</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
   <object class="GtkGrid" id="series-labels-prefs">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -104,6 +104,7 @@
     </child>
     <child>
       <object class="GtkButton" id="raise">
+        <property name="use_action_appearance">False</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="receives_default">True</property>
@@ -126,6 +127,7 @@
     </child>
     <child>
       <object class="GtkButton" id="add">
+        <property name="use_action_appearance">False</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="receives_default">True</property>
@@ -148,6 +150,7 @@
     </child>
     <child>
       <object class="GtkButton" id="remove">
+        <property name="use_action_appearance">False</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="receives_default">True</property>
@@ -170,6 +173,7 @@
     </child>
     <child>
       <object class="GtkButton" id="lower">
+        <property name="use_action_appearance">False</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="receives_default">True</property>
@@ -195,9 +199,11 @@
         <property name="visible">True</property>
         <property name="can_focus">True</property>
         <property name="model">available-list</property>
-        <property name="search_column">0</property>
+        <property name="search_column">5</property>
         <child internal-child="selection">
-          <object class="GtkTreeSelection" id="treeview-selection"/>
+          <object class="GtkTreeSelection" id="treeview-selection">
+            <property name="mode">multiple</property>
+          </object>
         </child>
       </object>
       <packing>
@@ -214,7 +220,9 @@
         <property name="model">used-list</property>
         <property name="search_column">0</property>
         <child internal-child="selection">
-          <object class="GtkTreeSelection" id="treeview-selection1"/>
+          <object class="GtkTreeSelection" id="treeview-selection1">
+            <property name="mode">multiple</property>
+          </object>
         </child>
       </object>
       <packing>
@@ -237,5 +245,23 @@
         <property name="height">1</property>
       </packing>
     </child>
+    <child>
+      <placeholder/>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
+    <child>
+      <placeholder/>
+    </child>
   </object>
 </interface>
diff --git a/goffice/graph/gog-series-labels.c b/goffice/graph/gog-series-labels.c
index dc4fe28..463895d 100644
--- a/goffice/graph/gog-series-labels.c
+++ b/goffice/graph/gog-series-labels.c
@@ -141,9 +141,8 @@ used_selection_changed_cb (struct SeriesLabelsState *state)
 			&GOG_DATA_LABEL (state->labels)->format:
 			&GOG_SERIES_LABELS (state->labels)->format;
 	g_free (*format);
-	*format = NULL;
+	*format = strdup ("");;
 	if (gtk_tree_model_get_iter_first (model, &iter)) {
-		GtkTreeModel *model = GTK_TREE_MODEL (state->used_list);
 		/* if the first row is not selected and a second row exists, set the up button sensitive */
 		first = last = iter;
 		gtk_widget_set_sensitive (state->raise,
@@ -160,29 +159,19 @@ used_selection_changed_cb (struct SeriesLabelsState *state)
 			gtk_tree_model_get (model, &iter, 1, &dim, -1);
 			switch (dim) {
 			case -1:
-				new_format = (*format)?
-						g_strconcat (*format, "%s%c", NULL):
-						g_strdup ("%c");
+				new_format = g_strconcat (*format, "%s%c", NULL);
 				break;
 			case -2:
-				new_format = (*format)?
-						g_strconcat (*format, "%s%l", NULL):
-						g_strdup ("%l");
+				new_format = g_strconcat (*format, "%s%l", NULL);
 				break;
 			case -3:
-				new_format = (*format)?
-						g_strconcat (*format, "%s%n", NULL):
-						g_strdup ("%n");
+				new_format = g_strconcat (*format, "%s%n", NULL);
 				break;
 			case -4:
-				new_format = (*format)?
-						g_strconcat (*format, "%s%p", NULL):
-						g_strdup ("%p");
+				new_format = g_strconcat (*format, "%s%p", NULL);
 				break;
 			default:
-				new_format = (*format)?
-						g_strdup_printf ("%s%%s%%%d", *format, dim):
-						g_strdup_printf ("%%%d", dim);
+				new_format = g_strdup_printf ("%s%%s%%%d", *format, dim);
 			}
 			g_free (*format);
 			*format = new_format;
@@ -208,9 +197,10 @@ used_selection_changed_cb (struct SeriesLabelsState *state)
 static void
 add_cb (G_GNUC_UNUSED GtkButton *btn, struct SeriesLabelsState *state)
 {
-	GtkTreeIter iter, add_iter;
+	GtkTreeIter iter, add_iter, next;
 	char *name;
 	int id;
+	gboolean next_selected;
 	gtk_tree_model_get_iter_first (GTK_TREE_MODEL (state->avail_list), &iter);
 	/* we don't need to check if the iter is valid since otherwise,
 	 the button would be unsensitive */
@@ -222,8 +212,13 @@ add_cb (G_GNUC_UNUSED GtkButton *btn, struct SeriesLabelsState *state)
 			gtk_list_store_set (state->used_list, &add_iter,
 			                    0, name, 1, id, -1);
 			g_free (name);
+			next = iter;
+			next_selected = (gtk_tree_model_iter_next (GTK_TREE_MODEL (state->avail_list), &next)
+			                 && gtk_tree_selection_iter_is_selected (state->avail_sel, &next));
 			if (!gtk_list_store_remove (state->avail_list, &iter))
 				break;
+			if (!next_selected)
+				gtk_tree_selection_unselect_iter (state->avail_sel, &iter);
 		} else if (!gtk_tree_model_iter_next (GTK_TREE_MODEL (state->avail_list), &iter))
 			break;
 	}
@@ -234,9 +229,10 @@ add_cb (G_GNUC_UNUSED GtkButton *btn, struct SeriesLabelsState *state)
 static void
 remove_cb (G_GNUC_UNUSED GtkButton *btn, struct SeriesLabelsState *state)
 {
-	GtkTreeIter iter, add_iter;
+	GtkTreeIter iter, add_iter, next;
 	char *name;
 	int id;
+	gboolean next_selected;
 	gtk_tree_model_get_iter_first (GTK_TREE_MODEL (state->used_list), &iter);
 	/* we don't need to check if the iter is valid since otherwise,
 	 the button would be unsensitive */
@@ -248,8 +244,13 @@ remove_cb (G_GNUC_UNUSED GtkButton *btn, struct SeriesLabelsState *state)
 			gtk_list_store_set (state->avail_list, &add_iter,
 			                    0, name, 1, id, -1);
 			g_free (name);
+			next = iter;
+			next_selected = (gtk_tree_model_iter_next (GTK_TREE_MODEL (state->used_list), &next)
+			                 && gtk_tree_selection_iter_is_selected (state->used_sel, &next));
 			if (!gtk_list_store_remove (state->used_list, &iter))
 				break;
+			if (!next_selected)
+				gtk_tree_selection_unselect_iter (state->used_sel, &iter);
 		} else if (!gtk_tree_model_iter_next (GTK_TREE_MODEL (state->used_list), &iter))
 			break;
 	}
@@ -1221,7 +1222,9 @@ gog_series_labels_update (GogObject *obj)
 						case 0: /* protect from an unexpected string end */
 							break;
 						case 'c':
-							next = go_data_get_vector_string (labels->custom_labels[0].data, i);
+							next = GO_IS_DATA (labels->custom_labels[0].data)?
+									go_data_get_vector_string (labels->custom_labels[0].data, i):
+									NULL;
 							if (next) {
 								index = str->len;
 								g_string_append (str, next);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]