Orb/Doxygen/src/layout.cpp
changeset 3 d8fccb2cd802
parent 0 42188c7ea2d9
child 4 468f4c8d3d5b
equal deleted inserted replaced
2:932c358ece3e 3:d8fccb2cd802
       
     1 /******************************************************************************
       
     2  *
       
     3  * 
       
     4  *
       
     5  *
       
     6  * Copyright (C) 1997-2008 by Dimitri van Heesch.
       
     7  *
       
     8  * Permission to use, copy, modify, and distribute this software and its
       
     9  * documentation under the terms of the GNU General Public License is hereby 
       
    10  * granted. No representations are made about the suitability of this software 
       
    11  * for any purpose. It is provided "as is" without express or implied warranty.
       
    12  * See the GNU General Public License for more details.
       
    13  *
       
    14  * Documents produced by Doxygen are derivative works derived from the
       
    15  * input used in their production; they are not affected by this license.
       
    16  *
       
    17  */
       
    18 
       
    19 #include "layout.h"
       
    20 #include "message.h"
       
    21 #include "language.h"
       
    22 #include "vhdldocgen.h"
       
    23 #include "util.h"
       
    24 
       
    25 #include <qxml.h>
       
    26 #include <qfile.h>
       
    27 #include <qstring.h>
       
    28 #include <qfileinfo.h>
       
    29 #include <qtextstream.h>
       
    30 
       
    31 static const char layout_default[] =
       
    32 #include "layout_default.h"
       
    33 ;
       
    34 
       
    35 static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
       
    36 {
       
    37   QCString visible = convertToQCString(attrib.value("visible"));
       
    38   if (visible.isEmpty()) return defVal;
       
    39   if (visible.at(0)=='$' && visible.length()>1)
       
    40   {
       
    41     QCString id = visible.mid(1);
       
    42     ConfigOption *opt = Config::instance()->get(id);
       
    43     if (opt && opt->kind()==ConfigOption::O_Bool)
       
    44     {
       
    45       return *((ConfigBool *)opt)->valueRef();
       
    46     }
       
    47     else if (!opt)
       
    48     {
       
    49       err("Warning: found unsupported value %s for visible attribute in layout file\n",
       
    50           visible.data());
       
    51     }
       
    52   }
       
    53   return visible!="no" && visible!="0";
       
    54 }
       
    55 
       
    56 //---------------------------------------------------------------------------------
       
    57 
       
    58 LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const
       
    59 {
       
    60   LayoutNavEntry *result=0;
       
    61   QListIterator<LayoutNavEntry> li(m_children);
       
    62   LayoutNavEntry *entry;
       
    63   for (li.toFirst();(entry=li.current());++li)
       
    64   {
       
    65     // depth first search, needed to find the entry furthest from the 
       
    66     // root in case an entry is in the tree twice
       
    67     result = entry->find(kind);
       
    68     if (result) return result;
       
    69     if (entry->kind()==kind)
       
    70     {
       
    71       return entry;
       
    72     }
       
    73   }
       
    74   return result;
       
    75 }
       
    76 
       
    77 //---------------------------------------------------------------------------------
       
    78 
       
    79 class LayoutParser : public QXmlDefaultHandler
       
    80 {
       
    81   private:
       
    82     class StartElementHandler
       
    83     {
       
    84         typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib); 
       
    85       public:
       
    86         StartElementHandler(LayoutParser *parent, Handler h) 
       
    87           : m_parent(parent), m_handler(h) {}
       
    88         virtual ~StartElementHandler() {}
       
    89         virtual void operator()(const QXmlAttributes &attrib) 
       
    90         { 
       
    91           (m_parent->*m_handler)(attrib); 
       
    92         }
       
    93       protected:
       
    94         StartElementHandler() : m_parent(0), m_handler(0) {}
       
    95       private:
       
    96         LayoutParser *m_parent;
       
    97         Handler m_handler;
       
    98     };
       
    99 
       
   100     class StartElementHandlerKind : public StartElementHandler
       
   101     {
       
   102         typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
       
   103                                               const QXmlAttributes &attrib); 
       
   104       public:
       
   105         StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h) 
       
   106           : m_parent(parent), m_kind(k), m_handler(h) {}
       
   107         void operator()(const QXmlAttributes &attrib) 
       
   108         { 
       
   109           (m_parent->*m_handler)(m_kind,attrib); 
       
   110         }
       
   111       private:
       
   112         LayoutParser *m_parent;
       
   113         LayoutDocEntry::Kind m_kind;
       
   114         Handler m_handler;
       
   115     };
       
   116 
       
   117     class StartElementHandlerSection : public StartElementHandler
       
   118     {
       
   119         typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
       
   120                                               const QXmlAttributes &attrib,
       
   121                                               const QCString &title); 
       
   122       public:
       
   123         StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h,
       
   124                                 const QCString &title) 
       
   125           : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {}
       
   126         void operator()(const QXmlAttributes &attrib) 
       
   127         { 
       
   128           (m_parent->*m_handler)(m_kind,attrib,m_title); 
       
   129         }
       
   130       private:
       
   131         LayoutParser *m_parent;
       
   132         LayoutDocEntry::Kind m_kind;
       
   133         Handler m_handler;
       
   134         QCString m_title;
       
   135     };
       
   136 
       
   137     class StartElementHandlerMember : public StartElementHandler
       
   138     {
       
   139         typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib,
       
   140                                               MemberList::ListType type,
       
   141                                               const QCString &title,
       
   142                                               const QCString &subtitle); 
       
   143       public:
       
   144         StartElementHandlerMember(LayoutParser *parent, 
       
   145                                   Handler h,
       
   146                                   MemberList::ListType type,
       
   147                                   const QCString &tl,
       
   148                                   const QCString &ss = QCString()
       
   149                                  ) 
       
   150           : m_parent(parent), m_handler(h), m_type(type),
       
   151             m_title(tl), m_subscript(ss) {}
       
   152         void operator()(const QXmlAttributes &attrib) 
       
   153         { 
       
   154           (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript); 
       
   155         }
       
   156       private:
       
   157         LayoutParser *m_parent;
       
   158         Handler m_handler;
       
   159         MemberList::ListType m_type;
       
   160         QCString m_title;
       
   161         QCString m_subscript;
       
   162     };
       
   163 
       
   164     class StartElementHandlerNavEntry : public StartElementHandler
       
   165     {
       
   166         typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind,
       
   167                                               const QXmlAttributes &attrib,
       
   168                                               const QCString &title); 
       
   169       public:
       
   170         StartElementHandlerNavEntry(LayoutParser *parent,
       
   171                                LayoutNavEntry::Kind kind, 
       
   172                                Handler h,
       
   173                                const QCString &tl
       
   174                               ) 
       
   175           : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {}
       
   176         void operator()(const QXmlAttributes &attrib) 
       
   177         { 
       
   178           (m_parent->*m_handler)(m_kind,attrib,m_title); 
       
   179         }
       
   180       private:
       
   181         LayoutParser *m_parent;
       
   182         LayoutNavEntry::Kind m_kind;
       
   183         Handler m_handler;
       
   184         QCString m_title;
       
   185     };
       
   186 
       
   187     class EndElementHandler
       
   188     {
       
   189         typedef void (LayoutParser::*Handler)(); 
       
   190       public:
       
   191         EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
       
   192         void operator()() { (m_parent->*m_handler)(); }
       
   193       private:
       
   194         LayoutParser *m_parent;
       
   195         Handler m_handler;
       
   196     };
       
   197 
       
   198 
       
   199   public:
       
   200     static LayoutParser &instance()
       
   201     {
       
   202       static LayoutParser *theInstance = new LayoutParser;
       
   203       return *theInstance;
       
   204     }
       
   205     void init()
       
   206     {
       
   207       m_sHandler.setAutoDelete(TRUE);
       
   208       m_eHandler.setAutoDelete(TRUE);
       
   209       m_part = -1; // invalid
       
   210       m_rootNav = 0;
       
   211 
       
   212       bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
       
   213       bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
       
   214       bool javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
       
   215 
       
   216       // start & end handlers
       
   217       m_sHandler.insert("doxygenlayout", 
       
   218           new StartElementHandler(this,&LayoutParser::startLayout));
       
   219       m_eHandler.insert("doxygenlayout", 
       
   220           new EndElementHandler(this,&LayoutParser::endLayout));
       
   221 
       
   222       // class layout handlers
       
   223       m_sHandler.insert("navindex", 
       
   224           new StartElementHandler(this,&LayoutParser::startNavIndex));
       
   225       m_sHandler.insert("navindex/tab", 
       
   226           new StartElementHandler(this,&LayoutParser::startNavEntry));
       
   227       m_eHandler.insert("navindex/tab", 
       
   228           new EndElementHandler(this,&LayoutParser::endNavEntry));
       
   229       m_eHandler.insert("navindex", 
       
   230           new EndElementHandler(this,&LayoutParser::endNavIndex));
       
   231 
       
   232       // class layout handlers
       
   233       m_sHandler.insert("class", 
       
   234           new StartElementHandler(this,&LayoutParser::startClass));
       
   235       m_sHandler.insert("class/briefdescription", 
       
   236           new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
       
   237       m_sHandler.insert("class/detaileddescription", 
       
   238           new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
       
   239                                          theTranslator->trDetailedDescription()));
       
   240       m_sHandler.insert("class/authorsection", 
       
   241           new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
       
   242       m_sHandler.insert("class/includes", 
       
   243           new StartElementHandlerKind(this,LayoutDocEntry::ClassIncludes,&LayoutParser::startSimpleEntry));
       
   244       m_sHandler.insert("class/inheritancegraph", 
       
   245           new StartElementHandlerKind(this,LayoutDocEntry::ClassInheritanceGraph,&LayoutParser::startSimpleEntry));
       
   246       m_sHandler.insert("class/collaborationgraph", 
       
   247           new StartElementHandlerKind(this,LayoutDocEntry::ClassCollaborationGraph,&LayoutParser::startSimpleEntry));
       
   248       m_sHandler.insert("class/allmemberslink", 
       
   249           new StartElementHandlerKind(this,LayoutDocEntry::ClassAllMembersLink,&LayoutParser::startSimpleEntry));
       
   250       m_sHandler.insert("class/usedfiles", 
       
   251           new StartElementHandlerKind(this,LayoutDocEntry::ClassUsedFiles,&LayoutParser::startSimpleEntry));
       
   252       m_sHandler.insert("class/memberdecl", 
       
   253           new StartElementHandler(this,&LayoutParser::startMemberDecl));
       
   254       m_sHandler.insert("class/memberdecl/membergroups", 
       
   255           new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
       
   256       m_sHandler.insert("class/memberdecl/nestedclasses", 
       
   257           new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry,
       
   258                                          vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
       
   259                                          fortranOpt ? theTranslator->trDataTypes() :
       
   260                                          theTranslator->trCompounds() 
       
   261                                          ));
       
   262       m_sHandler.insert("class/memberdecl/publictypes", 
       
   263           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   264                                         MemberList::pubTypes,theTranslator->trPublicTypes()));
       
   265       m_sHandler.insert("class/memberdecl/publicslots", 
       
   266           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   267                                         MemberList::pubSlots,theTranslator->trPublicSlots())); 
       
   268       m_sHandler.insert("class/memberdecl/signals", 
       
   269           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   270                                         MemberList::signals,theTranslator->trSignals())); 
       
   271       m_sHandler.insert("class/memberdecl/publicmethods", 
       
   272           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   273                                         MemberList::pubMethods,theTranslator->trPublicMembers())); 
       
   274       m_sHandler.insert("class/memberdecl/publicstaticmethods", 
       
   275           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   276                                         MemberList::pubStaticMethods,theTranslator->trStaticPublicMembers())); 
       
   277       m_sHandler.insert("class/memberdecl/publicattributes", 
       
   278           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   279                                         MemberList::pubAttribs,theTranslator->trPublicAttribs())); 
       
   280       m_sHandler.insert("class/memberdecl/publicstaticattributes", 
       
   281           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   282                                         MemberList::pubStaticAttribs,theTranslator->trStaticPublicAttribs())); 
       
   283       m_sHandler.insert("class/memberdecl/protectedtypes", 
       
   284           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   285                                         MemberList::proTypes,theTranslator->trProtectedTypes())); 
       
   286       m_sHandler.insert("class/memberdecl/protectedslots", 
       
   287           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   288                                         MemberList::proSlots,theTranslator->trProtectedSlots())); 
       
   289       m_sHandler.insert("class/memberdecl/protectedmethods", 
       
   290           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   291                                         MemberList::proMethods,theTranslator->trProtectedMembers())); 
       
   292       m_sHandler.insert("class/memberdecl/protectedstaticmethods", 
       
   293           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   294                                         MemberList::proStaticMethods,theTranslator->trStaticProtectedMembers()));
       
   295       m_sHandler.insert("class/memberdecl/protectedattributes", 
       
   296           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   297                                         MemberList::proAttribs,theTranslator->trProtectedAttribs())); 
       
   298       m_sHandler.insert("class/memberdecl/protectedstaticattributes", 
       
   299           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   300                                         MemberList::proStaticAttribs,theTranslator->trStaticProtectedAttribs())); 
       
   301       m_sHandler.insert("class/memberdecl/packagetypes", 
       
   302           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   303                                         MemberList::pacTypes,theTranslator->trPackageTypes())); 
       
   304       m_sHandler.insert("class/memberdecl/packagemethods", 
       
   305           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   306                                         MemberList::pacMethods,theTranslator->trPackageMembers())); 
       
   307       m_sHandler.insert("class/memberdecl/packagestaticmethods", 
       
   308           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   309                                         MemberList::pacStaticMethods,theTranslator->trStaticPackageMembers())); 
       
   310       m_sHandler.insert("class/memberdecl/packageattributes", 
       
   311           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   312                                         MemberList::pacAttribs,theTranslator->trPackageAttribs())); 
       
   313       m_sHandler.insert("class/memberdecl/packagestaticattributes", 
       
   314           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   315                                         MemberList::pacStaticAttribs,theTranslator->trStaticPackageAttribs())); 
       
   316       m_sHandler.insert("class/memberdecl/properties", 
       
   317           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   318                                         MemberList::properties,theTranslator->trProperties())); 
       
   319       m_sHandler.insert("class/memberdecl/events", 
       
   320           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   321                                         MemberList::events,theTranslator->trEvents())); 
       
   322       m_sHandler.insert("class/memberdecl/privatetypes", 
       
   323           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   324                                         MemberList::priTypes,theTranslator->trPrivateTypes())); 
       
   325       m_sHandler.insert("class/memberdecl/privateslots", 
       
   326           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   327                                         MemberList::priSlots,theTranslator->trPrivateSlots())); 
       
   328       m_sHandler.insert("class/memberdecl/privatemethods", 
       
   329           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   330                                         MemberList::priMethods,theTranslator->trPrivateMembers())); 
       
   331       m_sHandler.insert("class/memberdecl/privatestaticmethods", 
       
   332           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   333                                         MemberList::priStaticMethods,theTranslator->trStaticPrivateMembers())); 
       
   334       m_sHandler.insert("class/memberdecl/privateattributes", 
       
   335           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   336                                         MemberList::priAttribs,theTranslator->trPrivateAttribs())); 
       
   337       m_sHandler.insert("class/memberdecl/privatestaticattributes", 
       
   338           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   339                                         MemberList::priStaticAttribs,theTranslator->trStaticPrivateAttribs())); 
       
   340       m_sHandler.insert("class/memberdecl/friends", 
       
   341           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   342                                         MemberList::friends,theTranslator->trFriends()));
       
   343       m_sHandler.insert("class/memberdecl/related", 
       
   344           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   345                                         MemberList::related,theTranslator->trRelatedFunctions(),
       
   346                                         theTranslator->trRelatedSubscript())); 
       
   347       m_eHandler.insert("class/memberdecl", 
       
   348           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       
   349       m_sHandler.insert("class/memberdef", 
       
   350           new StartElementHandler(this,&LayoutParser::startMemberDef));
       
   351       m_sHandler.insert("class/memberdef/typedefs", 
       
   352           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   353                                         MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation()));
       
   354       m_sHandler.insert("class/memberdef/enums", 
       
   355           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   356                                         MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation()));
       
   357       m_sHandler.insert("class/memberdef/constructors", 
       
   358           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   359                                         MemberList::constructors,theTranslator->trConstructorDocumentation()));
       
   360       m_sHandler.insert("class/memberdef/functions", 
       
   361           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   362                                         MemberList::functionMembers,
       
   363                                         fortranOpt ?
       
   364                                         theTranslator->trMemberFunctionDocumentationFortran() :
       
   365                                         theTranslator->trMemberFunctionDocumentation()));
       
   366       m_sHandler.insert("class/memberdef/related", 
       
   367           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   368                                         MemberList::relatedMembers,theTranslator->trRelatedFunctionDocumentation()));
       
   369       m_sHandler.insert("class/memberdef/variables", 
       
   370           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   371                                         MemberList::variableMembers,theTranslator->trMemberDataDocumentation()));
       
   372       m_sHandler.insert("class/memberdef/properties", 
       
   373           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   374                                         MemberList::propertyMembers,theTranslator->trPropertyDocumentation()));
       
   375       m_sHandler.insert("class/memberdef/events", 
       
   376           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   377                                         MemberList::eventMembers,theTranslator->trEventDocumentation()));
       
   378       m_eHandler.insert("class/memberdef", 
       
   379           new EndElementHandler(this,&LayoutParser::endMemberDef));
       
   380       m_eHandler.insert("class", 
       
   381           new EndElementHandler(this,&LayoutParser::endClass));
       
   382 
       
   383 
       
   384       // namespace layout handlers
       
   385       m_sHandler.insert("namespace", 
       
   386           new StartElementHandler(this,&LayoutParser::startNamespace));
       
   387       m_sHandler.insert("namespace/briefdescription", 
       
   388           new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
       
   389       m_sHandler.insert("namespace/detaileddescription", 
       
   390           new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
       
   391                                          theTranslator->trDetailedDescription()));
       
   392       m_sHandler.insert("namespace/authorsection", 
       
   393           new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
       
   394       m_sHandler.insert("namespace/memberdecl", 
       
   395           new StartElementHandler(this,&LayoutParser::startMemberDecl));
       
   396       m_sHandler.insert("namespace/memberdecl/nestednamespaces", 
       
   397           new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry,
       
   398                                          javaOpt ? theTranslator->trPackages() :
       
   399                                          fortranOpt ? theTranslator->trModules() :
       
   400                                          theTranslator->trNamespaces()
       
   401                                          ));
       
   402       m_sHandler.insert("namespace/memberdecl/classes", 
       
   403           new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry,
       
   404                                          vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
       
   405                                          fortranOpt ? theTranslator->trDataTypes() :
       
   406                                          theTranslator->trCompounds() 
       
   407                                          ));
       
   408       m_sHandler.insert("namespace/memberdecl/membergroups", 
       
   409           new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
       
   410       m_sHandler.insert("namespace/memberdecl/typedefs", 
       
   411           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   412                                         MemberList::decTypedefMembers,theTranslator->trTypedefs()));
       
   413       m_sHandler.insert("namespace/memberdecl/enums", 
       
   414           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   415                                         MemberList::decEnumMembers,theTranslator->trEnumerations()));
       
   416       m_sHandler.insert("namespace/memberdecl/functions", 
       
   417           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   418                                         MemberList::decFuncMembers,
       
   419                                         fortranOpt ? theTranslator->trSubprograms()  : 
       
   420                                         vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
       
   421                                         theTranslator->trFunctions()));
       
   422       m_sHandler.insert("namespace/memberdecl/variables", 
       
   423           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   424                                         MemberList::decVarMembers,theTranslator->trVariables()));
       
   425       m_eHandler.insert("namespace/memberdecl", 
       
   426           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       
   427       m_sHandler.insert("namespace/memberdef", 
       
   428           new StartElementHandler(this,&LayoutParser::startMemberDef));
       
   429       m_sHandler.insert("namespace/memberdef/typedefs", 
       
   430           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   431                                         MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
       
   432       m_sHandler.insert("namespace/memberdef/enums", 
       
   433           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   434                                         MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
       
   435       m_sHandler.insert("namespace/memberdef/functions", 
       
   436           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   437                                         MemberList::docFuncMembers,
       
   438                                         fortranOpt ? 
       
   439                                         theTranslator->trSubprogramDocumentation() :
       
   440                                         theTranslator->trFunctionDocumentation()));
       
   441       m_sHandler.insert("namespace/memberdef/variables", 
       
   442           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   443                                         MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
       
   444       m_eHandler.insert("namespace/memberdef", 
       
   445           new EndElementHandler(this,&LayoutParser::endMemberDef));
       
   446       m_eHandler.insert("namespace", 
       
   447           new EndElementHandler(this,&LayoutParser::endNamespace));
       
   448 
       
   449       // file layout handlers
       
   450       m_sHandler.insert("file", 
       
   451           new StartElementHandler(this,&LayoutParser::startFile));
       
   452       m_sHandler.insert("file/briefdescription", 
       
   453           new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
       
   454       m_sHandler.insert("file/detaileddescription", 
       
   455           new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
       
   456                                          theTranslator->trDetailedDescription()));
       
   457       m_sHandler.insert("file/authorsection", 
       
   458           new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
       
   459       m_sHandler.insert("file/includes", 
       
   460           new StartElementHandlerKind(this,LayoutDocEntry::FileIncludes,&LayoutParser::startSimpleEntry));
       
   461       m_sHandler.insert("file/includegraph", 
       
   462           new StartElementHandlerKind(this,LayoutDocEntry::FileIncludeGraph,&LayoutParser::startSimpleEntry));
       
   463       m_sHandler.insert("file/includedbygraph", 
       
   464           new StartElementHandlerKind(this,LayoutDocEntry::FileIncludedByGraph,&LayoutParser::startSimpleEntry));
       
   465       m_sHandler.insert("file/sourcelink", 
       
   466           new StartElementHandlerKind(this,LayoutDocEntry::FileSourceLink,&LayoutParser::startSimpleEntry));
       
   467       m_sHandler.insert("file/memberdecl/membergroups", 
       
   468           new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
       
   469       m_sHandler.insert("file/memberdecl", 
       
   470           new StartElementHandler(this,&LayoutParser::startMemberDecl));
       
   471       m_sHandler.insert("file/memberdecl/classes", 
       
   472           new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry,
       
   473                                          vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
       
   474                                          fortranOpt ? theTranslator->trDataTypes() :
       
   475                                          theTranslator->trCompounds() 
       
   476                                          ));
       
   477       m_sHandler.insert("file/memberdecl/namespaces", 
       
   478           new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry,
       
   479                                          javaOpt ? theTranslator->trPackages() :
       
   480                                          fortranOpt ? theTranslator->trModules() :
       
   481                                          theTranslator->trNamespaces()
       
   482                                          ));
       
   483       m_sHandler.insert("file/memberdecl/defines", 
       
   484           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   485                                         MemberList::decDefineMembers,theTranslator->trDefines()));
       
   486       m_sHandler.insert("file/memberdecl/typedefs", 
       
   487           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   488                                         MemberList::decTypedefMembers,theTranslator->trTypedefs()));
       
   489       m_sHandler.insert("file/memberdecl/enums", 
       
   490           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   491                                         MemberList::decEnumMembers,theTranslator->trEnumerations()));
       
   492       m_sHandler.insert("file/memberdecl/functions", 
       
   493           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   494                                         MemberList::decFuncMembers,
       
   495                                         fortranOpt ? theTranslator->trSubprograms()  : 
       
   496                                         vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
       
   497                                         theTranslator->trFunctions())) ;
       
   498       m_sHandler.insert("file/memberdecl/variables", 
       
   499           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   500                                         MemberList::decVarMembers,theTranslator->trVariables()));
       
   501 
       
   502       m_eHandler.insert("file/memberdecl", 
       
   503           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       
   504       m_sHandler.insert("file/memberdef", 
       
   505           new StartElementHandler(this,&LayoutParser::startMemberDef));
       
   506       m_sHandler.insert("file/memberdef/defines", 
       
   507           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   508                                         MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
       
   509       m_sHandler.insert("file/memberdef/typedefs", 
       
   510           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   511                                         MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
       
   512       m_sHandler.insert("file/memberdef/enums", 
       
   513           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   514                                         MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
       
   515       m_sHandler.insert("file/memberdef/functions", 
       
   516           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   517                                         MemberList::docFuncMembers,theTranslator->trFunctionDocumentation()));
       
   518       m_sHandler.insert("file/memberdef/variables", 
       
   519           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   520                                         MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
       
   521       m_eHandler.insert("file/memberdef", 
       
   522           new EndElementHandler(this,&LayoutParser::endMemberDef));
       
   523       m_eHandler.insert("file", 
       
   524           new EndElementHandler(this,&LayoutParser::endFile));
       
   525 
       
   526       // group layout handlers
       
   527       m_sHandler.insert("group", 
       
   528           new StartElementHandler(this,&LayoutParser::startGroup));
       
   529       m_sHandler.insert("group/briefdescription", 
       
   530           new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
       
   531       m_sHandler.insert("group/detaileddescription", 
       
   532           new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
       
   533                                          theTranslator->trDetailedDescription()));
       
   534       m_sHandler.insert("group/authorsection", 
       
   535           new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry));
       
   536       m_sHandler.insert("group/groupgraph", 
       
   537           new StartElementHandlerKind(this,LayoutDocEntry::GroupGraph,&LayoutParser::startSimpleEntry));
       
   538       m_sHandler.insert("group/memberdecl/membergroups", 
       
   539           new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry));
       
   540       m_sHandler.insert("group/memberdecl", 
       
   541           new StartElementHandler(this,&LayoutParser::startMemberDecl));
       
   542       m_sHandler.insert("group/memberdecl/classes", 
       
   543           new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry,
       
   544                                          vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) :
       
   545                                          fortranOpt ? theTranslator->trDataTypes() :
       
   546                                          theTranslator->trCompounds() 
       
   547                                          ));
       
   548       m_sHandler.insert("group/memberdecl/namespaces", 
       
   549           new StartElementHandlerSection(this,LayoutDocEntry::GroupNamespaces,&LayoutParser::startSectionEntry,
       
   550                                          javaOpt ? theTranslator->trPackages() :
       
   551                                          fortranOpt ? theTranslator->trModules() :
       
   552                                          theTranslator->trNamespaces()
       
   553                                          ));
       
   554       m_sHandler.insert("group/memberdecl/dirs", 
       
   555           new StartElementHandlerSection(this,LayoutDocEntry::GroupDirs,&LayoutParser::startSectionEntry,
       
   556                                          theTranslator->trDirectories()
       
   557                                          ));
       
   558       m_sHandler.insert("group/memberdecl/nestedgroups", 
       
   559           new StartElementHandlerSection(this,LayoutDocEntry::GroupNestedGroups,&LayoutParser::startSectionEntry,
       
   560                                          theTranslator->trModules()
       
   561                                          ));
       
   562       m_sHandler.insert("group/memberdecl/files", 
       
   563           new StartElementHandlerSection(this,LayoutDocEntry::GroupFiles,&LayoutParser::startSectionEntry,
       
   564                                          theTranslator->trFile(TRUE,FALSE)
       
   565                                          ));
       
   566 
       
   567       m_sHandler.insert("group/memberdecl/defines", 
       
   568           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   569                                         MemberList::decDefineMembers,theTranslator->trDefines()));
       
   570       m_sHandler.insert("group/memberdecl/typedefs", 
       
   571           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   572                                         MemberList::decTypedefMembers,theTranslator->trTypedefs()));
       
   573       m_sHandler.insert("group/memberdecl/enums", 
       
   574           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   575                                         MemberList::decEnumMembers,theTranslator->trEnumerations()));
       
   576       m_sHandler.insert("group/memberdecl/enumvalues", 
       
   577           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   578                                         MemberList::decEnumValMembers,theTranslator->trEnumerationValues()));
       
   579       m_sHandler.insert("group/memberdecl/functions", 
       
   580           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   581                                         MemberList::decFuncMembers,
       
   582                                             fortranOpt ? theTranslator->trSubprograms()  : 
       
   583                                             vhdlOpt    ? VhdlDocGen::trFunctionAndProc() :
       
   584                                             theTranslator->trFunctions()));
       
   585       m_sHandler.insert("group/memberdecl/variables", 
       
   586           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   587                                         MemberList::decVarMembers,theTranslator->trVariables()));
       
   588       m_sHandler.insert("group/memberdecl/signals", 
       
   589           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   590                                         MemberList::decSignalMembers,theTranslator->trSignals()));
       
   591       m_sHandler.insert("group/memberdecl/publicslots", 
       
   592           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   593                                         MemberList::decPubSlotMembers,theTranslator->trPublicSlots()));
       
   594       m_sHandler.insert("group/memberdecl/protectedslots", 
       
   595           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   596                                         MemberList::decProSlotMembers,theTranslator->trProtectedSlots()));
       
   597       m_sHandler.insert("group/memberdecl/privateslots", 
       
   598           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   599                                         MemberList::decPriSlotMembers,theTranslator->trPrivateSlots()));
       
   600       m_sHandler.insert("group/memberdecl/events", 
       
   601           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   602                                         MemberList::decEventMembers,theTranslator->trEvents()));
       
   603       m_sHandler.insert("group/memberdecl/properties", 
       
   604           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   605                                         MemberList::decPropMembers,theTranslator->trProperties()));
       
   606       m_sHandler.insert("group/memberdecl/friends", 
       
   607           new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry,
       
   608                                         MemberList::decFriendMembers,theTranslator->trFriends()));
       
   609       m_eHandler.insert("group/memberdecl", 
       
   610           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       
   611       m_sHandler.insert("group/memberdef", 
       
   612           new StartElementHandler(this,&LayoutParser::startMemberDef));
       
   613       m_sHandler.insert("group/memberdef/pagedocs", 
       
   614           new StartElementHandlerKind(this,LayoutDocEntry::GroupPageDocs,&LayoutParser::startSimpleEntry));
       
   615       m_sHandler.insert("group/memberdef/defines", 
       
   616           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   617                                         MemberList::docDefineMembers,theTranslator->trDefineDocumentation()));
       
   618       m_sHandler.insert("group/memberdef/typedefs", 
       
   619           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   620                                         MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation()));
       
   621       m_sHandler.insert("group/memberdef/enums", 
       
   622           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   623                                         MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation()));
       
   624       m_sHandler.insert("group/memberdef/enumvalues", 
       
   625           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   626                                         MemberList::docEnumValMembers,theTranslator->trEnumerationValueDocumentation()));
       
   627       m_sHandler.insert("group/memberdef/functions", 
       
   628           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   629                                         MemberList::docFuncMembers,
       
   630                                         fortranOpt?
       
   631                                         theTranslator->trSubprogramDocumentation():
       
   632                                         theTranslator->trFunctionDocumentation()));
       
   633       m_sHandler.insert("group/memberdef/variables", 
       
   634           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   635                                         MemberList::docVarMembers,theTranslator->trVariableDocumentation()));
       
   636       m_sHandler.insert("group/memberdef/signals", 
       
   637           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   638                                         MemberList::docSignalMembers,theTranslator->trSignals())); 
       
   639       m_sHandler.insert("group/memberdef/publicslots", 
       
   640           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   641                                         MemberList::docPubSlotMembers,theTranslator->trPublicSlots()));
       
   642       m_sHandler.insert("group/memberdef/protectedslots", 
       
   643           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   644                                         MemberList::docProSlotMembers,theTranslator->trProtectedSlots()));
       
   645       m_sHandler.insert("group/memberdef/privateslots", 
       
   646           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   647                                         MemberList::docPriSlotMembers,theTranslator->trPrivateSlots()));
       
   648       m_sHandler.insert("group/memberdef/events", 
       
   649           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   650                                         MemberList::docEventMembers,theTranslator->trEvents()));
       
   651       m_sHandler.insert("group/memberdef/properties", 
       
   652           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   653                                         MemberList::docPropMembers,theTranslator->trProperties()));
       
   654       m_sHandler.insert("group/memberdef/friends", 
       
   655           new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry,
       
   656                                         MemberList::docFriendMembers,theTranslator->trFriends()));
       
   657       m_eHandler.insert("group/memberdef", 
       
   658           new EndElementHandler(this,&LayoutParser::endMemberDef));
       
   659       m_eHandler.insert("group", 
       
   660           new EndElementHandler(this,&LayoutParser::endGroup));
       
   661 
       
   662       // directory layout handlers
       
   663       m_sHandler.insert("directory", 
       
   664           new StartElementHandler(this,&LayoutParser::startDirectory));
       
   665       m_sHandler.insert("directory/briefdescription", 
       
   666           new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry));
       
   667       m_sHandler.insert("directory/detaileddescription", 
       
   668           new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry,
       
   669                                          theTranslator->trDetailedDescription()));
       
   670       m_sHandler.insert("directory/directorygraph", 
       
   671           new StartElementHandlerKind(this,LayoutDocEntry::DirGraph,&LayoutParser::startSimpleEntry));
       
   672       m_sHandler.insert("directory/memberdecl", 
       
   673           new StartElementHandler(this,&LayoutParser::startMemberDecl));
       
   674       m_sHandler.insert("directory/memberdecl/dirs", 
       
   675           new StartElementHandlerKind(this,LayoutDocEntry::DirSubDirs,&LayoutParser::startSimpleEntry));
       
   676       m_sHandler.insert("directory/memberdecl/files", 
       
   677           new StartElementHandlerKind(this,LayoutDocEntry::DirFiles,&LayoutParser::startSimpleEntry));
       
   678       m_eHandler.insert("directory/memberdecl", 
       
   679           new EndElementHandler(this,&LayoutParser::endMemberDecl));
       
   680       m_eHandler.insert("directory", 
       
   681           new EndElementHandler(this,&LayoutParser::endDirectory));
       
   682     }
       
   683 
       
   684     void startSimpleEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib)
       
   685     {
       
   686       bool isVisible = elemIsVisible(attrib);
       
   687       if (m_part!=-1 && isVisible)
       
   688       {
       
   689         LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   690                                               new LayoutDocEntrySimple(k));
       
   691       }
       
   692     }
       
   693 
       
   694     void startSectionEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib,
       
   695                            const QCString &title)
       
   696     {
       
   697       bool isVisible = elemIsVisible(attrib);
       
   698       QCString userTitle = convertToQCString(attrib.value("title"));
       
   699       //printf("startSectionEntry: title='%s' userTitle='%s'\n",
       
   700       //    title.data(),userTitle.data());
       
   701       if (userTitle.isEmpty())  userTitle = title;
       
   702       if (m_part!=-1 && isVisible)
       
   703       {
       
   704         LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   705                                               new LayoutDocEntrySection(k,userTitle));
       
   706       }
       
   707     }
       
   708 
       
   709 
       
   710     void startMemberDeclEntry(const QXmlAttributes &attrib,MemberList::ListType type,
       
   711                               const QCString &title,const QCString &subscript)
       
   712     {
       
   713       //QCString visible = convertToQCString(attrib.value("visible"));
       
   714       //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
       
   715       QCString userTitle     = convertToQCString(attrib.value("title"));
       
   716       QCString userSubscript = convertToQCString(attrib.value("subtitle"));
       
   717       if (userTitle.isEmpty())     userTitle     = title;
       
   718       if (userSubscript.isEmpty()) userSubscript = subscript;
       
   719       //printf("memberdecl: %s\n",userTitle.data());
       
   720       if (m_part!=-1 /*&& isVisible*/)
       
   721       {
       
   722         LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   723                                               new LayoutDocEntryMemberDecl(type,userTitle,userSubscript));
       
   724       }
       
   725     }
       
   726 
       
   727     void startMemberDefEntry(const QXmlAttributes &attrib,MemberList::ListType type,
       
   728                              const QCString &title,const QCString &)
       
   729     {
       
   730       QCString userTitle = convertToQCString(attrib.value("title"));
       
   731       if (userTitle.isEmpty()) userTitle = title;
       
   732       //printf("memberdef: %s\n",userTitle.data());
       
   733       if (m_part!=-1 /*&& isVisible*/)
       
   734       {
       
   735         LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   736                                               new LayoutDocEntryMemberDef(type,userTitle));
       
   737       }
       
   738     }
       
   739 
       
   740     void startLayout(const QXmlAttributes &)
       
   741     {
       
   742     }
       
   743 
       
   744     void endLayout()
       
   745     {
       
   746     }
       
   747 
       
   748     void startNavIndex(const QXmlAttributes &)
       
   749     {
       
   750       m_scope="navindex/";
       
   751       m_rootNav = LayoutDocManager::instance().rootNavEntry();
       
   752       m_rootNav->clear();
       
   753     }
       
   754 
       
   755     void endNavIndex()
       
   756     {
       
   757       m_scope="";
       
   758       if (!m_rootNav->find(LayoutNavEntry::MainPage))
       
   759       {
       
   760         // no MainPage node... add one the first item of the root node...
       
   761         new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE, 
       
   762             Config_getBool("GENERATE_TREEVIEW") ? "main" : "index",
       
   763             theTranslator->trMainPage(),TRUE);
       
   764       }
       
   765     }
       
   766 
       
   767     void startNavEntry(const QXmlAttributes &attrib)
       
   768     {
       
   769       bool javaOpt    = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
       
   770       bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
       
   771       bool vhdlOpt    = Config_getBool("OPTIMIZE_OUTPUT_VHDL");  
       
   772       static struct NavEntryMap
       
   773       {
       
   774         const char *typeStr;       // type attribute name in the XML file
       
   775         LayoutNavEntry::Kind kind; // corresponding enum name
       
   776         QCString mainName;         // default title for an item if it has children
       
   777         QCString subName;          // optional name for an item if it is rendered as a child
       
   778         QCString baseFile;         // base name of the file containing the index page
       
   779       } mapping[] =
       
   780       {
       
   781         { "mainpage",         LayoutNavEntry::MainPage,         theTranslator->trMainPage(),     QCString(), Config_getBool("GENERATE_TREEVIEW") ? "main" : "index" },
       
   782         { "pages",            LayoutNavEntry::Pages,            theTranslator->trRelatedPages(), QCString(), "pages"  },
       
   783         { "modules",          LayoutNavEntry::Modules,          theTranslator->trModules(),      QCString(), "modules" },
       
   784         { "namespaces",       LayoutNavEntry::Namespaces,       javaOpt    ? theTranslator->trPackages() : 
       
   785                                                                 fortranOpt ? theTranslator->trModules() : 
       
   786                                                                 theTranslator->trNamespaces(),        
       
   787                                                                 javaOpt    ? theTranslator->trPackages() :
       
   788                                                                 fortranOpt ? theTranslator->trModulesList() :
       
   789                                                                 theTranslator->trNamespaceList(), "namespaces" },
       
   790         { "namespacemembers", LayoutNavEntry::NamespaceMembers, javaOpt    ? theTranslator->trPackageMembers() :
       
   791                                                                 fortranOpt ? theTranslator->trModulesMembers() :
       
   792                                                                 theTranslator->trNamespaceMembers(), QCString(), "namespacemembers" },
       
   793         { "classindex",       LayoutNavEntry::Classes,          fortranOpt ? theTranslator->trDataTypes() :
       
   794                                                                 vhdlOpt    ? VhdlDocGen::trDesignUnits() :
       
   795                                                                 theTranslator->trCompoundIndex(),
       
   796                                                                 QCString(), "classes" },
       
   797         { "classes",          LayoutNavEntry::ClassAnnotated,   fortranOpt ? theTranslator->trCompoundListFortran() :
       
   798                                                                 vhdlOpt    ? VhdlDocGen::trDesignUnitList() :
       
   799                                                                 theTranslator->trClasses(), 
       
   800                                                                 theTranslator->trCompoundList(), "annotated" },
       
   801         { "hierarchy",        LayoutNavEntry::ClassHierarchy,   vhdlOpt    ? VhdlDocGen::trDesignUnitHierarchy() :
       
   802                                                                 theTranslator->trClassHierarchy(), QCString(), "hierarchy" },
       
   803         { "classmembers",     LayoutNavEntry::ClassMembers,     fortranOpt ? theTranslator->trCompoundMembersFortran() :
       
   804                                                                 vhdlOpt    ? VhdlDocGen::trDesignUnitMembers() :
       
   805                                                                 theTranslator->trCompoundMembers(), QCString(), "functions" },
       
   806         { "files",            LayoutNavEntry::Files,            theTranslator->trFile(TRUE,FALSE), 
       
   807                                                                 theTranslator->trFileList(), "files" },
       
   808         { "globals",          LayoutNavEntry::FileGlobals,      theTranslator->trFileMembers(), QCString(), "globals" },
       
   809         { "dirs",             LayoutNavEntry::Dirs,             theTranslator->trDirectories(), QCString(), "dirs" },
       
   810         { "examples",         LayoutNavEntry::Examples,         theTranslator->trExamples(), QCString(), "examples" },
       
   811         { 0,                 (LayoutNavEntry::Kind)0,           QCString(), QCString(), QCString() }
       
   812       };
       
   813       LayoutNavEntry::Kind kind;
       
   814       // find type in the table
       
   815       int i=0;
       
   816       QString type = attrib.value("type");
       
   817       while (mapping[i].typeStr)
       
   818       {
       
   819         if (mapping[i].typeStr==type)
       
   820         {
       
   821           kind = mapping[i].kind;
       
   822           break;
       
   823         }
       
   824         i++;
       
   825       }
       
   826       if (mapping[i].typeStr==0) 
       
   827       {
       
   828         if (type.isEmpty())
       
   829         {
       
   830           err("Warning: an entry tag within a navindex has no type attribute! Check your layout file!\n");
       
   831         }
       
   832         else
       
   833         {
       
   834           err("Warning: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n");
       
   835         }
       
   836         return;
       
   837       }
       
   838       QCString baseFile = mapping[i].baseFile;
       
   839       QCString title = convertToQCString(attrib.value("title"));
       
   840       bool isVisible = elemIsVisible(attrib);
       
   841       if (title.isEmpty()) // use default title
       
   842       { 
       
   843         title = mapping[i].mainName; // use title for main row
       
   844         if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty())
       
   845         {
       
   846           title = mapping[i].subName; // if this is a child of another row, use the subName if available
       
   847                                       // this is mainly done to get compatible naming with older versions.
       
   848         }
       
   849       }
       
   850       // create new item and make it the new root
       
   851       m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title);
       
   852     }
       
   853 
       
   854     void endNavEntry()
       
   855     {
       
   856       // set the root back to the parent
       
   857       m_rootNav = m_rootNav->parent();
       
   858     }
       
   859 
       
   860     void startClass(const QXmlAttributes &)
       
   861     {
       
   862       LayoutDocManager::instance().clear(LayoutDocManager::Class);
       
   863       m_scope="class/";
       
   864       m_part = (int)LayoutDocManager::Class;
       
   865     }
       
   866 
       
   867     void endClass()
       
   868     {
       
   869       m_scope="";
       
   870       m_part = -1;
       
   871     }
       
   872 
       
   873     void startNamespace(const QXmlAttributes &)
       
   874     {
       
   875       LayoutDocManager::instance().clear(LayoutDocManager::Namespace);
       
   876       m_scope="namespace/";
       
   877       m_part = (int)LayoutDocManager::Namespace;
       
   878     }
       
   879 
       
   880     void endNamespace()
       
   881     {
       
   882       m_scope="";
       
   883       m_part = -1;
       
   884     }
       
   885 
       
   886     void startFile(const QXmlAttributes &)
       
   887     {
       
   888       LayoutDocManager::instance().clear(LayoutDocManager::File);
       
   889       m_scope="file/";
       
   890       m_part = (int)LayoutDocManager::File;
       
   891     }
       
   892 
       
   893     void endFile()
       
   894     {
       
   895       m_scope="";
       
   896       m_part = -1;
       
   897     }
       
   898 
       
   899     void startGroup(const QXmlAttributes &)
       
   900     {
       
   901       LayoutDocManager::instance().clear(LayoutDocManager::Group);
       
   902       m_scope="group/";
       
   903       m_part = (int)LayoutDocManager::Group;
       
   904     }
       
   905 
       
   906     void endGroup()
       
   907     {
       
   908       m_scope="";
       
   909       m_part = -1;
       
   910     }
       
   911 
       
   912     void startDirectory(const QXmlAttributes &)
       
   913     {
       
   914       LayoutDocManager::instance().clear(LayoutDocManager::Directory);
       
   915       m_scope="directory/";
       
   916       m_part = (int)LayoutDocManager::Directory;
       
   917     }
       
   918 
       
   919     void endDirectory()
       
   920     {
       
   921       m_scope="";
       
   922       m_part = -1;
       
   923     }
       
   924 
       
   925     void startMemberDef(const QXmlAttributes &)
       
   926     {
       
   927       m_scope+="memberdef/";
       
   928       if (m_part!=-1)
       
   929       {
       
   930         LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   931                                               new LayoutDocEntrySimple(LayoutDocEntry::MemberDefStart));
       
   932       }
       
   933     }
       
   934 
       
   935     void endMemberDef()
       
   936     {
       
   937       int i=m_scope.findRev("memberdef/");
       
   938       if (i!=-1)
       
   939       {
       
   940         m_scope=m_scope.left(i);
       
   941         if (m_part!=-1)
       
   942         {
       
   943           LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   944                                               new LayoutDocEntrySimple(LayoutDocEntry::MemberDefEnd));
       
   945         }
       
   946       }
       
   947     }
       
   948 
       
   949     void startMemberDecl(const QXmlAttributes &)
       
   950     {
       
   951       m_scope+="memberdecl/";
       
   952       if (m_part!=-1)
       
   953       {
       
   954         LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   955                                               new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclStart));
       
   956       }
       
   957     }
       
   958 
       
   959     void endMemberDecl()
       
   960     {
       
   961       int i=m_scope.findRev("memberdecl/");
       
   962       if (i!=-1)
       
   963       {
       
   964         m_scope=m_scope.left(i);
       
   965         if (m_part!=-1)
       
   966         {
       
   967           LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part,
       
   968                                               new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclEnd));
       
   969         }
       
   970       }
       
   971     }
       
   972 
       
   973     // reimplemented from QXmlDefaultHandler
       
   974     bool startElement( const QString&, const QString&, 
       
   975                        const QString& name, const QXmlAttributes& attrib )
       
   976     {
       
   977       //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data());
       
   978       StartElementHandler *handler = m_sHandler[m_scope+name];
       
   979       if (handler)
       
   980       {
       
   981         (*handler)(attrib);
       
   982       }
       
   983       else
       
   984       {
       
   985         err("Warning: Unexpected start tag `%s' found in scope='%s'!\n",
       
   986             name.data(),m_scope.data());
       
   987       }
       
   988       return TRUE;
       
   989     }
       
   990     bool endElement( const QString&, const QString&, const QString& name )
       
   991     {
       
   992       //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data());
       
   993       EndElementHandler *handler;
       
   994       if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name+"/")
       
   995       { // element ends current scope
       
   996         handler = m_eHandler[m_scope.left(m_scope.length()-1)];
       
   997       }
       
   998       else // continue with current scope
       
   999       {
       
  1000         handler = m_eHandler[m_scope+name];
       
  1001       }
       
  1002       if (handler)
       
  1003       {
       
  1004         (*handler)();
       
  1005       }
       
  1006       return TRUE;
       
  1007     }
       
  1008     bool startDocument()
       
  1009     {
       
  1010       return TRUE;
       
  1011     }
       
  1012 
       
  1013   private:
       
  1014     LayoutParser() : m_sHandler(163), m_eHandler(17) { }
       
  1015 
       
  1016     QDict<StartElementHandler> m_sHandler;
       
  1017     QDict<EndElementHandler>   m_eHandler;
       
  1018     QString m_scope;
       
  1019     int m_part;
       
  1020     LayoutNavEntry *m_rootNav;
       
  1021 };
       
  1022 
       
  1023 //---------------------------------------------------------------------------------
       
  1024 
       
  1025 class LayoutErrorHandler : public QXmlErrorHandler
       
  1026 {
       
  1027   public:
       
  1028     bool warning( const QXmlParseException &exception )
       
  1029     {
       
  1030       err("Warning at line %d column %d: %s\n",
       
  1031           exception.lineNumber(),exception.columnNumber(),
       
  1032           exception.message().data());
       
  1033       return FALSE;
       
  1034     }
       
  1035     bool error( const QXmlParseException &exception )
       
  1036     {
       
  1037       err("Error at line %d column %d: %s\n",
       
  1038           exception.lineNumber(),exception.columnNumber(),
       
  1039           exception.message().data());
       
  1040       return FALSE;
       
  1041     }
       
  1042     bool fatalError( const QXmlParseException &exception )
       
  1043     {
       
  1044       err("Fatal error at line %d column %d: %s\n",
       
  1045           exception.lineNumber(),exception.columnNumber(),
       
  1046           exception.message().data());
       
  1047       return FALSE;
       
  1048     }
       
  1049     QString errorString() { return ""; }
       
  1050 
       
  1051   private:
       
  1052     QString errorMsg;
       
  1053 };
       
  1054 
       
  1055 //---------------------------------------------------------------------------------
       
  1056 
       
  1057 class LayoutDocManager::Private
       
  1058 {
       
  1059   public:
       
  1060     QList<LayoutDocEntry> docEntries[LayoutDocManager::NrParts];
       
  1061     LayoutNavEntry *rootNav;
       
  1062 };
       
  1063 
       
  1064 LayoutDocManager::LayoutDocManager()
       
  1065 {
       
  1066   d = new Private;
       
  1067   int i;
       
  1068   for (i=0;i<LayoutDocManager::NrParts;i++)
       
  1069   {
       
  1070     d->docEntries[i].setAutoDelete(TRUE);
       
  1071   }
       
  1072   d->rootNav = new LayoutNavEntry;
       
  1073   LayoutParser::instance().init();
       
  1074 }
       
  1075 
       
  1076 
       
  1077 void LayoutDocManager::init()
       
  1078 {
       
  1079   // parse the default layout
       
  1080   LayoutErrorHandler errorHandler;
       
  1081   QXmlInputSource source;
       
  1082   source.setData( layout_default );
       
  1083   QXmlSimpleReader reader;
       
  1084   reader.setContentHandler( &LayoutParser::instance() );
       
  1085   reader.setErrorHandler( &errorHandler );
       
  1086   reader.parse( source );
       
  1087 }
       
  1088 
       
  1089 LayoutDocManager::~LayoutDocManager()
       
  1090 {
       
  1091   delete d->rootNav;
       
  1092   delete d;
       
  1093 }
       
  1094 
       
  1095 LayoutDocManager & LayoutDocManager::instance()
       
  1096 {
       
  1097   static LayoutDocManager *theInstance = new LayoutDocManager;
       
  1098   return *theInstance;
       
  1099 }
       
  1100 
       
  1101 const QList<LayoutDocEntry> &LayoutDocManager::docEntries(LayoutDocManager::LayoutPart part) const
       
  1102 {
       
  1103   return d->docEntries[(int)part];
       
  1104 }
       
  1105 
       
  1106 LayoutNavEntry* LayoutDocManager::rootNavEntry() const
       
  1107 {
       
  1108   return d->rootNav;
       
  1109 }
       
  1110 
       
  1111 void LayoutDocManager::addEntry(LayoutDocManager::LayoutPart p,LayoutDocEntry *e)
       
  1112 {
       
  1113   d->docEntries[(int)p].append(e);
       
  1114 }
       
  1115 
       
  1116 void LayoutDocManager::clear(LayoutDocManager::LayoutPart p)
       
  1117 {
       
  1118   d->docEntries[(int)p].clear();
       
  1119 }
       
  1120 
       
  1121 void LayoutDocManager::parse(QTextStream &t)
       
  1122 {
       
  1123   LayoutErrorHandler errorHandler;
       
  1124   QXmlInputSource source( t );
       
  1125   QXmlSimpleReader reader;
       
  1126   reader.setContentHandler( &LayoutParser::instance() );
       
  1127   reader.setErrorHandler( &errorHandler );
       
  1128   reader.parse( source );
       
  1129 }
       
  1130 
       
  1131 //---------------------------------------------------------------------------------
       
  1132 
       
  1133 void writeDefaultLayoutFile(const char *fileName)
       
  1134 {
       
  1135   QFile f(fileName);
       
  1136   if (!f.open(IO_WriteOnly))
       
  1137   {
       
  1138     err("Failed to open file %s for writing!\n",fileName);
       
  1139     return;
       
  1140   }
       
  1141   QTextStream t(&f);
       
  1142   t << layout_default;
       
  1143 }