// @(#)root/gui:$Id$
// Author: G. Ganis   10/10/2005

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

#ifndef ROOT_TGRedirectOutputGuard
#define ROOT_TGRedirectOutputGuard

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGRedirectOutputGuard                                                //
//                                                                      //
// This class provides output redirection to a TGTextView in guaranteed //
// exception safe way. Use like this:                                   //
// {                                                                    //
//    TGRedirectOutputGuard guard(textview);                            //
//    ... // do something                                               //
//    guard.Update();                                                   //
//    ... // do something else                                          //
// }                                                                    //
// when guard goes out of scope, Update() is called to flush what left  //
// on the screed and the output is automatically redirected again to    //
// the standard units.                                                  //
// The exception mechanism takes care of calling the dtors              //
// of local objects so it is exception safe.                            //
// Optionally the output can also be saved into a file:                 //
// {                                                                    //
//    TGRedirectOutputGuard guard(textview, file, mode);                //
//    ... // do something                                               //
// }                                                                    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TString
#include "TString.h"
#endif

class TGTextView;

class TGRedirectOutputGuard {

private:
   TString      fLogFile;
   Bool_t       fTmpFile;
   TGTextView  *fTextView;
   FILE        *fLogFileRead;

private:
   TGRedirectOutputGuard(const TGRedirectOutputGuard&);            // Not implemented.
   TGRedirectOutputGuard &operator=(const TGRedirectOutputGuard&); // Not implemented.

public:
   TGRedirectOutputGuard(TGTextView *tv,
                         const char *flog = 0, const char *mode = "a");
   virtual ~TGRedirectOutputGuard();

   void Update(); // Update window with file content

   ClassDef(TGRedirectOutputGuard,0)  // Exception safe output redirection
};

#endif
