Revision: 1102 http://svn.sourceforge.net/geany/?rev=1102&view=rev Author: eht16 Date: 2006-12-15 09:09:05 -0800 (Fri, 15 Dec 2006)
Log Message: ----------- Moved html_entities array to symbols.c. Fixed some checks for the new D lexer and improved detection of comments when auto completing or showing calltips.
Modified Paths: -------------- trunk/ChangeLog trunk/src/main.c trunk/src/sci_cb.c trunk/src/sci_cb.h trunk/src/symbols.c trunk/src/symbols.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2006-12-15 12:52:52 UTC (rev 1101) +++ trunk/ChangeLog 2006-12-15 17:09:05 UTC (rev 1102) @@ -1,3 +1,12 @@ +2006-12-15 Enrico Tröger enrico.troeger@uvena.de + + * src/main.c, src/sci_cb.c, src/sci_cb.h, src/symbols.c, + src/symbols.h: + Moved html_entities array to symbols.c. + Fixed some checks for the new D lexer and improved detection of + comments when auto completing or showing calltips. + + 2006-12-15 Nick Treleaven nick.treleaven@btinternet.com
* src/sci_cb.c: @@ -14,7 +23,7 @@
2006-12-14 Frank Lanitz frank@frank.uvena.de
- * about.c: Fixed a typo. + * src/about.c: Fixed a typo.
2006-12-14 Nick Treleaven nick.treleaven@btinternet.com @@ -31,8 +40,8 @@
2006-12-13 Frank Lanitz frank@frank.uvena.de
- * THANKS: Small update of contact data and small fix of translated - language. + * THANKS: Small update of contact data and small fix of translated + language.
2006-12-13 Nick Treleaven nick.treleaven@btinternet.com
Modified: trunk/src/main.c =================================================================== --- trunk/src/main.c 2006-12-15 12:52:52 UTC (rev 1101) +++ trunk/src/main.c 2006-12-15 17:09:05 UTC (rev 1102) @@ -52,6 +52,7 @@ #include "search.h" #include "build.h" #include "highlighting.h" +#include "symbols.h"
#ifdef HAVE_SOCKET # include "socket.h" @@ -239,7 +240,6 @@ app->tm_workspace = tm_get_workspace(); app->recent_queue = g_queue_new(); app->opening_session_files = FALSE; - html_entities = NULL;
app->window = create_window1(); app->new_file_menu = gtk_menu_new(); @@ -674,9 +674,9 @@ search_finalize(); build_finalize(); document_finalize(); + symbols_finalize();
tm_workspace_free(TM_WORK_OBJECT(app->tm_workspace)); - g_strfreev(html_entities); g_free(app->configdir); g_free(app->datadir); g_free(app->docdir);
Modified: trunk/src/sci_cb.c =================================================================== --- trunk/src/sci_cb.c 2006-12-15 12:52:52 UTC (rev 1101) +++ trunk/src/sci_cb.c 2006-12-15 17:09:05 UTC (rev 1102) @@ -52,6 +52,7 @@ static gboolean handle_xml(ScintillaObject *sci, gchar ch, gint idx); static void get_indent(ScintillaObject *sci, gint pos, gboolean use_this_line); static void auto_multiline(ScintillaObject *sci, gint pos); +static gboolean is_comment(gint lexer, gint style);
// calls the edit popup menu in the editor @@ -259,7 +260,6 @@ start = pos; while (sci_get_char_at(sci, --start) != '&') ;
- geany_debug("%d-%d", start, pos); SSM(sci, SCI_INSERTTEXT, pos - 1, (sptr_t) nt->text); } break; @@ -433,8 +433,9 @@ sci = doc_list[idx].sci;
lexer = SSM(sci, SCI_GETLEXER, 0, 0); - if (lexer != SCLEX_CPP && lexer != SCLEX_HTML && lexer != SCLEX_PASCAL && lexer != SCLEX_BASH) - return; + if (lexer != SCLEX_CPP && lexer != SCLEX_HTML && lexer != SCLEX_PASCAL && + lexer != SCLEX_D && lexer != SCLEX_BASH) + return;
start_brace = brace_match(sci, pos); line = sci_get_line_from_position(sci, pos); @@ -454,13 +455,8 @@ } g_free(line_buf);
- //geany_debug("line_len: %d eol: %d cnt: %d", line_len, eol_char_len, cnt); if ((line_len - eol_char_len - 1) != cnt) return;
-/* geany_debug("pos: %d, start: %d char: %c start_line: %d", pos, start_brace, - sci_get_char_at(sci, pos), sci_get_line_from_position(sci, start_brace)); -*/ - if (start_brace >= 0) { get_indent(sci, start_brace, TRUE); @@ -509,8 +505,7 @@ { gchar c; gint orig_pos = pos; - // we need something more intelligent than only check for '(' because LaTeX - // uses {, [ or ( + c = SSM(sci, SCI_GETCHARAT, pos, 0); while (pos >= 0 && pos > orig_pos - 300) { @@ -568,8 +563,11 @@ }
style = SSM(sci, SCI_GETSTYLEAT, pos, 0); - if (lexer == SCLEX_CPP && (style == SCE_C_COMMENT || - style == SCE_C_COMMENTLINE || style == SCE_C_COMMENTDOC)) return FALSE; + if (is_comment(lexer, style)) + return FALSE; + // never show a calltip in a PHP file outside of the <? ?> tags + if (lexer == SCLEX_HTML && ! (style >= SCE_HPHP_DEFAULT && style <= SCE_HPHP_OPERATOR)) + return FALSE;
word[0] = '\0'; sci_cb_find_current_word(sci, pos - 1, word, sizeof word); @@ -608,20 +606,20 @@ { // HTML entities auto completion guint i, j = 0; GString *words; + gchar **entities = symbols_get_html_entities();
- if (*root != '&') return FALSE; - if (html_entities == NULL) return FALSE; + if (*root != '&' || 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 (entities[i] == NULL) break; + else if (entities[i][0] == '#') continue;
- if (! strncmp(html_entities[i], root, rootlen)) + if (! strncmp(entities[i], root, rootlen)) { if (j++ > 0) g_string_append_c(words, ' '); - g_string_append(words, html_entities[i]); + g_string_append(words, entities[i]); } } if (words->len > 0) show_autocomplete(sci, rootlen, words->str); @@ -632,7 +630,7 @@
static gboolean autocomplete_tags(gint idx, gchar *root, gsize rootlen) -{ // PHP, LaTeX, C and C++ tag autocompletion +{ // PHP, LaTeX, C, C++, D and Java tag autocompletion TMTagAttrType attrs[] = { tm_tag_attr_name_t, 0 }; const GPtrArray *tags; ScintillaObject *sci; @@ -653,7 +651,6 @@ 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; @@ -667,9 +664,11 @@ ScintillaObject *sci; gboolean ret = FALSE; gchar *wordchars; + filetype *ft;
if (! DOC_IDX_VALID(idx) || doc_list[idx].file_type == NULL) return FALSE; sci = doc_list[idx].sci; + ft = doc_list[idx].file_type;
line = sci_get_line_from_position(sci, pos); line_start = sci_get_position_from_line(sci, line); @@ -680,41 +679,16 @@ lexer = SSM(sci, SCI_GETLEXER, 0, 0); style = SSM(sci, SCI_GETSTYLEAT, pos, 0);
- // don't autocomplete in comments and strings - if (lexer == SCLEX_HTML && style == SCE_H_DEFAULT) return FALSE; - else if ((lexer == SCLEX_CPP || lexer == SCLEX_PASCAL) && (style == SCE_C_COMMENT || - style == SCE_C_COMMENTLINE || - style == SCE_C_COMMENTDOC || - style == SCE_C_STRING)) return FALSE; - else if (lexer == SCLEX_PYTHON && (style == SCE_P_COMMENTLINE || - style == SCE_P_COMMENTBLOCK || - style == SCE_P_STRING)) return FALSE; - else if (lexer == SCLEX_F77 && (style == SCE_F_COMMENT || - style == SCE_F_STRING1 || - style == SCE_F_STRING2)) return FALSE; - else if (lexer == SCLEX_PERL && (style == SCE_PL_COMMENTLINE || - style == SCE_PL_STRING)) return FALSE; - else if (lexer == SCLEX_PROPERTIES && style == SCE_PROPS_COMMENT) return FALSE; - else if (lexer == SCLEX_LATEX && style == SCE_L_COMMENT) return FALSE; - else if (lexer == SCLEX_MAKEFILE && style == SCE_MAKE_COMMENT) return FALSE; - else if (lexer == SCLEX_RUBY && (style == SCE_RB_COMMENTLINE || - style == SCE_RB_STRING)) return FALSE; - else if (lexer == SCLEX_BASH && (style == SCE_SH_COMMENTLINE || - style == SCE_SH_STRING)) return FALSE; - else if (lexer == SCLEX_SQL && (style == SCE_SQL_COMMENT || - style == SCE_SQL_COMMENTLINE || - style == SCE_SQL_COMMENTDOC || - style == SCE_SQL_STRING)) return FALSE; - else if (lexer == SCLEX_TCL && (style == SCE_TCL_COMMENT || - style == SCE_TCL_COMMENTLINE || - style == SCE_TCL_IN_QUOTE)) return FALSE; - else if (lexer == SCLEX_RUBY && style == SCE_MAKE_COMMENT) return FALSE; + // don't autocomplete in comments and strings + if (is_comment(lexer, style)) + return FALSE;
- linebuf = sci_get_line(sci, line);
- if (doc_list[idx].file_type->id == GEANY_FILETYPES_LATEX) + if (ft->id == GEANY_FILETYPES_LATEX) wordchars = GEANY_WORDCHARS"\"; // add \ to word chars if we are in a LaTeX file + else if (ft->id == GEANY_FILETYPES_HTML || ft->id == GEANY_FILETYPES_PHP) + wordchars = GEANY_WORDCHARS"&"; // add & to word chars if we are in a PHP or HTML file else wordchars = GEANY_WORDCHARS;
@@ -726,8 +700,8 @@ rootlen = current - startword;
// entity autocompletion always in a HTML file, in a PHP file only when we are outside of <? ?> - if (doc_list[idx].file_type->id == GEANY_FILETYPES_HTML || - (doc_list[idx].file_type->id == GEANY_FILETYPES_PHP && (style < 118 || style > 127))) + if (ft->id == GEANY_FILETYPES_HTML || + (ft->id == GEANY_FILETYPES_PHP && (style < SCE_HPHP_DEFAULT || style > SCE_HPHP_OPERATOR))) ret = autocomplete_html(sci, root, rootlen); else { @@ -833,7 +807,7 @@ lexer = SSM(sci, SCI_GETLEXER, 0, 0); style = SSM(sci, SCI_GETSTYLEAT, pos - 2, 0);
- // only for C, C++, Java, Perl and PHP + // only for C, C++, D, Ferite, Java, Perl and PHP if (doc_list[idx].file_type->id != GEANY_FILETYPES_PHP && doc_list[idx].file_type->id != GEANY_FILETYPES_C && doc_list[idx].file_type->id != GEANY_FILETYPES_D && @@ -843,23 +817,13 @@ doc_list[idx].file_type->id != GEANY_FILETYPES_FERITE) return;
- // return, if we are in a comment, or when SCLEX_HTML but not in PHP - if (lexer == SCLEX_CPP && ( - style == SCE_C_COMMENT || - style == SCE_C_COMMENTLINE || - style == SCE_C_COMMENTDOC || - style == SCE_C_COMMENTLINEDOC || - style == SCE_C_STRING || - style == SCE_C_CHARACTER || - style == SCE_C_PREPROCESSOR)) return; - //if (lexer == SCLEX_HTML && ! (style >= 118 && style <= 127)) return; + // return, if we are in a comment + if (is_comment(lexer, style)) + return; + // never auto complete in a PHP file outside of the <? ?> tags + if (lexer == SCLEX_HTML && ! (style >= SCE_HPHP_DEFAULT && style <= SCE_HPHP_OPERATOR)) + return;
- if (doc_list[idx].file_type->id == GEANY_FILETYPES_PHP && ( - style == SCE_HPHP_SIMPLESTRING || - style == SCE_HPHP_HSTRING || - style == SCE_HPHP_COMMENTLINE || - style == SCE_HPHP_COMMENT)) return; - // get the indention if (doc_list[idx].use_auto_indention) get_indent(sci, pos, TRUE); eol = g_strconcat(utils_get_eol_char(idx), indent, NULL); @@ -1274,7 +1238,6 @@ line_len = sci_get_line_length(doc_list[idx].sci, i); x = 0;
- //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(255, (line_len - 1)), line_len); sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 255), (line_start + line_len - 1)), sel); sel[MIN(255, (line_len - 1))] = '\0';
@@ -1323,8 +1286,7 @@ case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break; case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break; case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break; - case SCLEX_CPP: - case SCLEX_PASCAL: + case SCLEX_D: style_comment = SCE_D_COMMENT; break; default: style_comment = SCE_C_COMMENT; } if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) @@ -1405,7 +1367,6 @@ line_len = sci_get_line_length(doc_list[idx].sci, i); x = 0;
- //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(255, (line_len - 1)), line_len); sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 255), (line_start + line_len - 1)), sel); sel[MIN(255, (line_len - 1))] = '\0';
@@ -1476,8 +1437,7 @@ case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break; case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break; case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break; - case SCLEX_CPP: - case SCLEX_PASCAL: + case SCLEX_D: style_comment = SCE_D_COMMENT; break; default: style_comment = SCE_C_COMMENT; } if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) @@ -1593,7 +1553,6 @@ line_len = sci_get_line_length(doc_list[idx].sci, i); x = 0;
- //geany_debug("line: %d line_start: %d len: %d (%d)", i, line_start, MIN(256, (line_len - 1)), line_len); sci_get_text_range(doc_list[idx].sci, line_start, MIN((line_start + 256), (line_start + line_len - 1)), sel); sel[MIN(256, (line_len - 1))] = '\0';
@@ -1633,8 +1592,7 @@ case SCLEX_CSS: style_comment = SCE_CSS_COMMENT; break; case SCLEX_SQL: style_comment = SCE_SQL_COMMENT; break; case SCLEX_CAML: style_comment = SCE_CAML_COMMENT; break; - case SCLEX_CPP: - case SCLEX_PASCAL: + case SCLEX_D: style_comment = SCE_D_COMMENT; break; default: style_comment = SCE_C_COMMENT; } if (sci_get_style_at(doc_list[idx].sci, line_start + x) == style_comment) continue; @@ -1780,6 +1738,135 @@ }
+/* Checks whether the given style is a comment or string for the given lexer. + * It doesn't handle LEX_HTML, this should be done by the caller. + * Returns true if the style is a comment, FALSE otherwise. + */ +static gboolean is_comment(gint lexer, gint style) +{ + gboolean result = FALSE; + + switch (lexer) + { + case SCLEX_CPP: + case SCLEX_PASCAL: + { + if (style == SCE_C_COMMENT || + style == SCE_C_COMMENTLINE || + style == SCE_C_COMMENTDOC || + style == SCE_D_COMMENTLINEDOC || + style == SCE_C_CHARACTER || + style == SCE_C_PREPROCESSOR || + style == SCE_C_STRING) + result = TRUE; + break; + } + case SCLEX_D: + { + if (style == SCE_D_COMMENT || + style == SCE_D_COMMENTLINE || + style == SCE_D_COMMENTDOC || + style == SCE_D_COMMENTLINEDOC || + style == SCE_D_COMMENTNESTED || + style == SCE_D_CHARACTER || + style == SCE_D_STRING) + result = TRUE; + break; + } + case SCLEX_PYTHON: + { + if (style == SCE_P_COMMENTLINE || + style == SCE_P_COMMENTBLOCK || + style == SCE_P_STRING) + result = TRUE; + break; + } + case SCLEX_F77: + { + if (style == SCE_F_COMMENT || + style == SCE_F_STRING1 || + style == SCE_F_STRING2) + result = TRUE; + break; + } + case SCLEX_PERL: + { + if (style == SCE_PL_COMMENTLINE || + style == SCE_PL_STRING) + result = TRUE; + break; + } + case SCLEX_PROPERTIES: + { + if (style == SCE_PROPS_COMMENT) + result = TRUE; + break; + } + case SCLEX_LATEX: + { + if (style == SCE_L_COMMENT) + result = TRUE; + break; + } + case SCLEX_MAKEFILE: + { + if (style == SCE_MAKE_COMMENT) + result = TRUE; + break; + } + case SCLEX_RUBY: + { + if (style == SCE_RB_COMMENTLINE || + style == SCE_RB_STRING) + result = TRUE; + break; + } + case SCLEX_BASH: + { + if (style == SCE_SH_COMMENTLINE || + style == SCE_SH_STRING) + result = TRUE; + break; + } + case SCLEX_SQL: + { + if (style == SCE_SQL_COMMENT || + style == SCE_SQL_COMMENTLINE || + style == SCE_SQL_COMMENTDOC || + style == SCE_SQL_STRING) + result = TRUE; + break; + } + case SCLEX_TCL: + { + if (style == SCE_TCL_COMMENT || + style == SCE_TCL_COMMENTLINE || + style == SCE_TCL_IN_QUOTE) + result = TRUE; + break; + } + case SCLEX_HTML: + { + if (style == SCE_HPHP_SIMPLESTRING || + style == SCE_HPHP_HSTRING || + style == SCE_HPHP_COMMENTLINE || + style == SCE_HPHP_COMMENT || + style == SCE_H_DOUBLESTRING || + style == SCE_H_SINGLESTRING || + style == SCE_H_CDATA || + style == SCE_H_COMMENT || + style == SCE_H_SGML_DOUBLESTRING || + style == SCE_H_SGML_SIMPLESTRING || + style == SCE_H_SGML_COMMENT) + result = TRUE; + break; + } + } + + return result; +} + + gboolean sci_cb_lexer_is_c_like(gint lexer) { switch (lexer) @@ -1793,4 +1880,3 @@ } }
-
Modified: trunk/src/sci_cb.h =================================================================== --- trunk/src/sci_cb.h 2006-12-15 12:52:52 UTC (rev 1101) +++ trunk/src/sci_cb.h 2006-12-15 17:09:05 UTC (rev 1102) @@ -41,9 +41,7 @@
extern EditorInfo editor_info;
-gchar **html_entities;
- gboolean on_editor_button_press_event (GtkWidget *widget, GdkEventButton *event,
Modified: trunk/src/symbols.c =================================================================== --- trunk/src/symbols.c 2006-12-15 12:52:52 UTC (rev 1101) +++ trunk/src/symbols.c 2006-12-15 17:09:05 UTC (rev 1102) @@ -28,7 +28,6 @@ #include "symbols.h" #include "utils.h" #include "filetypes.h" -#include "sci_cb.h" // html_entities #include "encodings.h" #include "document.h"
@@ -43,6 +42,8 @@ GTF_MAX };
+static gchar **html_entities = NULL; + typedef struct { gboolean tags_loaded; @@ -285,3 +286,16 @@ }
+gchar **symbols_get_html_entities() +{ + if (html_entities == NULL) + html_tags_loaded(); // if not yet created, force creation of the array but shouldn't occur + + return html_entities; +} + + +void symbols_finalize() +{ + g_strfreev(html_entities); +}
Modified: trunk/src/symbols.h =================================================================== --- trunk/src/symbols.h 2006-12-15 12:52:52 UTC (rev 1101) +++ trunk/src/symbols.h 2006-12-15 17:09:05 UTC (rev 1102) @@ -35,4 +35,8 @@
TMTag *symbols_find_in_workspace(const gchar *tag_name, gint type);
+gchar **symbols_get_html_entities(); + +void symbols_finalize(); + #endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.