SF.net SVN: geany: [2133] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri Dec 28 17:02:08 UTC 2007
Revision: 2133
http://geany.svn.sourceforge.net/geany/?rev=2133&view=rev
Author: ntrel
Date: 2007-12-28 09:02:07 -0800 (Fri, 28 Dec 2007)
Log Message:
-----------
Refactor with functions: check_single_selection(),
is_folder_selected(), get_tree_path_filename() and separate menu
item callbacks.
Rename "Open with..." popup item "Open externally" ("..." is usually
used when the user can input more information).
Modified Paths:
--------------
trunk/ChangeLog
trunk/plugins/filebrowser.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-12-27 20:23:50 UTC (rev 2132)
+++ trunk/ChangeLog 2007-12-28 17:02:07 UTC (rev 2133)
@@ -1,3 +1,13 @@
+2007-12-28 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * plugins/filebrowser.c:
+ Refactor with functions: check_single_selection(),
+ is_folder_selected(), get_tree_path_filename() and separate menu
+ item callbacks.
+ Rename "Open with..." popup item "Open externally" ("..." is usually
+ used when the user can input more information).
+
+
2007-12-25 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* data/filetype_extensions.conf, src/filetypes.c:
Modified: trunk/plugins/filebrowser.c
===================================================================
--- trunk/plugins/filebrowser.c 2007-12-27 20:23:50 UTC (rev 2132)
+++ trunk/plugins/filebrowser.c 2007-12-28 17:02:07 UTC (rev 2133)
@@ -147,12 +147,20 @@
}
+static gboolean is_top_level_directory(const gchar *dir)
+{
+ g_return_val_if_fail(dir && strlen(dir) > ROOT_OFFSET, FALSE);
+
+ return (utils->str_equal(dir + ROOT_OFFSET, G_DIR_SEPARATOR_S));
+}
+
+
// adds ".." to the start of the file list
static void add_top_level_entry()
{
GtkTreeIter iter;
- if (utils->str_equal(current_dir + ROOT_OFFSET, G_DIR_SEPARATOR_S))
+ if (is_top_level_directory(current_dir))
return;
gtk_list_store_prepend(file_store, &iter);
@@ -253,17 +261,28 @@
}
-static void handle_selection(GList *list, GtkTreeSelection *treesel, gboolean external)
+static gboolean check_single_selection(GtkTreeSelection *treesel)
{
+ if (gtk_tree_selection_count_selected_rows(treesel) == 1)
+ return TRUE;
+
+ ui->set_statusbar(FALSE, _("Too many items selected!"));
+ return FALSE;
+}
+
+
+/* Returns: TRUE if at least one of selected_items is a folder. */
+static gboolean is_folder_selected(GList *selected_items)
+{
GList *item;
GtkTreeModel *model = GTK_TREE_MODEL(file_store);
- GtkTreePath *treepath;
- GtkTreeIter iter;
gboolean dir_found = FALSE;
- for (item = list; item != NULL; item = g_list_next(item))
+ for (item = selected_items; item != NULL; item = g_list_next(item))
{
gchar *icon;
+ GtkTreeIter iter;
+ GtkTreePath *treepath;
treepath = (GtkTreePath*) item->data;
gtk_tree_model_get_iter(model, &iter, treepath);
@@ -277,94 +296,149 @@
}
g_free(icon);
}
+ return dir_found;
+}
- if (dir_found && gtk_tree_selection_count_selected_rows(treesel) > 1)
+
+/* Returns: the full filename in locale encoding. */
+static gchar *get_tree_path_filename(GtkTreePath *treepath)
+{
+ GtkTreeModel *model = GTK_TREE_MODEL(file_store);
+ GtkTreeIter iter;
+ gchar *name, *fname;
+
+ gtk_tree_model_get_iter(model, &iter, treepath);
+ gtk_tree_model_get(model, &iter, FILEVIEW_COLUMN_NAME, &name, -1);
+
+ if (utils->str_equal(name, ".."))
{
- ui->set_statusbar(FALSE, _("Too many items selected!"));
- return;
+ fname = g_path_get_dirname(current_dir);
}
+ else
+ {
+ setptr(name, utils->get_locale_from_utf8(name));
+ fname = g_build_filename(current_dir, name, NULL);
+ }
+ g_free(name);
- for (item = list; item != NULL; item = g_list_next(item))
+ return fname;
+}
+
+
+static void open_external(const gchar *fname, gboolean dir_found)
+{
+ gchar *cmd;
+ gchar *locale_cmd;
+ gchar *dir;
+ GString *cmd_str = g_string_new(open_cmd);
+ GError *error = NULL;
+
+ if (! dir_found)
+ dir = g_path_get_dirname(fname);
+ else
+ dir = g_strdup(fname);
+
+ utils->string_replace_all(cmd_str, "%f", fname);
+ utils->string_replace_all(cmd_str, "%d", dir);
+
+ cmd = g_string_free(cmd_str, FALSE);
+ locale_cmd = utils->get_locale_from_utf8(cmd);
+ if (! g_spawn_command_line_async(locale_cmd, &error))
{
- gchar *name, *fname, *dir_sep = G_DIR_SEPARATOR_S;
- gboolean go_up = FALSE;
+ gchar *c = strchr(cmd, ' ');
- treepath = (GtkTreePath*) item->data;
- gtk_tree_model_get_iter(model, &iter, treepath);
- gtk_tree_model_get(model, &iter, FILEVIEW_COLUMN_NAME, &name, -1);
+ if (c != NULL)
+ *c = '\0';
+ ui->set_statusbar(TRUE,
+ _("Could not execute configured external command '%s' (%s)."),
+ cmd, error->message);
+ g_error_free(error);
+ }
+ g_free(locale_cmd);
+ g_free(cmd);
+ g_free(dir);
+}
- if (utils->str_equal(current_dir + ROOT_OFFSET, G_DIR_SEPARATOR_S))
- dir_sep = "";
- setptr(name, utils->get_locale_from_utf8(name));
- fname = g_strconcat(current_dir, dir_sep, name, NULL);
- if (utils->str_equal(name, ".."))
- go_up = TRUE;
- g_free(name);
- if (external)
- {
- gchar *cmd;
- gchar *locale_cmd;
- gchar *dir;
- GString *cmd_str = g_string_new(open_cmd);
- GError *error= NULL;
+static void on_external_open(GtkMenuItem *menuitem, gpointer user_data)
+{
+ GtkTreeSelection *treesel;
+ GtkTreeModel *model;
+ GList *list;
+ gboolean dir_found;
- if (! dir_found)
- dir = g_path_get_dirname(fname);
- else
- dir = g_strdup(fname);
+ treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_view));
- utils->string_replace_all(cmd_str, "%f", fname);
- utils->string_replace_all(cmd_str, "%d", dir);
+ list = gtk_tree_selection_get_selected_rows(treesel, &model);
+ dir_found = is_folder_selected(list);
- cmd = g_string_free(cmd_str, FALSE);
- locale_cmd = utils->get_locale_from_utf8(cmd);
- if (! g_spawn_command_line_async(locale_cmd, &error))
- {
- gchar *c = strchr(cmd, ' ');
- if (c != NULL)
- *c = '\0';
- ui->set_statusbar(TRUE,
- _("Could not execute configured external command '%s' (%s)."),
- cmd, error->message);
- g_error_free(error);
- }
- g_free(locale_cmd);
- g_free(cmd);
- g_free(dir);
- g_free(fname);
- }
- else if (go_up)
+ if (! dir_found || check_single_selection(treesel))
+ {
+ GList *item;
+
+ for (item = list; item != NULL; item = g_list_next(item))
{
+ GtkTreePath *treepath = item->data;
+ gchar *fname = get_tree_path_filename(treepath);
+
+ open_external(fname, dir_found);
g_free(fname);
- on_go_up();
}
- else if (dir_found)
- {
- setptr(current_dir, fname);
- refresh();
- return;
- }
- else
- {
- documents->open_file(fname, FALSE, NULL, NULL);
- g_free(fname);
- }
}
+
+ g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free(list);
}
-static void open_selected_files(GtkMenuItem *menuitem, gpointer user_data)
+static void open_selected_files(GList *list)
{
+ GList *item;
+
+ for (item = list; item != NULL; item = g_list_next(item))
+ {
+ GtkTreePath *treepath = item->data;
+ gchar *fname = get_tree_path_filename(treepath);
+
+ documents->open_file(fname, FALSE, NULL, NULL);
+ g_free(fname);
+ }
+}
+
+
+static void open_folder(GtkTreePath *treepath)
+{
+ gchar *fname = get_tree_path_filename(treepath);
+
+ setptr(current_dir, fname);
+ refresh();
+}
+
+
+static void on_open_clicked(GtkMenuItem *menuitem, gpointer user_data)
+{
GtkTreeSelection *treesel;
GtkTreeModel *model;
GList *list;
+ gboolean dir_found;
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_view));
list = gtk_tree_selection_get_selected_rows(treesel, &model);
- handle_selection(list, treesel, GPOINTER_TO_INT(user_data));
+ dir_found = is_folder_selected(list);
+ if (dir_found)
+ {
+ if (check_single_selection(treesel))
+ {
+ GtkTreePath *treepath = list->data; // first selected item
+
+ open_folder(treepath);
+ }
+ }
+ else
+ open_selected_files(list);
+
g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
g_list_free(list);
}
@@ -374,41 +448,29 @@
{
GtkTreeSelection *treesel;
GtkTreeModel *model;
- GtkTreePath *treepath;
- GtkTreeIter iter;
GList *list;
- GList *item;
- gchar *icon;
gchar *dir;
- gchar *name;
gboolean is_dir = FALSE;
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_view));
- if (gtk_tree_selection_count_selected_rows(treesel) != 1)
+ if (! check_single_selection(treesel))
return;
list = gtk_tree_selection_get_selected_rows(treesel, &model);
- for (item = list; item != NULL; item = g_list_next(item))
+ is_dir = is_folder_selected(list);
+
+ if (is_dir)
{
- treepath = (GtkTreePath*) item->data;
- gtk_tree_model_get_iter(model, &iter, treepath);
- gtk_tree_model_get(model, &iter,
- FILEVIEW_COLUMN_ICON, &icon,
- FILEVIEW_COLUMN_NAME, &name, -1);
+ GtkTreePath *treepath = list->data; // first selected item
- if (utils->str_equal(icon, GTK_STOCK_DIRECTORY))
- is_dir = TRUE;
- g_free(icon);
+ dir = get_tree_path_filename(treepath);
}
+ else
+ dir = g_strdup(current_dir);
g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
g_list_free(list);
- if (is_dir)
- dir = g_strconcat(current_dir, G_DIR_SEPARATOR_S, name, NULL);
- else
- dir = g_strdup(current_dir);
-
setptr(dir, utils->get_utf8_from_locale(dir));
search->show_find_in_files_dialog(dir);
g_free(dir);
@@ -432,17 +494,16 @@
gtk_widget_show(item);
gtk_container_add(GTK_CONTAINER(menu), item);
g_signal_connect((gpointer) item, "activate",
- G_CALLBACK(open_selected_files), GINT_TO_POINTER(FALSE));
+ G_CALLBACK(on_open_clicked), NULL);
-
image = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
gtk_widget_show(image);
- item = gtk_image_menu_item_new_with_mnemonic(_("Open _with ..."));
+ item = gtk_image_menu_item_new_with_mnemonic(_("Open _externally"));
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
gtk_widget_show(item);
gtk_container_add(GTK_CONTAINER(menu), item);
g_signal_connect((gpointer) item, "activate",
- G_CALLBACK(open_selected_files), GINT_TO_POINTER(TRUE));
+ G_CALLBACK(on_external_open), NULL);
image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_MENU);
gtk_widget_show(image);
@@ -481,7 +542,7 @@
static gboolean on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
- open_selected_files(NULL, NULL);
+ on_open_clicked(NULL, NULL);
else
if (event->button == 3)
{
@@ -504,7 +565,7 @@
|| event->keyval == GDK_ISO_Enter
|| event->keyval == GDK_KP_Enter
|| event->keyval == GDK_space)
- open_selected_files(NULL, NULL);
+ on_open_clicked(NULL, NULL);
if ((event->keyval == GDK_Up ||
event->keyval == GDK_KP_Up) &&
@@ -517,6 +578,7 @@
static void on_path_entry_activate(GtkEntry *entry, gpointer user_data)
{
gchar *new_dir = (gchar*) gtk_entry_get_text(entry);
+
if (NZV(new_dir))
{
if (g_str_has_suffix(new_dir, ".."))
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