// @(#)root/gpad:$Id$
// 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)
{
   // PaveClass copy constructor.

   ((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)
{
   // Draw classes.

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


//______________________________________________________________________________
void TPaveClass::SaveAs(const char *filename, Option_t *option) const
{
   // Save as.

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


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

   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)
{
   // Show classes used by.

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


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

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


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

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

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

   out<<"   pclass->Draw();"<<std::endl;
}
 TPaveClass.cxx:1
 TPaveClass.cxx:2
 TPaveClass.cxx:3
 TPaveClass.cxx:4
 TPaveClass.cxx:5
 TPaveClass.cxx:6
 TPaveClass.cxx:7
 TPaveClass.cxx:8
 TPaveClass.cxx:9
 TPaveClass.cxx:10
 TPaveClass.cxx:11
 TPaveClass.cxx:12
 TPaveClass.cxx:13
 TPaveClass.cxx:14
 TPaveClass.cxx:15
 TPaveClass.cxx:16
 TPaveClass.cxx:17
 TPaveClass.cxx:18
 TPaveClass.cxx:19
 TPaveClass.cxx:20
 TPaveClass.cxx:21
 TPaveClass.cxx:22
 TPaveClass.cxx:23
 TPaveClass.cxx:24
 TPaveClass.cxx:25
 TPaveClass.cxx:26
 TPaveClass.cxx:27
 TPaveClass.cxx:28
 TPaveClass.cxx:29
 TPaveClass.cxx:30
 TPaveClass.cxx:31
 TPaveClass.cxx:32
 TPaveClass.cxx:33
 TPaveClass.cxx:34
 TPaveClass.cxx:35
 TPaveClass.cxx:36
 TPaveClass.cxx:37
 TPaveClass.cxx:38
 TPaveClass.cxx:39
 TPaveClass.cxx:40
 TPaveClass.cxx:41
 TPaveClass.cxx:42
 TPaveClass.cxx:43
 TPaveClass.cxx:44
 TPaveClass.cxx:45
 TPaveClass.cxx:46
 TPaveClass.cxx:47
 TPaveClass.cxx:48
 TPaveClass.cxx:49
 TPaveClass.cxx:50
 TPaveClass.cxx:51
 TPaveClass.cxx:52
 TPaveClass.cxx:53
 TPaveClass.cxx:54
 TPaveClass.cxx:55
 TPaveClass.cxx:56
 TPaveClass.cxx:57
 TPaveClass.cxx:58
 TPaveClass.cxx:59
 TPaveClass.cxx:60
 TPaveClass.cxx:61
 TPaveClass.cxx:62
 TPaveClass.cxx:63
 TPaveClass.cxx:64
 TPaveClass.cxx:65
 TPaveClass.cxx:66
 TPaveClass.cxx:67
 TPaveClass.cxx:68
 TPaveClass.cxx:69
 TPaveClass.cxx:70
 TPaveClass.cxx:71
 TPaveClass.cxx:72
 TPaveClass.cxx:73
 TPaveClass.cxx:74
 TPaveClass.cxx:75
 TPaveClass.cxx:76
 TPaveClass.cxx:77
 TPaveClass.cxx:78
 TPaveClass.cxx:79
 TPaveClass.cxx:80
 TPaveClass.cxx:81
 TPaveClass.cxx:82
 TPaveClass.cxx:83
 TPaveClass.cxx:84
 TPaveClass.cxx:85
 TPaveClass.cxx:86
 TPaveClass.cxx:87
 TPaveClass.cxx:88
 TPaveClass.cxx:89
 TPaveClass.cxx:90
 TPaveClass.cxx:91
 TPaveClass.cxx:92
 TPaveClass.cxx:93
 TPaveClass.cxx:94
 TPaveClass.cxx:95
 TPaveClass.cxx:96
 TPaveClass.cxx:97
 TPaveClass.cxx:98
 TPaveClass.cxx:99
 TPaveClass.cxx:100
 TPaveClass.cxx:101
 TPaveClass.cxx:102
 TPaveClass.cxx:103
 TPaveClass.cxx:104
 TPaveClass.cxx:105
 TPaveClass.cxx:106
 TPaveClass.cxx:107
 TPaveClass.cxx:108
 TPaveClass.cxx:109
 TPaveClass.cxx:110
 TPaveClass.cxx:111
 TPaveClass.cxx:112
 TPaveClass.cxx:113
 TPaveClass.cxx:114
 TPaveClass.cxx:115
 TPaveClass.cxx:116
 TPaveClass.cxx:117
 TPaveClass.cxx:118
 TPaveClass.cxx:119
 TPaveClass.cxx:120
 TPaveClass.cxx:121
 TPaveClass.cxx:122
 TPaveClass.cxx:123
 TPaveClass.cxx:124
 TPaveClass.cxx:125
 TPaveClass.cxx:126
 TPaveClass.cxx:127
 TPaveClass.cxx:128
 TPaveClass.cxx:129
 TPaveClass.cxx:130
 TPaveClass.cxx:131
 TPaveClass.cxx:132
 TPaveClass.cxx:133
 TPaveClass.cxx:134
 TPaveClass.cxx:135
 TPaveClass.cxx:136
 TPaveClass.cxx:137
 TPaveClass.cxx:138
 TPaveClass.cxx:139
 TPaveClass.cxx:140
 TPaveClass.cxx:141
 TPaveClass.cxx:142
 TPaveClass.cxx:143
 TPaveClass.cxx:144
 TPaveClass.cxx:145
 TPaveClass.cxx:146
 TPaveClass.cxx:147
 TPaveClass.cxx:148
 TPaveClass.cxx:149
 TPaveClass.cxx:150
 TPaveClass.cxx:151
 TPaveClass.cxx:152
 TPaveClass.cxx:153
 TPaveClass.cxx:154
 TPaveClass.cxx:155
 TPaveClass.cxx:156
 TPaveClass.cxx:157
 TPaveClass.cxx:158
 TPaveClass.cxx:159
 TPaveClass.cxx:160
 TPaveClass.cxx:161
 TPaveClass.cxx:162
 TPaveClass.cxx:163
 TPaveClass.cxx:164
 TPaveClass.cxx:165