index.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  *
4  *
5  * Copyright (C) 1997-2015 by Dimitri van Heesch.
6  *
7  * Permission to use, copy, modify, and distribute this software and its
8  * documentation under the terms of the GNU General Public License is hereby
9  * granted. No representations are made about the suitability of this software
10  * for any purpose. It is provided "as is" without express or implied warranty.
11  * See the GNU General Public License for more details.
12  *
13  * Documents produced by Doxygen are derivative works derived from the
14  * input used in their production; they are not affected by this license.
15  *
16  */
17 
18 /** @file
19  * @brief This file contains functions for the various index pages.
20  */
21 
22 #include <stdlib.h>
23 
24 #include <qtextstream.h>
25 #include <qdatetime.h>
26 #include <qdir.h>
27 #include <qregexp.h>
28 
29 #include "message.h"
30 #include "index.h"
31 #include "doxygen.h"
32 #include "config.h"
33 #include "filedef.h"
34 #include "outputlist.h"
35 #include "util.h"
36 #include "groupdef.h"
37 #include "language.h"
38 #include "htmlgen.h"
39 #include "htmlhelp.h"
40 #include "ftvhelp.h"
41 #include "dot.h"
42 #include "pagedef.h"
43 #include "dirdef.h"
44 #include "vhdldocgen.h"
45 #include "layout.h"
46 #include "memberlist.h"
47 #include "classlist.h"
48 #include "namespacedef.h"
49 #include "filename.h"
50 
51 #define MAX_ITEMS_BEFORE_MULTIPAGE_INDEX 200
52 #define MAX_ITEMS_BEFORE_QUICK_INDEX 30
53 
54 
68 
69 static int countClassHierarchy();
70 static void countFiles(int &htmlFiles,int &files);
71 static int countGroups();
72 static int countDirs();
73 static int countNamespaces();
74 static int countAnnotatedClasses(int *cp);
75 static void countRelatedPages(int &docPages,int &indexPages);
76 
78 {
79  annotatedClasses = countAnnotatedClasses(&annotatedClassesPrinted); // "classes" + "annotated"
80  hierarchyClasses = countClassHierarchy(); // "hierarchy"
83  documentedGroups = countGroups(); // "modules"
84  documentedNamespaces = countNamespaces(); // "namespaces"
85  documentedDirs = countDirs(); // "dirs"
86  // "globals"
87  // "namespacemembers"
88  // "functions"
89 }
90 
91 static void startIndexHierarchy(OutputList &ol,int level)
92 {
93  ol.pushGeneratorState();
96  if (level<6) ol.startIndexList();
97  ol.enableAll();
100  ol.startItemList();
101  ol.popGeneratorState();
102 }
103 
104 static void endIndexHierarchy(OutputList &ol,int level)
105 {
106  ol.pushGeneratorState();
109  if (level<6) ol.endIndexList();
110  ol.enableAll();
113  ol.endItemList();
114  ol.popGeneratorState();
115 }
116 
117 //----------------------------------------------------------------------------
118 
119 class MemberIndexList : public QList<MemberDef>
120 {
121  public:
125  int compareValues(const MemberDef *md1, const MemberDef *md2) const
126  {
127  int result = qstricmp(md1->name(),md2->name());
128  if (result==0)
129  {
130  result = qstricmp(md1->qualifiedName(),md2->qualifiedName());
131  }
132  return result;
133  }
134  uint letter() const { return m_letter; }
135  private:
137 };
138 
142 
144 
145 //----------------------------------------------------------------------------
146 
147 //----------------------------------------------------------------------------
148 
149 static void startQuickIndexList(OutputList &ol,bool letterTabs=FALSE)
150 {
151  bool fancyTabs = TRUE;
152  if (fancyTabs)
153  {
154  if (letterTabs)
155  {
156  ol.writeString(" <div id=\"navrow4\" class=\"tabs3\">\n");
157  }
158  else
159  {
160  ol.writeString(" <div id=\"navrow3\" class=\"tabs2\">\n");
161  }
162  ol.writeString(" <ul class=\"tablist\">\n");
163  }
164  else
165  {
166  ol.writeString(" <div class=\"qindex\">");
167  }
168 }
169 
171 {
172  bool fancyTabs = TRUE;
173  if (fancyTabs)
174  {
175  ol.writeString(" </ul>\n");
176  }
177  ol.writeString(" </div>\n");
178 }
179 
180 static void startQuickIndexItem(OutputList &ol,const char *l,
181  bool hl,bool compact,bool &first)
182 {
183  bool fancyTabs = TRUE;
184  if (!first && compact && !fancyTabs) ol.writeString(" | ");
185  first=FALSE;
186  if (fancyTabs)
187  {
188  ol.writeString(" <li");
189  if (hl) ol.writeString(" class=\"current\"");
190  ol.writeString("><a ");
191  }
192  else
193  {
194  if (!compact) ol.writeString("<li>");
195  if (hl && compact)
196  {
197  ol.writeString("<a class=\"qindexHL\" ");
198  }
199  else
200  {
201  ol.writeString("<a class=\"qindex\" ");
202  }
203  }
204  ol.writeString("href=\"");
205  ol.writeString(l);
206  ol.writeString("\">");
207  if (fancyTabs)
208  {
209  ol.writeString("<span>");
210  }
211 }
212 
214 {
215  bool fancyTabs=TRUE;
216  if (fancyTabs) ol.writeString("</span>");
217  ol.writeString("</a>");
218  if (fancyTabs) ol.writeString("</li>\n");
219 }
220 
221 // don't make this static as it is called from a template function and some
222 // old compilers don't support calls to static functions from a template.
224 {
225  return substitute(s," ","&#160;");
226 }
227 
228 void startTitle(OutputList &ol,const char *fileName,Definition *def)
229 {
230  ol.startHeaderSection();
231  if (def) def->writeSummaryLinks(ol);
232  ol.startTitleHead(fileName);
233  ol.pushGeneratorState();
235 }
236 
237 void endTitle(OutputList &ol,const char *fileName,const char *name)
238 {
239  ol.popGeneratorState();
240  ol.endTitleHead(fileName,name);
241  ol.endHeaderSection();
242 }
243 
244 void startFile(OutputList &ol,const char *name,const char *manName,
245  const char *title,HighlightedItem hli,bool additionalIndices,
246  const char *altSidebarName)
247 {
248  static bool disableIndex = Config_getBool("DISABLE_INDEX");
249  ol.startFile(name,manName,title);
250  ol.startQuickIndices();
251  if (!disableIndex)
252  {
253  ol.writeQuickLinks(TRUE,hli,name);
254  }
255  if (!additionalIndices)
256  {
257  ol.endQuickIndices();
258  }
259  ol.writeSplitBar(altSidebarName ? altSidebarName : name);
260  ol.writeSearchInfo();
261 }
262 
263 void endFile(OutputList &ol,bool skipNavIndex,bool skipEndContents,
264  const QCString &navPath)
265 {
266  static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
267  ol.pushGeneratorState();
269  if (!skipNavIndex)
270  {
271  if (!skipEndContents) ol.endContents();
272  if (generateTreeView)
273  {
274  ol.writeString("</div><!-- doc-content -->\n");
275  }
276  }
277  ol.writeFooter(navPath); // write the footer
278  ol.popGeneratorState();
279  ol.endFile();
280 }
281 
283 {
284  static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
285  QCString navPath;
286  if (generateTreeView)
287  {
288  ol.pushGeneratorState();
290  ol.writeString("</div><!-- doc-content -->\n");
291  ol.popGeneratorState();
292  navPath = d->navigationPathAsString();
293  }
294  endFile(ol,generateTreeView,TRUE,navPath);
295 }
296 
297 //----------------------------------------------------------------------
298 template<class T>
300  const QCString &name,const QCString &anchor,
301  bool addToIndex=TRUE,bool preventSeparateIndex=FALSE)
302 {
303  bool hasMembers = def->getMemberLists().count()>0 || def->getMemberGroupSDict()!=0;
304  Doxygen::indexList->addContentsItem(hasMembers,name,
305  def->getReference(),def->getOutputFileBase(),anchor,
306  hasMembers && !preventSeparateIndex,
307  addToIndex,
308  def);
309  int numClasses=0;
310  ClassSDict *classes = def->getClassSDict();
311  if (classes)
312  {
313  ClassDef *cd;
314  ClassSDict::Iterator it(*classes);
315  for (;(cd=it.current());++it)
316  {
317  if (cd->isLinkable()) numClasses++;
318  }
319  }
320  //printf("addMembersToIndex(def=%s hasMembers=%d numClasses=%d)\n",def->name().data(),hasMembers,numClasses);
321  if (hasMembers || numClasses>0)
322  {
325  LayoutDocEntry *lde;
326  for (eli.toFirst();(lde=eli.current());++eli)
327  {
328  if (lde->kind()==LayoutDocEntry::MemberDef)
329  {
331  MemberList *ml = def->getMemberList(lmd->type);
332  if (ml)
333  {
334  MemberListIterator mi(*ml);
335  MemberDef *md;
336  for (mi.toFirst();(md=mi.current());++mi)
337  {
338  MemberList *enumList = md->enumFieldList();
339  bool isDir = enumList!=0 && md->isEnumerate();
340  bool isAnonymous = md->name().find('@')!=-1;
341  static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
342  static bool extractStatic = Config_getBool("EXTRACT_STATIC");
343  if (!isAnonymous &&
344  (!hideUndocMembers || md->hasDocumentation()) &&
345  (!md->isStatic() || extractStatic)
346  )
347  {
348  if (md->getOuterScope()==def || md->getOuterScope()==Doxygen::globalScope)
349  {
351  md->name(),md->getReference(),md->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
352  }
353  else // inherited member
354  {
356  md->name(),def->getReference(),def->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
357  }
358  }
359  if (isDir)
360  {
361  if (!isAnonymous)
362  {
364  }
365  MemberListIterator emli(*enumList);
366  MemberDef *emd;
367  for (emli.toFirst();(emd=emli.current());++emli)
368  {
369  if (!hideUndocMembers || emd->hasDocumentation())
370  {
371  if (emd->getOuterScope()==def || emd->getOuterScope()==Doxygen::globalScope)
372  {
374  emd->name(),emd->getReference(),emd->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
375  }
376  else // inherited member
377  {
379  emd->name(),def->getReference(),def->getOutputFileBase(),emd->anchor(),FALSE,addToIndex);
380  }
381  }
382  }
383  if (!isAnonymous)
384  {
386  }
387  }
388  }
389  }
390  }
391  else if (lde->kind()==LayoutDocEntry::NamespaceClasses ||
394  )
395  {
396  if (classes)
397  {
398  ClassDef *cd;
399  ClassSDict::Iterator it(*classes);
400  for (;(cd=it.current());++it)
401  {
402  if (cd->isLinkable() && (cd->partOfGroups()==0 || def->definitionType()==Definition::TypeGroup))
403  {
404  static bool inlineSimpleStructs = Config_getBool("INLINE_SIMPLE_STRUCTS");
405  bool isNestedClass = def->definitionType()==Definition::TypeClass;
407  addToIndex && (isNestedClass || (cd->isSimple() && inlineSimpleStructs)),
408  preventSeparateIndex || cd->isEmbeddedInOuterScope());
409  }
410  }
411  }
412  }
413  }
414 
416  }
417 }
418 
419 
420 //----------------------------------------------------------------------------
421 /*! Generates HTML Help tree of classes */
422 
423 static void writeClassTree(OutputList &ol,const BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex)
424 {
425  if (bcl==0) return;
426  BaseClassListIterator bcli(*bcl);
427  bool started=FALSE;
428  for ( ; bcli.current() ; ++bcli)
429  {
430  ClassDef *cd=bcli.current()->classDef;
432  {
433  continue;
434  }
435 
436  bool b;
437  if (cd->getLanguage()==SrcLangExt_VHDL)
438  {
439  b=hasVisibleRoot(cd->subClasses());
440  }
441  else
442  {
443  b=hasVisibleRoot(cd->baseClasses());
444  }
445 
446  if (cd->isVisibleInHierarchy() && b) // hasVisibleRoot(cd->baseClasses()))
447  {
448  if (!started)
449  {
450  startIndexHierarchy(ol,level);
451  if (addToIndex)
452  {
454  }
455  if (ftv)
456  {
457  ftv->incContentsDepth();
458  }
459  started=TRUE;
460  }
461  ol.startIndexListItem();
462  //printf("Passed...\n");
463  bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
464  //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren);
465  if (cd->isLinkable())
466  {
467  //printf("Writing class %s\n",cd->displayName().data());
469  ol.parseText(cd->displayName());
471  if (cd->isReference())
472  {
473  ol.startTypewriter();
474  ol.docify(" [external]");
475  ol.endTypewriter();
476  }
477  if (addToIndex)
478  {
480  }
481  if (ftv)
482  {
483  if (cd->getLanguage()==SrcLangExt_VHDL)
484  {
485  ftv->addContentsItem(hasChildren,bcli.current()->usedName,cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
486  }
487  else
488  {
489  ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
490  }
491  }
492  }
493  else
494  {
495  ol.startIndexItem(0,0);
496  ol.parseText(cd->name());
497  ol.endIndexItem(0,0);
498  if (addToIndex)
499  {
500  Doxygen::indexList->addContentsItem(hasChildren,cd->displayName(),0,0,0);
501  }
502  if (ftv)
503  {
504  ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE,cd);
505  }
506  }
507  if (hasChildren)
508  {
509  //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
510  bool wasVisited=cd->visited;
511  cd->visited=TRUE;
512  if (cd->getLanguage()==SrcLangExt_VHDL)
513  {
514  writeClassTree(ol,cd->baseClasses(),wasVisited,level+1,ftv,addToIndex);
515  }
516  else
517  {
518  writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv,addToIndex);
519  }
520  }
521  ol.endIndexListItem();
522  }
523  }
524  if (started)
525  {
526  endIndexHierarchy(ol,level);
527  if (addToIndex)
528  {
530  }
531  if (ftv)
532  {
533  ftv->decContentsDepth();
534  }
535  }
536 }
537 
538 //----------------------------------------------------------------------------
539 
541 {
542  if (dd->hasDocumentation()) return TRUE;
543 
544  QListIterator<FileDef> fli(*dd->getFiles());
545  FileDef *fd;
546  for (fli.toFirst();(fd=fli.current());++fli)
547  {
548  bool genSourceFile;
549  if (fileVisibleInIndex(fd,genSourceFile))
550  {
551  return TRUE;
552  }
553  if (genSourceFile)
554  {
555  return TRUE;
556  }
557  }
558 
559  QListIterator<DirDef> dli(dd->subDirs());
560  DirDef *subdd;
561  for (dli.toFirst();(subdd=dli.current());++dli)
562  {
563  if (dirHasVisibleChildren(subdd))
564  {
565  return TRUE;
566  }
567  }
568  return FALSE;
569 }
570 
571 //----------------------------------------------------------------------------
572 static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv,bool addToIndex)
573 {
574  if (level>20)
575  {
576  warn(dd->getDefFileName(),dd->getDefLine(),
577  "maximum nesting level exceeded for directory %s: "
578  "check for possible recursive directory relation!\n",dd->name().data()
579  );
580  return;
581  }
582 
583  if (!dirHasVisibleChildren(dd))
584  {
585  return;
586  }
587 
588  static bool tocExpand = TRUE; //Config_getBool("TOC_EXPAND");
589  bool isDir = dd->subDirs().count()>0 || // there are subdirs
590  (tocExpand && // or toc expand and
591  dd->getFiles() && dd->getFiles()->count()>0 // there are files
592  );
593  //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
594  if (addToIndex)
595  {
598  }
599  if (ftv)
600  {
601  ftv->addContentsItem(isDir,dd->shortName(),dd->getReference(),
602  dd->getOutputFileBase(),0,FALSE,TRUE,dd);
603  ftv->incContentsDepth();
604  }
605 
606  ol.startIndexListItem();
608  ol.parseText(dd->shortName());
610  if (dd->isReference())
611  {
612  ol.startTypewriter();
613  ol.docify(" [external]");
614  ol.endTypewriter();
615  }
616 
617  // write sub directories
618  if (dd->subDirs().count()>0)
619  {
620  startIndexHierarchy(ol,level+1);
621  QListIterator<DirDef> dli(dd->subDirs());
622  DirDef *subdd = 0;
623  for (dli.toFirst();(subdd=dli.current());++dli)
624  {
625  writeDirTreeNode(ol,subdd,level+1,ftv,addToIndex);
626  }
627  endIndexHierarchy(ol,level+1);
628  }
629 
630  FileList *fileList=dd->getFiles();
631  int fileCount=0;
632  if (fileList && fileList->count()>0)
633  {
634  QListIterator<FileDef> it(*fileList);
635  FileDef *fd;
636  for (;(fd=it.current());++it)
637  {
638  //static bool allExternals = Config_getBool("ALLEXTERNALS");
639  //if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject())
640  //{
641  // fileCount++;
642  //}
643  bool genSourceFile;
644  if (fileVisibleInIndex(fd,genSourceFile))
645  {
646  fileCount++;
647  }
648  else if (genSourceFile)
649  {
650  fileCount++;
651  }
652  }
653  if (fileCount>0)
654  {
655  startIndexHierarchy(ol,level+1);
656  for (it.toFirst();(fd=it.current());++it)
657  {
658  bool doc,src;
659  doc = fileVisibleInIndex(fd,src);
660  QCString reference;
661  QCString outputBase;
662  if (doc)
663  {
664  reference = fd->getReference();
665  outputBase = fd->getOutputFileBase();
666  }
667  if (doc || src)
668  {
669  ol.startIndexListItem();
670  ol.startIndexItem(reference,outputBase);
671  ol.parseText(fd->displayName());
672  ol.endIndexItem(reference,outputBase);
673  ol.endIndexListItem();
674  if (ftv && (src || doc))
675  {
676  ftv->addContentsItem(FALSE,
677  fd->displayName(),
678  reference,outputBase,
679  0,FALSE,FALSE,fd);
680  }
681  }
682  }
683  endIndexHierarchy(ol,level+1);
684  }
685  }
686 
687  if (tocExpand && addToIndex)
688  {
689  // write files of this directory
690  if (fileCount>0)
691  {
692  QListIterator<FileDef> it(*fileList);
693  FileDef *fd;
694  for (;(fd=it.current());++it)
695  {
696  //static bool allExternals = Config_getBool("ALLEXTERNALS");
697  //if ((allExternals && fd->isLinkable()) || fd->isLinkableInProject())
698  bool doc,src;
699  doc = fileVisibleInIndex(fd,src);
700  if (doc)
701  {
703  }
704  else if (src)
705  {
707  FALSE, convertToHtml(fd->name(),TRUE), 0,
708  fd->getSourceFileBase(), 0, FALSE, TRUE, fd);
709  }
710  }
711  }
712  }
713  ol.endIndexListItem();
714 
715  if (addToIndex)
716  {
718  }
719  if (ftv)
720  {
721  ftv->decContentsDepth();
722  }
723 }
724 
725 static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
726 {
727  if (ftv)
728  {
729  ol.pushGeneratorState();
731  }
732  static bool fullPathNames = Config_getBool("FULL_PATH_NAMES");
733  startIndexHierarchy(ol,0);
734  if (fullPathNames)
735  {
737  DirDef *dd;
738  for (dli.toFirst();(dd=dli.current());++dli)
739  {
741  {
742  writeDirTreeNode(ol,dd,0,ftv,addToIndex);
743  }
744  }
745  }
746  if (ftv)
747  {
749  FileName *fn;
750  for (fnli.toFirst();(fn=fnli.current());++fnli)
751  {
752  FileNameIterator fni(*fn);
753  FileDef *fd;
754  for (;(fd=fni.current());++fni)
755  {
756  static bool fullPathNames = Config_getBool("FULL_PATH_NAMES");
757  if (!fullPathNames || fd->getDirDef()==0) // top level file
758  {
759  bool doc,src;
760  doc = fileVisibleInIndex(fd,src);
761  QCString reference, outputBase;
762  if (doc)
763  {
764  reference = fd->getReference();
765  outputBase = fd->getOutputFileBase();
766  }
767  if (doc || src)
768  {
769  ftv->addContentsItem(FALSE,fd->displayName(),
770  reference, outputBase, 0,
771  FALSE,FALSE,fd);
772  }
773  if (addToIndex)
774  {
775  if (doc)
776  {
778  }
779  else if (src)
780  {
782  FALSE, convertToHtml(fd->name(),TRUE), 0,
783  fd->getSourceFileBase(), 0, FALSE, TRUE, fd);
784  }
785  }
786  }
787  }
788  }
789  }
790  endIndexHierarchy(ol,0);
791  if (ftv)
792  {
793  ol.popGeneratorState();
794  }
795 }
796 
797 
798 //----------------------------------------------------------------------------
799 
800 static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv,bool addToIndex)
801 {
803  ClassDef *cd;
804  for (;(cd=cli.current());++cli)
805  {
806  //printf("class %s hasVisibleRoot=%d isVisibleInHierarchy=%d\n",
807  // cd->name().data(),
808  // hasVisibleRoot(cd->baseClasses()),
809  // cd->isVisibleInHierarchy()
810  // );
811  bool b;
812  if (cd->getLanguage()==SrcLangExt_VHDL)
813  {
815  {
816  continue;
817  }
818  b=!hasVisibleRoot(cd->subClasses());
819  }
820  else
821  {
822  b=!hasVisibleRoot(cd->baseClasses());
823  }
824 
825  if (b) //filter on root classes
826  {
827  if (cd->isVisibleInHierarchy()) // should it be visible
828  {
829  if (!started)
830  {
831  startIndexHierarchy(ol,0);
832  if (addToIndex)
833  {
835  }
836  started=TRUE;
837  }
838  ol.startIndexListItem();
839  bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
840  //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren);
841  if (cd->isLinkable())
842  {
843  //printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n",
844  // cd->displayName().data(),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster());
846  ol.parseText(cd->displayName());
848  if (cd->isReference())
849  {
850  ol.startTypewriter();
851  ol.docify(" [external]");
852  ol.endTypewriter();
853  }
854  if (addToIndex)
855  {
856  if (cd->getLanguage()!=SrcLangExt_VHDL) // prevents double insertion in Design Unit List
857  Doxygen::indexList->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE);
858  }
859  if (ftv)
860  {
861  ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE,cd);
862  }
863  }
864  else
865  {
866  ol.startIndexItem(0,0);
867  ol.parseText(cd->displayName());
868  ol.endIndexItem(0,0);
869  if (addToIndex)
870  {
871  Doxygen::indexList->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE);
872  }
873  if (ftv)
874  {
875  ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE,cd);
876  }
877  }
878  if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren)
879  {
880  writeClassTree(ol,cd->baseClasses(),cd->visited,1,ftv,addToIndex);
881  cd->visited=TRUE;
882  }
883  else if (hasChildren)
884  {
885  writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv,addToIndex);
886  cd->visited=TRUE;
887  }
888  ol.endIndexListItem();
889  }
890  }
891  }
892 }
893 
894 static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
895 {
898  if (ftv)
899  {
900  ol.pushGeneratorState();
902  }
903  bool started=FALSE;
904  writeClassTreeForList(ol,Doxygen::classSDict,started,ftv,addToIndex);
905  writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv,addToIndex);
906  if (started)
907  {
908  endIndexHierarchy(ol,0);
909  if (addToIndex)
910  {
912  }
913  }
914  if (ftv)
915  {
916  ol.popGeneratorState();
917  }
918 }
919 
920 //----------------------------------------------------------------------------
921 
923 {
924  int count=0;
926  ClassDef *cd;
927  for (;(cd=cli.current());++cli)
928  {
929  if (!hasVisibleRoot(cd->baseClasses())) // filter on root classes
930  {
931  if (cd->isVisibleInHierarchy()) // should it be visible
932  {
933  if (cd->subClasses()) // should have sub classes
934  {
935  count++;
936  }
937  }
938  }
939  }
940  return count;
941 }
942 
944 {
945  int count=0;
950  return count;
951 }
952 
953 //----------------------------------------------------------------------------
954 
956 {
957  if (hierarchyClasses==0) return;
958  ol.pushGeneratorState();
959  //1.{
961 
963  QCString title = lne ? lne->title() : theTranslator->trClassHierarchy();
964  bool addToIndex = lne==0 || lne->visible();
965 
966  startFile(ol,"hierarchy",0, title, HLI_Hierarchy);
967  startTitle(ol,0);
968  ol.parseText(title);
969  endTitle(ol,0,0);
970  ol.startContents();
971  ol.startTextBlock();
972 
973  if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
974  {
977  ol.startParagraph();
978  ol.startTextLink("inherits",0);
980  ol.endTextLink();
981  ol.endParagraph();
984  }
986  ol.endTextBlock();
987 
988  // ---------------
989  // Static class hierarchy for Latex/RTF
990  // ---------------
991  ol.pushGeneratorState();
992  //2.{
995 
996  writeClassHierarchy(ol,0,addToIndex);
997 
999  ol.popGeneratorState();
1000  //2.}
1001 
1002  // ---------------
1003  // Dynamic class hierarchical index for HTML
1004  // ---------------
1005  ol.pushGeneratorState();
1006  //2.{
1008 
1009  {
1010  if (addToIndex)
1011  {
1012  Doxygen::indexList->addContentsItem(TRUE,title,0,"hierarchy",0,TRUE,TRUE);
1013  }
1014  FTVHelp* ftv = new FTVHelp(FALSE);
1015  writeClassHierarchy(ol,ftv,addToIndex);
1016  QGString outStr;
1017  FTextStream t(&outStr);
1018  ftv->generateTreeViewInline(t);
1019  ol.pushGeneratorState();
1021  ol.writeString(outStr);
1022  ol.popGeneratorState();
1023  delete ftv;
1024  }
1025  ol.popGeneratorState();
1026  //2.}
1027  // ------
1028 
1029  endFile(ol);
1030  ol.popGeneratorState();
1031  //1.}
1032 }
1033 
1034 //----------------------------------------------------------------------------
1035 
1037 {
1038  if (hierarchyClasses==0) return;
1041  QCString title = lne ? lne->title() : theTranslator->trClassHierarchy();
1042  startFile(ol,"inherits",0,title,HLI_Hierarchy,FALSE,"hierarchy");
1043  startTitle(ol,0);
1044  ol.parseText(title);
1045  endTitle(ol,0,0);
1046  ol.startContents();
1047  ol.startTextBlock();
1048  ol.startParagraph();
1049  ol.startTextLink("hierarchy",0);
1051  ol.endTextLink();
1052  ol.endParagraph();
1053  ol.endTextBlock();
1056  endFile(ol);
1057  ol.enableAll();
1058 }
1059 
1060 //----------------------------------------------------------------------------
1061 
1062 static void countFiles(int &htmlFiles,int &files)
1063 {
1064  htmlFiles=0;
1065  files=0;
1067  FileName *fn;
1068  for (;(fn=fnli.current());++fnli)
1069  {
1070  FileNameIterator fni(*fn);
1071  FileDef *fd;
1072  for (;(fd=fni.current());++fni)
1073  {
1074  bool doc,src;
1075  doc = fileVisibleInIndex(fd,src);
1076  if (doc || src)
1077  {
1078  htmlFiles++;
1079  }
1080  if (doc)
1081  {
1082  files++;
1083  }
1084  }
1085  }
1086 }
1087 
1089 {
1090  //printf("Found filedef %s\n",fd->name().data());
1091  bool doc = fd->isLinkableInProject();
1092  bool src = fd->generateSourceFile();
1093  bool nameOk = !fd->isDocumentationFile();
1094  if (nameOk && (doc || src) && !fd->isReference())
1095  {
1096  QCString path;
1097  if (Config_getBool("FULL_PATH_NAMES"))
1098  {
1099  path=stripFromPath(fd->getPath().copy());
1100  }
1101  QCString fullName=fd->name();
1102  if (!path.isEmpty())
1103  {
1104  if (path.at(path.length()-1)!='/') fullName.prepend("/");
1105  fullName.prepend(path);
1106  }
1107 
1108  ol.startIndexKey();
1109  ol.docify(path);
1110  if (doc)
1111  {
1112  ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
1113  //if (addToIndex)
1114  //{
1115  // addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString());
1116  //}
1117  }
1118  else
1119  {
1120  ol.startBold();
1121  ol.docify(fd->name());
1122  ol.endBold();
1123  //if (addToIndex)
1124  //{
1125  // Doxygen::indexList->addContentsItem(FALSE,fullName,0,0,0);
1126  //}
1127  }
1128  if (src)
1129  {
1130  ol.pushGeneratorState();
1132  ol.docify(" ");
1133  ol.startTextLink(fd->includeName(),0);
1134  ol.docify("[");
1136  ol.docify("]");
1137  ol.endTextLink();
1138  ol.popGeneratorState();
1139  }
1140  ol.endIndexKey();
1141  bool hasBrief = !fd->briefDescription().isEmpty();
1142  ol.startIndexValue(hasBrief);
1143  if (hasBrief)
1144  {
1145  //ol.docify(" (");
1146  ol.generateDoc(
1147  fd->briefFile(),fd->briefLine(),
1148  fd,0,
1149  fd->briefDescription(TRUE),
1150  FALSE, // index words
1151  FALSE, // isExample
1152  0, // example name
1153  TRUE, // single line
1154  TRUE // link from index
1155  );
1156  //ol.docify(")");
1157  }
1158  ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
1159  //ol.popGeneratorState();
1160  // --------------------------------------------------------
1161  }
1162 }
1163 
1164 //----------------------------------------------------------------------------
1165 
1166 static void writeFileIndex(OutputList &ol)
1167 {
1168  if (documentedHtmlFiles==0) return;
1169 
1170  ol.pushGeneratorState();
1173 
1175  if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files); // fall back
1176  QCString title = lne ? lne->title() : theTranslator->trFileList();
1177  bool addToIndex = lne==0 || lne->visible();
1178 
1179  startFile(ol,"files",0,title,HLI_Files);
1180  startTitle(ol,0);
1181  //if (!Config_getString("PROJECT_NAME").isEmpty())
1182  //{
1183  // title.prepend(Config_getString("PROJECT_NAME")+" ");
1184  //}
1185  ol.parseText(title);
1186  endTitle(ol,0,0);
1187  ol.startContents();
1188  ol.startTextBlock();
1189 
1190  if (addToIndex)
1191  {
1192  Doxygen::indexList->addContentsItem(TRUE,title,0,"files",0,TRUE,TRUE);
1194  }
1195 
1196  ol.parseText(lne ? lne->intro() : theTranslator->trFileListDescription(Config_getBool("EXTRACT_ALL")));
1197  ol.endTextBlock();
1198 
1199  // ---------------
1200  // Flat file index
1201  // ---------------
1202 
1203  // 1. {
1204  ol.pushGeneratorState();
1206 
1207  OutputNameDict outputNameDict(1009);
1208  OutputNameList outputNameList;
1209  outputNameList.setAutoDelete(TRUE);
1210 
1211  if (Config_getBool("FULL_PATH_NAMES"))
1212  {
1213  // re-sort input files in (dir,file) output order instead of (file,dir) input order
1215  FileName *fn;
1216  for (fnli.toFirst();(fn=fnli.current());++fnli)
1217  {
1218  FileNameIterator fni(*fn);
1219  FileDef *fd;
1220  for (;(fd=fni.current());++fni)
1221  {
1222  QCString path=fd->getPath();
1223  if (path.isEmpty()) path="[external]";
1224  FileList *fl = outputNameDict.find(path);
1225  if (fl)
1226  {
1227  fl->append(fd);
1228  //printf("+ inserting %s---%s\n",fd->getPath().data(),fd->name().data());
1229  }
1230  else
1231  {
1232  //printf("o inserting %s---%s\n",fd->getPath().data(),fd->name().data());
1233  fl = new FileList(path);
1234  fl->append(fd);
1235  outputNameList.append(fl);
1236  outputNameDict.insert(path,fl);
1237  }
1238  }
1239  }
1240  }
1241 
1242  ol.startIndexList();
1243  if (Config_getBool("FULL_PATH_NAMES"))
1244  {
1245  outputNameList.sort();
1246  QListIterator<FileList> fnli(outputNameList);
1247  FileList *fl;
1248  for (fnli.toFirst();(fl=fnli.current());++fnli)
1249  {
1250  fl->sort();
1251  QListIterator<FileDef> it(*fl);
1252  FileDef *fd;
1253  for (;(fd=it.current());++it)
1254  {
1255  writeSingleFileIndex(ol,fd);
1256  }
1257  }
1258  }
1259  else
1260  {
1262  FileName *fn;
1263  for (fnli.toFirst();(fn=fnli.current());++fnli)
1264  {
1265  FileNameIterator fni(*fn);
1266  FileDef *fd;
1267  for (;(fd=fni.current());++fni)
1268  {
1269  writeSingleFileIndex(ol,fd);
1270  }
1271  }
1272  }
1273  ol.endIndexList();
1274 
1275  // 1. }
1276  ol.popGeneratorState();
1277 
1278  // ---------------
1279  // Hierarchical file index for HTML
1280  // ---------------
1281  ol.pushGeneratorState();
1283 
1284  FTVHelp* ftv = new FTVHelp(FALSE);
1285  writeDirHierarchy(ol,ftv,addToIndex);
1286  QGString outStr;
1287  FTextStream t(&outStr);
1288  ftv->generateTreeViewInline(t);
1289  ol.writeString(outStr);
1290  delete ftv;
1291 
1292  ol.popGeneratorState();
1293  // ------
1294 
1295  if (addToIndex)
1296  {
1298  }
1299 
1300  endFile(ol);
1301  ol.popGeneratorState();
1302 }
1303 
1304 //----------------------------------------------------------------------------
1305 static int countNamespaces()
1306 {
1307  int count=0;
1309  NamespaceDef *nd;
1310  for (;(nd=nli.current());++nli)
1311  {
1312  if (nd->isLinkableInProject()) count++;
1313  }
1314  return count;
1315 }
1316 
1317 //----------------------------------------------------------------------------
1318 
1319 void writeClassTree(ClassSDict *clDict,FTVHelp *ftv,bool addToIndex,bool globalOnly)
1320 {
1321  if (clDict)
1322  {
1323  ClassSDict::Iterator cli(*clDict);
1324  ClassDef *cd;
1325  for (;(cd=cli.current());++cli)
1326  {
1327  if (cd->getLanguage()==SrcLangExt_VHDL)
1328  {
1331  )// no architecture
1332  {
1333  continue;
1334  }
1336  {
1337  QCString n=cd->name();
1338  cd->setClassName(n.data());
1339  }
1340  }
1341 
1342  if (!globalOnly ||
1343  cd->getOuterScope()==0 ||
1345  )
1346  {
1347  int count=0;
1348  if (cd->getClassSDict())
1349  {
1350  ClassSDict::Iterator ccit(*cd->getClassSDict());
1351  ClassDef *ccd;
1352  for (;(ccd=ccit.current());++ccit)
1353  {
1354  if (ccd->isLinkableInProject() && ccd->templateMaster()==0)
1355  {
1356  count++;
1357  }
1358  }
1359  }
1360  if (classVisibleInIndex(cd) && cd->templateMaster()==0)
1361  {
1362  ftv->addContentsItem(count>0,cd->displayName(FALSE),cd->getReference(),
1363  cd->getOutputFileBase(),cd->anchor(),FALSE,TRUE,cd);
1364  if (addToIndex &&
1365  /*cd->partOfGroups()==0 &&*/
1366  (cd->getOuterScope()==0 ||
1368  )
1369  )
1370  {
1372  cd->displayName(FALSE),
1373  cd->anchor(),
1374  cd->partOfGroups()==0 && !cd->isSimple());
1375  }
1376  if (count>0)
1377  {
1378  ftv->incContentsDepth();
1379  writeClassTree(cd->getClassSDict(),ftv,addToIndex,FALSE);
1380  ftv->decContentsDepth();
1381  }
1382  }
1383  }
1384  }
1385  }
1386 }
1387 
1388 static void writeNamespaceTree(NamespaceSDict *nsDict,FTVHelp *ftv,
1389  bool rootOnly,bool showClasses,bool addToIndex)
1390 {
1391  if (nsDict)
1392  {
1393  NamespaceSDict::Iterator nli(*nsDict);
1394  NamespaceDef *nd;
1395  for (nli.toFirst();(nd=nli.current());++nli)
1396  {
1397  if (nd->localName().find('@')==-1 &&
1398  (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
1399  {
1400 
1401  bool hasChildren = namespaceHasVisibleChild(nd,showClasses);
1402  bool isLinkable = nd->isLinkableInProject();
1403 
1404  QCString ref;
1405  QCString file;
1406  if (isLinkable)
1407  {
1408  ref = nd->getReference();
1409  file = nd->getOutputFileBase();
1410  if (nd->getLanguage()==SrcLangExt_VHDL) // UGLY HACK
1411  {
1412  file=file.replace(0,qstrlen("namespace"),"class");
1413  }
1414  }
1415 
1416  if ((isLinkable && !showClasses) || hasChildren)
1417  {
1418  ftv->addContentsItem(hasChildren,nd->localName(),ref,file,0,FALSE,TRUE,nd);
1419 
1420  if (addToIndex)
1421  {
1422  Doxygen::indexList->addContentsItem(hasChildren,nd->localName(),ref,file,QCString(),
1423  hasChildren && !file.isEmpty(),addToIndex);
1424  }
1425 
1426  //printf("*** writeNamespaceTree count=%d addToIndex=%d showClasses=%d classCount=%d\n",
1427  // count,addToIndex,showClasses,classCount);
1428  if (hasChildren)
1429  {
1430  if (addToIndex) Doxygen::indexList->incContentsDepth();
1431  ftv->incContentsDepth();
1432  writeNamespaceTree(nd->getNamespaceSDict(),ftv,FALSE,showClasses,addToIndex);
1433  if (showClasses)
1434  {
1435  writeClassTree(nd->getClassSDict(),ftv,addToIndex,FALSE);
1436  }
1437  ftv->decContentsDepth();
1438  if (addToIndex) Doxygen::indexList->decContentsDepth();
1439  }
1440  }
1441  }
1442  }
1443  }
1444 }
1445 
1446 
1448 {
1449  if (documentedNamespaces==0) return;
1450  ol.pushGeneratorState();
1453  if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Namespaces); // fall back
1454  QCString title = lne ? lne->title() : theTranslator->trNamespaceList();
1455  bool addToIndex = lne==0 || lne->visible();
1456  startFile(ol,"namespaces",0,title,HLI_Namespaces);
1457  startTitle(ol,0);
1458  ol.parseText(title);
1459  endTitle(ol,0,0);
1460  ol.startContents();
1461  ol.startTextBlock();
1462  ol.parseText(lne ? lne->intro() : theTranslator->trNamespaceListDescription(Config_getBool("EXTRACT_ALL")));
1463  ol.endTextBlock();
1464 
1465  bool first=TRUE;
1466 
1467  // ---------------
1468  // Linear namespace index for Latex/RTF
1469  // ---------------
1470  ol.pushGeneratorState();
1472 
1474  NamespaceDef *nd;
1475  for (nli.toFirst();(nd=nli.current());++nli)
1476  {
1477  if (nd->isLinkableInProject())
1478  {
1479  if (first)
1480  {
1481  ol.startIndexList();
1482  first=FALSE;
1483  }
1484  //ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
1485  ol.startIndexKey();
1486  if (nd->getLanguage()==SrcLangExt_VHDL)
1487  {
1488  ol.writeObjectLink(0, nd->getOutputFileBase().replace(0,qstrlen("namespace"),"class"),0,nd->displayName());
1489  }
1490  else
1491  {
1492  ol.writeObjectLink(0,nd->getOutputFileBase(),0,nd->displayName());
1493  }
1494  ol.endIndexKey();
1495 
1496  bool hasBrief = !nd->briefDescription().isEmpty();
1497  ol.startIndexValue(hasBrief);
1498  if (hasBrief)
1499  {
1500  //ol.docify(" (");
1501  ol.generateDoc(
1502  nd->briefFile(),nd->briefLine(),
1503  nd,0,
1504  nd->briefDescription(TRUE),
1505  FALSE, // index words
1506  FALSE, // isExample
1507  0, // example name
1508  TRUE, // single line
1509  TRUE // link from index
1510  );
1511  //ol.docify(")");
1512  }
1513  ol.endIndexValue(nd->getOutputFileBase(),hasBrief);
1514 
1515  }
1516  }
1517  if (!first) ol.endIndexList();
1518 
1519  ol.popGeneratorState();
1520 
1521  // ---------------
1522  // Hierarchical namespace index for HTML
1523  // ---------------
1524  ol.pushGeneratorState();
1526 
1527  {
1528  if (addToIndex)
1529  {
1530  Doxygen::indexList->addContentsItem(TRUE,title,0,"namespaces",0,TRUE,TRUE);
1532  }
1533  FTVHelp* ftv = new FTVHelp(FALSE);
1535  QGString outStr;
1536  FTextStream t(&outStr);
1537  ftv->generateTreeViewInline(t);
1538  ol.writeString(outStr);
1539  delete ftv;
1540  if (addToIndex)
1541  {
1543  }
1544  }
1545 
1546  ol.popGeneratorState();
1547  // ------
1548 
1549  endFile(ol);
1550  ol.popGeneratorState();
1551 }
1552 
1553 //----------------------------------------------------------------------------
1554 
1555 static int countAnnotatedClasses(int *cp)
1556 {
1557  int count=0;
1558  int countPrinted=0;
1560  ClassDef *cd;
1561  for (;(cd=cli.current());++cli)
1562  {
1563  if (cd->isLinkableInProject() && cd->templateMaster()==0)
1564  {
1565  if (!cd->isEmbeddedInOuterScope())
1566  {
1567  countPrinted++;
1568  }
1569  count++;
1570  }
1571  }
1572  *cp = countPrinted;
1573  return count;
1574 }
1575 
1576 
1578 {
1579  //LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassList);
1580  //bool addToIndex = lne==0 || lne->visible();
1581 
1582  ol.startIndexList();
1584  ClassDef *cd;
1585 
1586  for (cli.toFirst();(cd=cli.current());++cli)
1587  {
1588  if (cd->getLanguage()==SrcLangExt_VHDL &&
1591  ) // no architecture
1592  {
1593  continue;
1594  }
1595 
1596  ol.pushGeneratorState();
1597  if (cd->isEmbeddedInOuterScope())
1598  {
1601  }
1602  if (cd->isLinkableInProject() && cd->templateMaster()==0)
1603  {
1604  ol.startIndexKey();
1605  if (cd->getLanguage()==SrcLangExt_VHDL)
1606  {
1608  ol.docify(prot.data());
1609  ol.writeString(" ");
1610  }
1611  ol.writeObjectLink(0,cd->getOutputFileBase(),cd->anchor(),cd->displayName());
1612  ol.endIndexKey();
1613  bool hasBrief = !cd->briefDescription().isEmpty();
1614  ol.startIndexValue(hasBrief);
1615  if (hasBrief)
1616  {
1617  ol.generateDoc(
1618  cd->briefFile(),cd->briefLine(),
1619  cd,0,
1620  cd->briefDescription(TRUE),
1621  FALSE, // indexWords
1622  FALSE, // isExample
1623  0, // example name
1624  TRUE, // single line
1625  TRUE // link from index
1626  );
1627  }
1628  ol.endIndexValue(cd->getOutputFileBase(),hasBrief);
1629 
1630  //if (addToIndex)
1631  //{
1632  // addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(),cd->anchor());
1633  //}
1634  }
1635  ol.popGeneratorState();
1636  }
1637  ol.endIndexList();
1638 }
1639 
1640 static QCString letterToLabel(uint startLetter)
1641 {
1642  char s[11]; // max 0x12345678 + '\0'
1643  if (isId(startLetter)) // printable ASCII character
1644  {
1645  s[0]=(char)startLetter;
1646  s[1]=0;
1647  }
1648  else
1649  {
1650  const char hex[]="0123456789abcdef";
1651  int i=0;
1652  s[i++]='0';
1653  s[i++]='x';
1654  if (startLetter>(1<<24)) // 4 byte character
1655  {
1656  s[i++]=hex[(startLetter>>28)&0xf];
1657  s[i++]=hex[(startLetter>>24)&0xf];
1658  }
1659  if (startLetter>(1<<16)) // 3 byte character
1660  {
1661  s[i++]=hex[(startLetter>>20)&0xf];
1662  s[i++]=hex[(startLetter>>16)&0xf];
1663  }
1664  if (startLetter>(1<<8)) // 2 byte character
1665  {
1666  s[i++]=hex[(startLetter>>12)&0xf];
1667  s[i++]=hex[(startLetter>>8)&0xf];
1668  }
1669  // one byte character
1670  s[i++]=hex[(startLetter>>4)&0xf];
1671  s[i++]=hex[(startLetter>>0)&0xf];
1672  s[i++]=0;
1673  }
1674  return s;
1675 }
1676 
1677 //----------------------------------------------------------------------------
1678 
1679 /** Special class list where sorting takes IGNORE_PREFIX into account. */
1681 {
1682  public:
1685  uint letter() const { return m_letter; }
1686  private:
1687  virtual int compareValue(const ClassDef *c1, const ClassDef *c2) const
1688  {
1689  QCString n1 = c1->className();
1690  QCString n2 = c2->className();
1691  return qstricmp (n1.data()+getPrefixIndex(n1), n2.data()+getPrefixIndex(n2));
1692  }
1694 };
1695 
1696 /** Class representing a cell in the alphabetical class index. */
1698 {
1699  public:
1701  m_letter(letter), m_class(cd), m_row(row), m_col(col)
1702  { //printf("AlphaIndexTableCell(%d,%d,%c,%s)\n",row,col,letter!=0 ? letter: '-',
1703  // cd!=(ClassDef*)0x8 ? cd->name().data() : "<null>");
1704  }
1705 
1706  ClassDef *classDef() const { return m_class; }
1707  uint letter() const { return m_letter; }
1708  int row() const { return m_row; }
1709  int column() const { return m_col; }
1710 
1711  private:
1714  int m_row;
1715  int m_col;
1716 };
1717 
1718 /** Class representing a row in the alphabetical class index. */
1719 class AlphaIndexTableRows : public QList<AlphaIndexTableCell>
1720 {
1721  public:
1723 };
1724 
1725 /** Iterator for the cells in a row of the alphabetical class index. */
1726 class AlphaIndexTableRowsIterator : public QListIterator<AlphaIndexTableCell>
1727 {
1728  public:
1731 };
1732 
1733 /** Class representing the columns in the alphabetical class index. */
1734 class AlphaIndexTableColumns : public QList<AlphaIndexTableRows>
1735 {
1736  public:
1738 };
1739 
1740 class UsedIndexLetters : public SIntDict<uint>
1741 {
1742  public:
1745  {
1746  uint *v = find(letter);
1747  if (v==0)
1748  {
1749  append(letter,new uint(letter));
1750  }
1751  }
1752  private:
1753  int compareValues( const uint *p1, const uint *p2) const
1754  {
1755  return (int)*p1 - (int)*p2; // subtracting is done by int not uint.
1756  }
1757 };
1758 
1759 // write an alphabetical index of all class with a header for each letter
1761 {
1762  // What starting letters are used
1763  UsedIndexLetters indexLettersUsed;
1764 
1765  // first count the number of headers
1767  ClassDef *cd;
1768  uint startLetter=0;
1769  int headerItems=0;
1770  for (;(cd=cli.current());++cli)
1771  {
1772  if (cd->isLinkableInProject() && cd->templateMaster()==0)
1773  {
1774  if (cd->getLanguage()==SrcLangExt_VHDL && !((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS ))// no architecture
1775  continue;
1776 
1777  int index = getPrefixIndex(cd->className());
1778  //printf("name=%s index=%d %d\n",cd->className().data(),index,cd->protection());
1779  startLetter=getUtf8CodeToUpper(cd->className(),index);
1780  indexLettersUsed.add(startLetter);
1781  }
1782  }
1783  indexLettersUsed.sort();
1784 
1785  // write quick link index (row of letters)
1786  QCString alphaLinks = "<div class=\"qindex\">";
1787  SIntDict<uint>::Iterator it(indexLettersUsed);
1788  uint *pLetter;
1789  for (it.toFirst();(pLetter=it.current());++it)
1790  {
1791  if (headerItems) alphaLinks += "&#160;|&#160;";
1792  headerItems++;
1793  QCString li = letterToLabel(*pLetter);
1794  QCString ls = QString(QChar(*pLetter)).utf8();
1795  alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" +
1796  li + "\">" +
1797  ls + "</a>";
1798  }
1799  alphaLinks += "</div>\n";
1800  ol.writeString(alphaLinks);
1801 
1802 
1803  // the number of columns in the table
1804  const int columns = Config_getInt("COLS_IN_ALPHA_INDEX");
1805 
1806  int i,j;
1807  int totalItems = headerItems*2 + annotatedClasses; // number of items in the table (headers span 2 items)
1808  int rows = (totalItems + columns - 1)/columns; // number of rows in the table
1809 
1810  //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
1811  // headerItems,totalItems,columns,rows,itemsInLastRow);
1812 
1813  // Keep a list of classes for each starting letter
1815  AlphaIndexTableColumns tableColumns;
1816 
1817  // fill the columns with the class list (row elements in each column,
1818  // expect for the columns with number >= itemsInLastRow, which get one
1819  // item less.
1820  //int icount=0;
1821  startLetter=0;
1822  for (cli.toFirst();(cd=cli.current());++cli)
1823  {
1824  if (cd->getLanguage()==SrcLangExt_VHDL && !((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS ))// no architecture
1825  continue;
1826 
1827  if (cd->isLinkableInProject() && cd->templateMaster()==0)
1828  {
1829  int index = getPrefixIndex(cd->className());
1830  startLetter=getUtf8Code(cd->className(),index);
1831  // Do some sorting again, since the classes are sorted by name with
1832  // prefix, which should be ignored really.
1833  if (cd->getLanguage()==SrcLangExt_VHDL)
1834  {
1835  if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )// no architecture
1836  {
1837  classesByLetter.append(startLetter,cd);
1838  }
1839  }
1840  else
1841  {
1842  classesByLetter.append(startLetter,cd);
1843  }
1844  }
1845  }
1846 
1847  #define NEXT_ROW() \
1848  do \
1849  { \
1850  if (row>maxRows) maxRows=row; \
1851  if (row>=rows && col<columns) \
1852  { \
1853  col++; \
1854  row=0; \
1855  tableRows = new AlphaIndexTableRows; \
1856  tableColumns.append(tableRows); \
1857  } \
1858  } \
1859  while(0) \
1860 
1861  AlphaIndexTableRows *tableRows = new AlphaIndexTableRows;
1862  tableColumns.append(tableRows);
1863  int col=0,row=0,maxRows=0;
1866  for (lit.toFirst();(cl=lit.current());++lit)
1867  {
1868  uint l = cl->letter();
1869  // add special header cell
1870  tableRows->append(new AlphaIndexTableCell(row,col,l,(ClassDef*)0x8));
1871  row++;
1872  tableRows->append(new AlphaIndexTableCell(row,col,0,(ClassDef*)0x8));
1873  row++;
1874  ClassListIterator cit(*cl);
1875  cit.toFirst();
1876  ClassDef *cd = cit.current();
1877  ++cit;
1878  tableRows->append(new AlphaIndexTableCell(row,col,0,cd));
1879  row++;
1880  NEXT_ROW();
1881  for (;(cd=cit.current()); ++cit)
1882  {
1883  // add normal cell
1884  tableRows->append(new AlphaIndexTableCell(row,col,0,cd));
1885  row++;
1886  NEXT_ROW();
1887  }
1888  }
1889 
1890  // create row iterators for each column
1892  for (i=0;i<columns;i++)
1893  {
1894  if (i<(int)tableColumns.count())
1895  {
1896  colIterators[i] = new AlphaIndexTableRowsIterator(*tableColumns.at(i));
1897  }
1898  else // empty column
1899  {
1900  colIterators[i] = 0;
1901  }
1902  }
1903 
1904  ol.writeString("<table class=\"classindex\">\n");
1905  // generate table
1906  for (i=0;i<=maxRows;i++) // foreach table row
1907  {
1908  //printf("writing row %d\n",i);
1909  //ol.nextTableRow();
1910  ol.writeString("<tr>");
1911  // the last column may contain less items then the others
1912  //int colsInRow = (i<rows-1) ? columns : itemsInLastRow;
1913  //printf("row [%d]\n",i);
1914  for (j=0;j<columns;j++) // foreach table column
1915  {
1916  if (colIterators[j])
1917  {
1918  AlphaIndexTableCell *cell = colIterators[j]->current();
1919  if (cell)
1920  {
1921  if (cell->row()==i)
1922  {
1923  if (cell->letter()!=0)
1924  {
1925  QCString s = letterToLabel(cell->letter());
1926  ol.writeString("<td rowspan=\"2\" valign=\"bottom\">");
1927  ol.writeString("<a name=\"letter_");
1928  ol.writeString(s);
1929  ol.writeString("\"></a>");
1930  ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
1931  "<tr>"
1932  "<td><div class=\"ah\">&#160;&#160;");
1933  ol.writeString(QString(QChar(cell->letter())).utf8());
1934  ol.writeString( "&#160;&#160;</div>"
1935  "</td>"
1936  "</tr>"
1937  "</table>\n");
1938  }
1939  else if (cell->classDef()!=(ClassDef*)0x8)
1940  {
1941  cd = cell->classDef();
1942  ol.writeString("<td valign=\"top\">");
1943  QCString namesp,cname;
1944  //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
1945  //QCString cname=cd->className();
1946  extractNamespaceName(cd->name(),cname,namesp);
1947  QCString nsDispName;
1948  SrcLangExt lang = cd->getLanguage();
1950  if (sep!="::")
1951  {
1952  nsDispName=substitute(namesp,"::",sep);
1953  cname=substitute(cname,"::",sep);
1954  }
1955  else
1956  {
1957  nsDispName=namesp;
1958  }
1959 
1960  ol.writeObjectLink(cd->getReference(),
1961  cd->getOutputFileBase(),cd->anchor(),cname);
1962  if (!namesp.isEmpty())
1963  {
1964  ol.docify(" (");
1965  NamespaceDef *nd = getResolvedNamespace(namesp);
1966  if (nd && nd->isLinkable())
1967  {
1968  ol.writeObjectLink(nd->getReference(),
1969  nd->getOutputFileBase(),0,nsDispName);
1970  }
1971  else
1972  {
1973  ol.docify(nsDispName);
1974  }
1975  ol.docify(")");
1976  }
1977  ol.writeNonBreakableSpace(3);
1978  }
1979  ++(*colIterators[j]);
1980  if (cell->letter()!=0 || cell->classDef()!=(ClassDef*)0x8)
1981  {
1982  ol.writeString("</td>");
1983  }
1984  }
1985  }
1986  else
1987  {
1988  ol.writeString("<td></td>");
1989  }
1990  }
1991  }
1992  ol.writeString("</tr>\n");
1993  }
1994  ol.writeString("</table>\n");
1995 
1996  ol.writeString(alphaLinks);
1997 
1998  // release the temporary memory
1999  for (i=0;i<columns;i++)
2000  {
2001  delete colIterators[i];
2002  }
2003  delete[] colIterators;
2004 }
2005 
2006 //----------------------------------------------------------------------------
2007 
2009 {
2010  if (annotatedClasses==0) return;
2011  ol.pushGeneratorState();
2014  QCString title = lne ? lne->title() : theTranslator->trCompoundIndex();
2015  bool addToIndex = lne==0 || lne->visible();
2016 
2017  startFile(ol,"classes",0,title,HLI_Classes);
2018 
2019  startTitle(ol,0);
2020  ol.parseText(title);
2021  endTitle(ol,0,0);
2022 
2023  if (addToIndex)
2024  {
2025  Doxygen::indexList->addContentsItem(FALSE,title,0,"classes",0,FALSE,TRUE);
2026  }
2027 
2028  ol.startContents();
2030  endFile(ol); // contains ol.endContents()
2031 
2032  ol.popGeneratorState();
2033 }
2034 
2035 //----------------------------------------------------------------------------
2036 
2038 {
2039  //printf("writeAnnotatedIndex: count=%d printed=%d\n",
2040  // annotatedClasses,annotatedClassesPrinted);
2041  if (annotatedClasses==0) return;
2042 
2043  ol.pushGeneratorState();
2045  if (annotatedClassesPrinted==0)
2046  {
2049  }
2051  if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Classes); // fall back
2052  QCString title = lne ? lne->title() : theTranslator->trCompoundList();
2053  bool addToIndex = lne==0 || lne->visible();
2054 
2055 
2056  startFile(ol,"annotated",0,title,HLI_Annotated);
2057 
2058  startTitle(ol,0);
2059  ol.parseText(title);
2060  endTitle(ol,0,0);
2061 
2062  ol.startContents();
2063 
2064  ol.startTextBlock();
2066  ol.endTextBlock();
2067 
2068  // ---------------
2069  // Linear class index for Latex/RTF
2070  // ---------------
2071  ol.pushGeneratorState();
2074 
2076 
2078  ol.popGeneratorState();
2079 
2080  // ---------------
2081  // Hierarchical class index for HTML
2082  // ---------------
2083  ol.pushGeneratorState();
2085 
2086  {
2087  if (addToIndex)
2088  {
2089  Doxygen::indexList->addContentsItem(TRUE,title,0,"annotated",0,TRUE,TRUE);
2091  }
2092  FTVHelp* ftv = new FTVHelp(FALSE);
2094  writeClassTree(Doxygen::classSDict,ftv,addToIndex,TRUE);
2095  QGString outStr;
2096  FTextStream t(&outStr);
2097  ftv->generateTreeViewInline(t);
2098  ol.writeString(outStr);
2099  delete ftv;
2100  if (addToIndex)
2101  {
2103  }
2104  }
2105 
2106  ol.popGeneratorState();
2107  // ------
2108 
2109  endFile(ol); // contains ol.endContents()
2110  ol.popGeneratorState();
2111 }
2112 
2113 //----------------------------------------------------------------------------
2114 static void writeClassLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
2115  QCString &prevClassName)
2116 {
2117  ClassDef *cd=md->getClassDef();
2118  if ( cd && prevClassName!=cd->displayName())
2119  {
2120  ol.docify(separator);
2122  cd->displayName());
2123  ol.writeString("\n");
2124  prevClassName = cd->displayName();
2125  }
2126 }
2127 
2128 static void writeFileLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
2129  QCString &prevFileName)
2130 {
2131  FileDef *fd=md->getFileDef();
2132  if (fd && prevFileName!=fd->name())
2133  {
2134  ol.docify(separator);
2136  fd->name());
2137  ol.writeString("\n");
2138  prevFileName = fd->name();
2139  }
2140 }
2141 
2142 static void writeNamespaceLinkForMember(OutputList &ol,MemberDef *md,const char *separator,
2143  QCString &prevNamespaceName)
2144 {
2145  NamespaceDef *nd=md->getNamespaceDef();
2146  if (nd && prevNamespaceName!=nd->displayName())
2147  {
2148  ol.docify(separator);
2150  nd->displayName());
2151  ol.writeString("\n");
2152  prevNamespaceName = nd->displayName();
2153  }
2154 }
2155 
2156 static void writeMemberList(OutputList &ol,bool useSections,int page,
2157  const LetterToIndexMap<MemberIndexList> &memberLists,
2159 {
2160  int index = (int)type;
2161  ASSERT(index<3);
2162 
2163  typedef void (*writeLinkForMember_t)(OutputList &ol,MemberDef *md,const char *separator,
2164  QCString &prevNamespaceName);
2165 
2166  // each index tab has its own write function
2167  static writeLinkForMember_t writeLinkForMemberMap[3] =
2168  {
2172  };
2173  QCString prevName;
2174  QCString prevDefName;
2175  bool first=TRUE;
2176  bool firstSection=TRUE;
2177  bool firstItem=TRUE;
2178  MemberIndexList *ml;
2179  SIntDict<MemberIndexList>::Iterator it(memberLists);
2180  for (it.toFirst();(ml=it.current());++it)
2181  {
2182  if (page!=-1)
2183  {
2184  ml = memberLists[page];
2185  it.toLast();
2186  }
2187  if (ml==0 || ml->count()==0) continue;
2188  ml->sort();
2189  QListIterator<MemberDef> mli(*ml);
2190  MemberDef *md;
2191  for (mli.toFirst();(md=mli.current());++mli)
2192  {
2193  const char *sep;
2194  bool isFunc=!md->isObjCMethod() &&
2195  (md->isFunction() || md->isSlot() || md->isSignal());
2196  QCString name=md->name();
2197  int startIndex = getPrefixIndex(name);
2198  if (QCString(name.data()+startIndex)!=prevName) // new entry
2199  {
2200  if ((prevName.isEmpty() ||
2201  tolower(name.at(startIndex))!=tolower(prevName.at(0))) &&
2202  useSections) // new section
2203  {
2204  if (!firstItem) ol.endItemListItem();
2205  if (!firstSection) ol.endItemList();
2206  QCString cs = letterToLabel(ml->letter());
2207  QCString cl = QString(QChar(ml->letter())).utf8();
2208  QCString anchor=(QCString)"index_"+cs;
2209  QCString title=(QCString)"- "+cl+" -";
2210  ol.startSection(anchor,title,SectionInfo::Subsection);
2211  ol.docify(title);
2212  ol.endSection(anchor,SectionInfo::Subsection);
2213  ol.startItemList();
2214  firstSection=FALSE;
2215  firstItem=TRUE;
2216  }
2217  else if (!useSections && first)
2218  {
2219  ol.startItemList();
2220  first=FALSE;
2221  }
2222 
2223  // member name
2224  if (!firstItem) ol.endItemListItem();
2225  ol.startItemListItem();
2226  firstItem=FALSE;
2227  ol.docify(name);
2228  if (isFunc) ol.docify("()");
2229  ol.writeString("\n");
2230 
2231  // link to class
2232  prevDefName="";
2233  sep = ": ";
2234  prevName = name.data()+startIndex;
2235  }
2236  else // same entry
2237  {
2238  sep = ", ";
2239  // link to class for other members with the same name
2240  }
2241  if (index<3)
2242  {
2243  // write the link for the specific list type
2244  writeLinkForMemberMap[index](ol,md,sep,prevDefName);
2245  }
2246  }
2247  }
2248  if (!firstItem) ol.endItemListItem();
2249  ol.endItemList();
2250 }
2251 
2252 //----------------------------------------------------------------------------
2253 
2255 {
2256  int j=0;
2257  for (j=0;j<CMHL_Total;j++)
2258  {
2260  g_memberIndexLetterUsed[j].clear();
2261  }
2262 }
2263 
2265 {
2266  static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
2267  ClassDef *cd=0;
2268 
2269 
2270 
2271  if (md->isLinkableInProject() &&
2272  (cd=md->getClassDef()) &&
2273  cd->isLinkableInProject() &&
2274  cd->templateMaster()==0)
2275  {
2276  QCString n = md->name();
2277  int index = getPrefixIndex(n);
2278  uint letter = getUtf8CodeToLower(n,index);
2279  if (!n.isEmpty())
2280  {
2281  bool isFriendToHide = hideFriendCompounds &&
2282  (QCString(md->typeString())=="friend class" ||
2283  QCString(md->typeString())=="friend struct" ||
2284  QCString(md->typeString())=="friend union");
2285  if (!(md->isFriend() && isFriendToHide) &&
2286  (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong()))
2287  )
2288  {
2289  g_memberIndexLetterUsed[CMHL_All].append(letter,md);
2291  }
2292  if (md->isFunction() || md->isSlot() || md->isSignal())
2293  {
2294  g_memberIndexLetterUsed[CMHL_Functions].append(letter,md);
2296  }
2297  else if (md->isVariable())
2298  {
2299  g_memberIndexLetterUsed[CMHL_Variables].append(letter,md);
2301  }
2302  else if (md->isTypedef())
2303  {
2304  g_memberIndexLetterUsed[CMHL_Typedefs].append(letter,md);
2306  }
2307  else if (md->isEnumerate())
2308  {
2309  g_memberIndexLetterUsed[CMHL_Enums].append(letter,md);
2311  }
2312  else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong())
2313  {
2314  g_memberIndexLetterUsed[CMHL_EnumValues].append(letter,md);
2316  }
2317  else if (md->isProperty())
2318  {
2319  g_memberIndexLetterUsed[CMHL_Properties].append(letter,md);
2321  }
2322  else if (md->isEvent())
2323  {
2324  g_memberIndexLetterUsed[CMHL_Events].append(letter,md);
2326  }
2327  else if (md->isRelated() || md->isForeign() ||
2328  (md->isFriend() && !isFriendToHide))
2329  {
2330  g_memberIndexLetterUsed[CMHL_Related].append(letter,md);
2332  }
2333  }
2334  }
2335 }
2336 
2337 //----------------------------------------------------------------------------
2338 
2340 {
2341  int j=0;
2342  for (j=0;j<NMHL_Total;j++)
2343  {
2345  g_namespaceIndexLetterUsed[j].clear();
2346  }
2347 }
2348 
2350 {
2351  NamespaceDef *nd=md->getNamespaceDef();
2352  if (nd && nd->isLinkableInProject() && md->isLinkableInProject())
2353  {
2354  QCString n = md->name();
2355  int index = getPrefixIndex(n);
2356  uint letter = getUtf8CodeToLower(n,index);
2357  if (!n.isEmpty())
2358  {
2359  if (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong()))
2360  {
2361  g_namespaceIndexLetterUsed[NMHL_All].append(letter,md);
2363  }
2364 
2365  if (md->isFunction())
2366  {
2367  g_namespaceIndexLetterUsed[NMHL_Functions].append(letter,md);
2369  }
2370  else if (md->isVariable())
2371  {
2372  g_namespaceIndexLetterUsed[NMHL_Variables].append(letter,md);
2374  }
2375  else if (md->isTypedef())
2376  {
2377  g_namespaceIndexLetterUsed[NMHL_Typedefs].append(letter,md);
2379  }
2380  else if (md->isEnumerate())
2381  {
2382  g_namespaceIndexLetterUsed[NMHL_Enums].append(letter,md);
2384  }
2385  else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong())
2386  {
2387  g_namespaceIndexLetterUsed[NMHL_EnumValues].append(letter,md);
2389  }
2390  }
2391  }
2392 }
2393 
2394 //----------------------------------------------------------------------------
2395 
2397 {
2398  int j=0;
2399  for (j=0;j<NMHL_Total;j++)
2400  {
2401  documentedFileMembers[j]=0;
2402  g_fileIndexLetterUsed[j].clear();
2403  }
2404 }
2405 
2407 {
2408  FileDef *fd=md->getFileDef();
2409  if (fd && fd->isLinkableInProject() && md->isLinkableInProject())
2410  {
2411  QCString n = md->name();
2412  int index = getPrefixIndex(n);
2413  uint letter = getUtf8CodeToLower(n,index);
2414  if (!n.isEmpty())
2415  {
2416  if (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong()))
2417  {
2418  g_fileIndexLetterUsed[FMHL_All].append(letter,md);
2420  }
2421 
2422  if (md->isFunction())
2423  {
2424  g_fileIndexLetterUsed[FMHL_Functions].append(letter,md);
2426  }
2427  else if (md->isVariable())
2428  {
2429  g_fileIndexLetterUsed[FMHL_Variables].append(letter,md);
2431  }
2432  else if (md->isTypedef())
2433  {
2434  g_fileIndexLetterUsed[FMHL_Typedefs].append(letter,md);
2436  }
2437  else if (md->isEnumerate())
2438  {
2439  g_fileIndexLetterUsed[FMHL_Enums].append(letter,md);
2441  }
2442  else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong())
2443  {
2444  g_fileIndexLetterUsed[FMHL_EnumValues].append(letter,md);
2446  }
2447  else if (md->isDefine())
2448  {
2449  g_fileIndexLetterUsed[FMHL_Defines].append(letter,md);
2451  }
2452  }
2453  }
2454 }
2455 
2456 //----------------------------------------------------------------------------
2457 
2459  const LetterToIndexMap<MemberIndexList> &charUsed,uint page,
2460  QCString fullName,bool multiPage)
2461 {
2462  bool first=TRUE;
2465  MemberIndexList *ml;
2466  for (it.toFirst();(ml=it.current());++it)
2467  {
2468  uint i = ml->letter();
2469  QCString is = letterToLabel(i);
2470  QCString ci = QString(QChar(i)).utf8();
2471  QCString anchor;
2473  if (!multiPage)
2474  anchor="#index_";
2475  else if (first)
2476  anchor=fullName+extension+"#index_";
2477  else
2478  anchor=fullName+"_"+letterToLabel(i)+extension+"#index_";
2479  startQuickIndexItem(ol,anchor+is,i==page,TRUE,first);
2480  ol.writeString(ci);
2481  endQuickIndexItem(ol);
2482  first=FALSE;
2483  }
2484  endQuickIndexList(ol);
2485 }
2486 
2487 //----------------------------------------------------------------------------
2488 
2489 /** Helper class representing a class member in the navigation menu. */
2490 struct CmhlInfo
2491 {
2492  CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
2493  const char *fname;
2495 };
2496 
2497 static const CmhlInfo *getCmhlInfo(int hl)
2498 {
2499  static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
2500  static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
2501  static CmhlInfo cmhlInfo[] =
2502  {
2503  CmhlInfo("functions", theTranslator->trAll()),
2504  CmhlInfo("functions_func",
2505  fortranOpt ? theTranslator->trSubprograms() :
2506  vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
2508  CmhlInfo("functions_vars",theTranslator->trVariables()),
2509  CmhlInfo("functions_type",theTranslator->trTypedefs()),
2510  CmhlInfo("functions_enum",theTranslator->trEnumerations()),
2511  CmhlInfo("functions_eval",theTranslator->trEnumerationValues()),
2512  CmhlInfo("functions_prop",theTranslator->trProperties()),
2513  CmhlInfo("functions_evnt",theTranslator->trEvents()),
2514  CmhlInfo("functions_rela",theTranslator->trRelatedFunctions())
2515  };
2516  return &cmhlInfo[hl];
2517 }
2518 
2520 {
2521  if (documentedClassMembers[hl]==0) return;
2522 
2523  static bool disableIndex = Config_getBool("DISABLE_INDEX");
2524 
2525  bool multiPageIndex=FALSE;
2527  {
2528  multiPageIndex=TRUE;
2529  }
2530 
2531  ol.pushGeneratorState();
2533 
2536  QCString title = lne ? lne->title() : theTranslator->trCompoundMembers();
2537  if (hl!=CMHL_All) title+=(QCString)" - "+getCmhlInfo(hl)->title;
2538  bool addToIndex = lne==0 || lne->visible();
2539 
2540  if (addToIndex)
2541  {
2542  Doxygen::indexList->addContentsItem(multiPageIndex,getCmhlInfo(hl)->title,0,
2543  getCmhlInfo(hl)->fname,0,multiPageIndex,TRUE);
2544  if (multiPageIndex) Doxygen::indexList->incContentsDepth();
2545  }
2546 
2547  bool first=TRUE;
2548  SIntDict<MemberIndexList>::Iterator it(g_memberIndexLetterUsed[hl]);
2549  MemberIndexList *ml;
2550  for (it.toFirst();(ml=it.current());++it)
2551  {
2552  uint page = ml->letter();
2554  if (multiPageIndex)
2555  {
2556  if (!first)
2557  {
2558  fileName+="_"+letterToLabel(page);
2559  }
2560  QCString cs = QString(QChar(page)).utf8();
2561  if (addToIndex)
2562  {
2564  }
2565  }
2566  bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex;
2567 
2568  ol.startFile(fileName+extension,0,title);
2569  ol.startQuickIndices();
2570  if (!disableIndex)
2571  {
2573  startQuickIndexList(ol);
2574 
2575  // index item for global member list
2578  ol.writeString(fixSpaces(getCmhlInfo(0)->title));
2579  endQuickIndexItem(ol);
2580 
2581  int i;
2582  // index items per category member lists
2583  for (i=1;i<CMHL_Total;i++)
2584  {
2585  if (documentedClassMembers[i]>0)
2586  {
2588  ol.writeString(fixSpaces(getCmhlInfo(i)->title));
2589  //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n",
2590  // multiPageIndex,first,fileName.data(),getCmhlInfo(i)->fname,getCmhlInfo(i)->title.data());
2591  endQuickIndexItem(ol);
2592  }
2593  }
2594 
2595  endQuickIndexList(ol);
2596 
2597  // quick alphabetical index
2598  if (quickIndex)
2599  {
2600  writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page,
2601  getCmhlInfo(hl)->fname,multiPageIndex);
2602  }
2603  }
2604  ol.endQuickIndices();
2605  ol.writeSplitBar(fileName);
2606  ol.writeSearchInfo();
2607 
2608  ol.startContents();
2609 
2610  if (hl==CMHL_All)
2611  {
2612  ol.startTextBlock();
2613  ol.parseText(lne ? lne->intro() : theTranslator->trCompoundMembersDescription(Config_getBool("EXTRACT_ALL")));
2614  ol.endTextBlock();
2615  }
2616  else
2617  {
2618  // hack to work around a mozilla bug, which refuses to switch to
2619  // normal lists otherwise
2620  ol.writeString("&#160;");
2621  }
2622 
2623  writeMemberList(ol,quickIndex,
2624  multiPageIndex?page:-1,
2625  g_memberIndexLetterUsed[hl],
2627  endFile(ol);
2628  first=FALSE;
2629  }
2630 
2631  if (multiPageIndex && addToIndex) Doxygen::indexList->decContentsDepth();
2632 
2633  ol.popGeneratorState();
2634 }
2635 
2637 {
2639  bool addToIndex = lne==0 || lne->visible();
2640 
2641  if (documentedClassMembers[CMHL_All]>0 && addToIndex)
2642  {
2643  Doxygen::indexList->addContentsItem(TRUE,lne ? lne->title() : theTranslator->trCompoundMembers(),0,"functions",0);
2645  }
2655  if (documentedClassMembers[CMHL_All]>0 && addToIndex)
2656  {
2658  }
2659 
2660 }
2661 
2662 //----------------------------------------------------------------------------
2663 
2664 /** Helper class representing a file member in the navigation menu. */
2665 struct FmhlInfo
2666 {
2667  FmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
2668  const char *fname;
2670 };
2671 
2672 static const FmhlInfo *getFmhlInfo(int hl)
2673 {
2674  static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
2675  static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
2676  static FmhlInfo fmhlInfo[] =
2677  {
2678  FmhlInfo("globals", theTranslator->trAll()),
2679  FmhlInfo("globals_func",
2680  fortranOpt ? theTranslator->trSubprograms() :
2681  vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
2683  FmhlInfo("globals_vars",theTranslator->trVariables()),
2684  FmhlInfo("globals_type",theTranslator->trTypedefs()),
2685  FmhlInfo("globals_enum",theTranslator->trEnumerations()),
2686  FmhlInfo("globals_eval",theTranslator->trEnumerationValues()),
2687  FmhlInfo("globals_defs",theTranslator->trDefines())
2688  };
2689  return &fmhlInfo[hl];
2690 }
2691 
2693 {
2694  if (documentedFileMembers[hl]==0) return;
2695 
2696  static bool disableIndex = Config_getBool("DISABLE_INDEX");
2697 
2698  bool multiPageIndex=FALSE;
2700  {
2701  multiPageIndex=TRUE;
2702  }
2703 
2704  ol.pushGeneratorState();
2706 
2709  QCString title = lne ? lne->title() : theTranslator->trFileMembers();
2710  bool addToIndex = lne==0 || lne->visible();
2711 
2712  if (addToIndex)
2713  {
2714  Doxygen::indexList->addContentsItem(multiPageIndex,getFmhlInfo(hl)->title,0,
2715  getFmhlInfo(hl)->fname,0,multiPageIndex,TRUE);
2716  if (multiPageIndex) Doxygen::indexList->incContentsDepth();
2717  }
2718 
2719  bool first=TRUE;
2720  SIntDict<MemberIndexList>::Iterator it(g_fileIndexLetterUsed[hl]);
2721  MemberIndexList *ml;
2722  for (it.toFirst();(ml=it.current());++it)
2723  {
2724  uint page = ml->letter();
2726  if (multiPageIndex)
2727  {
2728  if (!first)
2729  {
2730  fileName+="_"+letterToLabel(page);
2731  }
2732  QCString cs = QString(QChar(page)).utf8();
2733  if (addToIndex)
2734  {
2736  }
2737  }
2738  bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex;
2739 
2740  ol.startFile(fileName+extension,0,title);
2741  ol.startQuickIndices();
2742  if (!disableIndex)
2743  {
2745  startQuickIndexList(ol);
2746 
2747  // index item for all file member lists
2750  ol.writeString(fixSpaces(getFmhlInfo(0)->title));
2751  endQuickIndexItem(ol);
2752 
2753  int i;
2754  // index items for per category member lists
2755  for (i=1;i<FMHL_Total;i++)
2756  {
2757  if (documentedFileMembers[i]>0)
2758  {
2761  ol.writeString(fixSpaces(getFmhlInfo(i)->title));
2762  endQuickIndexItem(ol);
2763  }
2764  }
2765 
2766  endQuickIndexList(ol);
2767 
2768  if (quickIndex)
2769  {
2770  writeQuickMemberIndex(ol,g_fileIndexLetterUsed[hl],page,
2771  getFmhlInfo(hl)->fname,multiPageIndex);
2772  }
2773  }
2774  ol.endQuickIndices();
2775  ol.writeSplitBar(fileName);
2776  ol.writeSearchInfo();
2777 
2778  ol.startContents();
2779 
2780  if (hl==FMHL_All)
2781  {
2782  ol.startTextBlock();
2783  ol.parseText(lne ? lne->intro() : theTranslator->trFileMembersDescription(Config_getBool("EXTRACT_ALL")));
2784  ol.endTextBlock();
2785  }
2786  else
2787  {
2788  // hack to work around a mozilla bug, which refuses to switch to
2789  // normal lists otherwise
2790  ol.writeString("&#160;");
2791  }
2792 
2793  writeMemberList(ol,quickIndex,
2794  multiPageIndex?page:-1,
2795  g_fileIndexLetterUsed[hl],
2797  endFile(ol);
2798  first=FALSE;
2799  }
2800  if (multiPageIndex && addToIndex) Doxygen::indexList->decContentsDepth();
2801  ol.popGeneratorState();
2802 }
2803 
2805 {
2807  bool addToIndex = lne==0 || lne->visible();
2808  if (documentedFileMembers[FMHL_All]>0 && addToIndex)
2809  {
2810  Doxygen::indexList->addContentsItem(FALSE,lne ? lne->title() : theTranslator->trFileMembers(),0,"globals",0);
2812  }
2820  if (documentedFileMembers[FMHL_All]>0 && addToIndex)
2821  {
2823  }
2824 
2825 }
2826 
2827 //----------------------------------------------------------------------------
2828 
2829 /** Helper class representing a namespace member in the navigation menu. */
2830 struct NmhlInfo
2831 {
2832  NmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
2833  const char *fname;
2835 };
2836 
2837 static const NmhlInfo *getNmhlInfo(int hl)
2838 {
2839  static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
2840  static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
2841  static NmhlInfo nmhlInfo[] =
2842  {
2843  NmhlInfo("namespacemembers", theTranslator->trAll()),
2844  NmhlInfo("namespacemembers_func",
2845  fortranOpt ? theTranslator->trSubprograms() :
2846  vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
2848  NmhlInfo("namespacemembers_vars",theTranslator->trVariables()),
2849  NmhlInfo("namespacemembers_type",theTranslator->trTypedefs()),
2850  NmhlInfo("namespacemembers_enum",theTranslator->trEnumerations()),
2851  NmhlInfo("namespacemembers_eval",theTranslator->trEnumerationValues())
2852  };
2853  return &nmhlInfo[hl];
2854 }
2855 
2856 //----------------------------------------------------------------------------
2857 
2860 {
2861  if (documentedNamespaceMembers[hl]==0) return;
2862 
2863  static bool disableIndex = Config_getBool("DISABLE_INDEX");
2864 
2865 
2866  bool multiPageIndex=FALSE;
2868  {
2869  multiPageIndex=TRUE;
2870  }
2871 
2872  ol.pushGeneratorState();
2874 
2877  QCString title = lne ? lne->title() : theTranslator->trNamespaceMembers();
2878  bool addToIndex = lne==0 || lne->visible();
2879 
2880  if (addToIndex)
2881  {
2882  Doxygen::indexList->addContentsItem(multiPageIndex,getNmhlInfo(hl)->title,0,
2883  getNmhlInfo(hl)->fname,0,multiPageIndex,TRUE);
2884  if (multiPageIndex) Doxygen::indexList->incContentsDepth();
2885  }
2886 
2887  bool first=TRUE;
2888  SIntDict<MemberIndexList>::Iterator it(g_namespaceIndexLetterUsed[hl]);
2889  MemberIndexList *ml;
2890  for (it.toFirst();(ml=it.current());++it)
2891  {
2892  uint page = ml->letter();
2894  if (multiPageIndex)
2895  {
2896  if (!first)
2897  {
2898  fileName+="_"+letterToLabel(page);
2899  }
2900  QCString cs = QString(QChar(page)).utf8();
2901  if (addToIndex)
2902  {
2904  }
2905  }
2907 
2908  ol.startFile(fileName+extension,0,title);
2909  ol.startQuickIndices();
2910  if (!disableIndex)
2911  {
2913  startQuickIndexList(ol);
2914 
2915  // index item for all namespace member lists
2918  ol.writeString(fixSpaces(getNmhlInfo(0)->title));
2919  endQuickIndexItem(ol);
2920 
2921  int i;
2922  // index items per category member lists
2923  for (i=1;i<NMHL_Total;i++)
2924  {
2925  if (documentedNamespaceMembers[i]>0)
2926  {
2929  ol.writeString(fixSpaces(getNmhlInfo(i)->title));
2930  endQuickIndexItem(ol);
2931  }
2932  }
2933 
2934  endQuickIndexList(ol);
2935 
2936  if (quickIndex)
2937  {
2938  writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed[hl],page,
2939  getNmhlInfo(hl)->fname,multiPageIndex);
2940  }
2941 
2942  }
2943  ol.endQuickIndices();
2944  ol.writeSplitBar(fileName);
2945  ol.writeSearchInfo();
2946 
2947  ol.startContents();
2948 
2949  if (hl==NMHL_All)
2950  {
2951  ol.startTextBlock();
2952  ol.parseText(lne ? lne->intro() : theTranslator->trNamespaceMemberDescription(Config_getBool("EXTRACT_ALL")));
2953  ol.endTextBlock();
2954  }
2955  else
2956  {
2957  // hack to work around a mozilla bug, which refuses to switch to
2958  // normal lists otherwise
2959  ol.writeString("&#160;");
2960  }
2961 
2962  writeMemberList(ol,quickIndex,
2963  multiPageIndex?page:-1,
2964  g_namespaceIndexLetterUsed[hl],
2966  endFile(ol);
2967  }
2968  if (multiPageIndex && addToIndex) Doxygen::indexList->decContentsDepth();
2969  ol.popGeneratorState();
2970 }
2971 
2973 {
2975  bool addToIndex = lne==0 || lne->visible();
2976  if (documentedNamespaceMembers[NMHL_All]>0 && addToIndex)
2977  {
2978  Doxygen::indexList->addContentsItem(FALSE,lne ? lne->title() : theTranslator->trNamespaceMembers(),0,"namespacemembers",0);
2980  }
2981  //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
2988  if (documentedNamespaceMembers[NMHL_All]>0 && addToIndex)
2989  {
2991  }
2992 
2993 }
2994 
2995 //----------------------------------------------------------------------------
2996 
2997 //----------------------------------------------------------------------------
2998 
3000 {
3001  if (Doxygen::exampleSDict->count()==0) return;
3002  ol.pushGeneratorState();
3005  QCString title = lne ? lne->title() : theTranslator->trExamples();
3006  bool addToIndex = lne==0 || lne->visible();
3007 
3008  startFile(ol,"examples",0,title,HLI_Examples);
3009 
3010  startTitle(ol,0);
3011  ol.parseText(title);
3012  endTitle(ol,0,0);
3013 
3014  ol.startContents();
3015 
3016  if (addToIndex)
3017  {
3018  Doxygen::indexList->addContentsItem(TRUE,title,0,"examples",0,TRUE,TRUE);
3020  }
3021 
3022  ol.startTextBlock();
3023  ol.parseText(lne ? lne->intro() : theTranslator->trExamplesDescription());
3024  ol.endTextBlock();
3025 
3026  ol.startItemList();
3028  PageDef *pd=0;
3029  for (pdi.toFirst();(pd=pdi.current());++pdi)
3030  {
3031  ol.startItemListItem();
3033  if (!pd->title().isEmpty())
3034  {
3035  ol.writeObjectLink(0,n,0,pd->title());
3036  if (addToIndex)
3037  {
3039  }
3040  }
3041  else
3042  {
3043  ol.writeObjectLink(0,n,0,pd->name());
3044  if (addToIndex)
3045  {
3047  }
3048  }
3049  ol.endItemListItem();
3050  ol.writeString("\n");
3051  }
3052  ol.endItemList();
3053 
3054  if (addToIndex)
3055  {
3057  }
3058  endFile(ol);
3059  ol.popGeneratorState();
3060 }
3061 
3062 
3063 //----------------------------------------------------------------------------
3064 
3065 static void countRelatedPages(int &docPages,int &indexPages)
3066 {
3067  docPages=indexPages=0;
3069  PageDef *pd=0;
3070  for (pdi.toFirst();(pd=pdi.current());++pdi)
3071  {
3072  if ( pd->visibleInIndex())
3073  {
3074  indexPages++;
3075  }
3076  if ( pd->documentedPage())
3077  {
3078  docPages++;
3079  }
3080  }
3081 }
3082 
3083 //----------------------------------------------------------------------------
3084 
3085 static bool mainPageHasOwnTitle()
3086 {
3087  static QCString projectName = Config_getString("PROJECT_NAME");
3088  QCString title;
3089  if (Doxygen::mainPage)
3090  {
3091  title = filterTitle(Doxygen::mainPage->title());
3092  }
3093  return !projectName.isEmpty() && mainPageHasTitle() && qstricmp(title,projectName)!=0;
3094 }
3095 
3096 static void writePages(PageDef *pd,FTVHelp *ftv)
3097 {
3098  //printf("writePages()=%s pd=%p mainpage=%p\n",pd->name().data(),pd,Doxygen::mainPage);
3100  bool addToIndex = lne==0 || lne->visible();
3101  if (!addToIndex) return;
3102 
3103  bool hasSubPages = pd->hasSubPages();
3104  bool hasSections = pd->hasSections();
3105 
3106  if (pd->visibleInIndex())
3107  {
3108  QCString pageTitle;
3109 
3110  if (pd->title().isEmpty())
3111  pageTitle=pd->name();
3112  else
3113  pageTitle=filterTitle(pd->title());
3114 
3115  if (ftv)
3116  {
3117  //printf("*** adding %s hasSubPages=%d hasSections=%d\n",pageTitle.data(),hasSubPages,hasSections);
3118  ftv->addContentsItem(
3119  hasSubPages,pageTitle,
3120  pd->getReference(),pd->getOutputFileBase(),
3121  0,hasSubPages,TRUE,pd);
3122  }
3123  if (addToIndex && pd!=Doxygen::mainPage)
3124  {
3126  hasSubPages || hasSections,pageTitle,
3127  pd->getReference(),pd->getOutputFileBase(),
3128  0,hasSubPages,TRUE);
3129  }
3130  }
3131  if (hasSubPages && ftv) ftv->incContentsDepth();
3132  bool doIndent = (hasSections || hasSubPages) &&
3134  if (doIndent)
3135  {
3137  }
3138  if (hasSections)
3139  {
3140  pd->addSectionsToIndex();
3141  }
3142  PageSDict *subPages = pd->getSubPages();
3143  if (subPages)
3144  {
3145  PageSDict::Iterator pi(*subPages);
3146  PageDef *subPage;
3147  for (pi.toFirst();(subPage=pi.current());++pi)
3148  {
3149  writePages(subPage,ftv);
3150  }
3151  }
3152  if (hasSubPages && ftv) ftv->decContentsDepth();
3153  if (doIndent)
3154  {
3156  }
3157  //printf("end writePages()=%s\n",pd->title().data());
3158 }
3159 
3160 //----------------------------------------------------------------------------
3161 
3162 static void writePageIndex(OutputList &ol)
3163 {
3164  if (indexedPages==0) return;
3165  ol.pushGeneratorState();
3168  QCString title = lne ? lne->title() : theTranslator->trRelatedPages();
3169  startFile(ol,"pages",0,title,HLI_Pages);
3170  startTitle(ol,0);
3171  ol.parseText(title);
3172  endTitle(ol,0,0);
3173  ol.startContents();
3174  ol.startTextBlock();
3176  ol.endTextBlock();
3177 
3178  {
3179  FTVHelp* ftv = new FTVHelp(FALSE);
3181  PageDef *pd=0;
3182  for (pdi.toFirst();(pd=pdi.current());++pdi)
3183  {
3184  if ((pd->getOuterScope()==0 ||
3185  pd->getOuterScope()->definitionType()!=Definition::TypePage) && // not a sub page
3186  !pd->isReference() // not an external page
3187  )
3188  {
3189  writePages(pd,ftv);
3190  }
3191  }
3192  QGString outStr;
3193  FTextStream t(&outStr);
3194  ftv->generateTreeViewInline(t);
3195  ol.writeString(outStr);
3196  delete ftv;
3197  }
3198 
3199 // ol.popGeneratorState();
3200  // ------
3201 
3202  endFile(ol);
3203  ol.popGeneratorState();
3204 }
3205 
3206 //----------------------------------------------------------------------------
3207 
3208 static int countGroups()
3209 {
3210  int count=0;
3212  GroupDef *gd;
3213  for (gli.toFirst();(gd=gli.current());++gli)
3214  {
3215  if (!gd->isReference())
3216  {
3217  gd->visited=FALSE;
3218  count++;
3219  }
3220  }
3221  return count;
3222 }
3223 
3224 //----------------------------------------------------------------------------
3225 
3226 static int countDirs()
3227 {
3228  int count=0;
3230  DirDef *dd;
3231  for (dli.toFirst();(dd=dli.current());++dli)
3232  {
3233  if (dd->isLinkableInProject())
3234  {
3235  dd->visited=FALSE;
3236  count++;
3237  }
3238  }
3239  return count;
3240 }
3241 
3242 
3243 //----------------------------------------------------------------------------
3244 
3246 {
3247  if (!Config_getBool("HAVE_DOT") || !Config_getBool("GENERATE_HTML")) return;
3248  ol.pushGeneratorState();
3250  generateGraphLegend(Config_getString("HTML_OUTPUT"));
3251 
3252  bool &stripCommentsStateRef = Config_getBool("STRIP_CODE_COMMENTS");
3253  bool oldStripCommentsState = stripCommentsStateRef;
3254  bool &createSubdirs = Config_getBool("CREATE_SUBDIRS");
3255  bool oldCreateSubdirs = createSubdirs;
3256  // temporarily disable the stripping of comments for our own code example!
3257  stripCommentsStateRef = FALSE;
3258  // temporarily disable create subdirs for linking to our example
3259  createSubdirs = FALSE;
3260 
3261  startFile(ol,"graph_legend",0,theTranslator->trLegendTitle().data());
3262  startTitle(ol,0);
3264  endTitle(ol,0,0);
3265  ol.startContents();
3266  QCString legendDocs = theTranslator->trLegendDocs();
3267  int s = legendDocs.find("<center>");
3268  int e = legendDocs.find("</center>");
3269  QCString imgExt = getDotImageExtension();
3270  if (imgExt=="svg" && s!=-1 && e!=-1)
3271  {
3272  legendDocs = legendDocs.left(s+8) + "[!-- SVG 0 --]\n" + legendDocs.mid(e);
3273  //printf("legendDocs=%s\n",legendDocs.data());
3274  }
3275  FileDef fd("","graph_legend");
3276  ol.generateDoc("graph_legend",1,&fd,0,legendDocs,FALSE,FALSE);
3277 
3278  // restore config settings
3279  stripCommentsStateRef = oldStripCommentsState;
3280  createSubdirs = oldCreateSubdirs;
3281 
3282  endFile(ol);
3283  ol.popGeneratorState();
3284 }
3285 
3286 
3287 
3288 //----------------------------------------------------------------------------
3289 /*!
3290  * write groups as hierarchical trees
3291  */
3292 static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv, bool addToIndex)
3293 {
3294  //bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
3295  //bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
3296  if (level>20)
3297  {
3298  warn(gd->getDefFileName(),gd->getDefLine(),
3299  "maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
3300  );
3301  return;
3302  }
3303 
3304  /* Some groups should appear twice under different parent-groups.
3305  * That is why we should not check if it was visited
3306  */
3307  if (/*!gd->visited &&*/ (!gd->isASubGroup() || level>0) &&
3308  gd->isVisible() &&
3309  (!gd->isReference() || Config_getBool("EXTERNAL_GROUPS")) // hide external groups by default
3310  )
3311  {
3312  //printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers());
3313  // write group info
3314  bool hasSubGroups = gd->getSubGroups()->count()>0;
3315  bool hasSubPages = gd->getPages()->count()>0;
3316  int numSubItems = 0;
3317  if (1 /*Config_getBool("TOC_EXPAND")*/)
3318  {
3320  MemberList *ml;
3321  for (mli.toFirst();(ml=mli.current());++mli)
3322  {
3323  if (ml->listType()&MemberListType_documentationLists)
3324  {
3325  numSubItems += ml->count();
3326  }
3327  }
3328  numSubItems += gd->getNamespaces()->count();
3329  numSubItems += gd->getClasses()->count();
3330  numSubItems += gd->getFiles()->count();
3331  numSubItems += gd->getDirs()->count();
3332  numSubItems += gd->getPages()->count();
3333  }
3334 
3335  bool isDir = hasSubGroups || hasSubPages || numSubItems>0;
3336  //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
3337  if (addToIndex)
3338  {
3341  }
3342  if (ftv)
3343  {
3344  ftv->addContentsItem(hasSubGroups,gd->groupTitle(),
3345  gd->getReference(),gd->getOutputFileBase(),0,
3346  FALSE,FALSE,gd);
3347  ftv->incContentsDepth();
3348  }
3349 
3350  //ol.writeListItem();
3351  //ol.startTextLink(gd->getOutputFileBase(),0);
3352  //parseText(ol,gd->groupTitle());
3353  //ol.endTextLink();
3354 
3355  ol.startIndexListItem();
3357  ol.parseText(gd->groupTitle());
3359  if (gd->isReference())
3360  {
3361  ol.startTypewriter();
3362  ol.docify(" [external]");
3363  ol.endTypewriter();
3364  }
3365 
3367  LayoutDocEntry *lde;
3368  for (eli.toFirst();(lde=eli.current());++eli)
3369  {
3370  if (lde->kind()==LayoutDocEntry::MemberDef && addToIndex)
3371  {
3373  MemberList *ml = gd->getMemberList(lmd->type);
3374  if (ml)
3375  {
3376  MemberListIterator mi(*ml);
3377  MemberDef *md;
3378  for (mi.toFirst();(md=mi.current());++mi)
3379  {
3380  MemberList *enumList = md->enumFieldList();
3381  bool isDir = enumList!=0 && md->isEnumerate();
3382  if (md->isVisible() && md->name().find('@')==-1)
3383  {
3385  md->name(),md->getReference(),
3386  md->getOutputFileBase(),md->anchor(),FALSE,addToIndex);
3387  }
3388  if (isDir)
3389  {
3391  MemberListIterator emli(*enumList);
3392  MemberDef *emd;
3393  for (emli.toFirst();(emd=emli.current());++emli)
3394  {
3395  if (emd->isVisible())
3396  {
3398  emd->name(),emd->getReference(),emd->getOutputFileBase(),
3399  emd->anchor(),FALSE,addToIndex);
3400  }
3401  }
3403  }
3404  }
3405  }
3406  }
3407  else if (lde->kind()==LayoutDocEntry::GroupClasses && addToIndex)
3408  {
3409  ClassSDict::Iterator it(*gd->getClasses());
3410  ClassDef *cd;
3411  for (;(cd=it.current());++it)
3412  {
3413  //bool nestedClassInSameGroup =
3414  // cd->getOuterScope() && cd->getOuterScope()->definitionType()==Definition::TypeClass &&
3415  // cd->getOuterScope()->partOfGroups()!=0 && cd->getOuterScope()->partOfGroups()->contains(gd);
3416  //printf("===== GroupClasses: %s visible=%d nestedClassInSameGroup=%d\n",cd->name().data(),cd->isVisible(),nestedClassInSameGroup);
3417  if (cd->isVisible() /*&& !nestedClassInSameGroup*/)
3418  {
3419  //if (cd->isEmbeddedInOuterScope())
3420  //{
3421  //printf("add class & members %d\n",addToIndex);
3422  addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(FALSE),cd->anchor(),addToIndex,TRUE);
3423  //}
3424  //else // only index the class, not its members
3425  //{
3426  // printf("%s: add class only\n",cd->name().data());
3427  // Doxygen::indexList->addContentsItem(FALSE,
3428  // cd->displayName(TRUE),cd->getReference(),
3429  // cd->getOutputFileBase(),cd->anchor(),addToIndex,TRUE);
3430  //}
3431  }
3432  }
3433  }
3434  else if (lde->kind()==LayoutDocEntry::GroupNamespaces && addToIndex)
3435  {
3437  NamespaceDef *nd;
3438  for (;(nd=it.current());++it)
3439  {
3440  if (nd->isVisible())
3441  {
3443  nd->localName(),nd->getReference(),
3444  nd->getOutputFileBase(),0,FALSE,FALSE);
3445  }
3446  }
3447  }
3448  else if (lde->kind()==LayoutDocEntry::GroupFiles && addToIndex)
3449  {
3450  QListIterator<FileDef> it(*gd->getFiles());
3451  FileDef *fd;
3452  for (;(fd=it.current());++it)
3453  {
3454  if (fd->isVisible())
3455  {
3457  fd->displayName(),fd->getReference(),
3458  fd->getOutputFileBase(),0,FALSE,FALSE);
3459  }
3460  }
3461  }
3462  else if (lde->kind()==LayoutDocEntry::GroupDirs && addToIndex)
3463  {
3464  QListIterator<DirDef> it(*gd->getDirs());
3465  DirDef *dd;
3466  for (;(dd=it.current());++it)
3467  {
3468  if (dd->isVisible())
3469  {
3471  dd->shortName(),dd->getReference(),
3472  dd->getOutputFileBase(),0,FALSE,FALSE);
3473  }
3474  }
3475  }
3476  else if (lde->kind()==LayoutDocEntry::GroupPageDocs && addToIndex)
3477  {
3479  PageDef *pd;
3480  for (;(pd=it.current());++it)
3481  {
3482  SectionInfo *si=0;
3483  if (!pd->name().isEmpty()) si=Doxygen::sectionDict->find(pd->name());
3484  bool hasSubPages = pd->hasSubPages();
3485  bool hasSections = pd->hasSections();
3487  hasSubPages || hasSections,
3488  convertToHtml(pd->title(),TRUE),
3489  gd->getReference(),
3490  gd->getOutputFileBase(),
3491  si ? si->label.data() : 0,
3492  hasSubPages || hasSections,
3493  TRUE); // addToNavIndex
3494  if (hasSections || hasSubPages)
3495  {
3497  }
3498  if (hasSections)
3499  {
3500  pd->addSectionsToIndex();
3501  }
3502  writePages(pd,0);
3503  if (hasSections || hasSubPages)
3504  {
3506  }
3507  }
3508  }
3509  else if (lde->kind()==LayoutDocEntry::GroupNestedGroups)
3510  {
3511  if (gd->getSubGroups()->count()>0)
3512  {
3513  startIndexHierarchy(ol,level+1);
3515  GroupDef *subgd = 0;
3516  for (gli.toFirst();(subgd=gli.current());++gli)
3517  {
3518  writeGroupTreeNode(ol,subgd,level+1,ftv,addToIndex);
3519  }
3520  endIndexHierarchy(ol,level+1);
3521  }
3522  }
3523  }
3524 
3525  ol.endIndexListItem();
3526 
3527  if (addToIndex)
3528  {
3530  }
3531  if (ftv)
3532  {
3533  ftv->decContentsDepth();
3534  }
3535  //gd->visited=TRUE;
3536  }
3537 }
3538 
3539 static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex)
3540 {
3541  if (ftv)
3542  {
3543  ol.pushGeneratorState();
3545  }
3546  startIndexHierarchy(ol,0);
3548  GroupDef *gd;
3549  for (gli.toFirst();(gd=gli.current());++gli)
3550  {
3551  writeGroupTreeNode(ol,gd,0,ftv,addToIndex);
3552  }
3553  endIndexHierarchy(ol,0);
3554  if (ftv)
3555  {
3556  ol.popGeneratorState();
3557  }
3558 }
3559 
3560 #if 0
3561 static void writeGroupTree(GroupDef *gd,FTVHelp *ftv,int level,bool addToIndex)
3562 {
3563  static bool externalGroups = Config_getBool("EXTERNAL_GROUPS");
3564  /* Some groups should appear twice under different parent-groups.
3565  * That is why we should not check if it was visited
3566  */
3567  if ((!gd->isASubGroup() || level>0) &&
3568  gd->isVisible() &&
3569  (!gd->isReference() || externalGroups) // hide external groups by default
3570  )
3571  {
3572  if (ftv)
3573  {
3574  ftv->addContentsItem(hasSubGroups,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0);
3575  ftv->incContentsDepth();
3576  }
3577  if (ftv)
3578  {
3579  ftv->decContentsDepth();
3580  }
3581  }
3582 }
3583 
3584 static void writeGroupTree(FTVHelp *ftv,bool addToIndex)
3585 {
3587  GroupDef *gd;
3588  for (gli.toFirst();(gd=gli.current());++gli)
3589  {
3590  writeGroupTree(gd,ftv,0,addToIndex);
3591  }
3592 }
3593 #endif
3594 
3595 //----------------------------------------------------------------------------
3596 
3597 static void writeGroupIndex(OutputList &ol)
3598 {
3599  if (documentedGroups==0) return;
3600  ol.pushGeneratorState();
3601  // 1.{
3604  QCString title = lne ? lne->title() : theTranslator->trModules();
3605  bool addToIndex = lne==0 || lne->visible();
3606 
3607  startFile(ol,"modules",0,title,HLI_Modules);
3608  startTitle(ol,0);
3609  ol.parseText(title);
3610  endTitle(ol,0,0);
3611  ol.startContents();
3612  ol.startTextBlock();
3613  ol.parseText(lne ? lne->intro() : theTranslator->trModulesDescription());
3614  ol.endTextBlock();
3615 
3616  // ---------------
3617  // Normal group index for Latex/RTF
3618  // ---------------
3619  // 2.{
3620  ol.pushGeneratorState();
3623 
3624  writeGroupHierarchy(ol,0,FALSE);
3625 
3627  ol.popGeneratorState();
3628  // 2.}
3629 
3630  // ---------------
3631  // interactive group index for HTML
3632  // ---------------
3633  // 2.{
3634  ol.pushGeneratorState();
3636 
3637  {
3638  if (addToIndex)
3639  {
3640  Doxygen::indexList->addContentsItem(TRUE,title,0,"modules",0,TRUE,TRUE);
3642  }
3643  FTVHelp* ftv = new FTVHelp(FALSE);
3644  writeGroupHierarchy(ol,ftv,addToIndex);
3645  QGString outStr;
3646  FTextStream t(&outStr);
3647  ftv->generateTreeViewInline(t);
3649  ol.writeString(outStr);
3650  delete ftv;
3651  if (addToIndex)
3652  {
3654  }
3655  }
3656  ol.popGeneratorState();
3657  // 2.}
3658 
3659  endFile(ol);
3660  ol.popGeneratorState();
3661  // 1.}
3662 }
3663 
3664 //----------------------------------------------------------------------------
3665 
3666 #if 0
3667 static void writeDirIndex(OutputList &ol)
3668 {
3669  if (documentedDirs==0) return;
3670  ol.pushGeneratorState();
3672  LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Dirs);
3673  QCString title = lne ? lne->title() : theTranslator->trDirectories();
3674  bool addToIndex=FALSE; //lne==0 || lne->visible();
3675 
3676  startFile(ol,"dirs",0,title,HLI_Directories);
3677  startTitle(ol,0);
3678  ol.parseText(title);
3679  endTitle(ol,0,0);
3680  ol.startContents();
3681  ol.startTextBlock();
3682 
3683  if (addToIndex)
3684  {
3685  Doxygen::indexList->addContentsItem(TRUE,title,0,"dirs",0,TRUE,TRUE);
3687  }
3688  ol.parseText(lne ? lne->intro() : theTranslator->trDirDescription());
3689  ol.endTextBlock();
3690 
3691  FTVHelp* ftv = 0;
3692  bool treeView=Config_getBool("USE_INLINE_TREES");
3693  if (treeView)
3694  {
3695  ftv = new FTVHelp(FALSE);
3696  }
3697 
3698  writeDirHierarchy(ol,ftv,addToIndex);
3699 
3700  if (ftv)
3701  {
3702  QGString outStr;
3703  FTextStream t(&outStr);
3704  ftv->generateTreeViewInline(t);
3705  ol.pushGeneratorState();
3707  ol.writeString(outStr);
3708  ol.popGeneratorState();
3709  delete ftv;
3710  }
3711  if (addToIndex)
3712  {
3714  }
3715  endFile(ol);
3716  ol.popGeneratorState();
3717 }
3718 #endif
3719 
3720 //----------------------------------------------------------------------------
3721 
3723 {
3724  if (lne->baseFile().left(9)=="usergroup")
3725  {
3726  ol.pushGeneratorState();
3728  startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup);
3729  startTitle(ol,0);
3730  ol.parseText(lne->title());
3731  endTitle(ol,0,0);
3732  ol.startContents();
3735  int count=0;
3736  for (li.toFirst();(entry=li.current());++li)
3737  {
3738  if (entry->visible()) count++;
3739  }
3740  if (count>0)
3741  {
3742  ol.writeString("<ul>\n");
3743  for (li.toFirst();(entry=li.current());++li)
3744  {
3745  if (entry->visible())
3746  {
3747  ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+
3748  fixSpaces(entry->title())+"</span></a></li>\n");
3749  }
3750  }
3751  ol.writeString("</ul>\n");
3752  }
3753  endFile(ol);
3754  ol.popGeneratorState();
3755  }
3756 }
3757 
3758 //----------------------------------------------------------------------------
3759 
3760 
3761 static void writeIndex(OutputList &ol)
3762 {
3763  static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
3764  static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
3765  static QCString projectName = Config_getString("PROJECT_NAME");
3766  // save old generator state
3767  ol.pushGeneratorState();
3768 
3769  QCString projPrefix;
3770  if (!projectName.isEmpty())
3771  {
3772  projPrefix=projectName+" ";
3773  }
3774 
3775  //--------------------------------------------------------------------
3776  // write HTML index
3777  //--------------------------------------------------------------------
3779 
3780  QCString defFileName =
3781  Doxygen::mainPage ? Doxygen::mainPage->docFile().data() : "[generated]";
3782  int defLine =
3784 
3785  QCString title;
3786  if (!mainPageHasTitle())
3787  {
3788  title = theTranslator->trMainPage();
3789  }
3790  else if (Doxygen::mainPage)
3791  {
3792  title = filterTitle(Doxygen::mainPage->title());
3793  }
3794 
3795  QCString indexName="index";
3796  ol.startFile(indexName,0,title);
3797 
3798  if (Doxygen::mainPage)
3799  {
3800  if (
3801  (!projectName.isEmpty() && mainPageHasTitle() && qstricmp(title,projectName)!=0)
3802  ) // to avoid duplicate entries in the treeview
3803  {
3804  Doxygen::indexList->addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0,Doxygen::mainPage->hasSubPages(),TRUE);
3805  }
3806  if (Doxygen::mainPage->hasSubPages() || Doxygen::mainPage->hasSections())
3807  {
3809  }
3810  }
3811 
3812  ol.startQuickIndices();
3813  if (!Config_getBool("DISABLE_INDEX"))
3814  {
3816  }
3817  ol.endQuickIndices();
3818  ol.writeSplitBar(indexName);
3819  ol.writeSearchInfo();
3820  bool headerWritten=FALSE;
3822  {
3823  if (Doxygen::mainPage->title().lower()!="notitle")
3824  {
3825  ol.startHeaderSection();
3826  ol.startTitleHead(0);
3827  ol.generateDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(),
3829  TRUE,FALSE,0,TRUE,FALSE);
3830  headerWritten = TRUE;
3831  }
3832  }
3833  else
3834  {
3835  if (!projectName.isEmpty())
3836  {
3837  ol.startHeaderSection();
3838  ol.startTitleHead(0);
3839  ol.parseText(projPrefix+theTranslator->trDocumentation());
3840  headerWritten = TRUE;
3841  }
3842  }
3843  if (headerWritten)
3844  {
3845  ol.endTitleHead(0,0);
3846  ol.endHeaderSection();
3847  }
3848 
3849  ol.startContents();
3850  if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0)
3851  {
3853  }
3854 
3855  if (Doxygen::mainPage)
3856  {
3858  if (Doxygen::mainPage->showToc() && Doxygen::mainPage->hasSections())
3859  {
3861  }
3862 
3863  ol.startTextBlock();
3864  ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
3865  Doxygen::mainPage->documentation(),TRUE,FALSE
3866  /*,Doxygen::mainPage->sectionDict*/);
3867  ol.endTextBlock();
3868 
3870  }
3871 
3872  endFile(ol);
3874 
3875  //--------------------------------------------------------------------
3876  // write LaTeX/RTF index
3877  //--------------------------------------------------------------------
3880 
3881  ol.startFile("refman",0,0);
3883  if (!Config_getString("LATEX_HEADER").isEmpty())
3884  {
3886  }
3887 
3888  if (projPrefix.isEmpty())
3889  {
3891  }
3892  else
3893  {
3894  ol.parseText(projPrefix);
3895  }
3896 
3897  if (!Config_getString("PROJECT_NUMBER").isEmpty())
3898  {
3899  ol.startProjectNumber();
3900  ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
3901  ol.endProjectNumber();
3902  }
3908 
3909  ol.lastIndexPage();
3910  if (Doxygen::mainPage)
3911  {
3913  if (mainPageHasTitle())
3914  {
3916  }
3917  else
3918  {
3919  ol.parseText(/*projPrefix+*/theTranslator->trMainPage());
3920  }
3922  }
3923  if (documentedPages>0)
3924  {
3925  //ol.parseText(projPrefix+theTranslator->trPageDocumentation());
3926  //ol.endIndexSection(isPageDocumentation);
3928  PageDef *pd=pdi.toFirst();
3929  bool first=Doxygen::mainPage==0;
3930  for (pdi.toFirst();(pd=pdi.current());++pdi)
3931  {
3932  if (!pd->getGroupDef() && !pd->isReference() &&
3933  (!pd->hasParentPage() || // not inside other page
3934  (Doxygen::mainPage==pd->getOuterScope())) // or inside main page
3935  )
3936  {
3937  bool isCitationPage = pd->name()=="citelist";
3938  if (isCitationPage)
3939  {
3940  // For LaTeX the bibliograph is already written by \bibliography
3941  ol.pushGeneratorState();
3943  }
3944  QCString title = pd->title();
3945  if (title.isEmpty()) title=pd->name();
3946 
3948  ol.parseText(title);
3950 
3951  ol.pushGeneratorState(); // write TOC title (RTF only)
3954  ol.parseText(title);
3956  ol.popGeneratorState();
3957 
3958  ol.writeAnchor(0,pd->getOutputFileBase());
3959 
3961  first=FALSE;
3962 
3963  if (isCitationPage)
3964  {
3965  ol.popGeneratorState();
3966  }
3967  }
3968  }
3969  }
3970 
3971  if (!Config_getBool("LATEX_HIDE_INDICES"))
3972  {
3973  //if (indexedPages>0)
3974  //{
3975  // ol.startIndexSection(isPageIndex);
3976  // ol.parseText(/*projPrefix+*/ theTranslator->trPageIndex());
3977  // ol.endIndexSection(isPageIndex);
3978  //}
3979  if (documentedGroups>0)
3980  {
3982  ol.parseText(/*projPrefix+*/ theTranslator->trModuleIndex());
3984  }
3985  if (documentedNamespaces>0)
3986  {
3988  ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModulesIndex():theTranslator->trNamespaceIndex()));
3990  }
3991  if (hierarchyClasses>0)
3992  {
3994  ol.parseText(/*projPrefix+*/
3995  (fortranOpt ? theTranslator->trCompoundIndexFortran() :
3996  vhdlOpt ? VhdlDocGen::trDesignUnitIndex() :
3998  ));
4000  }
4002  {
4004  ol.parseText(/*projPrefix+*/
4005  (fortranOpt ? theTranslator->trCompoundIndexFortran() :
4006  vhdlOpt ? VhdlDocGen::trDesignUnitIndex() :
4008  ));
4010  }
4011  if (documentedFiles>0)
4012  {
4014  ol.parseText(/*projPrefix+*/theTranslator->trFileIndex());
4016  }
4017  }
4018  if (documentedGroups>0)
4019  {
4021  ol.parseText(/*projPrefix+*/theTranslator->trModuleDocumentation());
4023  }
4024  if (documentedNamespaces>0)
4025  {
4029  }
4031  {
4033  ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trTypeDocumentation():theTranslator->trClassDocumentation()));
4035  }
4036  if (documentedFiles>0)
4037  {
4039  ol.parseText(/*projPrefix+*/theTranslator->trFileDocumentation());
4041  }
4042  if (Doxygen::exampleSDict->count()>0)
4043  {
4045  ol.parseText(/*projPrefix+*/theTranslator->trExampleDocumentation());
4047  }
4049  endFile(ol);
4050 
4051  if (Doxygen::mainPage)
4052  {
4056  ol.startContents();
4057  ol.startTextBlock();
4058  ol.generateDoc(defFileName,defLine,Doxygen::mainPage,0,
4059  Doxygen::mainPage->documentation(),FALSE,FALSE
4060  );
4061  ol.endTextBlock();
4062  endFile(ol);
4065  }
4066 
4067  ol.popGeneratorState();
4068 }
4069 
4071 
4073 {
4074  QListIterator<LayoutNavEntry> li(entries);
4075  LayoutNavEntry *lne;
4076  for (li.toFirst();(lne=li.current());++li)
4077  {
4078  LayoutNavEntry::Kind kind = lne->kind();
4079  uint index = (uint)kind;
4080  if (index>=indexWritten.size())
4081  {
4082  uint i;
4083  uint oldSize = indexWritten.size();
4084  uint newSize = index+1;
4085  indexWritten.resize(newSize);
4086  for (i=oldSize;i<newSize;i++) indexWritten.at(i)=FALSE;
4087  }
4088  //printf("starting %s kind=%d\n",lne->title().data(),lne->kind());
4089  bool addToIndex=lne->visible();
4090  bool needsClosing=FALSE;
4091  if (!indexWritten.at(index))
4092  {
4093  switch(kind)
4094  {
4096  msg("Generating index page...\n");
4097  writeIndex(ol);
4098  break;
4099  case LayoutNavEntry::Pages:
4100  msg("Generating page index...\n");
4101  writePageIndex(ol);
4102  break;
4104  msg("Generating module index...\n");
4105  writeGroupIndex(ol);
4106  break;
4108  {
4109  static bool showNamespaces = Config_getBool("SHOW_NAMESPACES");
4110  if (showNamespaces)
4111  {
4112  if (documentedNamespaces>0 && addToIndex)
4113  {
4114  Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,0,0);
4116  needsClosing=TRUE;
4117  }
4118  if (LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Namespaces)!=lne) // for backward compatibility with old layout file
4119  {
4120  msg("Generating namespace index...\n");
4121  writeNamespaceIndex(ol);
4122  }
4123  }
4124  }
4125  break;
4127  {
4128  static bool showNamespaces = Config_getBool("SHOW_NAMESPACES");
4129  if (showNamespaces)
4130  {
4131  msg("Generating namespace index...\n");
4132  writeNamespaceIndex(ol);
4133  }
4134  }
4135  break;
4137  msg("Generating namespace member index...\n");
4139  break;
4141  if (annotatedClasses>0 && addToIndex)
4142  {
4143  Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,"annotated",0);
4145  needsClosing=TRUE;
4146  }
4147  if (LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Classes)!=lne) // for backward compatibility with old layout file
4148  {
4149  msg("Generating annotated compound index...\n");
4150  writeAnnotatedIndex(ol);
4151  }
4152  break;
4154  msg("Generating annotated compound index...\n");
4155  writeAnnotatedIndex(ol);
4156  break;
4158  msg("Generating alphabetical compound index...\n");
4160  break;
4162  msg("Generating hierarchical class index...\n");
4164  if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
4165  {
4166  msg("Generating graphical class hierarchy...\n");
4168  }
4169  break;
4171  msg("Generating member index...\n");
4173  break;
4174  case LayoutNavEntry::Files:
4175  {
4176  static bool showFiles = Config_getBool("SHOW_FILES");
4177  if (showFiles)
4178  {
4179  if (documentedHtmlFiles>0 && addToIndex)
4180  {
4181  Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,0,0);
4183  needsClosing=TRUE;
4184  }
4185  if (LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files)!=lne) // for backward compatibility with old layout file
4186  {
4187  msg("Generating file index...\n");
4188  writeFileIndex(ol);
4189  }
4190  }
4191  }
4192  break;
4194  {
4195  static bool showFiles = Config_getBool("SHOW_FILES");
4196  if (showFiles)
4197  {
4198  msg("Generating file index...\n");
4199  writeFileIndex(ol);
4200  }
4201  }
4202  break;
4204  msg("Generating file member index...\n");
4206  break;
4208  msg("Generating example index...\n");
4209  writeExampleIndex(ol);
4210  break;
4211  case LayoutNavEntry::User:
4212  {
4213  // prepend a ! or ^ marker to the URL to avoid tampering with it
4214  QCString url = correctURL(lne->url(),"!"); // add ! to relative URL
4215  bool isRelative=url.at(0)=='!';
4216  if (!url.isEmpty() && !isRelative) // absolute URL
4217  {
4218  url.prepend("^"); // prepend ^ to absolute URL
4219  }
4220  bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
4221  Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative);
4222  }
4223  break;
4225  if (addToIndex)
4226  {
4227  QCString url = correctURL(lne->url(),"!"); // add ! to relative URL
4228  if (!url.isEmpty())
4229  {
4230  if (url=="![none]")
4231  {
4233  }
4234  else
4235  {
4236  bool isRelative=url.at(0)=='!';
4237  if (!isRelative) // absolute URL
4238  {
4239  url.prepend("^"); // prepend ^ to absolute URL
4240  }
4241  bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref";
4242  Doxygen::indexList->addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef || isRelative);
4243  }
4244  }
4245  else
4246  {
4248  }
4250  needsClosing=TRUE;
4251  }
4252  writeUserGroupStubPage(ol,lne);
4253  break;
4254  }
4255  if (kind!=LayoutNavEntry::User && kind!=LayoutNavEntry::UserGroup) // User entry may appear multiple times
4256  {
4257  indexWritten.at(index)=TRUE;
4258  }
4259  }
4261  if (needsClosing)
4262  {
4263  switch(kind)
4264  {
4267  case LayoutNavEntry::Files:
4270  break;
4271  default:
4272  break;
4273  }
4274  }
4275  //printf("ending %s kind=%d\n",lne->title().data(),lne->kind());
4276  }
4277 }
4278 
4280 {
4282  if (lne)
4283  {
4285  }
4286 }
4287 
static QCString name
Definition: declinfo.cpp:673
virtual QCString trSubprograms()=0
void endIndexItem(const char *ref, const char *file)
Definition: outputlist.h:143
virtual QCString trExamples()=0
ClassDef * classDef
Definition: classdef.h:520
virtual QCString trTypedefs()=0
void endIndexValue(const char *name, bool b)
Definition: outputlist.h:135
static GroupSDict * groupSDict
Definition: doxygen.h:119
virtual QCString trHierarchicalIndex()=0
QCString docFile() const
ClassDef ElementType
Definition: index.cpp:1683
bool isProperty() const
Definition: memberdef.cpp:4185
int documentedDirs
Definition: index.cpp:67
virtual QCString trDirDescription()=0
const int maxItemsBeforeQuickIndex
Definition: index.cpp:143
const char * fname
Definition: index.cpp:2833
virtual QCString trNamespaceDocumentation()=0
virtual QCString trClassHierarchy()=0
int annotatedClassesPrinted
Definition: index.cpp:56
PageSDict * getSubPages() const
Definition: pagedef.h:56
void endFile(OutputList &ol, bool skipNavIndex, bool skipEndContents, const QCString &navPath)
Definition: index.cpp:263
void endFileWithNavPath(Definition *d, OutputList &ol)
Definition: index.cpp:282
T * toLast() const
Definition: sortdict.h:629
bool isLinkableInProject() const
Definition: classdef.cpp:2707
bool visited
Definition: groupdef.h:86
void startItemListItem()
Definition: outputlist.h:182
QList< Entry > entry
bool visited
Definition: dirdef.h:77
LayoutNavEntry * find(LayoutNavEntry::Kind k, const char *file=0) const
Definition: layout.cpp:76
BaseClassList * subClasses() const
Definition: classdef.cpp:4404
virtual QCString getReference() const
static void writeQuickMemberIndex(OutputList &ol, const LetterToIndexMap< MemberIndexList > &charUsed, uint page, QCString fullName, bool multiPage)
Definition: index.cpp:2458
virtual QCString trModulesDescription()=0
static int countNamespaces()
Definition: index.cpp:1305
static void writeIndex(OutputList &ol)
Definition: index.cpp:3761
static void endQuickIndexList(OutputList &ol)
Definition: index.cpp:170
const QCString & shortName() const
Definition: dirdef.h:57
static constexpr double g
Definition: Units.h:144
static PageSDict * exampleSDict
Definition: doxygen.h:101
static QCString result
bool isEmpty() const
Definition: qcstring.h:189
QCString getReference() const
Definition: memberdef.cpp:1001
void endIndexSection(IndexSections is)
Definition: outputlist.h:87
void initFileMemberIndices()
Definition: index.cpp:2396
int documentedHtmlFiles
Definition: index.cpp:65
void writeToc(OutputList &ol)
bool hasDocumentation() const
Definition: memberdef.cpp:3274
void startFile(OutputList &ol, const char *name, const char *manName, const char *title, HighlightedItem hli, bool additionalIndices, const char *altSidebarName)
Definition: index.cpp:244
void addFileMemberNameToIndex(MemberDef *md)
Definition: index.cpp:2406
bool isFriend() const
Definition: memberdef.cpp:4175
bool fileVisibleInIndex(FileDef *fd, bool &genSourceFile)
Definition: util.cpp:8177
void msg(const char *fmt,...)
Definition: message.cpp:107
static void writeFileIndex(OutputList &ol)
Definition: index.cpp:1166
QCString title() const
Definition: pagedef.h:54
virtual QCString trGotoGraphicalHierarchy()=0
static LetterToIndexMap< MemberIndexList > g_memberIndexLetterUsed[CMHL_Total]
Definition: index.cpp:139
QCString url() const
Definition: layout.cpp:96
QCString displayName(bool=TRUE) const
Definition: filedef.h:80
uint length() const
Definition: qcstring.h:195
virtual QCString trEnumerationValues()=0
QCString displayName(bool=TRUE) const
int documentedFileMembers[FMHL_Total]
Definition: index.cpp:63
static ClassSDict * hiddenClasses
Definition: doxygen.h:100
void append(const type *d)
Definition: qlist.h:73
static bool dirHasVisibleChildren(DirDef *dd)
Definition: index.cpp:540
bool isEvent() const
Definition: memberdef.cpp:4190
void writeGraphicalHierarchy(const DotGfxHierarchyTable &g)
Definition: outputlist.h:402
virtual QCString trGotoTextualHierarchy()=0
bool generateSourceFile() const
Definition: filedef.cpp:1396
bool isSimple() const
Definition: classdef.cpp:4584
QCString getOutputFileBase() const
static QCString htmlFileExtension
Definition: doxygen.h:130
static QCString trFunctionAndProc()
void endHeaderSection()
Definition: outputlist.h:192
void writeString(const char *text)
Definition: outputlist.h:119
static void writeExampleIndex(OutputList &ol)
Definition: index.cpp:2999
static const CmhlInfo * getCmhlInfo(int hl)
Definition: index.cpp:2497
bool resize(uint size)
Definition: qarray.h:69
virtual QCString trModuleIndex()=0
bool generateDoc(const char *fileName, int startLine, Definition *ctx, MemberDef *md, const QCString &docStr, bool indexWords, bool isExample, const char *exampleName=0, bool singleLine=FALSE, bool linkFromIndex=FALSE)
Definition: outputlist.cpp:131
int documentedClassMembers[CMHL_Total]
Definition: index.cpp:62
void writeNonBreakableSpace(int num)
Definition: outputlist.h:368
void addClassMemberNameToIndex(MemberDef *md)
Definition: index.cpp:2264
static int countAnnotatedClasses(int *cp)
Definition: index.cpp:1555
static void writeUserGroupStubPage(OutputList &ol, LayoutNavEntry *lne)
Definition: index.cpp:3722
static QArray< bool > indexWritten
Definition: index.cpp:4070
void disableAllBut(OutputGenerator::OutputType o)
Definition: outputlist.cpp:49
char & at(uint i) const
Definition: qcstring.h:326
void startParagraph()
Definition: outputlist.h:115
static void startQuickIndexList(OutputList &ol, bool letterTabs=FALSE)
Definition: index.cpp:149
bool mainPageHasTitle()
Definition: util.cpp:8554
void endTitleHead(const char *fileName, const char *name)
Definition: outputlist.h:107
virtual bool hasDocumentation() const
virtual QCString trLegendTitle()=0
virtual QCString trCompoundIndexFortran()=0
QCString title
Definition: index.cpp:2494
void writeSearchInfo()
Definition: outputlist.h:99
virtual QCString trCompoundIndex()=0
virtual QCString trRelatedFunctions()=0
void startIndexValue(bool b)
Definition: outputlist.h:133
const bool FALSE
Definition: qglobal.h:370
static FileNameList * inputNameList
Definition: doxygen.h:109
void startHeaderSection()
Definition: outputlist.h:190
int compareValues(const MemberDef *md1, const MemberDef *md2) const
Definition: index.cpp:125
bool isReference() const
Definition: classdef.cpp:3826
static void writeDirHierarchy(OutputList &ol, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:725
static LayoutDocManager & instance()
Definition: layout.cpp:1359
QCString label
Definition: section.h:56
MemberList * enumFieldList() const
Definition: memberdef.cpp:4497
bool isLinkableInProject() const
Definition: memberdef.cpp:1150
bool hasSections() const
Definition: definition.cpp:447
FmhlInfo(const char *fn, const char *t)
Definition: index.cpp:2667
type * at(uint i) const
Definition: qlist.h:94
virtual QCString trDocumentation()=0
QCString left(uint len) const
Definition: qcstring.cpp:213
void startQuickIndices()
Definition: outputlist.h:350
bool isDefine() const
Definition: memberdef.cpp:4170
bool isASubGroup() const
Definition: groupdef.cpp:541
uint getUtf8CodeToLower(const QCString &s, int idx)
Returns one unicode character as an unsigned integer from utf-8 string, making the character lower ca...
Definition: util.cpp:8276
The QString class provides an abstraction of Unicode text and the classic C null-terminated char arra...
Definition: qstring.h:350
virtual QCString trRelatedPagesDescription()=0
virtual QCString trFileMembers()=0
auto lit(char arg)
Definition: parse_shims.h:11
int briefLine() const
virtual bool isReference() const
static void writeGraphicalClassHierarchy(OutputList &ol)
Definition: index.cpp:1036
bool isSignal() const
Definition: memberdef.cpp:4130
QTextStream & hex(QTextStream &s)
void startIndexKey()
Definition: outputlist.h:129
static QCString trDesignUnitIndex()
Simplified and optimized version of QTextStream.
Definition: ftextstream.h:11
void addSectionsToIndex()
Definition: definition.cpp:467
bool isSlot() const
Definition: memberdef.cpp:4135
DirDef * getDirDef() const
Definition: filedef.h:121
void generateTreeViewInline(FTextStream &t)
Definition: ftvhelp.cpp:716
QCString displayName(bool includeScope=TRUE) const
Definition: classdef.cpp:312
int find(char c, int index=0, bool cs=TRUE) const
Definition: qcstring.cpp:41
int count() const
Definition: sortdict.h:284
virtual QCString trModuleDocumentation()=0
bool isVariable() const
Definition: memberdef.cpp:4140
void setClassName(const char *name)
Definition: classdef.cpp:3926
const char * groupTitle() const
Definition: groupdef.h:54
bool namespaceHasVisibleChild(NamespaceDef *nd, bool includeClasses)
Definition: util.cpp:8299
int find(const MemberDef *d) const
Definition: qlist.h:88
virtual QCString trDirectories()=0
The QChar class provides a light-weight Unicode character.
Definition: qstring.h:56
GroupList * partOfGroups() const
SrcLangExt
Definition: types.h:41
static QStrList * l
Definition: config.cpp:1044
const QList< LayoutNavEntry > & children() const
Definition: layout.h:157
QCString correctURL(const QCString &url, const QCString &relPath)
Definition: util.cpp:8084
QCString getReference() const
Definition: classdef.cpp:3814
ClassMemberHighlight
Definition: index.h:204
ClassSDict * getClasses() const
Definition: groupdef.h:101
Represents of a member definition list with configurable title.
Definition: layout.h:105
static void writeAlphabeticalClassList(OutputList &ol)
Definition: index.cpp:1760
QAsciiDict< Entry > cl
void startTextLink(const char *file, const char *anchor)
Definition: outputlist.h:159
static void countRelatedPages(int &docPages, int &indexPages)
Definition: index.cpp:3065
ClassSDict * getClassSDict()
Definition: classdef.cpp:4389
void endFile()
Definition: outputlist.h:103
bool parseText(const QCString &textStr)
Definition: outputlist.cpp:175
Base class for the layout of a navigation item at the top of the HTML pages.
Definition: layout.h:118
GroupList * getSubGroups() const
Definition: groupdef.h:103
Protection protection() const
Definition: classdef.cpp:4414
virtual QCString trFileListDescription(bool extractAll)=0
QCString getDefFileName() const
static void writeSingleFileIndex(OutputList &ol, FileDef *fd)
Definition: index.cpp:1088
QCString copy() const
Definition: qcstring.h:250
void startIndexList()
Definition: outputlist.h:125
void endProjectNumber()
Definition: outputlist.h:93
static void writeNamespaceTree(NamespaceSDict *nsDict, FTVHelp *ftv, bool rootOnly, bool showClasses, bool addToIndex)
Definition: index.cpp:1388
static void endQuickIndexItem(OutputList &ol)
Definition: index.cpp:213
QCollection::Item first()
Definition: qglist.cpp:807
#define NEXT_ROW()
static bool insideMainPage
Definition: doxygen.h:104
static QCString stripFromPath(const QCString &path, QStrList &l)
Definition: util.cpp:274
QCString title
Definition: index.cpp:2669
#define MAX_ITEMS_BEFORE_QUICK_INDEX
Definition: index.cpp:52
uint letter() const
Definition: index.cpp:1685
#define Config_getInt(val)
Definition: config.cpp:661
FileDef * getFileDef() const
Definition: memberdef.cpp:4075
static NamespaceSDict * namespaceSDict
Definition: doxygen.h:120
static NamespaceDef * globalScope
Definition: doxygen.h:128
void popGeneratorState()
Definition: outputlist.cpp:121
list files
Definition: languages.py:9
virtual DefType definitionType() const =0
ClassDef * templateMaster() const
Definition: classdef.cpp:4439
void addNamespaceMemberNameToIndex(MemberDef *md)
Definition: index.cpp:2349
def cli(ctx)
Definition: main.py:7
Definition: sortdict.h:73
const char * typeString() const
Definition: memberdef.cpp:4035
void endIndexKey()
Definition: outputlist.h:131
void endBold()
Definition: outputlist.h:306
static LetterToIndexMap< MemberIndexList > g_namespaceIndexLetterUsed[NMHL_Total]
Definition: index.cpp:141
QCString getLanguageSpecificSeparator(SrcLangExt lang, bool classScope)
Definition: util.cpp:8065
uint count() const
Definition: qlist.h:66
uint getUtf8CodeToUpper(const QCString &s, int idx)
Returns one unicode character as ian unsigned interger from utf-8 string, making the character upper ...
Definition: util.cpp:8291
void decContentsDepth()
Definition: index.h:135
const char * fname
Definition: index.cpp:2668
bool hasSubPages() const
Definition: pagedef.cpp:300
QCString className() const
Definition: classdef.cpp:3914
bool hasParentPage() const
Definition: pagedef.cpp:89
uint letter() const
Definition: index.cpp:134
virtual QCString trMainPage()=0
MemberDef * getEnumScope() const
Definition: memberdef.cpp:4487
FileMemberHighlight
Definition: index.h:218
QAsciiDict< Entry > fn
void endParagraph()
Definition: outputlist.h:117
Q_EXPORT uint qstrlen(const char *str)
Definition: qcstring.h:81
static void writeFileMemberIndex(OutputList &ol)
Definition: index.cpp:2804
const QCString & name() const
Definition: definition.h:114
string columns
Definition: depos.py:13
const double e
int getDefLine() const
Definition: definition.h:188
bool visible()
Definition: layout.h:153
bool isEnumValue() const
Definition: memberdef.cpp:4150
PageSDict * getPages() const
Definition: groupdef.h:104
int qstricmp(const char *str1, const char *str2)
Definition: qcstring.cpp:567
static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl)
Definition: index.cpp:2519
static void writeMemberList(OutputList &ol, bool useSections, int page, const LetterToIndexMap< MemberIndexList > &memberLists, DefinitionIntf::DefType type)
Definition: index.cpp:2156
virtual QCString trGeneratedBy()=0
void writeSplitBar(const char *name)
Definition: outputlist.h:354
virtual QCString trFileDocumentation()=0
fileName
Definition: dumpTree.py:9
uint count() const
Definition: qlist.h:131
CmhlInfo(const char *fn, const char *t)
Definition: index.cpp:2492
int hierarchyClasses
Definition: index.cpp:57
void pushGeneratorState()
Definition: outputlist.cpp:111
bool isLinkableInProject() const
Definition: filedef.cpp:1877
QCString title
Definition: index.cpp:2834
bool visibleInIndex() const
Definition: pagedef.cpp:282
QCString name() const
Definition: filedef.cpp:1193
QCString navigationPathAsString() const
static void writeAnnotatedIndex(OutputList &ol)
Definition: index.cpp:2037
static void writePageIndex(OutputList &ol)
Definition: index.cpp:3162
bool isEmpty() const
Definition: qlist.h:67
virtual QCString trVariables()=0
QCString convertToHtml(const char *s, bool keepEntities)
Definition: util.cpp:5746
QCString getSourceFileBase() const
Definition: filedef.cpp:1771
SrcLangExt getLanguage() const
std::void_t< T > n
QCString intro() const
Definition: layout.h:151
static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:3292
ClassDef * m_class
Definition: index.cpp:1713
static DirSDict * directories
Definition: doxygen.h:139
void sort()
Definition: qlist.h:85
void endIndexList()
Definition: outputlist.h:127
virtual QCString trFileMembersDescription(bool extractAll)=0
#define MAX_ITEMS_BEFORE_MULTIPAGE_INDEX
Definition: index.cpp:51
QCString anchor() const
Definition: classdef.cpp:4606
bool isForeign() const
Definition: memberdef.cpp:4200
bool classHasVisibleChildren(ClassDef *cd)
Definition: util.cpp:5182
const DirList & subDirs() const
Definition: dirdef.h:61
NamespaceSDict * getNamespaces() const
Definition: groupdef.h:102
static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl)
Definition: index.cpp:2692
virtual QCString trClassDocumentation()=0
static void writeGroupIndex(OutputList &ol)
Definition: index.cpp:3597
static LetterToIndexMap< MemberIndexList > g_fileIndexLetterUsed[FMHL_Total]
Definition: index.cpp:140
QCString & prepend(const char *s)
Definition: qcstring.cpp:387
int documentedPages
Definition: index.cpp:66
virtual QCString trFunctions()=0
void clear()
Definition: sortdict.h:585
virtual QCString trFileIndex()=0
void disable(OutputGenerator::OutputType o)
Definition: outputlist.cpp:79
uint getUtf8Code(const QCString &s, int idx)
Get one unicode character as an unsigned integer from utf-8 string.
Definition: util.cpp:8240
static SectionDict * sectionDict
Definition: doxygen.h:117
bool isLinkable() const
A bunch of utility functions.
static PageSDict * pageSDict
Definition: doxygen.h:102
static void startQuickIndexItem(OutputList &ol, const char *l, bool hl, bool compact, bool &first)
Definition: index.cpp:180
int indexedPages
Definition: index.cpp:61
void endIndexListItem()
Definition: outputlist.h:123
const char * data() const
Definition: qcstring.h:207
bool isEmbeddedInOuterScope() const
Definition: classdef.cpp:4630
Definition: dirdef.h:44
static void writeClassHierarchy(OutputList &ol, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:894
static bool mainPageHasOwnTitle()
Definition: index.cpp:3085
bool isLinkable() const
Definition: classdef.cpp:2729
QCString anchor() const
Definition: memberdef.cpp:1031
#define Config_getString(val)
Definition: config.cpp:660
type * current() const
Definition: qlist.h:146
NmhlInfo(const char *fn, const char *t)
Definition: index.cpp:2832
bool isStrong() const
Definition: memberdef.cpp:4345
void enable(OutputGenerator::OutputType o)
Definition: outputlist.cpp:89
#define Config_getBool(val)
Definition: config.cpp:664
virtual QCString trExamplesDescription()=0
ClassDef * getClassDef() const
Definition: memberdef.cpp:4070
void addContentsItem(bool isDir, const char *name, const char *ref, const char *file, const char *anchor, bool separateIndex, bool addToNavIndex, Definition *def)
Definition: ftvhelp.cpp:183
virtual bool isVisible() const
QCString briefFile() const
QCString getDotImageExtension(void)
Definition: util.cpp:8562
maps a unicode character code to a list of T::ElementType&#39;s
Definition: util.h:96
void countDataStructures()
Definition: index.cpp:77
int getPrefixIndex(const QCString &name)
Definition: util.cpp:5144
bool isObjCMethod() const
Definition: memberdef.cpp:3956
virtual QCString trCompoundMembersDescription(bool extractAll)=0
virtual QCString trCode()=0
void startBold()
Definition: outputlist.h:304
void warn(const char *file, int line, const char *fmt,...)
Definition: message.cpp:183
uint letter() const
Definition: index.cpp:1707
void sort()
Definition: sortdict.h:522
bool isLinkableInProject() const
Definition: dirdef.cpp:58
void initClassHierarchy(ClassSDict *cl)
Definition: util.cpp:5211
bool visited
Definition: classdef.h:402
virtual QCString trNamespaceMembers()=0
int documentedGroups
Definition: index.cpp:59
void enable()
Definition: index.h:123
static void writeNamespaceMemberIndexFiltered(OutputList &ol, NamespaceMemberHighlight hl)
Definition: index.cpp:2858
void addMembersToIndex(T *def, LayoutDocManager::LayoutPart part, const QCString &name, const QCString &anchor, bool addToIndex=TRUE, bool preventSeparateIndex=FALSE)
Definition: index.cpp:299
virtual QCString briefDescription(bool abbreviate=FALSE) const
void extractNamespaceName(const QCString &scopeName, QCString &className, QCString &namespaceName, bool allowEmptyClass)
Definition: util.cpp:5478
virtual QCString trEnumerations()=0
void addContentsItem(bool isDir, const char *name, const char *ref, const char *file, const char *anchor, bool separateIndex=FALSE, bool addToNavIndex=FALSE, Definition *def=0)
Definition: index.h:137
QCString mid(uint index, uint len=0xffffffff) const
Definition: qcstring.cpp:246
void endQuickIndices()
Definition: outputlist.h:352
virtual QCString trAll()=0
QCString getOutputFileBase() const
Definition: filedef.h:83
static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:572
static void writeGroupHierarchy(OutputList &ol, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:3539
virtual QCString trExampleDocumentation()=0
void endContents()
Definition: outputlist.h:366
static void writeNamespaceLinkForMember(OutputList &ol, MemberDef *md, const char *separator, QCString &prevNamespaceName)
Definition: index.cpp:2142
NamespaceSDict * getNamespaceSDict() const
Definition: namespacedef.h:101
LayoutNavEntry * rootNavEntry() const
Definition: layout.cpp:1370
QCString getOutputFileBase() const
Definition: classdef.cpp:3533
QCString localName() const
static void endIndexHierarchy(OutputList &ol, int level)
Definition: index.cpp:104
void initNamespaceMemberIndices()
Definition: index.cpp:2339
void startIndexListItem()
Definition: outputlist.h:121
static void writeFileLinkForMember(OutputList &ol, MemberDef *md, const char *separator, QCString &prevFileName)
Definition: index.cpp:2128
void endItemListItem()
Definition: outputlist.h:184
MemberListType type
Definition: layout.h:111
virtual QCString trEvents()=0
int documentedFiles
Definition: index.cpp:58
virtual QCString trCompoundList()=0
virtual QCString trRelatedPages()=0
virtual Definition * getOuterScope() const
static QCString getProtectionName(int prot)
void writeGraphInfo(OutputList &ol)
Definition: index.cpp:3245
QCString baseFile() const
Definition: layout.h:149
QCString getOutputFileBase() const
Definition: dirdef.cpp:113
int documentedNamespaces
Definition: index.cpp:60
void startTitle(OutputList &ol, const char *fileName, Definition *def)
Definition: index.cpp:228
MemberList * getMemberList(MemberListType lt) const
Definition: groupdef.cpp:1593
virtual QCString trNamespaceIndex()=0
NamespaceDef * getResolvedNamespace(const char *name)
Definition: util.cpp:489
void writeQuickLinks(bool compact, HighlightedItem hli, const char *file)
Definition: outputlist.h:360
void startIndexSection(IndexSections is)
Definition: outputlist.h:85
virtual QCString trNamespaceMemberDescription(bool extractAll)=0
QCString fixSpaces(const QCString &s)
Definition: index.cpp:223
QCString qualifiedName() const
Definition: memberdef.cpp:3968
bool isVisibleInHierarchy()
Definition: classdef.cpp:2743
int documentedNamespaceMembers[NMHL_Total]
Definition: index.cpp:64
void startTypewriter()
Definition: outputlist.h:172
static void writePages(PageDef *pd, FTVHelp *ftv)
Definition: index.cpp:3096
void lastIndexPage()
Definition: outputlist.h:408
void endItemList()
Definition: outputlist.h:139
void startTextBlock(bool dense=FALSE)
Definition: outputlist.h:404
static void writeIndexHierarchyEntries(OutputList &ol, const QList< LayoutNavEntry > &entries)
Definition: index.cpp:4072
static void writeClassLinkForMember(OutputList &ol, MemberDef *md, const char *separator, QCString &prevClassName)
Definition: index.cpp:2114
A model of a page symbol.
Definition: pagedef.h:29
QCString getPath() const
Definition: filedef.h:110
void append(uint letter, typename T::ElementType *elem)
Definition: util.h:100
virtual Kind kind() const =0
void initClassMemberIndices()
Definition: index.cpp:2254
void enableAll()
Definition: outputlist.cpp:59
static void writeHierarchicalIndex(OutputList &ol)
Definition: index.cpp:955
static void writeAlphabeticalIndex(OutputList &ol)
Definition: index.cpp:2008
MemberIndexList(uint letter)
Definition: index.cpp:123
QCString usedName
Definition: classdef.h:525
static QCString letterToLabel(uint startLetter)
Definition: index.cpp:1640
virtual QCString trClassHierarchyDescription()=0
Base class representing a piece of a documentation page.
Definition: layout.h:30
QCString doc
static int countClassesInTreeList(const ClassSDict &cl)
Definition: index.cpp:922
QCString getOutputFileBase() const
Definition: memberdef.cpp:941
void writeAnchor(const char *fileName, const char *name)
Definition: outputlist.h:242
virtual QCString trModules()=0
FileList * getFiles() const
Definition: groupdef.h:100
static int countDirs()
Definition: index.cpp:3226
QCString title() const
Definition: layout.h:150
static const NmhlInfo * getNmhlInfo(int hl)
Definition: index.cpp:2837
const char * fname
Definition: index.cpp:2493
bool hasVisibleRoot(BaseClassList *bcl)
Definition: util.cpp:5224
static bool * b
Definition: config.cpp:1043
static void writeAnnotatedClassList(OutputList &ol)
Definition: index.cpp:1577
static void writeNamespaceMemberIndex(OutputList &ol)
Definition: index.cpp:2972
static int countClassHierarchy()
Definition: index.cpp:943
NamespaceDef * getNamespaceDef() const
Definition: memberdef.cpp:4080
void decContentsDepth()
Definition: ftvhelp.cpp:152
Translator * theTranslator
Definition: language.cpp:157
bool isDocumentationFile() const
Definition: filedef.cpp:1728
void add(uint letter)
Definition: index.cpp:1744
bool isId(int c)
Definition: util.h:224
void endTextBlock(bool paraBreak=FALSE)
Definition: outputlist.h:406
virtual QCString trCompoundMembers()=0
int compareValues(const uint *p1, const uint *p2) const
Definition: index.cpp:1753
static void writeClassTreeForList(OutputList &ol, ClassSDict *cl, bool &started, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:800
void endTitle(OutputList &ol, const char *fileName, const char *name)
Definition: index.cpp:237
void writeIndexHierarchy(OutputList &ol)
Definition: index.cpp:4279
static void writeNamespaceIndex(OutputList &ol)
Definition: index.cpp:1447
Kind kind() const
Definition: layout.h:148
virtual QCString trCompoundListDescription()=0
bool isFunction() const
Definition: memberdef.cpp:4160
T * toFirst() const
Definition: sortdict.h:621
HighlightedItem
Definition: index.h:180
void startTitleHead(const char *fileName)
Definition: outputlist.h:105
friend class Iterator
Definition: sortdict.h:289
float pi
Definition: units.py:11
virtual QCString trProperties()=0
static void writeClassTree(OutputList &ol, const BaseClassList *bcl, bool hideSuper, int level, FTVHelp *ftv, bool addToIndex)
Definition: index.cpp:423
void disable()
Definition: index.h:121
virtual void writeSummaryLinks(OutputList &)
Definition: definition.h:339
FileList * getFiles() const
Definition: dirdef.h:59
MemberDef ElementType
Definition: index.cpp:122
QCString includeName() const
Definition: filedef.cpp:1784
bool documentedPage() const
Definition: pagedef.cpp:292
bool isRelated() const
Definition: memberdef.cpp:4195
ClassSDict * getClassSDict() const
Definition: namespacedef.h:98
const char * cs
int docLine() const
void incContentsDepth()
Definition: ftvhelp.cpp:141
static void startIndexHierarchy(OutputList &ol, int level)
Definition: index.cpp:91
bool isLinkableInProject() const
int row() const
Definition: index.cpp:1708
static int countGroups()
Definition: index.cpp:3208
int column() const
Definition: index.cpp:1709
QCString getOutputFileBase() const
Definition: groupdef.cpp:1512
void writeFooter(const char *navPath)
Definition: outputlist.h:101
bool isStatic() const
Definition: memberdef.cpp:4205
void docify(const char *s)
Definition: outputlist.h:145
bool isTypedef() const
Definition: memberdef.cpp:4155
bool classVisibleInIndex(ClassDef *cd)
Definition: util.cpp:8334
QCString utf8() const
Definition: qstring.cpp:14507
AlphaIndexTableCell(int row, int col, uint letter, ClassDef *cd)
Definition: index.cpp:1700
static void countFiles(int &htmlFiles, int &files)
Definition: index.cpp:1062
void writeObjectLink(const char *ref, const char *file, const char *anchor, const char *name)
Definition: outputlist.h:149
type & at(uint i) const
Definition: qarray.h:98
uint size() const
Definition: qarray.h:65
void startItemList()
Definition: outputlist.h:137
void writePageLink(const char *name, bool first)
Definition: outputlist.h:89
void startProjectNumber()
Definition: outputlist.h:91
unsigned uint
Definition: qglobal.h:351
void setAutoDelete(bool enable)
Definition: qlist.h:99
static ClassSDict * classSDict
Definition: doxygen.h:99
QCString getOutputFileBase() const
Definition: pagedef.cpp:58
virtual QCString trFileList()=0
void endTextLink()
Definition: outputlist.h:161
virtual QCString trNamespaceListDescription(bool extractAll)=0
static PageDef * mainPage
Definition: doxygen.h:103
DirList * getDirs() const
Definition: groupdef.h:105
void incContentsDepth()
Definition: index.h:133
QCString & replace(uint index, uint len, const char *s)
Definition: qcstring.cpp:411
static QCString * s
Definition: config.cpp:1042
const bool TRUE
Definition: qglobal.h:371
static void writeClassMemberIndex(OutputList &ol)
Definition: index.cpp:2636
virtual QCString trTypeDocumentation()=0
ClassDef * classDef() const
Definition: index.cpp:1706
static IndexList * indexList
Definition: doxygen.h:149
const QList< MemberList > & getMemberLists() const
Definition: groupdef.h:95
QCString substitute(const QCString &s, const QCString &src, const QCString &dst)
substitute all occurrences of src in s by dst
Definition: util.cpp:5088
NamespaceMemberHighlight
Definition: index.h:230
int annotatedClasses
Definition: index.cpp:55
static const FmhlInfo * getFmhlInfo(int hl)
Definition: index.cpp:2672
PrefixIgnoreClassList(uint letter)
Definition: index.cpp:1684
virtual QCString trReferenceManual()=0
virtual QCString trLegendDocs()=0
bool isEnumerate() const
Definition: memberdef.cpp:4145
virtual QCString trModulesIndex()=0
BaseClassList * baseClasses() const
Definition: classdef.cpp:4399
GroupDef * getGroupDef() const
Definition: pagedef.cpp:52
void startContents()
Definition: outputlist.h:364
Definition: qlist.h:54
virtual QCString trNamespaceList()=0
void startFile(const char *name, const char *manName, const char *title)
Definition: outputlist.h:97
#define ASSERT(x)
Definition: qglobal.h:590
void startIndexItem(const char *ref, const char *file)
Definition: outputlist.h:141
AlphaIndexTableRowsIterator(const AlphaIndexTableRows &list)
Definition: index.cpp:1729
QCString filterTitle(const QCString &title)
Definition: util.cpp:7765
void endTypewriter()
Definition: outputlist.h:174
type * toFirst()
Definition: qlist.h:135
virtual QCString trDefines()=0
virtual int compareValue(const ClassDef *c1, const ClassDef *c2) const
Definition: index.cpp:1687
void generateGraphLegend(const char *path)
Definition: dot.cpp:4127
T * current() const
Definition: sortdict.h:635