SF.net SVN: geany:[3658] branches/reorder-filetypes
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri Mar 27 14:06:12 UTC 2009
Revision: 3658
http://geany.svn.sourceforge.net/geany/?rev=3658&view=rev
Author: ntrel
Date: 2009-03-27 14:06:11 +0000 (Fri, 27 Mar 2009)
Log Message:
-----------
Sort open dialog filetypes in combo boxes by title.
Add filetypes_foreach_sorted(), filetypes_find().
Modified Paths:
--------------
branches/reorder-filetypes/ChangeLog
branches/reorder-filetypes/src/dialogs.c
branches/reorder-filetypes/src/filetypes.c
branches/reorder-filetypes/src/filetypes.h
Modified: branches/reorder-filetypes/ChangeLog
===================================================================
--- branches/reorder-filetypes/ChangeLog 2009-03-26 23:48:12 UTC (rev 3657)
+++ branches/reorder-filetypes/ChangeLog 2009-03-27 14:06:11 UTC (rev 3658)
@@ -1,3 +1,10 @@
+2009-03-27 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/dialogs.c, src/filetypes.c, src/filetypes.h:
+ Sort open dialog filetypes in combo boxes by title.
+ Add filetypes_foreach_sorted(), filetypes_find().
+
+
2009-03-20 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/highlighting.c, src/dialogs.c, src/plugindata.h,
Modified: branches/reorder-filetypes/src/dialogs.c
===================================================================
--- branches/reorder-filetypes/src/dialogs.c 2009-03-26 23:48:12 UTC (rev 3657)
+++ branches/reorder-filetypes/src/dialogs.c 2009-03-27 14:06:11 UTC (rev 3658)
@@ -71,6 +71,14 @@
#if ! GEANY_USE_WIN32_DIALOG
+static gboolean cmp_ft_title(gconstpointer pft, gconstpointer user_data)
+{
+ const GeanyFiletype *ft = pft;
+
+ return (strcmp(ft->title, user_data) == 0);
+}
+
+
static void
on_file_open_dialog_response (GtkDialog *dialog,
gint response,
@@ -81,8 +89,8 @@
if (response == GTK_RESPONSE_ACCEPT || response == GEANY_RESPONSE_VIEW)
{
GSList *filelist;
- gint filetype_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(
- ui_lookup_widget(GTK_WIDGET(dialog), "filetype_combo")));
+ GtkComboBox *filecombo = GTK_COMBO_BOX(
+ ui_lookup_widget(GTK_WIDGET(dialog), "filetype_combo"));
gint encoding_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(
ui_lookup_widget(GTK_WIDGET(dialog), "encoding_combo")));
GeanyFiletype *ft = NULL;
@@ -90,8 +98,12 @@
gboolean ro = (response == GEANY_RESPONSE_VIEW); /* View clicked */
/* ignore detect from file item */
- if (filetype_idx > 0 && filetype_idx < GEANY_MAX_BUILT_IN_FILETYPES)
- ft = filetypes[filetype_idx];
+ if (gtk_combo_box_get_active(filecombo) > 0)
+ {
+ gchar *title = gtk_combo_box_get_active_text(filecombo);
+ ft = filetypes_find(cmp_ft_title, title);
+ g_free(title);
+ }
if (encoding_idx >= 0 && encoding_idx < GEANY_ENCODINGS_MAX)
charset = encodings[encoding_idx].charset;
@@ -171,6 +183,17 @@
#if ! GEANY_USE_WIN32_DIALOG
+static void add_opendlg_filetype(gpointer pft, gpointer filetype_combo)
+{
+ GeanyFiletype *ft = pft;
+
+ gtk_combo_box_append_text(GTK_COMBO_BOX(filetype_combo), ft->title);
+
+ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(ui_widgets.open_filesel),
+ filetypes_create_file_filter(ft));
+}
+
+
static void create_open_file_dialog(void)
{
GtkWidget *filetype_combo, *encoding_combo;
@@ -214,12 +237,7 @@
/* now create meta filter "All Source" */
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(ui_widgets.open_filesel),
filetypes_create_file_filter_all_source());
- for (i = 1; i < filetypes_array->len; i++)
- {
- gtk_combo_box_append_text(GTK_COMBO_BOX(filetype_combo), filetypes[i]->title);
- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(ui_widgets.open_filesel),
- filetypes_create_file_filter(filetypes[i]));
- }
+ filetypes_foreach_sorted(add_opendlg_filetype, filetype_combo);
gtk_combo_box_set_active(GTK_COMBO_BOX(filetype_combo), 0);
/* fill encoding combo box */
Modified: branches/reorder-filetypes/src/filetypes.c
===================================================================
--- branches/reorder-filetypes/src/filetypes.c 2009-03-26 23:48:12 UTC (rev 3657)
+++ branches/reorder-filetypes/src/filetypes.c 2009-03-27 14:06:11 UTC (rev 3658)
@@ -712,11 +712,8 @@
}
-typedef gboolean FileTypesPredicate(GeanyFiletype *ft, gpointer user_data);
-
/* Find a filetype that predicate returns TRUE for, otherwise return NULL. */
-static GeanyFiletype *filetypes_find(gboolean source_only,
- FileTypesPredicate predicate, gpointer user_data)
+GeanyFiletype *filetypes_find(GCompareFunc predicate, gpointer user_data)
{
guint i;
@@ -724,9 +721,6 @@
{
GeanyFiletype *ft = filetypes[i];
- if (source_only && i == GEANY_FILETYPES_NONE)
- continue; /* None is not for source files */
-
if (predicate(ft, user_data))
return ft;
}
@@ -734,12 +728,16 @@
}
-static gboolean match_basename(GeanyFiletype *ft, gpointer user_data)
+static gboolean match_basename(gconstpointer pft, gconstpointer user_data)
{
+ const GeanyFiletype *ft = pft;
const gchar *base_filename = user_data;
gint j;
gboolean ret = FALSE;
+ if (ft->id == GEANY_FILETYPES_NONE)
+ return FALSE;
+
for (j = 0; ft->pattern[j] != NULL; j++)
{
GPatternSpec *pattern = g_pattern_spec_new(ft->pattern[j]);
@@ -770,7 +768,7 @@
setptr(base_filename, g_utf8_strdown(base_filename, -1));
#endif
- ft = filetypes_find(TRUE, match_basename, base_filename);
+ ft = filetypes_find(match_basename, base_filename);
if (ft == NULL)
ft = filetypes[GEANY_FILETYPES_NONE];
@@ -1480,3 +1478,31 @@
}
+static gint cmp_filetype(gconstpointer pft1, gconstpointer pft2)
+{
+ const GeanyFiletype *ft1 = pft1, *ft2 = pft2;
+
+ return utils_str_casecmp(ft1->name, ft2->name);
+}
+
+
+/* TODO: insert when adding filetypes properly */
+static GSList *sorted_filetypes = NULL;
+
+/* Does not include GEANY_FILETYPES_NONE, as this is usually treated specially. */
+void filetypes_foreach_sorted(GFunc callback, gpointer user_data)
+{
+ guint i;
+ GSList *item;
+
+ if (sorted_filetypes == NULL)
+ {
+ for (i = 1; i < filetypes_array->len; i++)
+ sorted_filetypes = g_slist_insert_sorted(sorted_filetypes, filetypes[i],
+ cmp_filetype);
+ }
+
+ for (item = sorted_filetypes; item != NULL; item = g_slist_next(item))
+ callback(item->data, user_data);
+}
+
Modified: branches/reorder-filetypes/src/filetypes.h
===================================================================
--- branches/reorder-filetypes/src/filetypes.h 2009-03-26 23:48:12 UTC (rev 3657)
+++ branches/reorder-filetypes/src/filetypes.h 2009-03-27 14:06:11 UTC (rev 3658)
@@ -146,7 +146,11 @@
GeanyFiletype *filetypes_lookup_by_name(const gchar *name);
+void filetypes_foreach_sorted(GFunc callback, gpointer user_data);
+GeanyFiletype *filetypes_find(GCompareFunc predicate, gpointer user_data);
+
+
void filetypes_init(void);
void filetypes_init_types(void);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list