SF.net SVN: geany: [1446] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Fri Apr 13 11:42:25 UTC 2007
Revision: 1446
http://svn.sourceforge.net/geany/?rev=1446&view=rev
Author: ntrel
Date: 2007-04-13 04:42:25 -0700 (Fri, 13 Apr 2007)
Log Message:
-----------
Show up and down arrows when there are multiple calltip matches.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/sci_cb.c
trunk/tagmanager/tm_tag.c
trunk/tagmanager/tm_workspace.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-04-10 17:14:12 UTC (rev 1445)
+++ trunk/ChangeLog 2007-04-13 11:42:25 UTC (rev 1446)
@@ -1,3 +1,9 @@
+2007-04-13 Nick Treleaven <nick.treleaven at btinternet.com>
+
+ * src/sci_cb.c, tagmanager/tm_tag.c, tagmanager/tm_workspace.c:
+ Show up and down arrows when there are multiple calltip matches.
+
+
2007-04-10 Enrico Tröger <enrico.troeger at uvena.de>
* geany.glade, src/document.c, src/geany.h, src/interface.c,
Modified: trunk/src/sci_cb.c
===================================================================
--- trunk/src/sci_cb.c 2007-04-10 17:14:12 UTC (rev 1445)
+++ trunk/src/sci_cb.c 2007-04-13 11:42:25 UTC (rev 1446)
@@ -50,7 +50,9 @@
{
gchar *text;
gboolean set;
-} calltip = {NULL, FALSE};
+ gchar *last_word;
+ guint tag_index;
+} calltip = {NULL, FALSE, NULL, 0};
static gchar indent[100];
@@ -336,6 +338,23 @@
}
break;
}
+ case SCN_CALLTIPCLICK:
+ {
+ if (nt->position > 0)
+ {
+ switch (nt->position)
+ {
+ case 1: // up arrow
+ if (calltip.tag_index > 0)
+ calltip.tag_index--;
+ break;
+
+ case 2: calltip.tag_index++; break; // down arrow
+ }
+ sci_cb_show_calltip(idx, -1);
+ }
+ break;
+ }
}
}
@@ -645,15 +664,10 @@
}
-static gchar *tag_to_calltip(const TMTag *tag, filetype_id ft_id)
+static gboolean append_calltip(GString *str, const TMTag *tag, filetype_id ft_id)
{
- GString *str;
- gchar *result;
+ if (! tag->atts.entry.arglist) return FALSE;
- if (! tag->atts.entry.arglist) return NULL;
-
- str = g_string_new(NULL);
-
if (tag->atts.entry.var_type)
{
guint i;
@@ -676,47 +690,87 @@
g_string_append_c(str, ' ');
g_string_append(str, tag->atts.entry.arglist);
- result = str->str;
- g_string_free(str, FALSE);
- return result;
+ return TRUE;
}
static gchar *find_calltip(const gchar *word, filetype *ft)
{
+ const GPtrArray *tags;
+ TMTagAttrType *attrs = NULL;
TMTag *tag;
- const GPtrArray *tags;
+ GString *str = NULL;
+ guint i;
g_return_val_if_fail(ft && word && *word, NULL);
- tags = tm_workspace_find(word, tm_tag_max_t, NULL, FALSE, ft->lang);
-
+ tags = tm_workspace_find(word, tm_tag_max_t, attrs, FALSE, ft->lang);
if (tags->len == 0)
return NULL;
tag = TM_TAG(tags->pdata[0]);
- if (tag->atts.entry.arglist)
+
+ if (tag->type == tm_tag_class_t && FILETYPE_ID(ft) == GEANY_FILETYPES_D)
{
- return tag_to_calltip(tag, FILETYPE_ID(ft));
+ // user typed e.g. 'new Classname(' so lookup D constructor Classname::this()
+ tags = tm_workspace_find_scoped("this", tag->name,
+ tm_tag_function_t | tm_tag_prototype_t, attrs, FALSE, ft->lang, TRUE);
+ if (tags->len == 0)
+ return NULL;
}
- else if (tag->type == tm_tag_class_t && FILETYPE_ID(ft) == GEANY_FILETYPES_D)
+
+ // remove tags with no argument list
+ for (i = 0; i < tags->len; i++)
{
- TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 };
+ tag = TM_TAG(tags->pdata[i]);
- // user typed e.g. 'new Classname(' so lookup D constructor Classname::this()
- tags = tm_workspace_find_scoped("this", tag->name, tm_tag_function_t | tm_tag_prototype_t,
- attrs, FALSE, ft->lang, TRUE);
- if (tags->len != 0)
+ if (! tag->atts.entry.arglist)
+ tags->pdata[i] = NULL;
+ }
+ tm_tags_prune((GPtrArray *) tags);
+ if (tags->len == 0)
+ return NULL;
+
+ // if the current word has changed since last time, start with the first tag match
+ if (! utils_str_equal(word, calltip.last_word))
+ calltip.tag_index = 0;
+ // cache the current word for next time
+ g_free(calltip.last_word);
+ calltip.last_word = g_strdup(word);
+ calltip.tag_index = MIN(calltip.tag_index, tags->len - 1); // ensure tag_index is in range
+
+ for (i = calltip.tag_index; i < tags->len; i++)
+ {
+ tag = TM_TAG(tags->pdata[i]);
+
+ if (str == NULL)
{
- tag = TM_TAG(tags->pdata[0]);
- if (tag->atts.entry.arglist)
- return tag_to_calltip(tag, FILETYPE_ID(ft));
+ str = g_string_new(NULL);
+ if (calltip.tag_index > 0)
+ g_string_prepend(str, "\001 "); // up arrow
+ append_calltip(str, tag, FILETYPE_ID(ft));
}
+ else // add a down arrow
+ {
+ if (calltip.tag_index > 0) // already have an up arrow
+ g_string_insert_c(str, 1, '\002');
+ else
+ g_string_prepend(str, "\002 ");
+ break;
+ }
}
+ if (str)
+ {
+ gchar *result = str->str;
+
+ g_string_free(str, FALSE);
+ return result;
+ }
return NULL;
}
+// use pos = -1 to search for the previous unmatched open bracket.
gboolean sci_cb_show_calltip(gint idx, gint pos)
{
gint orig_pos = pos; // the position for the calltip
Modified: trunk/tagmanager/tm_tag.c
===================================================================
--- trunk/tagmanager/tm_tag.c 2007-04-10 17:14:12 UTC (rev 1445)
+++ trunk/tagmanager/tm_tag.c 2007-04-13 11:42:25 UTC (rev 1446)
@@ -474,6 +474,14 @@
if (0 != (returnval = strcmp(NVL(t1->atts.entry.scope, ""), NVL(t2->atts.entry.scope, ""))))
return returnval;
break;
+ case tm_tag_attr_arglist_t:
+ if (0 != (returnval = strcmp(NVL(t1->atts.entry.arglist, ""), NVL(t2->atts.entry.arglist, ""))))
+ {
+ int line_diff = (t1->atts.entry.line - t2->atts.entry.line);
+
+ return line_diff ? line_diff : returnval;
+ }
+ break;
case tm_tag_attr_vartype_t:
if (0 != (returnval = strcmp(NVL(t1->atts.entry.var_type, ""), NVL(t2->atts.entry.var_type, ""))))
return returnval;
Modified: trunk/tagmanager/tm_workspace.c
===================================================================
--- trunk/tagmanager/tm_workspace.c 2007-04-10 17:14:12 UTC (rev 1445)
+++ trunk/tagmanager/tm_workspace.c 2007-04-13 11:42:25 UTC (rev 1446)
@@ -382,7 +382,7 @@
guint i, j;
TMWorkObject *w;
TMTagAttrType sort_attrs[] = { tm_tag_attr_name_t, tm_tag_attr_file_t
- , tm_tag_attr_scope_t, tm_tag_attr_type_t, 0};
+ , tm_tag_attr_scope_t, tm_tag_attr_type_t, tm_tag_attr_arglist_t, 0};
#ifdef TM_DEBUG
g_message("Recreating workspace tags array");
@@ -551,7 +551,8 @@
}
}
- tm_tags_sort(tags, attrs, TRUE);
+ if (attrs)
+ tm_tags_sort(tags, attrs, TRUE);
return tags;
}
@@ -559,7 +560,7 @@
/* scope can be NULL.
* lang can be -1 */
static int
-fill_find_tags_array (GPtrArray * dst, const GPtrArray * src,
+fill_find_tags_array (GPtrArray *dst, const GPtrArray *src,
const char *name, const char *scope, int type, gboolean partial,
gint lang, gboolean first)
{
@@ -607,12 +608,12 @@
tags = g_ptr_array_new ();
fill_find_tags_array (tags, theWorkspace->work_object.tags_array,
- name, scope, type, partial, lang, TRUE);
+ name, scope, type, partial, lang, FALSE);
if (global_search)
{
// for a scoped tag, I think we always want the same language
fill_find_tags_array (tags, theWorkspace->global_tags,
- name, scope, type, partial, lang, TRUE);
+ name, scope, type, partial, lang, FALSE);
}
if (attrs)
tm_tags_sort (tags, attrs, TRUE);
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