[geany/geany] aeab18: Merge branch 'unified-encoding-combo-boxes'

Colomban Wendling git-noreply at xxxxx
Tue Apr 15 13:57:13 UTC 2014


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Tue, 15 Apr 2014 13:57:13 UTC
Commit:      aeab183ef2a40943a4b7751a3e5127a5de63749a
             https://github.com/geany/geany/commit/aeab183ef2a40943a4b7751a3e5127a5de63749a

Log Message:
-----------
Merge branch 'unified-encoding-combo-boxes'


Modified Paths:
--------------
    data/geany.glade
    src/dialogs.c
    src/encodings.c
    src/encodings.h
    src/prefs.c
    src/search.c
    src/symbols.c
    src/ui_utils.c
    src/ui_utils.h

Modified: data/geany.glade
18 files changed, 2 insertions(+), 16 deletions(-)
===================================================================
@@ -433,12 +433,6 @@
       </object>
     </child>
   </object>
-  <object class="GtkListStore" id="encoding_list">
-    <columns>
-      <!-- column-name text -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
   <object class="GtkListStore" id="eol_list">
     <columns>
       <!-- column-name text -->
@@ -4368,12 +4362,8 @@
                                       <object class="GtkComboBox" id="combo_new_encoding">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="model">encoding_list</property>
                                         <child>
-                                          <object class="GtkCellRendererText" id="cellrenderertext6"/>
-                                          <attributes>
-                                            <attribute name="text">0</attribute>
-                                          </attributes>
+                                          <object class="GtkCellRendererText" id="combo_new_encoding_renderer"/>
                                         </child>
                                       </object>
                                     </child>
@@ -4434,12 +4424,8 @@
                                       <object class="GtkComboBox" id="combo_open_encoding">
                                         <property name="visible">True</property>
                                         <property name="can_focus">False</property>
-                                        <property name="model">encoding_list</property>
                                         <child>
-                                          <object class="GtkCellRendererText" id="cellrenderertext7"/>
-                                          <attributes>
-                                            <attribute name="text">0</attribute>
-                                          </attributes>
+                                          <object class="GtkCellRendererText" id="combo_open_encoding_renderer"/>
                                         </child>
                                       </object>
                                     </child>


Modified: src/dialogs.c
117 files changed, 5 insertions(+), 112 deletions(-)
===================================================================
@@ -125,8 +125,6 @@ static void open_file_dialog_handle_response(GtkWidget *dialog, gint response)
 	if (response == GTK_RESPONSE_ACCEPT || response == GEANY_RESPONSE_VIEW)
 	{
 		GSList *filelist;
-		GtkTreeModel *encoding_model;
-		GtkTreeIter encoding_iter;
 		GeanyFiletype *ft = NULL;
 		const gchar *charset = NULL;
 		GtkWidget *expander = ui_lookup_widget(dialog, "more_options_expander");
@@ -142,9 +140,7 @@ static void open_file_dialog_handle_response(GtkWidget *dialog, gint response)
 		if (filesel_state.open.filetype_idx > 0)
 			ft = g_slist_nth_data(filetypes_by_title, (guint) filesel_state.open.filetype_idx);
 
-		encoding_model = gtk_combo_box_get_model(GTK_COMBO_BOX(encoding_combo));
-		gtk_combo_box_get_active_iter(GTK_COMBO_BOX(encoding_combo), &encoding_iter);
-		gtk_tree_model_get(encoding_model, &encoding_iter, 0, &filesel_state.open.encoding_idx, -1);
+		filesel_state.open.encoding_idx = ui_encodings_combo_box_get_active_encoding(GTK_COMBO_BOX(encoding_combo));
 		if (filesel_state.open.encoding_idx >= 0 && filesel_state.open.encoding_idx < GEANY_ENCODINGS_MAX)
 			charset = encodings[filesel_state.open.encoding_idx].charset;
 
@@ -182,97 +178,6 @@ on_file_open_check_hidden_toggled(GtkToggleButton *togglebutton, GtkWidget *dial
 }
 
 
-static gint encoding_combo_store_sort_func(GtkTreeModel *model,
-										   GtkTreeIter *a,
-										   GtkTreeIter *b,
-										   gpointer data)
-{
-	gboolean a_has_child = gtk_tree_model_iter_has_child(model, a);
-	gboolean b_has_child = gtk_tree_model_iter_has_child(model, b);
-	gchar *a_string;
-	gchar *b_string;
-	gint cmp_res;
-
-	if (a_has_child != b_has_child)
-		return a_has_child ? -1 : 1;
-
-	gtk_tree_model_get(model, a, 1, &a_string, -1);
-	gtk_tree_model_get(model, b, 1, &b_string, -1);
-	cmp_res = strcmp(a_string, b_string);
-	g_free(a_string);
-	g_free(b_string);
-	return cmp_res;
-}
-
-
-static GtkTreeStore *create_encoding_combo_store(GtkTreeIter *iter_detect)
-{
-	GtkTreeStore *store;
-	GtkTreeIter iter_current, iter_westeuro, iter_easteuro, iter_eastasian, iter_asian,
-				iter_utf8, iter_middleeast;
-	GtkTreeIter *iter_parent;
-	gchar *encoding_string;
-	gint i;
-
-	store = gtk_tree_store_new(2, G_TYPE_INT, G_TYPE_STRING);
-
-	gtk_tree_store_append(store, iter_detect, NULL);
-	gtk_tree_store_set(store, iter_detect, 0, GEANY_ENCODINGS_MAX, 1, _("Detect from file"), -1);
-
-	gtk_tree_store_append(store, &iter_westeuro, NULL);
-	gtk_tree_store_set(store, &iter_westeuro, 0, -1, 1, _("West European"), -1);
-	gtk_tree_store_append(store, &iter_easteuro, NULL);
-	gtk_tree_store_set(store, &iter_easteuro, 0, -1, 1, _("East European"), -1);
-	gtk_tree_store_append(store, &iter_eastasian, NULL);
-	gtk_tree_store_set(store, &iter_eastasian, 0, -1, 1, _("East Asian"), -1);
-	gtk_tree_store_append(store, &iter_asian, NULL);
-	gtk_tree_store_set(store, &iter_asian, 0, -1, 1, _("SE & SW Asian"), -1);
-	gtk_tree_store_append(store, &iter_middleeast, NULL);
-	gtk_tree_store_set(store, &iter_middleeast, 0, -1, 1, _("Middle Eastern"), -1);
-	gtk_tree_store_append(store, &iter_utf8, NULL);
-	gtk_tree_store_set(store, &iter_utf8, 0, -1, 1, _("Unicode"), -1);
-
-	for (i = 0; i < GEANY_ENCODINGS_MAX; i++)
-	{
-		switch (encodings[i].group)
-		{
-			case WESTEUROPEAN: iter_parent = &iter_westeuro; break;
-			case EASTEUROPEAN: iter_parent = &iter_easteuro; break;
-			case EASTASIAN: iter_parent = &iter_eastasian; break;
-			case ASIAN: iter_parent = &iter_asian; break;
-			case MIDDLEEASTERN: iter_parent = &iter_middleeast; break;
-			case UNICODE: iter_parent = &iter_utf8; break;
-			case NONE:
-			default: iter_parent = NULL;
-		}
-		gtk_tree_store_append(store, &iter_current, iter_parent);
-		encoding_string = encodings_to_string(&encodings[i]);
-		gtk_tree_store_set(store, &iter_current, 0, i, 1, encoding_string, -1);
-		g_free(encoding_string);
-		/* restore the saved state */
-		if (i == filesel_state.open.encoding_idx)
-			*iter_detect = iter_current;
-	}
-
-	gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), 1, GTK_SORT_ASCENDING);
-	gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), 1, encoding_combo_store_sort_func, NULL, NULL);
-
-	return store;
-}
-
-
-static void encoding_combo_cell_data_func(GtkCellLayout *cell_layout,
-										  GtkCellRenderer *cell,
-										  GtkTreeModel *tree_model,
-										  GtkTreeIter *iter,
-										  gpointer data)
-{
-	gboolean sensitive = !gtk_tree_model_iter_has_child(tree_model, iter);
-
-	g_object_set(cell, "sensitive", sensitive, NULL);
-}
-
-
 static GtkWidget *add_file_open_extra_widget(GtkWidget *dialog)
 {
 	GtkWidget *expander, *vbox, *table, *check_hidden;
@@ -304,7 +209,7 @@ static GtkWidget *add_file_open_extra_widget(GtkWidget *dialog)
 					(GtkAttachOptions) (0), 4, 5);
 	/* the ebox is for the tooltip, because gtk_combo_box can't show tooltips */
 	encoding_ebox = gtk_event_box_new();
-	encoding_combo = gtk_combo_box_new();
+	encoding_combo = ui_create_encodings_combo_box(TRUE, GEANY_ENCODINGS_MAX);
 	gtk_widget_set_tooltip_text(encoding_ebox,
 		_("Explicitly defines an encoding for the file, if it would not be detected. This is useful when you know that the encoding of a file cannot be detected correctly by Geany.\nNote if you choose multiple files, they will all be opened with the chosen encoding."));
 	gtk_container_add(GTK_CONTAINER(encoding_ebox), encoding_combo);
@@ -345,10 +250,8 @@ static GtkWidget *add_file_open_extra_widget(GtkWidget *dialog)
 static GtkWidget *create_open_file_dialog(void)
 {
 	GtkWidget *dialog;
-	GtkWidget *filetype_combo, *encoding_combo;
+	GtkWidget *filetype_combo;
 	GtkWidget *viewbtn;
-	GtkCellRenderer *encoding_renderer;
-	GtkTreeIter encoding_iter;
 	GSList *node;
 
 	dialog = gtk_file_chooser_dialog_new(_("Open File"), GTK_WINDOW(main_widgets.window),
@@ -396,17 +299,6 @@ static GtkWidget *create_open_file_dialog(void)
 	gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(filetype_combo), 3);
 	gtk_combo_box_set_active(GTK_COMBO_BOX(filetype_combo), 0);
 
-	/* fill encoding combo box */
-	encoding_combo = ui_lookup_widget(dialog, "encoding_combo");
-	gtk_combo_box_set_model(GTK_COMBO_BOX(encoding_combo), GTK_TREE_MODEL(
-			create_encoding_combo_store(&encoding_iter)));
-	gtk_combo_box_set_active_iter(GTK_COMBO_BOX(encoding_combo), &encoding_iter);
-	encoding_renderer = gtk_cell_renderer_text_new();
-	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(encoding_combo), encoding_renderer, TRUE);
-	gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(encoding_combo), encoding_renderer, "text", 1);
-	gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(encoding_combo), encoding_renderer,
-			encoding_combo_cell_data_func, NULL, NULL);
-
 	g_signal_connect(dialog, "notify::show-hidden",
 		G_CALLBACK(on_file_open_show_hidden_notify), NULL);
 
@@ -419,6 +311,7 @@ static void open_file_dialog_apply_settings(GtkWidget *dialog)
 	static gboolean initialized = FALSE;
 	GtkWidget *check_hidden = ui_lookup_widget(dialog, "check_hidden");
 	GtkWidget *filetype_combo = ui_lookup_widget(dialog, "filetype_combo");
+	GtkWidget *encoding_combo = ui_lookup_widget(dialog, "encoding_combo");
 	GtkWidget *expander = ui_lookup_widget(dialog, "more_options_expander");
 
 	/* we can't know the initial position of combo boxes, so retreive it the first time */
@@ -436,7 +329,7 @@ static void open_file_dialog_apply_settings(GtkWidget *dialog)
 	}
 	gtk_expander_set_expanded(GTK_EXPANDER(expander), filesel_state.open.more_options_visible);
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_hidden), filesel_state.open.show_hidden);
-	/* encoding combo is restored at creating time, see create_encoding_combo_store() */
+	ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(encoding_combo), filesel_state.open.encoding_idx);
 }
 
 


Modified: src/encodings.c
117 files changed, 117 insertions(+), 0 deletions(-)
===================================================================
@@ -497,6 +497,123 @@ void encodings_init(void)
 }
 
 
+static gint encoding_combo_store_sort_func(GtkTreeModel *model,
+										   GtkTreeIter *a,
+										   GtkTreeIter *b,
+										   gpointer data)
+{
+	gboolean a_has_child = gtk_tree_model_iter_has_child(model, a);
+	gboolean b_has_child = gtk_tree_model_iter_has_child(model, b);
+	gchar *a_string;
+	gchar *b_string;
+	gint cmp_res;
+
+	if (a_has_child != b_has_child)
+		return a_has_child ? -1 : 1;
+
+	gtk_tree_model_get(model, a, 1, &a_string, -1);
+	gtk_tree_model_get(model, b, 1, &b_string, -1);
+	cmp_res = strcmp(a_string, b_string);
+	g_free(a_string);
+	g_free(b_string);
+	return cmp_res;
+}
+
+
+GtkTreeStore *encodings_encoding_store_new(gboolean has_detect)
+{
+	GtkTreeStore *store;
+	GtkTreeIter iter_current, iter_westeuro, iter_easteuro, iter_eastasian,
+				iter_asian, iter_utf8, iter_middleeast;
+	GtkTreeIter *iter_parent;
+	gchar *encoding_string;
+	gint i;
+
+	store = gtk_tree_store_new(2, G_TYPE_INT, G_TYPE_STRING);
+
+	if (has_detect)
+	{
+		gtk_tree_store_append(store, &iter_current, NULL);
+		gtk_tree_store_set(store, &iter_current, 0, GEANY_ENCODINGS_MAX, 1, _("Detect from file"), -1);
+	}
+
+	gtk_tree_store_append(store, &iter_westeuro, NULL);
+	gtk_tree_store_set(store, &iter_westeuro, 0, -1, 1, _("West European"), -1);
+	gtk_tree_store_append(store, &iter_easteuro, NULL);
+	gtk_tree_store_set(store, &iter_easteuro, 0, -1, 1, _("East European"), -1);
+	gtk_tree_store_append(store, &iter_eastasian, NULL);
+	gtk_tree_store_set(store, &iter_eastasian, 0, -1, 1, _("East Asian"), -1);
+	gtk_tree_store_append(store, &iter_asian, NULL);
+	gtk_tree_store_set(store, &iter_asian, 0, -1, 1, _("SE & SW Asian"), -1);
+	gtk_tree_store_append(store, &iter_middleeast, NULL);
+	gtk_tree_store_set(store, &iter_middleeast, 0, -1, 1, _("Middle Eastern"), -1);
+	gtk_tree_store_append(store, &iter_utf8, NULL);
+	gtk_tree_store_set(store, &iter_utf8, 0, -1, 1, _("Unicode"), -1);
+
+	for (i = 0; i < GEANY_ENCODINGS_MAX; i++)
+	{
+		switch (encodings[i].group)
+		{
+			case WESTEUROPEAN: iter_parent = &iter_westeuro; break;
+			case EASTEUROPEAN: iter_parent = &iter_easteuro; break;
+			case EASTASIAN: iter_parent = &iter_eastasian; break;
+			case ASIAN: iter_parent = &iter_asian; break;
+			case MIDDLEEASTERN: iter_parent = &iter_middleeast; break;
+			case UNICODE: iter_parent = &iter_utf8; break;
+			case NONE:
+			default: iter_parent = NULL;
+		}
+		gtk_tree_store_append(store, &iter_current, iter_parent);
+		encoding_string = encodings_to_string(&encodings[i]);
+		gtk_tree_store_set(store, &iter_current, 0, i, 1, encoding_string, -1);
+		g_free(encoding_string);
+	}
+
+	gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), 1, GTK_SORT_ASCENDING);
+	gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store), 1, encoding_combo_store_sort_func, NULL, NULL);
+
+	return store;
+}
+
+
+gint encodings_encoding_store_get_encoding(GtkTreeStore *store, GtkTreeIter *iter)
+{
+	gint enc;
+	gtk_tree_model_get(GTK_TREE_MODEL(store), iter, 0, &enc, -1);
+	return enc;
+}
+
+
+gboolean encodings_encoding_store_get_iter(GtkTreeStore *store, GtkTreeIter *iter, gint enc)
+{
+	if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), iter))
+	{
+		do
+		{
+			if (encodings_encoding_store_get_encoding(store, iter) == enc)
+				return TRUE;
+		}
+		while (ui_tree_model_iter_any_next(GTK_TREE_MODEL(store), iter, TRUE));
+	}
+	return FALSE;
+}
+
+
+void encodings_encoding_store_cell_data_func(GtkCellLayout *cell_layout,
+											 GtkCellRenderer *cell,
+											 GtkTreeModel *tree_model,
+											 GtkTreeIter *iter,
+											 gpointer data)
+{
+	gboolean sensitive = !gtk_tree_model_iter_has_child(tree_model, iter);
+	gchar *text;
+
+	gtk_tree_model_get(tree_model, iter, 1, &text, -1);
+	g_object_set(cell, "sensitive", sensitive, "text", text, NULL);
+	g_free(text);
+}
+
+
 /**
  *  Tries to convert @a buffer into UTF-8 encoding from the encoding specified with @a charset.
  *  If @a fast is not set, additional checks to validate the converted string are performed.


Modified: src/encodings.h
9 files changed, 9 insertions(+), 0 deletions(-)
===================================================================
@@ -80,6 +80,15 @@ void encodings_select_radio_item(const gchar *charset);
 void encodings_init(void);
 void encodings_finalize(void);
 
+GtkTreeStore *encodings_encoding_store_new(gboolean has_detect);
+
+gint encodings_encoding_store_get_encoding(GtkTreeStore *store, GtkTreeIter *iter);
+
+gboolean encodings_encoding_store_get_iter(GtkTreeStore *store, GtkTreeIter *iter, gint enc);
+
+void encodings_encoding_store_cell_data_func(GtkCellLayout *cell_layout, GtkCellRenderer *cell,
+		GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
+
 gchar *encodings_convert_to_utf8(const gchar *buffer, gssize size, gchar **used_encoding);
 
 /* Converts a string from the given charset to UTF-8.


Modified: src/prefs.c
47 files changed, 26 insertions(+), 21 deletions(-)
===================================================================
@@ -547,8 +547,7 @@ static void prefs_init_dialog(void)
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), file_prefs.tab_order_beside);
 
 	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
-	/* luckily the index of the combo box items match the index of the encodings array */
-	gtk_combo_box_set_active(GTK_COMBO_BOX(widget), file_prefs.default_new_encoding);
+	ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(widget), file_prefs.default_new_encoding);
 
 	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding");
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
@@ -558,10 +557,10 @@ static void prefs_init_dialog(void)
 	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
 	if (file_prefs.default_open_encoding >= 0)
 	{
-		gtk_combo_box_set_active(GTK_COMBO_BOX(widget), file_prefs.default_open_encoding);
+		ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(widget), file_prefs.default_open_encoding);
 	}
 	else
-		gtk_combo_box_set_active(GTK_COMBO_BOX(widget), GEANY_ENCODING_UTF_8);
+		ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(widget), GEANY_ENCODING_UTF_8);
 
 	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_eol");
 	if (file_prefs.default_eol_character >= 0 && file_prefs.default_eol_character < 3)
@@ -1020,13 +1019,13 @@ on_prefs_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
 		file_prefs.tab_order_beside = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
 
 		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
-		file_prefs.default_new_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
+		file_prefs.default_new_encoding = ui_encodings_combo_box_get_active_encoding(GTK_COMBO_BOX(widget));
 
 		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding");
 		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
 		{
 			widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
-			file_prefs.default_open_encoding = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
+			file_prefs.default_open_encoding = ui_encodings_combo_box_get_active_encoding(GTK_COMBO_BOX(widget));
 		}
 		else
 			file_prefs.default_open_encoding = -1;
@@ -1663,22 +1662,34 @@ void prefs_show_dialog(void)
 {
 	if (ui_widgets.prefs_dialog == NULL)
 	{
-		GtkListStore *encoding_list, *eol_list;
-		GtkWidget *label, *widget;
-		guint i;
-		gchar *encoding_string;
+		GtkListStore *eol_list;
+		GtkWidget *label;
 
 		ui_widgets.prefs_dialog = create_prefs_dialog();
 		gtk_widget_set_name(ui_widgets.prefs_dialog, "GeanyPrefsDialog");
 		gtk_window_set_transient_for(GTK_WINDOW(ui_widgets.prefs_dialog), GTK_WINDOW(main_widgets.window));
 
 		/* init the file encoding combo boxes */
-		encoding_list = ui_builder_get_object("encoding_list");
-		for (i = 0; i < GEANY_ENCODINGS_MAX; i++)
 		{
-			encoding_string = encodings_to_string(&encodings[i]);
-			list_store_append_text(encoding_list, encoding_string);
-			g_free(encoding_string);
+			struct {
+				const gchar *combo, *renderer;
+			} names[] = {
+				{ "combo_new_encoding", "combo_new_encoding_renderer" },
+				{ "combo_open_encoding", "combo_open_encoding_renderer" }
+			};
+			guint i;
+			GtkTreeStore *encoding_list = encodings_encoding_store_new(FALSE);
+
+			for (i = 0; i < G_N_ELEMENTS(names); i++)
+			{
+				GtkWidget *combo = ui_lookup_widget(ui_widgets.prefs_dialog, names[i].combo);
+
+				gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo),
+						ui_builder_get_object(names[i].renderer),
+						encodings_encoding_store_cell_data_func, NULL, NULL);
+				gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(encoding_list));
+			}
+			g_object_unref(encoding_list);
 		}
 
 		/* init the eol character combo box */
@@ -1687,12 +1698,6 @@ void prefs_show_dialog(void)
 		list_store_append_text(eol_list, utils_get_eol_name(SC_EOL_CR));
 		list_store_append_text(eol_list, utils_get_eol_name(SC_EOL_LF));
 
-		/* wet combo box wrap width after having filled the encoding to workaround
-		 * GTK bug https://bugzilla.gnome.org/show_bug.cgi?id=722388 */
-		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_new_encoding");
-		gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(widget), 3);
-		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "combo_open_encoding");
-		gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(widget), 3);
 
 		/* add manually GeanyWrapLabels because they can't be added with Glade */
 		/* page Tools */


Modified: src/search.c
17 files changed, 4 insertions(+), 13 deletions(-)
===================================================================
@@ -853,8 +853,6 @@ static void create_fif_dialog(void)
 		*check_recursive, *check_extra, *entry_extra, *check_regexp, *combo_files_mode;
 	GtkWidget *dbox, *sbox, *lbox, *rbox, *hbox, *vbox, *ebox;
 	GtkSizeGroup *size_group;
-	gchar *encoding_string;
-	guint i;
 
 	fif_dlg.dialog = gtk_dialog_new_with_buttons(
 		_("Find in Files"), GTK_WINDOW(main_widgets.window), GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -931,14 +929,7 @@ static void create_fif_dialog(void)
 	label2 = gtk_label_new_with_mnemonic(_("E_ncoding:"));
 	gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
 
-	e_combo = gtk_combo_box_text_new();
-	for (i = 0; i < GEANY_ENCODINGS_MAX; i++)
-	{
-		encoding_string = encodings_to_string(&encodings[i]);
-		gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(e_combo), encoding_string);
-		g_free(encoding_string);
-	}
-	gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(e_combo), 3);
+	e_combo = ui_create_encodings_combo_box(FALSE, GEANY_ENCODING_UTF_8);
 	gtk_label_set_mnemonic_widget(GTK_LABEL(label2), e_combo);
 	fif_dlg.encoding_combo = e_combo;
 
@@ -1118,7 +1109,7 @@ void search_show_find_in_files_dialog_full(const gchar *text, const gchar *dir)
 	/* set the encoding of the current file */
 	if (doc != NULL)
 		enc_idx = encodings_get_idx_from_charset(doc->encoding);
-	gtk_combo_box_set_active(GTK_COMBO_BOX(fif_dlg.encoding_combo), enc_idx);
+	ui_encodings_combo_box_set_active_encoding(GTK_COMBO_BOX(fif_dlg.encoding_combo), enc_idx);
 
 	/* put the focus to the directory entry if it is empty */
 	if (utils_str_equal(gtk_entry_get_text(GTK_ENTRY(entry)), ""))
@@ -1600,8 +1591,8 @@ on_find_in_files_dialog_response(GtkDialog *dialog, gint response,
 		GtkWidget *dir_combo = fif_dlg.dir_combo;
 		const gchar *utf8_dir =
 			gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(dir_combo))));
-		GeanyEncodingIndex enc_idx = gtk_combo_box_get_active(
-			GTK_COMBO_BOX(fif_dlg.encoding_combo));
+		GeanyEncodingIndex enc_idx =
+			ui_encodings_combo_box_get_active_encoding(GTK_COMBO_BOX(fif_dlg.encoding_combo));
 
 		if (G_UNLIKELY(EMPTY(utf8_dir)))
 			ui_set_statusbar(FALSE, _("Invalid directory for find in files."));


Modified: src/symbols.c
45 files changed, 3 insertions(+), 42 deletions(-)
===================================================================
@@ -570,45 +570,6 @@ static GdkPixbuf *get_tag_icon(const gchar *icon_name)
 }
 
 
-/* finds the next iter at any level
- * @param iter in/out, the current iter, will be changed to the next one
- * @param down whether to try the child iter
- * @return TRUE if there @p iter was set, or FALSE if there is no next iter */
-static gboolean next_iter(GtkTreeModel *model, GtkTreeIter *iter, gboolean down)
-{
-	GtkTreeIter guess;
-	GtkTreeIter copy = *iter;
-
-	/* go down if the item has children */
-	if (down && gtk_tree_model_iter_children(model, &guess, iter))
-		*iter = guess;
-	/* or to the next item at the same level */
-	else if (gtk_tree_model_iter_next(model, &copy))
-		*iter = copy;
-	/* or to the next item at a parent level */
-	else if (gtk_tree_model_iter_parent(model, &guess, iter))
-	{
-		copy = guess;
-		while(TRUE)
-		{
-			if (gtk_tree_model_iter_next(model, &copy))
-			{
-				*iter = copy;
-				return TRUE;
-			}
-			else if (gtk_tree_model_iter_parent(model, &copy, &guess))
-				guess = copy;
-			else
-				return FALSE;
-		}
-	}
-	else
-		return FALSE;
-
-	return TRUE;
-}
-
-
 static gboolean find_toplevel_iter(GtkTreeStore *store, GtkTreeIter *iter, const gchar *title)
 {
 	GtkTreeModel *model = GTK_TREE_MODEL(store);
@@ -1314,7 +1275,7 @@ static gboolean tree_store_remove_row(GtkTreeStore *store, GtkTreeIter *iter)
 	if (! cont && has_parent)
 	{
 		*iter = parent;
-		cont = next_iter(GTK_TREE_MODEL(store), iter, FALSE);
+		cont = ui_tree_model_iter_any_next(GTK_TREE_MODEL(store), iter, FALSE);
 	}
 
 	return cont;
@@ -1494,7 +1455,7 @@ static void update_tree_tags(GeanyDocument *doc, GList **tags)
 
 		gtk_tree_model_get(model, &iter, SYMBOLS_COLUMN_TAG, &tag, -1);
 		if (! tag) /* most probably a toplevel, skip it */
-			cont = next_iter(model, &iter, TRUE);
+			cont = ui_tree_model_iter_any_next(model, &iter, TRUE);
 		else
 		{
 			GList *found_item;
@@ -1527,7 +1488,7 @@ static void update_tree_tags(GeanyDocument *doc, GList **tags)
 				tags_table_remove(tags_table, found);
 				*tags = g_list_delete_link(*tags, found_item);
 
-				cont = next_iter(model, &iter, TRUE);
+				cont = ui_tree_model_iter_any_next(model, &iter, TRUE);
 			}
 
 			tm_tag_unref(tag);


Modified: src/ui_utils.c
91 files changed, 91 insertions(+), 0 deletions(-)
===================================================================
@@ -2807,3 +2807,94 @@ const gchar *ui_lookup_stock_label(const gchar *stock_id)
 	g_warning("No stock id '%s'!", stock_id);
 	return NULL;
 }
+
+
+/* finds the next iter at any level
+ * @param iter in/out, the current iter, will be changed to the next one
+ * @param down whether to try the child iter
+ * @return TRUE if there @p iter was set, or FALSE if there is no next iter */
+gboolean ui_tree_model_iter_any_next(GtkTreeModel *model, GtkTreeIter *iter, gboolean down)
+{
+	GtkTreeIter guess;
+	GtkTreeIter copy = *iter;
+
+	/* go down if the item has children */
+	if (down && gtk_tree_model_iter_children(model, &guess, iter))
+		*iter = guess;
+	/* or to the next item at the same level */
+	else if (gtk_tree_model_iter_next(model, &copy))
+		*iter = copy;
+	/* or to the next item at a parent level */
+	else if (gtk_tree_model_iter_parent(model, &guess, iter))
+	{
+		copy = guess;
+		while (TRUE)
+		{
+			if (gtk_tree_model_iter_next(model, &copy))
+			{
+				*iter = copy;
+				return TRUE;
+			}
+			else if (gtk_tree_model_iter_parent(model, &copy, &guess))
+				guess = copy;
+			else
+				return FALSE;
+		}
+	}
+	else
+		return FALSE;
+
+	return TRUE;
+}
+
+
+GtkWidget *ui_create_encodings_combo_box(gboolean has_detect, gint default_enc)
+{
+	GtkCellRenderer *renderer;
+	GtkTreeIter iter;
+	GtkWidget *combo = gtk_combo_box_new();
+	GtkTreeStore *store = encodings_encoding_store_new(has_detect);
+
+	if (default_enc < 0 || default_enc >= GEANY_ENCODINGS_MAX)
+		default_enc = has_detect ? GEANY_ENCODINGS_MAX : GEANY_ENCODING_NONE;
+
+	gtk_combo_box_set_model(GTK_COMBO_BOX(combo), GTK_TREE_MODEL(store));
+	if (encodings_encoding_store_get_iter(store, &iter, default_enc))
+		gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter);
+	renderer = gtk_cell_renderer_text_new();
+	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
+	gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo), renderer,
+			encodings_encoding_store_cell_data_func, NULL, NULL);
+
+	return combo;
+}
+
+
+gint ui_encodings_combo_box_get_active_encoding(GtkComboBox *combo)
+{
+	GtkTreeIter iter;
+	gint enc = GEANY_ENCODING_NONE;
+
+	/* there should always be an active iter anyway, but we check just in case */
+	if (gtk_combo_box_get_active_iter(combo, &iter))
+	{
+		GtkTreeModel *model = gtk_combo_box_get_model(combo);
+		enc = encodings_encoding_store_get_encoding(GTK_TREE_STORE(model), &iter);
+	}
+
+	return enc;
+}
+
+
+gboolean ui_encodings_combo_box_set_active_encoding(GtkComboBox *combo, gint enc)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *model = gtk_combo_box_get_model(combo);
+
+	if (encodings_encoding_store_get_iter(GTK_TREE_STORE(model), &iter, enc))
+	{
+		gtk_combo_box_set_active_iter(combo, &iter);
+		return TRUE;
+	}
+	return FALSE;
+}


Modified: src/ui_utils.h
7 files changed, 7 insertions(+), 0 deletions(-)
===================================================================
@@ -318,6 +318,7 @@ gboolean ui_tree_view_find_next(GtkTreeView *treeview, TVMatchCallback cb);
 
 gboolean ui_tree_view_find_previous(GtkTreeView *treeview, TVMatchCallback cb);
 
+gboolean ui_tree_model_iter_any_next(GtkTreeModel *model, GtkTreeIter *iter, gboolean down);
 
 void ui_statusbar_showhide(gboolean state);
 
@@ -341,6 +342,12 @@ GIcon *ui_get_mime_icon(const gchar *mime_type);
 
 void ui_focus_current_document(void);
 
+GtkWidget *ui_create_encodings_combo_box(gboolean has_detect, gint default_enc);
+
+gint ui_encodings_combo_box_get_active_encoding(GtkComboBox *combo);
+
+gboolean ui_encodings_combo_box_set_active_encoding(GtkComboBox *combo, gint enc);
+
 G_END_DECLS
 
 #endif



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list