[latexila] Completion: simplify close_environment()



commit c71e2f434c49d326233e8c7d0584e734c266ca0b
Author: SÃbastien Wilmet <swilmet src gnome org>
Date:   Thu Jan 19 01:51:56 2012 +0100

    Completion: simplify close_environment()

 src/completion.vala |   78 +++++++++++++--------------------------------------
 src/document.vala   |   13 +++++---
 src/latex_menu.vala |    3 +-
 3 files changed, 29 insertions(+), 65 deletions(-)
---
diff --git a/src/completion.vala b/src/completion.vala
index a941869..18fd6cd 100644
--- a/src/completion.vala
+++ b/src/completion.vala
@@ -442,70 +442,32 @@ public class CompletionProvider : GLib.Object, SourceCompletionProvider
 
     private void close_environment (string env_name, TextIter iter)
     {
-        // Two cases are supported here:
-        // - \begin{env[iter]} : the iter is between the end of env_name and '}'
-        //                       (spaces can be present between iter and '}')
-        // - \begin{env[iter]  : the iter is at the end of env_name, but the '}' has not
-        //                       been inserted (the user has written "\begin{" without
-        //                       auto-completion)
+        Document doc = iter.get_buffer () as Document;
 
-        /* check if '}' is present */
-
-        // get text between iter and end of line
-        int line = iter.get_line ();
-        Document doc = (Document) iter.get_buffer ();
-        TextIter end_iter;
-        doc.get_iter_at_line (out end_iter, line + 1);
-        string text = doc.get_text (iter, end_iter, false);
-
-        bool found = false;
-        long i;
-        for (i = 0 ; i < text.length ; i++)
-        {
-            if (text[i] == '}')
-            {
-                found = true;
-                break;
-            }
-            if (text[i].isspace ())
-                continue;
-            break;
-        }
-
-        if (! found)
-            doc.insert (ref iter, "}", -1);
+        // Close the bracket if needed.
+        if (iter.get_char () == '}')
+            iter.forward_char ();
         else
-            iter.forward_chars ((int) i + 1);
-
-        /* get current indentation */
-
-        // for example ("X" are spaces to take into account):
-        // some text
-        // \begin{figure}
-        // XX\begin{center[enter]
-
-        string current_indent = doc.get_current_indentation (line);
-
-        /* get current choice */
-        CompletionChoice? environment = _environments[env_name];
+            doc.insert (ref iter, "}", -1);
 
-        /* close environment */
+        string cur_indent = doc.get_current_indentation (iter);
+        string indent = doc.tab.view.get_indentation_style ();
 
-        Document document = (Document) doc;
-        string indent = document.tab.view.get_indentation_style ();
+        CompletionChoice? env = _environments[env_name];
 
-        doc.insert (ref iter, @"\n$current_indent$indent", -1);
+        doc.insert (ref iter, @"\n$cur_indent$indent", -1);
 
-        if (environment != null && environment.insert != null)
-            doc.insert (ref iter, environment.insert, -1);
+        if (env != null && env.insert != null)
+            doc.insert (ref iter, env.insert, -1);
 
         TextMark cursor_pos = doc.create_mark (null, iter, true);
 
-        if (environment != null && environment.insert_after != null)
-            doc.insert (ref iter, environment.insert_after, -1);
+        if (env != null && env.insert_after != null)
+            doc.insert (ref iter, env.insert_after, -1);
 
-        doc.insert (ref iter, @"\n$current_indent\\end{" + env_name + "}", -1);
+        doc.insert (ref iter, @"\n$cur_indent\\end{$env_name}", -1);
 
+        // Place the cursor.
         doc.get_iter_at_mark (out iter, cursor_pos);
         doc.delete_mark (cursor_pos);
         doc.place_cursor (iter);
@@ -519,7 +481,7 @@ public class CompletionProvider : GLib.Object, SourceCompletionProvider
     // The iter will be between the '{' and the 'f'.
     private TextIter get_begin_arg_pos (TextIter in_arg_pos)
     {
-        string text = get_text_line_at_iter (in_arg_pos);
+        string text = get_text_line_to_iter (in_arg_pos);
         int cur_index = text.length - 1;
         int prev_index = cur_index;
         unichar cur_char;
@@ -544,7 +506,7 @@ public class CompletionProvider : GLib.Object, SourceCompletionProvider
 
     private string? get_latex_command_at_iter (TextIter iter)
     {
-        string text = get_text_line_at_iter (iter);
+        string text = get_text_line_to_iter (iter);
         return get_latex_command_at_index (text, text.length - 1);
     }
 
@@ -576,7 +538,7 @@ public class CompletionProvider : GLib.Object, SourceCompletionProvider
         info.arg_contents = null;
         info.args_types = new Gee.ArrayList<bool> ();
 
-        string text = get_text_line_at_iter (iter);
+        string text = get_text_line_to_iter (iter);
         long end_pos = text.length - 1;
 
         /* Fetch the argument contents */
@@ -665,8 +627,8 @@ public class CompletionProvider : GLib.Object, SourceCompletionProvider
         return a.text.collate (b.text);
     }
 
-    // Get the text between the beginning of the iter line and the iter position.
-    private string get_text_line_at_iter (TextIter iter)
+    // Get the text between the start of the line and the iter.
+    private string get_text_line_to_iter (TextIter iter)
     {
         int line = iter.get_line ();
         TextBuffer doc = iter.get_buffer ();
diff --git a/src/document.vala b/src/document.vala
index abf9234..08bcf7d 100644
--- a/src/document.vala
+++ b/src/document.vala
@@ -553,19 +553,22 @@ public class Document : Gtk.SourceBuffer
         return path.has_suffix (".tex");
     }
 
-    public string get_current_indentation (int line)
+    public string get_current_indentation (TextIter iter)
     {
         TextIter start_iter, end_iter;
+        int line = iter.get_line ();
         get_iter_at_line (out start_iter, line);
         get_iter_at_line (out end_iter, line + 1);
 
         string text = get_text (start_iter, end_iter, false);
-
         string current_indent = "";
-        for (long i = 0 ; i < text.length ; i++)
+
+        int index = 0;
+        unichar cur_char;
+        while (text.get_next_char (ref index, out cur_char))
         {
-            if (text[i] == ' ' || text[i] == '\t')
-                current_indent += text[i].to_string ();
+            if (cur_char == ' ' || cur_char == '\t')
+                current_indent += cur_char.to_string ();
             else
                 break;
         }
diff --git a/src/latex_menu.vala b/src/latex_menu.vala
index 83fa9df..68b44a4 100644
--- a/src/latex_menu.vala
+++ b/src/latex_menu.vala
@@ -477,8 +477,7 @@ public class LatexMenu : Gtk.ActionGroup
 
         if (text_before.contains ("\n") || text_after.contains ("\n"))
         {
-            string current_indent =
-                active_document.get_current_indentation (start.get_line ());
+            string current_indent = active_document.get_current_indentation (start);
 
             if (current_indent != "")
             {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]