#include "ZCometBag.h"
#include "ZCometBag.c7"
#include <Glasses/ZSubTree.h>
#include <Glasses/ZQueen.h>
#include <Stones/ZComet.h>
#include <TFile.h>
ClassImp(ZCometBag);
void ZCometBag::_init()
{
  bSmartZNodes = true;
  mDepth = 1; bFollowLinks = true; bFollowLists = true;
  mKeyName = "ZComet";
}
void ZCometBag::on_insert(ZList::iterator it)
{
  PARENT_GLASS::on_insert(it);
  ZSubTree* st = dynamic_cast<ZSubTree*>(it.lens());
  if(!st) st = make_sub_tree_rep(it.lens());
}
ZSubTree* ZCometBag::make_sub_tree_rep(ZGlass* lens)
{
  ZSubTree* st = new ZSubTree(mDepth, bFollowLinks, bFollowLists,
			      GForm("ST of %s", lens->GetName()));
  mQueen->CheckIn(st);
  st->SetRoot(lens);
  return st;
}
void ZCometBag::ImportSubTree(ZGlass* lens)
{
  
  
  ZSubTree* st = make_sub_tree_rep(lens);
  Add(st);
}
ZComet* ZCometBag::MakeComet()
{
  ZComet* comet = new ZComet(GetName(), GForm("Comet[CometBag] of %s", GetName()));
  WriteLock();
  
  if(bSmartZNodes) comet->mIgnoredLinks.insert("ZNode::Parent");
  Stepper<ZSubTree> s(this);
  while(s.step()) {
    comet->AddTopLevel(s->GetRoot(), s->GetFollowLinks(), s->GetFollowLists(),
		       s->GetDepth());
  }
  WriteUnlock();
  return comet;
}
void ZCometBag::WriteComet()
{
  ZComet* c =  MakeComet();
  TFile f(mFile, "UPDATE");
  
  c->Write(mKeyName);
  f.Close();
}