// @(#)root/gpad:$Name:  $:$Id: TPaveClass.cxx,v 1.6 2002/10/31 07:27:34 brun Exp $
// Author: Rene Brun   06/08/99
/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "Riostream.h"
#include "TROOT.h"
#include "Buttons.h"
#include "TPaveClass.h"

ClassImp(TPaveClass)

//______________________________________________________________________________
//  A PaveClass is a TPaveLabel  specialized to process classes
//  inside a TClassTree.
//   A TPaveClass object is used by the TClassTree to represent a class.
//   A TPaveClass has the same graphical representation as a TPaveLabel.
//   Using the context menu on can select additional options in the ClassTree:
//     - Show classes using this class
//     - Show all classes used by this class

//______________________________________________________________________________
TPaveClass::TPaveClass(): TPaveLabel()
{
//*-*-*-*-*-*-*-*-*-*-*PaveClass default constructor*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  ===========================

   fClassTree  = 0;
}

//______________________________________________________________________________
TPaveClass::TPaveClass(Double_t x1, Double_t y1,Double_t x2, Double_t  y2, const char *label, TClassTree *classtree)
           :TPaveLabel(x1,y1,x2,y2,label,"br")
{
//*-*-*-*-*-*-*-*-*-*-*PaveClass normal constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  ==========================

   fClassTree  = classtree;
   SetName(label);
   SetTextFont(61);
}

//______________________________________________________________________________
TPaveClass::~TPaveClass()
{
//*-*-*-*-*-*-*-*-*-*-*PaveClass default destructor*-*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  ============================

}

//______________________________________________________________________________
TPaveClass::TPaveClass(const TPaveClass &PaveClass) : TPaveLabel(PaveClass)
{
   ((TPaveClass&)PaveClass).Copy(*this);
}

//______________________________________________________________________________
void TPaveClass::Copy(TObject &obj) const
{
//*-*-*-*-*-*-*-*-*-*-*Copy this PaveClass to PaveClass*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  ================================

   TPaveLabel::Copy(obj);
   ((TPaveClass&)obj).fClassTree      = fClassTree;
}

//______________________________________________________________________________
void TPaveClass::DrawClasses(const char *classes)
{

   if (!fClassTree) return;
   if (!strcmp(classes,"this")) fClassTree->Draw(GetName());
   else                         fClassTree->Draw(classes);
}

//______________________________________________________________________________
void TPaveClass::SaveAs(const char *filename)
{

   if (!fClassTree) return;
   fClassTree->SaveAs(filename);
}

//______________________________________________________________________________
void TPaveClass::SetClasses(const char *classes, Option_t *option)
{

   if (!fClassTree) return;
   if (!strcmp(classes,"this")) fClassTree->SetClasses(GetName(),option);
   else                         fClassTree->SetClasses(classes,option);
}

//______________________________________________________________________________
void TPaveClass::ShowLinks(Option_t *option)
{
// Set link options in the ClassTree object
//   "C"  show References from code
//   "H"  show "Has a" relations
//   "M"  show Multiple Inheritance
//   "R"  show References from data members

   if (!fClassTree) return;
   fClassTree->ShowLinks(option);
}

//______________________________________________________________________________
void TPaveClass::ShowClassesUsedBy(const char *classes)
{

   if (!fClassTree) return;
   if (!strcmp(classes,"this")) fClassTree->ShowClassesUsedBy(GetName());
   else                         fClassTree->ShowClassesUsedBy(classes);
}

//______________________________________________________________________________
void TPaveClass::ShowClassesUsing(const char *classes)
{

   if (!fClassTree) return;
   if (!strcmp(classes,"this")) fClassTree->ShowClassesUsing(GetName());
   else                         fClassTree->ShowClassesUsing(classes);
}

//______________________________________________________________________________
void TPaveClass::SavePrimitive(ofstream &out, Option_t *)
{
    // Save primitive as a C++ statement(s) on output stream out

   char quote = '"';
   out<<"   "<<endl;
   if (gROOT->ClassSaved(TPaveClass::Class())) {
       out<<"   ";
   } else {
       out<<"   TPaveClass *";
   }
   out<<"pclass = new TPaveClass("<<fX1<<","<<fY1<<","<<fX2<<","<<fY2
      <<","<<quote<<fLabel<<quote<<","<<quote<<fOption<<quote<<");"<<endl;

   SaveFillAttributes(out,"pclass",0,1001);
   SaveLineAttributes(out,"pclass",1,1,1);
   SaveTextAttributes(out,"pclass",22,0,1,62,0);

   out<<"   pclass->Draw();"<<endl;
}
