// @(#)root/ged:$Name:  $:$Id: TGedAttFrame.cxx,v 1.16 2004/05/07 05:27:57 brun Exp $
// Author: Marek Biskup, Ilka Antcheva   22/07/03

/*************************************************************************
 * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//  TGedAttFrame, TGedAttNameFrame, TGedAttFillFrame,                   //
//  TGedAttLineFrame, TGedAttTextFrame, TGedAttMarkerFrame              //
//                                                                      //
//  Frames with object attributes, just like on TAttCanvases.           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGedAttFrame.h"
#include "TGColorSelect.h"
#include "TGedMarkerSelect.h"
#include "TGClient.h"
#include "TGMsgBox.h"
#include "TGGC.h"
#include "TGedPatternSelect.h"
#include "TGColorDialog.h"
#include "TGResourcePool.h"
#include "TG3DLine.h"
#include "TColor.h"
#include "TGToolTip.h"
#include "TGButton.h"
#include "TGButtonGroup.h"
#include "TGNumberEntry.h"
#include "TCint.h"
#include "TCanvas.h"
#include "TVirtualMutex.h"
#include "TVirtualPad.h"
#include "TGToolTip.h"
#include "TGLabel.h"
#include "TGComboBox.h"

#include "Api.h"
#include "TGLabel.h"
#include "TPaveLabel.h"
#include <snprintf.h>

ClassImp(TGedAttFrame)
ClassImp(TGedAttFillFrame)
ClassImp(TGedAttLineFrame)
ClassImp(TGedAttTextFrame)
ClassImp(TGedAttMarkerFrame)
ClassImp(TGedAttAxisFrame)
ClassImp(TGedAttAxisTitle)
ClassImp(TGedAttAxisLabel)

enum {
   kPATTERN,
   kCOLOR,
   kLINE_WIDTH,
   kLINE_STYLE,
   kFONT_SIZE,
   kFONT_STYLE,
   kFONT_ALIGN,
   kMARKER,
   kMARKER_SIZE,
   kAXIS_TICKS,
   kAXIS_DIV1,
   kAXIS_DIV2,
   kAXIS_DIV3,
   kAXIS_OPTIM,
   kAXIS_LOG,
   kAXIS_TITSIZE,
   kAXIS_TITOFFSET,
   kAXIS_CENTERED,
   kAXIS_ROTATED,
   kAXIS_LBLSIZE,
   kAXIS_LBLOFFSET,
   kAXIS_TICKSBOTH,
   kAXIS_LBLLOG,
   kAXIS_LBLEXP,
   kAXIS_LBLDIR,
   kAXIS_LBLSORT
};

//______________________________________________________________________________
TGedAttFrame::TGedAttFrame(const TGWindow *p, Int_t id, Int_t width,
                           Int_t height, UInt_t options, Pixel_t back)
   : TGCompositeFrame(p, width, height, options, back), TGWidget(id)
{
   // Constructor of the base GUI attribute frame.
   fCanvas = 0;
   fPad    = 0;
   fModel  = 0;

   Associate(p);
}

//______________________________________________________________________________
Long_t TGedAttFrame::ExecuteInt(TObject *obj, const char *method, const char *params)
{
   // Execute the method for the specified object and argument values.

   R__LOCKGUARD(gCINTMutex);
   void       *address;
   Long_t      offset;
   G__CallFunc func;

   // set pointer to interface method and arguments
   func.SetFunc(obj->IsA()->GetClassInfo(), method, params, &offset);

   // call function
   address = (void*)((Long_t)obj + offset);
   return func.ExecInt(address);
}

//______________________________________________________________________________
char *TGedAttFrame::ExecuteChar(TObject *obj, const char *method, const char *params)
{
   // Execute the method for the specified object and argument values.

   R__LOCKGUARD(gCINTMutex);
   void       *address;
   Long_t      offset;
   G__CallFunc func;

   // set pointer to interface method and arguments
   func.SetFunc(obj->IsA()->GetClassInfo(), method, params, &offset);

   // call function
   address = (void*)((Long_t)obj + offset);
   return (char *)func.ExecInt(address);
}

//______________________________________________________________________________
Float_t TGedAttFrame::ExecuteFloat(TObject *obj, const char *method,
                                   const char *params)
{
   // Execute the method for the specified object and argument values.

   R__LOCKGUARD(gCINTMutex);
   void       *address;
   Long_t      offset;
   G__CallFunc func;

   // set pointer to interface method and arguments
   func.SetFunc(obj->IsA()->GetClassInfo(), method, params, &offset);

   // call function
   address = (void*)((Long_t)obj + offset);
   return func.ExecDouble(address);
}

//______________________________________________________________________________
TGCompositeFrame* TGedAttFrame::MakeTitle(const char *p)
{
   // Create attribute frame title.

   TGCompositeFrame *f1 = new TGCompositeFrame(this, 145, 10,
                               kHorizontalFrame | kLHintsExpandX | kFixedWidth | kOwnBackground);
   f1->AddFrame(new TGLabel(f1, p), new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
   f1->AddFrame(new TGHorizontal3DLine(f1),
                new TGLayoutHints(kLHintsExpandX, 5, 5, 7, 7));
   AddFrame(f1, new TGLayoutHints(kLHintsTop));

   return f1;
}

//______________________________________________________________________________
void TGedAttFrame::SetActive(Bool_t active)
{
   // Set active GUI attribute frames related to the selected object.

   if (active)
      ((TGCompositeFrame*)GetParent())->ShowFrame(this);
   else
      ((TGCompositeFrame*)GetParent())->HideFrame(this);

   ((TGMainFrame*)GetMainFrame())->Layout();
}

//______________________________________________________________________________
void TGedAttFrame::Refresh()
{
   // Refresh the GUI info about the object attributes.

   SetModel(fPad, fModel, 0);
}

//______________________________________________________________________________
void TGedAttFrame::Update()
{
   // Update the current pad when an attribute is changed via GUI.

      fPad->Modified();
      fPad->Update();
}

//______________________________________________________________________________
void TGedAttFrame::ConnectToCanvas(TCanvas* c)
{
   // Connect the GUI attribute frames to the selected object in the canvas.

   TQObject::Connect(c, "Selected(TPad*,TObject*,Int_t)", "TGedAttFrame",
                     this, "SetModel(TPad*,TObject*,Int_t)");
}

//______________________________________________________________________________
TGedAttNameFrame::TGedAttNameFrame(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Create the frame of the selected object info.

   MakeTitle("Name");
   
   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fLabel = new TGLabel(f2, "");
   f2->AddFrame(fLabel, new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
}

//______________________________________________________________________________
void TGedAttNameFrame::SetModel(TPad* pad, TObject* obj, Int_t)
{
   // Slot connected to Selected() signal of TCanvas.

   fModel = obj;
   fPad = pad;

   if (obj == 0) {
      SetActive(kFALSE);
      return;
   }

   TString string;
   string.Append(fModel->GetName());
   string.Append("::");
   string.Append(fModel->ClassName());

   Pixel_t color;
   gClient->GetColorByName("#ff0000", color);
   fLabel->SetTextColor(color, kTRUE);
   fLabel->SetText(new TGString(string));
   SetActive();
}

//______________________________________________________________________________
 TGedAttFillFrame::TGedAttFillFrame(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Constructor of fill attributes GUI.

   MakeTitle("Fill");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fColorSelect = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fColorSelect->Associate(this);
   fPatternSelect = new TGedPatternSelect(f2, 1, kPATTERN);
   f2->AddFrame(fPatternSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fPatternSelect->Associate(this);
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
}

//______________________________________________________________________________
 void TGedAttFillFrame::SetModel(TPad* pad, TObject* obj, Int_t)
{
   // Pick up the used fill attributes.

   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAttFill")) {

      SetActive(kFALSE);
      return;
   }

   fModel = obj;
   fPad = pad;

   Color_t c = ExecuteInt(fModel, "GetFillColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   Style_t s = (Style_t) ExecuteInt(fModel, "GetFillStyle", "");

   fPatternSelect->SetPattern(s);
   fColorSelect->SetColor(p);
   SetActive();
}

//______________________________________________________________________________
 Bool_t TGedAttFillFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message.

   if(!fModel)
      return kTRUE;
   bool b = false;
   switch (GET_MSG(msg)) {
      case kC_PATTERNSEL:
         switch (GET_SUBMSG(msg)) {
            case kPAT_SELCHANGED:
               {
                  char a[100];
                  snprintf(a, 100, "%ld",  parm2);
                  fModel->Execute("SetFillStyle", a, 0);
                  b = true;
                  SendMessage(fMsgWindow,
                        MK_MSG(kC_PATTERNSEL, kPAT_SELCHANGED), parm1, parm2);
               }
               break;
            default:
               break;
         }
         break;
      case kC_COLORSEL:
         switch (GET_SUBMSG(msg)) {
            case kCOL_SELCHANGED:
               {
                  char a[100];
                  snprintf(a, 100, "%d", TColor::GetColor(parm2));
                  fModel->Execute("SetFillColor", a, 0);
                  b = true;
                  SendMessage(fMsgWindow, msg, parm1, parm2);
               }
         }
   }
   if (b)
   {
      if (fPad) fPad->Modified();
      gPad->Modified();
      gPad->Update();
   }
   return kTRUE;
}

//______________________________________________________________________________
TGedAttLineFrame::TGedAttLineFrame(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Constructor of line attributes GUI.

   MakeTitle("Line");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   fColorSelect = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fColorSelect->Associate(this);

   fStyleCombo = new TGLineStyleComboBox(this, kLINE_STYLE);
   fStyleCombo->Resize(137, 20);
   AddFrame(fStyleCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));

   fWidthCombo = new TGLineWidthComboBox(f2, kLINE_WIDTH);
   f2->AddFrame(fWidthCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
   fWidthCombo->Resize(91, 20);
   fWidthCombo->Associate(this);
}

//______________________________________________________________________________
void TGedAttLineFrame::SetModel(TPad* pad, TObject* obj, Int_t)
{
   // Pick up the used line attributes.

   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAttLine")) {
      SetActive(kFALSE);
      return;
   }

   fModel = obj;
   fPad = pad;

   Int_t s = ExecuteInt(fModel, "GetLineStyle", "");
   fStyleCombo->Select(s);

   Int_t w = ExecuteInt(fModel, "GetLineWidth", "");
   fWidthCombo->Select(w);

   Color_t c = ExecuteInt(fModel, "GetLineColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   fColorSelect->SetColor(p);

   SetActive();
}

//______________________________________________________________________________
Bool_t TGedAttLineFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message.

   if(!fModel)
      return kTRUE;
   char a[100];
   bool b = false;
   if (GET_MSG(msg) == kC_COLORSEL && GET_SUBMSG(msg) == kCOL_SELCHANGED)
   {
      snprintf(a, 100, "%d", TColor::GetColor(parm2));
      fModel->Execute("SetLineColor", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   }
   if (GET_MSG(msg) == kC_COMMAND && GET_SUBMSG(msg) == kCM_COMBOBOX) {

      if (parm1 == kLINE_WIDTH) {
         snprintf(a, 100, "%ld", parm2);
         fModel->Execute("SetLineWidth", a, 0);
         b = true;
      } else if (parm1 == kLINE_STYLE) {
         snprintf(a, 100, "%ld", parm2);
         fModel->Execute("SetLineStyle", a, 0);
         b = true;
      }
   }
   if (b) Update();

   return kTRUE;
}

//______________________________________________________________________________
TGedAttTextFrame::TGedAttTextFrame(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Constructor of text attributes GUI.

   MakeTitle("Text");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fColorSelect = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fColorSelect->Associate(this);
   fSizeCombo = BuildFontSizeComboBox(f2, kFONT_SIZE);
   f2->AddFrame(fSizeCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
   fSizeCombo->Resize(91, 20);
   fSizeCombo->Associate(this);
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
   fTypeCombo = new TGFontTypeComboBox(this, kFONT_STYLE);
   fTypeCombo->Resize(137, 20);
   AddFrame(fTypeCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
   fAlignCombo = BuildTextAlignComboBox(this, kFONT_ALIGN);
   fAlignCombo->Resize(137, 20);
   AddFrame(fAlignCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
}

//______________________________________________________________________________
void TGedAttTextFrame::SetModel(TPad* pad, TObject* obj, Int_t)
{
   // Pick up the values of used text attributes.

   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAttText")) {
      SetActive(kFALSE);
      return;
   }

   fModel = obj;
   fPad = pad;

   fTypeCombo->Select(ExecuteInt(fModel, "GetTextFont", "") / 10);

   Float_t s = ExecuteFloat(fModel, "GetTextSize", "");
   Float_t dy;

   if (obj->InheritsFrom("TPaveLabel")) {
      TBox *pl = (TBox*)obj;
      dy = s * (pl->GetY2() - pl->GetY1());
   }
   else
      dy = s * (fPad->GetY2() - fPad->GetY1());

   Int_t size = fPad->YtoPixel(0.0) - fPad->YtoPixel(dy);
   if (size > 50) size = 50;
   if (size < 0)  size = 0;
   fSizeCombo->Select(size);

   fAlignCombo->Select(ExecuteInt(fModel, "GetTextAlign", ""));

   Color_t c = ExecuteInt(fModel, "GetTextColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   fColorSelect->SetColor(p);

   SetActive();
}

//______________________________________________________________________________
Bool_t TGedAttTextFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message.

   if(!fModel) return kTRUE;

   char a[100];
   bool b = false;

   if (GET_MSG(msg) == kC_COLORSEL && GET_SUBMSG(msg) == kCOL_SELCHANGED) {
      snprintf(a, 100, "%d", TColor::GetColor(parm2));
      fModel->Execute("SetTextColor", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   }

   if (GET_MSG(msg) == kC_COMMAND && GET_SUBMSG(msg) == kCM_COMBOBOX) {

      if (parm1 == kFONT_SIZE) {

         Float_t dy = fPad->AbsPixeltoY(0) - fPad->AbsPixeltoY(parm2);
         Float_t TextSize;

         if (fModel->InheritsFrom("TPaveLabel")) {
            TBox *pl = (TBox*) fModel;
            TextSize = dy/(pl->GetY2() - pl->GetY1());
         }
         else
            TextSize = dy/(fPad->GetY2() - fPad->GetY1());

         snprintf(a, 100, "%f", TextSize);
         fModel->Execute("SetTextSize", a, 0);
         b = true;
      } else if (parm1 == kFONT_STYLE) {
         Int_t fontPrec = ExecuteInt(fModel, "GetTextFont", "")%10;
		 snprintf(a, 100, "%ld", parm2 * 10 + fontPrec);
         fModel->Execute("SetTextFont", a, 0);
         b = true;
      } else if (parm1 == kFONT_ALIGN) {
         snprintf(a, 100, "%ld", parm2);
         fModel->Execute("SetTextAlign", a, 0);
         b = true;
      }
   }

   if (b) Update();

   return kTRUE;
}

//______________________________________________________________________________
TGComboBox* TGedAttTextFrame::BuildFontSizeComboBox(TGFrame* parent, Int_t id)
{
   // Create text size combo box.

   char a[100];
   TGComboBox *c = new TGComboBox(parent, id);

   c->AddEntry("Default", 0);
   for (int i = 1; i <= 50; i++) {
      snprintf(a, 100, "%d", i);
      c->AddEntry(a, i);
   }

   return c;
}

//______________________________________________________________________________
TGComboBox* TGedAttTextFrame::BuildTextAlignComboBox(TGFrame* parent, Int_t id)
{
   // Create text align combo box.

   TGComboBox *c = new TGComboBox(parent, id);

   c->AddEntry("11 Bottom, Left",   11);
   c->AddEntry("21 Bottom, Middle", 21);
   c->AddEntry("31 Bottom, Right",  31);
   c->AddEntry("12 Middle, Left",   12);
   c->AddEntry("22 Middle, Middle", 22);
   c->AddEntry("32 Middle, Right",  32);
   c->AddEntry("13 Top, Left",   13);
   c->AddEntry("23 Top, Middle", 23);
   c->AddEntry("33 Top, Right",  33);

   return c;
}

//______________________________________________________________________________
TGedAttMarkerFrame::TGedAttMarkerFrame(const TGWindow *p, Int_t id, Int_t width,
                                       Int_t height,UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Constructor of marker attributes GUI.

   MakeTitle("Marker");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fColorSelect = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fColorSelect->Associate(this);

   fMarkerSelect = new TGedMarkerSelect(f2, 1, kMARKER);
   f2->AddFrame(fMarkerSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fMarkerSelect->Associate(this);

   fSizeCombo = BuildMarkerSizeComboBox(f2, kMARKER_SIZE);
   f2->AddFrame(fSizeCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
   fSizeCombo->Resize(50, 20);
   fSizeCombo->Associate(this);
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
}

//______________________________________________________________________________
void TGedAttMarkerFrame::SetModel(TPad* pad, TObject* obj, Int_t)
{
   // Pick up the values of used marker attributes.

   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAttMarker"))
   {
      SetActive(kFALSE);
      return;
   }

   fModel = obj;
   fPad = pad;

   Float_t s = ExecuteFloat(fModel, "GetMarkerSize", "");
   s = TMath::Nint(s * 5);

   if (s > 15) s = 15;

   if (s < 1)  s = 1;

   fSizeCombo->Select((int) s);

   fMarkerSelect->SetMarkerStyle((Style_t) ExecuteInt(fModel, "GetMarkerStyle", ""));

   Color_t c = ExecuteInt(fModel, "GetMarkerColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   fColorSelect->SetColor(p);

   SetActive();
}

//______________________________________________________________________________
Bool_t TGedAttMarkerFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message.

   if(!fModel) return kTRUE;

   char a[100];
   bool b = false;

   if (GET_MSG(msg) == kC_COLORSEL && GET_SUBMSG(msg) == kCOL_SELCHANGED) {

      snprintf(a, 100, "%d", TColor::GetColor(parm2));
      fModel->Execute("SetMarkerColor", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   } else if (GET_MSG(msg) == kC_COMMAND && GET_SUBMSG(msg) == kCM_COMBOBOX) {
      if (parm1 == kMARKER_SIZE) {
         snprintf(a, 100, "%f", 0.2 * parm2);
         fModel->Execute("SetMarkerSize", a, 0);
         b = true;
      }
   } else if (GET_MSG(msg) == kC_MARKERSEL && GET_SUBMSG(msg) == kMAR_SELCHANGED) {
      snprintf(a, 100, "%d", (int) parm2);
      fModel->Execute("SetMarkerStyle", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   }

   if (b) Update();

   return kTRUE;
}

//______________________________________________________________________________
TGComboBox* TGedAttMarkerFrame::BuildMarkerSizeComboBox(TGFrame* parent, Int_t id)
{
   // Marker size combobox.

   char a[100];
   TGComboBox *c = new TGComboBox(parent, id);

   for (int i = 1; i <= 15; i++) {
      snprintf(a, 100, "%.1f", 0.2*i);
      c->AddEntry(a, i);
   }

   return c;
}

//______________________________________________________________________________
TGedAttAxisFrame::TGedAttAxisFrame(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Constructor of axis attribute GUI.
   
   MakeTitle("Axis");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fAxisColor = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fAxisColor, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fAxisColor->Associate(this);
   TGLabel *fTicksLabel = new TGLabel(f2, "Ticks:");
   f2->AddFrame(fTicksLabel, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 
                                               3, 0, 1, 1));
   fTickLength = new TGNumberEntry(f2, 0.03, 5, kAXIS_TICKS, 
                                       TGNumberFormat::kNESRealTwo,
                                       TGNumberFormat::kNEAAnyNumber,
                                       TGNumberFormat::kNELLimitMinMax,-1.,1.);
   fTickLength->GetNumberEntry()->SetToolTipText("Set ticks' length");
   fTickLength->Connect("ValueSet(Long_t)", "TGedAttAxisFrame", this, 
                        "DoTickLength()");
   f2->AddFrame(fTickLength, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   TGCompositeFrame *f3 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fTicksBoth = new TGCheckButton(f3, "+-", kAXIS_TICKSBOTH);
   fTicksBoth->Connect("Toggled(Bool_t)","TGedAttAxisFrame",this,
                       "DoTicks()");
   fTicksBoth->SetToolTipText("Draw ticks on both axis sides");
   f3->AddFrame(fTicksBoth, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 
                                              3, 1, 1, 0));
   fOptimize = new TGCheckButton(f3, "Optimize", kAXIS_OPTIM);
   fOptimize->SetState(kButtonDown);
   fOptimize->Connect("Toggled(Bool_t)","TGedAttAxisFrame",this,"DoDivisions()");
   fOptimize->SetToolTipText("Optimize the number of axis divisions");
   f3->AddFrame(fOptimize, new TGLayoutHints(kLHintsTop, 28, 1, 1, 0));
   AddFrame(f3, new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0));
   
   TGCompositeFrame *f4 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fLogAxis = new TGCheckButton(f4, "Log", kAXIS_LOG);
   fLogAxis->Connect("Toggled(Bool_t)","TGedAttAxisFrame",this,"DoLogAxis()");
   f4->AddFrame(fLogAxis, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 3, 1, 0, 0));
   fLogAxis->SetToolTipText("Draw logarithmic scale");

   fMoreLog = new TGCheckButton(f4, "MoreLog", kAXIS_LBLLOG);
   fMoreLog->Connect("Toggled(Bool_t)","TGedAttAxisFrame",this,"DoMoreLog()");
   f4->AddFrame(fMoreLog, new TGLayoutHints(kLHintsLeft, 19, 1, 0, 0));
   fMoreLog->SetToolTipText("Draw more logarithmic labels");

   AddFrame(f4, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   // axis divisions as three number entry widgets 
   TGCompositeFrame *f5 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fDiv3 = new TGNumberEntry(f5, 10, 2,kAXIS_DIV1, TGNumberFormat::kNESInteger,
                                       TGNumberFormat::kNEANonNegative, 
                                       TGNumberFormat::kNELLimitMinMax, 0, 99);
   fDiv3->GetNumberEntry()->SetToolTipText("Tertiary axis divisions");
   fDiv3->Connect("ValueSet(Long_t)", "TGedAttAxisFrame", this, "DoDivisions()");
   f5->AddFrame(fDiv3, new TGLayoutHints(kLHintsLeft, 27, 0, 1, 1));
   fDiv2 = new TGNumberEntry(f5, 5, 2, kAXIS_DIV2, TGNumberFormat::kNESInteger,
                                       TGNumberFormat::kNEANonNegative, 
                                       TGNumberFormat::kNELLimitMinMax, 0, 99);
   fDiv2->GetNumberEntry()->SetToolTipText("Secondary axis divisions");
   fDiv2->Connect("ValueSet(Long_t)", "TGedAttAxisFrame", this, "DoDivisions()");
   f5->AddFrame(fDiv2, new TGLayoutHints(kLHintsLeft, 1, 0, 1, 1));
   fDiv1 = new TGNumberEntry(f5, 0, 2, kAXIS_DIV3, TGNumberFormat::kNESInteger,
                                       TGNumberFormat::kNEANonNegative, 
                                       TGNumberFormat::kNELLimitMinMax, 0, 99);
   fDiv1->GetNumberEntry()->SetToolTipText("Primary axis divisions");
   fDiv1->Connect("ValueSet(Long_t)", "TGedAttAxisFrame", this,"DoDivisions()");
   f5->AddFrame(fDiv1, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 1, 1, 1, 1));
   AddFrame(f5, new TGLayoutHints(kLHintsLeft, 1, 1, 4, 0));

   fTicksFlag = 1;
}

//______________________________________________________________________________
void TGedAttAxisFrame::SetModel(TPad* pad, TObject* obj, Int_t)
{
   // Pick up the used values of axis attributes.
   
   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAxis")) {
      SetActive(kFALSE);
      return;
   }

   fModel = obj;
   fPad = pad;

   Color_t c = ExecuteInt(fModel, "GetAxisColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   fAxisColor->SetColor(p);

   Float_t ticks = ExecuteFloat(fModel, "GetTickLength", "");
   fTickLength->SetNumber(ticks);
   
   Int_t div = ExecuteInt(fModel, "GetNdivisions", "");
   fDiv1->SetNumber(div % 100);
   fDiv2->SetNumber((div/100) % 100);
   fDiv3->SetNumber((div/10000) % 100);
   
   if ((!strcmp(fModel->GetName(),"xaxis") && fPad->GetLogx()) ||
       (!strcmp(fModel->GetName(),"yaxis") && fPad->GetLogy()) ||
       (!strcmp(fModel->GetName(),"zaxis") && fPad->GetLogz())) 

      fLogAxis->SetState(kButtonDown);
   else fLogAxis->SetState(kButtonUp);

   if (fLogAxis->GetState() == kButtonUp) {
      fMoreLog->SetState(kButtonDisabled);
   } else {
      Int_t morelog = ExecuteInt(fModel, "GetMoreLogLabels", "");
      if (morelog) fMoreLog->SetState(kButtonDown);
      else         fMoreLog->SetState(kButtonUp);
   }
   
   char *both = ExecuteChar(fModel, "GetTicks", "");
   if (!strcmp(both,"+-")) {
      fTicksBoth->SetState(kButtonDown);
   } else {
      fTicksBoth->SetState(kButtonUp);
      if (!strcmp(both,"-")) fTicksFlag = -1;
      if (!strcmp(both,"+")) fTicksFlag =  1;
   }

   SetActive();
}

//______________________________________________________________________________
Bool_t TGedAttAxisFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{

   // Process message.
   
   if(!fModel)
      return kTRUE;

   char a[100];
   bool b = false;

   if (GET_MSG(msg) == kC_COLORSEL && GET_SUBMSG(msg) == kCOL_SELCHANGED) {

      snprintf(a, 100, "%d", TColor::GetColor(parm2));
      fModel->Execute("SetAxisColor", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   }
   if (b) Update();

   return kTRUE;
}

//______________________________________________________________________________
void TGedAttAxisFrame::DoTickLength()
{
   // Slot connected to the tick length settings.

   char a[100];
   snprintf(a, 100, "%f", (Float_t)fTickLength->GetNumber());
   fModel->Execute("SetTickLength", a, 0);
   Update();
   if (fTickLength->GetNumber() < 0) fTicksFlag = -1;
   else fTicksFlag = 1;
}

//______________________________________________________________________________
void TGedAttAxisFrame::DoTicks()
{
   // Slot connected to the ticks draw settings.

   char a[100];
   if (fTicksBoth->GetState() == kButtonDown) {
      snprintf(a, 100, ""+-"");
   } else {
      if (fTicksFlag == -1) snprintf(a, 100, ""-"");
      else snprintf(a, 100, """");
  }
   fModel->Execute("SetTicks", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisFrame::DoDivisions()
{
   // Slot connected to the number of divisions.

   char a[100];

   // the number of divisions are used 3 number entry widgets
   Int_t div = (Int_t)(fDiv1->GetNumber() + fDiv2->GetNumber()  * 100 
                                          + fDiv3->GetNumber() * 10000);
   snprintf(a, 100, "%d,%d", div, fOptimize->GetState());
   fModel->Execute("SetNdivisions", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisFrame::DoLogAxis()
{
   // Slot for Log scale setting.

   gPad = fPad;
      
   if (fLogAxis->GetState() == kButtonDown) {

      if (!strcmp(fModel->GetName(),"xaxis")) gPad->SetLogx(1);
      if (!strcmp(fModel->GetName(),"yaxis")) gPad->SetLogy(1);
      if (!strcmp(fModel->GetName(),"zaxis")) gPad->SetLogz(1);

      Int_t morelog = ExecuteInt(fModel, "GetMoreLogLabels", "");
      if (morelog)  fMoreLog->SetState(kButtonDown);
      else          fMoreLog->SetState(kButtonUp);
      fOptimize->SetState(kButtonDisabled);

   } else if (fLogAxis->GetState() == kButtonUp){
      if (!strcmp(fModel->GetName(),"xaxis")) gPad->SetLogx(0);
      if (!strcmp(fModel->GetName(),"yaxis")) gPad->SetLogy(0);
      if (!strcmp(fModel->GetName(),"zaxis")) gPad->SetLogz(0);
      fMoreLog->SetState(kButtonDisabled);
      fOptimize->SetState(kButtonDown);
   }
   Update();
   gPad->Modified();
   gPad->Update();
}

//______________________________________________________________________________
void TGedAttAxisFrame::DoMoreLog()
{
   // Slot connected to more Log labels flag

   char a[100];
   Int_t flag = 0;
   
   if (fMoreLog->GetState() == kButtonDown)    flag = 1;
   else if (fMoreLog->GetState() == kButtonUp) flag = 0;
   snprintf(a, 100, "%d", flag);
   fModel->Execute("SetMoreLogLabels", a, 0);
   Update();
}

//______________________________________________________________________________
TGedAttAxisTitle::TGedAttAxisTitle(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{

   // Constructor of axis title GUI.

   MakeTitle("Title");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fTitleColor = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fTitleColor, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fTitleColor->Associate(this);
   TGLabel *fSizeLbl = new TGLabel(f2, "Size:");                              
   f2->AddFrame(fSizeLbl, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 
                                            6, 1, 1, 1));
   fTitleSize = new TGNumberEntry(f2, 0.05, 5, kAXIS_TITSIZE, 
                                      TGNumberFormat::kNESRealTwo,
                                      TGNumberFormat::kNEANonNegative, 
                                      TGNumberFormat::kNELLimitMinMax, 0., 1.);
   fTitleSize->GetNumberEntry()->SetToolTipText("Set title size");
   fTitleSize->Connect("ValueSet(Long_t)", "TGedAttAxisTitle", this, 
                       "DoTitleSize()");
   f2->AddFrame(fTitleSize, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   fTitleFont = new TGFontTypeComboBox(this, kFONT_STYLE);
   fTitleFont->Resize(137, 20);
   fTitleFont->Connect("Selected(Int_t)", "TGedAttAxisTitle", this, 
                       "DoTitleFont()"); 
   AddFrame(fTitleFont, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 1));
   fPrecision = 0;

   TGCompositeFrame *f3 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fCentered = new TGCheckButton(f3, "Centered", kAXIS_CENTERED);
   fCentered->SetToolTipText("Center axis title");
   fCentered->Connect("Toggled(Bool_t)","TGedAttAxisTitle",this,
                      "DoTitleCentered()");
   f3->AddFrame(fCentered, new TGLayoutHints(kLHintsTop, 3, 1, 1, 0));
   TGLabel *fOffsetLbl = new TGLabel(f3, "Offset:");                              
   f3->AddFrame(fOffsetLbl, new TGLayoutHints(kLHintsLeft, 23, 1, 3, 0));
   AddFrame(f3, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   TGCompositeFrame *f4 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fRotated = new TGCheckButton(f4, "Rotated", kAXIS_ROTATED);
   fRotated->SetState(kButtonDown);
   fRotated->SetToolTipText("Rotate axis title by 180 degrees");
   fRotated->Connect("Toggled(Bool_t)","TGedAttAxisTitle",this,
                     "DoTitleRotated()");
   f4->AddFrame(fRotated, new TGLayoutHints(kLHintsTop, 3, 1, 6, 0));
   fTitleOffset = new TGNumberEntry(f4, 1.00, 6, kAXIS_TITOFFSET, 
                                        TGNumberFormat::kNESRealTwo,
                                        TGNumberFormat::kNEAAnyNumber, 
                                        TGNumberFormat::kNELLimitMinMax, 0.1, 10.);
   fTitleOffset->GetNumberEntry()->SetToolTipText("Set title offset");
   fTitleOffset->Connect("ValueSet(Long_t)", "TGedAttAxisTitle", this, 
                         "DoTitleOffset()");
   f4->AddFrame(fTitleOffset, new TGLayoutHints(kLHintsLeft, 6, 1, 0, 0));
   AddFrame(f4, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
}

//______________________________________________________________________________
void TGedAttAxisTitle::SetModel(TPad* pad, TObject* obj, Int_t)
{

   // Pick up the used values of axis title.
   
   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAxis") || strlen(obj->GetTitle()) == 0) {
      SetActive(kFALSE);
      return;
   }

   fModel = obj;
   fPad = pad;

   Color_t c = ExecuteInt(fModel, "GetTitleColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   fTitleColor->SetColor(p);

   Float_t size = ExecuteFloat(fModel, "GetTitleSize", "");
   fTitleSize->SetNumber(size);

   Style_t font = ExecuteInt(fModel, "GetTitleFont", "");
   fTitleFont->Select(font / 10);
   fPrecision = (Int_t)(font % 10);

   Float_t offset = ExecuteFloat(fModel, "GetTitleOffset", "");
   fTitleOffset->SetNumber(offset);

   Int_t centered = (Int_t)ExecuteInt(fModel, "GetCenterTitle", "");
   if (centered) fCentered->SetState(kButtonDown);
   else          fCentered->SetState(kButtonUp);
   
   Int_t rotated = (Int_t)ExecuteInt(fModel, "GetRotateTitle", "");
   if (rotated) fRotated->SetState(kButtonDown);
   else         fRotated->SetState(kButtonUp);

   SetActive();
}

//______________________________________________________________________________
Bool_t TGedAttAxisTitle::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message.

   if(!fModel)
      return kTRUE;

   char a[100];
   bool b = false;

   if (GET_MSG(msg) == kC_COLORSEL && GET_SUBMSG(msg) == kCOL_SELCHANGED) {

      snprintf(a, 100, "%d", TColor::GetColor(parm2));
      fModel->Execute("SetTitleColor", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   }
   if (b) Update();

   return kTRUE;
}

//______________________________________________________________________________
void TGedAttAxisTitle::DoTitleSize()
{
   // Slot connected to the title font size.

   char a[100];
   snprintf(a, 100, "%f", (Float_t)fTitleSize->GetNumber());
   fModel->Execute("SetTitleSize", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisTitle::DoTitleFont()
{
   // Slot connected to the title font.

   char a[100];
   snprintf(a, 100, "%d", fTitleFont->GetSelected() * 10 + fPrecision);
   fModel->Execute("SetTitleFont", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisTitle::DoTitleOffset()
{
   // Slot connected to the title offset.

   char a[100];
   snprintf(a, 100, "%f", (Float_t)fTitleOffset->GetNumber());
   fModel->Execute("SetTitleOffset", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisTitle::DoTitleCentered()
{
   // Slot connected to centered title option.

   char a[100];
   snprintf(a, 100, "%d", fCentered->GetState());
   fModel->Execute("CenterTitle", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisTitle::DoTitleRotated()
{
   // Slot connected to the title rotation.

   char a[100];
   snprintf(a, 100, "%d", fRotated->GetState());
   fModel->Execute("RotateTitle", a, 0);
   Update();
}

//______________________________________________________________________________
TGedAttAxisLabel::TGedAttAxisLabel(const TGWindow *p, Int_t id, Int_t width,
                                   Int_t height, UInt_t options, Pixel_t back)
   : TGedAttFrame(p, id, width, height, options | kVerticalFrame, back)
{
   // Constructor of axis label GUI.

   MakeTitle("Labels");

   TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fLabelColor = new TGColorSelect(f2, 0, kCOLOR);
   f2->AddFrame(fLabelColor, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   fLabelColor->Associate(this);
   TGLabel *fSizeLbl = new TGLabel(f2, "Size:");                              
   f2->AddFrame(fSizeLbl, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 
                                            1, 0, 1, 1));
   fLabelSize = new TGNumberEntry(f2, 0.05, 6, kAXIS_LBLSIZE, 
                                      TGNumberFormat::kNESRealTwo,
                                      TGNumberFormat::kNEANonNegative, 
                                      TGNumberFormat::kNELLimitMinMax, 0., 1.);
   fLabelSize->GetNumberEntry()->SetToolTipText("Set labels' size");
   fLabelSize->Connect("ValueSet(Long_t)", "TGedAttAxisLabel", this, 
                       "DoLabelSize()");
   f2->AddFrame(fLabelSize, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
   AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   TGCompositeFrame *f3 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
   fNoExponent = new TGCheckButton(f3, "NoExp", kAXIS_LBLEXP);
   fNoExponent->Connect("Toggled(Bool_t)","TGedAttAxisLabel",this,"DoNoExponent()");
   fNoExponent->SetToolTipText("Labels drawn without exponent notation");
   f3->AddFrame(fNoExponent, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 
                                               3, 1, 8, 0));
   fLabelOffset = new TGNumberEntry(f3, 0.005, 6, kAXIS_LBLOFFSET, 
                                        TGNumberFormat::kNESRealThree,
                                        TGNumberFormat::kNEAAnyNumber, 
                                        TGNumberFormat::kNELLimitMinMax,-1.,1.);
   fLabelOffset->GetNumberEntry()->SetToolTipText("Set labels' offset");
   fLabelOffset->Connect("ValueSet(Long_t)", "TGedAttAxisLabel", this, 
                         "DoLabelOffset()");
   f3->AddFrame(fLabelOffset, new TGLayoutHints(kLHintsLeft, 11, 1, 3, 0));
   AddFrame(f3, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));

   fLabelFont = new TGFontTypeComboBox(this, kFONT_STYLE);
   fLabelFont->Resize(137, 20);
   fLabelFont->Connect("Selected(Int_t)", "TGedAttAxisLabel", this, 
                       "DoLabelFont()"); 
   AddFrame(fLabelFont, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 0));
}

//______________________________________________________________________________
void TGedAttAxisLabel::SetModel(TPad* pad, TObject* obj, Int_t)
{

   // Pick up the used values of the axis labels.
   
   fModel = 0;
   fPad = 0;

   if (obj == 0 || !obj->InheritsFrom("TAxis")) {
      SetActive(kFALSE);
      return;
   }

   fModel  = obj;
   fPad    = pad;

   Color_t c = ExecuteInt(fModel, "GetLabelColor", "");
   Pixel_t p = TColor::Number2Pixel(c);
   fLabelColor->SetColor(p);

   Float_t size = ExecuteFloat(fModel, "GetLabelSize", "");
   fLabelSize->SetNumber(size);

   Style_t font = ExecuteInt(fModel, "GetLabelFont", "");
   fLabelFont->Select(font / 10);
   fPrecision = (Int_t)(font % 10);

   Float_t offset = ExecuteFloat(fModel, "GetLabelOffset", "");
   fLabelOffset->SetNumber(offset);

   Int_t noexp = (Int_t)ExecuteInt(fModel, "GetNoExponent", "");
   if (noexp) fNoExponent->SetState(kButtonDown);
   else       fNoExponent->SetState(kButtonUp);

   SetActive();
}

//______________________________________________________________________________
Bool_t TGedAttAxisLabel::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{

   // Process message.

   if(!fModel)
      return kTRUE;

   char a[100];
   bool b = false;

   if (GET_MSG(msg) == kC_COLORSEL && GET_SUBMSG(msg) == kCOL_SELCHANGED) {

      snprintf(a, 100, "%d", TColor::GetColor(parm2));
      fModel->Execute("SetLabelColor", a, 0);
      b = true;
      SendMessage(fMsgWindow, msg, parm1, parm2);
   }
   if (b) Update();

   return kTRUE;
}

//______________________________________________________________________________
void TGedAttAxisLabel::DoLabelSize()
{
   // Slot connected to the label size.

   char a[100];
   snprintf(a, 100, "%f", (Float_t)fLabelSize->GetNumber());
   fModel->Execute("SetLabelSize", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisLabel::DoLabelFont()
{
   // Slot connected to the label font.

   char a[100];
   snprintf(a, 100, "%d", fLabelFont->GetSelected() * 10 + fPrecision);
   fModel->Execute("SetLabelFont", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisLabel::DoLabelOffset()
{
   // Slot connected to the label offset.

   char a[100];
   snprintf(a, 100, "%f", (Float_t)fLabelOffset->GetNumber());
   fModel->Execute("SetLabelOffset", a, 0);
   Update();
}

//______________________________________________________________________________
void TGedAttAxisLabel::DoNoExponent()
{
   // Slot connected to the labels' exponent flag.

   char a[100];
   snprintf(a, 100, "%d", fNoExponent->GetState());
   fModel->Execute("SetNoExponent", a, 0);
   Update();
}



ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.