SF.net SVN: geany: [727] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Aug 15 21:00:49 UTC 2006


Revision: 727
Author:   ntrel
Date:     2006-08-15 14:00:43 -0700 (Tue, 15 Aug 2006)
ViewCVS:  http://svn.sourceforge.net/geany/?rev=727&view=rev

Log Message:
-----------
Return to showing calltips after successful autocompletion; Use separate functions for html and tag autocompletion

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/keybindings.c
    trunk/src/sci_cb.c
    trunk/src/sci_cb.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-08-15 19:41:12 UTC (rev 726)
+++ trunk/ChangeLog	2006-08-15 21:00:43 UTC (rev 727)
@@ -2,6 +2,9 @@
 
  * tagmanager/c.c: Backported calltips workspace support for C-like
                    user files from Anjuta.
+ * src/keybindings.c, src/sci_cb.c, src/sci_cb.h:
+   Return to showing calltips after successful autocompletion.
+   Use separate functions for html and tag autocompletion.
 
 
 2006-08-15  Enrico Tröger  <enrico.troeger at uvena.de>

Modified: trunk/src/keybindings.c
===================================================================
--- trunk/src/keybindings.c	2006-08-15 19:41:12 UTC (rev 726)
+++ trunk/src/keybindings.c	2006-08-15 21:00:43 UTC (rev 727)
@@ -724,8 +724,7 @@
 {
 	gint idx = document_get_cur_idx();
 	if (idx == -1 || ! doc_list[idx].is_valid) return;
-	sci_cb_start_auto_complete(doc_list[idx].sci,
-					sci_get_current_position(doc_list[idx].sci), idx, TRUE);
+	sci_cb_start_auto_complete(idx, sci_get_current_position(doc_list[idx].sci), TRUE);
 }
 
 static void cb_func_edit_calltip(void)

Modified: trunk/src/sci_cb.c
===================================================================
--- trunk/src/sci_cb.c	2006-08-15 19:41:12 UTC (rev 726)
+++ trunk/src/sci_cb.c	2006-08-15 21:00:43 UTC (rev 727)
@@ -32,6 +32,12 @@
 #include "sciwrappers.h"
 #include "utils.h"
 
+static struct
+{
+	gchar *text;
+	gboolean set;
+} calltip = {NULL, FALSE};
+
 static gchar indent[100];
 
 
@@ -157,6 +163,9 @@
 					{
 						SSM(sci, SCI_CALLTIPCANCEL, 0, 0);
 					}
+					g_free(calltip.text);
+					calltip.text = NULL;
+					calltip.set = FALSE;
 					break;
 				}
 				case ' ':
@@ -176,7 +185,7 @@
 					if (doc_list[idx].use_auto_indention) sci_cb_close_block(sci, pos - 1);
 					break;
 				}
-				default: sci_cb_start_auto_complete(sci, pos, idx, FALSE);
+				default: sci_cb_start_auto_complete(idx, pos, FALSE);
 			}
 			break;
 		}
@@ -198,6 +207,22 @@
 			}
 			break;
 		}
+		case SCN_AUTOCSELECTION:
+		{
+			// now that autocomplete is finishing, reshow calltips if they were showing
+			if (calltip.set)
+			{
+				gint pos = sci_get_current_position(sci);
+				SSM(sci, SCI_CALLTIPSHOW, pos, (sptr_t) calltip.text);
+				// now autocompletion has been cancelled, so do it manually
+				sci_set_selection_start(sci, nt->lParam);
+				sci_set_selection_end(sci, pos);
+				sci_replace_sel(sci, "");	// clear root of word
+				SSM(sci, SCI_INSERTTEXT, nt->lParam, (sptr_t) nt->text);
+				sci_goto_pos(sci, nt->lParam + strlen(nt->text), FALSE);
+			}
+			break;
+		}
 /*		case SCN_STYLENEEDED:
 		{
 			geany_debug("style");
@@ -393,30 +418,97 @@
 	tags = tm_workspace_find(word, tm_tag_max_t, NULL, FALSE, doc_list[idx].file_type->lang);
 	if (tags->len == 1 && TM_TAG(tags->pdata[0])->atts.entry.arglist)
 	{
-		gchar *calltip;
 		tag = TM_TAG(tags->pdata[0]);
+		g_free(calltip.text);	// free the old calltip
+		calltip.set = TRUE;
 		if (tag->atts.entry.var_type)
-			calltip = g_strconcat(tag->atts.entry.var_type, " ", tag->name,
+			calltip.text = g_strconcat(tag->atts.entry.var_type, " ", tag->name,
 										 " ", tag->atts.entry.arglist, NULL);
 		else
-			calltip = g_strconcat(tag->name, " ", tag->atts.entry.arglist, NULL);
+			calltip.text = g_strconcat(tag->name, " ", tag->atts.entry.arglist, NULL);
 
-		utils_wrap_string(calltip, -1);
-		SSM(sci, SCI_CALLTIPSHOW, orig_pos, (sptr_t) calltip);
-		g_free(calltip);
+		utils_wrap_string(calltip.text, -1);
+		SSM(sci, SCI_CALLTIPSHOW, orig_pos, (sptr_t) calltip.text);
 	}
 
 	return TRUE;
 }
 
 
-gboolean sci_cb_start_auto_complete(ScintillaObject *sci, gint pos, gint idx, gboolean force)
+static void show_autocomplete(ScintillaObject *sci, gint rootlen, const gchar *words)
 {
+	// store whether a calltip is showing, so we can reshow it after autocompletion
+	calltip.set = SSM(sci, SCI_CALLTIPACTIVE, 0, 0);
+	SSM(sci, SCI_AUTOCSHOW, rootlen, (sptr_t) words);
+}
+
+
+static gboolean
+autocomplete_html(ScintillaObject *sci, const gchar *root, gsize rootlen)
+{	// HTML entities auto completion
+	guint i, j = 0;
+	GString *words;
+
+	if (*root != '&') return FALSE;
+	if (html_entities == NULL) return FALSE;
+
+	words = g_string_sized_new(500);
+	for (i = 0; ; i++)
+	{
+		if (html_entities[i] == NULL) break;
+		else if (html_entities[i][0] == '#') continue;
+
+		if (! strncmp(html_entities[i], root, rootlen))
+		{
+			if (j++ > 0) g_string_append_c(words, ' ');
+			g_string_append(words, html_entities[i]);
+		}
+	}
+	if (words->len > 0) show_autocomplete(sci, rootlen, words->str);
+	g_string_free(words, TRUE);
+	return TRUE;
+}
+
+
+static gboolean
+autocomplete_tags(gint idx, gchar *root, gsize rootlen)
+{	// PHP, LaTeX, C and C++ tag autocompletion
+	TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 };
+	const GPtrArray *tags;
+	ScintillaObject *sci;
+
+	if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL)
+		return FALSE;
+	sci = doc_list[idx].sci;
+
+	tags = tm_workspace_find(root, tm_tag_max_t, attrs, TRUE, doc_list[idx].file_type->lang);
+	if (NULL != tags && tags->len > 0)
+	{
+		GString *words = g_string_sized_new(150);
+		guint j;
+
+		for (j = 0; ((j < tags->len) && (j < GEANY_MAX_AUTOCOMPLETE_WORDS)); ++j)
+		{
+			if (j > 0) g_string_append_c(words, ' ');
+			g_string_append(words, ((TMTag *) tags->pdata[j])->name);
+		}
+		show_autocomplete(sci, rootlen, words->str);
+		//geany_debug("string size: %d", words->len);
+		g_string_free(words, TRUE);
+	}
+	return TRUE;
+}
+
+
+gboolean sci_cb_start_auto_complete(gint idx, gint pos, gboolean force)
+{
 	gint line, line_start, line_len, line_pos, current, rootlen, startword, lexer, style;
 	gchar *linebuf, *root;
-	const GPtrArray *tags;
+	ScintillaObject *sci;
+	gboolean ret = FALSE;
 
-	if (sci == NULL) return FALSE;
+	if (idx < 0 || ! doc_list[idx].is_valid || doc_list[idx].sci == NULL) return FALSE;
+	sci = doc_list[idx].sci;
 
 	line = sci_get_line_from_position(sci, pos);
 	line_start = sci_get_position_from_line(sci, line);
@@ -442,68 +534,17 @@
 	root = linebuf + startword;
 	rootlen = current - startword;
 
-	if (*root == '&' && lexer == SCLEX_HTML)
-	{	// HTML entities auto completion
-		guint i, j = 0;
-		GString *words;
-
-		if (html_entities == NULL) return FALSE;
-
-		words = g_string_sized_new(500);
-		for (i = 0; ; i++)
-		{
-			if (html_entities[i] == NULL) break;
-			else if (html_entities[i][0] == '#') continue;
-
-			if (! strncmp(html_entities[i], root, rootlen))
-			{
-				if (j++ > 0) g_string_append_c(words, ' ');
-				g_string_append(words, html_entities[i]);
-			}
-		}
-		if (words->len > 0) SSM(sci, SCI_AUTOCSHOW, rootlen, (sptr_t) words->str);
-		g_string_free(words, TRUE);
+	if (lexer == SCLEX_HTML)
+		ret = autocomplete_html(sci, root, rootlen);
+	else
+	{
+		// force is set when called by keyboard shortcut, otherwise start at the 4th char
+		if (force || rootlen >= 4)
+			ret = autocomplete_tags(idx, root, rootlen);
 	}
-	else
-	{	// PHP, LaTeX, C and C++ tag autocompletion
-		gint i = 0;
-		TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 };
 
-		if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL)
-		{
-			g_free(linebuf);
-			return FALSE;
-		}
-
-		if (! force)
-		{	// force is set when called by keyboard shortcut, otherwise start after at third char
-			/// TODO g_ascii_isspace is not the best choise because it allows öprin...
-			while ((line_pos - i >= 0) && ! g_ascii_isspace(linebuf[line_pos - i])) i++;
-			if (i < 4)
-			{	// go home if typed less than 4 chars
-				g_free(linebuf);
-				return FALSE;
-			}
-		}
-
-		tags = tm_workspace_find(root, tm_tag_max_t, attrs, TRUE, doc_list[idx].file_type->lang);
-		if (NULL != tags && tags->len > 0)
-		{
-			GString *words = g_string_sized_new(150);
-			guint j;
-
-			for (j = 0; ((j < tags->len) && (j < GEANY_MAX_AUTOCOMPLETE_WORDS)); ++j)
-			{
-				if (j > 0) g_string_append_c(words, ' ');
-				g_string_append(words, ((TMTag *) tags->pdata[j])->name);
-			}
-			SSM(sci, SCI_AUTOCSHOW, rootlen, (sptr_t) words->str);
-			//geany_debug("string size: %d", words->len);
-			g_string_free(words, TRUE);
-		}
-	}
 	g_free(linebuf);
-	return TRUE;
+	return ret;
 }
 
 

Modified: trunk/src/sci_cb.h
===================================================================
--- trunk/src/sci_cb.h	2006-08-15 19:41:12 UTC (rev 726)
+++ trunk/src/sci_cb.h	2006-08-15 21:00:43 UTC (rev 727)
@@ -29,7 +29,7 @@
 // callback func called by all editors when a signals arises
 void on_editor_notification(GtkWidget* editor, gint scn, gpointer lscn, gpointer user_data);
 
-gboolean sci_cb_start_auto_complete(ScintillaObject *sci, gint pos, gint idx, gboolean force);
+gboolean sci_cb_start_auto_complete(gint idx, gint pos, gboolean force);
 
 void sci_cb_get_indent(ScintillaObject *sci, gint pos, gboolean use_this_line);
 


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