My Project
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
context.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Copyright (C) 1997-2015 by Dimitri van Heesch.
4  *
5  * Permission to use, copy, modify, and distribute this software and its
6  * documentation under the terms of the GNU General Public License is hereby
7  * granted. No representations are made about the suitability of this software
8  * for any purpose. It is provided "as is" without express or implied warranty.
9  * See the GNU General Public License for more details.
10  *
11  * Documents produced by Doxygen are derivative works derived from the
12  * input used in their production; they are not affected by this license.
13  *
14  */
15 
16 #include <assert.h>
17 #include <qdir.h>
18 
19 #include "context.h"
20 #include "config.h"
21 #include "index.h"
22 #include "classlist.h"
23 #include "doxygen.h"
24 #include "namespacedef.h"
25 #include "filedef.h"
26 #include "pagedef.h"
27 #include "groupdef.h"
28 #include "util.h"
29 #include "version.h"
30 #include "language.h"
31 #include "message.h"
32 #include "vhdldocgen.h"
33 #include "filename.h"
34 #include "dirdef.h"
35 #include "docparser.h"
36 #include "htmlgen.h"
37 #include "htmldocvisitor.h"
38 #include "htmlhelp.h"
39 #include "latexgen.h"
40 #include "latexdocvisitor.h"
41 #include "dot.h"
42 #include "diagram.h"
43 #include "example.h"
44 #include "membername.h"
45 #include "parserintf.h"
46 #include "portable.h"
47 #include "arguments.h"
48 #include "groupdef.h"
49 #include "searchindex.h"
50 #include "resourcemgr.h"
51 
52 // TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other
53 // files as well
54 
56 {
65 };
66 
68 {
70  QCString outputDir;
72 } g_globals;
73 
75 template<class T> class ScopedPtr
76 {
77  private:
78  T *m_ptr;
79  ScopedPtr(const ScopedPtr &);
80  ScopedPtr &operator=(const ScopedPtr &);
81  void operator==(const ScopedPtr &) const;
82  void operator!=(const ScopedPtr &) const;
83 
84  public:
85  typedef T Type;
86  explicit ScopedPtr(T *p=0) : m_ptr(p) {}
87  ~ScopedPtr() { delete m_ptr; };
88  T &operator*() const { return *m_ptr; }
89  T *operator->() const { return m_ptr; }
90  T *get() const { return m_ptr; }
91  operator bool() const { return m_ptr!=0; }
92  void reset(T *p=0) { if (p!=m_ptr) { delete m_ptr; m_ptr = p; } }
93 };
94 
96 template<class T> class SharedPtr
97 {
98  private:
99  T *m_ptr;
100  SharedPtr(const SharedPtr &);
101  SharedPtr &operator=(const SharedPtr &p);
102  void operator==(const SharedPtr &) const;
103  void operator!=(const SharedPtr &) const;
104 
105  public:
106  typedef T Type;
107  explicit SharedPtr(T *p=0) : m_ptr(p) { if (m_ptr) m_ptr->addRef(); }
108  ~SharedPtr() { if (m_ptr) m_ptr->release(); };
109  T &operator*() const { return *m_ptr; }
110  T *operator->() const { return m_ptr; }
111  T *get() const { return m_ptr; }
112  operator bool() const { return m_ptr!=0; }
113  void reset(T *p=0)
114  {
115  if (p) p->addRef();
116  if (m_ptr) m_ptr->release();
117  m_ptr = p;
118  }
119 };
120 
123 {
124  public:
125  GenericConstIterator(const QList<TemplateVariant> &list)
126  : m_it(list) { }
128  void toFirst()
129  {
130  m_it.toFirst();
131  }
132  void toLast()
133  {
134  m_it.toLast();
135  }
136  void toNext()
137  {
138  if (m_it.current()) ++m_it;
139  }
140  void toPrev()
141  {
142  if (m_it.current()) --m_it;
143  }
144  bool current(TemplateVariant &v) const
145  {
146  if (m_it.current())
147  {
148  v = *m_it.current();
149  return TRUE;
150  }
151  else
152  {
153  v = TemplateVariant();
154  return FALSE;
155  }
156  }
157  private:
158  QListIterator<TemplateVariant> m_it;
159 };
160 
161 //------------------------------------------------------------------------
162 
165 {
166  public:
168  {
169  m_children.setAutoDelete(TRUE);
170  }
172  {
173  return new GenericNodeListContext;
174  }
175 
176  // TemplateListIntf methods
177  int count() const
178  {
179  return (int)m_children.count();
180  }
181  TemplateVariant at(int index) const
182  {
183  TemplateVariant result;
184  if (index>=0 && index<count())
185  {
186  result = *m_children.at(index);
187  }
188  return result;
189  }
191  {
192  return new GenericConstIterator(m_children);
193  }
194 
195  void append(const TemplateVariant &ctn)
196  {
197  m_children.append(new TemplateVariant(ctn));
198  }
199  bool isEmpty() const
200  {
201  return m_children.isEmpty();
202  }
203  int addRef()
204  {
205  return ++m_refCount;
206  }
207  int release()
208  {
209  int count = --m_refCount;
210  if (count<=0)
211  {
212  delete this;
213  }
214  return count;
215  }
216  private:
217  mutable QList<TemplateVariant> m_children;
219 };
220 
221 //------------------------------------------------------------------------
222 
224 template<typename T>
226 {
227  private:
229  {
230  virtual ~PropertyFuncIntf() {}
231  virtual TemplateVariant operator()(const T *obj) const = 0;
232  };
234  {
235  typedef TemplateVariant (T::*Handler)() const;
237  TemplateVariant operator()(const T *obj) const
238  {
239  return (obj->*handler)();
240  }
242  };
243 
244  public:
245  PropertyMapper() : m_map(63) { m_map.setAutoDelete(TRUE); }
246 
252  void addProperty(const char *name,typename PropertyFunc::Handler handle)
253  {
254  if (m_map.find(name))
255  {
256  err("Error: adding property '%s' more than once",name);
257  }
258  else
259  {
260  m_map.insert(name,new PropertyFunc(handle));
261  }
262  }
263 
269  TemplateVariant get(const T *obj,const char *name) const
270  {
271  //printf("PropertyMapper::get(%s)\n",name);
272  TemplateVariant result;
273  PropertyFuncIntf *func = m_map.find(name);
274  if (func)
275  {
276  result = (*func)(obj);
277  }
278  return result;
279  }
280 
281  private:
282  QDict<PropertyFuncIntf> m_map;
283 };
284 
285 
286 //------------------------------------------------------------------------
287 
288 //%% struct Config : configuration options
289 //%% {
291 {
292  public:
293  Private() { m_cachedLists.setAutoDelete(TRUE); }
294  virtual ~Private() { }
295  TemplateVariant fetchList(const QCString &name,const QStrList *list)
296  {
297  TemplateVariant *v = m_cachedLists.find(name);
298  if (v==0)
299  {
301  m_cachedLists.insert(name,new TemplateVariant(tlist));
302  QStrListIterator li(*list);
303  char *s;
304  for (li.toFirst();(s=li.current());++li)
305  {
306  tlist->append(s);
307  }
308  return tlist;
309  }
310  else
311  {
312  return *v;
313  }
314  }
315  private:
316  QDict<TemplateVariant> m_cachedLists;
317 };
318 //%% }
319 
321 {
322  p = new Private;
323 }
324 
326 {
327  delete p;
328 }
329 
330 TemplateVariant ConfigContext::get(const char *name) const
331 {
332  TemplateVariant result;
333  if (name)
334  {
335  const ConfigValues::Info *option = ConfigValues::instance().get(name);
336  if (option)
337  {
338  switch (option->type)
339  {
340  case ConfigValues::Info::Bool:
341  {
342  bool b = ConfigValues::instance().*((ConfigValues::InfoBool*)option)->item;
343  return TemplateVariant(b);
344  }
345  case ConfigValues::Info::Int:
346  {
347  int i = ConfigValues::instance().*((ConfigValues::InfoInt*)option)->item;
348  return TemplateVariant(i);
349  }
350  case ConfigValues::Info::String:
351  {
352  QCString s = ConfigValues::instance().*((ConfigValues::InfoString*)option)->item;
353  return TemplateVariant(s);
354  }
355  case ConfigValues::Info::List:
356  {
357  const QStrList &l = ConfigValues::instance().*((ConfigValues::InfoList*)option)->item;
358  return p->fetchList(name,&l);
359  }
360  default:
361  break;
362  }
363  }
364  }
365  return result;
366 }
367 
368 //------------------------------------------------------------------------
369 
370 //%% struct Doxygen: global information
371 //%% {
373 {
374  public:
376  {
377  return versionString;
378  }
380  {
381  return dateToString(TRUE);
382  }
384  {
385  return m_cache.maxJaxCodeFile;
386  }
388  {
389  static bool init=FALSE;
390  if (!init)
391  {
392  //%% string version
393  s_inst.addProperty("version", &Private::version);
394  //%% string date
395  s_inst.addProperty("date", &Private::date);
396  //%% string maxJaxCodeFile
397  s_inst.addProperty("mathJaxCodeFile", &Private::maxJaxCodeFile);
398  init=TRUE;
399  }
400  }
401  TemplateVariant get(const char *n) const
402  {
403  return s_inst.get(this,n);
404  }
405  private:
406  struct Cachable
407  {
409  QCString maxJaxCodeFile;
410  };
411  mutable Cachable m_cache;
413 };
414 //%% }
415 
417 // (PropertyMapper<DoxygenContext::Private>::instance());
418 
420 {
421  p = new Private;
422 }
423 
425 {
426  delete p;
427 }
428 
430 {
431  return p->get(n);
432 }
433 
434 //------------------------------------------------------------------------
435 
436 //%% struct Translator: translation methods
437 //%% {
439 {
440  public:
441 
442  TemplateVariant handleGeneratedAt(const QValueList<TemplateVariant> &args) const
443  {
444  if (args.count()==2)
445  {
446  return theTranslator->trGeneratedAt(args[0].toString(),args[1].toString());
447  }
448  else
449  {
450  err("tr.generateAt should take two arguments, got %d!\n",args.count());
451  }
452  return TemplateVariant();
453  }
454  TemplateVariant handleInheritanceDiagramFor(const QValueList<TemplateVariant> &args) const
455  {
456  if (args.count()==1)
457  {
458  return theTranslator->trClassDiagram(args[0].toString());
459  }
460  else
461  {
462  err("tr.inheritanceDiagramFor should take one argument, got %d!\n",args.count());
463  }
464  return TemplateVariant();
465  }
466  TemplateVariant handleCollaborationDiagramFor(const QValueList<TemplateVariant> &args) const
467  {
468  if (args.count()==1)
469  {
470  return theTranslator->trCollaborationDiagram(args[0].toString());
471  }
472  else
473  {
474  err("tr.collaborationDiagramFor should take one argument, got %d!\n",args.count());
475  }
476  return TemplateVariant();
477  }
478  TemplateVariant handleDirDependencyGraphFor(const QValueList<TemplateVariant> &args) const
479  {
480  if (args.count()==1)
481  {
482  return theTranslator->trDirDepGraph(args[0].toString());
483  }
484  else
485  {
486  err("tr.dirDependencyGraphFor should take one argument, got %d!\n",args.count());
487  }
488  return TemplateVariant();
489  }
490  TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const
491  {
492  if (args.count()==1)
493  {
494  return theTranslator->trInheritsList(args[0].toInt());
495  }
496  else
497  {
498  err("tr.inheritsList should take one integer argument, got %d!\n",args.count());
499  }
500  return TemplateVariant();
501  }
502  TemplateVariant handleInheritedByList(const QValueList<TemplateVariant> &args) const
503  {
504  if (args.count()==1)
505  {
506  return theTranslator->trInheritedByList(args[0].toInt());
507  }
508  else
509  {
510  err("tr.inheritedByList should take one integer argument, got %d!\n",args.count());
511  }
512  return TemplateVariant();
513  }
514  TemplateVariant handleWriteList(const QValueList<TemplateVariant> &args) const
515  {
516  if (args.count()==1)
517  {
518  return theTranslator->trWriteList(args[0].toInt());
519  }
520  else
521  {
522  err("tr.*List should take one integer argument, got %d!\n",args.count());
523  }
524  return TemplateVariant();
525  }
526  TemplateVariant handleImplementedBy(const QValueList<TemplateVariant> &args) const
527  {
528  if (args.count()==1)
529  {
530  return theTranslator->trImplementedInList(args[0].toInt());
531  }
532  else
533  {
534  err("tr.implementedBy should take one integer argument, got %d!\n",args.count());
535  }
536  return TemplateVariant();
537  }
538  TemplateVariant handleReimplementedBy(const QValueList<TemplateVariant> &args) const
539  {
540  if (args.count()==1)
541  {
542  return theTranslator->trReimplementedInList(args[0].toInt());
543  }
544  else
545  {
546  err("tr.reimplementedBy should take one integer argument, got %d!\n",args.count());
547  }
548  return TemplateVariant();
549  }
550  TemplateVariant handleSourceRefs(const QValueList<TemplateVariant> &args) const
551  {
552  if (args.count()==1)
553  {
554  return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+".";
555  }
556  else
557  {
558  err("tr.sourceRefs should take one integer argument, got %d\n",args.count());
559  }
560  return TemplateVariant();
561  }
562  TemplateVariant handleSourceRefBys(const QValueList<TemplateVariant> &args) const
563  {
564  if (args.count()==1)
565  {
566  return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+".";
567  }
568  else
569  {
570  err("tr.sourceRefBys should take one integer argument, got %d\n",args.count());
571  }
572  return TemplateVariant();
573  }
574  TemplateVariant handleIncludeDependencyGraph(const QValueList<TemplateVariant> &args) const
575  {
576  if (args.count()==1)
577  {
578  return theTranslator->trInclDepGraph(args[0].toString());
579  }
580  else
581  {
582  err("tr.includeDependencyGraph should take one string argument, got %d\n",args.count());
583  }
584  return TemplateVariant();
585  }
586 
587 
588 
590  {
591  return theTranslator->trGeneratedBy();
592  }
594  {
595  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleGeneratedAt>(this);
596  }
598  {
599  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritanceDiagramFor>(this);
600  }
602  {
603  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleCollaborationDiagramFor>(this);
604  }
606  {
607  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDirDependencyGraphFor>(this);
608  }
610  {
611  return theTranslator->trSearch();
612  }
614  {
615  return theTranslator->trMainPage();
616  }
618  {
619  return theTranslator->trClasses();
620  // TODO: VHDL: trVhdlType(VhdlDocGen::ENTITY,FALSE)
621  // TODO: Fortran: trDataTypes()
622  }
624  {
625  return theTranslator->trCompoundList();
626  }
628  {
630  }
632  {
633  return theTranslator->trCompoundIndex();
634  }
636  {
638  }
640  {
642  }
644  {
646  }
648  {
649  return theTranslator->trModules();
650  }
652  {
653  return theTranslator->trModuleIndex();
654  }
656  {
657  if (m_javaOpt || m_vhdlOpt)
658  {
659  return theTranslator->trPackages();
660  }
661  else if (m_fortranOpt)
662  {
663  return theTranslator->trModules();
664  }
665  else
666  {
667  return theTranslator->trNamespaces();
668  }
669  }
671  {
672  return theTranslator->trFile(TRUE,FALSE);
673  }
675  {
676  return theTranslator->trFileIndex();
677  }
679  {
680  return theTranslator->trRelatedPages();
681  }
683  {
684  return theTranslator->trExamples();
685  }
687  {
688  if (m_javaOpt || m_vhdlOpt)
689  {
690  return theTranslator->trPackages();
691  }
692  else if (m_fortranOpt)
693  {
694  return theTranslator->trModulesList();
695  }
696  else
697  {
698  return theTranslator->trNamespaceList();
699  }
700  }
702  {
703  if (m_javaOpt || m_vhdlOpt)
704  {
706  }
707  else if (m_fortranOpt)
708  {
710  }
711  else
712  {
714  }
715  }
717  {
719  }
721  {
723  }
725  {
726  return theTranslator->trFileList();
727  }
729  {
730  return theTranslator->trFileMembers();
731  }
733  {
734  static bool extractAll = Config_getBool(EXTRACT_ALL);
735  return theTranslator->trFileMembersDescription(extractAll);
736  }
738  {
739  static bool extractAll = Config_getBool(EXTRACT_ALL);
740  return theTranslator->trNamespaceMemberDescription(extractAll);
741  }
743  {
745  }
747  {
749  }
751  {
753  }
755  {
756  static bool extractAll = Config_getBool(EXTRACT_ALL);
757  static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
758  if (fortranOpt)
759  {
761  }
762  else
763  {
764  return theTranslator->trCompoundMembersDescription(extractAll);
765  }
766  }
768  {
770  }
772  {
773  return theTranslator->trMore();
774  }
776  {
778  }
780  {
781  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritsList>(this);
782  }
784  {
785  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritedByList>(this);
786  }
788  {
790  }
792  {
794  }
796  {
797  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleWriteList>(this);
798  }
800  {
802  }
804  {
805  return theTranslator->trMemberList();
806  }
808  {
810  }
812  {
814  }
816  {
817  return theTranslator->trDefineValue();
818  }
820  {
821  return theTranslator->trInitialValue();
822  }
824  {
826  }
828  {
830  }
832  {
834  }
836  {
837  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleImplementedBy>(this);
838  }
840  {
841  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleReimplementedBy>(this);
842  }
844  {
845  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefs>(this);
846  }
848  {
849  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefBys>(this);
850  }
852  {
853  return theTranslator->trCallGraph();
854  }
856  {
857  return theTranslator->trCallerGraph();
858  }
860  {
861  return theTranslator->trInheritedFrom("@0","@1");
862  }
864  {
866  }
868  {
869  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleIncludeDependencyGraph>(this);
870  }
872  {
874  }
876  {
878  }
880  {
882  }
884  {
886  }
888  {
890  }
892  {
894  }
896  {
898  }
900  {
901  return theTranslator->trDetailLevel();
902  }
904  {
905  bool extractAll = Config_getBool(EXTRACT_ALL);
906  return theTranslator->trFileListDescription(extractAll);
907  }
909  {
910  bool extractAll = Config_getBool(EXTRACT_ALL);
911  return theTranslator->trModulesListDescription(extractAll);
912  }
914  {
915  bool extractAll = Config_getBool(EXTRACT_ALL);
916  return theTranslator->trNamespaceListDescription(extractAll);
917  }
919  {
920  return theTranslator->trDirectories();
921  }
923  {
924  return theTranslator->trAll();
925  }
927  {
928  static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
929  static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
930  return fortranOpt ? theTranslator->trSubprograms() :
931  vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
933  }
935  {
936  return theTranslator->trVariables();
937  }
939  {
940  return theTranslator->trTypedefs();
941  }
943  {
944  return theTranslator->trEnumerations();
945  }
947  {
948  return theTranslator->trProperties();
949  }
951  {
952  return theTranslator->trEvents();
953  }
955  {
957  }
959  {
960  return theTranslator->trDefines();
961  }
963  {
964  return theTranslator->trLoading();
965  }
967  {
968  return theTranslator->trSearching();
969  }
971  {
972  return theTranslator->trNoMatches();
973  }
975  {
976  return theTranslator->trEnumName();
977  }
979  {
980  return theTranslator->trEnumValue();
981  }
983  {
985  }
987  {
989  }
991  {
993  }
995  {
997  }
999  {
1001  }
1003  {
1004  return theTranslator->trExtendsClass();
1005  }
1007  {
1009  }
1011  {
1012  return HtmlHelp::getLanguageString();
1013  }
1015  {
1016  static bool init=FALSE;
1017  if (!init)
1018  {
1019  //%% string generatedBy
1020  s_inst.addProperty("generatedBy", &Private::generatedBy);
1021  //%% string generatedAt
1022  s_inst.addProperty("generatedAt", &Private::generatedAt);
1023  //%% string search
1024  s_inst.addProperty("search", &Private::search);
1025  //%% string mainPage
1026  s_inst.addProperty("mainPage", &Private::mainPage);
1027  //%% string classes
1028  s_inst.addProperty("classes", &Private::classes);
1029  //%% string classList
1030  s_inst.addProperty("classList", &Private::classList);
1031  //%% string classListDescription
1032  s_inst.addProperty("classListDescription", &Private::classListDescription);
1033  //%% string classIndex
1034  s_inst.addProperty("classIndex", &Private::classIndex);
1035  //%% string namespaceIndex
1036  s_inst.addProperty("namespaceIndex", &Private::namespaceIndex);
1037  //%% string classHierarchy
1038  s_inst.addProperty("classHierarchy", &Private::classHierarchy);
1039  //%% string classMembers
1040  s_inst.addProperty("classMembers", &Private::classMembers);
1041  //%% string classMembersDescription
1042  s_inst.addProperty("classMembersDescription",&Private::classMembersDescription);
1043  //%% string modules
1044  s_inst.addProperty("modules", &Private::modules);
1045  //%% string moduleIndex
1046  s_inst.addProperty("moduleIndex", &Private::moduleIndex);
1047  //%% string namespaces
1048  s_inst.addProperty("namespaces", &Private::namespaces);
1049  //%% string fileIndex
1050  s_inst.addProperty("fileIndex", &Private::fileIndex);
1051  //%% string files
1052  s_inst.addProperty("files", &Private::files);
1053  //%% string pages
1054  s_inst.addProperty("pages", &Private::pages);
1055  //%% string examples
1056  s_inst.addProperty("examples", &Private::examples);
1057  //%% string namespaceList
1058  s_inst.addProperty("namespaceList", &Private::namespaceList);
1059  //%% string namespaceMembers
1060  s_inst.addProperty("namespaceMembers", &Private::namespaceMembers);
1061  //%% srting fileList
1062  s_inst.addProperty("fileList", &Private::fileList);
1063  //%% string fileMembers
1064  s_inst.addProperty("fileMembers", &Private::fileMembers);
1065  //%% string fileMembersDescription
1066  s_inst.addProperty("fileMembersDescription", &Private::fileMembersDescription);
1067  //%% string relatedPagesDescripiton
1068  s_inst.addProperty("relatedPagesDesc", &Private::relatedPagesDesc);
1069  //%% string more
1070  s_inst.addProperty("more", &Private::more);
1071  //%% string detailedDescription
1072  s_inst.addProperty("detailedDesc", &Private::detailedDesc);
1073  //%% string inheritanceDiagramFor
1074  s_inst.addProperty("inheritanceDiagramFor", &Private::inheritanceDiagramFor);
1075  //%% string collaborationDiagramFor
1076  s_inst.addProperty("collaborationDiagramFor", &Private::collaborationDiagramFor);
1077  //%% markerstring inheritsList
1078  s_inst.addProperty("inheritsList", &Private::inheritsList);
1079  //%% markerstring inheritedByList
1080  s_inst.addProperty("inheritedByList", &Private::inheritedByList);
1081  //%% markerstring definedAtLineInSourceFile
1082  s_inst.addProperty("definedAtLineInSourceFile", &Private::definedAtLineInSourceFile);
1083  //%% string typeConstraints
1084  s_inst.addProperty("typeConstraints", &Private::typeConstraints);
1085  //%% string exampleList
1086  s_inst.addProperty("exampleList", &Private::exampleList);
1087  //%% string listOfAllMembers
1088  s_inst.addProperty("listOfAllMembers", &Private::listOfAllMembers);
1089  //%% string memberList
1090  s_inst.addProperty("memberList", &Private::memberList);
1091  //%% string theListOfAllMembers
1092  s_inst.addProperty("theListOfAllMembers",&Private::theListOfAllMembers);
1093  //%% string incInheritedMembers
1094  s_inst.addProperty("incInheritedMembers",&Private::incInheritedMembers);
1095  //%% string defineValue
1096  s_inst.addProperty("defineValue", &Private::defineValue);
1097  //%% string initialValue
1098  s_inst.addProperty("initialValue", &Private::initialValue);
1099  //%% markerstring implements
1100  s_inst.addProperty("implements", &Private::implements);
1101  //%% markerstring reimplements
1102  s_inst.addProperty("reimplements", &Private::reimplements);
1103  //%% markerstring implementedBy
1104  s_inst.addProperty("implementedBy", &Private::implementedBy);
1105  //%% markerstring reimplementedBy
1106  s_inst.addProperty("reimplementedBy", &Private::reimplementedBy);
1107  //%% markerstring sourceRefs
1108  s_inst.addProperty("sourceRefs", &Private::sourceRefs);
1109  //%% markerstring sourceRefBys
1110  s_inst.addProperty("sourceRefBys", &Private::sourceRefBys);
1111  //%% string callGraph
1112  s_inst.addProperty("callGraph", &Private::callGraph);
1113  //%% string callerGraph
1114  s_inst.addProperty("callerGraph", &Private::callerGraph);
1115  //%% markerstring inheritedFrom
1116  s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
1117  //%% string addtionalInheritedMembers
1118  s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
1119  //%% string includeDependencyGraph:container_name
1120  s_inst.addProperty("includeDependencyGraph",&Private::includeDependencyGraph);
1121  //%% string includedByDependencyGraph
1122  s_inst.addProperty("includedByDependencyGraph",&Private::includedByDependencyGraph);
1123  //%% string gotoSourceCode
1124  s_inst.addProperty("gotoSourceCode", &Private::gotoSourceCode);
1125  //%% string gotoDocumentation
1126  s_inst.addProperty("gotoDocumentation", &Private::gotoDocumentation);
1127  //%% string constantgroups
1128  s_inst.addProperty("constantgroups", &Private::constantgroups);
1129  //%% string classDocumentation
1130  s_inst.addProperty("classDocumentation", &Private::classDocumentation);
1131  //%% string namespaceDocumentation
1132  s_inst.addProperty("namespaceDocumentation", &Private::namespaceDocumentation);
1133  //%% string moduleDocumentation
1134  s_inst.addProperty("moduleDocumentation",&Private::moduleDocumentation);
1135  //%% string fileDocumentation
1136  s_inst.addProperty("fileDocumentation", &Private::fileDocumentation);
1137  //%% string compoundMembers
1138  s_inst.addProperty("compoundMembers", &Private::compoundMembers);
1139  //%% string detailLevel
1140  s_inst.addProperty("detailLevel", &Private::detailLevel);
1141  //%% string fileListDescription
1142  s_inst.addProperty("fileListDescription",&Private::fileListDescription);
1143  //%% string namespaceListDescription
1144  s_inst.addProperty("namespaceListDescription",&Private::namespaceListDescription);
1145  //%% string directories
1146  s_inst.addProperty("directories", &Private::directories);
1147  //%% string moduleDescription
1148  s_inst.addProperty("modulesDescription", &Private::modulesDescription);
1149  //%% string all
1150  s_inst.addProperty("all", &Private::all);
1151  //%% string functions
1152  s_inst.addProperty("functions", &Private::functions);
1153  //%% string variables
1154  s_inst.addProperty("variables", &Private::variables);
1155  //%% string typedefs
1156  s_inst.addProperty("typedefs", &Private::typedefs);
1157  //%% string enums
1158  s_inst.addProperty("enums", &Private::enums);
1159  //%% string enumValues
1160  s_inst.addProperty("enumValues", &Private::enumerationValues);
1161  //%% string properties
1162  s_inst.addProperty("properties", &Private::properties);
1163  //%% string events
1164  s_inst.addProperty("events", &Private::events);
1165  //%% string related
1166  s_inst.addProperty("related", &Private::related);
1167  //%% string macros
1168  s_inst.addProperty("macros", &Private::macros);
1169  //%% string namespaceMembersDescription
1170  s_inst.addProperty("namespaceMembersDescription",&Private::namespaceMembersDescription);
1171  //%% string classHierarchyDescription
1172  s_inst.addProperty("classHierarchyDescription",&Private::classHierarchyDescription);
1173  //%% string gotoGraphicalHierarchy
1174  s_inst.addProperty("gotoGraphicalHierarchy",&Private::gotoGraphicalHierarchy);
1175  //%% string gotoTextualHierarchy
1176  s_inst.addProperty("gotoTextualHierarchy",&Private::gotoTextualHierarchy);
1177  //%% string loading
1178  s_inst.addProperty("loading", &Private::loading);
1179  //%% string searching
1180  s_inst.addProperty("searching", &Private::searching);
1181  //%% string noMatches
1182  s_inst.addProperty("noMatches", &Private::noMatches);
1183  //%% string enumValue
1184  s_inst.addProperty("enumValue", &Private::enumValue);
1185  //%% string enumName
1186  s_inst.addProperty("enumName", &Private::enumName);
1187  //%% string referenceManual
1188  s_inst.addProperty("referenceManual", &Private::referenceManual);
1189  //%% string index
1190  s_inst.addProperty("index", &Private::index);
1191  //%% string panelSyncOn
1192  s_inst.addProperty("panelSyncOn", &Private::panelSyncOn);
1193  //%% string panelSyncOff
1194  s_inst.addProperty("panelSyncOff", &Private::panelSyncOff);
1195  //%% string dirDependencyGraph
1196  s_inst.addProperty("dirDependencyGraphFor", &Private::dirDependencyGraphFor);
1197  //%% string providedByCategory
1198  s_inst.addProperty("providedByCategory", &Private::providedByCategory);
1199  //%% string extendsClass
1200  s_inst.addProperty("extendsClass", &Private::extendsClass);
1201  //%% string examplesDescription
1202  s_inst.addProperty("examplesDescription",&Private::examplesDescription);
1203  //%% string langstring
1204  s_inst.addProperty("langString", &Private::langString);
1205 
1206  init=TRUE;
1207  }
1208 
1209  m_javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
1210  m_fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
1211  m_vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1212  }
1213  TemplateVariant get(const char *n) const
1214  {
1215  return s_inst.get(this,n);
1216  }
1217  private:
1222 };
1223 //%% }
1224 
1226 
1228 {
1229  p = new Private;
1230 }
1231 
1233 {
1234  delete p;
1235 }
1236 
1238 {
1239  return p->get(n);
1240 }
1241 
1242 static TemplateVariant parseDoc(Definition *def,const QCString &file,int line,
1243  const QCString &relPath,const QCString &docStr,bool isBrief)
1244 {
1245  TemplateVariant result;
1246  DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,0,isBrief,FALSE);
1247  QGString docs;
1248  {
1249  FTextStream ts(&docs);
1250  switch (g_globals.outputFormat)
1251  {
1253  {
1254  HtmlCodeGenerator codeGen(ts,relPath);
1255  HtmlDocVisitor visitor(ts,codeGen,def);
1256  root->accept(&visitor);
1257  }
1258  break;
1260  {
1261  LatexCodeGenerator codeGen(ts,relPath,file);
1262  LatexDocVisitor visitor(ts,codeGen,def->getDefFileExtension(),FALSE);
1263  root->accept(&visitor);
1264  }
1265  break;
1266  // TODO: support other generators
1267  default:
1268  err("context.cpp: output format not yet supported");
1269  break;
1270  }
1271  }
1272  bool isEmpty = root->isEmpty();
1273  if (isEmpty)
1274  result = "";
1275  else
1276  result = TemplateVariant(docs,TRUE);
1277  delete root;
1278  return result;
1279 }
1280 
1281 static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath,
1282  const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE)
1283 {
1285  pIntf->resetCodeParserState();
1286  QGString s;
1287  FTextStream t(&s);
1288  switch (g_globals.outputFormat)
1289  {
1291  {
1292  HtmlCodeGenerator codeGen(t,relPath);
1293  pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1294  startLine,endLine,TRUE,md,showLineNumbers,md);
1295  }
1296  break;
1298  {
1299  LatexCodeGenerator codeGen(t,relPath,md->docFile());
1300  pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1301  startLine,endLine,TRUE,md,showLineNumbers,md);
1302  }
1303  break;
1304  // TODO: support other generators
1305  default:
1306  err("context.cpp: output format not yet supported");
1307  break;
1308  }
1309  return TemplateVariant(s.data(),TRUE);
1310 }
1311 
1312 static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
1313 {
1314  static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1316  pIntf->resetCodeParserState();
1317  QGString s;
1318  FTextStream t(&s);
1319  switch (g_globals.outputFormat)
1320  {
1322  {
1323  HtmlCodeGenerator codeGen(t,relPath);
1324  pIntf->parseCode(codeGen,0,
1325  fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1326  fd->getLanguage(), // lang
1327  FALSE, // isExampleBlock
1328  0, // exampleName
1329  fd, // fileDef
1330  -1, // startLine
1331  -1, // endLine
1332  FALSE, // inlineFragment
1333  0, // memberDef
1334  TRUE, // showLineNumbers
1335  0, // searchCtx
1336  TRUE // collectXRefs, TODO: should become FALSE
1337  );
1338  }
1339  break;
1341  {
1342  LatexCodeGenerator codeGen(t,relPath,fd->docFile());
1343  pIntf->parseCode(codeGen,0,
1344  fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1345  fd->getLanguage(), // lang
1346  FALSE, // isExampleBlock
1347  0, // exampleName
1348  fd, // fileDef
1349  -1, // startLine
1350  -1, // endLine
1351  FALSE, // inlineFragment
1352  0, // memberDef
1353  TRUE, // showLineNumbers
1354  0, // searchCtx
1355  TRUE // collectXRefs, TODO: should become FALSE
1356  );
1357  }
1358  break;
1359  // TODO: support other generators
1360  default:
1361  err("context.cpp: output format not yet supported");
1362  break;
1363  }
1364  return TemplateVariant(s.data(),TRUE);
1365 }
1366 
1367 //------------------------------------------------------------------------
1368 
1369 //%% struct Symbol: shared info for all symbols
1370 //%% {
1371 template<typename T>
1373 {
1374  public:
1376  {
1377  assert(d!=0);
1378  }
1380  {
1381  //%% string name: the name of the symbol
1382  inst.addProperty("name",&DefinitionContext::name);
1383  //%% string bareName: the bare name of the symbol with scope info
1384  inst.addProperty("bareName",&DefinitionContext::bareName);
1385  //%% string relPath: the relative path to the root of the output (CREATE_SUBDIRS)
1386  inst.addProperty("relPath",&DefinitionContext::relPath);
1387  //%% string fileName: the file name of the output file associated with the symbol (without extension)
1388  inst.addProperty("fileName",&DefinitionContext::fileName);
1389  //%% string anchor: anchor within the page
1390  inst.addProperty("anchor",&DefinitionContext::anchor);
1391  //%% string details: the detailed documentation for this symbol
1392  inst.addProperty("details",&DefinitionContext::details);
1393  //%% string brief: the brief description for this symbol
1394  inst.addProperty("brief",&DefinitionContext::brief);
1395  //%% string inbodyDocs: the documentation found in the body
1396  inst.addProperty("inbodyDocs",&DefinitionContext::inbodyDocs);
1397  //%% string sourceFileName: the file name of the source file (without extension)
1398  inst.addProperty("sourceFileName",&DefinitionContext::sourceFileName);
1399  //%% bool isLinkable: can the symbol be linked to?
1400  inst.addProperty("isLinkable",&DefinitionContext::isLinkable);
1401  //%% bool isLinkableInProject: can the symbol be linked within this project?
1402  inst.addProperty("isLinkableInProject",&DefinitionContext::isLinkableInProject);
1403  //%% int dynSectionId: identifier that can be used for collapsable sections
1404  inst.addProperty("dynSectionId",&DefinitionContext::dynSectionId);
1405  //%% string language: the programming language in which the symbol is written
1406  inst.addProperty("language",&DefinitionContext::language);
1407  //%% string sourceDef: A link to the source definition
1408  inst.addProperty("sourceDef",&DefinitionContext::sourceDef);
1409  //%% list[Definition] navigationPath: Breadcrumb navigation path to this item
1410  inst.addProperty("navigationPath",&DefinitionContext::navigationPath);
1411  //%% string kind: Kind of compound object: class, namespace, module, package, page, dir
1412  inst.addProperty("compoundKind",&DefinitionContext::compoundKind);
1413  //%% bool isReference: is this definition imported via a tag file
1414  inst.addProperty("isReference",&DefinitionContext::isReference);
1415  //%% string externalReference: the link to the element in the remote documentation
1416  inst.addProperty("externalReference",&DefinitionContext::externalReference);
1417  }
1419  {
1420  return m_def->getOutputFileBase();
1421  }
1423  {
1424  return m_def->anchor();
1425  }
1427  {
1428  return m_def->getSourceFileBase();
1429  }
1431  {
1432  return m_def->isLinkable();
1433  }
1435  {
1436  return m_def->isLinkableInProject();
1437  }
1439  {
1440  return m_def->displayName(TRUE);
1441  }
1443  {
1444  return m_def->displayName(FALSE);
1445  }
1446  QCString relPathAsString() const
1447  {
1448  static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
1449  return createSubdirs ? QCString("../../") : QCString("");
1450  }
1451  virtual TemplateVariant relPath() const
1452  {
1453  return relPathAsString();
1454  }
1456  {
1457  Cachable &cache = getCache();
1458  if (!cache.details || g_globals.outputFormat!=cache.detailsOutputFormat)
1459  {
1460  cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),
1461  relPathAsString(),m_def->documentation(),FALSE)));
1462  cache.detailsOutputFormat = g_globals.outputFormat;
1463  }
1464  return *cache.details;
1465  }
1467  {
1468  Cachable &cache = getCache();
1469  if (!cache.brief || g_globals.outputFormat!=cache.briefOutputFormat)
1470  {
1471  if (m_def->hasBriefDescription())
1472  {
1473  cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
1474  relPathAsString(),m_def->briefDescription(),TRUE)));
1475  cache.briefOutputFormat = g_globals.outputFormat;
1476  }
1477  else
1478  {
1479  cache.brief.reset(new TemplateVariant(""));
1480  }
1481  }
1482  return *cache.brief;
1483  }
1485  {
1486  Cachable &cache = getCache();
1487  if (!cache.inbodyDocs || g_globals.outputFormat!=cache.inbodyDocsOutputFormat)
1488  {
1489  if (!m_def->inbodyDocumentation().isEmpty())
1490  {
1491  cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
1493  cache.inbodyDocsOutputFormat = g_globals.outputFormat;
1494  }
1495  else
1496  {
1497  cache.inbodyDocs.reset(new TemplateVariant(""));
1498  }
1499  }
1500  return *cache.inbodyDocs;
1501  }
1503  {
1504  return g_globals.dynSectionId;
1505  }
1507  {
1508  SrcLangExt lang = m_def->getLanguage();
1509  QCString result = "unknown";
1510  switch (lang)
1511  {
1512  case SrcLangExt_Unknown: break;
1513  case SrcLangExt_IDL: result="idl"; break;
1514  case SrcLangExt_Java: result="java"; break;
1515  case SrcLangExt_CSharp: result="csharp"; break;
1516  case SrcLangExt_D: result="d"; break;
1517  case SrcLangExt_PHP: result="php"; break;
1518  case SrcLangExt_ObjC: result="objc"; break;
1519  case SrcLangExt_Cpp: result="cpp"; break;
1520  case SrcLangExt_JS: result="js"; break;
1521  case SrcLangExt_Python: result="python"; break;
1522  case SrcLangExt_Fortran: result="fortran"; break;
1523  case SrcLangExt_VHDL: result="vhdl"; break;
1524  case SrcLangExt_XML: result="xml"; break;
1525  case SrcLangExt_Tcl: result="tcl"; break;
1526  case SrcLangExt_Markdown: result="markdown"; break;
1527  }
1528  return result;
1529  }
1531  {
1532  QCString result = "unspecified";
1533  switch (m_def->definitionType())
1534  {
1535  case DefinitionIntf::TypeClass: result="class"; break;
1536  case DefinitionIntf::TypeFile: result="file"; break;
1537  case DefinitionIntf::TypeNamespace: result="namespace"; break;
1538  case DefinitionIntf::TypeGroup: result="module"; break;
1539  case DefinitionIntf::TypePackage: result="package"; break;
1540  case DefinitionIntf::TypePage: result="page"; break;
1541  case DefinitionIntf::TypeDir: result="dir"; break;
1542  case DefinitionIntf::TypeMember: // fall through
1544  break;
1545  }
1546  return result;
1547  }
1549  {
1550  Cachable &cache = getCache();
1551  if (cache.sourceDef->count()==2)
1552  {
1553  return cache.sourceDef.get();
1554  }
1555  else
1556  {
1557  return FALSE;
1558  }
1559  }
1560  void fillPath(Definition *def,TemplateList *list) const
1561  {
1562  Definition *outerScope = def->getOuterScope();
1563  Definition::DefType type = def->definitionType();
1564  if (outerScope && outerScope!=Doxygen::globalScope)
1565  {
1566  fillPath(outerScope,list);
1567  }
1568  else if (type==Definition::TypeFile && ((const FileDef*)def)->getDirDef())
1569  {
1570  fillPath(((const FileDef*)def)->getDirDef(),list);
1571  }
1572  list->append(NavPathElemContext::alloc(def));
1573  }
1575  {
1576  Cachable &cache = getCache();
1577  if (!cache.navPath)
1578  {
1581  {
1582  fillPath(m_def->getOuterScope(),list);
1583  }
1584  else if (m_def->definitionType()==Definition::TypeFile && ((const FileDef *)m_def)->getDirDef())
1585  {
1586  fillPath(((const FileDef *)m_def)->getDirDef(),list);
1587  }
1588  cache.navPath.reset(list);
1589  }
1590  return cache.navPath.get();
1591  }
1593  {
1594  return m_def->isReference();
1595  }
1597  {
1599  }
1600 
1601  protected:
1603  {
1607  {
1611 
1612  if (def && !def->getSourceFileBase().isEmpty())
1613  {
1614  lineLink->set("text",def->getStartBodyLine());
1615  lineLink->set("isLinkable",TRUE);
1616  lineLink->set("fileName",def->getSourceFileBase());
1617  lineLink->set("anchor",def->getSourceAnchor());
1618  lineLink->set("isReference",FALSE);
1619  lineLink->set("externalReference","");
1621  {
1622  fileLink->set("text",def->name());
1623  }
1624  else if (def->getBodyDef())
1625  {
1626  fileLink->set("text",def->getBodyDef()->name());
1627  }
1628  else
1629  {
1630  fileLink->set("text",def->displayName(TRUE));
1631  }
1632  fileLink->set("isLinkable",TRUE);
1633  fileLink->set("fileName",def->getSourceFileBase());
1634  fileLink->set("anchor",QCString());
1635  fileLink->set("isReference",FALSE);
1636  fileLink->set("externalReference","");
1639  }
1640  }
1651  };
1652 
1653 
1654  private:
1655  Cachable &getCache() const
1656  {
1657  Cachable *c = static_cast<Cachable*>(m_def->cookie());
1658  assert(c!=0);
1659  return *c;
1660  }
1662 };
1663 //%% }
1664 
1665 //------------------------------------------------------------------------
1666 
1667 //%% struct IncludeInfo: include file information
1668 //%% {
1670 {
1671  public:
1672  Private(const IncludeInfo *info,SrcLangExt lang) :
1673  m_info(info),
1674  m_lang(lang)
1675  {
1676  static bool init=FALSE;
1677  if (!init)
1678  {
1679  s_inst.addProperty("file",&Private::file);
1680  s_inst.addProperty("name",&Private::name);
1681  s_inst.addProperty("isImport",&Private::isImport);
1682  s_inst.addProperty("isLocal",&Private::isLocal);
1683  init=TRUE;
1684  }
1685  }
1686  TemplateVariant get(const char *n) const
1687  {
1688  return s_inst.get(this,n);
1689  }
1691  {
1692  bool isIDLorJava = m_lang==SrcLangExt_IDL || m_lang==SrcLangExt_Java;
1693  return m_info->local || isIDLorJava;
1694  }
1696  {
1697  return m_info->imported || m_lang==SrcLangExt_ObjC;
1698  }
1700  {
1701  if (!m_fileContext && m_info && m_info->fileDef)
1702  {
1704  }
1705  if (m_fileContext)
1706  {
1707  return m_fileContext.get();
1708  }
1709  else
1710  {
1711  return FALSE;
1712  }
1713  }
1715  {
1716  return m_info->includeName;
1717  }
1718  private:
1723 };
1724 
1726 
1728 {
1729  p = new Private(info,lang);
1730 }
1731 
1733 {
1734  delete p;
1735 }
1736 
1738 {
1739  return p->get(n);
1740 }
1741 //%% }
1742 
1743 //------------------------------------------------------------------------
1744 
1745 //%% list IncludeInfoList[Class] : list of nested classes
1747 {
1748  public:
1749  Private(const QList<IncludeInfo> &list,SrcLangExt lang)
1750  {
1751  QListIterator<IncludeInfo> li(list);
1752  IncludeInfo *ii;
1753  for (li.toFirst();(ii=li.current());++li)
1754  {
1755  if (!ii->indirect)
1756  {
1758  }
1759  }
1760  }
1761 };
1762 
1763 IncludeInfoListContext::IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang) : RefCountedContext("IncludeListContext")
1764 {
1765  p = new Private(list,lang);
1766 }
1767 
1769 {
1770  delete p;
1771 }
1772 
1773 // TemplateListIntf
1775 {
1776  return p->count();
1777 }
1778 
1780 {
1781  return p->at(index);
1782 }
1783 
1785 {
1786  return p->createIterator();
1787 }
1788 
1789 //------------------------------------------------------------------------
1790 
1791 //%% struct Class(Symbol): class information
1792 //%% {
1793 class ClassContext::Private : public DefinitionContext<ClassContext::Private>
1794 {
1795  public:
1797  m_classDef(cd)
1798  {
1799  static bool init=FALSE;
1800  if (!init)
1801  {
1803  s_inst.addProperty("title", &Private::title);
1804  s_inst.addProperty("highlight", &Private::highlight);
1805  s_inst.addProperty("subhighlight", &Private::subHighlight);
1806  s_inst.addProperty("hasDetails", &Private::hasDetails);
1807  s_inst.addProperty("generatedFromFiles", &Private::generatedFromFiles);
1808  s_inst.addProperty("usedFiles", &Private::usedFiles);
1809  s_inst.addProperty("hasInheritanceDiagram", &Private::hasInheritanceDiagram);
1810  s_inst.addProperty("inheritanceDiagram", &Private::inheritanceDiagram);
1811  s_inst.addProperty("hasCollaborationDiagram", &Private::hasCollaborationDiagram);
1812  s_inst.addProperty("collaborationDiagram", &Private::collaborationDiagram);
1813  s_inst.addProperty("includeInfo", &Private::includeInfo);
1814  s_inst.addProperty("inherits", &Private::inherits);
1815  s_inst.addProperty("inheritedBy", &Private::inheritedBy);
1816  s_inst.addProperty("unoIDLServices", &Private::unoIDLServices);
1817  s_inst.addProperty("unoIDLInterfaces", &Private::unoIDLInterfaces);
1818  s_inst.addProperty("signals", &Private::signals);
1819  s_inst.addProperty("publicTypes", &Private::publicTypes);
1820  s_inst.addProperty("publicMethods", &Private::publicMethods);
1821  s_inst.addProperty("publicStaticMethods", &Private::publicStaticMethods);
1822  s_inst.addProperty("publicAttributes", &Private::publicAttributes);
1823  s_inst.addProperty("publicStaticAttributes", &Private::publicStaticAttributes);
1824  s_inst.addProperty("publicSlots", &Private::publicSlots);
1825  s_inst.addProperty("protectedTypes", &Private::protectedTypes);
1826  s_inst.addProperty("protectedMethods", &Private::protectedMethods);
1827  s_inst.addProperty("protectedStaticMethods", &Private::protectedStaticMethods);
1828  s_inst.addProperty("protectedAttributes", &Private::protectedAttributes);
1829  s_inst.addProperty("protectedStaticAttributes", &Private::protectedStaticAttributes);
1830  s_inst.addProperty("protectedSlots", &Private::protectedSlots);
1831  s_inst.addProperty("privateTypes", &Private::privateTypes);
1832  s_inst.addProperty("privateMethods", &Private::privateMethods);
1833  s_inst.addProperty("privateStaticMethods", &Private::privateStaticMethods);
1834  s_inst.addProperty("privateAttributes", &Private::privateAttributes);
1835  s_inst.addProperty("privateStaticAttributes", &Private::privateStaticAttributes);
1836  s_inst.addProperty("privateSlots", &Private::privateSlots);
1837  s_inst.addProperty("packageTypes", &Private::packageTypes);
1838  s_inst.addProperty("packageMethods", &Private::packageMethods);
1839  s_inst.addProperty("packageStaticMethods", &Private::packageStaticMethods);
1840  s_inst.addProperty("packageAttributes", &Private::packageAttributes);
1841  s_inst.addProperty("packageStaticAttributes", &Private::packageStaticAttributes);
1842  s_inst.addProperty("properties", &Private::properties);
1843  s_inst.addProperty("events", &Private::events);
1844  s_inst.addProperty("friends", &Private::friends);
1845  s_inst.addProperty("related", &Private::related);
1846  s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
1847  s_inst.addProperty("detailedEnums", &Private::detailedEnums);
1848  s_inst.addProperty("detailedServices", &Private::detailedServices);
1849  s_inst.addProperty("detailedInterfaces", &Private::detailedInterfaces);
1850  s_inst.addProperty("detailedConstructors", &Private::detailedConstructors);
1851  s_inst.addProperty("detailedMethods", &Private::detailedMethods);
1852  s_inst.addProperty("detailedRelated", &Private::detailedRelated);
1853  s_inst.addProperty("detailedVariables", &Private::detailedVariables);
1854  s_inst.addProperty("detailedProperties", &Private::detailedProperties);
1855  s_inst.addProperty("detailedEvents", &Private::detailedEvents);
1856  s_inst.addProperty("classes", &Private::classes);
1857  s_inst.addProperty("innerClasses", &Private::innerClasses);
1858  s_inst.addProperty("compoundType", &Private::compoundType);
1859  s_inst.addProperty("templateDecls", &Private::templateDecls);
1860  s_inst.addProperty("typeConstraints", &Private::typeConstraints);
1861  s_inst.addProperty("examples", &Private::examples);
1862  s_inst.addProperty("members", &Private::members);
1863  s_inst.addProperty("allMembersList", &Private::allMembersList);
1864  s_inst.addProperty("allMembersFileName", &Private::allMembersFileName);
1865  s_inst.addProperty("memberGroups", &Private::memberGroups);
1866  s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
1867  s_inst.addProperty("isSimple", &Private::isSimple);
1868  s_inst.addProperty("categoryOf", &Private::categoryOf);
1869  init=TRUE;
1870  }
1871  if (!cd->cookie()) { cd->setCookie(new ClassContext::Private::Cachable(cd)); }
1872  }
1873  virtual ~Private() {}
1874  TemplateVariant get(const char *n) const
1875  {
1876  return s_inst.get(this,n);
1877  }
1879  {
1880  return TemplateVariant(m_classDef->title());
1881  }
1883  {
1884  return TemplateVariant("classes");
1885  }
1887  {
1888  return TemplateVariant("");
1889  }
1891  {
1893  }
1895  {
1896  return m_classDef->generatedFromFiles();
1897  }
1899  {
1900  Cachable &cache = getCache();
1901  if (!cache.usedFiles)
1902  {
1904  }
1905  return cache.usedFiles.get();
1906  }
1908  {
1909  Cachable &cache = getCache();
1910  if (!cache.classGraph)
1911  {
1913  }
1914  return cache.classGraph.get();
1915  }
1917  {
1918  Cachable &cache = getCache();
1919  if (cache.inheritanceNodes==-1)
1920  {
1922  }
1923  return cache.inheritanceNodes>0;
1924  }
1926  {
1927  bool result=FALSE;
1928  static bool haveDot = Config_getBool(HAVE_DOT);
1929  static bool classDiagrams = Config_getBool(CLASS_DIAGRAMS);
1930  static bool classGraph = Config_getBool(CLASS_GRAPH);
1931  if (haveDot && (classDiagrams || classGraph))
1932  {
1933  DotClassGraph *cg = getClassGraph();
1934  result = !cg->isTrivial() && !cg->isTooBig();
1935  }
1936  else if (classDiagrams)
1937  {
1938  result = numInheritanceNodes()>0;
1939  }
1940  return result;
1941  }
1943  {
1944  QGString result;
1945  static bool haveDot = Config_getBool(HAVE_DOT);
1946  static bool classDiagrams = Config_getBool(CLASS_DIAGRAMS);
1947  static bool classGraph = Config_getBool(CLASS_GRAPH);
1948  if (haveDot && (classDiagrams || classGraph))
1949  {
1950  DotClassGraph *cg = getClassGraph();
1951  FTextStream t(&result);
1952  switch (g_globals.outputFormat)
1953  {
1955  {
1960  );
1961  }
1962  break;
1964  {
1969  );
1970  }
1971  break;
1972  // TODO: support other generators
1973  default:
1974  err("context.cpp: output format not yet supported");
1975  break;
1976  }
1978  }
1979  else if (classDiagrams)
1980  {
1982  FTextStream t(&result);
1983  switch (g_globals.outputFormat)
1984  {
1986  {
1987  QCString name = convertToHtml(m_classDef->displayName());
1988  t << "<div class=\"center\">" << endl;
1989  t << "<img src=\"";
1991  t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>" << endl;
1992  t << "<map id=\"" << convertToId(name) << "_map\" name=\"" << name << "_map\">" << endl;
1994  relPathAsString(),
1996  t << "</div>";
1997  }
1998  break;
2000  {
2002  }
2003  break;
2004  // TODO: support other generators
2005  default:
2006  err("context.cpp: output format not yet supported");
2007  break;
2008  }
2010  }
2011  return TemplateVariant(result.data(),TRUE);
2012  }
2014  {
2015  Cachable &cache = getCache();
2016  if (!cache.collaborationGraph)
2017  {
2019  }
2020  return cache.collaborationGraph.get();
2021  }
2023  {
2024  static bool haveDot = Config_getBool(HAVE_DOT);
2025  return haveDot && !getCollaborationGraph()->isTrivial();
2026  }
2028  {
2029  static bool haveDot = Config_getBool(HAVE_DOT);
2030  QGString result;
2031  if (haveDot)
2032  {
2034  FTextStream t(&result);
2035  switch (g_globals.outputFormat)
2036  {
2038  {
2043  );
2044  }
2045  break;
2047  {
2052  );
2053  }
2054  break;
2055  // TODO: support other generators
2056  default:
2057  err("context.cpp: output format not yet supported");
2058  break;
2059  }
2061  }
2062  return TemplateVariant(result.data(),TRUE);
2063  }
2064 
2066  {
2067  Cachable &cache = getCache();
2068  if (!cache.includeInfo && m_classDef->includeInfo())
2069  {
2071  }
2072  if (cache.includeInfo)
2073  {
2074  return cache.includeInfo.get();
2075  }
2076  else
2077  {
2078  return TemplateVariant(FALSE);
2079  }
2080  }
2082  {
2083  Cachable &cache = getCache();
2084  if (!cache.inheritsList)
2085  {
2087  }
2088  return cache.inheritsList.get();
2089  }
2091  {
2092  Cachable &cache = getCache();
2093  if (!cache.inheritedByList)
2094  {
2096  }
2097  return cache.inheritedByList.get();
2098  }
2100  MemberListType type,const char *title,bool detailed=FALSE) const
2101  {
2102  if (!list)
2103  {
2104  MemberList *ml = m_classDef->getMemberList(type);
2105  if (ml)
2106  {
2108  }
2109  }
2110  if (list)
2111  {
2112  return list.get();
2113  }
2114  else
2115  {
2116  return TemplateVariant(FALSE);
2117  }
2118  }
2120  {
2122  }
2124  {
2126  }
2128  {
2130  }
2132  {
2134  }
2136  {
2140  }
2142  {
2146  }
2148  {
2150  }
2152  {
2154  }
2156  {
2158  }
2160  {
2162  }
2164  {
2166  }
2168  {
2170  }
2172  {
2174  }
2176  {
2178  }
2180  {
2182  }
2184  {
2186  }
2188  {
2190  }
2192  {
2194  }
2196  {
2198  }
2200  {
2202  }
2204  {
2206  }
2208  {
2210  }
2212  {
2214  }
2216  {
2218  }
2220  {
2222  }
2224  {
2226  }
2228  {
2230  }
2232  {
2234  }
2236  {
2238  }
2240  {
2242  }
2244  {
2246  }
2248  {
2250  }
2252  {
2254  }
2256  {
2258  }
2260  {
2262  }
2264  {
2266  }
2268  {
2270  }
2272  {
2274  }
2276  {
2278  }
2280  {
2282  }
2284  {
2285  Cachable &cache = getCache();
2286  if (!cache.classes)
2287  {
2288  TemplateList *classList = TemplateList::alloc();
2289  if (m_classDef->getClassSDict())
2290  {
2292  ClassDef *cd;
2293  for (sdi.toFirst();(cd=sdi.current());++sdi)
2294  {
2295  if (cd->visibleInParentsDeclList())
2296  {
2297  classList->append(ClassContext::alloc(cd));
2298  }
2299  }
2300  }
2301  cache.classes.reset(classList);
2302  }
2303  return cache.classes.get();
2304  }
2306  {
2307  Cachable &cache = getCache();
2308  if (!cache.innerClasses)
2309  {
2310  TemplateList *classList = TemplateList::alloc();
2311  if (m_classDef->getClassSDict())
2312  {
2314  ClassDef *cd;
2315  for (sdi.toFirst();(cd=sdi.current());++sdi)
2316  {
2317  if (cd->name().find('@')==-1 &&
2318  cd->isLinkableInProject() &&
2319  cd->isEmbeddedInOuterScope() &&
2320  cd->partOfGroups()==0
2321  )
2322  {
2323  classList->append(ClassContext::alloc(cd));
2324  }
2325  }
2326  }
2327  cache.innerClasses.reset(classList);
2328  }
2329  return cache.innerClasses.get();
2330  }
2332  {
2333  return m_classDef->compoundTypeString();
2334  }
2336  {
2338  {
2339  Definition *parent = d->getOuterScope();
2340  if (parent)
2341  {
2342  addTemplateDecls(parent,tl);
2343  }
2344  ClassDef *cd=(ClassDef *)d;
2345  if (cd->templateArguments())
2346  {
2348  // since a TemplateVariant does take ownership of the object, we add it
2349  // a separate list just to be able to delete it and avoid a memory leak
2350  tl->append(al);
2351  }
2352  }
2353  }
2354  void addExamples(TemplateList *list) const
2355  {
2356  if (m_classDef->hasExamples())
2357  {
2359  Example *ex;
2360  for (it.toFirst();(ex=it.current());++it)
2361  {
2363  s->set("text",ex->name);
2364  s->set("isLinkable",TRUE);
2365  s->set("anchor",ex->anchor);
2366  s->set("fileName",ex->file);
2367  s->set("isReference",FALSE);
2368  s->set("externalReference","");
2369  list->append(s);
2370  }
2371  }
2372  }
2374  {
2375  Cachable &cache = getCache();
2376  if (!cache.templateDecls)
2377  {
2380  cache.templateDecls.reset(tl);
2381  }
2382  return cache.templateDecls.get();
2383  }
2385  {
2386  if (m_classDef->typeConstraints())
2387  {
2388  Cachable &cache = getCache();
2389  if (!cache.typeConstraints && m_classDef->typeConstraints())
2390  {
2392  }
2393  return cache.typeConstraints.get();
2394  }
2395  return FALSE;
2396  }
2398  {
2399  Cachable &cache = getCache();
2400  if (!cache.examples)
2401  {
2402  TemplateList *exampleList = TemplateList::alloc();
2403  addExamples(exampleList);
2404  cache.examples.reset(exampleList);
2405  }
2406  return cache.examples.get();
2407  }
2409  {
2410  MemberList *ml = cd->getMemberList(lt);
2411  if (ml)
2412  {
2413  Cachable &cache = getCache();
2414  MemberListIterator li(*ml);
2415  const MemberDef *md;
2416  for (li.toFirst();(md=li.current());++li)
2417  {
2418  if (md->isBriefSectionVisible())
2419  {
2420  cache.allMembers.append(md);
2421  }
2422  }
2423  }
2424  }
2426  {
2427  Cachable &cache = getCache();
2428  if (!cache.members)
2429  {
2460  }
2461  return cache.members.get();
2462  }
2464  {
2465  Cachable &cache = getCache();
2466  if (!cache.allMembersList)
2467  {
2469  {
2471  cache.allMembersList.reset(ml);
2472  }
2473  else
2474  {
2476  }
2477  }
2478  return cache.allMembersList.get();
2479  }
2481  {
2483  }
2485  {
2486  Cachable &cache = getCache();
2487  if (!cache.memberGroups)
2488  {
2490  {
2492  }
2493  else
2494  {
2496  }
2497  }
2498  return cache.memberGroups.get();
2499  }
2501  {
2502  Cachable &cache = getCache();
2503  if (!cache.additionalInheritedMembers)
2504  {
2539  cache.additionalInheritedMembers.reset(ctx);
2540  }
2541  return cache.additionalInheritedMembers.get();
2542  }
2544  {
2545  return m_classDef->isSimple();
2546  }
2548  {
2549  Cachable &cache = getCache();
2550  if (!cache.categoryOf && m_classDef->categoryOf())
2551  {
2553  }
2554  if (cache.categoryOf)
2555  {
2556  return cache.categoryOf.get();
2557  }
2558  else
2559  {
2560  return TemplateVariant(FALSE);
2561  }
2562  }
2563 
2564  private:
2566  struct Cachable : public DefinitionContext<ClassContext::Private>::Cachable
2567  {
2569  inheritanceNodes(-1) { }
2629  };
2631  {
2632  Cachable *c = static_cast<Cachable*>(m_classDef->cookie());
2633  assert(c!=0);
2634  return *c;
2635  }
2637 };
2638 //%% }
2639 
2641 
2643 {
2644  //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
2645  p = new Private(cd);
2646 }
2647 
2649 {
2650  delete p;
2651 }
2652 
2654 {
2655  return p->get(n);
2656 }
2657 
2658 //------------------------------------------------------------------------
2659 
2660 //%% struct Namespace(Symbol): namespace information
2661 //%% {
2662 class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private>
2663 {
2664  public:
2666  m_namespaceDef(nd)
2667  {
2668  static bool init=FALSE;
2669  if (!init)
2670  {
2672  s_inst.addProperty("title", &Private::title);
2673  s_inst.addProperty("highlight", &Private::highlight);
2674  s_inst.addProperty("subhighlight", &Private::subHighlight);
2675  s_inst.addProperty("compoundType", &Private::compoundType);
2676  s_inst.addProperty("hasDetails", &Private::hasDetails);
2677  s_inst.addProperty("classes", &Private::classes);
2678  s_inst.addProperty("namespaces", &Private::namespaces);
2679  s_inst.addProperty("constantgroups", &Private::constantgroups);
2680  s_inst.addProperty("typedefs", &Private::typedefs);
2681  s_inst.addProperty("enums", &Private::enums);
2682  s_inst.addProperty("functions", &Private::functions);
2683  s_inst.addProperty("variables", &Private::variables);
2684  s_inst.addProperty("memberGroups", &Private::memberGroups);
2685  s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
2686  s_inst.addProperty("detailedEnums", &Private::detailedEnums);
2687  s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
2688  s_inst.addProperty("detailedVariables", &Private::detailedVariables);
2689  s_inst.addProperty("inlineClasses", &Private::inlineClasses);
2690  init=TRUE;
2691  }
2692  if (!nd->cookie()) { nd->setCookie(new NamespaceContext::Private::Cachable(nd)); }
2693  }
2694  virtual ~Private() {}
2695  TemplateVariant get(const char *n) const
2696  {
2697  return s_inst.get(this,n);
2698  }
2700  {
2702  }
2704  {
2705  return TemplateVariant("namespaces");
2706  }
2708  {
2709  return TemplateVariant("");
2710  }
2712  {
2714  }
2716  {
2718  }
2720  {
2721  Cachable &cache = getCache();
2722  if (!cache.classes)
2723  {
2724  TemplateList *classList = TemplateList::alloc();
2726  {
2728  ClassDef *cd;
2729  for (sdi.toFirst();(cd=sdi.current());++sdi)
2730  {
2731  if (cd->visibleInParentsDeclList())
2732  {
2733  classList->append(ClassContext::alloc(cd));
2734  }
2735  }
2736  }
2737  cache.classes.reset(classList);
2738  }
2739  return cache.classes.get();
2740  }
2742  {
2743  Cachable &cache = getCache();
2744  if (!cache.namespaces)
2745  {
2746  TemplateList *namespaceList = TemplateList::alloc();
2748  {
2750  NamespaceDef *nd;
2751  for (sdi.toFirst();(nd=sdi.current());++sdi)
2752  {
2753  if (nd->isLinkable() && !nd->isConstantGroup())
2754  {
2755  namespaceList->append(NamespaceContext::alloc(nd));
2756  }
2757  }
2758  }
2759  cache.namespaces.reset(namespaceList);
2760  }
2761  return cache.namespaces.get();
2762  }
2764  {
2765  Cachable &cache = getCache();
2766  if (!cache.constantgroups)
2767  {
2768  TemplateList *namespaceList = TemplateList::alloc();
2770  {
2772  NamespaceDef *nd;
2773  for (sdi.toFirst();(nd=sdi.current());++sdi)
2774  {
2775  if (nd->isLinkable() && nd->isConstantGroup())
2776  {
2777  namespaceList->append(NamespaceContext::alloc(nd));
2778  }
2779  }
2780  }
2781  cache.constantgroups.reset(namespaceList);
2782  }
2783  return cache.constantgroups.get();
2784  }
2786  MemberListType type,const char *title,bool detailed=FALSE) const
2787  {
2788  if (!list)
2789  {
2791  if (ml)
2792  {
2794  }
2795  }
2796  if (list)
2797  {
2798  return list.get();
2799  }
2800  else
2801  {
2802  return TemplateVariant(FALSE);
2803  }
2804  }
2806  {
2808  }
2810  {
2812  }
2814  {
2815  QCString title = theTranslator->trFunctions();
2817  if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
2818  else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
2820  }
2822  {
2824  }
2826  {
2827  Cachable &cache = getCache();
2828  if (!cache.memberGroups)
2829  {
2831  {
2833  }
2834  else
2835  {
2837  }
2838  }
2839  return cache.memberGroups.get();
2840  }
2842  {
2844  }
2846  {
2848  }
2850  {
2855  }
2857  {
2859  }
2861  {
2862  Cachable &cache = getCache();
2863  if (!cache.inlineClasses)
2864  {
2865  TemplateList *classList = TemplateList::alloc();
2867  {
2869  ClassDef *cd;
2870  for (sdi.toFirst();(cd=sdi.current());++sdi)
2871  {
2872  if (cd->name().find('@')==-1 &&
2873  cd->isLinkableInProject() &&
2874  cd->isEmbeddedInOuterScope() &&
2875  cd->partOfGroups()==0)
2876  {
2877  classList->append(ClassContext::alloc(cd));
2878  }
2879  }
2880  }
2881  cache.inlineClasses.reset(classList);
2882  }
2883  return cache.inlineClasses.get();
2884  }
2885  private:
2887  struct Cachable : public DefinitionContext<NamespaceContext::Private>::Cachable
2888  {
2903  };
2905  {
2906  Cachable *c = static_cast<Cachable*>(m_namespaceDef->cookie());
2907  assert(c!=0);
2908  return *c;
2909  }
2911 };
2912 //%% }
2913 
2915 
2917 {
2918  p = new Private(nd);
2919 }
2920 
2922 {
2923  delete p;
2924 }
2925 
2927 {
2928  return p->get(n);
2929 }
2930 
2931 //------------------------------------------------------------------------
2932 
2933 //%% struct File(Symbol): file information
2934 //%% {
2935 class FileContext::Private : public DefinitionContext<FileContext::Private>
2936 {
2937  public:
2939  {
2940  if (fd==0) abort();
2941  static bool init=FALSE;
2942  if (!init)
2943  {
2945  s_inst.addProperty("title", &Private::title);
2946  s_inst.addProperty("highlight", &Private::highlight);
2947  s_inst.addProperty("subhighlight", &Private::subHighlight);
2948  s_inst.addProperty("versionInfo", &Private::versionInfo);
2949  s_inst.addProperty("includeList", &Private::includeList);
2950  s_inst.addProperty("hasIncludeGraph", &Private::hasIncludeGraph);
2951  s_inst.addProperty("hasIncludedByGraph", &Private::hasIncludedByGraph);
2952  s_inst.addProperty("includeGraph", &Private::includeGraph);
2953  s_inst.addProperty("includedByGraph", &Private::includedByGraph);
2954  s_inst.addProperty("hasDetails", &Private::hasDetails);
2955  s_inst.addProperty("hasSourceFile", &Private::hasSourceFile);
2956  s_inst.addProperty("sources", &Private::sources);
2957  s_inst.addProperty("version", &Private::version);
2958  s_inst.addProperty("classes", &Private::classes);
2959  s_inst.addProperty("namespaces", &Private::namespaces);
2960  s_inst.addProperty("constantgroups", &Private::constantgroups);
2961  s_inst.addProperty("macros", &Private::macros);
2962  s_inst.addProperty("typedefs", &Private::typedefs);
2963  s_inst.addProperty("enums", &Private::enums);
2964  s_inst.addProperty("functions", &Private::functions);
2965  s_inst.addProperty("variables", &Private::variables);
2966  s_inst.addProperty("memberGroups", &Private::memberGroups);
2967  s_inst.addProperty("detailedMacros", &Private::detailedMacros);
2968  s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
2969  s_inst.addProperty("detailedEnums", &Private::detailedEnums);
2970  s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
2971  s_inst.addProperty("detailedVariables", &Private::detailedVariables);
2972  s_inst.addProperty("inlineClasses", &Private::inlineClasses);
2973  s_inst.addProperty("compoundType", &Private::compoundType);
2974  init=TRUE;
2975  }
2976  if (!fd->cookie()) { fd->setCookie(new FileContext::Private::Cachable(fd)); }
2977  }
2978  virtual ~Private() {}
2979  TemplateVariant get(const char *n) const
2980  {
2981  return s_inst.get(this,n);
2982  }
2984  {
2985  return m_fileDef->title();
2986  }
2988  {
2989  return TemplateVariant("files");
2990  }
2992  {
2993  return TemplateVariant("");
2994  }
2996  {
2997  return m_fileDef->getVersion();
2998  }
3000  {
3001  Cachable &cache = getCache();
3002  if (!cache.includeInfoList && m_fileDef->includeFileList())
3003  {
3006  }
3007  if (cache.includeInfoList)
3008  {
3009  return cache.includeInfoList.get();
3010  }
3011  else
3012  {
3013  return TemplateVariant(FALSE);
3014  }
3015  }
3017  {
3018  Cachable &cache = getCache();
3019  if (!cache.includeGraph)
3020  {
3021  cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
3022  }
3023  return cache.includeGraph.get();
3024  }
3026  {
3027  static bool haveDot = Config_getBool(HAVE_DOT);
3028  DotInclDepGraph *incGraph = getIncludeGraph();
3029  return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
3030  }
3032  {
3033  static bool haveDot = Config_getBool(HAVE_DOT);
3034  QGString result;
3035  if (haveDot)
3036  {
3038  FTextStream t(&result);
3039  switch (g_globals.outputFormat)
3040  {
3042  {
3047  );
3048  }
3049  break;
3051  {
3056  );
3057  }
3058  break;
3059  // TODO: support other generators
3060  default:
3061  err("context.cpp: output format not yet supported");
3062  break;
3063  }
3065  }
3066  return TemplateVariant(result.data(),TRUE);
3067  }
3069  {
3070  Cachable &cache = getCache();
3071  if (!cache.includedByGraph)
3072  {
3074  }
3075  return cache.includedByGraph.get();
3076  }
3078  {
3079  static bool haveDot = Config_getBool(HAVE_DOT);
3080  DotInclDepGraph *incGraph = getIncludedByGraph();
3081  return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
3082  }
3084  {
3085  static bool haveDot = Config_getBool(HAVE_DOT);
3086  QGString result;
3087  if (haveDot)
3088  {
3090  FTextStream t(&result);
3091  switch (g_globals.outputFormat)
3092  {
3094  {
3099  );
3100  }
3101  break;
3103  {
3108  );
3109  }
3110  break;
3111  // TODO: support other generators
3112  default:
3113  err("context.cpp: output format not yet supported");
3114  break;
3115  }
3117  }
3118  return TemplateVariant(result.data(),TRUE);
3119  }
3121  {
3123  }
3125  {
3126  return m_fileDef->generateSourceFile();
3127  }
3129  {
3130  Cachable &cache = getCache();
3131  if (!cache.sources)
3132  {
3134  {
3136  }
3137  else
3138  {
3139  cache.sources.reset(new TemplateVariant(""));
3140  }
3141  }
3142  return *cache.sources;
3143  }
3145  {
3146  return m_fileDef->fileVersion();
3147  }
3149  {
3150  Cachable &cache = getCache();
3151  if (!cache.classes)
3152  {
3153  TemplateList *classList = TemplateList::alloc();
3154  if (m_fileDef->getClassSDict())
3155  {
3157  ClassDef *cd;
3158  for (sdi.toFirst();(cd=sdi.current());++sdi)
3159  {
3160  if (cd->visibleInParentsDeclList())
3161  {
3162  classList->append(ClassContext::alloc(cd));
3163  }
3164  }
3165  }
3166  cache.classes.reset(classList);
3167  }
3168  return cache.classes.get();
3169  }
3171  {
3172  Cachable &cache = getCache();
3173  if (!cache.namespaces)
3174  {
3175  TemplateList *namespaceList = TemplateList::alloc();
3177  {
3179  NamespaceDef *nd;
3180  for (sdi.toFirst();(nd=sdi.current());++sdi)
3181  {
3182  if (nd->isLinkable() && !nd->isConstantGroup())
3183  {
3184  namespaceList->append(NamespaceContext::alloc(nd));
3185  }
3186  }
3187  }
3188  cache.namespaces.reset(namespaceList);
3189  }
3190  return cache.namespaces.get();
3191  }
3193  {
3194  Cachable &cache = getCache();
3195  if (!cache.constantgroups)
3196  {
3197  TemplateList *namespaceList = TemplateList::alloc();
3199  {
3201  NamespaceDef *nd;
3202  for (sdi.toFirst();(nd=sdi.current());++sdi)
3203  {
3204  if (nd->isLinkable() && nd->isConstantGroup())
3205  {
3206  namespaceList->append(NamespaceContext::alloc(nd));
3207  }
3208  }
3209  }
3210  cache.constantgroups.reset(namespaceList);
3211  }
3212  return cache.constantgroups.get();
3213  }
3215  MemberListType type,const char *title,bool detailed=FALSE) const
3216  {
3217  if (!list)
3218  {
3219  MemberList *ml = m_fileDef->getMemberList(type);
3220  if (ml)
3221  {
3223  }
3224  }
3225  if (list)
3226  {
3227  return list.get();
3228  }
3229  else
3230  {
3231  return TemplateVariant(FALSE);
3232  }
3233  }
3235  {
3237  }
3239  {
3241  }
3243  {
3245  }
3247  {
3248  QCString title = theTranslator->trFunctions();
3249  SrcLangExt lang = m_fileDef->getLanguage();
3250  if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
3251  else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
3253  }
3255  {
3257  }
3259  {
3260  Cachable &cache = getCache();
3261  if (!cache.memberGroups)
3262  {
3264  {
3266  }
3267  else
3268  {
3270  }
3271  }
3272  return cache.memberGroups.get();
3273  }
3275  {
3277  }
3279  {
3281  }
3283  {
3285  }
3287  {
3289  SrcLangExt lang = m_fileDef->getLanguage();
3292  }
3294  {
3296  }
3298  {
3299  Cachable &cache = getCache();
3300  if (!cache.inlineClasses)
3301  {
3302  TemplateList *classList = TemplateList::alloc();
3303  if (m_fileDef->getClassSDict())
3304  {
3306  ClassDef *cd;
3307  for (sdi.toFirst();(cd=sdi.current());++sdi)
3308  {
3309  if (cd->name().find('@')==-1 &&
3310  cd->isLinkableInProject() &&
3311  cd->isEmbeddedInOuterScope() &&
3312  cd->partOfGroups()==0)
3313  {
3314  classList->append(ClassContext::alloc(cd));
3315  }
3316  }
3317  }
3318  cache.inlineClasses.reset(classList);
3319  }
3320  return cache.inlineClasses.get();
3321  }
3323  {
3324  return theTranslator->trFile(FALSE,TRUE);
3325  }
3326 
3327  private:
3329  struct Cachable : public DefinitionContext<FileContext::Private>::Cachable
3330  {
3351  };
3353  {
3354  Cachable *c = static_cast<Cachable*>(m_fileDef->cookie());
3355  assert(c!=0);
3356  return *c;
3357  }
3359 };
3360 //%% }
3361 
3363 
3365 {
3366  p = new Private(fd);
3367 }
3368 
3370 {
3371  delete p;
3372 }
3373 
3374 TemplateVariant FileContext::get(const char *n) const
3375 {
3376  return p->get(n);
3377 }
3378 
3379 //------------------------------------------------------------------------
3380 
3381 //%% struct Dir(Symbol): directory information
3382 //%% {
3383 class DirContext::Private : public DefinitionContext<DirContext::Private>
3384 {
3385  public:
3387  {
3388  static bool init=FALSE;
3389  if (!init)
3390  {
3392  s_inst.addProperty("title", &Private::title);
3393  s_inst.addProperty("highlight", &Private::highlight);
3394  s_inst.addProperty("subhighlight", &Private::subHighlight);
3395  s_inst.addProperty("dirName", &Private::dirName);
3396  s_inst.addProperty("dirs", &Private::dirs);
3397  s_inst.addProperty("files", &Private::files);
3398  s_inst.addProperty("hasDetails", &Private::hasDetails);
3399  s_inst.addProperty("hasDirGraph", &Private::hasDirGraph);
3400  s_inst.addProperty("dirGraph", &Private::dirGraph);
3401  s_inst.addProperty("compoundType", &Private::compoundType);
3402  init=TRUE;
3403  }
3404  if (!dd->cookie()) { dd->setCookie(new DirContext::Private::Cachable(dd)); }
3405  }
3406  virtual ~Private() {}
3407  TemplateVariant get(const char *n) const
3408  {
3409  return s_inst.get(this,n);
3410  }
3412  {
3413  return TemplateVariant(m_dirDef->shortTitle());
3414  }
3416  {
3417  return TemplateVariant("files");
3418  }
3420  {
3421  return TemplateVariant("");
3422  }
3424  {
3425  return TemplateVariant(m_dirDef->shortName());
3426  }
3428  {
3429  Cachable &cache = getCache();
3430  if (!cache.dirs)
3431  {
3432  cache.dirs.reset(TemplateList::alloc());
3433  const DirList &subDirs = m_dirDef->subDirs();
3434  QListIterator<DirDef> it(subDirs);
3435  DirDef *dd;
3436  for (it.toFirst();(dd=it.current());++it)
3437  {
3438  DirContext *dc = new DirContext(dd);
3439  cache.dirs->append(dc);
3440  }
3441  }
3442  return cache.dirs.get();
3443  }
3445  {
3446  Cachable &cache = getCache();
3447  if (!cache.files)
3448  {
3449  cache.files.reset(TemplateList::alloc());
3451  if (files)
3452  {
3453  QListIterator<FileDef> it(*files);
3454  FileDef *fd;
3455  for (it.toFirst();(fd=it.current());++it)
3456  {
3457  FileContext *fc = FileContext::alloc(fd);
3458  cache.files->append(fc);
3459  }
3460  }
3461  }
3462  return cache.files.get();
3463  }
3465  {
3466  return m_dirDef->hasDetailedDescription();
3467  }
3469  {
3470  return theTranslator->trDir(FALSE,TRUE);
3471  }
3473  {
3474  return "";
3475  }
3477  {
3478  Cachable &cache = getCache();
3479  if (!cache.dirDepsGraph)
3480  {
3481  cache.dirDepsGraph.reset(new DotDirDeps(m_dirDef));
3482  }
3483  return cache.dirDepsGraph.get();
3484  }
3486  {
3487  bool result=FALSE;
3488  static bool haveDot = Config_getBool(HAVE_DOT);
3489  static bool dirGraph = Config_getBool(DIRECTORY_GRAPH);
3490  if (haveDot && dirGraph)
3491  {
3492  DotDirDeps *graph = getDirDepsGraph();
3493  result = !graph->isTrivial();
3494  }
3495  return result;
3496  }
3498  {
3499  QGString result;
3500  static bool haveDot = Config_getBool(HAVE_DOT);
3501  static bool dirGraph = Config_getBool(DIRECTORY_GRAPH);
3502  if (haveDot && dirGraph)
3503  {
3504  DotDirDeps *graph = getDirDepsGraph();
3505  FTextStream t(&result);
3506  switch (g_globals.outputFormat)
3507  {
3509  {
3510  graph->writeGraph(t,GOF_BITMAP,
3511  EOF_Html,
3514  relPathAsString(),
3515  TRUE,
3517  FALSE);
3518  }
3519  break;
3521  {
3522  graph->writeGraph(t,GOF_EPS,
3523  EOF_LaTeX,
3526  relPathAsString(),
3527  TRUE,
3529  FALSE);
3530  }
3531  break;
3532  // TODO: support other generators
3533  default:
3534  err("context.cpp: output format not yet supported");
3535  break;
3536  }
3538  }
3539  return TemplateVariant(result.data(),TRUE);
3540  }
3541 
3542  private:
3544  struct Cachable : public DefinitionContext<DirContext::Private>::Cachable
3545  {
3550  };
3552  {
3553  Cachable *c = static_cast<Cachable*>(m_dirDef->cookie());
3554  assert(c!=0);
3555  return *c;
3556  }
3558 };
3559 //%% }
3560 
3562 
3564 {
3565  p = new Private(fd);
3566 }
3567 
3569 {
3570  delete p;
3571 }
3572 
3573 TemplateVariant DirContext::get(const char *n) const
3574 {
3575  return p->get(n);
3576 }
3577 
3578 //------------------------------------------------------------------------
3579 
3580 //%% struct Page(Symbol): page information
3581 //%% {
3582 class PageContext::Private : public DefinitionContext<PageContext::Private>
3583 {
3584  public:
3585  Private(PageDef *pd,bool isMainPage,bool isExample)
3586  : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage),
3587  m_isExample(isExample)
3588  {
3589  static bool init=FALSE;
3590  if (!init)
3591  {
3593  s_inst.addProperty("title", &Private::title);
3594  s_inst.addProperty("highlight", &Private::highlight);
3595  s_inst.addProperty("subhighlight",&Private::subHighlight);
3596  s_inst.addProperty("example", &Private::example);
3597  init=TRUE;
3598  }
3599  if (!pd->cookie()) { pd->setCookie(new PageContext::Private::Cachable(pd)); }
3600  }
3601  virtual ~Private() {}
3602  TemplateVariant get(const char *n) const
3603  {
3604  return s_inst.get(this,n);
3605  }
3607  {
3608  if (m_isMainPage)
3609  {
3610  if (mainPageHasTitle())
3611  {
3612  return m_pageDef->title();
3613  }
3614  else
3615  {
3616  return theTranslator->trMainPage();
3617  }
3618  }
3619  else if (m_isExample)
3620  {
3621  return m_pageDef->name();
3622  }
3623  else
3624  {
3625  return m_pageDef->title();
3626  }
3627  }
3629  {
3630  if (m_isMainPage)
3631  {
3632  return "";
3633  }
3634  else
3635  {
3637  }
3638  }
3640  {
3641  if (m_isMainPage)
3642  {
3643  return "main";
3644  }
3645  else
3646  {
3647  return "pages";
3648  }
3649  }
3651  {
3652  return "";
3653  }
3655  {
3656  if (m_isExample)
3657  {
3658  Cachable &cache = getCache();
3659  if (!cache.example || g_globals.outputFormat!=cache.exampleOutputFormat)
3660  {
3661  cache.example.reset(new TemplateVariant(
3663  relPathAsString(),"\\include "+m_pageDef->name(),FALSE)));
3665  }
3666  return *cache.example;
3667  }
3668  else
3669  {
3670  return TemplateVariant("");
3671  }
3672  }
3673  private:
3675  struct Cachable : public DefinitionContext<PageContext::Private>::Cachable
3676  {
3681  };
3683  {
3684  Cachable *c = static_cast<Cachable*>(m_pageDef->cookie());
3685  assert(c!=0);
3686  return *c;
3687  }
3691 };
3692 //%% }
3693 
3695 
3696 PageContext::PageContext(PageDef *pd,bool isMainPage,bool isExample) : RefCountedContext("PageContext")
3697 {
3698  p = new Private(pd,isMainPage,isExample);
3699 }
3700 
3702 {
3703  delete p;
3704 }
3705 
3706 TemplateVariant PageContext::get(const char *n) const
3707 {
3708  return p->get(n);
3709 }
3710 
3711 //------------------------------------------------------------------------
3712 
3714 {
3715  public:
3716  TextGeneratorHtml(FTextStream &ts,const QCString &relPath)
3717  : m_ts(ts), m_relPath(relPath) {}
3718  void writeString(const char *s,bool keepSpaces) const
3719  {
3720  if (s==0) return;
3721  if (keepSpaces)
3722  {
3723  const char *p=s;
3724  char c;
3725  while ((c=*p++))
3726  {
3727  switch(c)
3728  {
3729  case '<': m_ts << "&lt;"; break;
3730  case '>': m_ts << "&gt;"; break;
3731  case '\'': m_ts << "&#39;"; break;
3732  case '"': m_ts << "&quot;"; break;
3733  case '&': m_ts << "&amp;"; break;
3734  case ' ': m_ts << "&#160;"; break;
3735  }
3736  }
3737  }
3738  else
3739  {
3740  m_ts << convertToHtml(s);
3741  }
3742  }
3743 
3744  void writeBreak(int indent) const
3745  {
3746  m_ts << "<br />";
3747  for (int i=0;i<indent;i++)
3748  {
3749  m_ts << "&#160;";
3750  }
3751  }
3752 
3753  void writeLink(const char *ref,const char *f,
3754  const char *anchor,const char *name
3755  ) const
3756  {
3757  if (ref)
3758  {
3759  m_ts << "<a class=\"elRef\" ";
3760  m_ts << externalLinkTarget() << externalRef(m_relPath,ref,FALSE);
3761  }
3762  else
3763  {
3764  m_ts << "<a class=\"el\" ";
3765  }
3766  m_ts << "href=\"";
3767  m_ts << externalRef(m_relPath,ref,TRUE);
3768  if (f) m_ts << f << Doxygen::htmlFileExtension;
3769  if (anchor) m_ts << "#" << anchor;
3770  m_ts << "\">";
3771  m_ts << convertToHtml(name);
3772  m_ts << "</a>";
3773  }
3774 
3775  private:
3777  QCString m_relPath;
3778 };
3779 
3780 //------------------------------------------------------------------------
3781 
3783 {
3784  public:
3786  void writeString(const char *s,bool keepSpaces) const
3787  {
3788  if (s==0) return;
3789  m_ts << convertToLaTeX(s,FALSE,keepSpaces);
3790  }
3791  void writeBreak(int indent) const
3792  {
3793  m_ts << "\\\\*\n";
3794  for (int i=0;i<indent;i++)
3795  {
3796  m_ts << "~";
3797  }
3798  }
3799  void writeLink(const char *ref,const char *f,
3800  const char *anchor,const char *text
3801  ) const
3802  {
3803  static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
3804  if (!ref && pdfHyperlinks)
3805  {
3806  m_ts << "\\hyperlink{";
3807  if (f) m_ts << stripPath(f);
3808  if (f && anchor) m_ts << "_";
3809  if (anchor) m_ts << anchor;
3810  m_ts << "}{";
3811  filterLatexString(m_ts,text);
3812  m_ts << "}";
3813  }
3814  else
3815  {
3816  m_ts << "{\\bf ";
3817  filterLatexString(m_ts,text);
3818  m_ts << "}";
3819  }
3820  }
3821 
3822  private:
3824 };
3825 
3826 //------------------------------------------------------------------------
3827 
3829 {
3830  public:
3832  {
3833  static TextGeneratorFactory *instance = 0;
3834  if (instance==0) instance = new TextGeneratorFactory;
3835  return instance;
3836  }
3837  TextGeneratorIntf *create(FTextStream &ts,const QCString &relPath)
3838  {
3839  switch (g_globals.outputFormat)
3840  {
3842  return new TextGeneratorHtml(ts,relPath);
3844  return new TextGeneratorLatex(ts);
3845  default:
3846  break;
3847  }
3848  return 0;
3849  }
3850  private:
3853 };
3854 
3855 TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const QCString &text)
3856 {
3857  QGString s;
3858  FTextStream ts(&s);
3860  if (tg)
3861  {
3862  linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text);
3863  delete tg;
3864  return TemplateVariant(s.data(),TRUE);
3865  }
3866  else
3867  {
3868  return text;
3869  }
3870 }
3871 
3872 //%% struct Member(Symbol): member information
3873 //%% {
3874 class MemberContext::Private : public DefinitionContext<MemberContext::Private>
3875 {
3876  public:
3878  {
3879  static bool init=FALSE;
3880  if (!init)
3881  {
3883  s_inst.addProperty("isSignal", &Private::isSignal);
3884  s_inst.addProperty("isSlot", &Private::isSlot);
3885  s_inst.addProperty("isVariable", &Private::isVariable);
3886  s_inst.addProperty("isEnumeration", &Private::isEnumeration);
3887  s_inst.addProperty("isEnumValue", &Private::isEnumValue);
3888  s_inst.addProperty("isTypedef", &Private::isTypedef);
3889  s_inst.addProperty("isFunction", &Private::isFunction);
3890  s_inst.addProperty("isFunctionPtr", &Private::isFunctionPtr);
3891  s_inst.addProperty("isDefine", &Private::isDefine);
3892  s_inst.addProperty("isFriend", &Private::isFriend);
3893  s_inst.addProperty("isProperty", &Private::isProperty);
3894  s_inst.addProperty("isEvent", &Private::isEvent);
3895  s_inst.addProperty("isRelated", &Private::isRelated);
3896  s_inst.addProperty("isForeign", &Private::isForeign);
3897  s_inst.addProperty("isStatic", &Private::isStatic);
3898  s_inst.addProperty("isInline", &Private::isInline);
3899  s_inst.addProperty("isExplicit", &Private::isExplicit);
3900  s_inst.addProperty("isMutable", &Private::isMutable);
3901  s_inst.addProperty("isGettable", &Private::isGettable);
3902  s_inst.addProperty("isPrivateGettable", &Private::isPrivateGettable);
3903  s_inst.addProperty("isProtectedGettable", &Private::isProtectedGettable);
3904  s_inst.addProperty("isSettable", &Private::isSettable);
3905  s_inst.addProperty("isPrivateSettable", &Private::isPrivateSettable);
3906  s_inst.addProperty("isProtectedSettable", &Private::isProtectedSettable);
3907  s_inst.addProperty("isReadable", &Private::isReadable);
3908  s_inst.addProperty("isWritable", &Private::isWritable);
3909  s_inst.addProperty("isAddable", &Private::isAddable);
3910  s_inst.addProperty("isRemovable", &Private::isRemovable);
3911  s_inst.addProperty("isRaisable", &Private::isRaisable);
3912  s_inst.addProperty("isFinal", &Private::isFinal);
3913  s_inst.addProperty("isAbstract", &Private::isAbstract);
3914  s_inst.addProperty("isOverride", &Private::isOverride);
3915  s_inst.addProperty("isInitonly", &Private::isInitonly);
3916  s_inst.addProperty("isOptional", &Private::isOptional);
3917  s_inst.addProperty("isRequired", &Private::isRequired);
3918  s_inst.addProperty("isNonAtomic", &Private::isNonAtomic);
3919  s_inst.addProperty("isCopy", &Private::isCopy);
3920  s_inst.addProperty("isAssign", &Private::isAssign);
3921  s_inst.addProperty("isRetain", &Private::isRetain);
3922  s_inst.addProperty("isWeak", &Private::isWeak);
3923  s_inst.addProperty("isStrong", &Private::isStrong);
3924  s_inst.addProperty("isUnretained", &Private::isUnretained);
3925  s_inst.addProperty("isNew", &Private::isNew);
3926  s_inst.addProperty("isSealed", &Private::isSealed);
3927  s_inst.addProperty("isImplementation", &Private::isImplementation);
3928  s_inst.addProperty("isExternal", &Private::isExternal);
3929  s_inst.addProperty("isAlias", &Private::isAlias);
3930  s_inst.addProperty("isDefault", &Private::isDefault);
3931  s_inst.addProperty("isDelete", &Private::isDelete);
3932  s_inst.addProperty("isNoExcept", &Private::isNoExcept);
3933  s_inst.addProperty("isAttribute", &Private::isAttribute);
3934  s_inst.addProperty("isUNOProperty", &Private::isUNOProperty);
3935  s_inst.addProperty("isReadonly", &Private::isReadonly);
3936  s_inst.addProperty("isBound", &Private::isBound);
3937  s_inst.addProperty("isConstrained", &Private::isConstrained);
3938  s_inst.addProperty("isTransient", &Private::isTransient);
3939  s_inst.addProperty("isMaybeVoid", &Private::isMaybeVoid);
3940  s_inst.addProperty("isMaybeDefault", &Private::isMaybeDefault);
3941  s_inst.addProperty("isMaybeAmbiguous", &Private::isMaybeAmbiguous);
3942  s_inst.addProperty("isPublished", &Private::isPublished);
3943  s_inst.addProperty("isTemplateSpecialization",&Private::isTemplateSpecialization);
3944  s_inst.addProperty("isObjCMethod", &Private::isObjCMethod);
3945  s_inst.addProperty("isObjCProperty", &Private::isObjCProperty);
3946  s_inst.addProperty("isAnonymous", &Private::isAnonymous);
3947  s_inst.addProperty("hasParameters", &Private::hasParameters);
3948  s_inst.addProperty("declType", &Private::declType);
3949  s_inst.addProperty("declArgs", &Private::declArgs);
3950  s_inst.addProperty("anonymousType", &Private::anonymousType);
3951  s_inst.addProperty("anonymousMember", &Private::anonymousMember);
3952  s_inst.addProperty("hasDetails", &Private::hasDetails);
3953  s_inst.addProperty("exception", &Private::exception);
3954  s_inst.addProperty("bitfields", &Private::bitfields);
3955  s_inst.addProperty("initializer", &Private::initializer);
3956  s_inst.addProperty("initializerAsCode", &Private::initializerAsCode);
3957  s_inst.addProperty("hasOneLineInitializer", &Private::hasOneLineInitializer);
3958  s_inst.addProperty("hasMultiLineInitializer", &Private::hasMultiLineInitializer);
3959  s_inst.addProperty("templateArgs", &Private::templateArgs);
3960  s_inst.addProperty("templateAlias", &Private::templateAlias);
3961  s_inst.addProperty("propertyAttrs", &Private::propertyAttrs);
3962  s_inst.addProperty("eventAttrs", &Private::eventAttrs);
3963  s_inst.addProperty("category", &Private::category);
3964  s_inst.addProperty("categoryRelation", &Private::categoryRelation);
3965  s_inst.addProperty("class", &Private::getClass);
3966  s_inst.addProperty("file", &Private::getFile);
3967  s_inst.addProperty("namespace", &Private::getNamespace);
3968  s_inst.addProperty("definition", &Private::definition);
3969  s_inst.addProperty("parameters", &Private::parameters);
3970  s_inst.addProperty("hasConstQualifier", &Private::hasConstQualifier);
3971  s_inst.addProperty("hasVolatileQualifier",&Private::hasVolatileQualifier);
3972  s_inst.addProperty("trailingReturnType", &Private::trailingReturnType);
3973  s_inst.addProperty("extraTypeChars", &Private::extraTypeChars);
3974  s_inst.addProperty("templateDecls", &Private::templateDecls);
3975  s_inst.addProperty("labels", &Private::labels);
3976  s_inst.addProperty("enumBaseType", &Private::enumBaseType);
3977  s_inst.addProperty("enumValues", &Private::enumValues);
3978  s_inst.addProperty("paramDocs", &Private::paramDocs);
3979  s_inst.addProperty("reimplements", &Private::reimplements);
3980  s_inst.addProperty("implements", &Private::implements);
3981  s_inst.addProperty("reimplementedBy", &Private::reimplementedBy);
3982  s_inst.addProperty("implementedBy", &Private::implementedBy);
3983  s_inst.addProperty("examples", &Private::examples);
3984  s_inst.addProperty("typeConstraints", &Private::typeConstraints);
3985  s_inst.addProperty("functionQualifier", &Private::functionQualifier);
3986  s_inst.addProperty("sourceRefs", &Private::sourceRefs);
3987  s_inst.addProperty("sourceRefBys", &Private::sourceRefBys);
3988  s_inst.addProperty("hasSources", &Private::hasSources);
3989  s_inst.addProperty("sourceCode", &Private::sourceCode);
3990  s_inst.addProperty("hasCallGraph", &Private::hasCallGraph);
3991  s_inst.addProperty("callGraph", &Private::callGraph);
3992  s_inst.addProperty("hasCallerGraph", &Private::hasCallerGraph);
3993  s_inst.addProperty("callerGraph", &Private::callerGraph);
3994  s_inst.addProperty("fieldType", &Private::fieldType);
3995  s_inst.addProperty("type", &Private::type);
3996  s_inst.addProperty("detailsVisibleFor", &Private::detailsVisibleFor);
3997  s_inst.addProperty("nameWithContextFor", &Private::nameWithContextFor);
3998  init=TRUE;
3999  }
4000  if (!md->cookie()) { md->setCookie(new MemberContext::Private::Cachable(md)); }
4001 
4002  Cachable &cache = getCache();
4004  if (md && md->isProperty())
4005  {
4006  if (md->isGettable()) cache.propertyAttrs->append("get");
4007  if (md->isPrivateGettable()) cache.propertyAttrs->append("private get");
4008  if (md->isProtectedGettable()) cache.propertyAttrs->append("protected get");
4009  if (md->isSettable()) cache.propertyAttrs->append("set");
4010  if (md->isPrivateSettable()) cache.propertyAttrs->append("private set");
4011  if (md->isProtectedSettable()) cache.propertyAttrs->append("protected set");
4012  }
4014  if (md && md->isEvent())
4015  {
4016  if (md->isAddable()) cache.eventAttrs->append("add");
4017  if (md->isRemovable()) cache.eventAttrs->append("remove");
4018  if (md->isRaisable()) cache.eventAttrs->append("raise");
4019  }
4020  }
4021  virtual ~Private() {}
4022  TemplateVariant get(const char *n) const
4023  {
4024  return s_inst.get(this,n);
4025  }
4027  {
4029  }
4031  {
4032  Cachable &cache = getCache();
4033  if (!cache.declTypeParsed)
4034  {
4036  cache.declTypeParsed = TRUE;
4037  return cache.declType;
4038  }
4039  else
4040  {
4041  return cache.declType;
4042  }
4043  }
4045  {
4046  Cachable &cache = getCache();
4047  if (!cache.declArgsParsed)
4048  {
4050  cache.declArgsParsed = TRUE;
4051  return cache.declArgs;
4052  }
4053  else
4054  {
4055  return cache.declArgs;
4056  }
4057  }
4059  {
4061  }
4063  {
4065  }
4067  {
4068  return m_memberDef->isStatic();
4069  }
4071  {
4072  return m_memberDef->isObjCMethod();
4073  }
4075  {
4076  return m_memberDef->isObjCProperty();
4077  }
4079  {
4080  return m_memberDef->isImplementation();
4081  }
4083  {
4084  return m_memberDef->isSignal();
4085  }
4087  {
4088  return m_memberDef->isSlot();
4089  }
4091  {
4092  return m_memberDef->isTypedef();
4093  }
4095  {
4096  return m_memberDef->isFunction();
4097  }
4099  {
4100  return m_memberDef->isFunctionPtr();
4101  }
4103  {
4104  return m_memberDef->isFriend();
4105  }
4107  {
4108  return m_memberDef->isForeign();
4109  }
4111  {
4112  return m_memberDef->isEvent();
4113  }
4115  {
4116  return m_memberDef->isInline();
4117  }
4119  {
4120  return m_memberDef->isExplicit();
4121  }
4123  {
4124  return m_memberDef->isMutable();
4125  }
4127  {
4128  return m_memberDef->isGettable();
4129  }
4131  {
4132  return m_memberDef->isPrivateGettable();
4133  }
4135  {
4136  return m_memberDef->isProtectedGettable();
4137  }
4139  {
4140  return m_memberDef->isSettable();
4141  }
4143  {
4144  return m_memberDef->isPrivateSettable();
4145  }
4147  {
4148  return m_memberDef->isProtectedSettable();
4149  }
4151  {
4152  return m_memberDef->isReadable();
4153  }
4155  {
4156  return m_memberDef->isWritable();
4157  }
4159  {
4160  return m_memberDef->isAddable();
4161  }
4163  {
4164  return m_memberDef->isRemovable();
4165  }
4167  {
4168  return m_memberDef->isRaisable();
4169  }
4171  {
4172  return m_memberDef->isFinal();
4173  }
4175  {
4176  return m_memberDef->isAbstract();
4177  }
4179  {
4180  return m_memberDef->isOverride();
4181  }
4183  {
4184  return m_memberDef->isInitonly();
4185  }
4187  {
4188  return m_memberDef->isOptional();
4189  }
4191  {
4192  return m_memberDef->isRequired();
4193  }
4195  {
4196  return m_memberDef->isNonAtomic();
4197  }
4199  {
4200  return m_memberDef->isCopy();
4201  }
4203  {
4204  return m_memberDef->isAssign();
4205  }
4207  {
4208  return m_memberDef->isRetain();
4209  }
4211  {
4212  return m_memberDef->isWeak();
4213  }
4215  {
4216  return m_memberDef->isStrong();
4217  }
4219  {
4220  return m_memberDef->isUnretained();
4221  }
4223  {
4224  return m_memberDef->isNew();
4225  }
4227  {
4228  return m_memberDef->isSealed();
4229  }
4231  {
4232  return m_memberDef->isExternal();
4233  }
4235  {
4236  return m_memberDef->isAlias();
4237  }
4239  {
4240  return m_memberDef->isDefault();
4241  }
4243  {
4244  return m_memberDef->isDelete();
4245  }
4247  {
4248  return m_memberDef->isNoExcept();
4249  }
4251  {
4252  return m_memberDef->isAttribute();
4253  }
4255  {
4256  return m_memberDef->isUNOProperty();
4257  }
4259  {
4260  return m_memberDef->isReadonly();
4261  }
4263  {
4264  return m_memberDef->isBound();
4265  }
4267  {
4268  return m_memberDef->isConstrained();
4269  }
4271  {
4272  return m_memberDef->isTransient();
4273  }
4275  {
4276  return m_memberDef->isMaybeVoid();
4277  }
4279  {
4280  return m_memberDef->isMaybeDefault();
4281  }
4283  {
4284  return m_memberDef->isMaybeAmbiguous();
4285  }
4287  {
4288  return m_memberDef->isPublished();
4289  }
4291  {
4293  }
4295  {
4296  return m_memberDef->isProperty();
4297  }
4299  {
4300  return m_memberDef->isEnumValue();
4301  }
4303  {
4304  return m_memberDef->isVariable();
4305  }
4307  {
4308  return m_memberDef->isEnumerate();
4309  }
4311  {
4313  }
4315  {
4317  }
4319  {
4320  Cachable &cache = getCache();
4321  if (!cache.initializerParsed)
4322  {
4323  QCString scopeName;
4324  if (m_memberDef->getClassDef())
4325  {
4326  scopeName = m_memberDef->getClassDef()->name();
4327  }
4328  else if (m_memberDef->getNamespaceDef())
4329  {
4330  scopeName = m_memberDef->getNamespaceDef()->name();
4331  }
4332  cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
4334  cache.initializerParsed = TRUE;
4335  }
4336  return cache.initializer;
4337  }
4339  {
4340  return m_memberDef->isDefine();
4341  }
4343  {
4344  QCString name = m_memberDef->name();
4345  return !name.isEmpty() && name.at(0)=='@';
4346  }
4348  {
4349  Cachable &cache = getCache();
4350  if (!cache.anonymousType)
4351  {
4353  if (cd)
4354  {
4356  }
4357  }
4358  if (cache.anonymousType)
4359  {
4360  return cache.anonymousType.get();
4361  }
4362  else
4363  {
4364  return FALSE;
4365  }
4366  }
4368  {
4369  Cachable &cache = getCache();
4370  if (!cache.anonymousMember)
4371  {
4373  if (md)
4374  {
4376  }
4377  }
4378  if (cache.anonymousMember)
4379  {
4380  return cache.anonymousMember.get();
4381  }
4382  else
4383  {
4384  return FALSE;
4385  }
4386  }
4388  {
4389  return m_memberDef->isRelated();
4390  }
4392  {
4393  return m_memberDef->enumBaseType();
4394  }
4396  {
4398  }
4400  {
4402  }
4404  {
4405  Cachable &cache = getCache();
4406  if (!cache.enumValues)
4407  {
4409  if (ml)
4410  {
4412  }
4413  else
4414  {
4416  }
4417  }
4418  return cache.enumValues.get();
4419  }
4421  {
4422  Cachable &cache = getCache();
4423  if (!cache.templateArgs && m_memberDef->templateArguments())
4424  {
4426  }
4427  if (cache.templateArgs)
4428  {
4429  return cache.templateArgs.get();
4430  }
4431  else
4432  {
4433  return TemplateVariant(FALSE);
4434  }
4435  }
4437  {
4438  if (m_memberDef->isAlias())
4439  {
4441  QCString(" = ")+m_memberDef->typeString());
4442  }
4443  return "";
4444  }
4446  {
4447  return getCache().propertyAttrs.get();
4448  }
4450  {
4451  return getCache().eventAttrs.get();
4452  }
4454  {
4455  Cachable &cache = getCache();
4456  if (!cache.classDef && m_memberDef->getClassDef())
4457  {
4459  }
4460  if (cache.classDef)
4461  {
4462  return cache.classDef.get();
4463  }
4464  else
4465  {
4466  return TemplateVariant(FALSE);
4467  }
4468  }
4470  {
4471  Cachable &cache = getCache();
4472  if (!cache.category && m_memberDef->category())
4473  {
4475  }
4476  if (cache.category)
4477  {
4478  return cache.category.get();
4479  }
4480  else
4481  {
4482  return TemplateVariant(FALSE);
4483  }
4484  }
4486  {
4487  Cachable &cache = getCache();
4489  {
4491  }
4492  if (cache.categoryRelation)
4493  {
4494  return cache.categoryRelation.get();
4495  }
4496  else
4497  {
4498  return TemplateVariant(FALSE);
4499  }
4500  }
4502  {
4503  Cachable &cache = getCache();
4504  if (!cache.fileDef && m_memberDef->getFileDef())
4505  {
4507  }
4508  if (cache.fileDef)
4509  {
4510  return cache.fileDef.get();
4511  }
4512  else
4513  {
4514  return TemplateVariant(FALSE);
4515  }
4516  }
4518  {
4519  Cachable &cache = getCache();
4520  if (!cache.namespaceDef && m_memberDef->getNamespaceDef())
4521  {
4523  }
4524  if (cache.namespaceDef)
4525  {
4526  return cache.namespaceDef.get();
4527  }
4528  else
4529  {
4530  return TemplateVariant(FALSE);
4531  }
4532  }
4534  {
4537  }
4539  {
4540  return (m_memberDef->isDocsForDefinition()) ?
4542  }
4544  {
4545  Cachable &cache = getCache();
4546  if (!cache.arguments)
4547  {
4548  ArgumentList *defArgList = getDefArgList();
4549  if (defArgList && !m_memberDef->isProperty())
4550  {
4552  }
4553  else
4554  {
4556  }
4557  }
4558  return cache.arguments.get();
4559  }
4561  {
4562  return getDefArgList()!=0;
4563  }
4565  {
4566  ArgumentList *al = getDefArgList();
4567  return al ? al->constSpecifier : FALSE;
4568  }
4570  {
4571  ArgumentList *al = getDefArgList();
4572  return al ? al->volatileSpecifier : FALSE;
4573  }
4575  {
4576  ArgumentList *al = getDefArgList();
4577  if (al && !al->trailingReturnType.isEmpty())
4578  {
4580  al->trailingReturnType);
4581  }
4582  else
4583  {
4584  return "";
4585  }
4586  }
4588  {
4589  return m_memberDef->extraTypeChars();
4590  }
4592  {
4595  {
4596  QListIterator<ArgumentList> ali(*m_memberDef->definitionTemplateParameterLists());
4597  ArgumentList *tal;
4598  for (ali.toFirst();(tal=ali.current());++ali)
4599  {
4600  if (tal->count()>0)
4601  {
4603  tl->append(al);
4604  }
4605  }
4606  }
4607  else
4608  {
4610  {
4611  QList<ArgumentList> tempParamLists;
4612  cd->getTemplateParameterLists(tempParamLists);
4613  //printf("#tempParamLists=%d\n",tempParamLists.count());
4614  QListIterator<ArgumentList> ali(tempParamLists);
4615  ArgumentList *tal;
4616  for (ali.toFirst();(tal=ali.current());++ali)
4617  {
4618  if (tal->count()>0)
4619  {
4621  tl->append(al);
4622  }
4623  }
4624  }
4625  if (m_memberDef->templateArguments()) // function template prefix
4626  {
4629  tl->append(al);
4630  }
4631  }
4632  }
4634  {
4635  Cachable &cache = getCache();
4636  if (!cache.templateDecls)
4637  {
4639  addTemplateDecls(tl);
4640  cache.templateDecls.reset(tl);
4641  }
4642  return cache.templateDecls.get();
4643  }
4645  {
4646  Cachable &cache = getCache();
4647  if (!cache.labels)
4648  {
4649  QStrList sl;
4652  if (sl.count()>0)
4653  {
4654  QStrListIterator it(sl);
4655  for (;it.current();++it)
4656  {
4657  tl->append(*it);
4658  }
4659  }
4660  cache.labels.reset(tl);
4661  }
4662  return cache.labels.get();
4663  }
4665  {
4666  Cachable &cache = getCache();
4667  if (!cache.paramDocs)
4668  {
4670  {
4671  QCString paramDocs;
4673  Argument *a;
4674  // convert the parameter documentation into a list of @param commands
4675  for (ali.toFirst();(a=ali.current());++ali)
4676  {
4677  if (a->hasDocumentation())
4678  {
4679  QCString direction = extractDirection(a->docs);
4680  paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
4681  }
4682  }
4685  relPathAsString(),paramDocs,FALSE)));
4686  }
4687  else
4688  {
4689  cache.paramDocs.reset(new TemplateVariant(""));
4690  }
4691  }
4692  return *cache.paramDocs;
4693  }
4695  {
4696  Cachable &cache = getCache();
4697  if (!cache.implements)
4698  {
4701  if (md)
4702  {
4703  ClassDef *cd = md->getClassDef();
4704  if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
4705  {
4707  cache.implements->append(mc);
4708  }
4709  }
4710  }
4711  return cache.implements.get();
4712  }
4714  {
4715  Cachable &cache = getCache();
4716  if (!cache.reimplements)
4717  {
4720  if (md)
4721  {
4722  ClassDef *cd = md->getClassDef();
4723  if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
4724  {
4726  cache.reimplements->append(mc);
4727  }
4728  }
4729  }
4730  return cache.reimplements.get();
4731  }
4733  {
4734  Cachable &cache = getCache();
4735  if (!cache.implementedBy)
4736  {
4739  if (ml)
4740  {
4741  MemberListIterator mli(*ml);
4742  MemberDef *md=0;
4743  for (mli.toFirst();(md=mli.current());++mli)
4744  {
4745  ClassDef *cd = md->getClassDef();
4746  if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
4747  {
4748  MemberContext *mc = new MemberContext(md);
4749  cache.implementedBy->append(mc);
4750  }
4751  }
4752  }
4753  }
4754  return cache.implementedBy.get();
4755  }
4757  {
4758  Cachable &cache = getCache();
4759  if (!cache.reimplementedBy)
4760  {
4763  if (ml)
4764  {
4765  MemberListIterator mli(*ml);
4766  MemberDef *md=0;
4767  for (mli.toFirst();(md=mli.current());++mli)
4768  {
4769  ClassDef *cd = md->getClassDef();
4770  if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
4771  {
4772  MemberContext *mc = new MemberContext(md);
4773  cache.reimplementedBy->append(mc);
4774  }
4775  }
4776  }
4777  }
4778  return cache.reimplementedBy.get();
4779  }
4780  void addExamples(TemplateList *list) const
4781  {
4782  if (m_memberDef->hasExamples())
4783  {
4785  Example *ex;
4786  for (it.toFirst();(ex=it.current());++it)
4787  {
4789  s->set("text",ex->name);
4790  s->set("isLinkable",TRUE);
4791  s->set("anchor",ex->anchor);
4792  s->set("fileName",ex->file);
4793  s->set("isReference",FALSE);
4794  s->set("externalReference","");
4795  list->append(s);
4796  }
4797  }
4798  }
4800  {
4801  Cachable &cache = getCache();
4802  if (!cache.examples)
4803  {
4804  TemplateList *exampleList = TemplateList::alloc();
4805  addExamples(exampleList);
4806  cache.examples.reset(exampleList);
4807  }
4808  return cache.examples.get();
4809  }
4811  {
4812  Cachable &cache = getCache();
4813  if (!cache.typeConstraints && m_memberDef->typeConstraints())
4814  {
4816  }
4817  else
4818  {
4820  }
4821  return cache.typeConstraints.get();
4822  }
4824  {
4825  if (!m_memberDef->isObjCMethod() &&
4828  )
4829  )
4830  {
4831  return "()";
4832  }
4833  else
4834  {
4835  return "";
4836  }
4837  }
4839  {
4840  Cachable &cache = getCache();
4841  if (!cache.sourceRefs)
4842  {
4844  }
4845  return cache.sourceRefs.get();
4846  }
4848  {
4849  Cachable &cache = getCache();
4850  if (!cache.sourceRefBys)
4851  {
4853  }
4854  return cache.sourceRefBys.get();
4855  }
4857  {
4859  }
4861  {
4862  Cachable &cache = getCache();
4863  if (!cache.sourceCodeParsed)
4864  {
4865  QCString codeFragment;
4866  FileDef *fd = m_memberDef->getBodyDef();
4867  int startLine = m_memberDef->getStartBodyLine();
4868  int endLine = m_memberDef->getEndBodyLine();
4869  if (fd && readCodeFragment(fd->absFilePath(),
4870  startLine,endLine,codeFragment)
4871  )
4872  {
4873  QCString scopeName;
4874  if (m_memberDef->getClassDef())
4875  {
4876  scopeName = m_memberDef->getClassDef()->name();
4877  }
4878  else if (m_memberDef->getNamespaceDef())
4879  {
4880  scopeName = m_memberDef->getNamespaceDef()->name();
4881  }
4882  cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
4883  cache.sourceCodeParsed = TRUE;
4884  }
4885  }
4886  return cache.sourceCode;
4887  }
4889  {
4890  Cachable &cache = getCache();
4891  if (!cache.callGraph)
4892  {
4893  cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
4894  }
4895  return cache.callGraph.get();
4896  }
4898  {
4899  static bool haveDot = Config_getBool(HAVE_DOT);
4900  if (m_memberDef->hasCallGraph() && haveDot &&
4902  {
4903  DotCallGraph *cg = getCallGraph();
4904  return !cg->isTooBig() && !cg->isTrivial();
4905  }
4906  return TemplateVariant(FALSE);
4907  }
4909  {
4910  if (hasCallGraph().toBool())
4911  {
4912  DotCallGraph *cg = getCallGraph();
4913  QGString result;
4914  FTextStream t(&result);
4915  switch (g_globals.outputFormat)
4916  {
4918  {
4923  );
4924  }
4925  break;
4927  {
4932  );
4933  }
4934  break;
4935  // TODO: support other generators
4936  default:
4937  err("context.cpp: output format not yet supported");
4938  break;
4939  }
4941  return TemplateVariant(result.data(),TRUE);
4942  }
4943  else
4944  {
4945  return TemplateVariant("");
4946  }
4947  }
4949  {
4950  Cachable &cache = getCache();
4951  if (!cache.callerGraph)
4952  {
4953  cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
4954  }
4955  return cache.callerGraph.get();
4956  }
4958  {
4959  static bool haveDot = Config_getBool(HAVE_DOT);
4960  if (m_memberDef->hasCallerGraph() && haveDot &&
4962  {
4963  DotCallGraph *cg = getCallerGraph();
4964  return !cg->isTooBig() && !cg->isTrivial();
4965  }
4966  return TemplateVariant(FALSE);
4967  }
4969  {
4970  if (hasCallerGraph().toBool())
4971  {
4972  DotCallGraph *cg = getCallerGraph();
4973  QGString result;
4974  FTextStream t(&result);
4975  switch (g_globals.outputFormat)
4976  {
4978  {
4983  );
4984  }
4985  break;
4987  {
4992  );
4993  }
4994  break;
4995  // TODO: support other generators
4996  default:
4997  err("context.cpp: output format not yet supported");
4998  break;
4999  }
5001  return TemplateVariant(result.data(),TRUE);
5002  }
5003  else
5004  {
5005  return TemplateVariant("");
5006  }
5007  }
5009  {
5010  return m_memberDef->typeString();
5011  }
5012  TemplateVariant handleDetailsVisibleFor(const QValueList<TemplateVariant> &args) const
5013  {
5014  if (args.count()==1)
5015  {
5016  return m_memberDef->isDetailedSectionVisible(args[0].toString()=="module",args[0].toString()=="file");
5017  }
5018  else
5019  {
5020  err(".detailsVisibleFor should take one string argument, got %d\n",args.count());
5021  }
5022  return TemplateVariant();
5023  }
5025  {
5026  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDetailsVisibleFor>(this);
5027  }
5028  TemplateVariant handleNameWithContextFor(const QValueList<TemplateVariant> &args) const
5029  {
5030  if (args.count()==1)
5031  {
5033  QCString n = m_memberDef->name();
5034  QCString ctx = args[0].toString();
5035  QCString sep = getLanguageSpecificSeparator(lang,TRUE);
5037  {
5038  n.prepend(m_memberDef->getEnumScope()->displayName()+sep);
5039  }
5040  if (ctx=="module" && m_memberDef->getClassDef() && !m_memberDef->isRelated())
5041  {
5042  n.prepend(m_memberDef->getClassDef()->displayName()+sep);
5043  }
5044  else if ((ctx=="module" || ctx=="file") && m_memberDef->getNamespaceDef())
5045  {
5046  n.prepend(m_memberDef->getNamespaceDef()->displayName()+sep);
5047  }
5048  return n;
5049  }
5050  else
5051  {
5052  err(".nameWithContextFor should take one string argument, got %d\n",args.count());
5053  }
5054  return TemplateVariant();
5055  }
5057  {
5058  return TemplateVariant::Delegate::fromMethod<Private,&Private::handleNameWithContextFor>(this);
5059  }
5060  private:
5062  struct Cachable : public DefinitionContext<MemberContext::Private>::Cachable
5063  {
5065  initializerParsed(FALSE), sourceCodeParsed(FALSE),
5066  declArgsParsed(FALSE), declTypeParsed(FALSE) { }
5101  };
5103  {
5104  Cachable *c = static_cast<Cachable*>(m_memberDef->cookie());
5105  assert(c!=0);
5106  return *c;
5107  }
5109 };
5110 //%% }
5111 
5113 
5115 {
5116  p = new Private(md);
5117 }
5118 
5120 {
5121  delete p;
5122 }
5123 
5125 {
5126  return p->get(n);
5127 }
5128 
5129 
5130 //------------------------------------------------------------------------
5131 
5132 //%% struct Module(Symbol): group information
5133 //%% {
5134 class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
5135 {
5136  public:
5138  {
5139  static bool init=FALSE;
5140  if (!init)
5141  {
5143  s_inst.addProperty("title", &Private::title);
5144  s_inst.addProperty("highlight", &Private::highlight);
5145  s_inst.addProperty("subhighlight", &Private::subHighlight);
5146  s_inst.addProperty("hasGroupGraph", &Private::hasGroupGraph);
5147  s_inst.addProperty("groupGraph", &Private::groupGraph);
5148  s_inst.addProperty("hasDetails", &Private::hasDetails);
5149  s_inst.addProperty("modules", &Private::modules);
5150  s_inst.addProperty("dirs", &Private::dirs);
5151  s_inst.addProperty("files", &Private::files);
5152  s_inst.addProperty("namespaces", &Private::namespaces);
5153  s_inst.addProperty("classes", &Private::classes);
5154  s_inst.addProperty("constantgroups", &Private::constantgroups);
5155  s_inst.addProperty("examples", &Private::examples);
5156  s_inst.addProperty("macros", &Private::macros);
5157  s_inst.addProperty("typedefs", &Private::typedefs);
5158  s_inst.addProperty("enums", &Private::enums);
5159  s_inst.addProperty("enumvalues", &Private::enumValues);
5160  s_inst.addProperty("functions", &Private::functions);
5161  s_inst.addProperty("variables", &Private::variables);
5162  s_inst.addProperty("signals", &Private::signals);
5163  s_inst.addProperty("publicSlots", &Private::publicSlots);
5164  s_inst.addProperty("protectedSlots", &Private::protectedSlots);
5165  s_inst.addProperty("privateSlots", &Private::privateSlots);
5166  s_inst.addProperty("events", &Private::events);
5167  s_inst.addProperty("properties", &Private::properties);
5168  s_inst.addProperty("friends", &Private::friends);
5169  s_inst.addProperty("memberGroups", &Private::memberGroups);
5170  s_inst.addProperty("detailedMacros", &Private::detailedMacros);
5171  s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
5172  s_inst.addProperty("detailedEnums", &Private::detailedEnums);
5173  s_inst.addProperty("detailedEnumValues", &Private::detailedEnumValues);
5174  s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
5175  s_inst.addProperty("detailedVariables", &Private::detailedVariables);
5176  s_inst.addProperty("detailedSignals", &Private::detailedSignals);
5177  s_inst.addProperty("detailedPublicSlots", &Private::detailedPublicSlots);
5178  s_inst.addProperty("detailedProtectedSlots", &Private::detailedProtectedSlots);
5179  s_inst.addProperty("detailedPrivateSlots", &Private::detailedPrivateSlots);
5180  s_inst.addProperty("detailedEvents", &Private::detailedEvents);
5181  s_inst.addProperty("detailedProperties", &Private::detailedProperties);
5182  s_inst.addProperty("detailedFriends", &Private::detailedFriends);
5183  s_inst.addProperty("inlineClasses", &Private::inlineClasses);
5184  s_inst.addProperty("compoundType", &Private::compoundType);
5185  init=TRUE;
5186  }
5187  if (!gd->cookie()) { gd->setCookie(new ModuleContext::Private::Cachable(gd)); }
5188  }
5189  virtual ~Private() {}
5190  TemplateVariant get(const char *n) const
5191  {
5192  return s_inst.get(this,n);
5193  }
5195  {
5197  }
5199  {
5200  return TemplateVariant("modules");
5201  }
5203  {
5204  return TemplateVariant("");
5205  }
5207  {
5208  Cachable &cache = getCache();
5209  if (!cache.groupGraph)
5210  {
5212  }
5213  return cache.groupGraph.get();
5214  }
5216  {
5217  bool result=FALSE;
5218  static bool haveDot = Config_getBool(HAVE_DOT);
5219  static bool groupGraphs = Config_getBool(GROUP_GRAPHS);
5220  if (haveDot && groupGraphs)
5221  {
5223  result = !graph->isTrivial();
5224  }
5225  return result;
5226  }
5228  {
5229  QGString result;
5230  static bool haveDot = Config_getBool(HAVE_DOT);
5231  static bool groupGraphs = Config_getBool(GROUP_GRAPHS);
5232  if (haveDot && groupGraphs)
5233  {
5235  FTextStream t(&result);
5236  switch (g_globals.outputFormat)
5237  {
5239  {
5240  graph->writeGraph(t,GOF_BITMAP,
5241  EOF_Html,
5244  relPathAsString(),
5245  TRUE,
5247  }
5248  break;
5250  {
5251  graph->writeGraph(t,GOF_EPS,
5252  EOF_LaTeX,
5255  relPathAsString(),
5256  TRUE,
5258  }
5259  break;
5260  // TODO: support other generators
5261  default:
5262  err("context.cpp: output format not yet supported");
5263  break;
5264  }
5266  }
5267  return TemplateVariant(result.data(),TRUE);
5268  }
5270  {
5272  }
5274  {
5275  Cachable &cache = getCache();
5276  if (!cache.modules)
5277  {
5278  TemplateList *moduleList = TemplateList::alloc();
5279  if (m_groupDef->getSubGroups())
5280  {
5282  GroupDef *gd;
5283  for (gli.toFirst();(gd=gli.current());++gli)
5284  {
5285  if (gd->isVisible())
5286  {
5287  moduleList->append(ModuleContext::alloc(gd));
5288  }
5289  }
5290  }
5291  cache.modules.reset(moduleList);
5292  }
5293  return cache.modules.get();
5294  }
5296  {
5297  Cachable &cache = getCache();
5298  if (!cache.examples)
5299  {
5300  TemplateList *exampleList = TemplateList::alloc();
5301  if (m_groupDef->getExamples())
5302  {
5304  PageDef *ex;
5305  for (eli.toFirst();(ex=eli.current());++eli)
5306  {
5307  exampleList->append(PageContext::alloc(ex,FALSE,TRUE));
5308  }
5309  }
5310  cache.examples.reset(exampleList);
5311  }
5312  return cache.examples.get();
5313  }
5315  {
5316  Cachable &cache = getCache();
5317  if (!cache.pages)
5318  {
5319  TemplateList *pageList = TemplateList::alloc();
5320  if (m_groupDef->getExamples())
5321  {
5323  PageDef *ex;
5324  for (eli.toFirst();(ex=eli.current());++eli)
5325  {
5326  pageList->append(PageContext::alloc(ex,FALSE,TRUE));
5327  }
5328  }
5329  cache.pages.reset(pageList);
5330  }
5331  return cache.pages.get();
5332  }
5334  {
5335  Cachable &cache = getCache();
5336  if (!cache.dirs)
5337  {
5338  TemplateList *dirList = TemplateList::alloc();
5339  if (m_groupDef->getDirs())
5340  {
5341  QListIterator<DirDef> it(*m_groupDef->getDirs());
5342  DirDef *dd;
5343  for (it.toFirst();(dd=it.current());++it)
5344  {
5345  dirList->append(DirContext::alloc(dd));
5346  }
5347  }
5348  cache.dirs.reset(dirList);
5349  }
5350  return cache.dirs.get();
5351  }
5353  {
5354  Cachable &cache = getCache();
5355  if (!cache.files)
5356  {
5357  TemplateList *fileList = TemplateList::alloc();
5358  if (m_groupDef->getFiles())
5359  {
5360  QListIterator<FileDef> it(*m_groupDef->getFiles());
5361  FileDef *fd;
5362  for (it.toFirst();(fd=it.current());++it)
5363  {
5364  fileList->append(FileContext::alloc(fd));
5365  }
5366  }
5367  cache.files.reset(fileList);
5368  }
5369  return cache.files.get();
5370  }
5372  {
5373  Cachable &cache = getCache();
5374  if (!cache.classes)
5375  {
5376  TemplateList *classList = TemplateList::alloc();
5377  if (m_groupDef->getClasses())
5378  {
5380  ClassDef *cd;
5381  for (sdi.toFirst();(cd=sdi.current());++sdi)
5382  {
5383  if (cd->visibleInParentsDeclList())
5384  {
5385  classList->append(ClassContext::alloc(cd));
5386  }
5387  }
5388  }
5389  cache.classes.reset(classList);
5390  }
5391  return cache.classes.get();
5392  }
5394  {
5395  Cachable &cache = getCache();
5396  if (!cache.namespaces)
5397  {
5398  TemplateList *namespaceList = TemplateList::alloc();
5399  if (m_groupDef->getNamespaces())
5400  {
5402  NamespaceDef *nd;
5403  for (sdi.toFirst();(nd=sdi.current());++sdi)
5404  {
5405  if (nd->isLinkable() && !nd->isConstantGroup())
5406  {
5407  namespaceList->append(NamespaceContext::alloc(nd));
5408  }
5409  }
5410  }
5411  cache.namespaces.reset(namespaceList);
5412  }
5413  return cache.namespaces.get();
5414  }
5416  {
5417  Cachable &cache = getCache();
5418  if (!cache.constantgroups)
5419  {
5420  TemplateList *namespaceList = TemplateList::alloc();
5421  if (m_groupDef->getNamespaces())
5422  {
5424  NamespaceDef *nd;
5425  for (sdi.toFirst();(nd=sdi.current());++sdi)
5426  {
5427  if (nd->isLinkable() && nd->isConstantGroup())
5428  {
5429  namespaceList->append(NamespaceContext::alloc(nd));
5430  }
5431  }
5432  }
5433  cache.constantgroups.reset(namespaceList);
5434  }
5435  return cache.constantgroups.get();
5436  }
5437 
5439  MemberListType type,const char *title,bool detailed=FALSE) const
5440  {
5441  if (!list)
5442  {
5443  MemberList *ml = m_groupDef->getMemberList(type);
5444  if (ml)
5445  {
5447  }
5448  }
5449  if (list)
5450  {
5451  return list.get();
5452  }
5453  else
5454  {
5455  return TemplateVariant(FALSE);
5456  }
5457  }
5459  {
5461  }
5463  {
5465  }
5467  {
5469  }
5471  {
5473  }
5475  {
5476  QCString title = theTranslator->trFunctions();
5477  SrcLangExt lang = m_groupDef->getLanguage();
5478  if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
5479  else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
5481  }
5483  {
5485  }
5487  {
5489  }
5491  {
5493  }
5495  {
5497  }
5499  {
5501  }
5503  {
5505  }
5507  {
5509  }
5511  {
5513  }
5515  {
5516  Cachable &cache = getCache();
5517  if (!cache.memberGroups)
5518  {
5520  {
5522  }
5523  else
5524  {
5526  }
5527  }
5528  return cache.memberGroups.get();
5529  }
5531  {
5533  }
5535  {
5537  }
5539  {
5541  }
5543  {
5545  }
5547  {
5549  SrcLangExt lang = m_groupDef->getLanguage();
5552  }
5554  {
5556  }
5558  {
5560  }
5562  {
5564  }
5566  {
5568  }
5570  {
5572  }
5574  {
5576  }
5578  {
5580  }
5582  {
5584  }
5586  {
5587  Cachable &cache = getCache();
5588  if (!cache.inlineClasses)
5589  {
5590  TemplateList *classList = TemplateList::alloc();
5591  if (m_groupDef->getClasses())
5592  {
5594  ClassDef *cd;
5595  for (sdi.toFirst();(cd=sdi.current());++sdi)
5596  {
5597  if (cd->name().find('@')==-1 &&
5598  cd->isLinkableInProject() &&
5599  cd->isEmbeddedInOuterScope() &&
5600  cd->partOfGroups()==0)
5601  {
5602  classList->append(ClassContext::alloc(cd));
5603  }
5604  }
5605  }
5606  cache.inlineClasses.reset(classList);
5607  }
5608  return cache.inlineClasses.get();
5609  }
5611  {
5612  return "module"; //theTranslator->trGroup(FALSE,TRUE);
5613  }
5614  private:
5616  struct Cachable : public DefinitionContext<ModuleContext::Private>::Cachable
5617  {
5656  };
5658  {
5659  Cachable *c = static_cast<Cachable*>(m_groupDef->cookie());
5660  assert(c!=0);
5661  return *c;
5662  }
5664 };
5665 //%% }
5666 
5668 
5670 {
5671  p = new Private(gd);
5672 }
5673 
5675 {
5676  delete p;
5677 }
5678 
5680 {
5681  return p->get(n);
5682 }
5683 
5684 //------------------------------------------------------------------------
5685 
5686 //%% list ClassList[Class] : list of classes
5688 {
5689  public:
5690  void addClasses(const ClassSDict &classSDict)
5691  {
5692  ClassSDict::Iterator cli(classSDict);
5693  ClassDef *cd;
5694  for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
5695  {
5696  if (cd->getLanguage()==SrcLangExt_VHDL &&
5699  ) // no architecture
5700  {
5701  continue;
5702  }
5703  if (cd->isLinkableInProject() && cd->templateMaster()==0 &&
5704  !cd->isHidden() && !cd->isEmbeddedInOuterScope())
5705  {
5707  }
5708  }
5709  }
5710 };
5711 
5713 {
5714  p = new Private;
5717 }
5718 
5720 {
5721  delete p;
5722 }
5723 
5724 // TemplateListIntf
5726 {
5727  return p->count();
5728 }
5729 
5731 {
5732  return p->at(index);
5733 }
5734 
5736 {
5737  return p->createIterator();
5738 }
5739 
5740 //------------------------------------------------------------------------
5741 
5742 //%% list ClassIndex[Class] : list of classes
5744 {
5745  public:
5747  {
5748  static bool init=FALSE;
5749  if (!init)
5750  {
5751  s_inst.addProperty("list", &Private::list);
5752  s_inst.addProperty("fileName", &Private::fileName);
5753  s_inst.addProperty("relPath", &Private::relPath);
5754  s_inst.addProperty("highlight", &Private::highlight);
5755  s_inst.addProperty("subhighlight",&Private::subhighlight);
5756  s_inst.addProperty("title", &Private::title);
5757  init=TRUE;
5758  }
5759  }
5760  TemplateVariant get(const char *n) const
5761  {
5762  return s_inst.get(this,n);
5763  }
5765  {
5766  if (!m_cache.classes)
5767  {
5768  TemplateList *classList = TemplateList::alloc();
5769  if (Doxygen::classSDict)
5770  {
5772  ClassDef *cd;
5773  for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
5774  {
5775  if (cd->getLanguage()==SrcLangExt_VHDL &&
5778  ) // no architecture
5779  {
5780  continue;
5781  }
5782  if (cd->isLinkableInProject() && cd->templateMaster()==0)
5783  {
5784  classList->append(ClassContext::alloc(cd));
5785  }
5786  }
5787  }
5788  m_cache.classes.reset(classList);
5789  }
5790  return m_cache.classes.get();
5791  }
5793  {
5794  return "classes";
5795  }
5797  {
5798  return "";
5799  }
5801  {
5802  return "classes";
5803  }
5805  {
5806  return "classindex";
5807  }
5809  {
5810  static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
5811  static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
5812  if (fortranOpt)
5813  {
5814  return theTranslator->trDataTypes();
5815  }
5816  else if (vhdlOpt)
5817  {
5818  return VhdlDocGen::trDesignUnits();
5819  }
5820  else
5821  {
5822  return theTranslator->trCompoundIndex();
5823  }
5824  }
5825  private:
5826  struct Cachable
5827  {
5829  };
5832 };
5833 
5835 
5837 {
5838  p = new Private;
5839  //p->addClasses(*Doxygen::hiddenClasses);
5840 }
5841 
5843 {
5844  delete p;
5845 }
5846 
5847 // TemplateStructIntf
5849 {
5850  return p->get(n);
5851 }
5852 
5853 //------------------------------------------------------------------------
5854 
5855 static int computeMaxDepth(const TemplateListIntf *list)
5856 {
5857  int maxDepth=0;
5858  if (list)
5859  {
5861  TemplateVariant v;
5862  for (it->toFirst();it->current(v);it->toNext())
5863  {
5864  const TemplateStructIntf *s = v.toStruct();
5865  TemplateVariant child = s->get("children");
5866  int d = computeMaxDepth(child.toList())+1;
5867  if (d>maxDepth) maxDepth=d;
5868  }
5869  delete it;
5870  }
5871  return maxDepth;
5872 }
5873 
5874 static int computeNumNodesAtLevel(const TemplateStructIntf *s,int level,int maxLevel)
5875 {
5876  int num=0;
5877  if (level<maxLevel)
5878  {
5879  num++;
5880  TemplateVariant child = s->get("children");
5881  if (child.toList())
5882  {
5884  TemplateVariant v;
5885  for (it->toFirst();it->current(v);it->toNext())
5886  {
5887  num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel);
5888  }
5889  delete it;
5890  }
5891  }
5892  return num;
5893 }
5894 
5895 static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
5896 {
5897  int preferredNumEntries = Config_getInt(HTML_INDEX_NUM_ENTRIES);
5898  int preferredDepth=1;
5899  if (preferredNumEntries>0)
5900  {
5901  int depth = maxDepth;
5902  for (int i=1;i<=depth;i++)
5903  {
5904  int num=0;
5906  TemplateVariant v;
5907  for (it->toFirst();it->current(v);it->toNext())
5908  {
5909  num+=computeNumNodesAtLevel(v.toStruct(),0,i);
5910  }
5911  delete it;
5912  if (num<=preferredNumEntries)
5913  {
5914  preferredDepth=i;
5915  }
5916  else
5917  {
5918  break;
5919  }
5920  }
5921  }
5922  return preferredDepth;
5923 }
5924 
5925 //------------------------------------------------------------------------
5926 
5927 //%% struct ClassHierarchy: inheritance tree
5928 //%% {
5930 {
5931  public:
5933  {
5939  //%% ClassInheritance tree
5940  static bool init=FALSE;
5941  if (!init)
5942  {
5943  s_inst.addProperty("tree", &Private::tree);
5944  s_inst.addProperty("fileName", &Private::fileName);
5945  s_inst.addProperty("relPath", &Private::relPath);
5946  s_inst.addProperty("highlight", &Private::highlight);
5947  s_inst.addProperty("subhighlight", &Private::subhighlight);
5948  s_inst.addProperty("title", &Private::title);
5949  s_inst.addProperty("preferredDepth", &Private::preferredDepth);
5950  s_inst.addProperty("maxDepth", &Private::maxDepth);
5951  s_inst.addProperty("diagrams", &Private::diagrams);
5952  init=TRUE;
5953  }
5954  }
5955  TemplateVariant get(const char *n) const
5956  {
5957  return s_inst.get(this,n);
5958  }
5960  {
5961  return m_classTree.get();
5962  }
5964  {
5965  return "hierarchy";
5966  }
5968  {
5969  return "";
5970  }
5972  {
5973  return "classes";
5974  }
5976  {
5977  return "classhierarchy";
5978  }
5980  {
5981  if (!m_cache.hierarchy)
5982  {
5984  }
5985  return m_cache.hierarchy.get();
5986  }
5988  {
5989  if (!m_cache.diagrams)
5990  {
5992  DotGfxHierarchyTable *hierarchy = getHierarchy();
5993  if (hierarchy->subGraphs())
5994  {
5995  int id=0;
5996  QListIterator<DotNode> li(*hierarchy->subGraphs());
5997  DotNode *n;
5998  for (li.toFirst();(n=li.current());++li)
5999  {
6000  diagrams->append(InheritanceGraphContext::alloc(hierarchy,n,id++));
6001  }
6002  }
6003  m_cache.diagrams.reset(diagrams);
6004  }
6005  return m_cache.diagrams.get();
6006  }
6008  {
6009  static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6010  if (vhdlOpt)
6011  {
6013  }
6014  else
6015  {
6016  return theTranslator->trClassHierarchy();
6017  }
6018  }
6020  {
6022  {
6025  }
6026  return m_cache.maxDepth;
6027  }
6029  {
6031  {
6034  }
6035  return m_cache.preferredDepth;
6036  }
6037  private:
6039  struct Cachable
6040  {
6049  };
6052 };
6053 //%% }
6054 
6056 
6058 {
6059  p = new Private;
6060 }
6061 
6063 {
6064  delete p;
6065 }
6066 
6068 {
6069  return p->get(name);
6070 }
6071 
6072 //------------------------------------------------------------------------
6073 
6074 //%% struct NestingNode: node is a nesting relation tree
6075 //%% {
6077 {
6078  public:
6079  Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
6080  Definition *d,int index,int level,bool addCls,bool inherit, bool hideSuper)
6081  : m_parent(parent), m_def(d), m_level(level), m_index(index)
6082  {
6083  m_children.reset(NestingContext::alloc(thisNode,level+1));
6084  static bool init=FALSE;
6085  if (!init)
6086  {
6087  //%% bool is_leaf_node: true if this node does not have any children
6088  s_inst.addProperty("is_leaf_node",&Private::isLeafNode);
6089  //%% Nesting children: list of nested classes/namespaces
6090  s_inst.addProperty("children",&Private::children);
6091  //%% [optional] Class class: class info (if this node represents a class)
6092  s_inst.addProperty("class",&Private::getClass);
6093  //%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
6094  s_inst.addProperty("namespace",&Private::getNamespace);
6095  //%% [optional] File file: file info (if this node represents a file)
6096  s_inst.addProperty("file",&Private::getFile);
6097  //%% [optional] Dir dir: directory info (if this node represents a directory)
6098  s_inst.addProperty("dir",&Private::getDir);
6099  //%% [optional] Page page: page info (if this node represents a page)
6100  s_inst.addProperty("page",&Private::getPage);
6101  //%% [optional] Module module: module info (if this node represents a module)
6102  s_inst.addProperty("module",&Private::getModule);
6103  //%% int id
6104  s_inst.addProperty("id",&Private::id);
6105  //%% string level
6106  s_inst.addProperty("level",&Private::level);
6107  //%% string name
6108  s_inst.addProperty("name",&Private::name);
6109  //%% string brief
6110  s_inst.addProperty("brief",&Private::brief);
6111  //%% bool isLinkable
6112  s_inst.addProperty("isLinkable",&Private::isLinkable);
6113  s_inst.addProperty("anchor",&Private::anchor);
6114  s_inst.addProperty("fileName",&Private::fileName);
6115  s_inst.addProperty("isReference",&Private::isReference);
6116  s_inst.addProperty("externalReference",&Private::externalReference);
6117  init=TRUE;
6118  }
6119 
6120  addNamespaces(addCls);
6121  addClasses(inherit,hideSuper);
6122  addDirFiles();
6123  addPages();
6124  addModules();
6125  }
6126  TemplateVariant get(const char *n) const
6127  {
6128  return s_inst.get(this,n);
6129  }
6131  {
6132  return m_children->count()==0;
6133  }
6135  {
6136  return m_children.get();
6137  }
6139  {
6141  {
6143  }
6144  if (m_cache.classContext)
6145  {
6146  return m_cache.classContext.get();
6147  }
6148  else
6149  {
6150  return TemplateVariant(FALSE);
6151  }
6152  }
6154  {
6156  {
6158  }
6160  {
6161  return m_cache.namespaceContext.get();
6162  }
6163  else
6164  {
6165  return TemplateVariant(FALSE);
6166  }
6167  }
6169  {
6171  {
6173  }
6174  if (m_cache.dirContext)
6175  {
6176  return m_cache.dirContext.get();
6177  }
6178  else
6179  {
6180  return TemplateVariant(FALSE);
6181  }
6182  }
6184  {
6186  {
6188  }
6189  if (m_cache.fileContext)
6190  {
6191  return m_cache.fileContext.get();
6192  }
6193  else
6194  {
6195  return TemplateVariant(FALSE);
6196  }
6197  }
6199  {
6201  {
6203  }
6204  if (m_cache.pageContext)
6205  {
6206  return m_cache.pageContext.get();
6207  }
6208  else
6209  {
6210  return TemplateVariant(FALSE);
6211  }
6212  }
6214  {
6216  {
6218  }
6219  if (m_cache.moduleContext)
6220  {
6221  return m_cache.moduleContext.get();
6222  }
6223  else
6224  {
6225  return TemplateVariant(FALSE);
6226  }
6227  }
6229  {
6230  return m_level;
6231  }
6233  {
6234  QCString result;
6235  if (m_parent) result=m_parent->id();
6236  result+=QCString().setNum(m_index)+"_";
6237  return result;
6238  }
6240  {
6241  return m_def->displayName(FALSE);
6242  }
6243  QCString relPathAsString() const
6244  {
6245  static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
6246  return createSubdirs ? QCString("../../") : QCString("");
6247  }
6249  {
6250  if (!m_cache.brief)
6251  {
6252  if (m_def->hasBriefDescription())
6253  {
6255  "",m_def->briefDescription(),TRUE)));
6256  }
6257  else
6258  {
6260  }
6261  }
6262  return *m_cache.brief;
6263  }
6265  {
6266  return m_def->isLinkable();
6267  }
6269  {
6270  return m_def->anchor();
6271  }
6273  {
6274  return m_def->getOutputFileBase();
6275  }
6277  {
6278  return m_def->isReference();
6279  }
6281  {
6283  }
6284 
6285  //------------------------------------------------------------------
6286 
6287  void addClasses(bool inherit, bool hideSuper)
6288  {
6290  if (cd && inherit)
6291  {
6292  bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
6293  if (hasChildren)
6294  {
6295  bool wasVisited=cd->visited;
6296  cd->visited=TRUE;
6297  if (cd->getLanguage()==SrcLangExt_VHDL)
6298  {
6299  m_children->addDerivedClasses(cd->baseClasses(),wasVisited);
6300  }
6301  else
6302  {
6303  m_children->addDerivedClasses(cd->subClasses(),wasVisited);
6304  }
6305  }
6306  }
6307  else
6308  {
6309  if (cd && cd->getClassSDict())
6310  {
6311  m_children->addClasses(*cd->getClassSDict(),FALSE);
6312  }
6313  }
6314  }
6316  {
6318  if (nd && nd->getNamespaceSDict())
6319  {
6321  }
6322  if (addClasses && nd && nd->getClassSDict())
6323  {
6324  m_children->addClasses(*nd->getClassSDict(),FALSE);
6325  }
6326  }
6328  {
6330  if (dd)
6331  {
6332  m_children->addDirs(dd->subDirs());
6333  if (dd && dd->getFiles())
6334  {
6335  m_children->addFiles(*dd->getFiles());
6336  }
6337  }
6338  }
6339  void addPages()
6340  {
6342  if (pd && pd->getSubPages())
6343  {
6344  m_children->addPages(*pd->getSubPages(),FALSE);
6345  }
6346  }
6347  void addModules()
6348  {
6350  if (gd && gd->getSubGroups())
6351  {
6353  }
6354  }
6355  private:
6359  int m_level;
6360  int m_index;
6361  struct Cachable
6362  {
6370  };
6373 };
6374 //%% }
6375 
6377 
6379  Definition *d,int index,int level,bool addClass,bool inherit,bool hideSuper)
6380  : RefCountedContext("NestingNodeContext")
6381 {
6382  p = new Private(parent,this,d,index,level,addClass,inherit,hideSuper);
6383 }
6384 
6386 {
6387  delete p;
6388 }
6389 
6391 {
6392  return p->get(n);
6393 }
6394 
6395 QCString NestingNodeContext::id() const
6396 {
6397  return p->id().toString();
6398 }
6399 
6400 //------------------------------------------------------------------------
6401 
6402 //%% list Nesting[NestingNode]: namespace and class nesting relations
6404 {
6405  public:
6406  Private(const NestingNodeContext *parent,int level)
6407  : m_parent(parent), m_level(level), m_index(0) {}
6408 
6409  void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
6410  {
6411  NamespaceSDict::Iterator nli(nsDict);
6412  NamespaceDef *nd;
6413  for (nli.toFirst();(nd=nli.current());++nli)
6414  {
6415  if (nd->localName().find('@')==-1 &&
6416  (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
6417  {
6418  bool hasChildren = namespaceHasVisibleChild(nd,addClasses);
6419  bool isLinkable = nd->isLinkableInProject();
6420  if (isLinkable || hasChildren)
6421  {
6422  NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses,FALSE,FALSE);
6423  append(nnc);
6424  m_index++;
6425  }
6426  }
6427  }
6428  }
6429  void addClasses(const ClassSDict &clDict,bool rootOnly)
6430  {
6431  ClassSDict::Iterator cli(clDict);
6432  ClassDef *cd;
6433  for (;(cd=cli.current());++cli)
6434  {
6435  if (cd->getLanguage()==SrcLangExt_VHDL)
6436  {
6439  )// no architecture
6440  {
6441  continue;
6442  }
6443  }
6444  if (!rootOnly ||
6445  cd->getOuterScope()==0 ||
6447  )
6448  {
6449  if (classVisibleInIndex(cd) && cd->templateMaster()==0)
6450  {
6452  append(nnc);
6453  m_index++;
6454  }
6455  }
6456  }
6457  }
6458  void addDirs(const DirSDict &dirDict)
6459  {
6460  SDict<DirDef>::Iterator dli(dirDict);
6461  DirDef *dd;
6462  for (dli.toFirst();(dd=dli.current());++dli)
6463  {
6465  {
6466  append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
6467  m_index++;
6468  }
6469  }
6470  }
6471  void addDirs(const DirList &dirList)
6472  {
6473  QListIterator<DirDef> li(dirList);
6474  DirDef *dd;
6475  for (li.toFirst();(dd=li.current());++li)
6476  {
6477  append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
6478  m_index++;
6479  }
6480  }
6481  void addFiles(const FileNameList &fnList)
6482  {
6483  FileNameListIterator fnli(fnList);
6484  FileName *fn;
6485  for (fnli.toFirst();(fn=fnli.current());++fnli)
6486  {
6487  FileNameIterator fni(*fn);
6488  FileDef *fd;
6489  for (;(fd=fni.current());++fni)
6490  {
6491  if (fd->getDirDef()==0) // top level file
6492  {
6493  append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
6494  m_index++;
6495  }
6496  }
6497  }
6498  }
6499  void addFiles(const FileList &fList)
6500  {
6501  QListIterator<FileDef> li(fList);
6502  FileDef *fd;
6503  for (li.toFirst();(fd=li.current());++li)
6504  {
6505  append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
6506  m_index++;
6507  }
6508  }
6509  void addPages(const PageSDict &pages,bool rootOnly)
6510  {
6511  SDict<PageDef>::Iterator pli(pages);
6512  PageDef *pd;
6513  for (pli.toFirst();(pd=pli.current());++pli)
6514  {
6515  if (!rootOnly ||
6516  pd->getOuterScope()==0 ||
6518  {
6519  append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE,FALSE,FALSE));
6520  m_index++;
6521  }
6522  }
6523  }
6524  void addModules(const GroupSDict &groups)
6525  {
6526  GroupSDict::Iterator gli(groups);
6527  GroupDef *gd;
6528  for (gli.toFirst();(gd=gli.current());++gli)
6529  {
6530  static bool externalGroups = Config_getBool(EXTERNAL_GROUPS);
6531  if (!gd->isASubGroup() && gd->isVisible() &&
6532  (!gd->isReference() || externalGroups)
6533  )
6534  {
6535  append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
6536  m_index++;
6537  }
6538  }
6539  }
6540  void addModules(const GroupList &list)
6541  {
6542  GroupListIterator gli(list);
6543  GroupDef *gd;
6544  for (gli.toFirst();(gd=gli.current());++gli)
6545  {
6546  if (gd->isVisible())
6547  {
6548  append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
6549  m_index++;
6550  }
6551  }
6552  }
6553  void addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
6554  {
6555  if (bcl==0) return;
6556  BaseClassListIterator bcli(*bcl);
6557  BaseClassDef *bcd;
6558  for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli)
6559  {
6560  ClassDef *cd=bcd->classDef;
6562  {
6563  continue;
6564  }
6565 
6566  bool b;
6567  if (cd->getLanguage()==SrcLangExt_VHDL)
6568  {
6569  b=hasVisibleRoot(cd->subClasses());
6570  }
6571  else
6572  {
6573  b=hasVisibleRoot(cd->baseClasses());
6574  }
6575 
6576  if (cd->isVisibleInHierarchy() && b)
6577  {
6578  NestingNodeContext *tnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,hideSuper);
6579  append(tnc);
6580  m_index++;
6581  }
6582  }
6583  }
6584  void addClassHierarchy(const ClassSDict &classSDict,bool)
6585  {
6586  ClassSDict::Iterator cli(classSDict);
6587  ClassDef *cd;
6588  for (cli.toFirst();(cd=cli.current());++cli)
6589  {
6590  bool b;
6591  if (cd->getLanguage()==SrcLangExt_VHDL)
6592  {
6594  {
6595  continue;
6596  }
6597  b=!hasVisibleRoot(cd->subClasses());
6598  }
6599  else
6600  {
6601  b=!hasVisibleRoot(cd->baseClasses());
6602  }
6603  if (b)
6604  {
6605  if (cd->isVisibleInHierarchy()) // should it be visible
6606  {
6607  // new root level class
6609  append(nnc);
6610  m_index++;
6611  }
6612  }
6613  }
6614  }
6615 
6616  private:
6618  int m_level;
6619  int m_index;
6620 };
6621 
6622 NestingContext::NestingContext(const NestingNodeContext *parent,int level) : RefCountedContext("NestingContext")
6623 {
6624  p = new Private(parent,level);
6625 }
6626 
6628 {
6629  delete p;
6630 }
6631 
6632 // TemplateListIntf
6634 {
6635  return p->count();
6636 }
6637 
6639 {
6640  return p->at(index);
6641 }
6642 
6644 {
6645  return p->createIterator();
6646 }
6647 
6648 void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly)
6649 {
6650  p->addClasses(clDict,rootOnly);
6651 }
6652 
6653 void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
6654 {
6655  p->addNamespaces(nsDict,rootOnly,addClasses);
6656 }
6657 
6659 {
6660  p->addDirs(dirs);
6661 }
6662 
6664 {
6665  p->addDirs(dirs);
6666 }
6667 
6669 {
6670  p->addFiles(files);
6671 }
6672 
6674 {
6675  p->addFiles(files);
6676 }
6677 
6678 void NestingContext::addPages(const PageSDict &pages,bool rootOnly)
6679 {
6680  p->addPages(pages,rootOnly);
6681 }
6682 
6684 {
6685  p->addModules(modules);
6686 }
6687 
6689 {
6690  p->addModules(modules);
6691 }
6692 
6693 void NestingContext::addClassHierarchy(const ClassSDict &classSDict,bool rootOnly)
6694 {
6695  p->addClassHierarchy(classSDict,rootOnly);
6696 }
6697 
6698 void NestingContext::addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
6699 {
6700  p->addDerivedClasses(bcl,hideSuper);
6701 }
6702 
6703 //------------------------------------------------------------------------
6704 
6705 //%% struct ClassTree: Class nesting relations
6706 //%% {
6708 {
6709  public:
6711  {
6714  {
6716  }
6717  if (Doxygen::classSDict)
6718  {
6720  }
6721  //%% Nesting tree
6722  static bool init=FALSE;
6723  if (!init)
6724  {
6725  s_inst.addProperty("tree", &Private::tree);
6726  s_inst.addProperty("fileName", &Private::fileName);
6727  s_inst.addProperty("relPath", &Private::relPath);
6728  s_inst.addProperty("highlight", &Private::highlight);
6729  s_inst.addProperty("subhighlight", &Private::subhighlight);
6730  s_inst.addProperty("title", &Private::title);
6731  s_inst.addProperty("preferredDepth",&Private::preferredDepth);
6732  s_inst.addProperty("maxDepth", &Private::maxDepth);
6733  init=TRUE;
6734  }
6735  }
6736  TemplateVariant get(const char *n) const
6737  {
6738  return s_inst.get(this,n);
6739  }
6741  {
6742  return m_classTree.get();
6743  }
6745  {
6746  return "annotated";
6747  }
6749  {
6750  return "";
6751  }
6753  {
6754  return "classes";
6755  }
6757  {
6758  return "classlist";
6759  }
6761  {
6762  static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
6763  static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6764  if (fortranOpt)
6765  {
6767  }
6768  else if (vhdlOpt)
6769  {
6771  }
6772  else
6773  {
6774  return theTranslator->trClasses();
6775  }
6776  }
6778  {
6780  {
6783  }
6784  return m_cache.maxDepth;
6785  }
6787  {
6789  {
6792  }
6793  return m_cache.preferredDepth;
6794  }
6795  private:
6797  struct Cachable
6798  {
6805  };
6808 };
6809 //%% }
6810 
6812 
6814 {
6815  p = new Private;
6816 }
6817 
6819 {
6820  delete p;
6821 }
6822 
6824 {
6825  return p->get(name);
6826 }
6827 
6828 //------------------------------------------------------------------------
6829 
6830 //%% list NamespaceList[Namespace] : list of namespaces
6832 {
6833  public:
6834  void addNamespaces(const NamespaceSDict &nsDict)
6835  {
6836  NamespaceSDict::Iterator nli(nsDict);
6837  NamespaceDef *nd;
6838  for (nli.toFirst();(nd=nli.current());++nli)
6839  {
6840  if (nd->isLinkableInProject())
6841  {
6843  }
6844  }
6845  }
6846 };
6847 
6849 {
6850  p = new Private;
6852 }
6853 
6855 {
6856  delete p;
6857 }
6858 
6859 // TemplateListIntf
6861 {
6862  return p->count();
6863 }
6864 
6866 {
6867  return p->at(index);
6868 }
6869 
6871 {
6872  return p->createIterator();
6873 }
6874 
6875 //------------------------------------------------------------------------
6876 
6877 //%% struct NamespaceTree: tree of nested namespace
6878 //%% {
6880 {
6881  public:
6883  {
6886  {
6888  }
6889  //%% Nesting tree
6890  static bool init=FALSE;
6891  if (!init)
6892  {
6893  s_inst.addProperty("tree", &Private::tree);
6894  s_inst.addProperty("fileName", &Private::fileName);
6895  s_inst.addProperty("relPath", &Private::relPath);
6896  s_inst.addProperty("highlight", &Private::highlight);
6897  s_inst.addProperty("subhighlight", &Private::subhighlight);
6898  s_inst.addProperty("title", &Private::title);
6899  s_inst.addProperty("preferredDepth",&Private::preferredDepth);
6900  s_inst.addProperty("maxDepth", &Private::maxDepth);
6901  init=TRUE;
6902  }
6903  }
6904  TemplateVariant get(const char *n) const
6905  {
6906  return s_inst.get(this,n);
6907  }
6909  {
6910  return m_namespaceTree.get();
6911  }
6913  {
6914  return "namespaces";
6915  }
6917  {
6918  return "";
6919  }
6921  {
6922  return "namespaces";
6923  }
6925  {
6926  return "namespacelist";
6927  }
6929  {
6930  static bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
6931  static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
6932  static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6933  if (javaOpt || vhdlOpt)
6934  {
6935  return theTranslator->trPackages();
6936  }
6937  else if (fortranOpt)
6938  {
6939  return theTranslator->trModulesList();
6940  }
6941  else
6942  {
6943  return theTranslator->trNamespaceList();
6944  }
6945  }
6947  {
6949  {
6952  }
6953  return m_cache.maxDepth;
6954  }
6956  {
6958  {
6961  }
6962  return m_cache.preferredDepth;
6963  }
6964  private:
6966  struct Cachable
6967  {
6973  };
6976 };
6977 //%% }
6978 
6980 
6982 {
6983  p = new Private;
6984 }
6985 
6987 {
6988  delete p;
6989 }
6990 
6992 {
6993  return p->get(name);
6994 }
6995 
6996 //------------------------------------------------------------------------
6997 
6998 //%% list FileList[File] : list of files
7000 {
7001  public:
7002  void addFiles(const FileNameList &fnList)
7003  {
7004  // TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file
7005  FileNameListIterator fnli(fnList);
7006  FileName *fn;
7007  for (fnli.toFirst();(fn=fnli.current());++fnli)
7008  {
7009  FileNameIterator fni(*fn);
7010  FileDef *fd;
7011  for (fni.toFirst();(fd=fni.current());++fni)
7012  {
7013  bool doc = fd->isLinkableInProject();
7014  bool src = fd->generateSourceFile();
7015  bool nameOk = !fd->isDocumentationFile();
7016  if (nameOk && (doc || src) && !fd->isReference())
7017  {
7019  }
7020  }
7021  }
7022  }
7023 };
7024 
7026 {
7027  p = new Private;
7029 }
7030 
7032 {
7033  delete p;
7034 }
7035 
7036 // TemplateListIntf
7038 {
7039  return p->count();
7040 }
7041 
7043 {
7044  return p->at(index);
7045 }
7046 
7048 {
7049  return p->createIterator();
7050 }
7051 
7052 //------------------------------------------------------------------------
7053 
7054 //%% list DirList[Dir] : list of files
7056 {
7057  public:
7059  {
7060  DirDef *dir;
7062  for (sdi.toFirst();(dir=sdi.current());++sdi)
7063  {
7064  append(DirContext::alloc(dir));
7065  }
7066  }
7067 };
7068 
7070 {
7071  p = new Private;
7072 }
7073 
7075 {
7076  delete p;
7077 }
7078 
7079 // TemplateListIntf
7081 {
7082  return p->count();
7083 }
7084 
7086 {
7087  return p->at(index);
7088 }
7089 
7091 {
7092  return p->createIterator();
7093 }
7094 
7095 
7096 //------------------------------------------------------------------------
7097 
7098 //%% list UsedFiles[File] : list of files
7100 {
7101  public:
7102  void addFile(FileDef *fd)
7103  {
7105  }
7106 };
7107 
7109 {
7110  p = new Private;
7111  if (cd)
7112  {
7113  QListIterator<FileDef> li(cd->usedFiles());
7114  FileDef *fd;
7115  for (li.toFirst();(fd=li.current());++li)
7116  {
7117  p->addFile(fd);
7118  }
7119  }
7120 }
7121 
7123 {
7124  delete p;
7125 }
7126 
7127 // TemplateListIntf
7129 {
7130  return p->count();
7131 }
7132 
7134 {
7135  return p->at(index);
7136 }
7137 
7139 {
7140  return p->createIterator();
7141 }
7142 
7144 {
7145  p->addFile(fd);
7146 }
7147 
7148 //------------------------------------------------------------------------
7149 
7150 //%% struct FileTree: tree of directories and files
7151 //%% {
7153 {
7154  public:
7156  {
7157  // Add dirs tree
7160  {
7162  }
7164  {
7166  }
7167  //%% DirFile tree:
7168  static bool init=FALSE;
7169  if (!init)
7170  {
7171  s_inst.addProperty("tree", &Private::tree);
7172  s_inst.addProperty("fileName", &Private::fileName);
7173  s_inst.addProperty("relPath", &Private::relPath);
7174  s_inst.addProperty("highlight", &Private::highlight);
7175  s_inst.addProperty("subhighlight", &Private::subhighlight);
7176  s_inst.addProperty("title", &Private::title);
7177  s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7178  s_inst.addProperty("maxDepth", &Private::maxDepth);
7179  init=TRUE;
7180  }
7181  }
7182  TemplateVariant get(const char *n) const
7183  {
7184  return s_inst.get(this,n);
7185  }
7187  {
7188  return m_dirFileTree.get();
7189  }
7191  {
7192  return "files";
7193  }
7195  {
7196  return "";
7197  }
7199  {
7200  return "files";
7201  }
7203  {
7204  return "filelist";
7205  }
7207  {
7208  return theTranslator->trFileList();
7209  }
7211  {
7213  {
7216  }
7217  return m_cache.maxDepth;
7218  }
7220  {
7222  {
7225  }
7226  return m_cache.preferredDepth;
7227  }
7228  private:
7230  struct Cachable
7231  {
7238  };
7241 };
7242 //%% }
7243 
7245 
7247 {
7248  p = new Private;
7249 }
7250 
7252 {
7253  delete p;
7254 }
7255 
7256 TemplateVariant FileTreeContext::get(const char *name) const
7257 {
7258  return p->get(name);
7259 }
7260 
7261 //------------------------------------------------------------------------
7262 
7263 //%% struct PageTree: tree of related pages
7264 //%% {
7266 {
7267  public:
7268  Private(const PageSDict *pages)
7269  {
7271  // Add pages
7272  if (pages)
7273  {
7274  m_pageTree->addPages(*pages,TRUE);
7275  }
7276 
7277  //%% PageNodeList tree:
7278  static bool init=FALSE;
7279  if (!init)
7280  {
7281  s_inst.addProperty("tree", &Private::tree);
7282  s_inst.addProperty("fileName", &Private::fileName);
7283  s_inst.addProperty("relPath", &Private::relPath);
7284  s_inst.addProperty("highlight", &Private::highlight);
7285  s_inst.addProperty("subhighlight", &Private::subhighlight);
7286  s_inst.addProperty("title", &Private::title);
7287  s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7288  s_inst.addProperty("maxDepth", &Private::maxDepth);
7289  init=TRUE;
7290  }
7291  }
7292  TemplateVariant get(const char *n) const
7293  {
7294  return s_inst.get(this,n);
7295  }
7297  {
7298  return m_pageTree.get();
7299  }
7301  {
7302  return "pages";
7303  }
7305  {
7306  return "";
7307  }
7309  {
7310  return "pages";
7311  }
7313  {
7314  return "";
7315  }
7317  {
7318  return theTranslator->trRelatedPages();
7319  }
7321  {
7323  {
7326  }
7327  return m_cache.maxDepth;
7328  }
7330  {
7332  {
7335  }
7336  return m_cache.preferredDepth;
7337  }
7338  private:
7340  struct Cachable
7341  {
7347  };
7350 };
7351 //%% }
7352 
7354 
7356 {
7357  p = new Private(pages);
7358 }
7359 
7361 {
7362  delete p;
7363 }
7364 
7365 TemplateVariant PageTreeContext::get(const char *name) const
7366 {
7367  return p->get(name);
7368 }
7369 
7370 //------------------------------------------------------------------------
7371 
7372 //%% list PageList[Page]: list of pages
7374 {
7375  public:
7376  void addPages(const PageSDict &pages)
7377  {
7378  PageSDict::Iterator pdi(pages);
7379  PageDef *pd=0;
7380  for (pdi.toFirst();(pd=pdi.current());++pdi)
7381  {
7382  if (!pd->getGroupDef() && !pd->isReference())
7383  {
7384  append(PageContext::alloc(pd,FALSE,FALSE));
7385  }
7386  }
7387  }
7388 };
7389 
7391 {
7392  p = new Private;
7393  if (pages) p->addPages(*pages);
7394 }
7395 
7397 {
7398  delete p;
7399 }
7400 
7401 // TemplateListIntf
7403 {
7404  return p->count();
7405 }
7406 
7408 {
7409  return p->at(index);
7410 }
7411 
7413 {
7414  return p->createIterator();
7415 }
7416 
7417 //------------------------------------------------------------------------
7418 
7419 //%% list ExampleList[Page]: list of pages
7421 {
7422  public:
7424  {
7426  {
7428  PageDef *pd=0;
7429  for (pdi.toFirst();(pd=pdi.current());++pdi)
7430  {
7431  if (!pd->getGroupDef() && !pd->isReference())
7432  {
7433  append(PageContext::alloc(pd,FALSE,TRUE));
7434  }
7435  }
7436  }
7437  }
7438 };
7439 
7441 {
7442  p = new Private;
7443 }
7444 
7446 {
7447  delete p;
7448 }
7449 
7450 // TemplateListIntf
7452 {
7453  return p->count();
7454 }
7455 
7457 {
7458  return p->at(index);
7459 }
7460 
7462 {
7463  return p->createIterator();
7464 }
7465 
7466 //------------------------------------------------------------------------
7467 
7468 //%% list ModuleList[ModuleNode]: list of directories and/or files
7470 {
7471  public:
7472  void addModules()
7473  {
7475  GroupDef *gd;
7476  for (gli.toFirst();(gd=gli.current());++gli)
7477  {
7478  if (!gd->isReference())
7479  {
7481  }
7482  }
7483  }
7484 };
7485 
7487 {
7488  p = new Private;
7489  p->addModules();
7490 }
7491 
7493 {
7494  delete p;
7495 }
7496 
7497 // TemplateListIntf
7499 {
7500  return p->count();
7501 }
7502 
7504 {
7505  return p->at(index);
7506 }
7507 
7509 {
7510  return p->createIterator();
7511 }
7512 
7513 //------------------------------------------------------------------------
7514 
7515 //%% struct ModuleTree: tree of modules
7516 //%% {
7518 {
7519  public:
7521  {
7523  // Add modules
7524  if (Doxygen::groupSDict)
7525  {
7527  }
7528 
7529  //%% ModuleList tree:
7530  static bool init=FALSE;
7531  if (!init)
7532  {
7533  s_inst.addProperty("tree", &Private::tree);
7534  s_inst.addProperty("fileName", &Private::fileName);
7535  s_inst.addProperty("relPath", &Private::relPath);
7536  s_inst.addProperty("highlight", &Private::highlight);
7537  s_inst.addProperty("subhighlight", &Private::subhighlight);
7538  s_inst.addProperty("title", &Private::title);
7539  s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7540  s_inst.addProperty("maxDepth", &Private::maxDepth);
7541  init=TRUE;
7542  }
7543  }
7544  TemplateVariant get(const char *n) const
7545  {
7546  return s_inst.get(this,n);
7547  }
7549  {
7550  return m_moduleTree.get();
7551  }
7553  {
7554  return "modules";
7555  }
7557  {
7558  return "";
7559  }
7561  {
7562  return "modules";
7563  }
7565  {
7566  return "";
7567  }
7569  {
7570  return theTranslator->trModules();
7571  }
7573  {
7575  {
7578  }
7579  return m_cache.maxDepth;
7580  }
7582  {
7584  {
7587  }
7588  return m_cache.preferredDepth;
7589  }
7590  private:
7592  struct Cachable
7593  {
7599  };
7602 };
7603 //%% }
7604 
7606 
7608 {
7609  p = new Private;
7610 }
7611 
7613 {
7614  delete p;
7615 }
7616 
7618 {
7619  return p->get(name);
7620 }
7621 
7622 //------------------------------------------------------------------------
7623 
7624 //%% struct NavPathElem: list of examples page
7625 //%% {
7627 {
7628  public:
7629  Private(Definition *def) : m_def(def)
7630  {
7631  static bool init=FALSE;
7632  if (!init)
7633  {
7634  s_inst.addProperty("isLinkable", &Private::isLinkable);
7635  s_inst.addProperty("fileName", &Private::fileName);
7636  s_inst.addProperty("anchor", &Private::anchor);
7637  s_inst.addProperty("text", &Private::text);
7638  s_inst.addProperty("isReference", &Private::isReference);
7639  s_inst.addProperty("externalReference",&Private::externalReference);
7640  init=TRUE;
7641  }
7642  }
7643  TemplateVariant get(const char *n) const
7644  {
7645  return s_inst.get(this,n);
7646  }
7648  {
7649  return m_def->isLinkable();
7650  }
7652  {
7653  return m_def->anchor();
7654  }
7656  {
7657  return m_def->getOutputFileBase();
7658  }
7660  {
7662  QCString text = m_def->localName();
7663  if (type==Definition::TypeGroup)
7664  {
7665  text = ((const GroupDef*)m_def)->groupTitle();
7666  }
7667  else if (type==Definition::TypePage && !(((const PageDef*)m_def)->title().isEmpty()))
7668  {
7669  text = ((const PageDef*)m_def)->title();
7670  }
7671  else if (type==Definition::TypeClass)
7672  {
7673  if (text.right(2)=="-p")
7674  {
7675  text = text.left(text.length()-2);
7676  }
7677  }
7678  return text;
7679  }
7681  {
7682  return m_def->isReference();
7683  }
7684  QCString relPathAsString() const
7685  {
7686  static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
7687  return createSubdirs ? QCString("../../") : QCString("");
7688  }
7690  {
7692  }
7693  private:
7696 };
7697 //%% }
7698 
7700 
7702 {
7703  p = new Private(def);
7704 }
7705 
7707 {
7708  delete p;
7709 }
7710 
7712 {
7713  return p->get(name);
7714 }
7715 
7716 
7717 //------------------------------------------------------------------------
7718 
7719 //%% struct ExampleList: list of examples page
7720 //%% {
7722 {
7723  public:
7725  {
7727  // Add pages
7729  {
7731  }
7732 
7733  static bool init=FALSE;
7734  if (!init)
7735  {
7736  s_inst.addProperty("tree", &Private::tree);
7737  s_inst.addProperty("fileName", &Private::fileName);
7738  s_inst.addProperty("relPath", &Private::relPath);
7739  s_inst.addProperty("highlight", &Private::highlight);
7740  s_inst.addProperty("subhighlight", &Private::subhighlight);
7741  s_inst.addProperty("title", &Private::title);
7742  s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7743  s_inst.addProperty("maxDepth", &Private::maxDepth);
7744  init=TRUE;
7745  }
7746  }
7747  TemplateVariant get(const char *n) const
7748  {
7749  return s_inst.get(this,n);
7750  }
7752  {
7753  return m_exampleTree.get();
7754  }
7756  {
7757  return "examples";
7758  }
7760  {
7761  return "";
7762  }
7764  {
7765  return "examples";
7766  }
7768  {
7769  return "";
7770  }
7772  {
7773  return theTranslator->trExamples();
7774  }
7776  {
7778  {
7781  }
7782  return m_cache.maxDepth;
7783  }
7785  {
7787  {
7790  }
7791  return m_cache.preferredDepth;
7792  }
7793  private:
7795  struct Cachable
7796  {
7802  };
7805 };
7806 //%% }
7807 
7809 
7811 {
7812  p = new Private;
7813 }
7814 
7816 {
7817  delete p;
7818 }
7819 
7821 {
7822  return p->get(name);
7823 }
7824 
7825 //------------------------------------------------------------------------
7826 
7827 //%% struct GlobalsIndex: list of examples page
7828 //%% {
7830 {
7831  public:
7833  {
7834  static bool init=FALSE;
7835  if (!init)
7836  {
7837  s_inst.addProperty("all", &Private::all);
7838  s_inst.addProperty("functions", &Private::functions);
7839  s_inst.addProperty("variables", &Private::variables);
7840  s_inst.addProperty("typedefs", &Private::typedefs);
7841  s_inst.addProperty("enums", &Private::enums);
7842  s_inst.addProperty("enumValues", &Private::enumValues);
7843  s_inst.addProperty("macros", &Private::macros);
7844  s_inst.addProperty("properties", &Private::properties);
7845  s_inst.addProperty("events", &Private::events);
7846  s_inst.addProperty("related", &Private::related);
7847  s_inst.addProperty("fileName", &Private::fileName);
7848  s_inst.addProperty("relPath", &Private::relPath);
7849  s_inst.addProperty("highlight", &Private::highlight);
7850  s_inst.addProperty("subhighlight",&Private::subhighlight);
7851  s_inst.addProperty("title", &Private::title);
7852  init=TRUE;
7853  }
7854  }
7855  TemplateVariant get(const char *n) const
7856  {
7857  return s_inst.get(this,n);
7858  }
7859  typedef bool (MemberDef::*MemberFunc)() const;
7861  {
7862  if (!listRef)
7863  {
7865  MemberName *mn;
7867  for (fnli.toFirst();(mn=fnli.current());++fnli)
7868  {
7869  MemberDef *md;
7870  MemberNameIterator mni(*mn);
7871  for (mni.toFirst();(md=mni.current());++mni)
7872  {
7873  FileDef *fd=md->getFileDef();
7874  if (fd && fd->isLinkableInProject() &&
7875  !md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject())
7876  {
7877  if (filter==0 || (md->*filter)())
7878  {
7879  list->append(MemberContext::alloc(md));
7880  }
7881  }
7882  }
7883  }
7884  listRef.reset(list);
7885  }
7886  return listRef.get();
7887  }
7889  {
7890  return getMembersFiltered(m_cache.all,0);
7891  }
7893  {
7895  }
7897  {
7899  }
7901  {
7903  }
7905  {
7907  }
7909  {
7911  }
7913  {
7915  }
7917  {
7918  return FALSE;
7919  }
7921  {
7922  return FALSE;
7923  }
7925  {
7926  return FALSE;
7927  }
7929  {
7930  return "globals";
7931  }
7933  {
7934  return "";
7935  }
7937  {
7938  return "files";
7939  }
7941  {
7942  return "filemembers";
7943  }
7945  {
7946  return theTranslator->trFileMembers();
7947  }
7948  private:
7949  struct Cachable
7950  {
7959  };
7962 };
7963 //%% }
7964 
7966 
7968 {
7969  p = new Private;
7970 }
7971 
7973 {
7974  delete p;
7975 }
7976 
7978 {
7979  return p->get(name);
7980 }
7981 
7982 //------------------------------------------------------------------------
7983 
7984 //%% struct ClassMembersIndex: list of examples page
7985 //%% {
7987 {
7988  public:
7990  {
7991  static bool init=FALSE;
7992  if (!init)
7993  {
7994  s_inst.addProperty("all", &Private::all);
7995  s_inst.addProperty("functions", &Private::functions);
7996  s_inst.addProperty("variables", &Private::variables);
7997  s_inst.addProperty("typedefs", &Private::typedefs);
7998  s_inst.addProperty("enums", &Private::enums);
7999  s_inst.addProperty("enumValues", &Private::enumValues);
8000  s_inst.addProperty("macros", &Private::macros);
8001  s_inst.addProperty("properties", &Private::properties);
8002  s_inst.addProperty("events", &Private::events);
8003  s_inst.addProperty("related", &Private::related);
8004  s_inst.addProperty("fileName", &Private::fileName);
8005  s_inst.addProperty("relPath", &Private::relPath);
8006  s_inst.addProperty("highlight", &Private::highlight);
8007  s_inst.addProperty("subhighlight",&Private::subhighlight);
8008  s_inst.addProperty("title", &Private::title);
8009  init=TRUE;
8010  }
8011  }
8012  TemplateVariant get(const char *n) const
8013  {
8014  return s_inst.get(this,n);
8015  }
8016  typedef bool (MemberDef::*MemberFunc)() const;
8018  {
8019  if (!listRef)
8020  {
8022  MemberName *mn;
8024  for (mnli.toFirst();(mn=mnli.current());++mnli)
8025  {
8026  MemberDef *md;
8027  MemberNameIterator mni(*mn);
8028  for (mni.toFirst();(md=mni.current());++mni)
8029  {
8030  ClassDef *cd = md->getClassDef();
8031  if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 &&
8032  md->isLinkableInProject() && !md->name().isEmpty())
8033  {
8034  if (filter==0 || (md->*filter)())
8035  {
8036  list->append(MemberContext::alloc(md));
8037  }
8038  }
8039  }
8040  }
8041  listRef.reset(list);
8042  }
8043  return listRef.get();
8044  }
8046  {
8048  }
8050  {
8052  }
8054  {
8056  }
8058  {
8060  }
8062  {
8064  }
8066  {
8068  }
8070  {
8071  return FALSE;
8072  }
8074  {
8076  }
8078  {
8080  }
8082  {
8084  }
8086  {
8087  return "functions";
8088  }
8090  {
8091  return "";
8092  }
8094  {
8095  return "classes";
8096  }
8098  {
8099  return "classmembers";
8100  }
8102  {
8103  return theTranslator->trCompoundMembers();
8104  }
8105  private:
8106  struct Cachable
8107  {
8118  };
8121 };
8122 //%% }
8123 
8125 
8127 {
8128  p = new Private;
8129 }
8130 
8132 {
8133  delete p;
8134 }
8135 
8137 {
8138  return p->get(name);
8139 }
8140 
8141 //------------------------------------------------------------------------
8142 
8143 //%% struct NamespaceMembersIndex: list of examples page
8144 //%% {
8146 {
8147  public:
8149  {
8150  static bool init=FALSE;
8151  if (!init)
8152  {
8153  s_inst.addProperty("all", &Private::all);
8154  s_inst.addProperty("functions", &Private::functions);
8155  s_inst.addProperty("variables", &Private::variables);
8156  s_inst.addProperty("typedefs", &Private::typedefs);
8157  s_inst.addProperty("enums", &Private::enums);
8158  s_inst.addProperty("enumValues", &Private::enumValues);
8159  s_inst.addProperty("macros", &Private::macros);
8160  s_inst.addProperty("properties", &Private::properties);
8161  s_inst.addProperty("events", &Private::events);
8162  s_inst.addProperty("related", &Private::related);
8163  s_inst.addProperty("fileName", &Private::fileName);
8164  s_inst.addProperty("relPath", &Private::relPath);
8165  s_inst.addProperty("highlight", &Private::highlight);
8166  s_inst.addProperty("subhighlight",&Private::subhighlight);
8167  s_inst.addProperty("title", &Private::title);
8168  init=TRUE;
8169  }
8170  }
8171  TemplateVariant get(const char *n) const
8172  {
8173  return s_inst.get(this,n);
8174  }
8175  typedef bool (MemberDef::*MemberFunc)() const;
8177  {
8178  if (!listRef)
8179  {
8181  MemberName *mn;
8183  for (fnli.toFirst();(mn=fnli.current());++fnli)
8184  {
8185  MemberDef *md;
8186  MemberNameIterator mni(*mn);
8187  for (mni.toFirst();(md=mni.current());++mni)
8188  {
8189  NamespaceDef *nd=md->getNamespaceDef();
8190  if (nd && nd->isLinkableInProject() &&
8191  !md->name().isEmpty() && md->isLinkableInProject())
8192  {
8193  if (filter==0 || (md->*filter)())
8194  {
8195  list->append(MemberContext::alloc(md));
8196  }
8197  }
8198  }
8199  }
8200  listRef.reset(list);
8201  }
8202  return listRef.get();
8203  }
8205  {
8206  return getMembersFiltered(m_cache.all,0);
8207  }
8209  {
8211  }
8213  {
8215  }
8217  {
8219  }
8221  {
8223  }
8225  {
8227  }
8229  {
8230  return FALSE;
8231  }
8233  {
8234  return FALSE;
8235  }
8237  {
8238  return FALSE;
8239  }
8241  {
8242  return FALSE;
8243  }
8245  {
8246  return "namespacemembers";
8247  }
8249  {
8250  return "";
8251  }
8253  {
8254  return "namespaces";
8255  }
8257  {
8258  return "namespacemembers";
8259  }
8261  {
8263  }
8264  private:
8265  struct Cachable
8266  {
8274  };
8277 };
8278 //%% }
8279 
8281 
8283 {
8284  p = new Private;
8285 }
8286 
8288 {
8289  delete p;
8290 }
8291 
8293 {
8294  return p->get(name);
8295 }
8296 
8297 //------------------------------------------------------------------------
8298 
8299 //%% struct InheritanceGraph: a connected graph reprenting part of the overall interitance tree
8300 //%% {
8302 {
8303  public:
8304  Private(DotGfxHierarchyTable *hierarchy,DotNode *n,int id) : m_hierarchy(hierarchy), m_node(n), m_id(id)
8305  {
8306  static bool init=FALSE;
8307  if (!init)
8308  {
8309  s_inst.addProperty("graph",&Private::graph);
8310  init=TRUE;
8311  }
8312  }
8313  TemplateVariant get(const char *n) const
8314  {
8315  return s_inst.get(this,n);
8316  }
8318  {
8319  QGString result;
8320  static bool haveDot = Config_getBool(HAVE_DOT);
8321  static bool graphicalHierarchy = Config_getBool(GRAPHICAL_HIERARCHY);
8322  if (haveDot && graphicalHierarchy)
8323  {
8324  FTextStream t(&result);
8326  /*GOF_BITMAP,
8327  EOF_Html,*/
8330  m_id);
8331  }
8332  return TemplateVariant(result.data(),TRUE);
8333  }
8334  private:
8337  int m_id;
8339 };
8340 
8342 
8344  : RefCountedContext("InheritanceGraphContext")
8345 {
8346  p = new Private(hierarchy,n,id);
8347 }
8348 
8350 {
8351  delete p;
8352 }
8353 
8355 {
8356  return p->get(name);
8357 }
8358 
8359 
8360 //------------------------------------------------------------------------
8361 
8362 //%% struct InheritanceNode: a class in the inheritance list
8363 //%% {
8365 {
8366  public:
8367  Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
8368  {
8369  static bool init=FALSE;
8370  if (!init)
8371  {
8372  s_inst.addProperty("class",&Private::getClass);
8373  s_inst.addProperty("name", &Private::name);
8374  init=TRUE;
8375  }
8376  }
8377  TemplateVariant get(const char *n) const
8378  {
8379  return s_inst.get(this,n);
8380  }
8382  {
8383  if (!m_classContext)
8384  {
8386  }
8387  return m_classContext.get();
8388  }
8390  {
8391  return m_name;
8392  }
8393  private:
8396  QCString m_name;
8398 };
8399 //%% }
8400 
8402 
8403 InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
8404 {
8405  p = new Private(cd,name);
8406 }
8407 
8409 {
8410  delete p;
8411 }
8412 
8414 {
8415  return p->get(name);
8416 }
8417 
8418 //------------------------------------------------------------------------
8419 
8420 //%% list InheritanceList[InheritanceNode] : list of inherited classes
8422 {
8423  public:
8424  void addClass(ClassDef *cd,const QCString &name)
8425  {
8427  }
8428 };
8429 
8430 InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
8431 {
8432  p = new Private;
8433  if (list)
8434  {
8435  BaseClassListIterator li(*list);
8436  BaseClassDef *bcd;
8437  for (li.toFirst();(bcd=li.current());++li)
8438  {
8439  ClassDef *cd=bcd->classDef;
8440  QCString name;
8441  if (baseClasses)
8442  {
8444  cd->displayName(),bcd->templSpecifiers);
8445  }
8446  else
8447  {
8448  name = cd->displayName();
8449  }
8450  //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
8451  p->addClass(cd,name);
8452  }
8453  }
8454 }
8455 
8457 {
8458  delete p;
8459 }
8460 
8461 // TemplateListIntf
8463 {
8464  return p->count();
8465 }
8466 
8468 {
8469  return p->at(index);
8470 }
8471 
8473 {
8474  return p->createIterator();
8475 }
8476 
8477 //------------------------------------------------------------------------
8478 
8479 //%% list MemberList[Member] : list of inherited classes
8481 {
8482  public:
8484  {
8486  }
8487 };
8488 
8490 {
8491  p = new Private;
8492 }
8493 
8495 {
8496  p = new Private;
8497  if (list)
8498  {
8499  bool details = list->listType()&MemberListType_detailedLists;
8500  MemberListIterator mli(*list);
8501  MemberDef *md;
8502  for (mli.toFirst();(md=mli.current());++mli)
8503  {
8504  if ((md->isBriefSectionVisible() && !details) ||
8505  (md->isDetailedSectionLinkable() && details)
8506  )
8507  {
8508  p->addMember(md);
8509  }
8510  }
8511  }
8512 }
8513 
8514 MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
8515 {
8516  p = new Private;
8517  if (list)
8518  {
8519  if (doSort)
8520  {
8521  list->sort();
8522  }
8523  MemberSDict::Iterator it(*list);
8524  MemberDef *md;
8525  for (it.toFirst();(md=it.current());++it)
8526  {
8527  p->addMember(md);
8528  }
8529  }
8530 }
8531 
8533 {
8534  delete p;
8535 }
8536 
8537 // TemplateListIntf
8539 {
8540  return p->count();
8541 }
8542 
8544 {
8545  return p->at(index);
8546 }
8547 
8549 {
8550  return p->createIterator();
8551 }
8552 
8553 //------------------------------------------------------------------------
8554 
8555 //%% struct MemberInfo: member information
8556 //%% {
8558 {
8559  public:
8561  {
8562  static bool init=FALSE;
8563  if (!init)
8564  {
8565  //%% string protection
8566  s_inst.addProperty("protection", &Private::protection);
8567  //%% string virtualness
8568  s_inst.addProperty("virtualness", &Private::virtualness);
8569  //%% string ambiguityScope
8570  s_inst.addProperty("ambiguityScope",&Private::ambiguityScope);
8571  //%% Member member
8572  s_inst.addProperty("member", &Private::member);
8573  init=TRUE;
8574  }
8575  }
8576  TemplateVariant get(const char *n) const
8577  {
8578  return s_inst.get(this,n);
8579  }
8581  {
8582  switch (m_memberInfo->prot)
8583  {
8584  case ::Public: return "public";
8585  case ::Protected: return "protected";
8586  case ::Private: return "private";
8587  case ::Package: return "package";
8588  }
8589  return "";
8590  }
8592  {
8593  switch (m_memberInfo->virt)
8594  {
8595  case ::Normal: return "normal";
8596  case ::Virtual: return "virtual";
8597  case ::Pure: return "pure";
8598  }
8599  return "";
8600  }
8602  {
8604  }
8606  {
8607  if (!m_member && m_memberInfo->memberDef)
8608  {
8610  }
8611  if (m_member)
8612  {
8613  return m_member.get();
8614  }
8615  else
8616  {
8617  return TemplateVariant(FALSE);
8618  }
8619  }
8620  private:
8624 };
8625 //%% }
8626 
8628 
8630 {
8631  p = new Private(mi);
8632 }
8633 
8635 {
8636  delete p;
8637 }
8638 
8640 {
8641  return p->get(name);
8642 }
8643 
8644 
8645 //------------------------------------------------------------------------
8646 
8647 //%% list AllMembersList[MemberList] : list of inherited classes
8649 {
8650  public:
8652  {
8653  if (ml)
8654  {
8655  static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
8657  MemberNameInfo *mni;
8658  for (mnii.toFirst();(mni=mnii.current());++mnii)
8659  {
8660  MemberNameInfoIterator mnii2(*mni);
8661  MemberInfo *mi;
8662  for (mnii2.toFirst();(mi=mnii2.current());++mnii2)
8663  {
8664  MemberDef *md=mi->memberDef;
8665  ClassDef *cd=md->getClassDef();
8666  if (cd && !md->name().isEmpty() && md->name()[0]!='@')
8667  {
8668  if ((cd->isLinkable() && md->isLinkable()) ||
8669  (!cd->isArtificial() && !hideUndocMembers &&
8670  (protectionLevelVisible(md->protection()) || md->isFriend())
8671  )
8672  )
8673  {
8675  }
8676  }
8677  }
8678  }
8679  }
8680  }
8681 };
8682 
8684 {
8685  p = new Private(0);
8686 }
8687 
8689 {
8690  p = new Private(ml);
8691 }
8692 
8694 {
8695  delete p;
8696 }
8697 
8698 // TemplateListIntf
8700 {
8701  return p->count();
8702 }
8703 
8705 {
8706  return p->at(index);
8707 }
8708 
8710 {
8711  return p->createIterator();
8712 }
8713 
8714 //------------------------------------------------------------------------
8715 
8716 //%% struct MemberGroupInfo: member group information
8717 //%% {
8719 {
8720  public:
8721  Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
8722  m_def(def),
8723  m_relPath(relPath),
8724  m_memberGroup(mg)
8725  {
8726  static bool init=FALSE;
8727  if (!init)
8728  {
8729  s_inst.addProperty("members", &Private::members);
8730  s_inst.addProperty("title", &Private::groupTitle);
8731  s_inst.addProperty("subtitle", &Private::groupSubtitle);
8732  s_inst.addProperty("anchor", &Private::groupAnchor);
8733  s_inst.addProperty("memberGroups", &Private::memberGroups);
8734  s_inst.addProperty("docs", &Private::docs);
8735  s_inst.addProperty("inherited", &Private::inherited);
8736  init=TRUE;
8737  }
8738  }
8739  TemplateVariant get(const char *n) const
8740  {
8741  return s_inst.get(this,n);
8742  }
8744  {
8746  {
8748  }
8749  return m_cache.memberListContext.get();
8750  }
8752  {
8753  return m_memberGroup->header();
8754  }
8756  {
8757  return "";
8758  }
8760  {
8761  return m_memberGroup->anchor();
8762  }
8764  {
8765  if (!m_cache.memberGroups)
8766  {
8768  }
8769  return m_cache.memberGroups.get();
8770  }
8772  {
8773  if (!m_cache.docs)
8774  {
8775  QCString docs = m_memberGroup->documentation();
8776  if (!docs.isEmpty())
8777  {
8779  parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
8780  m_relPath,
8781  m_memberGroup->documentation()+"\n",FALSE)));
8782  }
8783  else
8784  {
8785  m_cache.docs.reset(new TemplateVariant(""));
8786  }
8787  }
8788  return *m_cache.docs;
8789  }
8791  {
8792  return FALSE;
8793  }
8794  private:
8796  QCString m_relPath;
8798  struct Cachable
8799  {
8803  };
8806 };
8807 //%% }
8808 
8810 
8812  const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
8813 {
8814  p = new Private(def,relPath,mg);
8815 }
8816 
8818 {
8819  delete p;
8820 }
8821 
8823 {
8824  return p->get(name);
8825 }
8826 
8827 //------------------------------------------------------------------------
8828 
8829 //%% list MemberGroupList[MemberGroupInfo] : list of member groups
8831 {
8832  public:
8833  void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
8834  {
8835  append(MemberGroupInfoContext::alloc(def,relPath,mg));
8836  }
8837 };
8838 
8840 {
8841  p = new Private;
8842 }
8843 
8844 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
8845 {
8846  p = new Private;
8847  if (list)
8848  {
8849  MemberGroupListIterator mgli(*list);
8850  MemberGroup *mg;
8851  for (;(mg=mgli.current());++mgli)
8852  {
8853  p->addMemberGroup(def,relPath,mg);
8854  }
8855  }
8856 }
8857 
8858 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
8859 {
8860  p = new Private;
8861  if (dict)
8862  {
8863  MemberGroupSDict::Iterator di(*dict);
8864  const MemberGroup *mg;
8865  for (di.toFirst();(mg=di.current());++di)
8866  {
8867  if (!mg->allMembersInSameSection() || !subGrouping)
8868  {
8869  p->addMemberGroup(def,relPath,mg);
8870  }
8871  }
8872  }
8873 }
8874 
8876 {
8877  delete p;
8878 }
8879 
8880 // TemplateListIntf
8882 {
8883  return p->count();
8884 }
8885 
8887 {
8888  return p->at(index);
8889 }
8890 
8892 {
8893  return p->createIterator();
8894 }
8895 
8896 
8897 //------------------------------------------------------------------------
8898 
8899 //%% struct MemberListInfo: member list information
8900 //%% {
8902 {
8903  public:
8904  Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
8905  m_def(def),
8906  m_memberList(ml),
8907  m_relPath(relPath),
8908  m_title(title),
8909  m_subtitle(subtitle)
8910  {
8911  static bool init=FALSE;
8912  if (!init)
8913  {
8914  s_inst.addProperty("members", &Private::members);
8915  s_inst.addProperty("title", &Private::title);
8916  s_inst.addProperty("subtitle", &Private::subtitle);
8917  s_inst.addProperty("anchor", &Private::anchor);
8918  s_inst.addProperty("memberGroups", &Private::memberGroups);
8919  s_inst.addProperty("inherited", &Private::inherited);
8920  init=TRUE;
8921  }
8922  }
8923  TemplateVariant get(const char *n) const
8924  {
8925  return s_inst.get(this,n);
8926  }
8928  {
8930  {
8932  }
8933  return m_cache.memberListContext.get();
8934  }
8936  {
8937  return m_title;
8938  }
8940  {
8941  return m_subtitle;
8942  }
8944  {
8946  }
8948  {
8949  if (!m_cache.memberGroups)
8950  {
8952  }
8953  return m_cache.memberGroups.get();
8954  }
8956  {
8959  {
8962  m_cache.inherited.reset(ctx);
8963  }
8964  if (m_cache.inherited)
8965  {
8966  return m_cache.inherited.get();
8967  }
8968  else
8969  {
8970  return TemplateVariant(FALSE);
8971  }
8972  }
8973  private:
8976  QCString m_relPath;
8977  QCString m_title;
8978  QCString m_subtitle;
8979  struct Cachable
8980  {
8984  };
8987 };
8988 //%% }
8989 
8991 
8993  Definition *def,const QCString &relPath,const MemberList *ml,
8994  const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
8995 {
8996  p = new Private(def,relPath,ml,title,subtitle);
8997 }
8998 
9000 {
9001  delete p;
9002 }
9003 
9005 {
9006  return p->get(name);
9007 }
9008 
9009 //------------------------------------------------------------------------
9010 
9011 //%% struct InheritedMemberInfo: inherited member information
9012 //%% {
9014 {
9015  public:
9016  Private(ClassDef *cd,MemberList *ml,const QCString &title)
9017  : m_class(cd), m_memberList(ml), m_title(title)
9018  {
9019  static bool init=FALSE;
9020  if (!init)
9021  {
9022  s_inst.addProperty("class", &Private::getClass);
9023  s_inst.addProperty("title", &Private::title);
9024  s_inst.addProperty("members", &Private::members);
9025  s_inst.addProperty("id", &Private::id);
9026  s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
9027  init=TRUE;
9028  }
9029  }
9030  TemplateVariant get(const char *n) const
9031  {
9032  return s_inst.get(this,n);
9033  }
9034  virtual ~Private()
9035  {
9036  delete m_memberList;
9037  }
9039  {
9040  if (!m_classCtx)
9041  {
9043  }
9044  return m_classCtx.get();
9045  }
9047  {
9048  return m_title;
9049  }
9051  {
9052  if (!m_memberListCtx)
9053  {
9055  }
9056  return m_memberListCtx.get();
9057  }
9059  {
9062  }
9064  {
9065  if (!m_inheritedFrom)
9066  {
9070  }
9071  return m_inheritedFrom.get();
9072  }
9073 
9074  private:
9077  QCString m_title;
9082 };
9083 //%% }
9084 
9086 
9088  const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
9089 {
9090  p = new Private(cd,ml,title);
9091 }
9092 
9094 {
9095  delete p;
9096 }
9097 
9099 {
9100  return p->get(name);
9101 }
9102 
9103 //------------------------------------------------------------------------
9104 
9105 //%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes
9107 {
9108  public:
9109  void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
9110  {
9111  if (ml)
9112  {
9113  MemberListIterator li(*ml);
9114  MemberDef *md;
9115  for (li.toFirst();(md=li.current());++li)
9116  {
9117  if (md->isBriefSectionVisible() && !md->isReimplementedBy(inheritedFrom))
9118  {
9119  combinedList->append(md);
9120  }
9121  }
9122  }
9123  }
9124  void addMemberListIncludingGrouped(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
9125  {
9126  if (ml)
9127  {
9128  addMemberList(inheritedFrom,ml,combinedList);
9129  if (ml->getMemberGroupList())
9130  {
9132  MemberGroup *mg;
9133  for (mgli.toFirst();(mg=mgli.current());++mgli)
9134  {
9135  addMemberList(inheritedFrom,mg->members(),combinedList);
9136  }
9137  }
9138  }
9139  }
9140  void addMemberGroupsOfClass(ClassDef *inheritedFrom,
9141  ClassDef *cd,MemberListType lt,MemberList *combinedList)
9142  {
9143  if (cd->getMemberGroupSDict())
9144  {
9146  MemberGroup *mg;
9147  for (;(mg=mgli.current());++mgli)
9148  {
9149  if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section
9150  {
9151  MemberListIterator li(*mg->members());
9152  MemberDef *md;
9153  for (li.toFirst();(md=li.current());++li)
9154  {
9155  if (lt==md->getSectionList(mg->parent())->listType() &&
9156  !md->isReimplementedBy(inheritedFrom) &&
9157  md->isBriefSectionVisible())
9158  {
9159  combinedList->append(md);
9160  }
9161  }
9162  }
9163  }
9164  }
9165  }
9167  MemberListType lt1,int lt2,const QCString &title,bool additionalList)
9168  {
9169  int count = cd->countMembersIncludingGrouped(lt1,inheritedFrom,additionalList);
9170  if (lt2!=-1) count += cd->countMembersIncludingGrouped((MemberListType)lt2,inheritedFrom,additionalList);
9171  if (count>0)
9172  {
9173  MemberList *ml = cd->getMemberList(lt1);
9174  MemberList *ml2 = lt2!=-1 ? cd->getMemberList((MemberListType)lt2) : 0;
9175  MemberList *combinedList = new MemberList(lt);
9176  addMemberListIncludingGrouped(inheritedFrom,ml,combinedList);
9177  addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList);
9178  addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList);
9179  if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList);
9180  append(InheritedMemberInfoContext::alloc(cd,combinedList,title));
9181  }
9182  }
9184  int lt2, const QCString &title,bool additionalList,
9185  QPtrDict<void> *visitedClasses)
9186  {
9187  if (cd->baseClasses())
9188  {
9190  BaseClassDef *ibcd;
9191  for (it.toFirst();(ibcd=it.current());++it)
9192  {
9193  ClassDef *icd=ibcd->classDef;
9194  if (icd->isLinkable())
9195  {
9196  int lt1,lt3;
9197  convertProtectionLevel(lt,ibcd->prot,&lt1,&lt3);
9198  if (lt2==-1 && lt3!=-1)
9199  {
9200  lt2=lt3;
9201  }
9202  if (visitedClasses->find(icd)==0)
9203  {
9204  visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
9205  if (lt1!=-1)
9206  {
9207  // add member info for members of cd with list type lt
9208  addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
9209  // recurse down the inheritance tree
9210  findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
9211  }
9212  }
9213  }
9214  }
9215  }
9216  }
9217 };
9218 
9220 {
9221  p = new Private;
9222 }
9223 
9225  ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList)
9226 {
9227  QPtrDict<void> visited(17);
9228  bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0;
9229  bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list
9230  (!additionalList && memberInSection); // inherited member to show in a member list of the class
9231  //printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show);
9232  if (show)
9233  {
9234  p->findInheritedMembers(cd,cd,lt,-1,title,additionalList,&visited);
9235  }
9236 }
9237 
9239 {
9240  delete p;
9241 }
9242 
9243 // TemplateListIntf
9245 {
9246  return p->count();
9247 }
9248 
9250 {
9251  return p->at(index);
9252 }
9253 
9255 {
9256  return p->createIterator();
9257 }
9258 
9259 //------------------------------------------------------------------------
9260 
9261 //%% struct Argument: parameter information
9262 //%% {
9264 {
9265  public:
9266  Private(const Argument *arg,Definition *def,const QCString &relPath) :
9267  m_argument(arg), m_def(def), m_relPath(relPath)
9268  {
9269  static bool init=FALSE;
9270  if (!init)
9271  {
9272  s_inst.addProperty("type", &Private::type);
9273  s_inst.addProperty("name", &Private::name);
9274  s_inst.addProperty("defVal", &Private::defVal);
9275  s_inst.addProperty("docs", &Private::docs);
9276  s_inst.addProperty("attrib", &Private::attrib);
9277  s_inst.addProperty("array", &Private::array);
9278  s_inst.addProperty("namePart", &Private::namePart);
9279  init=TRUE;
9280  }
9281  }
9282  TemplateVariant get(const char *n) const
9283  {
9284  return s_inst.get(this,n);
9285  }
9287  {
9289  }
9291  {
9292  return m_argument->attrib;
9293  }
9295  {
9296  return m_argument->name;
9297  }
9299  {
9301  }
9303  {
9304  return m_argument->array;
9305  }
9307  {
9308  if (!m_cache.docs && m_def)
9309  {
9310  if (!m_argument->docs.isEmpty())
9311  {
9314  m_relPath,m_argument->docs,TRUE)));
9315  }
9316  else
9317  {
9318  m_cache.docs.reset(new TemplateVariant(""));
9319  }
9320  }
9321  return *m_cache.docs;
9322  }
9324  {
9325  QCString result = m_argument->attrib;
9326  int l = result.length();
9327  if (l>2 && result.at(0)=='[' && result.at(l-1)==']')
9328  {
9329  result = result.mid(1,l-2);
9330  if (result!=",") result+=":"; // for normal keywords add colon
9331  }
9332  return result;
9333  }
9334  private:
9337  QCString m_relPath;
9338  struct Cachable
9339  {
9341  };
9344 };
9345 //%% }
9346 
9348 
9349 ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
9350 {
9351  p = new Private(al,def,relPath);
9352 }
9353 
9355 {
9356  delete p;
9357 }
9358 
9359 TemplateVariant ArgumentContext::get(const char *name) const
9360 {
9361  return p->get(name);
9362 }
9363 
9364 //------------------------------------------------------------------------
9365 
9366 //%% list ArgumentList[Argument] : list of inherited classes
9368 {
9369  public:
9370  void addArgument(const Argument *arg,Definition *def,const QCString &relPath)
9371  {
9372  append(ArgumentContext::alloc(arg,def,relPath));
9373  }
9374 };
9375 
9377 {
9378  p = new Private;
9379 }
9380 
9382  Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext")
9383 {
9384  p = new Private;
9385  if (list)
9386  {
9387  ArgumentListIterator ali(*list);
9388  const Argument *arg;
9389  for (ali.toFirst();(arg=ali.current());++ali)
9390  {
9391  p->addArgument(arg,def,relPath);
9392  }
9393  }
9394 }
9395 
9397 {
9398  delete p;
9399 }
9400 
9401 // TemplateListIntf
9403 {
9404  return p->count();
9405 }
9406 
9408 {
9409  return p->at(index);
9410 }
9411 
9413 {
9414  return p->createIterator();
9415 }
9416 
9417 //------------------------------------------------------------------------
9418 
9419 // SymbolIndex
9420 // - name: string
9421 // - letter: string
9422 // - symbolGroups: SymbolGroupList
9423 // SymbolGroupList: list of SymbolGroups
9424 // SymbolGroup
9425 // - id
9426 // - name
9427 // - symbols: SymbolList
9428 // SymbolList: list of Symbols
9429 // Symbol
9430 // - obj
9431 // - scope
9432 // - relPath
9433 
9434 //------------------------------------------------------------------------
9435 
9436 //%% struct SymbolGroup: search group of similar symbols
9437 //%% {
9439 {
9440  public:
9441  Private(const Definition *d,const Definition *prev,
9442  const Definition *next) : m_def(d), m_prevDef(prev), m_nextDef(next)
9443  {
9444  static bool init=FALSE;
9445  if (!init)
9446  {
9447  s_inst.addProperty("fileName",&Private::fileName);
9448  s_inst.addProperty("anchor", &Private::anchor);
9449  s_inst.addProperty("scope", &Private::scope);
9450  s_inst.addProperty("relPath", &Private::relPath);
9451  init=TRUE;
9452  }
9453  }
9454  TemplateVariant get(const char *n) const
9455  {
9456  return s_inst.get(this,n);
9457  }
9459  {
9460  return m_def->getOutputFileBase();
9461  }
9463  {
9464  return m_def->anchor();
9465  }
9467  {
9468  const Definition *scope = m_def->getOuterScope();
9469  const Definition *next = m_nextDef;
9470  const Definition *prev = m_prevDef;
9471  const Definition *nextScope = next ? next->getOuterScope() : 0;
9472  const Definition *prevScope = prev ? prev->getOuterScope() : 0;
9473  bool isMemberDef = m_def->definitionType()==Definition::TypeMember;
9474  const MemberDef *md = isMemberDef ? (const MemberDef*)m_def : 0;
9475  bool isFunctionLike = md && (md->isFunction() || md->isSlot() || md->isSignal());
9476  bool overloadedFunction = isFunctionLike &&
9477  ((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope));
9478  QCString prefix;
9479  if (md) prefix=md->localName();
9480  if (overloadedFunction) // overloaded member function
9481  {
9482  prefix+=md->argsString();
9483  // show argument list to disambiguate overloaded functions
9484  }
9485  else if (md && isFunctionLike) // unique member function
9486  {
9487  prefix+="()"; // only to show it is a function
9488  }
9489  bool found=FALSE;
9490  QCString name;
9492  {
9493  name = m_def->displayName();
9494  found = TRUE;
9495  }
9497  {
9498  name = m_def->displayName();
9499  found = TRUE;
9500  }
9501  else if (scope==0 || scope==Doxygen::globalScope) // in global scope
9502  {
9503  if (md)
9504  {
9505  FileDef *fd = md->getBodyDef();
9506  if (fd==0) fd = md->getFileDef();
9507  if (fd)
9508  {
9509  if (!prefix.isEmpty()) prefix+=": ";
9510  name = prefix + convertToXML(fd->localName());
9511  found = TRUE;
9512  }
9513  }
9514  }
9515  else if (md && (md->getClassDef() || md->getNamespaceDef()))
9516  // member in class or namespace scope
9517  {
9518  SrcLangExt lang = md->getLanguage();
9519  name = m_def->getOuterScope()->qualifiedName()
9520  + getLanguageSpecificSeparator(lang) + prefix;
9521  found = TRUE;
9522  }
9523  else if (scope) // some thing else? -> show scope
9524  {
9525  name = prefix + convertToXML(scope->name());
9526  found = TRUE;
9527  }
9528  if (!found) // fallback
9529  {
9530  name = prefix + "("+theTranslator->trGlobalNamespace()+")";
9531  }
9532  return name;
9533  }
9535  {
9536  return externalRef("../",m_def->getReference(),TRUE);
9537  }
9538  private:
9543 };
9544 //%% }
9545 
9547 
9548 SymbolContext::SymbolContext(const Definition *def,const Definition *prevDef,const Definition *nextDef)
9549  : RefCountedContext("SymbolContext")
9550 {
9551  p = new Private(def,prevDef,nextDef);
9552 }
9553 
9555 {
9556  delete p;
9557 }
9558 
9559 TemplateVariant SymbolContext::get(const char *name) const
9560 {
9561  return p->get(name);
9562 }
9563 
9564 //------------------------------------------------------------------------
9565 
9566 //%% list SymbolList[Symbol] : list of search symbols with the same name
9568 {
9569  public:
9571  {
9572  QListIterator<Definition> li(*sdl);
9573  Definition *def;
9574  Definition *prev = 0;
9575  for (li.toFirst();(def=li.current());)
9576  {
9577  ++li;
9578  const Definition *next = li.current();
9579  append(SymbolContext::alloc(def,prev,next));
9580  prev = def;
9581  }
9582  }
9583 };
9584 
9586  : RefCountedContext("SymbolListContext")
9587 {
9588  p = new Private(sdl);
9589 }
9590 
9592 {
9593  delete p;
9594 }
9595 
9596 // TemplateListIntf
9598 {
9599  return p->count();
9600 }
9601 
9603 {
9604  return p->at(index);
9605 }
9606 
9608 {
9609  return p->createIterator();
9610 }
9611 
9612 //------------------------------------------------------------------------
9613 
9614 //%% struct SymbolGroup: search group of similar symbols
9615 //%% {
9617 {
9618  public:
9620  {
9621  static bool init=FALSE;
9622  if (!init)
9623  {
9624  s_inst.addProperty("id", &Private::id);
9625  s_inst.addProperty("name", &Private::name);
9626  s_inst.addProperty("symbols",&Private::symbolList);
9627  init=TRUE;
9628  }
9629  }
9630  TemplateVariant get(const char *n) const
9631  {
9632  return s_inst.get(this,n);
9633  }
9635  {
9636  return m_sdl->id();
9637  }
9639  {
9640  return m_sdl->name();
9641  }
9643  {
9644  if (!m_cache.symbolList)
9645  {
9647  }
9648  return m_cache.symbolList.get();
9649  }
9650  private:
9652  struct Cachable
9653  {
9655  };
9658 };
9659 //%% }
9660 
9662 
9664  : RefCountedContext("SymbolGroupContext")
9665 {
9666  p = new Private(sdl);
9667 }
9668 
9670 {
9671  delete p;
9672 }
9673 
9675 {
9676  return p->get(name);
9677 }
9678 
9679 //------------------------------------------------------------------------
9680 
9681 //%% list SymbolGroupList[SymbolGroup] : list of search groups one per by name
9683 {
9684  public:
9686  {
9689  for (li.toFirst();(dl=li.current());++li)
9690  {
9692  }
9693  }
9694 };
9695 
9697  : RefCountedContext("SymbolGroupListContext")
9698 {
9699  p = new Private(sil);
9700 }
9701 
9703 {
9704  delete p;
9705 }
9706 
9707 // TemplateListIntf
9709 {
9710  return p->count();
9711 }
9712 
9714 {
9715  return p->at(index);
9716 }
9717 
9719 {
9720  return p->createIterator();
9721 }
9722 
9723 //------------------------------------------------------------------------
9724 
9725 //%% struct SymbolIndex: search index
9726 //%% {
9728 {
9729  public:
9730  Private(const SearchIndexList *sl,const QCString &name) : m_searchList(sl), m_name(name)
9731  {
9732  static bool init=FALSE;
9733  if (!init)
9734  {
9735  s_inst.addProperty("name", &Private::name);
9736  s_inst.addProperty("letter", &Private::letter);
9737  s_inst.addProperty("symbolGroups",&Private::symbolGroups);
9738  init=TRUE;
9739  }
9740  }
9741  TemplateVariant get(const char *n) const
9742  {
9743  return s_inst.get(this,n);
9744  }
9746  {
9747  return m_name;
9748  }
9750  {
9751  return QString(QChar(m_searchList->letter())).utf8();
9752  }
9754  {
9755  if (!m_cache.symbolGroups)
9756  {
9758  }
9759  return m_cache.symbolGroups.get();
9760  }
9761  private:
9763  QCString m_name;
9764  struct Cachable
9765  {
9767  };
9770 };
9771 //%% }
9772 
9774 
9776  : RefCountedContext("SymbolIndexContext")
9777 {
9778  p = new Private(sl,name);
9779 }
9780 
9782 {
9783  delete p;
9784 }
9785 
9787 {
9788  return p->get(name);
9789 }
9790 
9791 //------------------------------------------------------------------------
9792 
9793 //%% list SymbolIndices[SymbolIndex] : list of search indices one per by type
9795 {
9796  public:
9798  {
9799  // use info->symbolList to populate the list
9801  const SearchIndexList *sl;
9802  for (it.toFirst();(sl=it.current());++it) // for each letter
9803  {
9805  }
9806  }
9807 };
9808 
9810 {
9811  p = new Private(info);
9812 }
9813 
9815 {
9816  delete p;
9817 }
9818 
9819 // TemplateListIntf
9821 {
9822  return p->count();
9823 }
9824 
9826 {
9827  return p->at(index);
9828 }
9829 
9831 {
9832  return p->createIterator();
9833 }
9834 
9835 //------------------------------------------------------------------------
9836 
9837 //%% struct SearchIndex: search index
9838 //%% {
9840 {
9841  public:
9842  Private(const SearchIndexInfo *info) : m_info(info)
9843  {
9844  static bool init=FALSE;
9845  if (!init)
9846  {
9847  s_inst.addProperty("name", &Private::name);
9848  s_inst.addProperty("text", &Private::text);
9849  s_inst.addProperty("symbolIndices",&Private::symbolIndices);
9850  init=TRUE;
9851  }
9852  }
9853  TemplateVariant get(const char *n) const
9854  {
9855  return s_inst.get(this,n);
9856  }
9858  {
9859  return m_info->name;
9860  }
9862  {
9863  return m_info->text;
9864  }
9866  {
9867  if (!m_cache.symbolIndices)
9868  {
9870  }
9871  return m_cache.symbolIndices.get();
9872  }
9873  private:
9875  struct Cachable
9876  {
9878  };
9881 };
9882 //%% }
9883 
9885 
9887  : RefCountedContext("SearchIndexContext")
9888 {
9889  p = new Private(info);
9890 }
9891 
9893 {
9894  delete p;
9895 }
9896 
9898 {
9899  return p->get(name);
9900 }
9901 
9902 //------------------------------------------------------------------------
9903 
9904 //%% list SearchIndices[SearchIndex] : list of search indices one per by type
9906 {
9907  public:
9909  {
9910  const SearchIndexInfo *indices = getSearchIndices();
9911  for (int i=0;i<NUM_SEARCH_INDICES;i++)
9912  {
9913  append(SearchIndexContext::alloc(&indices[i]));
9914  }
9915  }
9916 };
9917 
9919 {
9920  p = new Private;
9921 }
9922 
9924 {
9925  delete p;
9926 }
9927 
9928 // TemplateListIntf
9930 {
9931  return p->count();
9932 }
9933 
9935 {
9936  return p->at(index);
9937 }
9938 
9940 {
9941  return p->createIterator();
9942 }
9943 
9944 
9945 //------------------------------------------------------------------------
9946 
9948 {
9949  public:
9950  QCString escape(const QCString &s)
9951  {
9952  return convertToHtml(s,TRUE);
9953  }
9954  void enableTabbing(bool) {}
9955 };
9956 
9957 //------------------------------------------------------------------------
9958 
9960 {
9961  public:
9963  void reset() { }
9964  QCString remove(const QCString &s)
9965  {
9966  QGString result;
9967  const char *p = s.data();
9968  char c;
9969  while ((c=*p++))
9970  {
9971  switch(c)
9972  {
9973  case '\t': case ' ': case '\n':
9974  break;
9975  default:
9976  result+=c;
9977  break;
9978  }
9979  }
9980  result+='\0';
9981  return result.data();
9982  }
9983  private:
9984 };
9985 
9986 //------------------------------------------------------------------------
9987 
9989 {
9990  public:
9992  void reset()
9993  {
9994  m_insideTag = FALSE;
9995  m_insideString = '\0';
9996  m_removeSpaces = TRUE;
9997  }
9998  QCString remove(const QCString &s)
9999  {
10000  QGString result;
10001  const char *p = s.data();
10002  char c;
10003  while ((c=*p++))
10004  {
10005  switch(c)
10006  {
10007  case '<': // start of a tag
10008  if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE;
10009  result+=c;
10010  break;
10011  case '>': // end of a tag
10012  if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE;
10013  result+=c;
10014  break;
10015  case '\\': // escaped character in a string
10016  result+=c;
10017  if (m_insideString && *p) result+=*p++;
10018  break;
10019  case '"': case '\'':
10020  if (m_insideTag)
10021  {
10022  if (m_insideString==c) // end of string
10023  {
10024  m_insideString='\0';
10025  }
10026  else if (m_insideString=='\0') // start of string
10027  {
10028  m_insideString=c;
10029  }
10030  }
10031  result+=c;
10032  break;
10033  case ' ': case '\t': case '\n': // whitespace
10034  if (!m_insideTag) // outside tags strip consecutive whitespace
10035  {
10036  m_removeSpaces=TRUE;
10037  }
10038  else
10039  {
10040  result+=' ';
10041  }
10042  break;
10043  default:
10044  //if (m_removeSpaces) result+=' ';
10045  result+=c;
10046  m_removeSpaces=FALSE;
10047  break;
10048  }
10049  }
10050  result+='\0';
10051  //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%c (%d) removeSpaces=%d\n",s.data(),result.data(),
10052  // m_insideTag,m_insideString,m_insideString,m_removeSpaces);
10053  return result.data();
10054  }
10055  private:
10059 };
10060 
10061 //------------------------------------------------------------------------
10062 
10064 {
10065  public:
10066  LatexEscaper() : m_tabbing(FALSE) {}
10067  QCString escape(const QCString &s)
10068  {
10069  return convertToLaTeX(s,m_tabbing);
10070  }
10071  void enableTabbing(bool b) { m_tabbing=b; }
10072  private:
10074 };
10075 
10076 
10077 //------------------------------------------------------------------------
10078 
10079 #if DEBUG_REF
10080 int RefCountedContext::s_totalCount;
10081 #endif
10082 
10084 {
10085  msg("Generating output via template engine...\n");
10086  {
10087  TemplateEngine e;
10088  TemplateContext *ctx = e.createContext();
10089  if (ctx)
10090  {
10113 
10114  //%% Doxygen doxygen:
10115  ctx->set("doxygen",doxygen.get());
10116  //%% Translator tr:
10117  ctx->set("tr",tr.get());
10118  //%% Config config:
10119  ctx->set("config",config.get());
10120  //%% ClassList classList:
10121  ctx->set("classList",classList.get()); // not used for standard HTML
10122  //%% ClassTree classTree:
10123  ctx->set("classTree",classTree.get());
10124  //%% ClassIndex classIndex:
10125  ctx->set("classIndex",classIndex.get());
10126  //%% ClassHierarchy classHierarchy:
10127  ctx->set("classHierarchy",classHierarchy.get());
10128  //%% NamespaceList namespaceList:
10129  ctx->set("namespaceList",namespaceList.get());
10130  //%% NamespaceTree namespaceTree:
10131  ctx->set("namespaceTree",namespaceTree.get());
10132  //%% FileList fileList:
10133  ctx->set("fileList",fileList.get());
10134  //%% FileTree fileTree:
10135  ctx->set("fileTree",fileTree.get());
10136  //%% PageList pageList
10137  ctx->set("pageList",pageList.get());
10138  //%% PageTree pageTree
10139  ctx->set("pageTree",pageTree.get());
10140  //%% ExampleTree exampleTree
10141  ctx->set("exampleTree",exampleTree.get());
10142  //%% ExampleList exampleList
10143  ctx->set("exampleList",exampleList.get());
10144  //%% ModuleTree moduleTree
10145  ctx->set("moduleTree",moduleTree.get());
10146  //%% ModuleList moduleList
10147  ctx->set("moduleList",moduleList.get());
10148  //%% DirList dirList
10149  ctx->set("dirList",dirList.get());
10150  //%% Page mainPage
10151  if (Doxygen::mainPage)
10152  {
10154  ctx->set("mainPage",mainPage.get());
10155  }
10156  else
10157  {
10158  // TODO: for LaTeX output index should be main... => solve in template
10159  Doxygen::mainPage = new PageDef("[generated]",1,"index","",theTranslator->trMainPage());
10160  Doxygen::mainPage->setFileName("index");
10162  ctx->set("mainPage",mainPage.get());
10163  }
10164  //%% GlobalsIndex globalsIndex:
10165  ctx->set("globalsIndex",globalsIndex.get());
10166  //%% ClassMembersIndex classMembersIndex:
10167  ctx->set("classMembersIndex",classMembersIndex.get());
10168  //%% NamespaceMembersIndex namespaceMembersIndex:
10169  ctx->set("namespaceMembersIndex",namespaceMembersIndex.get());
10170  //%% SearchIndicaes searchindicaes
10171  ctx->set("searchIndices",searchIndices.get());
10172  //%% string space
10173  ctx->set("space"," ");
10174 
10175  //if (Config_getBool(GENERATE_HTML))
10176  { // render HTML output
10177  e.setTemplateDir("templates/html"); // TODO: make template part user configurable
10178  Template *tpl = e.loadByName("htmllayout.tpl",1);
10179  if (tpl)
10180  {
10182  g_globals.dynSectionId = 0;
10183  g_globals.outputDir = Config_getString(HTML_OUTPUT);
10184  QDir dir(g_globals.outputDir);
10185  createSubDirs(dir);
10186  HtmlEscaper htmlEsc;
10187  ctx->setEscapeIntf(Config_getString(HTML_FILE_EXTENSION),&htmlEsc);
10188  HtmlSpaceless spl;
10189  ctx->setSpacelessIntf(&spl);
10191  FTextStream ts;
10192  tpl->render(ts,ctx);
10193  e.unload(tpl);
10194  }
10195  }
10196 
10197  // TODO: clean index before each run...
10198 
10199  //if (Config_getBool(GENERATE_LATEX))
10200  if (0)
10201  { // render LaTeX output
10202  e.setTemplateDir("templates/latex"); // TODO: make template part user configurable
10203  Template *tpl = e.loadByName("latexlayout.tpl",1);
10204  if (tpl)
10205  {
10207  g_globals.dynSectionId = 0;
10208  g_globals.outputDir = Config_getString(LATEX_OUTPUT);
10209  QDir dir(g_globals.outputDir);
10210  createSubDirs(dir);
10211  LatexEscaper latexEsc;
10212  ctx->setEscapeIntf(".tex",&latexEsc);
10213  LatexSpaceless spl;
10214  ctx->setSpacelessIntf(&spl);
10216  FTextStream ts;
10217  tpl->render(ts,ctx);
10218  e.unload(tpl);
10219  }
10220  }
10221 
10222  // clear all cached data in Definition objects.
10223  QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
10224  DefinitionIntf *intf;
10225  for (;(intf=di.current());++di)
10226  {
10227  if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
10228  {
10230  Definition *d;
10231  // for each symbol
10232  for (dli.toFirst();(d=dli.current());++dli)
10233  {
10234  d->setCookie(0);
10235  }
10236  }
10237  else // single symbol
10238  {
10239  Definition *d = (Definition *)intf;
10240  d->setCookie(0);
10241  }
10242  }
10243 
10244  e.destroyContext(ctx);
10245  }
10246  }
10247 #if DEBUG_REF // should be 0, i.e. all objects are deleted
10248  printf("==== total ref count %d\n",RefCountedContext::s_totalCount);
10249 #endif
10250 }
10251 
10252 void generateTemplateFiles(const char *templateDir)
10253 {
10254  if (!templateDir) return;
10255  QDir thisDir;
10256  if (!thisDir.exists(templateDir) && !thisDir.mkdir(templateDir))
10257  {
10258  err("Failed to create output directory '%s'\n",templateDir);
10259  return;
10260  }
10261  QCString outDir = QCString(templateDir)+"/html";
10262  if (!thisDir.exists(outDir) && !thisDir.mkdir(outDir))
10263  {
10264  err("Failed to create output directory '%s'\n",templateDir);
10265  return;
10266  }
10267  ResourceMgr::instance().writeCategory("html",outDir);
10268 }