/****************************************************************************** * * * * * Copyright (C) 1997-2008 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */ #include "layout.h" #include "message.h" #include "language.h" #include "vhdldocgen.h" #include "util.h" #include #include #include #include #include static const char layout_default[] = #include "layout_default.h" ; static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE) { QCString visible = convertToQCString(attrib.value("visible")); if (visible.isEmpty()) return defVal; if (visible.at(0)=='$' && visible.length()>1) { QCString id = visible.mid(1); ConfigOption *opt = Config::instance()->get(id); if (opt && opt->kind()==ConfigOption::O_Bool) { return *((ConfigBool *)opt)->valueRef(); } else if (!opt) { err("Warning: found unsupported value %s for visible attribute in layout file\n", visible.data()); } } return visible!="no" && visible!="0"; } //--------------------------------------------------------------------------------- LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const { LayoutNavEntry *result=0; QListIterator li(m_children); LayoutNavEntry *entry; for (li.toFirst();(entry=li.current());++li) { // depth first search, needed to find the entry furthest from the // root in case an entry is in the tree twice result = entry->find(kind); if (result) return result; if (entry->kind()==kind) { return entry; } } return result; } //--------------------------------------------------------------------------------- class LayoutParser : public QXmlDefaultHandler { private: class StartElementHandler { typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib); public: StartElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {} virtual ~StartElementHandler() {} virtual void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(attrib); } protected: StartElementHandler() : m_parent(0), m_handler(0) {} private: LayoutParser *m_parent; Handler m_handler; }; class StartElementHandlerKind : public StartElementHandler { typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind, const QXmlAttributes &attrib); public: StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h) : m_parent(parent), m_kind(k), m_handler(h) {} void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(m_kind,attrib); } private: LayoutParser *m_parent; LayoutDocEntry::Kind m_kind; Handler m_handler; }; class StartElementHandlerSection : public StartElementHandler { typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind, const QXmlAttributes &attrib, const QCString &title); public: StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h, const QCString &title) : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {} void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(m_kind,attrib,m_title); } private: LayoutParser *m_parent; LayoutDocEntry::Kind m_kind; Handler m_handler; QCString m_title; }; class StartElementHandlerMember : public StartElementHandler { typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib, MemberList::ListType type, const QCString &title, const QCString &subtitle); public: StartElementHandlerMember(LayoutParser *parent, Handler h, MemberList::ListType type, const QCString &tl, const QCString &ss = QCString() ) : m_parent(parent), m_handler(h), m_type(type), m_title(tl), m_subscript(ss) {} void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript); } private: LayoutParser *m_parent; Handler m_handler; MemberList::ListType m_type; QCString m_title; QCString m_subscript; }; class StartElementHandlerNavEntry : public StartElementHandler { typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind, const QXmlAttributes &attrib, const QCString &title); public: StartElementHandlerNavEntry(LayoutParser *parent, LayoutNavEntry::Kind kind, Handler h, const QCString &tl ) : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {} void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(m_kind,attrib,m_title); } private: LayoutParser *m_parent; LayoutNavEntry::Kind m_kind; Handler m_handler; QCString m_title; }; class EndElementHandler { typedef void (LayoutParser::*Handler)(); public: EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {} void operator()() { (m_parent->*m_handler)(); } private: LayoutParser *m_parent; Handler m_handler; }; public: static LayoutParser &instance() { static LayoutParser *theInstance = new LayoutParser; return *theInstance; } void init() { m_sHandler.setAutoDelete(TRUE); m_eHandler.setAutoDelete(TRUE); m_part = -1; // invalid m_rootNav = 0; bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); // start & end handlers m_sHandler.insert("doxygenlayout", new StartElementHandler(this,&LayoutParser::startLayout)); m_eHandler.insert("doxygenlayout", new EndElementHandler(this,&LayoutParser::endLayout)); // class layout handlers m_sHandler.insert("navindex", new StartElementHandler(this,&LayoutParser::startNavIndex)); m_sHandler.insert("navindex/tab", new StartElementHandler(this,&LayoutParser::startNavEntry)); m_eHandler.insert("navindex/tab", new EndElementHandler(this,&LayoutParser::endNavEntry)); m_eHandler.insert("navindex", new EndElementHandler(this,&LayoutParser::endNavIndex)); // class layout handlers m_sHandler.insert("class", new StartElementHandler(this,&LayoutParser::startClass)); m_sHandler.insert("class/briefdescription", new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/detaileddescription", new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, theTranslator->trDetailedDescription())); m_sHandler.insert("class/authorsection", new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/includes", new StartElementHandlerKind(this,LayoutDocEntry::ClassIncludes,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/inheritancegraph", new StartElementHandlerKind(this,LayoutDocEntry::ClassInheritanceGraph,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/collaborationgraph", new StartElementHandlerKind(this,LayoutDocEntry::ClassCollaborationGraph,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/allmemberslink", new StartElementHandlerKind(this,LayoutDocEntry::ClassAllMembersLink,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/usedfiles", new StartElementHandlerKind(this,LayoutDocEntry::ClassUsedFiles,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/memberdecl", new StartElementHandler(this,&LayoutParser::startMemberDecl)); m_sHandler.insert("class/memberdecl/membergroups", new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); m_sHandler.insert("class/memberdecl/nestedclasses", new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry, vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : fortranOpt ? theTranslator->trDataTypes() : theTranslator->trCompounds() )); m_sHandler.insert("class/memberdecl/publictypes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pubTypes,theTranslator->trPublicTypes())); m_sHandler.insert("class/memberdecl/publicslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pubSlots,theTranslator->trPublicSlots())); m_sHandler.insert("class/memberdecl/signals", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::signals,theTranslator->trSignals())); m_sHandler.insert("class/memberdecl/publicmethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pubMethods,theTranslator->trPublicMembers())); m_sHandler.insert("class/memberdecl/publicstaticmethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pubStaticMethods,theTranslator->trStaticPublicMembers())); m_sHandler.insert("class/memberdecl/publicattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pubAttribs,theTranslator->trPublicAttribs())); m_sHandler.insert("class/memberdecl/publicstaticattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pubStaticAttribs,theTranslator->trStaticPublicAttribs())); m_sHandler.insert("class/memberdecl/protectedtypes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::proTypes,theTranslator->trProtectedTypes())); m_sHandler.insert("class/memberdecl/protectedslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::proSlots,theTranslator->trProtectedSlots())); m_sHandler.insert("class/memberdecl/protectedmethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::proMethods,theTranslator->trProtectedMembers())); m_sHandler.insert("class/memberdecl/protectedstaticmethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::proStaticMethods,theTranslator->trStaticProtectedMembers())); m_sHandler.insert("class/memberdecl/protectedattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::proAttribs,theTranslator->trProtectedAttribs())); m_sHandler.insert("class/memberdecl/protectedstaticattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::proStaticAttribs,theTranslator->trStaticProtectedAttribs())); m_sHandler.insert("class/memberdecl/packagetypes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pacTypes,theTranslator->trPackageTypes())); m_sHandler.insert("class/memberdecl/packagemethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pacMethods,theTranslator->trPackageMembers())); m_sHandler.insert("class/memberdecl/packagestaticmethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pacStaticMethods,theTranslator->trStaticPackageMembers())); m_sHandler.insert("class/memberdecl/packageattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pacAttribs,theTranslator->trPackageAttribs())); m_sHandler.insert("class/memberdecl/packagestaticattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::pacStaticAttribs,theTranslator->trStaticPackageAttribs())); m_sHandler.insert("class/memberdecl/properties", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::properties,theTranslator->trProperties())); m_sHandler.insert("class/memberdecl/events", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::events,theTranslator->trEvents())); m_sHandler.insert("class/memberdecl/privatetypes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::priTypes,theTranslator->trPrivateTypes())); m_sHandler.insert("class/memberdecl/privateslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::priSlots,theTranslator->trPrivateSlots())); m_sHandler.insert("class/memberdecl/privatemethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::priMethods,theTranslator->trPrivateMembers())); m_sHandler.insert("class/memberdecl/privatestaticmethods", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::priStaticMethods,theTranslator->trStaticPrivateMembers())); m_sHandler.insert("class/memberdecl/privateattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::priAttribs,theTranslator->trPrivateAttribs())); m_sHandler.insert("class/memberdecl/privatestaticattributes", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::priStaticAttribs,theTranslator->trStaticPrivateAttribs())); m_sHandler.insert("class/memberdecl/friends", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::friends,theTranslator->trFriends())); m_sHandler.insert("class/memberdecl/related", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::related,theTranslator->trRelatedFunctions(), theTranslator->trRelatedSubscript())); m_eHandler.insert("class/memberdecl", new EndElementHandler(this,&LayoutParser::endMemberDecl)); m_sHandler.insert("class/memberdef", new StartElementHandler(this,&LayoutParser::startMemberDef)); m_sHandler.insert("class/memberdef/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation())); m_sHandler.insert("class/memberdef/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation())); m_sHandler.insert("class/memberdef/constructors", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::constructors,theTranslator->trConstructorDocumentation())); m_sHandler.insert("class/memberdef/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::functionMembers, fortranOpt ? theTranslator->trMemberFunctionDocumentationFortran() : theTranslator->trMemberFunctionDocumentation())); m_sHandler.insert("class/memberdef/related", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::relatedMembers,theTranslator->trRelatedFunctionDocumentation())); m_sHandler.insert("class/memberdef/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::variableMembers,theTranslator->trMemberDataDocumentation())); m_sHandler.insert("class/memberdef/properties", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::propertyMembers,theTranslator->trPropertyDocumentation())); m_sHandler.insert("class/memberdef/events", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::eventMembers,theTranslator->trEventDocumentation())); m_eHandler.insert("class/memberdef", new EndElementHandler(this,&LayoutParser::endMemberDef)); m_eHandler.insert("class", new EndElementHandler(this,&LayoutParser::endClass)); // namespace layout handlers m_sHandler.insert("namespace", new StartElementHandler(this,&LayoutParser::startNamespace)); m_sHandler.insert("namespace/briefdescription", new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); m_sHandler.insert("namespace/detaileddescription", new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, theTranslator->trDetailedDescription())); m_sHandler.insert("namespace/authorsection", new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); m_sHandler.insert("namespace/memberdecl", new StartElementHandler(this,&LayoutParser::startMemberDecl)); m_sHandler.insert("namespace/memberdecl/nestednamespaces", new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry, javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces() )); m_sHandler.insert("namespace/memberdecl/classes", new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry, vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : fortranOpt ? theTranslator->trDataTypes() : theTranslator->trCompounds() )); m_sHandler.insert("namespace/memberdecl/membergroups", new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); m_sHandler.insert("namespace/memberdecl/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decTypedefMembers,theTranslator->trTypedefs())); m_sHandler.insert("namespace/memberdecl/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decEnumMembers,theTranslator->trEnumerations())); m_sHandler.insert("namespace/memberdecl/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decFuncMembers, fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions())); m_sHandler.insert("namespace/memberdecl/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decVarMembers,theTranslator->trVariables())); m_eHandler.insert("namespace/memberdecl", new EndElementHandler(this,&LayoutParser::endMemberDecl)); m_sHandler.insert("namespace/memberdef", new StartElementHandler(this,&LayoutParser::startMemberDef)); m_sHandler.insert("namespace/memberdef/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation())); m_sHandler.insert("namespace/memberdef/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation())); m_sHandler.insert("namespace/memberdef/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docFuncMembers, fortranOpt ? theTranslator->trSubprogramDocumentation() : theTranslator->trFunctionDocumentation())); m_sHandler.insert("namespace/memberdef/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docVarMembers,theTranslator->trVariableDocumentation())); m_eHandler.insert("namespace/memberdef", new EndElementHandler(this,&LayoutParser::endMemberDef)); m_eHandler.insert("namespace", new EndElementHandler(this,&LayoutParser::endNamespace)); // file layout handlers m_sHandler.insert("file", new StartElementHandler(this,&LayoutParser::startFile)); m_sHandler.insert("file/briefdescription", new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/detaileddescription", new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, theTranslator->trDetailedDescription())); m_sHandler.insert("file/authorsection", new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/includes", new StartElementHandlerKind(this,LayoutDocEntry::FileIncludes,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/includegraph", new StartElementHandlerKind(this,LayoutDocEntry::FileIncludeGraph,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/includedbygraph", new StartElementHandlerKind(this,LayoutDocEntry::FileIncludedByGraph,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/sourcelink", new StartElementHandlerKind(this,LayoutDocEntry::FileSourceLink,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/memberdecl/membergroups", new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); m_sHandler.insert("file/memberdecl", new StartElementHandler(this,&LayoutParser::startMemberDecl)); m_sHandler.insert("file/memberdecl/classes", new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry, vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : fortranOpt ? theTranslator->trDataTypes() : theTranslator->trCompounds() )); m_sHandler.insert("file/memberdecl/namespaces", new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry, javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces() )); m_sHandler.insert("file/memberdecl/defines", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decDefineMembers,theTranslator->trDefines())); m_sHandler.insert("file/memberdecl/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decTypedefMembers,theTranslator->trTypedefs())); m_sHandler.insert("file/memberdecl/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decEnumMembers,theTranslator->trEnumerations())); m_sHandler.insert("file/memberdecl/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decFuncMembers, fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions())) ; m_sHandler.insert("file/memberdecl/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decVarMembers,theTranslator->trVariables())); m_eHandler.insert("file/memberdecl", new EndElementHandler(this,&LayoutParser::endMemberDecl)); m_sHandler.insert("file/memberdef", new StartElementHandler(this,&LayoutParser::startMemberDef)); m_sHandler.insert("file/memberdef/defines", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docDefineMembers,theTranslator->trDefineDocumentation())); m_sHandler.insert("file/memberdef/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation())); m_sHandler.insert("file/memberdef/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation())); m_sHandler.insert("file/memberdef/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docFuncMembers,theTranslator->trFunctionDocumentation())); m_sHandler.insert("file/memberdef/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docVarMembers,theTranslator->trVariableDocumentation())); m_eHandler.insert("file/memberdef", new EndElementHandler(this,&LayoutParser::endMemberDef)); m_eHandler.insert("file", new EndElementHandler(this,&LayoutParser::endFile)); // group layout handlers m_sHandler.insert("group", new StartElementHandler(this,&LayoutParser::startGroup)); m_sHandler.insert("group/briefdescription", new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); m_sHandler.insert("group/detaileddescription", new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, theTranslator->trDetailedDescription())); m_sHandler.insert("group/authorsection", new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); m_sHandler.insert("group/groupgraph", new StartElementHandlerKind(this,LayoutDocEntry::GroupGraph,&LayoutParser::startSimpleEntry)); m_sHandler.insert("group/memberdecl/membergroups", new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); m_sHandler.insert("group/memberdecl", new StartElementHandler(this,&LayoutParser::startMemberDecl)); m_sHandler.insert("group/memberdecl/classes", new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry, vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : fortranOpt ? theTranslator->trDataTypes() : theTranslator->trCompounds() )); m_sHandler.insert("group/memberdecl/namespaces", new StartElementHandlerSection(this,LayoutDocEntry::GroupNamespaces,&LayoutParser::startSectionEntry, javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces() )); m_sHandler.insert("group/memberdecl/dirs", new StartElementHandlerSection(this,LayoutDocEntry::GroupDirs,&LayoutParser::startSectionEntry, theTranslator->trDirectories() )); m_sHandler.insert("group/memberdecl/nestedgroups", new StartElementHandlerSection(this,LayoutDocEntry::GroupNestedGroups,&LayoutParser::startSectionEntry, theTranslator->trModules() )); m_sHandler.insert("group/memberdecl/files", new StartElementHandlerSection(this,LayoutDocEntry::GroupFiles,&LayoutParser::startSectionEntry, theTranslator->trFile(TRUE,FALSE) )); m_sHandler.insert("group/memberdecl/defines", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decDefineMembers,theTranslator->trDefines())); m_sHandler.insert("group/memberdecl/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decTypedefMembers,theTranslator->trTypedefs())); m_sHandler.insert("group/memberdecl/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decEnumMembers,theTranslator->trEnumerations())); m_sHandler.insert("group/memberdecl/enumvalues", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decEnumValMembers,theTranslator->trEnumerationValues())); m_sHandler.insert("group/memberdecl/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decFuncMembers, fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions())); m_sHandler.insert("group/memberdecl/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decVarMembers,theTranslator->trVariables())); m_sHandler.insert("group/memberdecl/signals", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decSignalMembers,theTranslator->trSignals())); m_sHandler.insert("group/memberdecl/publicslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decPubSlotMembers,theTranslator->trPublicSlots())); m_sHandler.insert("group/memberdecl/protectedslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decProSlotMembers,theTranslator->trProtectedSlots())); m_sHandler.insert("group/memberdecl/privateslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decPriSlotMembers,theTranslator->trPrivateSlots())); m_sHandler.insert("group/memberdecl/events", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decEventMembers,theTranslator->trEvents())); m_sHandler.insert("group/memberdecl/properties", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decPropMembers,theTranslator->trProperties())); m_sHandler.insert("group/memberdecl/friends", new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, MemberList::decFriendMembers,theTranslator->trFriends())); m_eHandler.insert("group/memberdecl", new EndElementHandler(this,&LayoutParser::endMemberDecl)); m_sHandler.insert("group/memberdef", new StartElementHandler(this,&LayoutParser::startMemberDef)); m_sHandler.insert("group/memberdef/pagedocs", new StartElementHandlerKind(this,LayoutDocEntry::GroupPageDocs,&LayoutParser::startSimpleEntry)); m_sHandler.insert("group/memberdef/defines", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docDefineMembers,theTranslator->trDefineDocumentation())); m_sHandler.insert("group/memberdef/typedefs", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation())); m_sHandler.insert("group/memberdef/enums", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation())); m_sHandler.insert("group/memberdef/enumvalues", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docEnumValMembers,theTranslator->trEnumerationValueDocumentation())); m_sHandler.insert("group/memberdef/functions", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docFuncMembers, fortranOpt? theTranslator->trSubprogramDocumentation(): theTranslator->trFunctionDocumentation())); m_sHandler.insert("group/memberdef/variables", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docVarMembers,theTranslator->trVariableDocumentation())); m_sHandler.insert("group/memberdef/signals", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docSignalMembers,theTranslator->trSignals())); m_sHandler.insert("group/memberdef/publicslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docPubSlotMembers,theTranslator->trPublicSlots())); m_sHandler.insert("group/memberdef/protectedslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docProSlotMembers,theTranslator->trProtectedSlots())); m_sHandler.insert("group/memberdef/privateslots", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docPriSlotMembers,theTranslator->trPrivateSlots())); m_sHandler.insert("group/memberdef/events", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docEventMembers,theTranslator->trEvents())); m_sHandler.insert("group/memberdef/properties", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docPropMembers,theTranslator->trProperties())); m_sHandler.insert("group/memberdef/friends", new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, MemberList::docFriendMembers,theTranslator->trFriends())); m_eHandler.insert("group/memberdef", new EndElementHandler(this,&LayoutParser::endMemberDef)); m_eHandler.insert("group", new EndElementHandler(this,&LayoutParser::endGroup)); // directory layout handlers m_sHandler.insert("directory", new StartElementHandler(this,&LayoutParser::startDirectory)); m_sHandler.insert("directory/briefdescription", new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); m_sHandler.insert("directory/detaileddescription", new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, theTranslator->trDetailedDescription())); m_sHandler.insert("directory/directorygraph", new StartElementHandlerKind(this,LayoutDocEntry::DirGraph,&LayoutParser::startSimpleEntry)); m_sHandler.insert("directory/memberdecl", new StartElementHandler(this,&LayoutParser::startMemberDecl)); m_sHandler.insert("directory/memberdecl/dirs", new StartElementHandlerKind(this,LayoutDocEntry::DirSubDirs,&LayoutParser::startSimpleEntry)); m_sHandler.insert("directory/memberdecl/files", new StartElementHandlerKind(this,LayoutDocEntry::DirFiles,&LayoutParser::startSimpleEntry)); m_eHandler.insert("directory/memberdecl", new EndElementHandler(this,&LayoutParser::endMemberDecl)); m_eHandler.insert("directory", new EndElementHandler(this,&LayoutParser::endDirectory)); } void startSimpleEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib) { bool isVisible = elemIsVisible(attrib); if (m_part!=-1 && isVisible) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntrySimple(k)); } } void startSectionEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib, const QCString &title) { bool isVisible = elemIsVisible(attrib); QCString userTitle = convertToQCString(attrib.value("title")); //printf("startSectionEntry: title='%s' userTitle='%s'\n", // title.data(),userTitle.data()); if (userTitle.isEmpty()) userTitle = title; if (m_part!=-1 && isVisible) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntrySection(k,userTitle)); } } void startMemberDeclEntry(const QXmlAttributes &attrib,MemberList::ListType type, const QCString &title,const QCString &subscript) { //QCString visible = convertToQCString(attrib.value("visible")); //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0"); QCString userTitle = convertToQCString(attrib.value("title")); QCString userSubscript = convertToQCString(attrib.value("subtitle")); if (userTitle.isEmpty()) userTitle = title; if (userSubscript.isEmpty()) userSubscript = subscript; //printf("memberdecl: %s\n",userTitle.data()); if (m_part!=-1 /*&& isVisible*/) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntryMemberDecl(type,userTitle,userSubscript)); } } void startMemberDefEntry(const QXmlAttributes &attrib,MemberList::ListType type, const QCString &title,const QCString &) { QCString userTitle = convertToQCString(attrib.value("title")); if (userTitle.isEmpty()) userTitle = title; //printf("memberdef: %s\n",userTitle.data()); if (m_part!=-1 /*&& isVisible*/) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntryMemberDef(type,userTitle)); } } void startLayout(const QXmlAttributes &) { } void endLayout() { } void startNavIndex(const QXmlAttributes &) { m_scope="navindex/"; m_rootNav = LayoutDocManager::instance().rootNavEntry(); m_rootNav->clear(); } void endNavIndex() { m_scope=""; if (!m_rootNav->find(LayoutNavEntry::MainPage)) { // no MainPage node... add one the first item of the root node... new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE, Config_getBool("GENERATE_TREEVIEW") ? "main" : "index", theTranslator->trMainPage(),TRUE); } } void startNavEntry(const QXmlAttributes &attrib) { bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); static struct NavEntryMap { const char *typeStr; // type attribute name in the XML file LayoutNavEntry::Kind kind; // corresponding enum name QCString mainName; // default title for an item if it has children QCString subName; // optional name for an item if it is rendered as a child QCString baseFile; // base name of the file containing the index page } mapping[] = { { "mainpage", LayoutNavEntry::MainPage, theTranslator->trMainPage(), QCString(), Config_getBool("GENERATE_TREEVIEW") ? "main" : "index" }, { "pages", LayoutNavEntry::Pages, theTranslator->trRelatedPages(), QCString(), "pages" }, { "modules", LayoutNavEntry::Modules, theTranslator->trModules(), QCString(), "modules" }, { "namespaces", LayoutNavEntry::Namespaces, javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces(), javaOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(), "namespaces" }, { "namespacemembers", LayoutNavEntry::NamespaceMembers, javaOpt ? theTranslator->trPackageMembers() : fortranOpt ? theTranslator->trModulesMembers() : theTranslator->trNamespaceMembers(), QCString(), "namespacemembers" }, { "classindex", LayoutNavEntry::Classes, fortranOpt ? theTranslator->trDataTypes() : vhdlOpt ? VhdlDocGen::trDesignUnits() : theTranslator->trCompoundIndex(), QCString(), "classes" }, { "classes", LayoutNavEntry::ClassAnnotated, fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitList() : theTranslator->trClasses(), theTranslator->trCompoundList(), "annotated" }, { "hierarchy", LayoutNavEntry::ClassHierarchy, vhdlOpt ? VhdlDocGen::trDesignUnitHierarchy() : theTranslator->trClassHierarchy(), QCString(), "hierarchy" }, { "classmembers", LayoutNavEntry::ClassMembers, fortranOpt ? theTranslator->trCompoundMembersFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitMembers() : theTranslator->trCompoundMembers(), QCString(), "functions" }, { "files", LayoutNavEntry::Files, theTranslator->trFile(TRUE,FALSE), theTranslator->trFileList(), "files" }, { "globals", LayoutNavEntry::FileGlobals, theTranslator->trFileMembers(), QCString(), "globals" }, { "dirs", LayoutNavEntry::Dirs, theTranslator->trDirectories(), QCString(), "dirs" }, { "examples", LayoutNavEntry::Examples, theTranslator->trExamples(), QCString(), "examples" }, { 0, (LayoutNavEntry::Kind)0, QCString(), QCString(), QCString() } }; LayoutNavEntry::Kind kind; // find type in the table int i=0; QString type = attrib.value("type"); while (mapping[i].typeStr) { if (mapping[i].typeStr==type) { kind = mapping[i].kind; break; } i++; } if (mapping[i].typeStr==0) { if (type.isEmpty()) { err("Warning: an entry tag within a navindex has no type attribute! Check your layout file!\n"); } else { err("Warning: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n"); } return; } QCString baseFile = mapping[i].baseFile; QCString title = convertToQCString(attrib.value("title")); bool isVisible = elemIsVisible(attrib); if (title.isEmpty()) // use default title { title = mapping[i].mainName; // use title for main row if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty()) { title = mapping[i].subName; // if this is a child of another row, use the subName if available // this is mainly done to get compatible naming with older versions. } } // create new item and make it the new root m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title); } void endNavEntry() { // set the root back to the parent m_rootNav = m_rootNav->parent(); } void startClass(const QXmlAttributes &) { LayoutDocManager::instance().clear(LayoutDocManager::Class); m_scope="class/"; m_part = (int)LayoutDocManager::Class; } void endClass() { m_scope=""; m_part = -1; } void startNamespace(const QXmlAttributes &) { LayoutDocManager::instance().clear(LayoutDocManager::Namespace); m_scope="namespace/"; m_part = (int)LayoutDocManager::Namespace; } void endNamespace() { m_scope=""; m_part = -1; } void startFile(const QXmlAttributes &) { LayoutDocManager::instance().clear(LayoutDocManager::File); m_scope="file/"; m_part = (int)LayoutDocManager::File; } void endFile() { m_scope=""; m_part = -1; } void startGroup(const QXmlAttributes &) { LayoutDocManager::instance().clear(LayoutDocManager::Group); m_scope="group/"; m_part = (int)LayoutDocManager::Group; } void endGroup() { m_scope=""; m_part = -1; } void startDirectory(const QXmlAttributes &) { LayoutDocManager::instance().clear(LayoutDocManager::Directory); m_scope="directory/"; m_part = (int)LayoutDocManager::Directory; } void endDirectory() { m_scope=""; m_part = -1; } void startMemberDef(const QXmlAttributes &) { m_scope+="memberdef/"; if (m_part!=-1) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntrySimple(LayoutDocEntry::MemberDefStart)); } } void endMemberDef() { int i=m_scope.findRev("memberdef/"); if (i!=-1) { m_scope=m_scope.left(i); if (m_part!=-1) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntrySimple(LayoutDocEntry::MemberDefEnd)); } } } void startMemberDecl(const QXmlAttributes &) { m_scope+="memberdecl/"; if (m_part!=-1) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclStart)); } } void endMemberDecl() { int i=m_scope.findRev("memberdecl/"); if (i!=-1) { m_scope=m_scope.left(i); if (m_part!=-1) { LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclEnd)); } } } // reimplemented from QXmlDefaultHandler bool startElement( const QString&, const QString&, const QString& name, const QXmlAttributes& attrib ) { //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data()); StartElementHandler *handler = m_sHandler[m_scope+name]; if (handler) { (*handler)(attrib); } else { err("Warning: Unexpected start tag `%s' found in scope='%s'!\n", name.data(),m_scope.data()); } return TRUE; } bool endElement( const QString&, const QString&, const QString& name ) { //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data()); EndElementHandler *handler; if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name+"/") { // element ends current scope handler = m_eHandler[m_scope.left(m_scope.length()-1)]; } else // continue with current scope { handler = m_eHandler[m_scope+name]; } if (handler) { (*handler)(); } return TRUE; } bool startDocument() { return TRUE; } private: LayoutParser() : m_sHandler(163), m_eHandler(17) { } QDict m_sHandler; QDict m_eHandler; QString m_scope; int m_part; LayoutNavEntry *m_rootNav; }; //--------------------------------------------------------------------------------- class LayoutErrorHandler : public QXmlErrorHandler { public: bool warning( const QXmlParseException &exception ) { err("Warning at line %d column %d: %s\n", exception.lineNumber(),exception.columnNumber(), exception.message().data()); return FALSE; } bool error( const QXmlParseException &exception ) { err("Error at line %d column %d: %s\n", exception.lineNumber(),exception.columnNumber(), exception.message().data()); return FALSE; } bool fatalError( const QXmlParseException &exception ) { err("Fatal error at line %d column %d: %s\n", exception.lineNumber(),exception.columnNumber(), exception.message().data()); return FALSE; } QString errorString() { return ""; } private: QString errorMsg; }; //--------------------------------------------------------------------------------- class LayoutDocManager::Private { public: QList docEntries[LayoutDocManager::NrParts]; LayoutNavEntry *rootNav; }; LayoutDocManager::LayoutDocManager() { d = new Private; int i; for (i=0;idocEntries[i].setAutoDelete(TRUE); } d->rootNav = new LayoutNavEntry; LayoutParser::instance().init(); } void LayoutDocManager::init() { // parse the default layout LayoutErrorHandler errorHandler; QXmlInputSource source; source.setData( layout_default ); QXmlSimpleReader reader; reader.setContentHandler( &LayoutParser::instance() ); reader.setErrorHandler( &errorHandler ); reader.parse( source ); } LayoutDocManager::~LayoutDocManager() { delete d->rootNav; delete d; } LayoutDocManager & LayoutDocManager::instance() { static LayoutDocManager *theInstance = new LayoutDocManager; return *theInstance; } const QList &LayoutDocManager::docEntries(LayoutDocManager::LayoutPart part) const { return d->docEntries[(int)part]; } LayoutNavEntry* LayoutDocManager::rootNavEntry() const { return d->rootNav; } void LayoutDocManager::addEntry(LayoutDocManager::LayoutPart p,LayoutDocEntry *e) { d->docEntries[(int)p].append(e); } void LayoutDocManager::clear(LayoutDocManager::LayoutPart p) { d->docEntries[(int)p].clear(); } void LayoutDocManager::parse(QTextStream &t) { LayoutErrorHandler errorHandler; QXmlInputSource source( t ); QXmlSimpleReader reader; reader.setContentHandler( &LayoutParser::instance() ); reader.setErrorHandler( &errorHandler ); reader.parse( source ); } //--------------------------------------------------------------------------------- void writeDefaultLayoutFile(const char *fileName) { QFile f(fileName); if (!f.open(IO_WriteOnly)) { err("Failed to open file %s for writing!\n",fileName); return; } QTextStream t(&f); t << layout_default; }