// @(#)root/gui:$Id$
// Author: Fons Rademakers   19/01/98

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

    This source is based on Xclass95, a Win95-looking GUI toolkit.
    Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.

    Xclass95 is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

**************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGFileIcon, TGFileEntry, TGFSContainer                               //
//                                                                      //
// Utility classes used by the file selection dialog (TGFSDialog).      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGFSContainer.h"
#include "TGIcon.h"
#include "TGMsgBox.h"
#include "TGMimeTypes.h"
#include "TRegexp.h"
#include "TList.h"
#include "TSystem.h"
#include "TGDNDManager.h"
#include "TBufferFile.h"
#include "Riostream.h"
#include "TRemoteObject.h"
#include "TImage.h"
#include <time.h>

ClassImp(TGFileItem)
ClassImp(TGFileContainer)

class TViewUpdateTimer : public TTimer {

private:
   TGFileContainer   *fContainer;

public:
   TViewUpdateTimer(TGFileContainer *t, Long_t ms) : TTimer(ms, kTRUE) { fContainer = t; }
   Bool_t Notify();
};



class TGFileIcon : public TGIcon {

protected:
   const TGPicture *fLpic;   // icon picture

   virtual void DoRedraw();

public:
   TGFileIcon(const TGWindow *p, const TGPicture *pic, const TGPicture *lpic,
              UInt_t options = kChildFrame, Pixel_t back = GetWhitePixel()) :
      TGIcon(p, pic, 0, 0, options, back) { fLpic = lpic; }
};



//______________________________________________________________________________
class TGFSFrameElement : public TGFrameElement {
public:
   TGFileContainer  *fContainer;   // file container

   Bool_t IsSortable() const { return kTRUE; }
   Int_t  Compare(const TObject *obj) const;
};

//______________________________________________________________________________
Int_t TGFSFrameElement::Compare(const TObject *obj) const
{
   // Sort frame elements in file selection list view container.

   Int_t type1, type2;

   TGFileItem *f1 = (TGFileItem *) fFrame;
   TGFileItem *f2 = (TGFileItem *) ((TGFrameElement *) obj)->fFrame;

   switch (fContainer->fSortType) {
      default:
      case kSortByName:
         //--- this is not exactly what I want...
         type1 = f1->GetType();
         type2 = f2->GetType();

         //--- use posix macros
         if (R_ISDIR(type1)) type1 = 1;
         else                type1 = 6;

         if (R_ISDIR(type2)) type2 = 1;
         else                type2 = 6;

         if (type1 < type2)  return -1;
         if (type1 > type2)  return  1;
         return strcmp(f1->GetItemName()->GetString(),
                       f2->GetItemName()->GetString());

      case kSortByOwner:
         if (f1->GetUid() != f2->GetUid()) {
            if (f1->GetUid() < f2->GetUid())
               return -1;
            else
               return +1;
         }

         // else sort by name
         type1 = f1->GetType();
         type2 = f2->GetType();

         //--- use posix macros
         if (R_ISDIR(type1)) type1 = 1;
         else                type1 = 6;

         if (R_ISDIR(type2)) type2 = 1;
         else                type2 = 6;

         if (type1 < type2)  return -1;
         if (type1 > type2)  return  1;
         return strcmp(f1->GetItemName()->GetString(),
                       f2->GetItemName()->GetString());

      case kSortByGroup:
         if (f1->GetGid() != f2->GetGid()) {
            if (f1->GetGid() < f2->GetGid())
               return -1;
            else
               return +1;
         }

         // else sort by name
         type1 = f1->GetType();
         type2 = f2->GetType();

         //--- use posix macros
         if (R_ISDIR(type1)) type1 = 1;
         else                type1 = 6;

         if (R_ISDIR(type2)) type2 = 1;
         else                type2 = 6;

         if (type1 < type2)  return -1;
         if (type1 > type2)  return  1;
         return strcmp(f1->GetItemName()->GetString(),
                       f2->GetItemName()->GetString());

      case kSortByType:
         //--- this is not exactly what I want...

         type1 = f1->GetType();
         type2 = f2->GetType();

         //--- use posix macros

         if (R_ISDIR(type1))         type1 = 1;
         else if (R_ISLNK(type1))    type1 = 2;
         else if (R_ISSOCK(type1))   type1 = 3;
         else if (R_ISFIFO(type1))   type1 = 4;
         else if (R_ISREG(type1) && (type1 & kS_IXUSR)) type1 = 5;
         else                        type1 = 6;

         if (R_ISDIR(type2))         type2 = 1;
         else if (R_ISLNK(type2))    type2 = 2;
         else if (R_ISSOCK(type2))   type2 = 3;
         else if (R_ISFIFO(type2))   type2 = 4;
         else if (R_ISREG(type2) && (type2 & kS_IXUSR)) type2 = 5;
         else                        type2 = 6;

         if (type1 < type2) return -1;
         if (type1 > type2) return 1;
         return strcmp(f1->GetItemName()->GetString(),
                       f2->GetItemName()->GetString());

      case kSortBySize:
         if (f1->GetSize() < f2->GetSize()) return -1;
         if (f1->GetSize() > f2->GetSize()) return 1;
         return strcmp(f1->GetItemName()->GetString(),
                       f2->GetItemName()->GetString());

      case kSortByDate:
         time_t loctimeF1 = (time_t) f1->GetModTime();
         // coverity[returned_null]
         struct tm tmF1 = *localtime(&loctimeF1);

         time_t loctimeF2 = (time_t) f2->GetModTime();
         // coverity[returned_null]
         struct tm tmF2 = *localtime(&loctimeF2);

         if ( tmF1.tm_year != tmF2.tm_year )
            return (tmF1.tm_year < tmF2.tm_year) ? +1 : -1;
         else if ( tmF1.tm_mon != tmF2.tm_mon )
            return (tmF1.tm_mon < tmF2.tm_mon) ? +1 : -1;
         else if ( tmF1.tm_mday != tmF2.tm_mday )
            return (tmF1.tm_mday < tmF2.tm_mday) ? +1 : -1;
         else if ( tmF1.tm_hour != tmF2.tm_hour )
            return (tmF1.tm_hour < tmF2.tm_hour) ? +1 : -1;
         else if ( tmF1.tm_min != tmF2.tm_min )
            return (tmF1.tm_min < tmF2.tm_min) ? +1 : -1;
         else if ( tmF1.tm_sec != tmF2.tm_sec )
            return (tmF1.tm_sec < tmF2.tm_sec) ? +1 : -1;
         else
            return 0;
   }
}


//______________________________________________________________________________
Bool_t TViewUpdateTimer::Notify()
{
   // Reset the timer.

   fContainer->HandleTimer(0);
   Reset();
   return kFALSE;
}


//______________________________________________________________________________
void TGFileIcon::DoRedraw()
{
   // Draw icon.

   TGIcon::DoRedraw();
   if (fLpic) fLpic->Draw(fId, GetBckgndGC()(), 0, 0);
}


//______________________________________________________________________________
TGFileItem::TGFileItem(const TGWindow *p,
                       const TGPicture *bpic, const TGPicture *blpic,
                       const TGPicture *spic, const TGPicture *slpic,
                       TGString *name, Int_t type, Long64_t size, Int_t uid,
                       Int_t gid, Long_t modtime, EListViewMode viewMode,
                       UInt_t options, ULong_t back) :
   TGLVEntry(p, bpic, spic, name, 0, viewMode, options, back)
{
   // Create a list view item.

   FileStat_t buf;

   buf.fMode   = type;
   buf.fSize   = size;
   buf.fUid    = uid;
   buf.fGid    = gid;
   buf.fMtime  = modtime;
   buf.fIsLink = (blpic != 0);  // FIXME: hack...

   Init(blpic, slpic, buf, viewMode);
}

//______________________________________________________________________________
TGFileItem::TGFileItem(const TGWindow *p,
                       const TGPicture *bpic, const TGPicture *blpic,
                       const TGPicture *spic, const TGPicture *slpic,
                       TGString *name, FileStat_t &stat, EListViewMode viewMode,
                       UInt_t options, ULong_t back) :
   TGLVEntry(p, bpic, spic, name, 0, viewMode, options, back)
{
   // Create a list view item.

   Init(blpic, slpic, stat, viewMode);
}

//______________________________________________________________________________
void TGFileItem::Init(const TGPicture *blpic, const TGPicture *slpic,
                      FileStat_t &stat, EListViewMode viewMode)
{
   // Common initializer for file list view item.

   char tmp[256];
   Long64_t fsize, bsize;

   fBuf = 0;
   fDNDData.fData = 0;
   fDNDData.fDataLength = 0;
   fDNDData.fDataType = 0;
   fLcurrent =
   fBlpic = blpic;
   fSlpic = slpic;

   fViewMode = (EListViewMode) -1;
   SetViewMode(viewMode);

   fType    = stat.fMode;
   fSize    = stat.fSize;
   fUid     = stat.fUid;
   fGid     = stat.fGid;
   fModTime = stat.fMtime;
   fIsLink  = stat.fIsLink;

   fSubnames = new TGString* [6];

   // file type
   snprintf(tmp, sizeof(tmp), "%c%c%c%c%c%c%c%c%c%c",
            (fIsLink ?
             'l' :
             R_ISREG(fType) ?
             '-' :
             (R_ISDIR(fType) ?
              'd' :
              (R_ISCHR(fType) ?
               'c' :
               (R_ISBLK(fType) ?
                'b' :
                (R_ISFIFO(fType) ?
                 'p' :
                 (R_ISSOCK(fType) ?
                  's' : '?' )))))),
            ((fType & kS_IRUSR) ? 'r' : '-'),
            ((fType & kS_IWUSR) ? 'w' : '-'),
            ((fType & kS_ISUID) ? 's' : ((fType & kS_IXUSR) ? 'x' : '-')),
            ((fType & kS_IRGRP) ? 'r' : '-'),
            ((fType & kS_IWGRP) ? 'w' : '-'),
            ((fType & kS_ISGID) ? 's' : ((fType & kS_IXGRP) ? 'x' : '-')),
            ((fType & kS_IROTH) ? 'r' : '-'),
            ((fType & kS_IWOTH) ? 'w' : '-'),
            ((fType & kS_ISVTX) ? 't' : ((fType & kS_IXOTH) ? 'x' : '-')));
   fSubnames[0] = new TGString(tmp);

   // file size
   fsize = bsize = fSize;
   if (fsize > 1024) {
      fsize /= 1024;
      if (fsize > 1024) {
         // 3.7MB is more informative than just 3MB
         snprintf(tmp, sizeof(tmp), "%lld.%lldM", fsize/1024, (fsize%1024)/103);
      } else {
         snprintf(tmp, sizeof(tmp), "%lld.%lldK", bsize/1024, (bsize%1024)/103);
      }
   } else {
      snprintf(tmp, sizeof(tmp), "%lld", bsize);
   }
   fSubnames[1] = new TGString(tmp);

   {
      struct UserGroup_t *user_group;

      user_group = gSystem->GetUserInfo(fUid);
      if (user_group) {
         fSubnames[2] = new TGString(user_group->fUser);
         fSubnames[3] = new TGString(user_group->fGroup);
         delete user_group;
      } else {
         fSubnames[2] = new TGString(TString::Format("%d", fUid));
         fSubnames[3] = new TGString(TString::Format("%d", fGid));
      }
   }

   struct tm *newtime;
   time_t loctime = (time_t) fModTime;
   newtime = localtime(&loctime);
   if (newtime) {
      snprintf(tmp, sizeof(tmp), "%d-%02d-%02d %02d:%02d", newtime->tm_year + 1900,
               newtime->tm_mon+1, newtime->tm_mday, newtime->tm_hour,
               newtime->tm_min);
      fSubnames[4] = new TGString(tmp);
   }
   else
      fSubnames[4] = new TGString("1901-01-01 00:00");

   fSubnames[5] = 0;

   int i;
   for (i = 0; fSubnames[i] != 0; ++i)
      ;
   fCtw = new int[i+1];
   fCtw[i] = 0;
   for (i = 0; fSubnames[i] != 0; ++i)
      fCtw[i] = gVirtualX->TextWidth(fFontStruct, fSubnames[i]->GetString(),
                                     fSubnames[i]->GetLength());

   SetWindowName();
}

//______________________________________________________________________________
TGFileItem::~TGFileItem()
{
   // Destructor.

   delete fBuf;
}

//______________________________________________________________________________
void TGFileItem::SetViewMode(EListViewMode viewMode)
{
   // Set container item view mode.

   TGLVEntry::SetViewMode(viewMode);

   if (viewMode == kLVLargeIcons)
      fLcurrent = fBlpic;
   else
      fLcurrent = fSlpic;

   if (fClient) fClient->NeedRedraw(this);
}

//______________________________________________________________________________
void TGFileItem::DoRedraw()
{
   // Draw list view container item.

   int ix, iy;

   TGLVEntry::DoRedraw();
   if (!fLcurrent) return;

   if (fViewMode == kLVLargeIcons) {
      ix = (fWidth - fLcurrent->GetWidth()) >> 1;
      iy = 0;
   } else {
      ix = 0;
      iy = (fHeight - fLcurrent->GetHeight()) >> 1;
   }

   fLcurrent->Draw(fId, fNormGC, ix, iy);
}


//______________________________________________________________________________
TGFileContainer::TGFileContainer(const TGWindow *p, UInt_t w, UInt_t h,
                                 UInt_t options, ULong_t back) :
   TGLVContainer(p, w, h, options, back)
{
   // Create a list view container which will hold the contents of
   // the current directory.

   fSortType  = kSortByName;
   fFilter    = 0;
   fMtime     = 0;
   fDirectory = gSystem->WorkingDirectory();
   fRefresh   = new TViewUpdateTimer(this, 1000);
   gSystem->AddTimer(fRefresh);
   fCachePictures = kTRUE;
   fDisplayStat   = kTRUE;
   fCleanups  = new TList;

   fFolder_s = fClient->GetPicture("folder_s.xpm");
   fFolder_t = fClient->GetPicture("folder_t.xpm");
   fApp_s    = fClient->GetPicture("app_s.xpm");
   fApp_t    = fClient->GetPicture("app_t.xpm");
   fDoc_s    = fClient->GetPicture("doc_s.xpm");
   fDoc_t    = fClient->GetPicture("doc_t.xpm");
   fSlink_s  = fClient->GetPicture("slink_s.xpm");
   fSlink_t  = fClient->GetPicture("slink_t.xpm");

   if (!fFolder_s || !fFolder_t ||
       !fApp_s    || !fApp_t    ||
       !fDoc_s    || !fDoc_t    ||
       !fSlink_s  || !fSlink_t)
      Error("TGFileContainer", "required pixmap(s) missing\n");

   SetWindowName();
}

//______________________________________________________________________________
TGFileContainer::TGFileContainer(TGCanvas *p, UInt_t options, ULong_t back) :
   TGLVContainer(p,options, back)
{
   // Create a list view container which will hold the contents of
   // the current directory.

   fSortType  = kSortByName;
   fFilter    = 0;
   fMtime     = 0;
   fDirectory = gSystem->WorkingDirectory();
   fRefresh   = new TViewUpdateTimer(this, 1000);
   gSystem->AddTimer(fRefresh);
   fCachePictures = kTRUE;
   fDisplayStat   = kTRUE;
   fCleanups  = new TList;

   fFolder_s = fClient->GetPicture("folder_s.xpm");
   fFolder_t = fClient->GetPicture("folder_t.xpm");
   fApp_s    = fClient->GetPicture("app_s.xpm");
   fApp_t    = fClient->GetPicture("app_t.xpm");
   fDoc_s    = fClient->GetPicture("doc_s.xpm");
   fDoc_t    = fClient->GetPicture("doc_t.xpm");
   fSlink_s  = fClient->GetPicture("slink_s.xpm");
   fSlink_t  = fClient->GetPicture("slink_t.xpm");

   if (!fFolder_s || !fFolder_t ||
       !fApp_s    || !fApp_t    ||
       !fDoc_s    || !fDoc_t    ||
       !fSlink_s  || !fSlink_t)
      Error("TGFileContainer", "required pixmap(s) missing\n");

   SetWindowName();
}

//______________________________________________________________________________
TGFileContainer::~TGFileContainer()
{
   // Delete list view file container.

   if (fRefresh) delete fRefresh;
   if (fFilter)  delete fFilter;
   fClient->FreePicture(fFolder_s);
   fClient->FreePicture(fFolder_t);
   fClient->FreePicture(fApp_s);
   fClient->FreePicture(fApp_t);
   fClient->FreePicture(fDoc_s);
   fClient->FreePicture(fDoc_t);
   fClient->FreePicture(fSlink_s);
   fClient->FreePicture(fSlink_t);
   if (fCleanups) {
      TGPicture *pic;
      TIter nextp(fCleanups);
      while ((pic = (TGPicture *)nextp())) {
         fClient->GetPicturePool()->FreePicture(pic);
      }
      fCleanups->Clear();
      delete fCleanups;
   }
}

//______________________________________________________________________________
void TGFileContainer::AddFrame(TGFrame *f, TGLayoutHints *l)
{
   // Add frame to the composite frame.

   TGFSFrameElement *nw;

   nw = new TGFSFrameElement;
   nw->fFrame     = f;
   nw->fLayout    = l ? l : fgDefaultHints;
   nw->fState     = 1;
   nw->fContainer = this;
   fList->Add(nw);
}

//______________________________________________________________________________
Bool_t TGFileContainer::HandleTimer(TTimer *)
{
   // Refresh container contents. Check every 5 seconds to see if the
   // directory modification date has changed.

   FileStat_t sbuf;

   if (gSystem->GetPathInfo(fDirectory, sbuf) == 0)
      if (fMtime != (ULong_t)sbuf.fMtime) DisplayDirectory();

   return kTRUE;
}

//______________________________________________________________________________
void TGFileContainer::SetFilter(const char *filter)
{
   // Set file selection filter.

   if (fFilter) delete fFilter;
   fFilter = new TRegexp(filter, kTRUE);
}

//______________________________________________________________________________
void TGFileContainer::Sort(EFSSortMode sortType)
{
   // Sort file system list view container according to sortType.

   fSortType = sortType;

   fList->Sort();

   TGCanvas *canvas = (TGCanvas *) this->GetParent()->GetParent();
   canvas->Layout();
}

//______________________________________________________________________________
void TGFileContainer::GetFilePictures(const TGPicture **pic,
             const TGPicture **lpic, Int_t file_type, Bool_t is_link,
             const char *name, Bool_t /*small*/)
{
   // Determine the file picture for the given file type.

   static TString cached_ext;
   static const TGPicture *cached_spic = 0;
   static const TGPicture *cached_lpic = 0;
   const char *ext = name ? strrchr(name, '.') : 0;
   *pic = 0;
   *lpic = 0;

   if (fCachePictures && ext && cached_spic && cached_lpic && (cached_ext == ext)) {
      *pic = cached_spic;
      *lpic = cached_lpic;
      if (!is_link) return;
   }

   if (R_ISREG(file_type)) {
      TString fname(name);
      if (is_link && fname.EndsWith(".lnk")) {
         fname.Remove(fname.Length()-4);
      }
      *pic = fClient->GetMimeTypeList()->GetIcon(fname.Data(), kTRUE);
      *lpic = fClient->GetMimeTypeList()->GetIcon(fname.Data(), kFALSE);

      if (*pic) {
         if (!*lpic) *lpic = *pic;
         if (ext) {
            cached_ext = ext;
            cached_spic = *pic;
            cached_lpic = *lpic;
            if (!is_link) return;
         }
      }
   } else {
      *pic = 0;
   }

   if (*pic == 0) {
      *pic = fDoc_t;
      *lpic = fDoc_s;

      if (R_ISREG(file_type) && (file_type) & kS_IXUSR) {
         *pic = fApp_t;
         *lpic = fApp_s;
      }
      if (R_ISDIR(file_type)) {
         *pic = fFolder_t;
         *lpic = fFolder_s;
      }
   }
   if (is_link) {
      TImage *img1, *img2;
      if (*pic && *lpic) {
         TString lnk_name;
         img1 = TImage::Create();
         if (img1) {
            img1->SetImage(((const TGPicture *)*pic)->GetPicture(),
                           ((const TGPicture *)*pic)->GetMask());
            img2 = TImage::Open("slink_t.xpm");
            if (img2) img1->Merge(img2);
            lnk_name = ((const TGPicture *)*pic)->GetName();
            lnk_name.Prepend("lnk_");
            *pic = fClient->GetPicturePool()->GetPicture(lnk_name.Data(),
                                 img1->GetPixmap(), img1->GetMask());
            fCleanups->Add(((TObject *)*pic));
            if (img2) delete img2; delete img1;
         }
         img1 = TImage::Create();
         if (img1) {
            img1->SetImage(((const TGPicture *)*lpic)->GetPicture(),
                           ((const TGPicture *)*lpic)->GetMask());
            img2 = TImage::Open("slink_s.xpm");
            if (img2) img1->Merge(img2);
            lnk_name = ((const TGPicture *)*lpic)->GetName();
            lnk_name.Prepend("lnk_");
            *lpic = fClient->GetPicturePool()->GetPicture(lnk_name.Data(),
                                 img1->GetPixmap(), img1->GetMask());
            fCleanups->Add(((TObject *)*lpic));
            if (img2) delete img2; delete img1;
         }
      }
      else {
         *pic = fSlink_t;
         *lpic = fSlink_s;
      }
   }

   cached_lpic = 0;
   cached_spic = 0;
   cached_ext = "";
}

//______________________________________________________________________________
void TGFileContainer::ChangeDirectory(const char *path)
{
   // Change current directory.

   TString savdir = gSystem->WorkingDirectory();
   gSystem->ChangeDirectory(fDirectory.Data());   // so path of ".." will work
   if (gSystem->ChangeDirectory(gSystem->ExpandPathName(path))) {
      fDirectory = gSystem->WorkingDirectory();
      gSystem->ChangeDirectory(savdir.Data());
      DisplayDirectory();
   }
}

//______________________________________________________________________________
void TGFileContainer::DisplayDirectory()
{
   // Display the contents of the current directory in the container.
   // This can be used to refresh the contents of the window.

   RemoveAll();
   CreateFileList();

   // This automatically calls layout
   Sort(fSortType);

   // Make TGExplorerMainFrame display total objects in status bar
   SendMessage(fMsgWindow, MK_MSG(kC_CONTAINER, kCT_SELCHANGED),
               fTotal, fSelected);

   MapSubwindows();
}

//______________________________________________________________________________
void TGFileContainer::CreateFileList()
{
   // This function creates the file list from current dir.

   TString savdir = gSystem->WorkingDirectory();
   if (!gSystem->ChangeDirectory(fDirectory.Data())) return;

   FileStat_t sbuf;
   if (gSystem->GetPathInfo(".", sbuf) == 0)
      fMtime = sbuf.fMtime;

   void *dirp;
   if ((dirp = gSystem->OpenDirectory(".")) == 0) {
      gSystem->ChangeDirectory(savdir.Data());
      return;
   }

   const char *name;
   while ((name = gSystem->GetDirEntry(dirp)) != 0 && fDisplayStat) {
      if (strcmp(name, ".") && strcmp(name, ".."))
         AddFile(name);
      gSystem->ProcessEvents();
   }
   gSystem->FreeDirectory(dirp);

   gSystem->ChangeDirectory(savdir.Data());
}

//______________________________________________________________________________
TGFileItem *TGFileContainer::AddFile(const char *name,  const TGPicture *ipic,
                                     const TGPicture *ilpic)
{
   // Add file in container.

   TString     filename;
   TGFileItem *item = 0;
   const TGPicture *spic, *slpic;
   TGPicture *pic, *lpic;

   FileStat_t sbuf;

   if (gSystem->GetPathInfo(name, sbuf)) {
      if (sbuf.fIsLink) {
         Info("AddFile", "Broken symlink of %s.", name);
      } else {
         TString msg;
         msg.Form("Can't read file attributes of \"%s\": %s.",
                  name, gSystem->GetError());
         new TGMsgBox(fClient->GetDefaultRoot(), GetMainFrame(),
                      "Error", msg.Data(), kMBIconStop, kMBOk);
      }
      return item;
   }

   filename = name;
   if (R_ISDIR(sbuf.fMode) || fFilter == 0 ||
       (fFilter && filename.Index(*fFilter) != kNPOS)) {

      if (ipic && ilpic) { // dynamic icons
         spic = ipic;
         slpic = ilpic;
      } else {
         GetFilePictures(&spic, &slpic, sbuf.fMode, sbuf.fIsLink, name, kTRUE);
      }

      pic = (TGPicture*)spic; pic->AddReference();
      lpic = (TGPicture*)slpic; lpic->AddReference();

      item = new TGFileItem(this, lpic, slpic, spic, pic,
                            new TGString(gSystem->BaseName(name)),
                            sbuf, fViewMode);
      AddItem(item);
   }

   return item;
}

//______________________________________________________________________________
TGFileItem *TGFileContainer::AddRemoteFile(TObject *obj, const TGPicture *ipic,
                                           const TGPicture *ilpic)
{
   // Add remote file in container.

   TString     filename;
   TGFileItem *item = 0;
   const TGPicture *spic, *slpic;
   TGPicture *pic, *lpic;

   FileStat_t sbuf;

   TRemoteObject *robj = (TRemoteObject *)obj;

   robj->GetFileStat(&sbuf);
   filename = robj->GetName();

   if (R_ISDIR(sbuf.fMode) || fFilter == 0 ||
       (fFilter && filename.Index(*fFilter) != kNPOS)) {

      if (ipic && ilpic) { // dynamic icons
         spic = ipic;
         slpic = ilpic;
      } else {
         GetFilePictures(&spic, &slpic, sbuf.fMode, sbuf.fIsLink, filename, kTRUE);
      }

      pic = (TGPicture*)spic; pic->AddReference();
      lpic = (TGPicture*)slpic; lpic->AddReference();

      item = new TGFileItem(this, lpic, slpic, spic, pic, new TGString(filename),
                            sbuf, fViewMode);
      AddItem(item);
   }
   return item;
}

//______________________________________________________________________________
void TGFileContainer::StopRefreshTimer()
{
   // stop refresh  timer

   if (fRefresh) delete fRefresh;
   fRefresh = 0;
}

//______________________________________________________________________________
void TGFileContainer::StartRefreshTimer(ULong_t msec)
{
   // start refreshing

   fRefresh = new TViewUpdateTimer(this, msec);
   gSystem->AddTimer(fRefresh);
}

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

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

   char quote = '"';
   out << std::endl << "   // container frame" << std::endl;
   out << "   TGFileContainer *";

   if ((fParent->GetParent())->InheritsFrom(TGCanvas::Class())) {
      out << GetName() << " = new TGFileContainer(" << GetCanvas()->GetName();
   } else {
      out << GetName() << " = new TGFileContainer(" << fParent->GetName();
      out << "," << GetWidth() << "," << GetHeight();
   }

   if (fBackground == GetDefaultFrameBackground()) {
      if (GetOptions() == kSunkenFrame) {
         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 << "   " << GetCanvas()->GetName() << "->SetContainer("
                << GetName() << ");" << std::endl;
   out << "   " << GetName() << "->DisplayDirectory();" << std::endl;
   out << "   " << GetName() << "->AddFile("<< quote << ".." << quote << ");" << std::endl;
   out << "   " << GetName() << "->StopRefreshTimer();" << std::endl;
}
 TGFSContainer.cxx:1
 TGFSContainer.cxx:2
 TGFSContainer.cxx:3
 TGFSContainer.cxx:4
 TGFSContainer.cxx:5
 TGFSContainer.cxx:6
 TGFSContainer.cxx:7
 TGFSContainer.cxx:8
 TGFSContainer.cxx:9
 TGFSContainer.cxx:10
 TGFSContainer.cxx:11
 TGFSContainer.cxx:12
 TGFSContainer.cxx:13
 TGFSContainer.cxx:14
 TGFSContainer.cxx:15
 TGFSContainer.cxx:16
 TGFSContainer.cxx:17
 TGFSContainer.cxx:18
 TGFSContainer.cxx:19
 TGFSContainer.cxx:20
 TGFSContainer.cxx:21
 TGFSContainer.cxx:22
 TGFSContainer.cxx:23
 TGFSContainer.cxx:24
 TGFSContainer.cxx:25
 TGFSContainer.cxx:26
 TGFSContainer.cxx:27
 TGFSContainer.cxx:28
 TGFSContainer.cxx:29
 TGFSContainer.cxx:30
 TGFSContainer.cxx:31
 TGFSContainer.cxx:32
 TGFSContainer.cxx:33
 TGFSContainer.cxx:34
 TGFSContainer.cxx:35
 TGFSContainer.cxx:36
 TGFSContainer.cxx:37
 TGFSContainer.cxx:38
 TGFSContainer.cxx:39
 TGFSContainer.cxx:40
 TGFSContainer.cxx:41
 TGFSContainer.cxx:42
 TGFSContainer.cxx:43
 TGFSContainer.cxx:44
 TGFSContainer.cxx:45
 TGFSContainer.cxx:46
 TGFSContainer.cxx:47
 TGFSContainer.cxx:48
 TGFSContainer.cxx:49
 TGFSContainer.cxx:50
 TGFSContainer.cxx:51
 TGFSContainer.cxx:52
 TGFSContainer.cxx:53
 TGFSContainer.cxx:54
 TGFSContainer.cxx:55
 TGFSContainer.cxx:56
 TGFSContainer.cxx:57
 TGFSContainer.cxx:58
 TGFSContainer.cxx:59
 TGFSContainer.cxx:60
 TGFSContainer.cxx:61
 TGFSContainer.cxx:62
 TGFSContainer.cxx:63
 TGFSContainer.cxx:64
 TGFSContainer.cxx:65
 TGFSContainer.cxx:66
 TGFSContainer.cxx:67
 TGFSContainer.cxx:68
 TGFSContainer.cxx:69
 TGFSContainer.cxx:70
 TGFSContainer.cxx:71
 TGFSContainer.cxx:72
 TGFSContainer.cxx:73
 TGFSContainer.cxx:74
 TGFSContainer.cxx:75
 TGFSContainer.cxx:76
 TGFSContainer.cxx:77
 TGFSContainer.cxx:78
 TGFSContainer.cxx:79
 TGFSContainer.cxx:80
 TGFSContainer.cxx:81
 TGFSContainer.cxx:82
 TGFSContainer.cxx:83
 TGFSContainer.cxx:84
 TGFSContainer.cxx:85
 TGFSContainer.cxx:86
 TGFSContainer.cxx:87
 TGFSContainer.cxx:88
 TGFSContainer.cxx:89
 TGFSContainer.cxx:90
 TGFSContainer.cxx:91
 TGFSContainer.cxx:92
 TGFSContainer.cxx:93
 TGFSContainer.cxx:94
 TGFSContainer.cxx:95
 TGFSContainer.cxx:96
 TGFSContainer.cxx:97
 TGFSContainer.cxx:98
 TGFSContainer.cxx:99
 TGFSContainer.cxx:100
 TGFSContainer.cxx:101
 TGFSContainer.cxx:102
 TGFSContainer.cxx:103
 TGFSContainer.cxx:104
 TGFSContainer.cxx:105
 TGFSContainer.cxx:106
 TGFSContainer.cxx:107
 TGFSContainer.cxx:108
 TGFSContainer.cxx:109
 TGFSContainer.cxx:110
 TGFSContainer.cxx:111
 TGFSContainer.cxx:112
 TGFSContainer.cxx:113
 TGFSContainer.cxx:114
 TGFSContainer.cxx:115
 TGFSContainer.cxx:116
 TGFSContainer.cxx:117
 TGFSContainer.cxx:118
 TGFSContainer.cxx:119
 TGFSContainer.cxx:120
 TGFSContainer.cxx:121
 TGFSContainer.cxx:122
 TGFSContainer.cxx:123
 TGFSContainer.cxx:124
 TGFSContainer.cxx:125
 TGFSContainer.cxx:126
 TGFSContainer.cxx:127
 TGFSContainer.cxx:128
 TGFSContainer.cxx:129
 TGFSContainer.cxx:130
 TGFSContainer.cxx:131
 TGFSContainer.cxx:132
 TGFSContainer.cxx:133
 TGFSContainer.cxx:134
 TGFSContainer.cxx:135
 TGFSContainer.cxx:136
 TGFSContainer.cxx:137
 TGFSContainer.cxx:138
 TGFSContainer.cxx:139
 TGFSContainer.cxx:140
 TGFSContainer.cxx:141
 TGFSContainer.cxx:142
 TGFSContainer.cxx:143
 TGFSContainer.cxx:144
 TGFSContainer.cxx:145
 TGFSContainer.cxx:146
 TGFSContainer.cxx:147
 TGFSContainer.cxx:148
 TGFSContainer.cxx:149
 TGFSContainer.cxx:150
 TGFSContainer.cxx:151
 TGFSContainer.cxx:152
 TGFSContainer.cxx:153
 TGFSContainer.cxx:154
 TGFSContainer.cxx:155
 TGFSContainer.cxx:156
 TGFSContainer.cxx:157
 TGFSContainer.cxx:158
 TGFSContainer.cxx:159
 TGFSContainer.cxx:160
 TGFSContainer.cxx:161
 TGFSContainer.cxx:162
 TGFSContainer.cxx:163
 TGFSContainer.cxx:164
 TGFSContainer.cxx:165
 TGFSContainer.cxx:166
 TGFSContainer.cxx:167
 TGFSContainer.cxx:168
 TGFSContainer.cxx:169
 TGFSContainer.cxx:170
 TGFSContainer.cxx:171
 TGFSContainer.cxx:172
 TGFSContainer.cxx:173
 TGFSContainer.cxx:174
 TGFSContainer.cxx:175
 TGFSContainer.cxx:176
 TGFSContainer.cxx:177
 TGFSContainer.cxx:178
 TGFSContainer.cxx:179
 TGFSContainer.cxx:180
 TGFSContainer.cxx:181
 TGFSContainer.cxx:182
 TGFSContainer.cxx:183
 TGFSContainer.cxx:184
 TGFSContainer.cxx:185
 TGFSContainer.cxx:186
 TGFSContainer.cxx:187
 TGFSContainer.cxx:188
 TGFSContainer.cxx:189
 TGFSContainer.cxx:190
 TGFSContainer.cxx:191
 TGFSContainer.cxx:192
 TGFSContainer.cxx:193
 TGFSContainer.cxx:194
 TGFSContainer.cxx:195
 TGFSContainer.cxx:196
 TGFSContainer.cxx:197
 TGFSContainer.cxx:198
 TGFSContainer.cxx:199
 TGFSContainer.cxx:200
 TGFSContainer.cxx:201
 TGFSContainer.cxx:202
 TGFSContainer.cxx:203
 TGFSContainer.cxx:204
 TGFSContainer.cxx:205
 TGFSContainer.cxx:206
 TGFSContainer.cxx:207
 TGFSContainer.cxx:208
 TGFSContainer.cxx:209
 TGFSContainer.cxx:210
 TGFSContainer.cxx:211
 TGFSContainer.cxx:212
 TGFSContainer.cxx:213
 TGFSContainer.cxx:214
 TGFSContainer.cxx:215
 TGFSContainer.cxx:216
 TGFSContainer.cxx:217
 TGFSContainer.cxx:218
 TGFSContainer.cxx:219
 TGFSContainer.cxx:220
 TGFSContainer.cxx:221
 TGFSContainer.cxx:222
 TGFSContainer.cxx:223
 TGFSContainer.cxx:224
 TGFSContainer.cxx:225
 TGFSContainer.cxx:226
 TGFSContainer.cxx:227
 TGFSContainer.cxx:228
 TGFSContainer.cxx:229
 TGFSContainer.cxx:230
 TGFSContainer.cxx:231
 TGFSContainer.cxx:232
 TGFSContainer.cxx:233
 TGFSContainer.cxx:234
 TGFSContainer.cxx:235
 TGFSContainer.cxx:236
 TGFSContainer.cxx:237
 TGFSContainer.cxx:238
 TGFSContainer.cxx:239
 TGFSContainer.cxx:240
 TGFSContainer.cxx:241
 TGFSContainer.cxx:242
 TGFSContainer.cxx:243
 TGFSContainer.cxx:244
 TGFSContainer.cxx:245
 TGFSContainer.cxx:246
 TGFSContainer.cxx:247
 TGFSContainer.cxx:248
 TGFSContainer.cxx:249
 TGFSContainer.cxx:250
 TGFSContainer.cxx:251
 TGFSContainer.cxx:252
 TGFSContainer.cxx:253
 TGFSContainer.cxx:254
 TGFSContainer.cxx:255
 TGFSContainer.cxx:256
 TGFSContainer.cxx:257
 TGFSContainer.cxx:258
 TGFSContainer.cxx:259
 TGFSContainer.cxx:260
 TGFSContainer.cxx:261
 TGFSContainer.cxx:262
 TGFSContainer.cxx:263
 TGFSContainer.cxx:264
 TGFSContainer.cxx:265
 TGFSContainer.cxx:266
 TGFSContainer.cxx:267
 TGFSContainer.cxx:268
 TGFSContainer.cxx:269
 TGFSContainer.cxx:270
 TGFSContainer.cxx:271
 TGFSContainer.cxx:272
 TGFSContainer.cxx:273
 TGFSContainer.cxx:274
 TGFSContainer.cxx:275
 TGFSContainer.cxx:276
 TGFSContainer.cxx:277
 TGFSContainer.cxx:278
 TGFSContainer.cxx:279
 TGFSContainer.cxx:280
 TGFSContainer.cxx:281
 TGFSContainer.cxx:282
 TGFSContainer.cxx:283
 TGFSContainer.cxx:284
 TGFSContainer.cxx:285
 TGFSContainer.cxx:286
 TGFSContainer.cxx:287
 TGFSContainer.cxx:288
 TGFSContainer.cxx:289
 TGFSContainer.cxx:290
 TGFSContainer.cxx:291
 TGFSContainer.cxx:292
 TGFSContainer.cxx:293
 TGFSContainer.cxx:294
 TGFSContainer.cxx:295
 TGFSContainer.cxx:296
 TGFSContainer.cxx:297
 TGFSContainer.cxx:298
 TGFSContainer.cxx:299
 TGFSContainer.cxx:300
 TGFSContainer.cxx:301
 TGFSContainer.cxx:302
 TGFSContainer.cxx:303
 TGFSContainer.cxx:304
 TGFSContainer.cxx:305
 TGFSContainer.cxx:306
 TGFSContainer.cxx:307
 TGFSContainer.cxx:308
 TGFSContainer.cxx:309
 TGFSContainer.cxx:310
 TGFSContainer.cxx:311
 TGFSContainer.cxx:312
 TGFSContainer.cxx:313
 TGFSContainer.cxx:314
 TGFSContainer.cxx:315
 TGFSContainer.cxx:316
 TGFSContainer.cxx:317
 TGFSContainer.cxx:318
 TGFSContainer.cxx:319
 TGFSContainer.cxx:320
 TGFSContainer.cxx:321
 TGFSContainer.cxx:322
 TGFSContainer.cxx:323
 TGFSContainer.cxx:324
 TGFSContainer.cxx:325
 TGFSContainer.cxx:326
 TGFSContainer.cxx:327
 TGFSContainer.cxx:328
 TGFSContainer.cxx:329
 TGFSContainer.cxx:330
 TGFSContainer.cxx:331
 TGFSContainer.cxx:332
 TGFSContainer.cxx:333
 TGFSContainer.cxx:334
 TGFSContainer.cxx:335
 TGFSContainer.cxx:336
 TGFSContainer.cxx:337
 TGFSContainer.cxx:338
 TGFSContainer.cxx:339
 TGFSContainer.cxx:340
 TGFSContainer.cxx:341
 TGFSContainer.cxx:342
 TGFSContainer.cxx:343
 TGFSContainer.cxx:344
 TGFSContainer.cxx:345
 TGFSContainer.cxx:346
 TGFSContainer.cxx:347
 TGFSContainer.cxx:348
 TGFSContainer.cxx:349
 TGFSContainer.cxx:350
 TGFSContainer.cxx:351
 TGFSContainer.cxx:352
 TGFSContainer.cxx:353
 TGFSContainer.cxx:354
 TGFSContainer.cxx:355
 TGFSContainer.cxx:356
 TGFSContainer.cxx:357
 TGFSContainer.cxx:358
 TGFSContainer.cxx:359
 TGFSContainer.cxx:360
 TGFSContainer.cxx:361
 TGFSContainer.cxx:362
 TGFSContainer.cxx:363
 TGFSContainer.cxx:364
 TGFSContainer.cxx:365
 TGFSContainer.cxx:366
 TGFSContainer.cxx:367
 TGFSContainer.cxx:368
 TGFSContainer.cxx:369
 TGFSContainer.cxx:370
 TGFSContainer.cxx:371
 TGFSContainer.cxx:372
 TGFSContainer.cxx:373
 TGFSContainer.cxx:374
 TGFSContainer.cxx:375
 TGFSContainer.cxx:376
 TGFSContainer.cxx:377
 TGFSContainer.cxx:378
 TGFSContainer.cxx:379
 TGFSContainer.cxx:380
 TGFSContainer.cxx:381
 TGFSContainer.cxx:382
 TGFSContainer.cxx:383
 TGFSContainer.cxx:384
 TGFSContainer.cxx:385
 TGFSContainer.cxx:386
 TGFSContainer.cxx:387
 TGFSContainer.cxx:388
 TGFSContainer.cxx:389
 TGFSContainer.cxx:390
 TGFSContainer.cxx:391
 TGFSContainer.cxx:392
 TGFSContainer.cxx:393
 TGFSContainer.cxx:394
 TGFSContainer.cxx:395
 TGFSContainer.cxx:396
 TGFSContainer.cxx:397
 TGFSContainer.cxx:398
 TGFSContainer.cxx:399
 TGFSContainer.cxx:400
 TGFSContainer.cxx:401
 TGFSContainer.cxx:402
 TGFSContainer.cxx:403
 TGFSContainer.cxx:404
 TGFSContainer.cxx:405
 TGFSContainer.cxx:406
 TGFSContainer.cxx:407
 TGFSContainer.cxx:408
 TGFSContainer.cxx:409
 TGFSContainer.cxx:410
 TGFSContainer.cxx:411
 TGFSContainer.cxx:412
 TGFSContainer.cxx:413
 TGFSContainer.cxx:414
 TGFSContainer.cxx:415
 TGFSContainer.cxx:416
 TGFSContainer.cxx:417
 TGFSContainer.cxx:418
 TGFSContainer.cxx:419
 TGFSContainer.cxx:420
 TGFSContainer.cxx:421
 TGFSContainer.cxx:422
 TGFSContainer.cxx:423
 TGFSContainer.cxx:424
 TGFSContainer.cxx:425
 TGFSContainer.cxx:426
 TGFSContainer.cxx:427
 TGFSContainer.cxx:428
 TGFSContainer.cxx:429
 TGFSContainer.cxx:430
 TGFSContainer.cxx:431
 TGFSContainer.cxx:432
 TGFSContainer.cxx:433
 TGFSContainer.cxx:434
 TGFSContainer.cxx:435
 TGFSContainer.cxx:436
 TGFSContainer.cxx:437
 TGFSContainer.cxx:438
 TGFSContainer.cxx:439
 TGFSContainer.cxx:440
 TGFSContainer.cxx:441
 TGFSContainer.cxx:442
 TGFSContainer.cxx:443
 TGFSContainer.cxx:444
 TGFSContainer.cxx:445
 TGFSContainer.cxx:446
 TGFSContainer.cxx:447
 TGFSContainer.cxx:448
 TGFSContainer.cxx:449
 TGFSContainer.cxx:450
 TGFSContainer.cxx:451
 TGFSContainer.cxx:452
 TGFSContainer.cxx:453
 TGFSContainer.cxx:454
 TGFSContainer.cxx:455
 TGFSContainer.cxx:456
 TGFSContainer.cxx:457
 TGFSContainer.cxx:458
 TGFSContainer.cxx:459
 TGFSContainer.cxx:460
 TGFSContainer.cxx:461
 TGFSContainer.cxx:462
 TGFSContainer.cxx:463
 TGFSContainer.cxx:464
 TGFSContainer.cxx:465
 TGFSContainer.cxx:466
 TGFSContainer.cxx:467
 TGFSContainer.cxx:468
 TGFSContainer.cxx:469
 TGFSContainer.cxx:470
 TGFSContainer.cxx:471
 TGFSContainer.cxx:472
 TGFSContainer.cxx:473
 TGFSContainer.cxx:474
 TGFSContainer.cxx:475
 TGFSContainer.cxx:476
 TGFSContainer.cxx:477
 TGFSContainer.cxx:478
 TGFSContainer.cxx:479
 TGFSContainer.cxx:480
 TGFSContainer.cxx:481
 TGFSContainer.cxx:482
 TGFSContainer.cxx:483
 TGFSContainer.cxx:484
 TGFSContainer.cxx:485
 TGFSContainer.cxx:486
 TGFSContainer.cxx:487
 TGFSContainer.cxx:488
 TGFSContainer.cxx:489
 TGFSContainer.cxx:490
 TGFSContainer.cxx:491
 TGFSContainer.cxx:492
 TGFSContainer.cxx:493
 TGFSContainer.cxx:494
 TGFSContainer.cxx:495
 TGFSContainer.cxx:496
 TGFSContainer.cxx:497
 TGFSContainer.cxx:498
 TGFSContainer.cxx:499
 TGFSContainer.cxx:500
 TGFSContainer.cxx:501
 TGFSContainer.cxx:502
 TGFSContainer.cxx:503
 TGFSContainer.cxx:504
 TGFSContainer.cxx:505
 TGFSContainer.cxx:506
 TGFSContainer.cxx:507
 TGFSContainer.cxx:508
 TGFSContainer.cxx:509
 TGFSContainer.cxx:510
 TGFSContainer.cxx:511
 TGFSContainer.cxx:512
 TGFSContainer.cxx:513
 TGFSContainer.cxx:514
 TGFSContainer.cxx:515
 TGFSContainer.cxx:516
 TGFSContainer.cxx:517
 TGFSContainer.cxx:518
 TGFSContainer.cxx:519
 TGFSContainer.cxx:520
 TGFSContainer.cxx:521
 TGFSContainer.cxx:522
 TGFSContainer.cxx:523
 TGFSContainer.cxx:524
 TGFSContainer.cxx:525
 TGFSContainer.cxx:526
 TGFSContainer.cxx:527
 TGFSContainer.cxx:528
 TGFSContainer.cxx:529
 TGFSContainer.cxx:530
 TGFSContainer.cxx:531
 TGFSContainer.cxx:532
 TGFSContainer.cxx:533
 TGFSContainer.cxx:534
 TGFSContainer.cxx:535
 TGFSContainer.cxx:536
 TGFSContainer.cxx:537
 TGFSContainer.cxx:538
 TGFSContainer.cxx:539
 TGFSContainer.cxx:540
 TGFSContainer.cxx:541
 TGFSContainer.cxx:542
 TGFSContainer.cxx:543
 TGFSContainer.cxx:544
 TGFSContainer.cxx:545
 TGFSContainer.cxx:546
 TGFSContainer.cxx:547
 TGFSContainer.cxx:548
 TGFSContainer.cxx:549
 TGFSContainer.cxx:550
 TGFSContainer.cxx:551
 TGFSContainer.cxx:552
 TGFSContainer.cxx:553
 TGFSContainer.cxx:554
 TGFSContainer.cxx:555
 TGFSContainer.cxx:556
 TGFSContainer.cxx:557
 TGFSContainer.cxx:558
 TGFSContainer.cxx:559
 TGFSContainer.cxx:560
 TGFSContainer.cxx:561
 TGFSContainer.cxx:562
 TGFSContainer.cxx:563
 TGFSContainer.cxx:564
 TGFSContainer.cxx:565
 TGFSContainer.cxx:566
 TGFSContainer.cxx:567
 TGFSContainer.cxx:568
 TGFSContainer.cxx:569
 TGFSContainer.cxx:570
 TGFSContainer.cxx:571
 TGFSContainer.cxx:572
 TGFSContainer.cxx:573
 TGFSContainer.cxx:574
 TGFSContainer.cxx:575
 TGFSContainer.cxx:576
 TGFSContainer.cxx:577
 TGFSContainer.cxx:578
 TGFSContainer.cxx:579
 TGFSContainer.cxx:580
 TGFSContainer.cxx:581
 TGFSContainer.cxx:582
 TGFSContainer.cxx:583
 TGFSContainer.cxx:584
 TGFSContainer.cxx:585
 TGFSContainer.cxx:586
 TGFSContainer.cxx:587
 TGFSContainer.cxx:588
 TGFSContainer.cxx:589
 TGFSContainer.cxx:590
 TGFSContainer.cxx:591
 TGFSContainer.cxx:592
 TGFSContainer.cxx:593
 TGFSContainer.cxx:594
 TGFSContainer.cxx:595
 TGFSContainer.cxx:596
 TGFSContainer.cxx:597
 TGFSContainer.cxx:598
 TGFSContainer.cxx:599
 TGFSContainer.cxx:600
 TGFSContainer.cxx:601
 TGFSContainer.cxx:602
 TGFSContainer.cxx:603
 TGFSContainer.cxx:604
 TGFSContainer.cxx:605
 TGFSContainer.cxx:606
 TGFSContainer.cxx:607
 TGFSContainer.cxx:608
 TGFSContainer.cxx:609
 TGFSContainer.cxx:610
 TGFSContainer.cxx:611
 TGFSContainer.cxx:612
 TGFSContainer.cxx:613
 TGFSContainer.cxx:614
 TGFSContainer.cxx:615
 TGFSContainer.cxx:616
 TGFSContainer.cxx:617
 TGFSContainer.cxx:618
 TGFSContainer.cxx:619
 TGFSContainer.cxx:620
 TGFSContainer.cxx:621
 TGFSContainer.cxx:622
 TGFSContainer.cxx:623
 TGFSContainer.cxx:624
 TGFSContainer.cxx:625
 TGFSContainer.cxx:626
 TGFSContainer.cxx:627
 TGFSContainer.cxx:628
 TGFSContainer.cxx:629
 TGFSContainer.cxx:630
 TGFSContainer.cxx:631
 TGFSContainer.cxx:632
 TGFSContainer.cxx:633
 TGFSContainer.cxx:634
 TGFSContainer.cxx:635
 TGFSContainer.cxx:636
 TGFSContainer.cxx:637
 TGFSContainer.cxx:638
 TGFSContainer.cxx:639
 TGFSContainer.cxx:640
 TGFSContainer.cxx:641
 TGFSContainer.cxx:642
 TGFSContainer.cxx:643
 TGFSContainer.cxx:644
 TGFSContainer.cxx:645
 TGFSContainer.cxx:646
 TGFSContainer.cxx:647
 TGFSContainer.cxx:648
 TGFSContainer.cxx:649
 TGFSContainer.cxx:650
 TGFSContainer.cxx:651
 TGFSContainer.cxx:652
 TGFSContainer.cxx:653
 TGFSContainer.cxx:654
 TGFSContainer.cxx:655
 TGFSContainer.cxx:656
 TGFSContainer.cxx:657
 TGFSContainer.cxx:658
 TGFSContainer.cxx:659
 TGFSContainer.cxx:660
 TGFSContainer.cxx:661
 TGFSContainer.cxx:662
 TGFSContainer.cxx:663
 TGFSContainer.cxx:664
 TGFSContainer.cxx:665
 TGFSContainer.cxx:666
 TGFSContainer.cxx:667
 TGFSContainer.cxx:668
 TGFSContainer.cxx:669
 TGFSContainer.cxx:670
 TGFSContainer.cxx:671
 TGFSContainer.cxx:672
 TGFSContainer.cxx:673
 TGFSContainer.cxx:674
 TGFSContainer.cxx:675
 TGFSContainer.cxx:676
 TGFSContainer.cxx:677
 TGFSContainer.cxx:678
 TGFSContainer.cxx:679
 TGFSContainer.cxx:680
 TGFSContainer.cxx:681
 TGFSContainer.cxx:682
 TGFSContainer.cxx:683
 TGFSContainer.cxx:684
 TGFSContainer.cxx:685
 TGFSContainer.cxx:686
 TGFSContainer.cxx:687
 TGFSContainer.cxx:688
 TGFSContainer.cxx:689
 TGFSContainer.cxx:690
 TGFSContainer.cxx:691
 TGFSContainer.cxx:692
 TGFSContainer.cxx:693
 TGFSContainer.cxx:694
 TGFSContainer.cxx:695
 TGFSContainer.cxx:696
 TGFSContainer.cxx:697
 TGFSContainer.cxx:698
 TGFSContainer.cxx:699
 TGFSContainer.cxx:700
 TGFSContainer.cxx:701
 TGFSContainer.cxx:702
 TGFSContainer.cxx:703
 TGFSContainer.cxx:704
 TGFSContainer.cxx:705
 TGFSContainer.cxx:706
 TGFSContainer.cxx:707
 TGFSContainer.cxx:708
 TGFSContainer.cxx:709
 TGFSContainer.cxx:710
 TGFSContainer.cxx:711
 TGFSContainer.cxx:712
 TGFSContainer.cxx:713
 TGFSContainer.cxx:714
 TGFSContainer.cxx:715
 TGFSContainer.cxx:716
 TGFSContainer.cxx:717
 TGFSContainer.cxx:718
 TGFSContainer.cxx:719
 TGFSContainer.cxx:720
 TGFSContainer.cxx:721
 TGFSContainer.cxx:722
 TGFSContainer.cxx:723
 TGFSContainer.cxx:724
 TGFSContainer.cxx:725
 TGFSContainer.cxx:726
 TGFSContainer.cxx:727
 TGFSContainer.cxx:728
 TGFSContainer.cxx:729
 TGFSContainer.cxx:730
 TGFSContainer.cxx:731
 TGFSContainer.cxx:732
 TGFSContainer.cxx:733
 TGFSContainer.cxx:734
 TGFSContainer.cxx:735
 TGFSContainer.cxx:736
 TGFSContainer.cxx:737
 TGFSContainer.cxx:738
 TGFSContainer.cxx:739
 TGFSContainer.cxx:740
 TGFSContainer.cxx:741
 TGFSContainer.cxx:742
 TGFSContainer.cxx:743
 TGFSContainer.cxx:744
 TGFSContainer.cxx:745
 TGFSContainer.cxx:746
 TGFSContainer.cxx:747
 TGFSContainer.cxx:748
 TGFSContainer.cxx:749
 TGFSContainer.cxx:750
 TGFSContainer.cxx:751
 TGFSContainer.cxx:752
 TGFSContainer.cxx:753
 TGFSContainer.cxx:754
 TGFSContainer.cxx:755
 TGFSContainer.cxx:756
 TGFSContainer.cxx:757
 TGFSContainer.cxx:758
 TGFSContainer.cxx:759
 TGFSContainer.cxx:760
 TGFSContainer.cxx:761
 TGFSContainer.cxx:762
 TGFSContainer.cxx:763
 TGFSContainer.cxx:764
 TGFSContainer.cxx:765
 TGFSContainer.cxx:766
 TGFSContainer.cxx:767
 TGFSContainer.cxx:768
 TGFSContainer.cxx:769
 TGFSContainer.cxx:770
 TGFSContainer.cxx:771
 TGFSContainer.cxx:772
 TGFSContainer.cxx:773
 TGFSContainer.cxx:774
 TGFSContainer.cxx:775
 TGFSContainer.cxx:776
 TGFSContainer.cxx:777
 TGFSContainer.cxx:778
 TGFSContainer.cxx:779
 TGFSContainer.cxx:780
 TGFSContainer.cxx:781
 TGFSContainer.cxx:782
 TGFSContainer.cxx:783
 TGFSContainer.cxx:784
 TGFSContainer.cxx:785
 TGFSContainer.cxx:786
 TGFSContainer.cxx:787
 TGFSContainer.cxx:788
 TGFSContainer.cxx:789
 TGFSContainer.cxx:790
 TGFSContainer.cxx:791
 TGFSContainer.cxx:792
 TGFSContainer.cxx:793
 TGFSContainer.cxx:794
 TGFSContainer.cxx:795
 TGFSContainer.cxx:796
 TGFSContainer.cxx:797
 TGFSContainer.cxx:798
 TGFSContainer.cxx:799
 TGFSContainer.cxx:800
 TGFSContainer.cxx:801
 TGFSContainer.cxx:802
 TGFSContainer.cxx:803
 TGFSContainer.cxx:804
 TGFSContainer.cxx:805
 TGFSContainer.cxx:806
 TGFSContainer.cxx:807
 TGFSContainer.cxx:808
 TGFSContainer.cxx:809
 TGFSContainer.cxx:810
 TGFSContainer.cxx:811
 TGFSContainer.cxx:812
 TGFSContainer.cxx:813
 TGFSContainer.cxx:814
 TGFSContainer.cxx:815
 TGFSContainer.cxx:816
 TGFSContainer.cxx:817
 TGFSContainer.cxx:818
 TGFSContainer.cxx:819
 TGFSContainer.cxx:820
 TGFSContainer.cxx:821
 TGFSContainer.cxx:822
 TGFSContainer.cxx:823
 TGFSContainer.cxx:824
 TGFSContainer.cxx:825
 TGFSContainer.cxx:826
 TGFSContainer.cxx:827
 TGFSContainer.cxx:828
 TGFSContainer.cxx:829
 TGFSContainer.cxx:830
 TGFSContainer.cxx:831
 TGFSContainer.cxx:832
 TGFSContainer.cxx:833
 TGFSContainer.cxx:834
 TGFSContainer.cxx:835
 TGFSContainer.cxx:836
 TGFSContainer.cxx:837
 TGFSContainer.cxx:838
 TGFSContainer.cxx:839
 TGFSContainer.cxx:840
 TGFSContainer.cxx:841
 TGFSContainer.cxx:842
 TGFSContainer.cxx:843
 TGFSContainer.cxx:844
 TGFSContainer.cxx:845
 TGFSContainer.cxx:846
 TGFSContainer.cxx:847
 TGFSContainer.cxx:848
 TGFSContainer.cxx:849
 TGFSContainer.cxx:850
 TGFSContainer.cxx:851
 TGFSContainer.cxx:852
 TGFSContainer.cxx:853
 TGFSContainer.cxx:854
 TGFSContainer.cxx:855
 TGFSContainer.cxx:856
 TGFSContainer.cxx:857
 TGFSContainer.cxx:858
 TGFSContainer.cxx:859
 TGFSContainer.cxx:860
 TGFSContainer.cxx:861
 TGFSContainer.cxx:862
 TGFSContainer.cxx:863
 TGFSContainer.cxx:864
 TGFSContainer.cxx:865
 TGFSContainer.cxx:866
 TGFSContainer.cxx:867
 TGFSContainer.cxx:868
 TGFSContainer.cxx:869
 TGFSContainer.cxx:870
 TGFSContainer.cxx:871
 TGFSContainer.cxx:872
 TGFSContainer.cxx:873
 TGFSContainer.cxx:874
 TGFSContainer.cxx:875
 TGFSContainer.cxx:876
 TGFSContainer.cxx:877
 TGFSContainer.cxx:878
 TGFSContainer.cxx:879