21 using namespace ROOT::Experimental;
 
   22 namespace REX = ROOT::Experimental;
 
   25 REveDataProxyBuilderBase::Product::Product(std::string iViewType, 
const REveViewContext* c) : m_viewType(iViewType), m_viewContext(c), m_elements(0)
 
   27    m_elements = 
new REveCompound(
"ProxyProduct", 
"", 
false);
 
   28    m_elements->IncDenyDestroy();
 
   34 REveDataProxyBuilderBase::REveDataProxyBuilderBase(
const std::string &type):
 
   36    m_collection(nullptr),
 
   42 REveDataProxyBuilderBase::Product::~Product()
 
   45    for (
auto i : m_elements->RefProjecteds())
 
   47       REveElement *projected = i->GetProjectedAsElement();
 
   48       projected->GetMother()->RemoveElement(projected);
 
   55    if (m_elements->HasMother())
 
   57       m_elements->GetMother()->RemoveElement(m_elements);
 
   60    m_elements->Annihilate();
 
   65 void REveDataProxyBuilderBase::SetCollection(REveDataCollection* c)
 
   84 void REveDataProxyBuilderBase::Build()
 
   91          auto itemSize = m_collection->GetNItems(); 
 
   94          for (
auto &pp: m_products)
 
   97             REveElement* elms = pp->m_elements;
 
   98             auto oldSize = elms->NumChildren();
 
  100             if (HaveSingleProduct())
 
  102                Build(m_collection, elms, pp->m_viewContext);
 
  106                BuildViewType(m_collection, elms, pp->m_viewType, pp->m_viewContext);
 
  112             REveProjectable* pable = 
dynamic_cast<REveProjectable*
>(elms);
 
  113             if (pable->HasProjecteds())
 
  116                for (
auto &prj: pable->RefProjecteds())
 
  118                   REveProjectionManager *pmgr = prj->GetManager();
 
  119                   Float_t oldDepth = pmgr->GetCurrentDepth();
 
  120                   pmgr->SetCurrentDepth(m_layer);
 
  123                   REveElement *projectedAsElement = prj->GetProjectedAsElement();
 
  124                   auto parentIt = projectedAsElement->RefChildren().begin();
 
  125                   for (
auto &prod: elms->RefChildren())
 
  139                         pmgr->SubImportChildren(prod, *parentIt);
 
  143                      else if (cnt < itemSize)
 
  146                         pmgr->SubImportElements(prod, projectedAsElement);
 
  154                   pmgr->SetCurrentDepth(oldDepth);
 
  171       catch (
const std::runtime_error& iException)
 
  173          std::cout << 
"Caught exception in build function for item " << m_collection->GetCName() << 
":\n" 
  174                               << iException.what() << std::endl;
 
  183 REveDataProxyBuilderBase::Build(
const REveDataCollection*, REveElement*, 
const REveViewContext*)
 
  185    assert(
"virtual Build(const REveEventItem*, REveElement*, const REveViewContext*) not implemented by inherited class");
 
  190 REveDataProxyBuilderBase::BuildViewType(
const REveDataCollection*, REveElement*, std::string, 
const REveViewContext*)
 
  192    assert(
"virtual BuildViewType(const FWEventItem*, TEveElementList*, FWViewType::EType, const FWViewContext*) not implemented by inherited class");
 
  198 REveDataProxyBuilderBase::CreateProduct( std::string viewType, 
const REveViewContext* viewContext)
 
  200    if ( m_products.empty() == 
false)
 
  202       if (HaveSingleProduct()) {
 
  203          return m_products.back()->m_elements;
 
  207          for (
auto &prod: m_products)
 
  209             if (viewType == prod->m_viewType)
 
  210                return prod->m_elements;
 
  215    auto product = 
new Product(viewType, viewContext);
 
  216    m_products.push_back(product);
 
  221       product->m_elements->SetName(Form(
"product %s", m_collection->GetCName()));
 
  223    return product->m_elements;
 
  230    void applyColorAttrToChildren(REveElement* p) {
 
  231       for (
auto &it: p->RefChildren())
 
  234          if (c->GetMainColor() != p->GetMainColor())
 
  236             c->SetMainColor(p->GetMainColor());
 
  239          applyColorAttrToChildren(c);
 
  245 REveDataProxyBuilderBase::ModelChanges(
const REveDataCollection::Ids_t& iIds, Product* p)
 
  247    printf(
"REveDataProxyBuilderBase::ModelChanges  %s \n",  m_collection->GetCName());
 
  248    REveElement* elms = p->m_elements;
 
  249    assert(m_collection && static_cast<int>(m_collection->GetNItems()) <= elms->NumChildren() && 
"can not use default modelChanges implementation");
 
  251    for (
auto itemIdx: iIds)
 
  253       REveDataItem *item = m_collection->GetDataItem(itemIdx);
 
  257       auto itElement = elms->RefChildren().begin();
 
  258       std::advance(itElement, itemIdx);
 
  259       REveElement* comp = *itElement;
 
  260       bool visible = (!item->GetFiltered()) && item->GetRnrSelf();
 
  261       comp->SetRnrSelf(visible);
 
  262       comp->SetRnrChildren(visible);
 
  264       if (item->GetMainColor() != comp->GetMainColor()) comp->SetMainColor(item->GetMainColor());
 
  265       applyColorAttrToChildren(comp);
 
  267       if (VisibilityModelChanges(itemIdx, comp, p->m_viewContext))
 
  269          elms->ProjectChild(comp);
 
  270          printf(
"---REveDataProxyBuilderBase project child\n");
 
  274          LocalModelChanges(itemIdx, comp, p->m_viewContext);
 
  280 REveDataProxyBuilderBase::LocalModelChanges(
int, REveElement*, 
const REveViewContext*)
 
  289 REveDataProxyBuilderBase::ModelChanges(
const REveDataCollection::Ids_t& iIds)
 
  292      for (
auto &prod: m_products)
 
  294        ModelChanges(iIds, prod);
 
  296     m_modelsChanged = 
false;
 
  298     m_modelsChanged = 
true;
 
  304 REveDataProxyBuilderBase::CollectionChanged(
const REveDataCollection* )
 
  314 REveDataProxyBuilderBase::SetupAddElement(REveElement* el, REveElement* parent, 
bool color)
 const 
  316    SetupElement(el, color);
 
  318    el->SetName(parent->GetName());
 
  319    parent->AddElement(el);
 
  326 REveDataProxyBuilderBase::SetupElement(REveElement* el, 
bool color)
 const 
  328    el->CSCTakeMotherAsMaster();
 
  329    el->SetPickable(
true);
 
  333       el->CSCApplyMainColorToMatchingChildren();
 
  334       el->CSCApplyMainTransparencyToMatchingChildren();
 
  335       el->SetMainColor(m_collection->GetMainColor());
 
  336       el->SetMainTransparency(m_collection->GetMainTransparency());
 
  343 REveDataProxyBuilderBase::CreateCompound(
bool set_color, 
bool propagate_color_to_all_children)
 const 
  345    REveCompound *c = 
new REveCompound();
 
  346    c->CSCImplySelectAllChildren();
 
  347    c->SetPickable(
true);
 
  350       c->SetMainColor(m_collection->GetMainColor());
 
  351       c->SetMainTransparency(m_collection->GetMainTransparency());
 
  353    if (propagate_color_to_all_children)
 
  355       c->CSCApplyMainColorToAllChildren();
 
  356       c->CSCApplyMainTransparencyToAllChildren();
 
  360       c->CSCApplyMainColorToMatchingChildren();
 
  361       c->CSCApplyMainTransparencyToMatchingChildren();
 
  368 void REveDataProxyBuilderBase::Clean()
 
  371    for (
auto &prod: m_products)
 
  373       if (prod->m_elements)
 
  374          prod->m_elements->DestroyElements();
 
  380 void REveDataProxyBuilderBase::CleanLocal()
 
  385 void REveDataProxyBuilderBase::CollectionBeingDestroyed(
const REveDataCollection* )
 
  387    m_collection = 
nullptr;
 
  391    for (
auto &prod: m_products)
 
  401 bool REveDataProxyBuilderBase::VisibilityModelChanges(
int, REveElement *, 
const REveViewContext *)
 
  406 void REveDataProxyBuilderBase::SetHaveAWindow(
bool iHaveAWindow)
 
  408    m_haveWindow = iHaveAWindow;