layout.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  *
4  *
5  *
6  * Copyright (C) 1997-2015 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 #include "doxygen.h"
25 #include "version.h"
26 #include "config.h"
27 
28 #include <assert.h>
29 #include <qxml.h>
30 #include <qfile.h>
31 #include <qstring.h>
32 #include <qfileinfo.h>
33 #include <qtextstream.h>
34 
35 static const char layout_default[] =
36 #include "layout_default.xml.h"
37 ;
38 
39 #define ADD_OPTION(langId,text) "|"+QCString().setNum(langId)+"="+text
40 
41 #define COMPILE_FOR_1_OPTION(def,langId1,text1) \
42  def+ADD_OPTION(langId1,text1)
43 
44 #define COMPILE_FOR_2_OPTIONS(def,langId1,text1,langId2,text2) \
45  COMPILE_FOR_1_OPTION(def,langId1,text1)+ADD_OPTION(langId2,text2)
46 
47 #define COMPILE_FOR_3_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3) \
48  COMPILE_FOR_2_OPTIONS(def,langId1,text1,langId2,text2)+ADD_OPTION(langId3,text3)
49 
50 #define COMPILE_FOR_4_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3,langId4,text4) \
51  COMPILE_FOR_3_OPTIONS(def,langId1,text1,langId2,text2,langId3,text3)+ADD_OPTION(langId4,text4)
52 
53 static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE)
54 {
55  QCString visible = attrib.value("visible").utf8();
56  if (visible.isEmpty()) return defVal;
57  if (visible.at(0)=='$' && visible.length()>1)
58  {
59  QCString id = visible.mid(1);
60  ConfigOption *opt = Config::instance()->get(id);
61  if (opt && opt->kind()==ConfigOption::O_Bool)
62  {
63  return *((ConfigBool *)opt)->valueRef();
64  }
65  else if (!opt)
66  {
67  err("found unsupported value %s for visible attribute in layout file\n",
68  visible.data());
69  }
70  }
71  return visible!="no" && visible!="0";
72 }
73 
74 //---------------------------------------------------------------------------------
75 
77  const char *file) const
78 {
82  for (li.toFirst();(entry=li.current());++li)
83  {
84  // depth first search, needed to find the entry furthest from the
85  // root in case an entry is in the tree twice
86  result = entry->find(kind,file);
87  if (result) return result;
88  if (entry->kind()==kind && (file==0 || entry->baseFile()==file))
89  {
90  return entry;
91  }
92  }
93  return result;
94 }
95 
97 {
100  (kind()==LayoutNavEntry::UserGroup && url.left(9)=="usergroup"))
101  {
103  }
104  else if (url.left(5)=="@ref " || url.left(5)=="\\ref ")
105  {
106  Definition *d;
107  QCString anchor;
108  bool found=FALSE;
109  if (resolveLink(0,url.mid(5).stripWhiteSpace(),TRUE,&d,anchor))
110  {
111  if (d && d->isLinkable())
112  {
113  url=d->getOutputFileBase()+Doxygen::htmlFileExtension;
114  if (!anchor.isEmpty())
115  {
116  url+="#"+anchor;
117  }
118  found=TRUE;
119  }
120  }
121  if (!found)
122  {
123  msg("explicit link request to '%s' in layout file '%s' could not be resolved\n",qPrint(url.mid(5)),qPrint(Config_getString("LAYOUT_FILE")));
124  }
125  }
126  //printf("LayoutNavEntry::url()=%s\n",url.data());
127  return url;
128 }
129 
130 //---------------------------------------------------------------------------------
131 
133 {
134  private:
136  {
137  typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib);
138  public:
140  : m_parent(parent), m_handler(h) {}
141  virtual ~StartElementHandler() {}
142  virtual void operator()(const QXmlAttributes &attrib)
143  {
144  (m_parent->*m_handler)(attrib);
145  }
146  protected:
147  StartElementHandler() : m_parent(0), m_handler(0) {}
148  private:
150  Handler m_handler;
151  };
152 
154  {
155  typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
156  const QXmlAttributes &attrib);
157  public:
159  : m_parent(parent), m_kind(k), m_handler(h) {}
160  void operator()(const QXmlAttributes &attrib)
161  {
162  (m_parent->*m_handler)(m_kind,attrib);
163  }
164  private:
167  Handler m_handler;
168  };
169 
171  {
172  typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind,
173  const QXmlAttributes &attrib,
174  const QCString &title);
175  public:
177  const QCString &title)
178  : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {}
179  void operator()(const QXmlAttributes &attrib)
180  {
181  (m_parent->*m_handler)(m_kind,attrib,m_title);
182  }
183  private:
186  Handler m_handler;
188  };
189 
191  {
192  typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib,
194  const QCString &title,
195  const QCString &subtitle);
196  public:
198  Handler h,
199  MemberListType type,
200  const QCString &tl,
201  const QCString &ss = QCString()
202  )
203  : m_parent(parent), m_handler(h), m_type(type),
204  m_title(tl), m_subscript(ss) {}
205  void operator()(const QXmlAttributes &attrib)
206  {
207  (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript);
208  }
209  private:
211  Handler m_handler;
215  };
216 
218  {
219  typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind,
220  const QXmlAttributes &attrib,
221  const QCString &title);
222  public:
224  LayoutNavEntry::Kind kind,
225  Handler h,
226  const QCString &tl
227  )
228  : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {}
229  void operator()(const QXmlAttributes &attrib)
230  {
231  (m_parent->*m_handler)(m_kind,attrib,m_title);
232  }
233  private:
236  Handler m_handler;
238  };
239 
241  {
242  typedef void (LayoutParser::*Handler)();
243  public:
244  EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
245  void operator()() { (m_parent->*m_handler)(); }
246  private:
248  Handler m_handler;
249  };
250 
251 
252  public:
254  {
255  static LayoutParser *theInstance = new LayoutParser;
256  return *theInstance;
257  }
258  void init()
259  {
260  m_sHandler.setAutoDelete(TRUE);
261  m_eHandler.setAutoDelete(TRUE);
262  m_part = -1; // invalid
263  m_rootNav = 0;
264 
265  //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
266  //bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
267  //bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
268 
269  // start & end handlers
270  m_sHandler.insert("doxygenlayout",
272  m_eHandler.insert("doxygenlayout",
274 
275  // class layout handlers
276  m_sHandler.insert("navindex",
278  m_sHandler.insert("navindex/tab",
280  m_eHandler.insert("navindex/tab",
282  m_eHandler.insert("navindex",
284 
285  // class layout handlers
286  m_sHandler.insert("class",
288  m_sHandler.insert("class/briefdescription",
290  m_sHandler.insert("class/detaileddescription",
293  m_sHandler.insert("class/authorsection",
295  m_sHandler.insert("class/includes",
297  m_sHandler.insert("class/inheritancegraph",
299  m_sHandler.insert("class/collaborationgraph",
301  m_sHandler.insert("class/allmemberslink",
303  m_sHandler.insert("class/usedfiles",
305  m_sHandler.insert("class/memberdecl",
307  m_sHandler.insert("class/memberdecl/membergroups",
309  m_sHandler.insert("class/memberdecl/nestedclasses",
315  )));
316  m_sHandler.insert("class/memberdecl/services",
319  m_sHandler.insert("class/memberdecl/interfaces",
322  m_sHandler.insert("class/memberdecl/publictypes",
325  m_sHandler.insert("class/memberdecl/publicslots",
328  m_sHandler.insert("class/memberdecl/signals",
331  m_sHandler.insert("class/memberdecl/publicmethods",
337  )));
338  m_sHandler.insert("class/memberdecl/publicstaticmethods",
344  )));
345  m_sHandler.insert("class/memberdecl/publicattributes",
348  m_sHandler.insert("class/memberdecl/publicstaticattributes",
351  m_sHandler.insert("class/memberdecl/protectedtypes",
354  m_sHandler.insert("class/memberdecl/protectedslots",
357  m_sHandler.insert("class/memberdecl/protectedmethods",
360  m_sHandler.insert("class/memberdecl/protectedstaticmethods",
363  m_sHandler.insert("class/memberdecl/protectedattributes",
366  m_sHandler.insert("class/memberdecl/protectedstaticattributes",
369  m_sHandler.insert("class/memberdecl/packagetypes",
372  m_sHandler.insert("class/memberdecl/packagemethods",
375  m_sHandler.insert("class/memberdecl/packagestaticmethods",
378  m_sHandler.insert("class/memberdecl/packageattributes",
381  m_sHandler.insert("class/memberdecl/packagestaticattributes",
384  m_sHandler.insert("class/memberdecl/properties",
387  m_sHandler.insert("class/memberdecl/events",
390  m_sHandler.insert("class/memberdecl/privatetypes",
393  m_sHandler.insert("class/memberdecl/privateslots",
396  m_sHandler.insert("class/memberdecl/privatemethods",
399  m_sHandler.insert("class/memberdecl/privatestaticmethods",
402  m_sHandler.insert("class/memberdecl/privateattributes",
405  m_sHandler.insert("class/memberdecl/privatestaticattributes",
408  m_sHandler.insert("class/memberdecl/friends",
411  m_sHandler.insert("class/memberdecl/related",
415  m_eHandler.insert("class/memberdecl",
417  m_sHandler.insert("class/memberdef",
419  m_sHandler.insert("class/memberdef/inlineclasses",
424  )));
425  m_sHandler.insert("class/memberdef/typedefs",
428  m_sHandler.insert("class/memberdef/enums",
431  m_sHandler.insert("class/memberdef/services",
434  m_sHandler.insert("class/memberdef/interfaces",
437  m_sHandler.insert("class/memberdef/constructors",
440  m_sHandler.insert("class/memberdef/functions",
447  )));
448  m_sHandler.insert("class/memberdef/related",
451  m_sHandler.insert("class/memberdef/variables",
454  m_sHandler.insert("class/memberdef/properties",
457  m_sHandler.insert("class/memberdef/events",
460  m_eHandler.insert("class/memberdef",
462  m_eHandler.insert("class",
464 
465 
466  // namespace layout handlers
467  m_sHandler.insert("namespace",
469  m_sHandler.insert("namespace/briefdescription",
471  m_sHandler.insert("namespace/detaileddescription",
474  m_sHandler.insert("namespace/authorsection",
476  m_sHandler.insert("namespace/memberdecl",
478  m_sHandler.insert("namespace/memberdecl/nestednamespaces",
486  )));
487  m_sHandler.insert("namespace/memberdecl/constantgroups",
490  m_sHandler.insert("namespace/memberdecl/classes",
496  )));
497  m_sHandler.insert("namespace/memberdecl/membergroups",
499  m_sHandler.insert("namespace/memberdecl/typedefs",
502  m_sHandler.insert("namespace/memberdecl/enums",
505  m_sHandler.insert("namespace/memberdecl/functions",
512  )));
513  m_sHandler.insert("namespace/memberdecl/variables",
516  m_eHandler.insert("namespace/memberdecl",
518  m_sHandler.insert("namespace/memberdef",
520  m_sHandler.insert("namespace/memberdef/inlineclasses",
525  )));
526  m_sHandler.insert("namespace/memberdef/typedefs",
529  m_sHandler.insert("namespace/memberdef/enums",
532  m_sHandler.insert("namespace/memberdef/functions",
538  )));
539  m_sHandler.insert("namespace/memberdef/variables",
542  m_eHandler.insert("namespace/memberdef",
544  m_eHandler.insert("namespace",
546 
547  // file layout handlers
548  m_sHandler.insert("file",
550  m_sHandler.insert("file/briefdescription",
552  m_sHandler.insert("file/detaileddescription",
555  m_sHandler.insert("file/authorsection",
557  m_sHandler.insert("file/includes",
559  m_sHandler.insert("file/includegraph",
561  m_sHandler.insert("file/includedbygraph",
563  m_sHandler.insert("file/sourcelink",
565  m_sHandler.insert("file/memberdecl/membergroups",
567  m_sHandler.insert("file/memberdecl",
569  m_sHandler.insert("file/memberdecl/classes",
575  )));
576  m_sHandler.insert("file/memberdecl/namespaces",
583  )));
584  m_sHandler.insert("file/memberdecl/constantgroups",
587  m_sHandler.insert("file/memberdecl/defines",
590  m_sHandler.insert("file/memberdecl/typedefs",
593  m_sHandler.insert("file/memberdecl/enums",
596  m_sHandler.insert("file/memberdecl/functions",
603  )));
604  m_sHandler.insert("file/memberdecl/variables",
607 
608  m_eHandler.insert("file/memberdecl",
610  m_sHandler.insert("file/memberdef",
612  m_sHandler.insert("file/memberdef/inlineclasses",
617  )));
618  m_sHandler.insert("file/memberdef/defines",
621  m_sHandler.insert("file/memberdef/typedefs",
624  m_sHandler.insert("file/memberdef/enums",
628  m_sHandler.insert("file/memberdef/functions",
634  )));
635  m_sHandler.insert("file/memberdef/variables",
638  m_eHandler.insert("file/memberdef",
640  m_eHandler.insert("file",
642 
643  // group layout handlers
644  m_sHandler.insert("group",
646  m_sHandler.insert("group/briefdescription",
648  m_sHandler.insert("group/detaileddescription",
651  m_sHandler.insert("group/authorsection",
653  m_sHandler.insert("group/groupgraph",
655  m_sHandler.insert("group/memberdecl/membergroups",
657  m_sHandler.insert("group/memberdecl",
659  m_sHandler.insert("group/memberdecl/classes",
665  )));
666  m_sHandler.insert("group/memberdecl/namespaces",
672  )));
673  m_sHandler.insert("group/memberdecl/dirs",
676  ));
677  m_sHandler.insert("group/memberdecl/nestedgroups",
680  ));
681  m_sHandler.insert("group/memberdecl/files",
684  ));
685 
686  m_sHandler.insert("group/memberdecl/defines",
689  m_sHandler.insert("group/memberdecl/typedefs",
692  m_sHandler.insert("group/memberdecl/enums",
695  m_sHandler.insert("group/memberdecl/enumvalues",
698  m_sHandler.insert("group/memberdecl/functions",
705  )));
706  m_sHandler.insert("group/memberdecl/variables",
709  m_sHandler.insert("group/memberdecl/signals",
712  m_sHandler.insert("group/memberdecl/publicslots",
715  m_sHandler.insert("group/memberdecl/protectedslots",
718  m_sHandler.insert("group/memberdecl/privateslots",
721  m_sHandler.insert("group/memberdecl/events",
724  m_sHandler.insert("group/memberdecl/properties",
727  m_sHandler.insert("group/memberdecl/friends",
730  m_eHandler.insert("group/memberdecl",
732  m_sHandler.insert("group/memberdef",
734  m_sHandler.insert("group/memberdef/pagedocs",
736  m_sHandler.insert("group/memberdef/inlineclasses",
741  )));
742  m_sHandler.insert("group/memberdef/defines",
745  m_sHandler.insert("group/memberdef/typedefs",
748  m_sHandler.insert("group/memberdef/enums",
751  m_sHandler.insert("group/memberdef/enumvalues",
754  m_sHandler.insert("group/memberdef/functions",
760  )));
761  m_sHandler.insert("group/memberdef/variables",
764  m_sHandler.insert("group/memberdef/signals",
767  m_sHandler.insert("group/memberdef/publicslots",
770  m_sHandler.insert("group/memberdef/protectedslots",
773  m_sHandler.insert("group/memberdef/privateslots",
776  m_sHandler.insert("group/memberdef/events",
779  m_sHandler.insert("group/memberdef/properties",
782  m_sHandler.insert("group/memberdef/friends",
785  m_eHandler.insert("group/memberdef",
787  m_eHandler.insert("group",
789 
790  // directory layout handlers
791  m_sHandler.insert("directory",
793  m_sHandler.insert("directory/briefdescription",
795  m_sHandler.insert("directory/detaileddescription",
798  m_sHandler.insert("directory/directorygraph",
800  m_sHandler.insert("directory/memberdecl",
802  m_sHandler.insert("directory/memberdecl/dirs",
804  m_sHandler.insert("directory/memberdecl/files",
806  m_eHandler.insert("directory/memberdecl",
808  m_eHandler.insert("directory",
810  }
811 
813  {
814  bool isVisible = elemIsVisible(attrib);
815  if (m_part!=-1 && isVisible)
816  {
818  new LayoutDocEntrySimple(k));
819  }
820  }
821 
823  const QCString &title)
824  {
825  bool isVisible = elemIsVisible(attrib);
826  QCString userTitle = attrib.value("title").utf8();
827  //printf("startSectionEntry: title='%s' userTitle='%s'\n",
828  // title.data(),userTitle.data());
829  if (userTitle.isEmpty()) userTitle = title;
830  if (m_part!=-1 && isVisible)
831  {
833  new LayoutDocEntrySection(k,userTitle));
834  }
835  }
836 
837 
839  const QCString &title,const QCString &subscript)
840  {
841  //QCString visible = convertToQCString(attrib.value("visible"));
842  //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0");
843  QCString userTitle = attrib.value("title").utf8();
844  QCString userSubscript = attrib.value("subtitle").utf8();
845  if (userTitle.isEmpty()) userTitle = title;
846  if (userSubscript.isEmpty()) userSubscript = subscript;
847  //printf("memberdecl: %s\n",userTitle.data());
848  if (m_part!=-1 /*&& isVisible*/)
849  {
851  new LayoutDocEntryMemberDecl(type,userTitle,userSubscript));
852  }
853  }
854 
856  const QCString &title,const QCString &)
857  {
858  QCString userTitle = attrib.value("title").utf8();
859  if (userTitle.isEmpty()) userTitle = title;
860  //printf("memberdef: %s\n",userTitle.data());
861  if (m_part!=-1 /*&& isVisible*/)
862  {
864  new LayoutDocEntryMemberDef(type,userTitle));
865  }
866  }
867 
869  {
870  }
871 
872  void endLayout()
873  {
874  }
875 
877  {
878  m_scope="navindex/";
880  if (m_rootNav) m_rootNav->clear();
881  }
882 
883  void endNavIndex()
884  {
885  m_scope="";
886  if (m_rootNav && !m_rootNav->find(LayoutNavEntry::MainPage))
887  {
888  // no MainPage node... add one as the first item of the root node...
890  /*Config_getBool("GENERATE_TREEVIEW") ? "main" :*/ "index",
892  }
893  }
894 
895  void startNavEntry(const QXmlAttributes &attrib)
896  {
897  static bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
898  static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
899  static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
900  static bool hasGraphicalHierarchy = Config_getBool("HAVE_DOT") &&
901  Config_getBool("GRAPHICAL_HIERARCHY");
902  static bool extractAll = Config_getBool("EXTRACT_ALL");
903  static struct NavEntryMap
904  {
905  const char *typeStr; // type attribute name in the XML file
906  LayoutNavEntry::Kind kind; // corresponding enum name
907  QCString mainName; // default title for an item if it has children
908  QCString subName; // optional name for an item if it is rendered as a child
909  QCString intro; // introduction text to be put on the index page
910  QCString baseFile; // base name of the file containing the index page
911  } mapping[] =
912  {
913  { "mainpage",
916  QCString(),
917  QCString(),
918  "index"
919  },
920  { "pages",
923  QCString(),
925  "pages"
926  },
927  { "modules",
930  QCString(),
932  "modules"
933  },
934  { "namespaces",
936  javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModules() : theTranslator->trNamespaces(),
937  javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
938  javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
939  "namespaces"
940  },
941  { "namespacelist",
943  javaOpt || vhdlOpt ? theTranslator->trPackages() : fortranOpt ? theTranslator->trModulesList() : theTranslator->trNamespaceList(),
944  QCString(),
945  javaOpt || vhdlOpt ? theTranslator->trPackageListDescription() : fortranOpt ? theTranslator->trModulesListDescription(extractAll) : theTranslator->trNamespaceListDescription(extractAll),
946  "namespaces"
947  },
948  { "namespacemembers",
950  javaOpt || vhdlOpt ? theTranslator->trPackageMembers() : fortranOpt ? theTranslator->trModulesMembers() : theTranslator->trNamespaceMembers(),
951  QCString(),
953  "namespacemembers"
954  },
955  { "classindex",
958  QCString(),
959  QCString(),
960  "classes"
961  },
962  { "classes",
967  "annotated"
968  },
969  { "classlist",
972  QCString(),
974  "annotated"
975  },
976  { "hierarchy",
979  QCString(),
981  hasGraphicalHierarchy ? "inherits" : "hierarchy"
982  },
983  { "classmembers",
986  QCString(),
988  "functions"
989  },
990  { "files",
995  "files"
996  },
997  { "filelist",
1000  QCString(),
1001  theTranslator->trFileListDescription(extractAll),
1002  "files"
1003  },
1004  { "globals",
1007  QCString(),
1009  "globals"
1010  },
1011  //{ "dirs",
1012  // LayoutNavEntry::Dirs,
1013  // theTranslator->trDirectories(),
1014  // QCString(),
1015  // theTranslator->trDirDescription(),
1016  // "dirs"
1017  //},
1018  { "examples",
1021  QCString(),
1023  "examples"
1024  },
1025  { "user",
1027  QCString(),
1028  QCString(),
1029  QCString(),
1030  "user"
1031  },
1032  { "usergroup",
1034  QCString(),
1035  QCString(),
1036  QCString(),
1037  "usergroup"
1038  },
1039  { 0, // end of list
1041  QCString(),
1042  QCString(),
1043  QCString(),
1044  QCString()
1045  }
1046  };
1048  // find type in the table
1049  int i=0;
1050  QString type = attrib.value("type");
1051  while (mapping[i].typeStr)
1052  {
1053  if (mapping[i].typeStr==type)
1054  {
1055  kind = mapping[i].kind;
1056  break;
1057  }
1058  i++;
1059  }
1060  if (mapping[i].typeStr==0)
1061  {
1062  if (type.isEmpty())
1063  {
1064  err("an entry tag within a navindex has no type attribute! Check your layout file!\n");
1065  }
1066  else
1067  {
1068  err("the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data());
1069  }
1070  m_invalidEntry=TRUE;
1071  return;
1072  }
1073  QCString baseFile = mapping[i].baseFile;
1074  QCString title = attrib.value("title").utf8();
1075  bool isVisible = elemIsVisible(attrib);
1076  if (title.isEmpty()) // use default title
1077  {
1078  title = mapping[i].mainName; // use title for main row
1079  if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty())
1080  {
1081  title = mapping[i].subName; // if this is a child of another row, use the subName if available
1082  // this is mainly done to get compatible naming with older versions.
1083  }
1084  }
1085  QCString intro = attrib.value("intro").utf8();
1086  if (intro.isEmpty()) // use default intro text
1087  {
1088  intro = mapping[i].intro;
1089  }
1090  QCString url = attrib.value("url").utf8();
1091  if (mapping[i].kind==LayoutNavEntry::User && !url.isEmpty())
1092  {
1093  baseFile=url;
1094  }
1095  else if (kind==LayoutNavEntry::UserGroup)
1096  {
1097  if (!url.isEmpty())
1098  {
1099  baseFile=url;
1100  }
1101  else
1102  {
1103  baseFile+=QCString().sprintf("%d",m_userGroupCount++);
1104  }
1105  }
1106  // create new item and make it the new root
1107  m_rootNav = new LayoutNavEntry(m_rootNav,kind,isVisible,baseFile,title,intro);
1108  }
1109 
1111  {
1112  // set the root back to the parent
1113  if (m_rootNav && !m_invalidEntry) m_rootNav = m_rootNav->parent();
1114  m_invalidEntry=FALSE;
1115  }
1116 
1118  {
1120  m_scope="class/";
1121  m_part = (int)LayoutDocManager::Class;
1122  }
1123 
1124  void endClass()
1125  {
1126  m_scope="";
1127  m_part = -1;
1128  }
1129 
1131  {
1133  m_scope="namespace/";
1134  m_part = (int)LayoutDocManager::Namespace;
1135  }
1136 
1138  {
1139  m_scope="";
1140  m_part = -1;
1141  }
1142 
1144  {
1146  m_scope="file/";
1147  m_part = (int)LayoutDocManager::File;
1148  }
1149 
1150  void endFile()
1151  {
1152  m_scope="";
1153  m_part = -1;
1154  }
1155 
1157  {
1159  m_scope="group/";
1160  m_part = (int)LayoutDocManager::Group;
1161  }
1162 
1163  void endGroup()
1164  {
1165  m_scope="";
1166  m_part = -1;
1167  }
1168 
1170  {
1172  m_scope="directory/";
1173  m_part = (int)LayoutDocManager::Directory;
1174  }
1175 
1177  {
1178  m_scope="";
1179  m_part = -1;
1180  }
1181 
1183  {
1184  m_scope+="memberdef/";
1185  if (m_part!=-1)
1186  {
1189  }
1190  }
1191 
1193  {
1194  int i=m_scope.findRev("memberdef/");
1195  if (i!=-1)
1196  {
1197  m_scope=m_scope.left(i);
1198  if (m_part!=-1)
1199  {
1202  }
1203  }
1204  }
1205 
1207  {
1208  m_scope+="memberdecl/";
1209  if (m_part!=-1)
1210  {
1213  }
1214  }
1215 
1217  {
1218  int i=m_scope.findRev("memberdecl/");
1219  if (i!=-1)
1220  {
1221  m_scope=m_scope.left(i);
1222  if (m_part!=-1)
1223  {
1226  }
1227  }
1228  }
1229 
1230  // reimplemented from QXmlDefaultHandler
1231  bool startElement( const QString&, const QString&,
1232  const QString& name, const QXmlAttributes& attrib )
1233  {
1234  //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data());
1235  StartElementHandler *handler = m_sHandler[m_scope+name.utf8()];
1236  if (handler)
1237  {
1238  (*handler)(attrib);
1239  }
1240  else
1241  {
1242  err("Unexpected start tag `%s' found in scope='%s'!\n",
1243  name.data(),m_scope.data());
1244  }
1245  return TRUE;
1246  }
1247  bool endElement( const QString&, const QString&, const QString& name )
1248  {
1249  //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data());
1251  if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name.utf8()+"/")
1252  { // element ends current scope
1253  handler = m_eHandler[m_scope.left(m_scope.length()-1)];
1254  }
1255  else // continue with current scope
1256  {
1257  handler = m_eHandler[m_scope+name.utf8()];
1258  }
1259  if (handler)
1260  {
1261  (*handler)();
1262  }
1263  return TRUE;
1264  }
1266  {
1267  return TRUE;
1268  }
1269 
1270  private:
1271  LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE) { }
1272  ~LayoutParser() { delete m_rootNav; }
1273 
1274  QDict<StartElementHandler> m_sHandler;
1275  QDict<EndElementHandler> m_eHandler;
1277  int m_part;
1280  static int m_userGroupCount;
1281 };
1282 
1284 
1285 //---------------------------------------------------------------------------------
1286 
1288 {
1289  public:
1290  LayoutErrorHandler(const char *fn) : fileName(fn) {}
1292  {
1293  warn_uncond("at line %d column %d of %s: %s\n",
1294  exception.lineNumber(),exception.columnNumber(),fileName.data(),
1295  exception.message().data());
1296  return FALSE;
1297  }
1299  {
1300  err("at line %d column %d of %s: %s\n",
1301  exception.lineNumber(),exception.columnNumber(),fileName.data(),
1302  exception.message().data());
1303  return FALSE;
1304  }
1306  {
1307  err("fatal: at line %d column %d of %s: %s\n",
1308  exception.lineNumber(),exception.columnNumber(),fileName.data(),
1309  exception.message().data());
1310  return FALSE;
1311  }
1312  QString errorString() { return ""; }
1313 
1314  private:
1317 };
1318 
1319 //---------------------------------------------------------------------------------
1320 
1322 {
1323  public:
1326 };
1327 
1329 {
1330  d = new Private;
1331  int i;
1332  for (i=0;i<LayoutDocManager::NrParts;i++)
1333  {
1334  d->docEntries[i].setAutoDelete(TRUE);
1335  }
1336  d->rootNav = new LayoutNavEntry;
1338 }
1339 
1340 
1342 {
1343  // parse the default layout
1344  LayoutErrorHandler errorHandler( "layout_default.xml" );
1345  QXmlInputSource source;
1346  source.setData( layout_default );
1347  QXmlSimpleReader reader;
1349  reader.setErrorHandler( &errorHandler );
1350  reader.parse( source );
1351 }
1352 
1354 {
1355  delete d->rootNav;
1356  delete d;
1357 }
1358 
1360 {
1361  static LayoutDocManager *theInstance = new LayoutDocManager;
1362  return *theInstance;
1363 }
1364 
1366 {
1367  return d->docEntries[(int)part];
1368 }
1369 
1371 {
1372  return d->rootNav;
1373 }
1374 
1376 {
1377  d->docEntries[(int)p].append(e);
1378 }
1379 
1381 {
1382  d->docEntries[(int)p].clear();
1383 }
1384 
1386 {
1387  LayoutErrorHandler errorHandler(fileName);
1388  QXmlInputSource source( t );
1389  QXmlSimpleReader reader;
1391  reader.setErrorHandler( &errorHandler );
1392  reader.parse( source );
1393 }
1394 
1395 //---------------------------------------------------------------------------------
1396 
1398 {
1399  QFile f(fileName);
1400  bool ok = openOutputFile(fileName,f);
1401  if (!ok)
1402  {
1403  err("Failed to open file %s for writing!\n",fileName);
1404  return;
1405  }
1406  QTextStream t(&f);
1407  t << substitute(layout_default,"$doxygenversion",versionString);
1408 }
1409 
1410 //----------------------------------------------------------------------------------
1411 
1412 // Convert input to a title.
1413 // The format of input can be a simple title "A title" or in case there are different
1414 // titles for some programming languages they can take the following form:
1415 // "A title|16=Another title|8=Yet Another title"
1416 // where the number is a value of SrcLangExt in decimal notation (i.e. 16=Java, 8=IDL).
1418 {
1419  int i,s=0,e=input.find('|');
1420  if (e==-1) return input; // simple title case
1421  int e1=e;
1422  while (e!=-1) // look for 'number=title' pattern separated by '|'
1423  {
1424  s=e+1;
1425  e=input.find('|',s);
1426  i=input.find('=',s);
1427  assert(i>s);
1428  int key=input.mid(s,i-s).toInt();
1429  if (key==(int)lang) // found matching key
1430  {
1431  if (e==-1) e=input.length();
1432  return input.mid(i+1,e-i-1);
1433  }
1434  }
1435  return input.left(e1); // fallback, no explicit language key found
1436 }
1437 
1438 //----------------------------------------------------------------------------------
1439 
1441 {
1443 }
1444 
1445 //----------------------------------------------------------------------------------
1446 
1448 {
1450 }
1451 
1453 {
1454  return extractLanguageSpecificTitle(m_subscript,lang);
1455 }
1456 
1457 //----------------------------------------------------------------------------------
1458 
1460 {
1462 }
1463 
1464 
1465 
1466 
static QCString name
Definition: declinfo.cpp:673
virtual QCString trSubprograms()=0
virtual QCString trPublicMembers()=0
virtual QCString trExamples()=0
virtual QCString trTypedefs()=0
virtual QCString trPackageTypes()=0
virtual QCString trEnumerationTypeDocumentation()=0
bool error(const QXmlParseException &exception)
Definition: layout.cpp:1298
virtual QCString trClassHierarchy()=0
QDict< StartElementHandler > m_sHandler
Definition: layout.cpp:1274
virtual QCString trPackageListDescription()=0
virtual QCString trStaticProtectedMembers()=0
QCString stripWhiteSpace() const
Definition: qcstring.cpp:295
void endNamespace()
Definition: layout.cpp:1137
bool isEmpty() const
Definition: qstring.h:682
virtual QCString trClasses()=0
QList< Entry > entry
LayoutNavEntry * find(LayoutNavEntry::Kind k, const char *file=0) const
Definition: layout.cpp:76
void clear(LayoutPart p)
Definition: layout.cpp:1380
virtual QCString trFile(bool first_capital, bool singular)=0
void endClass()
Definition: layout.cpp:1124
virtual QCString trModulesDescription()=0
virtual QCString trCompoundListFortran()=0
bool openOutputFile(const char *outFile, QFile &f)
Definition: util.cpp:8588
virtual QCString trCompounds()=0
bool resolveLink(const char *scName, const char *lr, bool, Definition **resContext, QCString &resAnchor)
Definition: util.cpp:4753
static QCString trVhdlType(uint64 type, bool sing=true)
static QCString result
bool isEmpty() const
Definition: qcstring.h:189
virtual QCString trStaticPrivateMembers()=0
void msg(const char *fmt,...)
Definition: message.cpp:107
Represents of a piece of a documentation page without configurable parts.
Definition: layout.h:70
QCString url() const
Definition: layout.cpp:96
uint length() const
Definition: qcstring.h:195
virtual QCString trEnumerationValues()=0
virtual QCString trStaticPackageAttribs()=0
void startSectionEntry(LayoutDocEntry::Kind k, const QXmlAttributes &attrib, const QCString &title)
Definition: layout.cpp:822
QDict< EndElementHandler > m_eHandler
Definition: layout.cpp:1275
LayoutNavEntry * m_parent
Definition: layout.h:162
void startFile(const QXmlAttributes &)
Definition: layout.cpp:1143
static QCString htmlFileExtension
Definition: doxygen.h:130
static QCString trFunctionAndProc()
StartElementHandlerNavEntry(LayoutParser *parent, LayoutNavEntry::Kind kind, Handler h, const QCString &tl)
Definition: layout.cpp:223
virtual QCString trInstanceMethods()=0
virtual QCString trFriends()=0
void startNavEntry(const QXmlAttributes &attrib)
Definition: layout.cpp:895
char & at(uint i) const
Definition: qcstring.h:326
opt
Definition: train.py:196
void startNavIndex(const QXmlAttributes &)
Definition: layout.cpp:876
bool parse(const QXmlInputSource &input)
Definition: qxml.cpp:2077
#define COMPILE_FOR_4_OPTIONS(def, langId1, text1, langId2, text2, langId3, text3, langId4, text4)
Definition: layout.cpp:50
virtual QCString trClassMethods()=0
QCString title(SrcLangExt lang) const
Definition: layout.cpp:1459
virtual QCString trCompoundIndex()=0
virtual QCString trRelatedFunctions()=0
static QCString trDesignUnitList()
const bool FALSE
Definition: qglobal.h:370
static LayoutDocManager & instance()
Definition: layout.cpp:1359
LayoutNavEntry()
Definition: layout.h:161
Definition: types.h:26
int columnNumber() const
Definition: qxml.cpp:231
virtual QCString trMemberFunctionDocumentation()=0
void startMemberDefEntry(const QXmlAttributes &attrib, MemberListType type, const QCString &title, const QCString &)
Definition: layout.cpp:855
Kind m_kind
Definition: layout.h:163
static QCString trDesignUnits()
StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k, Handler h)
Definition: layout.cpp:158
const std::string instance
virtual QCString trDetailedDescription()=0
virtual QCString trPrivateTypes()=0
virtual QCString trProtectedMembers()=0
QCString left(uint len) const
Definition: qcstring.cpp:213
The QString class provides an abstraction of Unicode text and the classic C null-terminated char arra...
Definition: qstring.h:350
virtual QCString trMemberTypedefDocumentation()=0
virtual QCString trRelatedPagesDescription()=0
virtual QCString trFileMembers()=0
static bool elemIsVisible(const QXmlAttributes &attrib, bool defVal=TRUE)
Definition: layout.cpp:53
void setErrorHandler(QXmlErrorHandler *handler)
Definition: qxml.cpp:2051
The QXmlErrorHandler class provides an interface to report errors in XML data.
Definition: qxml.h:420
QString message() const
Definition: qxml.cpp:224
int find(char c, int index=0, bool cs=TRUE) const
Definition: qcstring.cpp:41
virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)=0
virtual QCString trMemberEnumerationDocumentation()=0
OptionType kind() const
Definition: config.h:65
bool startElement(const QString &, const QString &, const QString &name, const QXmlAttributes &attrib)
Definition: layout.cpp:1231
const QList< LayoutDocEntry > & docEntries(LayoutPart part) const
Definition: layout.cpp:1365
void addEntry(LayoutPart p, LayoutDocEntry *e)
Definition: layout.cpp:1375
virtual QCString trDirectories()=0
virtual QCString trPublicTypes()=0
QString value(int index) const
Definition: qxml.cpp:664
QCString extractLanguageSpecificTitle(const QCString &input, SrcLangExt lang)
Definition: layout.cpp:1417
SrcLangExt
Definition: types.h:41
void parse(QTextStream &t, const char *fileName)
Definition: layout.cpp:1385
Represents of a member definition list with configurable title.
Definition: layout.h:105
QCString title(SrcLangExt lang) const
Definition: layout.cpp:1440
Base class for the layout of a navigation item at the top of the HTML pages.
Definition: layout.h:118
virtual QCString trFileListDescription(bool extractAll)=0
virtual QCString trMemberDataDocumentation()=0
Singleton providing access to the (user configurable) layout of the documentation.
Definition: layout.h:173
#define COMPILE_FOR_1_OPTION(def, langId1, text1)
Definition: layout.cpp:41
static QCString trDesignUnitHierarchy()
Represents of a member declaration list with configurable title and subtitle.
Definition: layout.h:89
The QXmlSimpleReader class provides an implementation of a simple XML reader (i.e. parser).
Definition: qxml.h:238
virtual QCString trDataTypes()=0
LayoutErrorHandler(const char *fn)
Definition: layout.cpp:1290
StartElementHandlerMember(LayoutParser *parent, Handler h, MemberListType type, const QCString &tl, const QCString &ss=QCString())
Definition: layout.cpp:197
void startMemberDef(const QXmlAttributes &)
Definition: layout.cpp:1182
void endGroup()
Definition: layout.cpp:1163
QCString m_title
Definition: layout.h:166
bool fatalError(const QXmlParseException &exception)
Definition: layout.cpp:1305
void startSimpleEntry(LayoutDocEntry::Kind k, const QXmlAttributes &attrib)
Definition: layout.cpp:812
virtual QCString trStaticPublicMembers()=0
virtual QCString trMethodDocumentation()=0
virtual QCString trProtectedSlots()=0
const char * data() const
Definition: qstring.h:542
virtual QCString trMemberFunctionDocumentationFortran()=0
virtual QCString trMainPage()=0
QAsciiDict< Entry > fn
void startClass(const QXmlAttributes &)
Definition: layout.cpp:1117
void startMemberDeclEntry(const QXmlAttributes &attrib, MemberListType type, const QCString &title, const QCString &subscript)
Definition: layout.cpp:838
EndElementHandler(LayoutParser *parent, Handler h)
Definition: layout.cpp:244
void setContentHandler(QXmlContentHandler *handler)
Definition: qxml.cpp:2043
void startDirectory(const QXmlAttributes &)
Definition: layout.cpp:1169
const double e
void operator()(const QXmlAttributes &attrib)
Definition: layout.cpp:179
static int input(void)
Definition: code.cpp:15695
fileName
Definition: dumpTree.py:9
def key(type, name=None)
Definition: graph.py:13
virtual QCString trVariables()=0
uint length() const
Definition: qstring.h:679
virtual QCString trStaticPrivateAttribs()=0
virtual void setData(const QString &d)
Definition: qxml.cpp:775
int toInt(bool *ok=0) const
Definition: qcstring.cpp:439
QCString intro() const
Definition: layout.h:151
virtual QCString trInterfaces()=0
virtual QCString trFileMembersDescription(bool extractAll)=0
friend class LayoutDocManager
Definition: layout.h:169
char versionString[]
Definition: version.cpp:1
static QCString trDesignUnitMembers()
virtual QCString trSignals()=0
void operator()(const QXmlAttributes &attrib)
Definition: layout.cpp:205
virtual QCString trPublicSlots()=0
virtual QCString trClassDocumentation()=0
The QXmlDefaultHandler class provides a default implementation of all XML handler classes...
Definition: qxml.h:472
void endNavIndex()
Definition: layout.cpp:883
virtual QCString trFunctions()=0
p
Definition: test.py:223
LayoutNavEntry * m_rootNav
Definition: layout.cpp:1278
A bunch of utility functions.
const char * data() const
Definition: qcstring.h:207
virtual QCString trPrivateSlots()=0
#define Config_getString(val)
Definition: config.cpp:660
type * current() const
Definition: qlist.h:146
void endMemberDecl()
Definition: layout.cpp:1216
#define Config_getBool(val)
Definition: config.cpp:664
virtual QCString trExamplesDescription()=0
static QCString trDesignUnitListDescription()
virtual QCString trProtectedTypes()=0
virtual QCString trModulesMembers()=0
void endDirectory()
Definition: layout.cpp:1176
virtual QCString trCompoundMembersDescription(bool extractAll)=0
bool warning(const QXmlParseException &exception)
Definition: layout.cpp:1291
void err(const char *fmt,...)
Definition: message.cpp:226
virtual QCString trNamespaceMembers()=0
virtual QCString trPackageAttribs()=0
StartElementHandler(LayoutParser *parent, Handler h)
Definition: layout.cpp:139
virtual QCString trModulesListDescription(bool extractAll)=0
virtual QCString trEnumerations()=0
virtual QCString trPackageMembers()=0
QCString mid(uint index, uint len=0xffffffff) const
Definition: qcstring.cpp:246
void startMemberDecl(const QXmlAttributes &)
Definition: layout.cpp:1206
The QFile class is an I/O device that operates on files.
Definition: qfile.h:50
QCString & sprintf(const char *format,...)
Definition: qcstring.cpp:27
QCString subtitle(SrcLangExt lang) const
Definition: layout.cpp:1452
void writeDefaultLayoutFile(const char *fileName)
Definition: layout.cpp:1397
virtual QCString trPackages()=0
LayoutNavEntry * rootNavEntry() const
Definition: layout.cpp:1370
The QTextStream class provides basic functions for reading and writing text using a QIODevice...
Definition: qtextstream.h:53
virtual QCString trEvents()=0
void startGroup(const QXmlAttributes &)
Definition: layout.cpp:1156
void endFile()
Definition: layout.cpp:1150
virtual QCString trCompoundList()=0
virtual QCString trRelatedPages()=0
static const char layout_default[]
Definition: layout.cpp:35
QCString baseFile() const
Definition: layout.h:149
virtual QCString trPrivateAttribs()=0
QList< LayoutNavEntry > m_children
Definition: layout.h:168
virtual QCString trServices()=0
QString errorString()
Definition: layout.cpp:1312
#define COMPILE_FOR_3_OPTIONS(def, langId1, text1, langId2, text2, langId3, text3)
Definition: layout.cpp:47
virtual QCString trNamespaceMemberDescription(bool extractAll)=0
void clear()
Definition: layout.h:154
void endMemberDef()
Definition: layout.cpp:1192
void startLayout(const QXmlAttributes &)
Definition: layout.cpp:868
virtual QCString trCompoundListDescriptionFortran()=0
LayoutNavEntry * rootNav
Definition: layout.cpp:1325
virtual QCString trEnumerationValueDocumentation()=0
virtual QCString trConstantGroups()=0
bool endElement(const QString &, const QString &, const QString &name)
Definition: layout.cpp:1247
virtual QCString trStaticPackageMembers()=0
virtual QCString trModulesMemberDescription(bool extractAll)=0
QCString m_scope
Definition: layout.cpp:1276
void endLayout()
Definition: layout.cpp:872
virtual QCString trPropertyDocumentation()=0
StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k, Handler h, const QCString &title)
Definition: layout.cpp:176
static QCString type
Definition: declinfo.cpp:672
static LayoutParser & instance()
Definition: layout.cpp:253
virtual QCString trClassHierarchyDescription()=0
Base class representing a piece of a documentation page.
Definition: layout.h:30
virtual QCString trTypedefDocumentation()=0
virtual QCString trModules()=0
virtual QCString trNamespaces()=0
QCString title() const
Definition: layout.h:150
virtual QCString trEventDocumentation()=0
virtual QCString trProtectedAttribs()=0
The QXmlAttributes class provides XML attributes.
Definition: qxml.h:128
virtual void operator()(const QXmlAttributes &attrib)
Definition: layout.cpp:142
virtual QCString trStaticProtectedAttribs()=0
Translator * theTranslator
Definition: language.cpp:157
bool startDocument()
Definition: layout.cpp:1265
static msg_handler handler
Definition: qglobal.cpp:234
virtual QCString trCompoundMembers()=0
MemberListType
Definition: types.h:104
static int m_userGroupCount
Definition: layout.cpp:1280
#define COMPILE_FOR_2_OPTIONS(def, langId1, text1, langId2, text2)
Definition: layout.cpp:44
virtual QCString trRelatedFunctionDocumentation()=0
Kind kind() const
Definition: layout.h:148
virtual QCString trCompoundListDescription()=0
void endNavEntry()
Definition: layout.cpp:1110
virtual QCString trProperties()=0
virtual QCString trSubprogramDocumentation()=0
void init()
Definition: layout.cpp:258
The QXmlInputSource class is the source where XML data is read from.
Definition: qxml.h:162
virtual QCString trModulesList()=0
void operator()(const QXmlAttributes &attrib)
Definition: layout.cpp:160
virtual QCString trStaticPublicAttribs()=0
virtual QCString trCompoundMembersFortran()=0
QCString utf8() const
Definition: qstring.cpp:14507
virtual QCString trPublicAttribs()=0
LayoutNavEntry * parent() const
Definition: layout.h:147
virtual QCString trConstructorDocumentation()=0
virtual QCString trFileList()=0
virtual QCString trNamespaceListDescription(bool extractAll)=0
int lineNumber() const
Definition: qxml.cpp:238
virtual QCString trVariableDocumentation()=0
static QCString * s
Definition: config.cpp:1042
bool m_invalidEntry
Definition: layout.cpp:1279
const char * qPrint(const char *s)
Definition: qcstring.h:797
const bool TRUE
Definition: qglobal.h:371
virtual QCString trTypeDocumentation()=0
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition: util.cpp:5088
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
QCString title(SrcLangExt lang) const
Definition: layout.cpp:1447
The QXmlParseException class is used to report errors with the QXmlErrorHandler interface.
Definition: qxml.h:185
virtual QCString trDefineDocumentation()=0
virtual QCString trFunctionDocumentation()=0
void operator()(const QXmlAttributes &attrib)
Definition: layout.cpp:229
virtual QCString trNamespaceList()=0
virtual QCString trPrivateMembers()=0
void warn_uncond(const char *fmt,...)
Definition: message.cpp:218
type * toFirst()
Definition: qlist.h:135
virtual QCString trDefines()=0
virtual QCString trRelatedSubscript()=0
void startNamespace(const QXmlAttributes &)
Definition: layout.cpp:1130