// @(#)root/gui:$Id$
// Author: Fons Rademakers   6/09/2000

/*************************************************************************
 * 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGSplitter, TGVSplitter and TGHSplitter                              //
//                                                                      //
// A splitter allows the frames left and right or above and below of    //
// it to be resized. The frame to be resized must have the kFixedWidth  //
// or kFixedHeight property set.                                        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGSplitter.h"
#include "TGPicture.h"
#include "Riostream.h"


ClassImp(TGSplitter)
ClassImp(TGVSplitter)
ClassImp(TGHSplitter)
ClassImp(TGVFileSplitter)


//______________________________________________________________________________
TGSplitter::TGSplitter(const TGWindow *p, UInt_t w, UInt_t h,
                       UInt_t options, ULong_t back) :
   TGFrame(p, w, h, options, back),
   fDragging        (kFALSE),
   fExternalHandler (kFALSE),
   fSplitterPic     (0)
{
   // Create a splitter.

   fSplitCursor = kNone;
   fEditDisabled = kTRUE;
}

//______________________________________________________________________________
void TGSplitter::DragStarted()
{
   // Emit DragStarted signal.

   Emit("DragStarted()");
}

//______________________________________________________________________________
void TGSplitter::Moved(Int_t delta)
{
   // Emit Moved signal.

   Emit("Moved(Int_t)", delta);
}

//______________________________________________________________________________
TGVSplitter::TGVSplitter(const TGWindow *p, UInt_t w, UInt_t h,
              UInt_t options, ULong_t back) : TGSplitter(p, w, h, options, back)
{
   // Create a vertical splitter.

   fSplitCursor = kNone;
   fSplitterPic = fClient->GetPicture("splitterv.xpm");
   fFrameHeight = h;
   fFrameWidth = w;
   fLeft = kTRUE;
   fMax = fMin = 0;
   fStartX = 0;

   if (!fSplitterPic)
      Error("TGVSplitter", "splitterv.xpm not found");

   if (p && !p->InheritsFrom(TGCompositeFrame::Class())) {
      Error("TGVSplitter", "parent must inherit from a TGCompositeFrame");
      return;
   }
   if (p && !(((TGCompositeFrame*)p)->GetOptions() & kHorizontalFrame)) {
      Error("TGVSplitter", "parent must have a horizontal layout manager");
      return;
   }

   fSplitCursor = gVirtualX->CreateCursor(kArrowHor);
   fFrame = 0;

   gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
                         kButtonPressMask | kButtonReleaseMask |
                         kPointerMotionMask, kNone, kNone);

   AddInput(kEnterWindowMask | kLeaveWindowMask);
}

//______________________________________________________________________________
TGVSplitter::TGVSplitter(const TGWindow *p, UInt_t w, UInt_t h, Bool_t external) :
   TGSplitter(p, w, h, kChildFrame, GetDefaultFrameBackground())
{
   // Create a vertical splitter.

   fExternalHandler = external;

   fSplitCursor = kNone;
   fSplitterPic = fClient->GetPicture("splitterv.xpm");

   if (!fSplitterPic)
      Error("TGVSplitter", "splitterv.xpm not found");

   fSplitCursor = gVirtualX->CreateCursor(kArrowHor);
   fFrame = 0;
   fFrameHeight = h;
   fFrameWidth = w;
   fLeft = kTRUE;
   fMax = fMin = 0;
   fStartX = 0;

   gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
                         kButtonPressMask | kButtonReleaseMask |
                         kPointerMotionMask, kNone, kNone);

   AddInput(kEnterWindowMask | kLeaveWindowMask);
}

//______________________________________________________________________________
TGVSplitter::~TGVSplitter()
{
   // Delete vertical splitter widget.

   if (fSplitterPic) fClient->FreePicture(fSplitterPic);
}

//______________________________________________________________________________
void TGVSplitter::SetFrame(TGFrame *frame, Bool_t left)
{
   // Set frame to be resized. If frame is on the left of the splitter
   // set left to true.

   fFrame = frame;
   fLeft  = left;

   if (!fExternalHandler && !(fFrame->GetOptions() & kFixedWidth))
      Error("SetFrame", "resize frame must have kFixedWidth option set");
}

//______________________________________________________________________________
Bool_t TGVSplitter::HandleButton(Event_t *event)
{
   // Handle mouse button event in vertical splitter.

   if (fSplitCursor == kNone) return kTRUE;

   if (!fExternalHandler && !fFrame) {
      Error("HandleButton", "frame to be resized not set");
      return kTRUE;
   }

   if (event->fType == kButtonPress) {
      fStartX   = event->fXRoot;
      fDragging = kTRUE;

      if (fExternalHandler) {
         fMin = 0;
         fMax = 99999;
         DragStarted();
      } else {
         Int_t  x, y;
         gVirtualX->GetWindowSize(fFrame->GetId(), x, y, fFrameWidth, fFrameHeight);

         // get fMin and fMax in root coordinates
         Int_t    xroot, yroot;
         UInt_t   w, h;
         Window_t wdum;
         gVirtualX->GetWindowSize(fParent->GetId(), x, y, w, h);
         gVirtualX->TranslateCoordinates(fParent->GetParent()->GetId(),
                                         fClient->GetDefaultRoot()->GetId(),
                                         x, y, xroot, yroot, wdum);
         fMin = xroot;
         fMax = xroot + w - 2;
      }

      // last argument kFALSE forces all specified events to this window
      gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
                             kPointerMotionMask, kNone, fSplitCursor,
                             kTRUE, kFALSE);
   } else {
      fDragging = kFALSE;
      gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);  // ungrab pointer
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGVSplitter::HandleMotion(Event_t *event)
{
   // Handle mouse motion event in vertical splitter.

   if (fDragging) {
      Int_t xr = event->fXRoot;
      if (xr > fMax) xr = fMax;
      if (xr < fMin) xr = fMin;
      Int_t delta = xr - fStartX;
      if (fExternalHandler) {
         if (delta != 0) {
            Moved(delta);
            fStartX = xr;
         }
      } else {
         Int_t w = (Int_t) fFrameWidth;
         if (fLeft)
            w += delta;
         else
            w -= delta;
         if (w < 0) w = 0;
         fStartX = xr;

         if (delta != 0) {
            fFrameWidth = w;
            fFrame->Resize(fFrameWidth, fFrameHeight);

            TGCompositeFrame *p = (TGCompositeFrame *) GetParent();
            p->Layout();
         }
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGVSplitter::HandleCrossing(Event_t *event)
{
   // Handle mouse motion event in vertical splitter.

   if (event->fType == kEnterNotify)
      gVirtualX->SetCursor(fId, fSplitCursor);
   else
      gVirtualX->SetCursor(fId, kNone);

   return kTRUE;
}

//______________________________________________________________________________
void TGVSplitter::DrawBorder()
{
   // Draw vertical splitter.

   if (fSplitterPic) {
      Int_t posx = (fWidth/2)-(fSplitterPic->GetWidth()/2);
      Int_t posy = (fHeight/2)-(fSplitterPic->GetHeight()/2);
      fSplitterPic->Draw(fId, GetBckgndGC()(), posx, posy);
   }
}


//______________________________________________________________________________
TGHSplitter::TGHSplitter(const TGWindow *p, UInt_t w, UInt_t h,
              UInt_t options, ULong_t back) : TGSplitter(p, w, h, options, back)
{
   // Create a horizontal splitter.

   fSplitCursor = kNone;

   fSplitterPic = fClient->GetPicture("splitterh.xpm");

   if (!fSplitterPic)
      Error("TGHSplitter", "splitterh.xpm not found");

   if (p && !p->InheritsFrom(TGCompositeFrame::Class())) {
      Error("TGHSplitter", "parent must inherit from a TGCompositeFrame");
      return;
   }
   if (p && !(((TGCompositeFrame*)p)->GetOptions() & kVerticalFrame)) {
      Error("TGHSplitter", "parent must have a vertical layout manager");
      return;
   }

   fSplitCursor = gVirtualX->CreateCursor(kArrowVer);
   fFrame = 0;
   fFrameHeight = h;
   fFrameWidth = w;
   fAbove = kTRUE;
   fMax = fMin = 0;
   fStartY = 0;

   gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
                         kButtonPressMask | kButtonReleaseMask |
                         kPointerMotionMask, kNone, kNone);

   AddInput(kEnterWindowMask | kLeaveWindowMask);
}

//______________________________________________________________________________
TGHSplitter::TGHSplitter(const TGWindow *p, UInt_t w, UInt_t h, Bool_t external) :
   TGSplitter(p, w, h, kChildFrame, GetDefaultFrameBackground())
{
   // Create a horizontal splitter.

   fExternalHandler = external;

   fSplitCursor = kNone;

   fSplitterPic = fClient->GetPicture("splitterh.xpm");

   if (!fSplitterPic)
      Error("TGHSplitter", "splitterh.xpm not found");

   fSplitCursor = gVirtualX->CreateCursor(kArrowVer);
   fFrame = 0;
   fFrameHeight = h;
   fFrameWidth = w;
   fAbove = kTRUE;
   fMax = fMin = 0;
   fStartY = 0;

   gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
                         kButtonPressMask | kButtonReleaseMask |
                         kPointerMotionMask, kNone, kNone);

   AddInput(kEnterWindowMask | kLeaveWindowMask);
}

//______________________________________________________________________________
TGHSplitter::~TGHSplitter()
{
   // Delete horizontal splitter widget.

   if (fSplitterPic) fClient->FreePicture(fSplitterPic);
}

//______________________________________________________________________________
void TGHSplitter::SetFrame(TGFrame *frame, Bool_t above)
{
   // Set frame to be resized. If frame is above the splitter
   // set above to true.

   fFrame = frame;
   fAbove = above;

   if (!fExternalHandler && !(fFrame->GetOptions() & kFixedHeight))
      Error("SetFrame", "resize frame must have kFixedHeight option set");
}

//______________________________________________________________________________
Bool_t TGHSplitter::HandleButton(Event_t *event)
{
   // Handle mouse button event in horizontal splitter.

   if (fSplitCursor == kNone) return kTRUE;

   if (!fExternalHandler && !fFrame) {
      Error("HandleButton", "frame to be resized not set");
      return kTRUE;
   }

   if (event->fType == kButtonPress) {
      fStartY   = event->fYRoot;
      fDragging = kTRUE;

      if (fExternalHandler) {
         fMin = 0;
         fMax = 99999;
         DragStarted();
      } else {
         Int_t  x, y;
         gVirtualX->GetWindowSize(fFrame->GetId(), x, y, fFrameWidth, fFrameHeight);

         // get fMin and fMax in root coordinates
         Int_t    xroot, yroot;
         UInt_t   w, h;
         Window_t wdum;
         gVirtualX->GetWindowSize(fParent->GetId(), x, y, w, h);
         gVirtualX->TranslateCoordinates(fParent->GetParent()->GetId(),
                                         fClient->GetDefaultRoot()->GetId(),
                                         x, y, xroot, yroot, wdum);
         fMin = yroot;
         fMax = yroot + h - 2;
      }

      // last argument kFALSE forces all specified events to this window
      gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
                             kPointerMotionMask, kNone, fSplitCursor,
                             kTRUE, kFALSE);
   } else {
      fDragging = kFALSE;
      gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);  // ungrab pointer
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGHSplitter::HandleMotion(Event_t *event)
{
   // Handle mouse motion event in horizontal splitter.

   if (fDragging) {
      Int_t yr = event->fYRoot;
      if (yr > fMax) yr = fMax;
      if (yr < fMin) yr = fMin;
      Int_t delta = yr - fStartY;
      if (fExternalHandler) {
         if (delta != 0) {
            Moved(delta);
            fStartY = yr;
         }
      } else {
         Int_t h = (Int_t) fFrameHeight;
         if (fAbove)
            h += delta;
         else
            h -= delta;
         if (h < 0) h = 0;
         fStartY = yr;

         if (delta != 0) {
            fFrameHeight = h;
            fFrame->Resize(fFrameWidth, fFrameHeight);

            TGCompositeFrame *p = (TGCompositeFrame *) GetParent();
            p->Layout();
         }
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGHSplitter::HandleCrossing(Event_t *event)
{
   // Handle mouse motion event in horizontal splitter.

   if (event->fType == kEnterNotify)
      gVirtualX->SetCursor(fId, fSplitCursor);
   else
      gVirtualX->SetCursor(fId, kNone);

   return kTRUE;
}

//______________________________________________________________________________
void TGHSplitter::DrawBorder()
{
   // Draw horizontal splitter.

   if (fSplitterPic) {
      Int_t posx = (fWidth/2)-(fSplitterPic->GetWidth()/2);
      Int_t posy = (fHeight/2)-(fSplitterPic->GetHeight()/2);
      fSplitterPic->Draw(fId, GetBckgndGC()(), posx, posy);
   }
}

//______________________________________________________________________________
TGVFileSplitter::TGVFileSplitter(const TGWindow *p, UInt_t w, UInt_t h,
                                 UInt_t options, Pixel_t back):
  TGVSplitter(p, w, h, options, back)
{
//    fSplitterPic = fClient->GetPicture("filesplitterv.xpm");

//    if (!fSplitterPic)
//       Error("TGVFileSplitter", "filesplitterv.xpm not found");
}

//______________________________________________________________________________
TGVFileSplitter::~TGVFileSplitter()
{
//    if (fSplitterPic) fClient->FreePicture(fSplitterPic);
}

//______________________________________________________________________________
Bool_t TGVFileSplitter::HandleMotion(Event_t *event)
{
   // Handle mouse motion event in vertical splitter.

   fMin = 30;

   if (fDragging) {
      Int_t xr = event->fXRoot;
      if (xr > fMax) xr = fMax;
      if (xr < fMin) xr = fMin;
      Int_t delta = xr - fStartX;
      Int_t w = (Int_t) fFrameWidth;
      if (fLeft)
         w += delta;
      else
         w -= delta;

      if (w < 0) w = 0;
      fStartX = xr;

      if (delta != 0) {
         delta = w - fFrameWidth;
         fFrameWidth = w;

         TGCompositeFrame *p = (TGCompositeFrame *) GetParent();
         p->Resize( p->GetWidth() + delta, p->GetHeight() );

         fFrame->Resize(fFrameWidth, fFrameHeight);

         p->Layout();
         LayoutHeader((TGFrame *)fFrame);
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGVFileSplitter::HandleButton(Event_t *event)
{
   // Handle mouse button event in vertical splitter.

   if ( event->fType == kButtonPress) {
      ButtonPressed();
   } else if ( event->fType == kButtonRelease) {
      LayoutHeader(0);
      LayoutListView();
      ButtonReleased();
   } else if ( event->fType == kButtonDoubleClick ) {
      DoubleClicked(this);
   }
   return TGVSplitter::HandleButton(event);
}

//______________________________________________________________________________
void TGVFileSplitter::LayoutHeader(TGFrame *f)
{
   // Emit LayoutFeader() signal.

   Emit("LayoutHeader(TGFrame*)", (Long_t)f);
}

//______________________________________________________________________________
void TGVFileSplitter::LayoutListView()
{
   // Emit LayoutListView() signal.

   Emit("LayoutListView()");
}

//______________________________________________________________________________
void TGVFileSplitter::ButtonPressed()
{
   // Emit ButtonPressed() signal.

   Emit("ButtonPressed()");
}

//______________________________________________________________________________
void TGVFileSplitter::ButtonReleased()
{
   // Emit ButtonReleased() signal.

   Emit("ButtonReleased()");
}

//______________________________________________________________________________
void TGVFileSplitter::DoubleClicked(TGVFileSplitter* splitter)
{
   // Emit DoubleClicked() signal.

   Emit("DoubleClicked(TGVFileSplitter*)", (Long_t) splitter);
}

//______________________________________________________________________________
Bool_t TGVFileSplitter::HandleDoubleClick(Event_t *)
{
   // Handle double click mouse event in splitter.

   DoubleClicked(this);
   return kTRUE;
}

//______________________________________________________________________________
void TGVSplitter::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
{
    // Save a splitter widget as a C++ statement(s) on output stream out.

   if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);

   out << "   TGVSplitter *";
   out << GetName() <<" = new TGVSplitter("<< fParent->GetName()
       << "," << GetWidth() << "," << GetHeight();

   if (fBackground == GetDefaultFrameBackground()) {
      if (!GetOptions()) {
         out <<");" << std::endl;
      } else {
         out << "," << GetOptionString() <<");" << std::endl;
      }
   } else {
      out << "," << GetOptionString() << ",ucolor);" << std::endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << std::endl;
   // TGVSplitter->SetFrame( theframe ) can only be saved here
   // if fFrame is the frame on the left (since the frame on the
   // right will only be saved afterwards)... The other case is
   // handled in TGCompositeFrame::SavePrimitiveSubframes()
   if (GetLeft()) {
      out << "   " << GetName() << "->SetFrame(" << GetFrame()->GetName();
      if (GetLeft()) out << ",kTRUE);" << std::endl;
      else           out << ",kFALSE);"<< std::endl;
   }
}

//______________________________________________________________________________
void TGHSplitter::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
{
    // Save a splitter widget as a C++ statement(s) on output stream out.

   if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);

   out << "   TGHSplitter *";
   out << GetName() <<" = new TGHSplitter("<< fParent->GetName()
       << "," << GetWidth() << "," << GetHeight();

   if (fBackground == GetDefaultFrameBackground()) {
      if (!GetOptions()) {
         out <<");" << std::endl;
      } else {
         out << "," << GetOptionString() <<");" << std::endl;
      }
   } else {
      out << "," << GetOptionString() << ",ucolor);" << std::endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << std::endl;
   // TGHSplitter->SetFrame( theframe ) can only be saved here
   // if fFrame is the frame above (since the frame below will
   // only be saved afterwards)... The other case is handled in
   // TGCompositeFrame::SavePrimitiveSubframes()
   if (GetAbove()) {
      out << "   " << GetName() << "->SetFrame(" << GetFrame()->GetName();
      if (GetAbove()) out << ",kTRUE);" << std::endl;
      else            out << ",kFALSE);"<< std::endl;
   }
}

//______________________________________________________________________________
void TGVFileSplitter::SavePrimitive(std::ostream &out, Option_t *option /*= ""*/)
{
    // Save a splitter widget as a C++ statement(s) on output stream out.

   if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);

   out << "   TGVFileSplitter *";
   out << GetName() <<" = new TGVFileSplitter("<< fParent->GetName()
       << "," << GetWidth() << "," << GetHeight();

   if (fBackground == GetDefaultFrameBackground()) {
      if (!GetOptions()) {
         out <<");" << std::endl;
      } else {
         out << "," << GetOptionString() <<");" << std::endl;
      }
   } else {
      out << "," << GetOptionString() << ",ucolor);" << std::endl;
   }
   if (option && strstr(option, "keep_names"))
      out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << std::endl;

   out << "   " << GetName() << "->SetFrame(" << GetFrame()->GetName();
   if (GetLeft()) out << ",kTRUE);" << std::endl;
   else           out << ",kFALSE);"<< std::endl;
}

 TGSplitter.cxx:1
 TGSplitter.cxx:2
 TGSplitter.cxx:3
 TGSplitter.cxx:4
 TGSplitter.cxx:5
 TGSplitter.cxx:6
 TGSplitter.cxx:7
 TGSplitter.cxx:8
 TGSplitter.cxx:9
 TGSplitter.cxx:10
 TGSplitter.cxx:11
 TGSplitter.cxx:12
 TGSplitter.cxx:13
 TGSplitter.cxx:14
 TGSplitter.cxx:15
 TGSplitter.cxx:16
 TGSplitter.cxx:17
 TGSplitter.cxx:18
 TGSplitter.cxx:19
 TGSplitter.cxx:20
 TGSplitter.cxx:21
 TGSplitter.cxx:22
 TGSplitter.cxx:23
 TGSplitter.cxx:24
 TGSplitter.cxx:25
 TGSplitter.cxx:26
 TGSplitter.cxx:27
 TGSplitter.cxx:28
 TGSplitter.cxx:29
 TGSplitter.cxx:30
 TGSplitter.cxx:31
 TGSplitter.cxx:32
 TGSplitter.cxx:33
 TGSplitter.cxx:34
 TGSplitter.cxx:35
 TGSplitter.cxx:36
 TGSplitter.cxx:37
 TGSplitter.cxx:38
 TGSplitter.cxx:39
 TGSplitter.cxx:40
 TGSplitter.cxx:41
 TGSplitter.cxx:42
 TGSplitter.cxx:43
 TGSplitter.cxx:44
 TGSplitter.cxx:45
 TGSplitter.cxx:46
 TGSplitter.cxx:47
 TGSplitter.cxx:48
 TGSplitter.cxx:49
 TGSplitter.cxx:50
 TGSplitter.cxx:51
 TGSplitter.cxx:52
 TGSplitter.cxx:53
 TGSplitter.cxx:54
 TGSplitter.cxx:55
 TGSplitter.cxx:56
 TGSplitter.cxx:57
 TGSplitter.cxx:58
 TGSplitter.cxx:59
 TGSplitter.cxx:60
 TGSplitter.cxx:61
 TGSplitter.cxx:62
 TGSplitter.cxx:63
 TGSplitter.cxx:64
 TGSplitter.cxx:65
 TGSplitter.cxx:66
 TGSplitter.cxx:67
 TGSplitter.cxx:68
 TGSplitter.cxx:69
 TGSplitter.cxx:70
 TGSplitter.cxx:71
 TGSplitter.cxx:72
 TGSplitter.cxx:73
 TGSplitter.cxx:74
 TGSplitter.cxx:75
 TGSplitter.cxx:76
 TGSplitter.cxx:77
 TGSplitter.cxx:78
 TGSplitter.cxx:79
 TGSplitter.cxx:80
 TGSplitter.cxx:81
 TGSplitter.cxx:82
 TGSplitter.cxx:83
 TGSplitter.cxx:84
 TGSplitter.cxx:85
 TGSplitter.cxx:86
 TGSplitter.cxx:87
 TGSplitter.cxx:88
 TGSplitter.cxx:89
 TGSplitter.cxx:90
 TGSplitter.cxx:91
 TGSplitter.cxx:92
 TGSplitter.cxx:93
 TGSplitter.cxx:94
 TGSplitter.cxx:95
 TGSplitter.cxx:96
 TGSplitter.cxx:97
 TGSplitter.cxx:98
 TGSplitter.cxx:99
 TGSplitter.cxx:100
 TGSplitter.cxx:101
 TGSplitter.cxx:102
 TGSplitter.cxx:103
 TGSplitter.cxx:104
 TGSplitter.cxx:105
 TGSplitter.cxx:106
 TGSplitter.cxx:107
 TGSplitter.cxx:108
 TGSplitter.cxx:109
 TGSplitter.cxx:110
 TGSplitter.cxx:111
 TGSplitter.cxx:112
 TGSplitter.cxx:113
 TGSplitter.cxx:114
 TGSplitter.cxx:115
 TGSplitter.cxx:116
 TGSplitter.cxx:117
 TGSplitter.cxx:118
 TGSplitter.cxx:119
 TGSplitter.cxx:120
 TGSplitter.cxx:121
 TGSplitter.cxx:122
 TGSplitter.cxx:123
 TGSplitter.cxx:124
 TGSplitter.cxx:125
 TGSplitter.cxx:126
 TGSplitter.cxx:127
 TGSplitter.cxx:128
 TGSplitter.cxx:129
 TGSplitter.cxx:130
 TGSplitter.cxx:131
 TGSplitter.cxx:132
 TGSplitter.cxx:133
 TGSplitter.cxx:134
 TGSplitter.cxx:135
 TGSplitter.cxx:136
 TGSplitter.cxx:137
 TGSplitter.cxx:138
 TGSplitter.cxx:139
 TGSplitter.cxx:140
 TGSplitter.cxx:141
 TGSplitter.cxx:142
 TGSplitter.cxx:143
 TGSplitter.cxx:144
 TGSplitter.cxx:145
 TGSplitter.cxx:146
 TGSplitter.cxx:147
 TGSplitter.cxx:148
 TGSplitter.cxx:149
 TGSplitter.cxx:150
 TGSplitter.cxx:151
 TGSplitter.cxx:152
 TGSplitter.cxx:153
 TGSplitter.cxx:154
 TGSplitter.cxx:155
 TGSplitter.cxx:156
 TGSplitter.cxx:157
 TGSplitter.cxx:158
 TGSplitter.cxx:159
 TGSplitter.cxx:160
 TGSplitter.cxx:161
 TGSplitter.cxx:162
 TGSplitter.cxx:163
 TGSplitter.cxx:164
 TGSplitter.cxx:165
 TGSplitter.cxx:166
 TGSplitter.cxx:167
 TGSplitter.cxx:168
 TGSplitter.cxx:169
 TGSplitter.cxx:170
 TGSplitter.cxx:171
 TGSplitter.cxx:172
 TGSplitter.cxx:173
 TGSplitter.cxx:174
 TGSplitter.cxx:175
 TGSplitter.cxx:176
 TGSplitter.cxx:177
 TGSplitter.cxx:178
 TGSplitter.cxx:179
 TGSplitter.cxx:180
 TGSplitter.cxx:181
 TGSplitter.cxx:182
 TGSplitter.cxx:183
 TGSplitter.cxx:184
 TGSplitter.cxx:185
 TGSplitter.cxx:186
 TGSplitter.cxx:187
 TGSplitter.cxx:188
 TGSplitter.cxx:189
 TGSplitter.cxx:190
 TGSplitter.cxx:191
 TGSplitter.cxx:192
 TGSplitter.cxx:193
 TGSplitter.cxx:194
 TGSplitter.cxx:195
 TGSplitter.cxx:196
 TGSplitter.cxx:197
 TGSplitter.cxx:198
 TGSplitter.cxx:199
 TGSplitter.cxx:200
 TGSplitter.cxx:201
 TGSplitter.cxx:202
 TGSplitter.cxx:203
 TGSplitter.cxx:204
 TGSplitter.cxx:205
 TGSplitter.cxx:206
 TGSplitter.cxx:207
 TGSplitter.cxx:208
 TGSplitter.cxx:209
 TGSplitter.cxx:210
 TGSplitter.cxx:211
 TGSplitter.cxx:212
 TGSplitter.cxx:213
 TGSplitter.cxx:214
 TGSplitter.cxx:215
 TGSplitter.cxx:216
 TGSplitter.cxx:217
 TGSplitter.cxx:218
 TGSplitter.cxx:219
 TGSplitter.cxx:220
 TGSplitter.cxx:221
 TGSplitter.cxx:222
 TGSplitter.cxx:223
 TGSplitter.cxx:224
 TGSplitter.cxx:225
 TGSplitter.cxx:226
 TGSplitter.cxx:227
 TGSplitter.cxx:228
 TGSplitter.cxx:229
 TGSplitter.cxx:230
 TGSplitter.cxx:231
 TGSplitter.cxx:232
 TGSplitter.cxx:233
 TGSplitter.cxx:234
 TGSplitter.cxx:235
 TGSplitter.cxx:236
 TGSplitter.cxx:237
 TGSplitter.cxx:238
 TGSplitter.cxx:239
 TGSplitter.cxx:240
 TGSplitter.cxx:241
 TGSplitter.cxx:242
 TGSplitter.cxx:243
 TGSplitter.cxx:244
 TGSplitter.cxx:245
 TGSplitter.cxx:246
 TGSplitter.cxx:247
 TGSplitter.cxx:248
 TGSplitter.cxx:249
 TGSplitter.cxx:250
 TGSplitter.cxx:251
 TGSplitter.cxx:252
 TGSplitter.cxx:253
 TGSplitter.cxx:254
 TGSplitter.cxx:255
 TGSplitter.cxx:256
 TGSplitter.cxx:257
 TGSplitter.cxx:258
 TGSplitter.cxx:259
 TGSplitter.cxx:260
 TGSplitter.cxx:261
 TGSplitter.cxx:262
 TGSplitter.cxx:263
 TGSplitter.cxx:264
 TGSplitter.cxx:265
 TGSplitter.cxx:266
 TGSplitter.cxx:267
 TGSplitter.cxx:268
 TGSplitter.cxx:269
 TGSplitter.cxx:270
 TGSplitter.cxx:271
 TGSplitter.cxx:272
 TGSplitter.cxx:273
 TGSplitter.cxx:274
 TGSplitter.cxx:275
 TGSplitter.cxx:276
 TGSplitter.cxx:277
 TGSplitter.cxx:278
 TGSplitter.cxx:279
 TGSplitter.cxx:280
 TGSplitter.cxx:281
 TGSplitter.cxx:282
 TGSplitter.cxx:283
 TGSplitter.cxx:284
 TGSplitter.cxx:285
 TGSplitter.cxx:286
 TGSplitter.cxx:287
 TGSplitter.cxx:288
 TGSplitter.cxx:289
 TGSplitter.cxx:290
 TGSplitter.cxx:291
 TGSplitter.cxx:292
 TGSplitter.cxx:293
 TGSplitter.cxx:294
 TGSplitter.cxx:295
 TGSplitter.cxx:296
 TGSplitter.cxx:297
 TGSplitter.cxx:298
 TGSplitter.cxx:299
 TGSplitter.cxx:300
 TGSplitter.cxx:301
 TGSplitter.cxx:302
 TGSplitter.cxx:303
 TGSplitter.cxx:304
 TGSplitter.cxx:305
 TGSplitter.cxx:306
 TGSplitter.cxx:307
 TGSplitter.cxx:308
 TGSplitter.cxx:309
 TGSplitter.cxx:310
 TGSplitter.cxx:311
 TGSplitter.cxx:312
 TGSplitter.cxx:313
 TGSplitter.cxx:314
 TGSplitter.cxx:315
 TGSplitter.cxx:316
 TGSplitter.cxx:317
 TGSplitter.cxx:318
 TGSplitter.cxx:319
 TGSplitter.cxx:320
 TGSplitter.cxx:321
 TGSplitter.cxx:322
 TGSplitter.cxx:323
 TGSplitter.cxx:324
 TGSplitter.cxx:325
 TGSplitter.cxx:326
 TGSplitter.cxx:327
 TGSplitter.cxx:328
 TGSplitter.cxx:329
 TGSplitter.cxx:330
 TGSplitter.cxx:331
 TGSplitter.cxx:332
 TGSplitter.cxx:333
 TGSplitter.cxx:334
 TGSplitter.cxx:335
 TGSplitter.cxx:336
 TGSplitter.cxx:337
 TGSplitter.cxx:338
 TGSplitter.cxx:339
 TGSplitter.cxx:340
 TGSplitter.cxx:341
 TGSplitter.cxx:342
 TGSplitter.cxx:343
 TGSplitter.cxx:344
 TGSplitter.cxx:345
 TGSplitter.cxx:346
 TGSplitter.cxx:347
 TGSplitter.cxx:348
 TGSplitter.cxx:349
 TGSplitter.cxx:350
 TGSplitter.cxx:351
 TGSplitter.cxx:352
 TGSplitter.cxx:353
 TGSplitter.cxx:354
 TGSplitter.cxx:355
 TGSplitter.cxx:356
 TGSplitter.cxx:357
 TGSplitter.cxx:358
 TGSplitter.cxx:359
 TGSplitter.cxx:360
 TGSplitter.cxx:361
 TGSplitter.cxx:362
 TGSplitter.cxx:363
 TGSplitter.cxx:364
 TGSplitter.cxx:365
 TGSplitter.cxx:366
 TGSplitter.cxx:367
 TGSplitter.cxx:368
 TGSplitter.cxx:369
 TGSplitter.cxx:370
 TGSplitter.cxx:371
 TGSplitter.cxx:372
 TGSplitter.cxx:373
 TGSplitter.cxx:374
 TGSplitter.cxx:375
 TGSplitter.cxx:376
 TGSplitter.cxx:377
 TGSplitter.cxx:378
 TGSplitter.cxx:379
 TGSplitter.cxx:380
 TGSplitter.cxx:381
 TGSplitter.cxx:382
 TGSplitter.cxx:383
 TGSplitter.cxx:384
 TGSplitter.cxx:385
 TGSplitter.cxx:386
 TGSplitter.cxx:387
 TGSplitter.cxx:388
 TGSplitter.cxx:389
 TGSplitter.cxx:390
 TGSplitter.cxx:391
 TGSplitter.cxx:392
 TGSplitter.cxx:393
 TGSplitter.cxx:394
 TGSplitter.cxx:395
 TGSplitter.cxx:396
 TGSplitter.cxx:397
 TGSplitter.cxx:398
 TGSplitter.cxx:399
 TGSplitter.cxx:400
 TGSplitter.cxx:401
 TGSplitter.cxx:402
 TGSplitter.cxx:403
 TGSplitter.cxx:404
 TGSplitter.cxx:405
 TGSplitter.cxx:406
 TGSplitter.cxx:407
 TGSplitter.cxx:408
 TGSplitter.cxx:409
 TGSplitter.cxx:410
 TGSplitter.cxx:411
 TGSplitter.cxx:412
 TGSplitter.cxx:413
 TGSplitter.cxx:414
 TGSplitter.cxx:415
 TGSplitter.cxx:416
 TGSplitter.cxx:417
 TGSplitter.cxx:418
 TGSplitter.cxx:419
 TGSplitter.cxx:420
 TGSplitter.cxx:421
 TGSplitter.cxx:422
 TGSplitter.cxx:423
 TGSplitter.cxx:424
 TGSplitter.cxx:425
 TGSplitter.cxx:426
 TGSplitter.cxx:427
 TGSplitter.cxx:428
 TGSplitter.cxx:429
 TGSplitter.cxx:430
 TGSplitter.cxx:431
 TGSplitter.cxx:432
 TGSplitter.cxx:433
 TGSplitter.cxx:434
 TGSplitter.cxx:435
 TGSplitter.cxx:436
 TGSplitter.cxx:437
 TGSplitter.cxx:438
 TGSplitter.cxx:439
 TGSplitter.cxx:440
 TGSplitter.cxx:441
 TGSplitter.cxx:442
 TGSplitter.cxx:443
 TGSplitter.cxx:444
 TGSplitter.cxx:445
 TGSplitter.cxx:446
 TGSplitter.cxx:447
 TGSplitter.cxx:448
 TGSplitter.cxx:449
 TGSplitter.cxx:450
 TGSplitter.cxx:451
 TGSplitter.cxx:452
 TGSplitter.cxx:453
 TGSplitter.cxx:454
 TGSplitter.cxx:455
 TGSplitter.cxx:456
 TGSplitter.cxx:457
 TGSplitter.cxx:458
 TGSplitter.cxx:459
 TGSplitter.cxx:460
 TGSplitter.cxx:461
 TGSplitter.cxx:462
 TGSplitter.cxx:463
 TGSplitter.cxx:464
 TGSplitter.cxx:465
 TGSplitter.cxx:466
 TGSplitter.cxx:467
 TGSplitter.cxx:468
 TGSplitter.cxx:469
 TGSplitter.cxx:470
 TGSplitter.cxx:471
 TGSplitter.cxx:472
 TGSplitter.cxx:473
 TGSplitter.cxx:474
 TGSplitter.cxx:475
 TGSplitter.cxx:476
 TGSplitter.cxx:477
 TGSplitter.cxx:478
 TGSplitter.cxx:479
 TGSplitter.cxx:480
 TGSplitter.cxx:481
 TGSplitter.cxx:482
 TGSplitter.cxx:483
 TGSplitter.cxx:484
 TGSplitter.cxx:485
 TGSplitter.cxx:486
 TGSplitter.cxx:487
 TGSplitter.cxx:488
 TGSplitter.cxx:489
 TGSplitter.cxx:490
 TGSplitter.cxx:491
 TGSplitter.cxx:492
 TGSplitter.cxx:493
 TGSplitter.cxx:494
 TGSplitter.cxx:495
 TGSplitter.cxx:496
 TGSplitter.cxx:497
 TGSplitter.cxx:498
 TGSplitter.cxx:499
 TGSplitter.cxx:500
 TGSplitter.cxx:501
 TGSplitter.cxx:502
 TGSplitter.cxx:503
 TGSplitter.cxx:504
 TGSplitter.cxx:505
 TGSplitter.cxx:506
 TGSplitter.cxx:507
 TGSplitter.cxx:508
 TGSplitter.cxx:509
 TGSplitter.cxx:510
 TGSplitter.cxx:511
 TGSplitter.cxx:512
 TGSplitter.cxx:513
 TGSplitter.cxx:514
 TGSplitter.cxx:515
 TGSplitter.cxx:516
 TGSplitter.cxx:517
 TGSplitter.cxx:518
 TGSplitter.cxx:519
 TGSplitter.cxx:520
 TGSplitter.cxx:521
 TGSplitter.cxx:522
 TGSplitter.cxx:523
 TGSplitter.cxx:524
 TGSplitter.cxx:525
 TGSplitter.cxx:526
 TGSplitter.cxx:527
 TGSplitter.cxx:528
 TGSplitter.cxx:529
 TGSplitter.cxx:530
 TGSplitter.cxx:531
 TGSplitter.cxx:532
 TGSplitter.cxx:533
 TGSplitter.cxx:534
 TGSplitter.cxx:535
 TGSplitter.cxx:536
 TGSplitter.cxx:537
 TGSplitter.cxx:538
 TGSplitter.cxx:539
 TGSplitter.cxx:540
 TGSplitter.cxx:541
 TGSplitter.cxx:542
 TGSplitter.cxx:543
 TGSplitter.cxx:544
 TGSplitter.cxx:545
 TGSplitter.cxx:546
 TGSplitter.cxx:547
 TGSplitter.cxx:548
 TGSplitter.cxx:549
 TGSplitter.cxx:550
 TGSplitter.cxx:551
 TGSplitter.cxx:552
 TGSplitter.cxx:553
 TGSplitter.cxx:554
 TGSplitter.cxx:555
 TGSplitter.cxx:556
 TGSplitter.cxx:557
 TGSplitter.cxx:558
 TGSplitter.cxx:559
 TGSplitter.cxx:560
 TGSplitter.cxx:561
 TGSplitter.cxx:562
 TGSplitter.cxx:563
 TGSplitter.cxx:564
 TGSplitter.cxx:565
 TGSplitter.cxx:566
 TGSplitter.cxx:567
 TGSplitter.cxx:568
 TGSplitter.cxx:569
 TGSplitter.cxx:570
 TGSplitter.cxx:571
 TGSplitter.cxx:572
 TGSplitter.cxx:573
 TGSplitter.cxx:574
 TGSplitter.cxx:575
 TGSplitter.cxx:576
 TGSplitter.cxx:577
 TGSplitter.cxx:578
 TGSplitter.cxx:579
 TGSplitter.cxx:580
 TGSplitter.cxx:581
 TGSplitter.cxx:582
 TGSplitter.cxx:583
 TGSplitter.cxx:584
 TGSplitter.cxx:585
 TGSplitter.cxx:586
 TGSplitter.cxx:587
 TGSplitter.cxx:588
 TGSplitter.cxx:589
 TGSplitter.cxx:590
 TGSplitter.cxx:591
 TGSplitter.cxx:592
 TGSplitter.cxx:593
 TGSplitter.cxx:594
 TGSplitter.cxx:595
 TGSplitter.cxx:596
 TGSplitter.cxx:597
 TGSplitter.cxx:598
 TGSplitter.cxx:599
 TGSplitter.cxx:600
 TGSplitter.cxx:601
 TGSplitter.cxx:602
 TGSplitter.cxx:603
 TGSplitter.cxx:604
 TGSplitter.cxx:605
 TGSplitter.cxx:606
 TGSplitter.cxx:607
 TGSplitter.cxx:608
 TGSplitter.cxx:609
 TGSplitter.cxx:610
 TGSplitter.cxx:611
 TGSplitter.cxx:612
 TGSplitter.cxx:613
 TGSplitter.cxx:614
 TGSplitter.cxx:615
 TGSplitter.cxx:616
 TGSplitter.cxx:617
 TGSplitter.cxx:618
 TGSplitter.cxx:619
 TGSplitter.cxx:620
 TGSplitter.cxx:621
 TGSplitter.cxx:622
 TGSplitter.cxx:623
 TGSplitter.cxx:624
 TGSplitter.cxx:625
 TGSplitter.cxx:626
 TGSplitter.cxx:627
 TGSplitter.cxx:628
 TGSplitter.cxx:629
 TGSplitter.cxx:630
 TGSplitter.cxx:631
 TGSplitter.cxx:632
 TGSplitter.cxx:633
 TGSplitter.cxx:634
 TGSplitter.cxx:635
 TGSplitter.cxx:636
 TGSplitter.cxx:637
 TGSplitter.cxx:638
 TGSplitter.cxx:639
 TGSplitter.cxx:640
 TGSplitter.cxx:641
 TGSplitter.cxx:642
 TGSplitter.cxx:643
 TGSplitter.cxx:644
 TGSplitter.cxx:645
 TGSplitter.cxx:646
 TGSplitter.cxx:647
 TGSplitter.cxx:648
 TGSplitter.cxx:649
 TGSplitter.cxx:650
 TGSplitter.cxx:651
 TGSplitter.cxx:652
 TGSplitter.cxx:653
 TGSplitter.cxx:654
 TGSplitter.cxx:655
 TGSplitter.cxx:656
 TGSplitter.cxx:657
 TGSplitter.cxx:658
 TGSplitter.cxx:659
 TGSplitter.cxx:660
 TGSplitter.cxx:661
 TGSplitter.cxx:662
 TGSplitter.cxx:663
 TGSplitter.cxx:664
 TGSplitter.cxx:665
 TGSplitter.cxx:666
 TGSplitter.cxx:667