SF.net SVN: geany: [2766] branches/editor-struct

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Jul 8 16:30:53 UTC 2008


Revision: 2766
          http://geany.svn.sourceforge.net/geany/?rev=2766&view=rev
Author:   ntrel
Date:     2008-07-08 09:30:37 -0700 (Tue, 08 Jul 2008)

Log Message:
-----------
Fix compilation.
Move utils_get_current_function() to symbols.c.
Move utils_replace_filename() to document.c.

Modified Paths:
--------------
    branches/editor-struct/ChangeLog
    branches/editor-struct/plugins/classbuilder.c
    branches/editor-struct/plugins/htmlchars.c
    branches/editor-struct/plugins/vcdiff.c
    branches/editor-struct/src/callbacks.c
    branches/editor-struct/src/document.c
    branches/editor-struct/src/editor.c
    branches/editor-struct/src/filetypes.c
    branches/editor-struct/src/keyfile.c
    branches/editor-struct/src/notebook.c
    branches/editor-struct/src/symbols.c
    branches/editor-struct/src/symbols.h
    branches/editor-struct/src/treeviews.c
    branches/editor-struct/src/ui_utils.c
    branches/editor-struct/src/utils.c
    branches/editor-struct/src/utils.h

Modified: branches/editor-struct/ChangeLog
===================================================================
--- branches/editor-struct/ChangeLog	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/ChangeLog	2008-07-08 16:30:37 UTC (rev 2766)
@@ -17,6 +17,13 @@
    src/editor.h:
    Fix building editor.c, using GeanyEditor* instead of GeanyDocument*
    (most global editor functions still need conversion though).
+ * src/utils.c, src/utils.h, src/treeviews.c, src/callbacks.c,
+   src/notebook.c, src/keyfile.c, src/filetypes.c, src/document.c,
+   src/editor.c, src/symbols.c, src/symbols.h, src/ui_utils.c,
+   plugins/vcdiff.c, plugins/htmlchars.c, plugins/classbuilder.c:
+   Fix compilation.
+   Move utils_get_current_function() to symbols.c.
+   Move utils_replace_filename() to document.c.
 
 
 2008-07-07  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: branches/editor-struct/plugins/classbuilder.c
===================================================================
--- branches/editor-struct/plugins/classbuilder.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/plugins/classbuilder.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -30,6 +30,7 @@
 #include "support.h"
 #include "filetypes.h"
 #include "document.h"
+#include "editor.h"
 #include "ui_utils.h"
 #include "pluginmacros.h"
 

Modified: branches/editor-struct/plugins/htmlchars.c
===================================================================
--- branches/editor-struct/plugins/htmlchars.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/plugins/htmlchars.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -28,6 +28,7 @@
 #include "support.h"
 #include "plugindata.h"
 #include "document.h"
+#include "editor.h"
 #include "keybindings.h"
 #include "ui_utils.h"
 #include "utils.h"

Modified: branches/editor-struct/plugins/vcdiff.c
===================================================================
--- branches/editor-struct/plugins/vcdiff.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/plugins/vcdiff.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -33,6 +33,7 @@
 #include "support.h"
 #include "plugindata.h"
 #include "document.h"
+#include "editor.h"
 #include "filetypes.h"
 #include "utils.h"
 #include "project.h"

Modified: branches/editor-struct/src/callbacks.c
===================================================================
--- branches/editor-struct/src/callbacks.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/callbacks.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -999,7 +999,7 @@
 	{
 		GeanyDocument *doc = document_get_current();
 		if (doc != NULL)
-			doc->auto_indent = ! doc->auto_indent;
+			doc->editor->auto_indent = ! doc->editor->auto_indent;
 	}
 }
 
@@ -1288,9 +1288,9 @@
 		return;
 	}
 
-	/* utils_get_current_function returns -1 on failure, so sci_get_position_from_line
+	/* symbols_get_current_function returns -1 on failure, so sci_get_position_from_line
 	 * returns the current position, so it should be safe */
-	line = utils_get_current_function(doc, &cur_tag);
+	line = symbols_get_current_function(doc, &cur_tag);
 	pos = sci_get_position_from_line(doc->editor->scintilla, line - 1);
 
 	text = templates_get_template_function(doc->file_type->id, cur_tag);
@@ -1707,7 +1707,7 @@
 		line = sci_get_line_from_position(doc->editor->scintilla, old_pos);
 		ind_pos = sci_get_line_indent_position(doc->editor->scintilla, line);
 		/* when using tabs increase cur pos by 1, when using space increase it by tab_width */
-		step = (doc->use_tabs) ? 1 : editor_prefs.tab_width;
+		step = (doc->editor->use_tabs) ? 1 : editor_prefs.tab_width;
 		new_pos = (old_pos > ind_pos) ? old_pos + step : old_pos;
 
 		sci_set_current_position(doc->editor->scintilla, ind_pos, TRUE);
@@ -1736,7 +1736,7 @@
 		old_pos = sci_get_current_position(doc->editor->scintilla);
 		line = sci_get_line_from_position(doc->editor->scintilla, old_pos);
 		ind_pos = sci_get_line_indent_position(doc->editor->scintilla, line);
-		step = (doc->use_tabs) ? 1 : editor_prefs.tab_width;
+		step = (doc->editor->use_tabs) ? 1 : editor_prefs.tab_width;
 		new_pos = (old_pos >= ind_pos) ? old_pos - step : old_pos;
 
 		if (ind_pos == sci_get_position_from_line(doc->editor->scintilla, line))
@@ -2153,7 +2153,7 @@
 	doc = document_get_current();
 	g_return_if_fail(doc != NULL);
 
-	doc->line_breaking = !doc->line_breaking;
+	doc->editor->line_breaking = !doc->editor->line_breaking;
 }
 
 void

Modified: branches/editor-struct/src/document.c
===================================================================
--- branches/editor-struct/src/document.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/document.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -311,7 +311,7 @@
 
 	sci_set_folding_margin_visible(sci, editor_prefs.folding);
 
-	doc->auto_indent = (editor_prefs.indent_mode != INDENT_NONE);
+	doc->editor->auto_indent = (editor_prefs.indent_mode != INDENT_NONE);
 
 	sci_assign_cmdkey(sci, SCK_HOME,
 		editor_prefs.smart_home_key ? SCI_VCHOMEWRAP : SCI_HOMEWRAP);
@@ -324,13 +324,14 @@
 static void init_doc_struct(GeanyDocument *new_doc)
 {
 	Document *full_doc = DOCUMENT(new_doc);
+	GeanyEditor *editor = new_doc->editor;
 
 	memset(full_doc, 0, sizeof(Document));
 
 	new_doc->is_valid = FALSE;
 	new_doc->has_tags = FALSE;
-	new_doc->auto_indent = (editor_prefs.indent_mode != INDENT_NONE);
-	new_doc->line_wrapping = editor_prefs.line_wrapping;
+	editor->auto_indent = (editor_prefs.indent_mode != INDENT_NONE);
+	editor->line_wrapping = editor_prefs.line_wrapping;
 	new_doc->readonly = FALSE;
 	new_doc->file_name = NULL;
 	new_doc->file_type = NULL;
@@ -338,8 +339,8 @@
 	new_doc->encoding = NULL;
 	new_doc->has_bom = FALSE;
 	new_doc->editor->scintilla = NULL;
-	new_doc->scroll_percent = -1.0F;
-	new_doc->line_breaking = FALSE;
+	editor->scroll_percent = -1.0F;
+	editor->line_breaking = FALSE;
 	new_doc->mtime = 0;
 	new_doc->changed = FALSE;
 	new_doc->last_check = time(NULL);
@@ -502,7 +503,7 @@
 		doc->encoding = NULL;
 		doc->has_bom = FALSE;
 		doc->tm_file = NULL;
-		doc->scroll_percent = -1.0F;
+		doc->editor->scroll_percent = -1.0F;
 		document_undo_clear(doc);
 		if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)) == 0)
 		{
@@ -857,25 +858,25 @@
 /* Sets the cursor position on opening a file. First it sets the line when cl_options.goto_line
  * is set, otherwise it sets the line when pos is greater than zero and finally it sets the column
  * if cl_options.goto_column is set. */
-static void set_cursor_position(GeanyDocument *doc, gint pos)
+static void set_cursor_position(GeanyEditor *editor, gint pos)
 {
 	if (cl_options.goto_line >= 0)
 	{	/* goto line which was specified on command line and then undefine the line */
-		sci_goto_line(doc->editor->scintilla, cl_options.goto_line - 1, TRUE);
-		doc->scroll_percent = 0.5F;
+		sci_goto_line(editor->scintilla, cl_options.goto_line - 1, TRUE);
+		editor->scroll_percent = 0.5F;
 		cl_options.goto_line = -1;
 	}
 	else if (pos > 0)
 	{
-		sci_set_current_position(doc->editor->scintilla, pos, FALSE);
-		doc->scroll_percent = 0.5F;
+		sci_set_current_position(editor->scintilla, pos, FALSE);
+		editor->scroll_percent = 0.5F;
 	}
 
 	if (cl_options.goto_column >= 0)
 	{	/* goto column which was specified on command line and then undefine the column */
-		gint cur_pos = sci_get_current_position(doc->editor->scintilla);
-		sci_set_current_position(doc->editor->scintilla, cur_pos + cl_options.goto_column, FALSE);
-		doc->scroll_percent = 0.5F;
+		gint cur_pos = sci_get_current_position(editor->scintilla);
+		sci_set_current_position(editor->scintilla, cur_pos + cl_options.goto_column, FALSE);
+		editor->scroll_percent = 0.5F;
 		cl_options.goto_column = -1;
 	}
 }
@@ -985,7 +986,7 @@
 			g_free(utf8_filename);
 			g_free(locale_filename);
 			document_check_disk_status(doc, TRUE);	/* force a file changed check */
-			set_cursor_position(doc, pos);
+			set_cursor_position(doc->editor, pos);
 			return doc;
 		}
 	}
@@ -1032,7 +1033,7 @@
 	sci_set_line_numbers(doc->editor->scintilla, editor_prefs.show_linenumber_margin, 0);
 
 	/* set the cursor position according to pos, cl_options.goto_line and cl_options.goto_column */
-	set_cursor_position(doc, pos);
+	set_cursor_position(doc->editor, pos);
 
 	if (! reload)
 	{
@@ -1057,7 +1058,7 @@
 
 	/* set indentation settings after setting the filetype */
 	if (reload)
-		editor_set_use_tabs(doc->editor, doc->use_tabs); /* resetup sci */
+		editor_set_use_tabs(doc->editor, doc->editor->use_tabs); /* resetup sci */
 	else
 		set_indentation(doc);
 
@@ -1215,6 +1216,34 @@
 }
 
 
+static void replace_header_filename(GeanyDocument *doc)
+{
+	gchar *filebase;
+	gchar *filename;
+	struct TextToFind ttf;
+
+	if (doc == NULL || doc->file_type == NULL) return;
+
+	filebase = g_strconcat(GEANY_STRING_UNTITLED, ".", (doc->file_type)->extension, NULL);
+	filename = g_path_get_basename(doc->file_name);
+
+	/* only search the first 3 lines */
+	ttf.chrg.cpMin = 0;
+	ttf.chrg.cpMax = sci_get_position_from_line(doc->editor->scintilla, 3);
+	ttf.lpstrText = (gchar*)filebase;
+
+	if (sci_find_text(doc->editor->scintilla, SCFIND_MATCHCASE, &ttf) != -1)
+	{
+		sci_target_start(doc->editor->scintilla, ttf.chrgText.cpMin);
+		sci_target_end(doc->editor->scintilla, ttf.chrgText.cpMax);
+		sci_target_replace(doc->editor->scintilla, filename, FALSE);
+	}
+
+	g_free(filebase);
+	g_free(filename);
+}
+
+
 /*
  * Save the %document, detecting the filetype.
  *
@@ -1249,7 +1278,7 @@
 			ignore_callback = FALSE;
 		}
 	}
-	utils_replace_filename(doc);
+	replace_header_filename(doc);
 
 	ret = document_save_file(doc, TRUE);
 	if (ret)
@@ -1582,7 +1611,7 @@
 		sci_ensure_line_is_visible(doc->editor->scintilla,
 			sci_get_line_from_position(doc->editor->scintilla, search_pos));
 		if (scroll)
-			doc->scroll_percent = 0.3F;
+			doc->editor->scroll_percent = 0.3F;
 	}
 	else
 	{
@@ -2394,11 +2423,11 @@
 	g_free(text);
 
 	/* copy file properties */
-	doc->line_wrapping = old_doc->line_wrapping;
+	doc->editor->line_wrapping = old_doc->editor->line_wrapping;
 	doc->readonly = old_doc->readonly;
 	doc->has_bom = old_doc->has_bom;
 	document_set_encoding(doc, old_doc->encoding);
-	sci_set_lines_wrapped(doc->editor->scintilla, doc->line_wrapping);
+	sci_set_lines_wrapped(doc->editor->scintilla, doc->editor->line_wrapping);
 	sci_set_readonly(doc->editor->scintilla, doc->readonly);
 
 	ui_document_show_hide(doc);

Modified: branches/editor-struct/src/editor.c
===================================================================
--- branches/editor-struct/src/editor.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/editor.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -3501,7 +3501,7 @@
 
 	/* now that the current document is colourised, fold points are now accurate,
 	 * so force an update of the current function/tag. */
-	utils_get_current_function(NULL, NULL);
+	symbols_get_current_function(NULL, NULL);
 	ui_update_statusbar(NULL, -1);
 }
 

Modified: branches/editor-struct/src/filetypes.c
===================================================================
--- branches/editor-struct/src/filetypes.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/filetypes.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -34,6 +34,7 @@
 #include "support.h"
 #include "templates.h"
 #include "document.h"
+#include "editor.h"
 #include "msgwindow.h"
 #include "utils.h"
 #include "sciwrappers.h"

Modified: branches/editor-struct/src/keyfile.c
===================================================================
--- branches/editor-struct/src/keyfile.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/keyfile.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -148,9 +148,9 @@
 		ft->name,
 		doc->readonly,
 		encodings_get_idx_from_charset(doc->encoding),
-		doc->use_tabs,
-		doc->auto_indent,
-		doc->line_wrapping,
+		doc->editor->use_tabs,
+		doc->editor->auto_indent,
+		doc->editor->line_wrapping,
 		doc->file_name);
 	return fname;
 }
@@ -888,11 +888,11 @@
 			(enc_idx >= 0 && enc_idx < GEANY_ENCODINGS_MAX) ?
 				encodings[enc_idx].charset : NULL);
 
-		if (DOC_VALID(doc))
+		if (doc)
 		{
 			editor_set_use_tabs(doc->editor, use_tabs);
 			editor_set_line_wrapping(doc->editor, line_wrapping);
-			doc->auto_indent = auto_indent;
+			doc->editor->auto_indent = auto_indent;
 			ret = TRUE;
 		}
 	}

Modified: branches/editor-struct/src/notebook.c
===================================================================
--- branches/editor-struct/src/notebook.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/notebook.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -28,6 +28,7 @@
 #include "geany.h"
 #include "notebook.h"
 #include "document.h"
+#include "editor.h"
 #include "documentprivate.h"
 #include "ui_utils.h"
 #include "treeviews.h"

Modified: branches/editor-struct/src/symbols.c
===================================================================
--- branches/editor-struct/src/symbols.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/symbols.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -28,6 +28,7 @@
  * matching filetype is first loaded.
  */
 
+#include "SciLexer.h"
 #include "geany.h"
 
 #include <ctype.h>
@@ -48,6 +49,7 @@
 #include "navqueue.h"
 #include "ui_utils.h"
 #include "editor.h"
+#include "sciwrappers.h"
 
 
 const guint TM_GLOBAL_TYPE_MASK =
@@ -1227,3 +1229,226 @@
 }
 
 
+/* This could perhaps be improved to check for #if, class etc. */
+static gint get_function_fold_number(GeanyDocument *doc)
+{
+	/* for Java the functions are always one fold level above the class scope */
+	if (FILETYPE_ID(doc->file_type) == GEANY_FILETYPES_JAVA)
+		return SC_FOLDLEVELBASE + 1;
+	else
+		return SC_FOLDLEVELBASE;
+}
+
+
+/* Should be used only with symbols_get_current_function. */
+static gboolean current_function_changed(GeanyDocument *doc, gint cur_line, gint fold_level)
+{
+	static gint old_line = -2;
+	static GeanyDocument *old_doc = NULL;
+	static gint old_fold_num = -1;
+	const gint fold_num = fold_level & SC_FOLDLEVELNUMBERMASK;
+	gboolean ret;
+
+	/* check if the cached line and file index have changed since last time: */
+	if (doc == NULL || doc != old_doc)
+		ret = TRUE;
+	else
+	if (cur_line == old_line)
+		ret = FALSE;
+	else
+	{
+		/* if the line has only changed by 1 */
+		if (abs(cur_line - old_line) == 1)
+		{
+			const gint fn_fold =
+				get_function_fold_number(doc);
+			/* It's the same function if the fold number hasn't changed, or both the new
+			 * and old fold numbers are above the function fold number. */
+			gboolean same =
+				fold_num == old_fold_num ||
+				(old_fold_num > fn_fold && fold_num > fn_fold);
+
+			ret = ! same;
+		}
+		else ret = TRUE;
+	}
+
+	/* record current line and file index for next time */
+	old_line = cur_line;
+	old_doc = doc;
+	old_fold_num = fold_num;
+	return ret;
+}
+
+
+/* Parse the function name up to 2 lines before tag_line.
+ * C++ like syntax should be parsed by parse_cpp_function_at_line, otherwise the return
+ * type or argument names can be confused with the function name. */
+static gchar *parse_function_at_line(ScintillaObject *sci, gint tag_line)
+{
+	gint start, end, max_pos;
+	gchar *cur_tag;
+	gint fn_style;
+
+	switch (sci_get_lexer(sci))
+	{
+		case SCLEX_RUBY:	fn_style = SCE_RB_DEFNAME; break;
+		case SCLEX_PYTHON:	fn_style = SCE_P_DEFNAME; break;
+		default: fn_style = SCE_C_IDENTIFIER;	/* several lexers use SCE_C_IDENTIFIER */
+	}
+	start = sci_get_position_from_line(sci, tag_line - 2);
+	max_pos = sci_get_position_from_line(sci, tag_line + 1);
+	while (sci_get_style_at(sci, start) != fn_style
+		&& start < max_pos) start++;
+
+	end = start;
+	while (sci_get_style_at(sci, end) == fn_style
+		&& end < max_pos) end++;
+
+	if (start == end) return NULL;
+	cur_tag = g_malloc(end - start + 1);
+	sci_get_text_range(sci, start, end, cur_tag);
+	return cur_tag;
+}
+
+
+/* Parse the function name */
+static gchar *parse_cpp_function_at_line(ScintillaObject *sci, gint tag_line)
+{
+	gint start, end, first_pos, max_pos;
+	gint tmp;
+	gchar c;
+	gchar *cur_tag;
+
+	first_pos = end = sci_get_position_from_line(sci, tag_line);
+	max_pos = sci_get_position_from_line(sci, tag_line + 1);
+	tmp = 0;
+	/* goto the begin of function body */
+	while (end < max_pos &&
+		(tmp = sci_get_char_at(sci, end)) != '{' &&
+		tmp != 0) end++;
+	if (tmp == 0) end --;
+
+	/* go back to the end of function identifier */
+	while (end > 0 && end > first_pos - 500 &&
+		(tmp = sci_get_char_at(sci, end)) != '(' &&
+		tmp != 0) end--;
+	end--;
+	if (end < 0) end = 0;
+
+	/* skip whitespaces between identifier and ( */
+	while (end > 0 && isspace(sci_get_char_at(sci, end))) end--;
+
+	start = end;
+	c = 0;
+	/* Use tmp to find SCE_C_IDENTIFIER or SCE_C_GLOBALCLASS chars */
+	while (start >= 0 && ((tmp = sci_get_style_at(sci, start)) == SCE_C_IDENTIFIER
+		 ||  tmp == SCE_C_GLOBALCLASS
+		 || (c = sci_get_char_at(sci, start)) == '~'
+		 ||  c == ':'))
+		start--;
+	if (start != 0 && start < end) start++;	/* correct for last non-matching char */
+
+	if (start == end) return NULL;
+	cur_tag = g_malloc(end - start + 2);
+	sci_get_text_range(sci, start, end + 1, cur_tag);
+	return cur_tag;
+}
+
+
+/* Sets *tagname to point at the current function or tag name.
+ * If doc is NULL, reset the cached current tag data to ensure it will be reparsed on the next
+ * call to this function.
+ * Returns: line number of the current tag, or -1 if unknown. */
+gint symbols_get_current_function(GeanyDocument *doc, const gchar **tagname)
+{
+	static gint tag_line = -1;
+	static gchar *cur_tag = NULL;
+	gint line;
+	gint fold_level;
+	TMWorkObject *tm_file;
+
+	if (doc == NULL)	/* reset current function */
+	{
+		current_function_changed(NULL, -1, -1);
+		g_free(cur_tag);
+		cur_tag = g_strdup(_("unknown"));
+		if (tagname != NULL)
+			*tagname = cur_tag;
+		tag_line = -1;
+		return tag_line;
+	}
+
+	line = sci_get_current_line(doc->editor->scintilla);
+	fold_level = sci_get_fold_level(doc->editor->scintilla, line);
+	/* check if the cached line and file index have changed since last time: */
+	if (! current_function_changed(doc, line, fold_level))
+	{
+		/* we can assume same current function as before */
+		*tagname = cur_tag;
+		return tag_line;
+	}
+	g_free(cur_tag); /* free the old tag, it will be replaced. */
+
+	/* if line is at base fold level, we're not in a function */
+	if ((fold_level & SC_FOLDLEVELNUMBERMASK) == SC_FOLDLEVELBASE)
+	{
+		cur_tag = g_strdup(_("unknown"));
+		*tagname = cur_tag;
+		tag_line = -1;
+		return tag_line;
+	}
+	tm_file = doc->tm_file;
+
+	/* if the document has no changes, get the previous function name from TM */
+	if(! doc->changed && tm_file != NULL && tm_file->tags_array != NULL)
+	{
+		const TMTag *tag = (const TMTag*) tm_get_current_function(tm_file->tags_array, line);
+
+		if (tag != NULL)
+		{
+			gchar *tmp;
+			tmp = tag->atts.entry.scope;
+			cur_tag = tmp ? g_strconcat(tmp, "::", tag->name, NULL) : g_strdup(tag->name);
+			*tagname = cur_tag;
+			tag_line = tag->atts.entry.line;
+			return tag_line;
+		}
+	}
+
+	/* parse the current function name here because TM line numbers may have changed,
+	 * and it would take too long to reparse the whole file. */
+	if (doc->file_type != NULL && doc->file_type->id != GEANY_FILETYPES_NONE)
+	{
+		const gint fn_fold = get_function_fold_number(doc);
+
+		tag_line = line;
+		do	/* find the top level fold point */
+		{
+			tag_line = sci_get_fold_parent(doc->editor->scintilla, tag_line);
+			fold_level = sci_get_fold_level(doc->editor->scintilla, tag_line);
+		} while (tag_line >= 0 &&
+			(fold_level & SC_FOLDLEVELNUMBERMASK) != fn_fold);
+
+		if (tag_line >= 0)
+		{
+			if (sci_get_lexer(doc->editor->scintilla) == SCLEX_CPP)
+				cur_tag = parse_cpp_function_at_line(doc->editor->scintilla, tag_line);
+			else
+				cur_tag = parse_function_at_line(doc->editor->scintilla, tag_line);
+
+			if (cur_tag != NULL)
+			{
+				*tagname = cur_tag;
+				return tag_line;
+			}
+		}
+	}
+
+	cur_tag = g_strdup(_("unknown"));
+	*tagname = cur_tag;
+	tag_line = -1;
+	return tag_line;
+}
+
+

Modified: branches/editor-struct/src/symbols.h
===================================================================
--- branches/editor-struct/src/symbols.h	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/symbols.h	2008-07-08 16:30:37 UTC (rev 2766)
@@ -57,4 +57,6 @@
 
 gboolean symbols_goto_tag(const gchar *name, gboolean definition);
 
+gint symbols_get_current_function(GeanyDocument *doc, const gchar **tagname);
+
 #endif

Modified: branches/editor-struct/src/treeviews.c
===================================================================
--- branches/editor-struct/src/treeviews.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/treeviews.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -32,6 +32,7 @@
 #include "callbacks.h"
 #include "treeviews.h"
 #include "document.h"
+#include "editor.h"
 #include "documentprivate.h"
 #include "filetypes.h"
 #include "utils.h"

Modified: branches/editor-struct/src/ui_utils.c
===================================================================
--- branches/editor-struct/src/ui_utils.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/ui_utils.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -46,6 +46,7 @@
 #include "project.h"
 #include "editor.h"
 #include "plugins.h"
+#include "symbols.h"
 
 
 GeanyInterfacePrefs	interface_prefs;
@@ -166,7 +167,7 @@
 				(sci_get_overtype(doc->editor->scintilla) ? _("OVR") : _("INS")));
 		g_string_append(stats_str, sp);
 		g_string_append(stats_str,
-			(doc->use_tabs) ? _("TAB") : _("SP "));	/* SP = space */
+			(doc->editor->use_tabs) ? _("TAB") : _("SP "));	/* SP = space */
 		g_string_append(stats_str, sp);
 		g_string_append_printf(stats_str, _("mode: %s"),
 			editor_get_eol_char_name(doc));
@@ -185,7 +186,7 @@
 			g_string_append(stats_str, sp);
 		}
 
-		utils_get_current_function(doc, &cur_tag);
+		symbols_get_current_function(doc, &cur_tag);
 		g_string_append_printf(stats_str, _("scope: %s"),
 			cur_tag);
 
@@ -699,17 +700,17 @@
 
 	gtk_check_menu_item_set_active(
 			GTK_CHECK_MENU_ITEM(lookup_widget(main_widgets.window, "menu_line_wrapping1")),
-			doc->line_wrapping);
+			doc->editor->line_wrapping);
 
 	gtk_check_menu_item_set_active(
 			GTK_CHECK_MENU_ITEM(lookup_widget(main_widgets.window, "line_breaking1")),
-			doc->line_breaking);
+			doc->editor->line_breaking);
 
 	item = lookup_widget(main_widgets.window, "menu_use_auto_indentation1");
-	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), doc->auto_indent);
+	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), doc->editor->auto_indent);
 	gtk_widget_set_sensitive(item, editor_prefs.indent_mode != INDENT_NONE);
 
-	item = lookup_widget(main_widgets.window, doc->use_tabs ? "tabs1" : "spaces1");
+	item = lookup_widget(main_widgets.window, doc->editor->use_tabs ? "tabs1" : "spaces1");
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), TRUE);
 
 	gtk_check_menu_item_set_active(

Modified: branches/editor-struct/src/utils.c
===================================================================
--- branches/editor-struct/src/utils.c	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/utils.c	2008-07-08 16:30:37 UTC (rev 2766)
@@ -25,7 +25,6 @@
  * General utility functions, non-GTK related.
  */
 
-#include "SciLexer.h"
 #include "geany.h"
 
 #include <stdlib.h>
@@ -49,7 +48,6 @@
 #include "support.h"
 #include "document.h"
 #include "filetypes.h"
-#include "sciwrappers.h"
 #include "dialogs.h"
 #include "win32.h"
 #include "project.h"
@@ -286,229 +284,6 @@
 }
 
 
-/* This could perhaps be improved to check for #if, class etc. */
-static gint get_function_fold_number(GeanyDocument *doc)
-{
-	/* for Java the functions are always one fold level above the class scope */
-	if (FILETYPE_ID(doc->file_type) == GEANY_FILETYPES_JAVA)
-		return SC_FOLDLEVELBASE + 1;
-	else
-		return SC_FOLDLEVELBASE;
-}
-
-
-/* Should be used only with utils_get_current_function. */
-static gboolean current_function_changed(GeanyDocument *doc, gint cur_line, gint fold_level)
-{
-	static gint old_line = -2;
-	static GeanyDocument *old_doc = NULL;
-	static gint old_fold_num = -1;
-	const gint fold_num = fold_level & SC_FOLDLEVELNUMBERMASK;
-	gboolean ret;
-
-	/* check if the cached line and file index have changed since last time: */
-	if (doc == NULL || doc != old_doc)
-		ret = TRUE;
-	else
-	if (cur_line == old_line)
-		ret = FALSE;
-	else
-	{
-		/* if the line has only changed by 1 */
-		if (abs(cur_line - old_line) == 1)
-		{
-			const gint fn_fold =
-				get_function_fold_number(doc);
-			/* It's the same function if the fold number hasn't changed, or both the new
-			 * and old fold numbers are above the function fold number. */
-			gboolean same =
-				fold_num == old_fold_num ||
-				(old_fold_num > fn_fold && fold_num > fn_fold);
-
-			ret = ! same;
-		}
-		else ret = TRUE;
-	}
-
-	/* record current line and file index for next time */
-	old_line = cur_line;
-	old_doc = doc;
-	old_fold_num = fold_num;
-	return ret;
-}
-
-
-/* Parse the function name up to 2 lines before tag_line.
- * C++ like syntax should be parsed by parse_cpp_function_at_line, otherwise the return
- * type or argument names can be confused with the function name. */
-static gchar *parse_function_at_line(ScintillaObject *sci, gint tag_line)
-{
-	gint start, end, max_pos;
-	gchar *cur_tag;
-	gint fn_style;
-
-	switch (sci_get_lexer(sci))
-	{
-		case SCLEX_RUBY:	fn_style = SCE_RB_DEFNAME; break;
-		case SCLEX_PYTHON:	fn_style = SCE_P_DEFNAME; break;
-		default: fn_style = SCE_C_IDENTIFIER;	/* several lexers use SCE_C_IDENTIFIER */
-	}
-	start = sci_get_position_from_line(sci, tag_line - 2);
-	max_pos = sci_get_position_from_line(sci, tag_line + 1);
-	while (sci_get_style_at(sci, start) != fn_style
-		&& start < max_pos) start++;
-
-	end = start;
-	while (sci_get_style_at(sci, end) == fn_style
-		&& end < max_pos) end++;
-
-	if (start == end) return NULL;
-	cur_tag = g_malloc(end - start + 1);
-	sci_get_text_range(sci, start, end, cur_tag);
-	return cur_tag;
-}
-
-
-/* Parse the function name */
-static gchar *parse_cpp_function_at_line(ScintillaObject *sci, gint tag_line)
-{
-	gint start, end, first_pos, max_pos;
-	gint tmp;
-	gchar c;
-	gchar *cur_tag;
-
-	first_pos = end = sci_get_position_from_line(sci, tag_line);
-	max_pos = sci_get_position_from_line(sci, tag_line + 1);
-	tmp = 0;
-	/* goto the begin of function body */
-	while (end < max_pos &&
-		(tmp = sci_get_char_at(sci, end)) != '{' &&
-		tmp != 0) end++;
-	if (tmp == 0) end --;
-
-	/* go back to the end of function identifier */
-	while (end > 0 && end > first_pos - 500 &&
-		(tmp = sci_get_char_at(sci, end)) != '(' &&
-		tmp != 0) end--;
-	end--;
-	if (end < 0) end = 0;
-
-	/* skip whitespaces between identifier and ( */
-	while (end > 0 && isspace(sci_get_char_at(sci, end))) end--;
-
-	start = end;
-	c = 0;
-	/* Use tmp to find SCE_C_IDENTIFIER or SCE_C_GLOBALCLASS chars */
-	while (start >= 0 && ((tmp = sci_get_style_at(sci, start)) == SCE_C_IDENTIFIER
-		 ||  tmp == SCE_C_GLOBALCLASS
-		 || (c = sci_get_char_at(sci, start)) == '~'
-		 ||  c == ':'))
-		start--;
-	if (start != 0 && start < end) start++;	/* correct for last non-matching char */
-
-	if (start == end) return NULL;
-	cur_tag = g_malloc(end - start + 2);
-	sci_get_text_range(sci, start, end + 1, cur_tag);
-	return cur_tag;
-}
-
-
-/* Sets *tagname to point at the current function or tag name.
- * If doc is NULL, reset the cached current tag data to ensure it will be reparsed on the next
- * call to this function.
- * Returns: line number of the current tag, or -1 if unknown. */
-gint utils_get_current_function(GeanyDocument *doc, const gchar **tagname)
-{
-	static gint tag_line = -1;
-	static gchar *cur_tag = NULL;
-	gint line;
-	gint fold_level;
-	TMWorkObject *tm_file;
-
-	if (doc == NULL)	/* reset current function */
-	{
-		current_function_changed(NULL, -1, -1);
-		g_free(cur_tag);
-		cur_tag = g_strdup(_("unknown"));
-		if (tagname != NULL)
-			*tagname = cur_tag;
-		tag_line = -1;
-		return tag_line;
-	}
-
-	line = sci_get_current_line(doc->editor->scintilla);
-	fold_level = sci_get_fold_level(doc->editor->scintilla, line);
-	/* check if the cached line and file index have changed since last time: */
-	if (! current_function_changed(doc, line, fold_level))
-	{
-		/* we can assume same current function as before */
-		*tagname = cur_tag;
-		return tag_line;
-	}
-	g_free(cur_tag); /* free the old tag, it will be replaced. */
-
-	/* if line is at base fold level, we're not in a function */
-	if ((fold_level & SC_FOLDLEVELNUMBERMASK) == SC_FOLDLEVELBASE)
-	{
-		cur_tag = g_strdup(_("unknown"));
-		*tagname = cur_tag;
-		tag_line = -1;
-		return tag_line;
-	}
-	tm_file = doc->tm_file;
-
-	/* if the document has no changes, get the previous function name from TM */
-	if(! doc->changed && tm_file != NULL && tm_file->tags_array != NULL)
-	{
-		const TMTag *tag = (const TMTag*) tm_get_current_function(tm_file->tags_array, line);
-
-		if (tag != NULL)
-		{
-			gchar *tmp;
-			tmp = tag->atts.entry.scope;
-			cur_tag = tmp ? g_strconcat(tmp, "::", tag->name, NULL) : g_strdup(tag->name);
-			*tagname = cur_tag;
-			tag_line = tag->atts.entry.line;
-			return tag_line;
-		}
-	}
-
-	/* parse the current function name here because TM line numbers may have changed,
-	 * and it would take too long to reparse the whole file. */
-	if (doc->file_type != NULL && doc->file_type->id != GEANY_FILETYPES_NONE)
-	{
-		const gint fn_fold = get_function_fold_number(doc);
-
-		tag_line = line;
-		do	/* find the top level fold point */
-		{
-			tag_line = sci_get_fold_parent(doc->editor->scintilla, tag_line);
-			fold_level = sci_get_fold_level(doc->editor->scintilla, tag_line);
-		} while (tag_line >= 0 &&
-			(fold_level & SC_FOLDLEVELNUMBERMASK) != fn_fold);
-
-		if (tag_line >= 0)
-		{
-			if (sci_get_lexer(doc->editor->scintilla) == SCLEX_CPP)
-				cur_tag = parse_cpp_function_at_line(doc->editor->scintilla, tag_line);
-			else
-				cur_tag = parse_function_at_line(doc->editor->scintilla, tag_line);
-
-			if (cur_tag != NULL)
-			{
-				*tagname = cur_tag;
-				return tag_line;
-			}
-		}
-	}
-
-	cur_tag = g_strdup(_("unknown"));
-	*tagname = cur_tag;
-	tag_line = -1;
-	return tag_line;
-}
-
-
 const gchar *utils_get_eol_name(gint eol_mode)
 {
 	switch (eol_mode)
@@ -950,34 +725,6 @@
 }
 
 
-void utils_replace_filename(GeanyDocument *doc)
-{
-	gchar *filebase;
-	gchar *filename;
-	struct TextToFind ttf;
-
-	if (doc == NULL || doc->file_type == NULL) return;
-
-	filebase = g_strconcat(GEANY_STRING_UNTITLED, ".", (doc->file_type)->extension, NULL);
-	filename = g_path_get_basename(doc->file_name);
-
-	/* only search the first 3 lines */
-	ttf.chrg.cpMin = 0;
-	ttf.chrg.cpMax = sci_get_position_from_line(doc->editor->scintilla, 3);
-	ttf.lpstrText = (gchar*)filebase;
-
-	if (sci_find_text(doc->editor->scintilla, SCFIND_MATCHCASE, &ttf) != -1)
-	{
-		sci_target_start(doc->editor->scintilla, ttf.chrgText.cpMin);
-		sci_target_end(doc->editor->scintilla, ttf.chrgText.cpMax);
-		sci_target_replace(doc->editor->scintilla, filename, FALSE);
-	}
-
-	g_free(filebase);
-	g_free(filename);
-}
-
-
 gchar *utils_get_hex_from_color(GdkColor *color)
 {
 	gchar *buffer = g_malloc0(9);

Modified: branches/editor-struct/src/utils.h
===================================================================
--- branches/editor-struct/src/utils.h	2008-07-08 13:53:08 UTC (rev 2765)
+++ branches/editor-struct/src/utils.h	2008-07-08 16:30:37 UTC (rev 2766)
@@ -58,8 +58,6 @@
 
 gchar *utils_find_open_xml_tag(const gchar sel[], gint size, gboolean check_tag);
 
-gint utils_get_current_function(GeanyDocument *doc, const gchar **tagname);
-
 const gchar *utils_get_eol_name(gint eol_mode);
 
 gboolean utils_atob(const gchar *str);
@@ -94,8 +92,6 @@
 
 gchar *utils_get_setting_string(GKeyFile *config, const gchar *section, const gchar *key, const gchar *default_value);
 
-void utils_replace_filename(GeanyDocument *doc);
-
 gchar *utils_get_hex_from_color(GdkColor *color);
 
 const gchar *utils_get_default_dir_utf8(void);


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