SF.net SVN: geany: [1668] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Thu Jul 5 18:19:56 UTC 2007


Revision: 1668
          http://svn.sourceforge.net/geany/?rev=1668&view=rev
Author:   eht16
Date:     2007-07-05 11:19:56 -0700 (Thu, 05 Jul 2007)

Log Message:
-----------
Change comment toggle shortcut to Ctrl-E, undefine shortcuts for comment/uncomment.
Improve some selection issues when using comment/uncomment.
Improve comment toggling by adding an additional character to mark.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/callbacks.c
    trunk/src/editor.c
    trunk/src/editor.h
    trunk/src/geany.h
    trunk/src/keybindings.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-07-05 15:44:08 UTC (rev 1667)
+++ trunk/ChangeLog	2007-07-05 18:19:56 UTC (rev 1668)
@@ -1,6 +1,12 @@
 2007-07-05  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * src/search.c: Fix usage of wrong dialog pointer.
+ * src/callbacks.c, src/editor.c, src/editor.h, src/geany.h,
+   src/keybindings.c:
+   Change comment toggle shortcut to Ctrl-E, undefine shortcuts for
+   comment/uncomment.
+   Improve some selection issues when using comment/uncomment.
+   Improve comment toggling by adding an additional character to mark.
 
 
 2007-07-05  Nick Treleaven  <nick.treleaven at btinternet.com>

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2007-07-05 15:44:08 UTC (rev 1667)
+++ trunk/src/callbacks.c	2007-07-05 18:19:56 UTC (rev 1668)
@@ -1884,7 +1884,7 @@
 {
 	gint idx = document_get_cur_idx();
 	if (idx == -1 || ! doc_list[idx].is_valid) return;
-	editor_do_comment(idx, -1, FALSE);
+	editor_do_comment(idx, -1, FALSE, FALSE);
 }
 
 
@@ -1894,7 +1894,7 @@
 {
 	gint idx = document_get_cur_idx();
 	if (idx == -1 || ! doc_list[idx].is_valid) return;
-	editor_do_uncomment(idx, -1);
+	editor_do_uncomment(idx, -1, FALSE);
 }
 
 

Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c	2007-07-05 15:44:08 UTC (rev 1667)
+++ trunk/src/editor.c	2007-07-05 18:19:56 UTC (rev 1668)
@@ -1455,17 +1455,22 @@
 }
 
 
-void editor_do_uncomment(gint idx, gint line)
+/* set toggle to TRUE if the caller is the toggle function, FALSE otherwise
+ * returns the amount of uncommented single comment lines, in case of multi line uncomment
+ * it returns just 1 */
+gint editor_do_uncomment(gint idx, gint line, gboolean toggle)
 {
 	gint first_line, last_line;
 	gint x, i, line_start, line_len;
 	gint sel_start, sel_end;
+	gint count = 0;
 	gsize co_len;
 	gchar sel[256], *co, *cc;
 	gboolean break_loop = FALSE, single_line = FALSE;
 	filetype *ft;
 
-	if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
+	if (! DOC_IDX_VALID(idx) || doc_list[idx].file_type == NULL)
+		return 0;
 
 	if (line < 0)
 	{	// use selection or current line
@@ -1496,10 +1501,12 @@
 
 	co = ft->comment_open;
 	cc = ft->comment_close;
-	if (co == NULL) return;
+	if (co == NULL)
+		return 0;
 
 	co_len = strlen(co);
-	if (co_len == 0) return;
+	if (co_len == 0)
+		return 0;
 
 	SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0);
 
@@ -1529,17 +1536,38 @@
 
 				single_line = TRUE;
 
-				switch (co_len)
+				if (toggle)
 				{
-					case 1: if (sel[x] != co[0]) continue; break;
-					case 2: if (sel[x] != co[0] || sel[x+1] != co[1]) continue; break;
-					case 3: if (sel[x] != co[0] || sel[x+1] != co[1] || sel[x+2] != co[2])
-								continue; break;
-					default: continue;
+					co_len++;
+					switch (co_len)
+					{
+						case 2: if (sel[x] != co[0] || sel[x+1] != GEANY_TOGGLE_MARK) continue; break;
+						case 3: if (sel[x] != co[0] || sel[x+1] != co[1] ||
+									sel[x+2] != GEANY_TOGGLE_MARK)
+									continue; break;
+						case 4: if (sel[x] != co[0] || sel[x+1] != co[1] || sel[x+2] != co[2] ||
+									sel[x+3] != GEANY_TOGGLE_MARK)
+									continue; break;
+						default: continue;
+					}
 				}
+				else
+				{
+					switch (co_len)
+					{
+						case 1: if (sel[x] != co[0])
+									continue; break;
+						case 2: if (sel[x] != co[0] || sel[x+1] != co[1])
+									continue; break;
+						case 3: if (sel[x] != co[0] || sel[x+1] != co[1] || sel[x+2] != co[2])
+									continue; break;
+						default: continue;
+					}
+				}
 
 				SSM(doc_list[idx].sci, SCI_GOTOPOS, line_start + x + co_len, 0);
 				for (j = 0; j < co_len; j++) SSM(doc_list[idx].sci, SCI_DELETEBACK, 0, 0);
+				count++;
 			}
 			// use multi line comment
 			else
@@ -1568,6 +1596,7 @@
 				if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment)
 				{
 					real_uncomment_multiline(idx);
+					count = 1;
 				}
 
 				// break because we are already on the last line
@@ -1579,20 +1608,23 @@
 	SSM(doc_list[idx].sci, SCI_ENDUNDOACTION, 0, 0);
 
 	// restore selection if there is one
-	if (sel_start < sel_end)
+	// but don't touch the selection if caller is editor_do_comment_toggle
+	if (! toggle && sel_start < sel_end)
 	{
 		if (single_line)
 		{
 			sci_set_selection_start(doc_list[idx].sci, sel_start - co_len);
-			sci_set_selection_end(doc_list[idx].sci, sel_end - ((i - first_line) * co_len));
+			sci_set_selection_end(doc_list[idx].sci, sel_end - (count * co_len));
 		}
 		else
 		{
-			gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1;
+			gint eol_len = utils_get_eol_char_len(idx);
 			sci_set_selection_start(doc_list[idx].sci, sel_start - co_len - eol_len);
 			sci_set_selection_end(doc_list[idx].sci, sel_end - co_len - eol_len);
 		}
 	}
+
+	return count;
 }
 
 
@@ -1607,7 +1639,8 @@
 	gboolean first_line_was_comment = FALSE;
 	filetype *ft;
 
-	if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
+	if (! DOC_IDX_VALID(idx) || doc_list[idx].file_type == NULL)
+		return;
 
 	sel_start = sci_get_selection_start(doc_list[idx].sci);
 	sel_end = sci_get_selection_end(doc_list[idx].sci);
@@ -1632,10 +1665,12 @@
 
 	co = ft->comment_open;
 	cc = ft->comment_close;
-	if (co == NULL) return;
+	if (co == NULL)
+		return;
 
 	co_len = strlen(co);
-	if (co_len == 0) return;
+	if (co_len == 0)
+		return;
 
 	SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0);
 
@@ -1670,33 +1705,31 @@
 						if (sel[x] == co[0])
 						{
 							do_continue = TRUE;
-							editor_do_uncomment(idx, i);
-							count_uncommented++;
 						}
 						break;
 					case 2:
 						if (sel[x] == co[0] && sel[x+1] == co[1])
 						{
 							do_continue = TRUE;
-							editor_do_uncomment(idx, i);
-							count_uncommented++;
 						}
 						break;
 					case 3:
 						if (sel[x] == co[0] && sel[x+1] == co[1] && sel[x+2] == co[2])
 						{
 							do_continue = TRUE;
-							editor_do_uncomment(idx, i);
-							count_uncommented++;
 						}
 						break;
 					default: return;
 				}
 				if (do_continue && i == first_line) first_line_was_comment = TRUE;
-				if (do_continue) continue;
+				if (do_continue)
+				{
+					count_uncommented += editor_do_uncomment(idx, i, TRUE);
+					continue;
+				}
 
 				// we are still here, so the above lines were not already comments, so comment it
-				editor_do_comment(idx, i, FALSE);
+				editor_do_comment(idx, i, FALSE, TRUE);
 				count_commented++;
 			}
 			// use multi line comment
@@ -1761,7 +1794,7 @@
 		}
 		else
 		{
-			gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1;
+			gint eol_len = utils_get_eol_char_len(idx);
 			if (count_uncommented > 0)
 			{
 				sci_set_selection_start(doc_list[idx].sci, sel_start - co_len - eol_len);
@@ -1776,13 +1809,14 @@
 	}
 	else if (count_uncommented > 0)
 	{
-		gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1;
+		gint eol_len = utils_get_eol_char_len(idx);
 		sci_set_current_position(doc_list[idx].sci, sel_start - co_len - eol_len, TRUE);
 	}
 }
 
 
-void editor_do_comment(gint idx, gint line, gboolean allow_empty_lines)
+/* set toggle to TRUE if the caller is the toggle function, FALSE otherwise */
+void editor_do_comment(gint idx, gint line, gboolean allow_empty_lines, gboolean toggle)
 {
 	gint first_line, last_line;
 	gint x, i, line_start, line_len;
@@ -1791,7 +1825,7 @@
 	gboolean break_loop = FALSE, single_line = FALSE;
 	filetype *ft;
 
-	if (idx == -1 || ! doc_list[idx].is_valid || doc_list[idx].file_type == NULL) return;
+	if (! DOC_IDX_VALID(idx) || doc_list[idx].file_type == NULL) return;
 
 	if (line < 0)
 	{	// use selection or current line
@@ -1822,10 +1856,12 @@
 
 	co = ft->comment_open;
 	cc = ft->comment_close;
-	if (co == NULL) return;
+	if (co == NULL)
+		return;
 
 	co_len = strlen(co);
-	if (co_len == 0) return;
+	if (co_len == 0)
+		return;
 
 	SSM(doc_list[idx].sci, SCI_BEGINUNDOACTION, 0, 0);
 
@@ -1851,12 +1887,20 @@
 			// use single line comment
 			if (cc == NULL || strlen(cc) == 0)
 			{
+				gint start = line_start;
 				single_line = TRUE;
 
 				if (ft->comment_use_indent)
-					sci_insert_text(doc_list[idx].sci, line_start + x, co);
+					start = line_start + x;
+
+				if (toggle)
+				{
+					gchar *text = g_strdup_printf("%s%c", co, GEANY_TOGGLE_MARK);
+					sci_insert_text(doc_list[idx].sci, start, text);
+					g_free(text);
+				}
 				else
-					sci_insert_text(doc_list[idx].sci, line_start, co);
+					sci_insert_text(doc_list[idx].sci, start, co);
 			}
 			// use multi line comment
 			else
@@ -1895,7 +1939,8 @@
 	SSM(doc_list[idx].sci, SCI_ENDUNDOACTION, 0, 0);
 
 	// restore selection if there is one
-	if (sel_start < sel_end)
+	// but don't touch the selection if caller is editor_do_comment_toggle
+	if (! toggle && sel_start < sel_end)
 	{
 		if (single_line)
 		{
@@ -1904,7 +1949,7 @@
 		}
 		else
 		{
-			gint eol_len = (sci_get_eol_mode(doc_list[idx].sci) == SC_EOL_CRLF) ? 2 : 1;
+			gint eol_len = utils_get_eol_char_len(idx);
 			sci_set_selection_start(doc_list[idx].sci, sel_start + co_len + eol_len);
 			sci_set_selection_end(doc_list[idx].sci, sel_end + co_len + eol_len);
 		}
@@ -2229,7 +2274,7 @@
 	sci_set_selection_start(doc_list[idx].sci, pos);
 	sci_set_selection_end(doc_list[idx].sci, pos + text_len);
 
-	editor_do_comment(idx, -1, TRUE);
+	editor_do_comment(idx, -1, TRUE, FALSE);
 
 	// set the current position to the start of the first inserted line
 	pos += strlen(doc_list[idx].file_type->comment_open);

Modified: trunk/src/editor.h
===================================================================
--- trunk/src/editor.h	2007-07-05 15:44:08 UTC (rev 1667)
+++ trunk/src/editor.h	2007-07-05 18:19:56 UTC (rev 1668)
@@ -120,9 +120,9 @@
 
 void editor_do_comment_toggle(gint idx);
 
-void editor_do_comment(gint idx, gint line, gboolean allow_empty_lines);
+void editor_do_comment(gint idx, gint line, gboolean allow_empty_lines, gboolean toggle);
 
-void editor_do_uncomment(gint idx, gint line);
+gint editor_do_uncomment(gint idx, gint line, gboolean toggle);
 
 void editor_highlight_braces(ScintillaObject *sci, gint cur_pos);
 

Modified: trunk/src/geany.h
===================================================================
--- trunk/src/geany.h	2007-07-05 15:44:08 UTC (rev 1667)
+++ trunk/src/geany.h	2007-07-05 18:19:56 UTC (rev 1668)
@@ -44,6 +44,7 @@
 #define GEANY_USE_WIN32_DIALOG			0
 #define GEANY_CHECK_FILE_DELAY			30
 #define GEANY_WORDCHARS					"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
+#define GEANY_TOGGLE_MARK				'~'
 #define GEANY_MAX_WORD_LENGTH			192
 #define GEANY_MAX_AUTOCOMPLETE_WORDS	30
 #define GEANY_MAX_AUTOCOMPLETE_HEIGHT	10

Modified: trunk/src/keybindings.c
===================================================================
--- trunk/src/keybindings.c	2007-07-05 15:44:08 UTC (rev 1667)
+++ trunk/src/keybindings.c	2007-07-05 18:19:56 UTC (rev 1668)
@@ -249,11 +249,11 @@
 	keys[GEANY_KEYS_EDIT_TOUPPERCASE] = fill(cb_func_edit,
 		GDK_u, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "edit_touppercase", _("Convert Selection to upper-case"));
 	keys[GEANY_KEYS_EDIT_COMMENTLINETOGGLE] = fill(cb_func_edit,
-		GDK_b, GDK_CONTROL_MASK, "edit_commentlinetoggle", _("Toggle line commentation"));
+		GDK_e, GDK_CONTROL_MASK, "edit_commentlinetoggle", _("Toggle line commentation"));
 	keys[GEANY_KEYS_EDIT_COMMENTLINE] = fill(cb_func_edit,
-		GDK_g, GDK_CONTROL_MASK, "edit_commentline", _("Comment line(s)"));
+		0, 0, "edit_commentline", _("Comment line(s)"));
 	keys[GEANY_KEYS_EDIT_UNCOMMENTLINE] = fill(cb_func_edit,
-		GDK_g, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "edit_uncommentline", _("Uncomment line(s)"));
+		0, 0 | GDK_CONTROL_MASK, "edit_uncommentline", _("Uncomment line(s)"));
 	keys[GEANY_KEYS_EDIT_INCREASEINDENT] = fill(cb_func_edit,
 		GDK_i, GDK_CONTROL_MASK, "edit_increaseindent", _("Increase indent"));
 	keys[GEANY_KEYS_EDIT_DECREASEINDENT] = fill(cb_func_edit,


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