// @(#)root/html:$Id$
// Author: Axel Naumann 2007-01-09

/*************************************************************************
 * Copyright (C) 1995-2007, 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_TDocOutput
#define ROOT_TDocOutput


////////////////////////////////////////////////////////////////////////////
//                                                                        //
// ROOT_TDocOutput                                                        //
//                                                                        //
// Generates documentation output using XHTML 1.0 transitional            //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_Riosfwd
#include "Riosfwd.h"
#endif
#ifndef ROOT_TDocParser
#include "TDocParser.h"
#endif

class TClass;
class TDataMember;
class TDataType;
class TGClient;
class THtml;
class TModuleDocInfo;
class TString;
class TSubString;
class TVirtualPad;

class TDocOutput: public TObject {
protected:
   enum EGraphvizTool {
      kDot,
      kNeato,
      kFdp,
      kCirco
   };

   THtml*         fHtml; // THtml object we belong to

   int            CaseInsensitiveSort(const void *name1, const void *name2);
   void           AddLink(TSubString& str, TString& link, const char* comment);
   void           ProcessDocInDir(std::ostream& out, const char* indir, const char* outdir, const char* linkdir);
   Bool_t         RunDot(const char* filename, std::ostream* outMap = 0, EGraphvizTool gvwhat = kDot);
   void           WriteHtmlHeader(std::ostream& out, const char *titleNoSpecial,
                                  const char* dir /*=""*/, TClass *cls /*=0*/,
                                  const char* header);
   void           WriteHtmlFooter(std::ostream& out, const char *dir,
                                  const char *lastUpdate, const char *author,
                                  const char *copyright, const char* footer);
   virtual void   WriteSearch(std::ostream& out);
   void           WriteLocation(std::ostream& out, TModuleDocInfo* module, const char* classname = 0);
   void           WriteModuleLinks(std::ostream& out);
   void           WriteModuleLinks(std::ostream& out, TModuleDocInfo* super);
   void           WriteTopLinks(std::ostream& out, TModuleDocInfo* module, const char* classname = 0, Bool_t withLocation = kTRUE);

public:
   enum EFileType { kSource, kInclude, kTree, kDoc };

   TDocOutput(THtml& html);
   virtual ~TDocOutput();

   virtual void   AdjustSourcePath(TString& line, const char* relpath = "../");
   void           Convert(std::istream& in, const char* infilename,
                          const char* outfilename, const char *title,
                          const char *relpath = "../",
                          Int_t includeOutput = 0,
                          const char* context = "",
                          TGClient* gclient = 0);
   Bool_t         CopyHtmlFile(const char *sourceName, const char *destName="");

   virtual void   CreateClassIndex();
   virtual void   CreateModuleIndex();
   virtual void   CreateProductIndex();
   virtual void   CreateTypeIndex();
   virtual void   CreateClassTypeDefs();
   virtual void   CreateHierarchy();

   virtual void   DecorateEntityBegin(TString& str, Ssiz_t& pos, TDocParser::EParseContext type);
   virtual void   DecorateEntityEnd(TString& str, Ssiz_t& pos, TDocParser::EParseContext type);
   virtual void   FixupAuthorSourceInfo(TString& authors);
   const char*    GetExtension() const { return ".html"; }
   THtml*         GetHtml() { return fHtml; }
   virtual Bool_t IsModified(TClass *classPtr, EFileType type);
   virtual void   NameSpace2FileName(TString &name);

   virtual void   ReferenceEntity(TSubString& str, TClass* entity, const char* comment = 0);
   virtual void   ReferenceEntity(TSubString& str, TDataMember* entity, const char* comment = 0);
   virtual void   ReferenceEntity(TSubString& str, TDataType* entity, const char* comment = 0);
   virtual void   ReferenceEntity(TSubString& str, TMethod* entity, const char* comment = 0);
   virtual Bool_t ReferenceIsRelative(const char* reference) const;

   virtual const char* ReplaceSpecialChars(char c);
   void           ReplaceSpecialChars(std::ostream &out, const char *string);
   void           ReplaceSpecialChars(TString& text);
   void           ReplaceSpecialChars(TString& text, Ssiz_t &pos);

   virtual void   WriteHtmlHeader(std::ostream &out, const char *title, const char* dir="", TClass *cls=0);
   virtual void   WriteHtmlFooter(std::ostream &out, const char *dir="", const char *lastUpdate="",
                                  const char *author="", const char *copyright="");
   void           WriteLineNumbers(std::ostream& out, Long_t nLines, const TString& infileBase) const;

   ClassDef(TDocOutput, 0); // generates documentation web pages
};

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