// @(#)root/gui:$Id$
// Author: Fons Rademakers   26/04/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.             *
 *************************************************************************/

#ifndef ROOT_TGText
#define ROOT_TGText


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGText                                                               //
//                                                                      //
// A TGText is a multi line text buffer. It allows the text to be       //
// loaded from file, saved to file and edited. It is used in the        //
// TGTextEdit widget. Single line text is handled by TGTextBuffer.      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

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

#ifndef ROOT_TGDimension
#include "TGDimension.h"
#endif


class TGTextLine {

friend class TGText;

protected:
   char         *fString;   // line of text
   ULong_t       fLength;   // length of line
   TGTextLine   *fPrev;     // previous line
   TGTextLine   *fNext;     // next line

   TGTextLine(const TGTextLine&);
   TGTextLine& operator=(const TGTextLine&);

public:
   TGTextLine();
   TGTextLine(TGTextLine *line);
   TGTextLine(const char *string);
   virtual ~TGTextLine();

   void Clear();
   ULong_t GetLineLength() { return fLength; }

   void DelText(ULong_t pos, ULong_t length);
   void InsText(ULong_t pos, const char *text);
   char *GetText(ULong_t pos, ULong_t length);
   char *GetText() const { return fString; }
   char *GetWord(ULong_t pos);

   void DelChar(ULong_t pos);
   void InsChar(ULong_t pos, char character);
   char GetChar(ULong_t pos);

   ClassDef(TGTextLine,0)  // Line in TGText
};


class TGText {

protected:
   TString      fFilename;       // name of opened file ("" if open buffer)
   Bool_t       fIsSaved;        // false if text needs to be saved
   TGTextLine  *fFirst;          // first line of text
   TGTextLine  *fCurrent;        // current line
   Long_t       fCurrentRow;     // current row number
   Long_t       fRowCount;       // number of rows
   Long_t       fColCount;       // number of columns in current line
   Long_t       fLongestLine;    // length of longest line

   TGText(const TGText&);
   TGText& operator=(const TGText&);

   void     Init();
   Bool_t   SetCurrentRow(Long_t row);
   void     LongestLine();

public:
   TGText();
   TGText(TGText *text);
   TGText(const char *string);
   virtual ~TGText();

   void    Clear();
   Bool_t  Load(const char *fn, Long_t startpos = 0, Long_t length = -1);
   Bool_t  LoadBuffer(const char *txtbuf);
   Bool_t  Save(const char *fn);
   Bool_t  Append(const char *fn);
   Bool_t  IsSaved() const { return fIsSaved; }
   const char *GetFileName() const { return fFilename.Data(); }

   Bool_t  DelChar(TGLongPosition pos);
   Bool_t  InsChar(TGLongPosition pos, char c);
   char    GetChar(TGLongPosition pos);

   Bool_t  DelText(TGLongPosition start, TGLongPosition end);
   Bool_t  InsText(TGLongPosition pos, const char *buf);
   Bool_t  InsText(TGLongPosition ins_pos, TGText *src, TGLongPosition start_src, TGLongPosition end_src);
   Bool_t  AddText(TGText *text);

   Bool_t  DelLine(ULong_t pos);
   char   *GetLine(TGLongPosition pos, ULong_t length);
   TString AsString();
   TGTextLine *GetCurrentLine() const { return fCurrent; }
   Bool_t  BreakLine(TGLongPosition pos);
   Bool_t  InsLine(ULong_t row, const char *string);

   Long_t  RowCount() const { return fRowCount; }
   Long_t  ColCount() const { return fColCount; }

   Long_t  GetLineLength(Long_t row);
   Long_t  GetLongestLine() const { return fLongestLine; }

   void    ReTab(Long_t row);

   Bool_t  Search(TGLongPosition *foundPos, TGLongPosition start, const char *searchString,
                  Bool_t direction, Bool_t caseSensitive);
   Bool_t  Replace(TGLongPosition start, const char *oldText, const char *newText,
                   Bool_t direction, Bool_t caseSensitive);

   ClassDef(TGText,0)  // Text used by TGTextEdit
};

#endif
 TGText.h:1
 TGText.h:2
 TGText.h:3
 TGText.h:4
 TGText.h:5
 TGText.h:6
 TGText.h:7
 TGText.h:8
 TGText.h:9
 TGText.h:10
 TGText.h:11
 TGText.h:12
 TGText.h:13
 TGText.h:14
 TGText.h:15
 TGText.h:16
 TGText.h:17
 TGText.h:18
 TGText.h:19
 TGText.h:20
 TGText.h:21
 TGText.h:22
 TGText.h:23
 TGText.h:24
 TGText.h:25
 TGText.h:26
 TGText.h:27
 TGText.h:28
 TGText.h:29
 TGText.h:30
 TGText.h:31
 TGText.h:32
 TGText.h:33
 TGText.h:34
 TGText.h:35
 TGText.h:36
 TGText.h:37
 TGText.h:38
 TGText.h:39
 TGText.h:40
 TGText.h:41
 TGText.h:42
 TGText.h:43
 TGText.h:44
 TGText.h:45
 TGText.h:46
 TGText.h:47
 TGText.h:48
 TGText.h:49
 TGText.h:50
 TGText.h:51
 TGText.h:52
 TGText.h:53
 TGText.h:54
 TGText.h:55
 TGText.h:56
 TGText.h:57
 TGText.h:58
 TGText.h:59
 TGText.h:60
 TGText.h:61
 TGText.h:62
 TGText.h:63
 TGText.h:64
 TGText.h:65
 TGText.h:66
 TGText.h:67
 TGText.h:68
 TGText.h:69
 TGText.h:70
 TGText.h:71
 TGText.h:72
 TGText.h:73
 TGText.h:74
 TGText.h:75
 TGText.h:76
 TGText.h:77
 TGText.h:78
 TGText.h:79
 TGText.h:80
 TGText.h:81
 TGText.h:82
 TGText.h:83
 TGText.h:84
 TGText.h:85
 TGText.h:86
 TGText.h:87
 TGText.h:88
 TGText.h:89
 TGText.h:90
 TGText.h:91
 TGText.h:92
 TGText.h:93
 TGText.h:94
 TGText.h:95
 TGText.h:96
 TGText.h:97
 TGText.h:98
 TGText.h:99
 TGText.h:100
 TGText.h:101
 TGText.h:102
 TGText.h:103
 TGText.h:104
 TGText.h:105
 TGText.h:106
 TGText.h:107
 TGText.h:108
 TGText.h:109
 TGText.h:110
 TGText.h:111
 TGText.h:112
 TGText.h:113
 TGText.h:114
 TGText.h:115
 TGText.h:116
 TGText.h:117
 TGText.h:118
 TGText.h:119
 TGText.h:120
 TGText.h:121
 TGText.h:122
 TGText.h:123
 TGText.h:124
 TGText.h:125
 TGText.h:126
 TGText.h:127
 TGText.h:128
 TGText.h:129
 TGText.h:130
 TGText.h:131
 TGText.h:132
 TGText.h:133
 TGText.h:134
 TGText.h:135
 TGText.h:136