Fix #8049 - language server hover and editor hover (not supported for gtkview / rooview)
[roobuilder] / src / Palete / HoverProvider.vala
index 5799f4e..1dd08c6 100644 (file)
@@ -3,6 +3,15 @@
 namespace Palete {
        public class HoverProvider : Object, GtkSource.HoverProvider
        {
+               public JsRender.JsRender file {
+                       get { return this.editor.file; }
+                       private set {}
+               }
+               Editor editor;
+               public HoverProvider(Editor editor) 
+               {
+                       this.editor = editor;
+               }
                
                public async bool populate_async ( GtkSource.HoverContext context, GtkSource.HoverDisplay display, Cancellable? cancellable) throws Error 
                {
@@ -13,12 +22,28 @@ namespace Palete {
                        if (!context.get_bounds(out begin, out end)) {
                                return false;
                        }
-                       context.get_iter(out pos);
-                       
-                       GLib.debug("populate hover async Word: %s || %s" ,begin.get_text(pos) ,  pos.get_text(end)    );
-                       display.append(new global::Gtk.Label("test"));
-                       return true;
+                       var line = end.get_line();
+                       var offset =  end.get_line_offset();
+                       if (this.editor.prop != null) {
+                       //      tried line -1 (does not work)
+                               GLib.debug("node pad = '%s' %d", this.editor.node.node_pad, this.editor.node.node_pad.length);
+                               
+                               line += this.editor.prop.start_line ; 
+                               // this is based on Gtk using tabs (hence 1/2 chars);
+                               offset += this.editor.node.node_pad.length;
+                               // javascript listeners are indented 2 more spaces.
+                               if (this.editor.prop.ptype == JsRender.NodePropType.LISTENER) {
+                                       offset += 2;
+                               }
+                       } 
+                       var res = yield this.file.getLanguageServer().hover(this.file, line, offset);
+                       
+                       if ( res != null && res.contents.size > 0) {
+                               var str = res.contents.get(0).value;
+                               display.append(new global::Gtk.Label(str));
+                               return true;
+                       } 
+                       return false;
                }
                public bool populate (GtkSource.HoverContext context, GtkSource.HoverDisplay display) throws Error
                {