resources/RooUsage.txt
[app.Builder.js] / src / Palete / CompletionProvider.vala
1  
2 using Gtk;
3
4 // not sure why - but extending Gtk.SourceCompletionProvider seems to give an error..
5 namespace Palete {
6
7     public class CompletionProvider : Object, SourceCompletionProvider
8     {
9                 Editor editor; 
10                 WindowState windowstate;
11                 //public List<Gtk.SourceCompletionItem> filtered_proposals;
12
13                 public CompletionProvider(Editor editor)
14                 {
15                     this.editor  = editor;
16                     this.windowstate = null; // not ready until the UI is built.
17                     
18                 }
19
20                 public string get_name ()
21                 {
22                   return  "roojsbuilder";
23                 }
24
25                 public int get_priority ()
26                 {
27                   return 200;
28                 }
29
30                 public bool match (SourceCompletionContext context)
31                 {
32                         bool has_matches = false;
33                         this.fetchMatches(context, out has_matches);
34                         return has_matches;
35                 }
36
37                 public List<SourceCompletionItem>? fetchMatches(SourceCompletionContext context, out bool has_matches)
38                 {
39                      has_matches = false;
40
41                     if (this.windowstate == null) {
42                             this.windowstate = this.editor.window.windowstate;
43                     }
44                 
45                 
46                     var buffer = context.completion.view.buffer;
47                     var  mark = buffer.get_insert ();
48                     TextIter end;
49
50                     buffer.get_iter_at_mark (out end, mark);
51                     var endpos = end;
52                 
53                     var searchpos = endpos;
54                 
55                     searchpos.backward_find_char(is_space, null);
56                     searchpos.forward_char();
57                     var search = endpos.get_text(searchpos);
58                     print("got search %s\n", search);
59                 
60                     if (search.length < 2) {
61                             return null;
62                     }
63                 
64                     // now do our magic..
65                     var filtered_proposals = this.windowstate.file.palete().suggestComplete(
66                             this.windowstate.file,
67                             this.editor.node,
68                             this.editor.ptype,
69                             this.editor.key,
70                             search
71                     );
72                 
73                     print("GOT %d results\n", (int) filtered_proposals.length()); 
74                 
75                     if (filtered_proposals.length() < 2) {
76                         return null;
77                     }
78                 
79                     filtered_proposals.sort((a, b) => {
80                             return ((string)(a.text)).collate((string)(b.text));
81                     });
82                     has_matches = true;
83                     return filtered_proposals;
84
85                 }
86         
87                 public void populate (SourceCompletionContext context)
88                 {
89                         bool has_matches = false;
90                         var filtered_proposals = this.fetchMatches(context, out has_matches);
91                         if (!has_matches) {
92                             context.add_proposals (this, null, true);
93                             return;
94                         }
95                         // add proposals triggers a critical error in Gtk - try running gtksourceview/tests/test-completion.
96                         // see https://bugzilla.gnome.org/show_bug.cgi?id=758646
97                         var fe = GLib.Log.set_always_fatal(0); 
98                         context.add_proposals (this, filtered_proposals, true);
99                         GLib.Log.set_always_fatal(fe);
100                 }
101
102
103
104                 public bool activate_proposal (SourceCompletionProposal proposal, TextIter iter)
105                 {
106                         var istart = iter;
107                         istart.backward_find_char(is_space, null);
108                         istart.forward_char();
109
110                 //    var search = iter.get_text(istart);           
111                 
112                         var buffer = iter.get_buffer();
113                         buffer.delete(ref istart, ref iter);
114                         buffer.insert(ref istart, proposal.get_text(), -1);
115                 
116                         return true;
117                 }
118
119                 public SourceCompletionActivation get_activation ()
120                 {
121                         //if(SettingsManager.Get_Setting("complete_auto") == "true"){
122                                 return SourceCompletionActivation.INTERACTIVE | SourceCompletionActivation.USER_REQUESTED;
123                         //} else {
124                         //      return Gtk.SourceCompletionActivation.USER_REQUESTED;
125                         //}
126                 }
127
128                 public int get_interactive_delay ()
129                 {
130                         return -1;
131                 }
132
133                 public bool get_start_iter (SourceCompletionContext context, SourceCompletionProposal proposal, out TextIter iter)
134                 {
135                         return false;
136                 }
137
138                 public void update_info (SourceCompletionProposal proposal, SourceCompletionInfo info)
139                 {
140
141                 }
142
143                 private bool is_space(unichar space){
144                         return space.isspace() || space.to_string() == "";
145                 }
146                 
147                 private bool is_forward_space(unichar space){
148                         return !(
149                                 space.to_string() == " "
150                                 ||
151                                 space.to_string() == ""
152                                 ||
153                                 space.to_string() == "\n"
154                                 ||
155                                 space.to_string() == ")"
156                                 ||
157                                 space.to_string() == "("
158                                 
159                         );
160                 }
161         }
162
163
164
165