From 4ddd069c95f38d7e90a5b9b0682bbb95d6b63978 Mon Sep 17 00:00:00 2001
From: Sergey Linev <S.Linev@gsi.de>
Date: Wed, 22 Jul 2015 16:25:19 +0200
Subject: [PATCH] http: let read tree from file when using treeplayer in
 browser

Signed-off-by: Bertrand Bellenot <bertrand.bellenot@cern.ch>
---
 etc/http/scripts/JSRootCore.js           |  2 +-
 etc/http/scripts/JSRootPainter.jquery.js | 32 +++++++++++++++++-------
 net/http/src/TRootSniffer.cxx            | 11 ++++++++
 3 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/etc/http/scripts/JSRootCore.js b/etc/http/scripts/JSRootCore.js
index 2c52ba60166..a7dccf3d26c 100644
--- a/etc/http/scripts/JSRootCore.js
+++ b/etc/http/scripts/JSRootCore.js
@@ -74,7 +74,7 @@
    }
 } (function(JSROOT) {
 
-   JSROOT.version = "3.7 22/07/2015";
+   JSROOT.version = "3.7.1 22/07/2015";
 
    JSROOT.source_dir = "";
    JSROOT.source_min = false;
diff --git a/etc/http/scripts/JSRootPainter.jquery.js b/etc/http/scripts/JSRootPainter.jquery.js
index 59627ce9514..2fff6ca67df 100644
--- a/etc/http/scripts/JSRootPainter.jquery.js
+++ b/etc/http/scripts/JSRootPainter.jquery.js
@@ -168,6 +168,8 @@
          }
       }
 
+      if ('_player' in hitem) can_click = true;
+
       if (img2.length==0) img2 = img1;
       if (img1.length==0) img1 = has_childs ? "img_folder" : "img_page";
       if (img2.length==0) img2 = has_childs ? "img_folderopen" : "img_page";
@@ -752,11 +754,12 @@
 
    // ========== performs tree drawing on server ==================
 
-   JSROOT.TTreePlayer = function(itemname, url) {
+   JSROOT.TTreePlayer = function(itemname, url, askey) {
       JSROOT.TBasePainter.call(this);
       this.SetItemName(itemname);
       this.url = url;
       this.hist_painter = null;
+      this.askey = askey;
       return this;
    }
 
@@ -838,12 +841,18 @@
       url += '&_ret_object_=' + hname;
 
       var player = this;
-
-      JSROOT.NewHttpRequest(url, 'object', function(res) {
-         if (res==null) return;
-         $("#"+player.drawid).empty();
-         player.hist_painter = JSROOT.draw(player.drawid, res)
-      }).send();
+      function SubmitDrawRequest() {
+         JSROOT.NewHttpRequest(url, 'object', function(res) {
+            if (res==null) return;
+            $("#"+player.drawid).empty();
+            player.hist_painter = JSROOT.draw(player.drawid, res)
+         }).send();
+      }
+      if (this.askey) {
+         // first let read tree from the file
+         this.askey = false;
+         JSROOT.NewHttpRequest(this.url + "/root.json", 'text', SubmitDrawRequest).send();
+      } else SubmitDrawRequest();
    }
 
    JSROOT.TTreePlayer.prototype.CheckResize = function(force) {
@@ -857,7 +866,7 @@
       }
    }
 
-   JSROOT.drawTreePlayer = function(hpainter, itemname) {
+   JSROOT.drawTreePlayer = function(hpainter, itemname, askey) {
 
       var url = hpainter.GetOnlineItemUrl(itemname);
       if (url == null) return null;
@@ -870,11 +879,16 @@
 
       var divid = d3.select(frame).attr('id');
 
-      var player = new JSROOT.TTreePlayer(itemname, url);
+      var player = new JSROOT.TTreePlayer(itemname, url, askey);
       player.Show(divid);
       return player;
    }
 
+   JSROOT.drawTreePlayerKey = function(hpainter, itemname) {
+      // function used when tree is not yet loaded on the server
+      return JSROOT.drawTreePlayer(hpainter, itemname, true);
+   }
+
    // =======================================================================
 
    JSROOT.Painter.separ = null;
diff --git a/net/http/src/TRootSniffer.cxx b/net/http/src/TRootSniffer.cxx
index 0450669cffb..881519ebbbb 100644
--- a/net/http/src/TRootSniffer.cxx
+++ b/net/http/src/TRootSniffer.cxx
@@ -845,6 +845,17 @@ void TRootSniffer::ScanCollection(TRootSnifferScanRec &rec, TCollection *lst,
                   }
                } else {
                   obj_class = TClass::GetClass(key->GetClassName());
+                  if (obj_class && obj_class->InheritsFrom(TTree::Class())) {
+                     if (rec.CanExpandItem()) {
+                        // it is requested to expand tree element - read it
+                        obj = key->ReadObj();
+                        if (obj) obj_class = obj->IsA();
+                     } else {
+                        rec.SetField("_player", "JSROOT.drawTreePlayerKey");
+                        rec.SetField("_prereq", "jq2d");
+                        // rec.SetField("_more", "true"); // one could allow to extend
+                     }
+                  }
                }
             }
 
-- 
GitLab