src/Palete/Palete.vala
[app.Builder.js] / src / Palete / CompletionProvider.vala
index b59c05c..36b9c99 100644 (file)
@@ -8,73 +8,99 @@ namespace Palete {
     {
                Editor editor; 
                WindowState windowstate;
-               public List<SourceCompletionItem> proposals;
-               //public List<Gtk.SourceCompletionItem> filtered_proposals;
+               //public List<Gtk.SourceCompletionItem> filtered_proposals;
 
-               construct(Editor editor)
+               public CompletionProvider(Editor editor)
                {
                    this.editor  = editor;
-                   this.windowstate = editor.window.windowstate;
+                   this.windowstate = null; // not ready until the UI is built.
                    
-                       this.proposals = new List<SourceCompletionItem> ();
-               }
+               }
 
                public string get_name ()
                {
-                 return  "test";
+                 return  "roojsbuilder";
                }
 
                public int get_priority ()
                {
-                 return 1;
+                 return 200;
                }
 
                public bool match (SourceCompletionContext context)
                {
-               
-                       return true;
+                       bool has_matches = false;
+                       this.fetchMatches(context, out has_matches);
+                       return has_matches;
                }
 
+               public List<SourceCompletionItem>? fetchMatches(SourceCompletionContext context, out bool has_matches)
+               {
+                    has_matches = false;
+
+                   if (this.windowstate == null) {
+                           this.windowstate = this.editor.window.windowstate;
+                   }
+               
+               
+                   var buffer = context.completion.view.buffer;
+                   var  mark = buffer.get_insert ();
+                   TextIter end;
+
+                   buffer.get_iter_at_mark (out end, mark);
+                   var endpos = end;
+               
+                   var searchpos = endpos;
+               
+                   searchpos.backward_find_char(is_space, null);
+                   searchpos.forward_char();
+                   var search = endpos.get_text(searchpos);
+                   print("got search %s\n", search);
+               
+                   if (search.length < 2) {
+                           return null;
+                   }
+               
+                   // now do our magic..
+                   var filtered_proposals = this.windowstate.file.palete().suggestComplete(
+                           this.windowstate.file,
+                           this.editor.node,
+                           this.editor.ptype,
+                           this.editor.key,
+                           search
+                   );
+               
+                   print("GOT %d results\n", (int) filtered_proposals.length()); 
+               
+                   if (filtered_proposals.length() < 2) {
+                       return null;
+                   }
+               
+                   filtered_proposals.sort((a, b) => {
+                           return ((string)(a.text)).collate((string)(b.text));
+                   });
+                   has_matches = true;
+                   return filtered_proposals;
+
+               }
+       
                public void populate (SourceCompletionContext context)
                {
-                       var buffer = context.completion.view.buffer;
-                       var  mark = buffer.get_insert ();
-                       TextIter end;
-
-                       buffer.get_iter_at_mark (out end, mark);
-                       var endpos = end;
-                       
-                       var searchpos = endpos;
-                       
-                       searchpos.backward_find_char(is_space, null);
-                       searchpos.forward_char();
-                       var search = endpos.get_text(searchpos);
-                       print("got search %s\n", search);
-                       
-                       if (search.length < 2) {
-                               return;
-                       }
-                       // now do our magic..
-                       var filtered_proposals = windowstate.file.palete().suggestComplete(
-                               this.windowstate.file,
-                               this.editor.node,
-                               this.editor.ptype,
-                               this.editor.key,
-                               search
-                       );
-                       
-                       
-
-                        
-                       //filtered_proposals.prepend (new SourceCompletionItem (search + "xx", search + "xx", null, "some info"));
-                       foreach(var i in this.proposals) {
-                               //if(i.text.contains(search)) // starts??
-                               //      this.filtered_proposals.prepend (new SourceCompletionItem (i.label, i.text, i.icon, i.info));
-                               //}
+                       bool has_matches = false;
+                       var filtered_proposals = this.fetchMatches(context, out has_matches);
+                       if (!has_matches) {
+                           context.add_proposals (this, null, true);
+                           return;
                        }
+                       // add proposals triggers a critical error in Gtk - try running gtksourceview/tests/test-completion.
+                       // see https://bugzilla.gnome.org/show_bug.cgi?id=758646
+                       var fe = GLib.Log.set_always_fatal(0); 
                        context.add_proposals (this, filtered_proposals, true);
+                       GLib.Log.set_always_fatal(fe);
                }
 
+
+
                public bool activate_proposal (SourceCompletionProposal proposal, TextIter iter)
                {
                        var istart = iter;
@@ -136,3 +162,4 @@ namespace Palete {
 
 
 } 
+