43using namespace std::string_literals;
 
   77   std::string 
GetUrl()
 override { 
return ""s; }
 
   79   void Show(
const std::string &)
 override {}
 
   81   bool DrawElement(std::shared_ptr<Browsable::RElement> &
elem, 
const std::string & = 
"")
 override 
   84         auto code = 
elem->GetContent(
"text");
 
   91            auto json = 
elem->GetContent(
"json");
 
  106         auto img = 
elem->GetContent(
"image64");
 
 
 
  155   std::string 
GetKind()
 const override { 
return "info"s; }
 
  157   std::string 
GetUrl()
 override { 
return ""s; }
 
  159   void Show(
const std::string &)
 override {}
 
  161   bool DrawElement(std::shared_ptr<Browsable::RElement> &, 
const std::string & = 
"")
 override { 
return false; }
 
  171      std::ofstream ofs(
pathtmp.str(), std::ofstream::out | std::ofstream::app);
 
  176      gROOT->ProcessLine(
".g");
 
 
 
  241   void Show(
const std::string &)
 override {}
 
  243   std::string 
GetKind()
 const override { 
return "catched"s; }
 
 
  275   if (
gROOT->IsWebDisplayBatch()) {
 
  276      ::Warning(
"RBrowser::RBrowser", 
"The RBrowser cannot run in web batch mode");
 
  288   fTimer = std::make_unique<RBrowserTimer>(10, 
kTRUE, *
this);
 
  291   fWebWindow->SetDefaultPage(
"file:rootui5sys/browser/browser.html");
 
  295                            [
this](
unsigned connid, 
const std::string &arg) { 
ProcessMsg(connid, arg); });
 
 
  343      fWebWindow->GetManager()->SetShowCallback(
nullptr);
 
 
  351   std::unique_ptr<RBrowserRequest> request;
 
  354      request = std::make_unique<RBrowserRequest>();
 
  356      request->number = 100;
 
  358      request = TBufferJSON::FromJSON<RBrowserRequest>(
msg);
 
 
  375   if (
fname.empty()) 
return;
 
 
  388      exec.
Form(
"TPython::ExecScript(\"%s\");", 
file_path.c_str());
 
 
  402   std::string opt = args.back();
 
  406   path.insert(path.end(), args.begin(), args.end());
 
  411   if (!
elem) 
return ""s;
 
  443      elem->GetChildsIter();
 
  448      SendProgress(connid, progress);
 
  454      return widget->SendWidgetContent();
 
  459         [path](
const std::shared_ptr<RBrowserWidget> &
wg) { return path == wg->GetPath(); });
 
  462      return "SELECT_WIDGET:"s + (*iter)->GetName();
 
 
  545   std::shared_ptr<RBrowserWidget> 
widget;
 
  547   if (kind == 
"editor"s)
 
  548      widget = std::make_shared<RBrowserEditorWidget>(
name, 
true);
 
  549   else if (kind == 
"image"s)
 
  550      widget = std::make_shared<RBrowserEditorWidget>(
name, 
false);
 
  551   else if (kind == 
"info"s)
 
  552      widget = std::make_shared<RBrowserInfoWidget>(
name);
 
 
  575   if (!
win || kind.empty()) 
return nullptr;
 
  579   auto widget = std::make_shared<RBrowserCatchedWidget>(
name, 
win, kind);
 
 
  605         [
name, kind](
const std::shared_ptr<RBrowserWidget> &
widget) {
 
  606           return kind.empty() ? name == widget->GetName() : kind == widget->GetKind();
 
 
  620   auto iter = std::find_if(
fWidgets.begin(), 
fWidgets.end(), [
name](std::shared_ptr<RBrowserWidget> &
widget) { return name == widget->GetName(); });
 
 
  633   std::vector<std::string> 
arr;
 
  636   path += 
"/.root_hist" ;
 
  637   std::ifstream 
infile(path);
 
 
  656   std::vector<std::string> 
arr;
 
 
  674   std::vector<std::vector<std::string>> 
reply;
 
  684      reply.emplace_back(std::vector<std::string>({ 
"active"s, fActiveWidgetName }));
 
  693   if (
logs.size() > 0) {
 
  698   reply.emplace_back(std::vector<std::string>({
 
  705   std::string 
msg = 
"INMSG:";
 
 
  773   unsigned connid = std::stoul(
arr.back()); 
arr.pop_back();
 
  774   std::string kind = 
arr.back(); 
arr.pop_back();
 
  776   if (kind == 
"DBLCLK") {
 
 
  793   std::string kind, 
msg;
 
  794   auto pos = 
arg0.find(
":");
 
  795   if (pos == std::string::npos) {
 
  798      kind = 
arg0.substr(0, pos);
 
  802   if (kind == 
"QUIT_ROOT") {
 
  806   } 
else if (kind == 
"BRREQ") {
 
  811   } 
else if (kind == 
"DBLCLK") {
 
  813      auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(
msg);
 
  814      if (
arr && (
arr->size() > 2)) {
 
  815         arr->push_back(kind);
 
  816         arr->push_back(std::to_string(connid));
 
  824   } 
else if (kind == 
"WIDGET_SELECTED") {
 
  831   } 
else if (kind == 
"CLOSE_TAB") {
 
  833   } 
else if (kind == 
"GETWORKPATH") {
 
  835   } 
else if (kind == 
"CHPATH") {
 
  836      auto path = TBufferJSON::FromJSON<Browsable::RElementPath_t>(
msg);
 
  839   } 
else if (kind == 
"CMD") {
 
  840      std::string 
sPrompt = 
"root []";
 
  842      if (
app->InheritsFrom(
"TRint")) {
 
  856         auto widget = std::dynamic_pointer_cast<RBrowserInfoWidget>(
FindWidget(
""s, 
"info"s));
 
  871   } 
else if (kind == 
"GETHISTORY") {
 
  876   } 
else if (kind == 
"GETLOGS") {
 
  885   } 
else if (kind == 
"SYNCEDITOR") {
 
  886      auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(
msg);
 
  887      if (
arr && (
arr->size() > 4)) {
 
  890            editor->fFirstSend = 
true;
 
  894            if ((
arr->size() == 6) && (
arr->at(5) == 
"SAVE"))
 
  896            if ((
arr->size() == 6) && (
arr->at(5) == 
"RUN")) {
 
  903   } 
else if (kind == 
"GETINFO") {
 
  909   } 
else if (kind == 
"NEWWIDGET") {
 
  913   } 
else if (kind == 
"CDWORKDIR") {
 
  921   } 
else if (kind == 
"OPTIONS") {
 
  922      auto arr = TBufferJSON::FromJSON<std::vector<std::string>>(
msg);
 
  923      if (
arr && (
arr->size() == 3)) {
 
 
  956      if (
widget->GetTitle() != title)
 
  959      if (!kind.empty() && (
widget->GetKind() != kind))
 
 
#define R__LOG_ERROR(...)
 
#define R__LOG_DEBUG(DEBUGLEVEL,...)
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
 
winID h TVirtualViewer3D TVirtualGLPainter p
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t win
 
Option_t Option_t TPoint TPoint const char mode
 
R__EXTERN TSystem * gSystem
 
static int ExtractItemIndex(std::string &name)
Extract index from name Index coded by client with ###<indx>$$$ suffix Such coding used by browser to...
 
@ kActImage
can be shown in image viewer, can provide image
 
@ kActDraw6
can be drawn inside ROOT6 canvas
 
@ kActCanvas
indicate that it is canvas and should be drawn directly
 
@ kActTree
can be shown in tree viewer
 
@ kActGeom
can be shown in geometry viewer
 
@ kActBrowse
just browse (expand) item
 
@ kActEdit
can provide data for text editor
 
@ kActDraw7
can be drawn inside ROOT7 canvas
 
static std::string GetPathAsString(const RElementPath_t &path)
Converts element path back to string.
 
static RElementPath_t ParsePath(const std::string &str)
Parse string path to produce RElementPath_t One should avoid to use string pathes as much as possible...
 
static bool SetClassDrawOption(const ClassArg &, const std::string &)
Set draw option for the class Return true if entry for the class exists.
 
static std::string GetClassDrawOption(const ClassArg &)
Return configured draw option for the class.
 
static RElementPath_t GetWorkingPath(const std::string &workdir="")
Return working path in browser hierarchy.
 
std::shared_ptr< Browsable::RElement > GetSubElement(const Browsable::RElementPath_t &path)
Returns sub-element starting from top, using cached data.
 
void ClearCache()
Clear internal objects cache.
 
std::string ProcessRequest(const RBrowserRequest &request)
Process browser request, returns string with JSON of RBrowserReply data.
 
void SetWorkingPath(const Browsable::RElementPath_t &path)
set working directory relative to top element
 
const Browsable::RElementPath_t & GetWorkingPath() const
 
void CreateDefaultElements()
Create default elements shown in the RBrowser.
 
RBrowserTimer(Long_t milliSec, Bool_t mode, RBrowser &br)
!< browser processing postponed requests
 
void Timeout() override
timeout handler used to process postponed requests in main ROOT thread
 
Web-based ROOT files and objects browser.
 
std::unique_ptr< RBrowserTimer > fTimer
! timer to handle postponed requests
 
RBrowserData fBrowsable
! central browsing element
 
std::shared_ptr< RBrowserWidget > AddWidget(const std::string &kind)
Creates new widget.
 
std::vector< std::string > GetRootHistory()
Get content of history file.
 
void AddInitWidget(const std::string &kind)
Create new widget and send init message to the client.
 
std::vector< std::vector< std::string > > fPostponed
! postponed messages, handled in timer
 
std::shared_ptr< RWebWindow > fWebWindow
! web window to browser
 
int fWidgetCnt
! counter for created widgets
 
std::shared_ptr< RBrowserWidget > GetActiveWidget() const
 
std::string ProcessDblClick(unsigned connid, std::vector< std::string > &args)
Process dbl click on browser item.
 
void ClearOnClose(const std::shared_ptr< void > &handle)
Set handle which will be cleared when connection is closed.
 
std::string fActiveWidgetName
! name of active widget
 
RBrowser(bool use_rcanvas=false)
constructor
 
void SetWorkingPath(const std::string &path)
Set working path in the browser.
 
std::string NewWidgetMsg(std::shared_ptr< RBrowserWidget > &widget)
Create message which send to client to create new widget.
 
bool fCatchWindowShow
! if arbitrary RWebWindow::Show calls should be catched by browser
 
std::string fPromptFileOutput
! file name for prompt output
 
void Show(const RWebDisplayArgs &args="", bool always_start_new_browser=false)
show Browser in specified place
 
std::string GetCurrentWorkingDirectory()
Return the current directory of ROOT.
 
void SetUseRCanvas(bool on=true)
 
std::shared_ptr< RBrowserWidget > FindWidget(const std::string &name, const std::string &kind="") const
Find widget by name or kind.
 
std::shared_ptr< RBrowserWidget > AddCatchedWidget(RWebWindow *win, const std::string &kind)
Add widget catched from external scripts.
 
bool GetUseRCanvas() const
 
std::vector< std::shared_ptr< RBrowserWidget > > fWidgets
! all browser widgets
 
virtual ~RBrowser()
destructor
 
void ProcessSaveFile(const std::string &fname, const std::string &content)
Process file save command in the editor.
 
void CheckWidgtesModified()
Check if any widget was modified and update if necessary.
 
float fLastProgressSend
! last value of send progress
 
std::string GetWindowUrl(bool remote)
Return URL parameter for the window showing ROOT Browser See ROOT::RWebWindow::GetUrl docu for more d...
 
std::string ProcessBrowserRequest(const std::string &msg)
Process browser request.
 
std::vector< std::string > GetRootLogs()
Get content of log file.
 
void ProcessMsg(unsigned connid, const std::string &arg)
Process received message from the client.
 
void CloseTab(const std::string &name)
Close and delete specified widget.
 
void ProcessPostponedRequests()
Process postponed requests - decouple from websocket handling Only requests which can take longer tim...
 
unsigned fConnId
! default connection id
 
bool ActivateWidget(const std::string &title, const std::string &kind="")
Activate widget in RBrowser One should specify title and (optionally) kind of widget like "tcanvas" o...
 
void SendInitMsg(unsigned connid)
Process client connect.
 
void SendProgress(unsigned connid, float progr)
Send generic progress message to the web window Should show progress bar on client side.
 
long long fLastProgressSendTm
! time when last progress message was send
 
void ProcessRunMacro(const std::string &file_path)
Process run macro command in the editor.
 
static bool IsMessageToStartDialog(const std::string &msg)
Check if this could be the message send by client to start new file dialog If returns true,...
 
static std::shared_ptr< RFileDialog > Embed(const std::shared_ptr< RWebWindow > &window, unsigned connid, const std::string &args)
Create dialog instance to use as embedded dialog inside other widget Embedded dialog started on the c...
 
const_iterator begin() const
 
const_iterator end() const
 
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
 
const std::string & GetWidgetKind() const
returns widget kind
 
Represents web window, which can be shown in web browser or any other supported environment.
 
std::string GetUrl(bool remote=true)
Return URL string to connect web window URL typically includes extra parameters required for connecti...
 
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
 
This class creates the ROOT Application Environment that interfaces to the windowing system eventloop...
 
static TString ToJSON(const T *obj, Int_t compact=0, const char *member_name=nullptr)
 
@ kNoSpaces
no new lines plus remove all spaces around "," and ":" symbols
 
const char * Data() const
 
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
 
virtual Int_t RedirectOutput(const char *name, const char *mode="a", RedirectHandle_t *h=nullptr)
Redirect standard output (stdout, stderr) to the specified file.
 
virtual int GetPid()
Get process id.
 
virtual TTime Now()
Get current time in milliseconds since 0:00 Jan 1 1995.
 
virtual const char * UnixPathName(const char *unixpathname)
Convert from a local pathname to a Unix pathname.
 
virtual const char * HomeDirectory(const char *userName=nullptr)
Return the user's home directory.
 
virtual int Unlink(const char *name)
Unlink, i.e.
 
virtual const char * TempDirectory() const
Return a user configured or systemwide directory to create temporary files in.
 
Handles synchronous and a-synchronous timer events.
 
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
 
ROOT::Experimental::RLogChannel & BrowserLog()
Log channel for Browser diagnostics.