[geany/geany-plugins] 8b1b7c: Added path support to goto_file
federeghe
git-noreply at xxxxx
Thu Sep 11 20:39:01 UTC 2014
Branch: refs/heads/master
Author: federeghe <federico.dev at reghe.net>
Committer: Federico Reghenzani <federico at reghe.net>
Date: Wed, 09 Apr 2014 21:23:21 UTC
Commit: 8b1b7c017c3ae8dc5218aa766041640665d69e4b
https://github.com/geany/geany-plugins/commit/8b1b7c017c3ae8dc5218aa766041640665d69e4b
Log Message:
-----------
Added path support to goto_file
Modified Paths:
--------------
codenav/AUTHORS
codenav/ChangeLog
codenav/README
codenav/src/codenavigation.h
codenav/src/goto_file.c
codenav/src/utils.c
codenav/src/utils.h
Modified: codenav/AUTHORS
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1,2 +1,2 @@
Lionel Fuentes <funto66 at gmail.com>
-Federico Reghenzani <federico at reghe.net>
+Federico Reghenzani <federico.dev at reghe.net>
Modified: codenav/ChangeLog
8 lines changed, 7 insertions(+), 1 deletions(-)
===================================================================
@@ -1,8 +1,14 @@
+2014-03-26 Federico Reghenzani <federico(dot)dev(at)reghe(dot)net>
+ * src/goto_file.c:
+ Implementation directory (absolute/relative path) support.
+ * src/utils.c, src/utils.h:
+ Changes strpos() into strrpos() (reverse order)
+
2014-03-23 Federico Reghenzani <federico(dot)dev(at)reghe(dot)net>
* src/codenavigation.h:
Resolve some compiler warnings.
* src/goto_file.c:
- Implementation foto_file.
+ Implementation goto_file.
* src/utils.c, src/utils.h:
Added strpos().
Modified: codenav/README
13 lines changed, 9 insertions(+), 4 deletions(-)
===================================================================
@@ -6,13 +6,13 @@ Code navigation
About
-----
-This plugin adds some facilities for navigating in the code.
+This plugin adds some facilities for navigating in code files.
Features
--------
-* switch between header and implementation
-* go to a file by typing its name
+* Switch between header and implementation
+* Go to a file by typing its name
Usage
-----
@@ -21,6 +21,11 @@ After installed successfully, load the plugin in Geany's plugin manager
and new menu items in the Edit menu will appear. You can
change the keyboard shortcuts in Geany's preferences dialog.
+*Go to File*
+^^^^^^^^^^^^
+You can open a file in current document directory typing its name. You
+can also enter an absolute or relative path to a file.
+
Requirements
------------
@@ -29,4 +34,4 @@ Requirements
Contact developers
------------------
-Lionel Fuentes <funto66 at gmail.com>
+Federico Reghenzani <federico(dot)dev(at)reghe(dot)net>
Modified: codenav/src/codenavigation.h
6 lines changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -45,7 +45,7 @@
#include "geanyfunctions.h" /* this wraps geany_functions function pointers */
/* Debug flag */
-//#define CODE_NAVIGATION_DEBUG
+/* #define CODE_NAVIGATION_DEBUG */
#define CODE_NAVIGATION_VERSION "0.2"
@@ -66,8 +66,8 @@ static void log_debug(const gchar* s, ...)
#define log_func() g_print("[CODENAV FUNC] : %s", G_STRFUNC)
#else
-#define log_debug(...)
-#define log_func()
+#define log_debug(...) {}
+#define log_func() {}
#endif
/* IDs for keybindings */
Modified: codenav/src/goto_file.c
95 lines changed, 79 insertions(+), 16 deletions(-)
===================================================================
@@ -32,14 +32,20 @@
/******************* Global variables for the feature *****************/
static GtkWidget* menu_item = NULL;
+gchar *directory_ref = NULL;
/********************** Prototypes *********************/
static void
menu_item_activate(guint);
static GtkTreeModel*
-build_file_list(gchar*);
+build_file_list(const gchar*, const gchar*);
+static void
+directory_check(GtkEntry*, GtkEntryCompletion*);
+
+static GtkWidget*
+create_dialog(GtkWidget**, GtkTreeModel*);
/********************** Functions for the feature *********************/
@@ -93,7 +99,7 @@ goto_file_cleanup(void)
*/
static GtkTreeModel*
-build_file_list(gchar* dirname)
+build_file_list(const gchar* dirname, const gchar* prefix)
{
GtkListStore *ret_list;
GtkTreeIter iter;
@@ -113,13 +119,10 @@ build_file_list(gchar* dirname)
pathfile = g_build_filename(dirname,file,NULL);
- if ( ! g_file_test(pathfile, G_FILE_TEST_IS_DIR) )
- { /* File */
- gtk_list_store_append (ret_list, &iter);
- gtk_list_store_set (ret_list, &iter, 0, file, -1);
-
- }
- /* TODO: sub-directory support */
+ /* Append the element to model list */
+ gtk_list_store_append (ret_list, &iter);
+ gtk_list_store_set (ret_list, &iter, 0,
+ g_strconcat(prefix, file, NULL), -1);
g_free(pathfile);
}
@@ -131,6 +134,63 @@ build_file_list(gchar* dirname)
}
/* ---------------------------------------------------------------------
+ * Entry callback function for sub-directory search
+ * ---------------------------------------------------------------------
+ */
+static void
+directory_check(GtkEntry* entry, GtkEntryCompletion* completion)
+{
+ static GtkTreeModel *old_model = NULL;
+ GtkTreeModel* completion_list;
+ static gchar *curr_dir = NULL;
+ gchar *new_dir, *new_dir_path;
+ const gchar *text;
+
+ text = gtk_entry_get_text(entry);
+ gint dir_sep = strrpos(text, G_DIR_SEPARATOR_S);
+
+ /* No subdir found */
+ if (dir_sep == -1)
+ {
+ if (old_model != NULL)
+ { /* Restore the no-sub-directory model */
+ log_debug("Restoring old model!");
+ gtk_entry_completion_set_model (completion, old_model);
+ old_model = NULL;
+ g_free(curr_dir);
+ curr_dir = NULL;
+ }
+ return;
+ }
+
+ new_dir = g_strndup (text, dir_sep+1);
+ /* I've already inserted new model completion for sub-dir elements? */
+ if ( g_strcmp0 (new_dir, curr_dir) == 0 )
+ return;
+
+ if ( curr_dir != NULL )
+ g_free(curr_dir);
+
+ curr_dir = new_dir;
+
+ /* Save the completion_mode for future restore. */
+ if (old_model == NULL)
+ old_model = gtk_entry_completion_get_model(completion);
+
+ log_debug("New completion list!");
+
+ if ( g_path_is_absolute(new_dir) )
+ new_dir_path = new_dir;
+ else
+ new_dir_path = g_build_filename(directory_ref, new_dir, NULL);
+
+ /* Build the new file list for completion */
+ completion_list = build_file_list(new_dir_path, new_dir);
+ gtk_entry_completion_set_model (completion, completion_list);
+ g_object_unref(completion_list);
+}
+
+/* ---------------------------------------------------------------------
* Create the dialog, return the entry
* ---------------------------------------------------------------------
*/
@@ -159,9 +219,9 @@ create_dialog(GtkWidget **dialog, GtkTreeModel *completion_model)
gtk_container_add(GTK_CONTAINER(vbox), entry);
gtk_entry_set_text(GTK_ENTRY(entry), "");
gtk_entry_set_max_length(GTK_ENTRY(entry), MAX_FILENAME_LENGTH);
- gtk_entry_set_width_chars(GTK_ENTRY(entry), 30);
+ gtk_entry_set_width_chars(GTK_ENTRY(entry), 40);
gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE); /* 'enter' key */
-
+
/* Completion definition */
completion = gtk_entry_completion_new();
gtk_entry_set_completion(GTK_ENTRY(entry), completion);
@@ -171,6 +231,9 @@ create_dialog(GtkWidget **dialog, GtkTreeModel *completion_model)
gtk_entry_completion_set_inline_completion(completion, 1);
gtk_entry_completion_set_text_column (completion, 0);
+ /* Signals */
+ g_signal_connect_after(GTK_ENTRY(entry), "changed",
+ G_CALLBACK(directory_check), completion);
gtk_widget_show_all(*dialog);
@@ -189,7 +252,7 @@ menu_item_activate(guint key_id)
GtkWidget* dialog_entry;
GtkTreeModel* completion_list;
GeanyDocument* current_doc = document_get_current();
- gchar *dirname, *chosen_path;
+ gchar *chosen_path;
const gchar *chosen_file;
gint response;
@@ -199,8 +262,8 @@ menu_item_activate(guint key_id)
return;
/* Build current directory listing */
- dirname = g_path_get_dirname(current_doc->file_name);
- completion_list = build_file_list(dirname);
+ directory_ref = g_path_get_dirname(current_doc->file_name);
+ completion_list = build_file_list(directory_ref, "");
/* Create the user dialog and get response */
dialog_entry = create_dialog(&dialog, completion_list);
@@ -209,7 +272,7 @@ menu_item_activate(guint key_id)
/* Filename */
chosen_file = gtk_entry_get_text(GTK_ENTRY(dialog_entry));
/* Path + Filename */
- chosen_path = g_build_filename(dirname, chosen_file, NULL);
+ chosen_path = g_build_filename(directory_ref, chosen_file, NULL);
if ( response == GTK_RESPONSE_ACCEPT )
{
@@ -237,6 +300,6 @@ menu_item_activate(guint key_id)
/* Freeing memory */
gtk_widget_destroy(dialog);
- g_free(dirname);
+ g_free(directory_ref);
g_object_unref (completion_list);
}
Modified: codenav/src/utils.c
6 lines changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -79,11 +79,11 @@ compare_strings(const gchar* a, const gchar* b)
return (gint)(!utils_str_equal(a, b));
}
-/* A PHP-like strpos implementation */
+/* A PHP-like reverse strpos implementation */
gint
-strpos(const gchar *haystack, const gchar *needle)
+strrpos(const gchar *haystack, const gchar *needle)
{
- char *p = g_strstr_len(haystack, -1, needle);
+ char *p = g_strrstr_len(haystack, -1, needle);
if (p)
return p - haystack;
return -1; // not found
Modified: codenav/src/utils.h
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -42,6 +42,6 @@ gint
compare_strings(const gchar* a, const gchar* b);
gint
-strpos(const gchar *haystack, const gchar *needle);
+strrpos(const gchar *haystack, const gchar *needle);
#endif /* UTILS_H */
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list