Blame src/groupdef.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#include <ctype.h>
Packit 1c1d7e
#include <qregexp.h>
Packit 1c1d7e
#include "groupdef.h"
Packit 1c1d7e
#include "classdef.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "classlist.h"
Packit 1c1d7e
#include "outputlist.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "memberlist.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "membergroup.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "pagedef.h"
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "searchindex.h"
Packit 1c1d7e
#include "dot.h"
Packit 1c1d7e
#include "vhdldocgen.h"
Packit 1c1d7e
#include "layout.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "entry.h"
Packit 1c1d7e
#include "membername.h"
Packit 1c1d7e
#include "dirdef.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
Packit 1c1d7e
//---------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
Packit 1c1d7e
                   const char *refFileName) : Definition(df,dl,1,na)
Packit 1c1d7e
{
Packit 1c1d7e
  fileList = new FileList;
Packit 1c1d7e
  classSDict = new ClassSDict(17);
Packit 1c1d7e
  groupList = new GroupList;
Packit 1c1d7e
  namespaceSDict = new NamespaceSDict(17);
Packit 1c1d7e
  pageDict = new PageSDict(17);
Packit 1c1d7e
  exampleDict = new PageSDict(17);
Packit 1c1d7e
  dirList = new DirList;
Packit 1c1d7e
  allMemberNameInfoSDict = new MemberNameInfoSDict(17);
Packit 1c1d7e
  allMemberNameInfoSDict->setAutoDelete(TRUE);
Packit 1c1d7e
  if (refFileName)
Packit 1c1d7e
  {
Packit 1c1d7e
    fileName=stripExtension(refFileName);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    fileName = convertNameToFile(QCString("group_")+na);
Packit 1c1d7e
  }
Packit 1c1d7e
  setGroupTitle( t );
Packit 1c1d7e
  memberGroupSDict = new MemberGroupSDict;
Packit 1c1d7e
  memberGroupSDict->setAutoDelete(TRUE);
Packit 1c1d7e
Packit 1c1d7e
  allMemberList = new MemberList(MemberListType_allMembersList);
Packit 1c1d7e
Packit 1c1d7e
  visited = 0;
Packit 1c1d7e
  groupScope = 0;
Packit 1c1d7e
  m_subGrouping=Config_getBool(SUBGROUPING);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
GroupDef::~GroupDef()
Packit 1c1d7e
{
Packit 1c1d7e
  delete fileList;
Packit 1c1d7e
  delete classSDict;
Packit 1c1d7e
  delete groupList;
Packit 1c1d7e
  delete namespaceSDict;
Packit 1c1d7e
  delete pageDict;
Packit 1c1d7e
  delete exampleDict;
Packit 1c1d7e
  delete allMemberList;
Packit 1c1d7e
  delete allMemberNameInfoSDict;
Packit 1c1d7e
  delete memberGroupSDict;
Packit 1c1d7e
  delete dirList;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::setGroupTitle( const char *t )
Packit 1c1d7e
{
Packit 1c1d7e
  if ( t && qstrlen(t) )
Packit 1c1d7e
  {
Packit 1c1d7e
    title = t;
Packit 1c1d7e
    titleSet = TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    title = name();
Packit 1c1d7e
    title.at(0)=toupper(title.at(0));
Packit 1c1d7e
    titleSet = FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::distributeMemberGroupDocumentation()
Packit 1c1d7e
{
Packit 1c1d7e
  MemberGroupSDict::Iterator mgli(*memberGroupSDict);
Packit 1c1d7e
  MemberGroup *mg;
Packit 1c1d7e
  for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
  {
Packit 1c1d7e
    mg->distributeMemberGroupDocumentation();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::findSectionsInDocumentation()
Packit 1c1d7e
{
Packit 1c1d7e
  docFindSections(documentation(),this,0,docFile());
Packit 1c1d7e
  MemberGroupSDict::Iterator mgli(*memberGroupSDict);
Packit 1c1d7e
  MemberGroup *mg;
Packit 1c1d7e
  for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
  {
Packit 1c1d7e
    mg->findSectionsInDocumentation();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->listType()&MemberListType_declarationLists)
Packit 1c1d7e
    {
Packit 1c1d7e
      ml->findSectionsInDocumentation();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addFile(const FileDef *def)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
Packit 1c1d7e
  if (def->isHidden()) return;
Packit 1c1d7e
  updateLanguage(def);
Packit 1c1d7e
  if (sortBriefDocs)
Packit 1c1d7e
    fileList->inSort(def);
Packit 1c1d7e
  else
Packit 1c1d7e
    fileList->append(def);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::addClass(const ClassDef *cd)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
Packit 1c1d7e
  if (cd->isHidden()) return FALSE;
Packit 1c1d7e
  updateLanguage(cd);
Packit 1c1d7e
  QCString qn = cd->name();
Packit 1c1d7e
  if (classSDict->find(qn)==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("--- addClass %s sort=%d\n",qn.data(),sortBriefDocs);
Packit 1c1d7e
    if (sortBriefDocs)
Packit 1c1d7e
    {
Packit 1c1d7e
      classSDict->inSort(qn,cd);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      int i=qn.findRev("::");
Packit 1c1d7e
      if (i==-1) i=qn.find('.');
Packit 1c1d7e
      bool found=FALSE;
Packit 1c1d7e
      //printf("i=%d\n",i);
Packit 1c1d7e
      if (i!=-1)
Packit 1c1d7e
      {
Packit 1c1d7e
        // add nested classes (e.g. A::B, A::C) after their parent (A) in 
Packit 1c1d7e
        // order of insertion
Packit 1c1d7e
        QCString scope = qn.left(i);
Packit 1c1d7e
        int j=classSDict->findAt(scope);
Packit 1c1d7e
        if (j!=-1)
Packit 1c1d7e
        {
Packit 1c1d7e
          while (j<(int)classSDict->count() && 
Packit 1c1d7e
              classSDict->at(j)->qualifiedName().left(i)==scope)
Packit 1c1d7e
          {
Packit 1c1d7e
            //printf("skipping over %s\n",classSDict->at(j)->qualifiedName().data());
Packit 1c1d7e
            j++;
Packit 1c1d7e
          }
Packit 1c1d7e
          //printf("Found scope at index %d\n",j);
Packit 1c1d7e
          classSDict->insertAt(j,qn,cd);
Packit 1c1d7e
          found=TRUE;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      if (!found) // no insertion point found -> just append
Packit 1c1d7e
      {
Packit 1c1d7e
        classSDict->append(qn,cd);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::addNamespace(const NamespaceDef *def)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
Packit 1c1d7e
  if (def->isHidden()) return FALSE;
Packit 1c1d7e
  updateLanguage(def);
Packit 1c1d7e
  if (namespaceSDict->find(def->name())==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (sortBriefDocs)
Packit 1c1d7e
      namespaceSDict->inSort(def->name(),def);  
Packit 1c1d7e
    else
Packit 1c1d7e
      namespaceSDict->append(def->name(),def);
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addDir(const DirDef *def)
Packit 1c1d7e
{
Packit 1c1d7e
  if (def->isHidden()) return;
Packit 1c1d7e
  if (Config_getBool(SORT_BRIEF_DOCS))
Packit 1c1d7e
    dirList->inSort(def);  
Packit 1c1d7e
  else
Packit 1c1d7e
    dirList->append(def);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addPage(PageDef *def)
Packit 1c1d7e
{
Packit 1c1d7e
  if (def->isHidden()) return;
Packit 1c1d7e
  //printf("Making page %s part of a group\n",def->name.data());
Packit 1c1d7e
  pageDict->append(def->name(),def);
Packit 1c1d7e
  def->makePartOfGroup(this);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addExample(const PageDef *def)
Packit 1c1d7e
{
Packit 1c1d7e
  if (def->isHidden()) return;
Packit 1c1d7e
  exampleDict->append(def->name(),def);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addMembersToMemberGroup()
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->listType()&MemberListType_declarationLists)
Packit 1c1d7e
    {
Packit 1c1d7e
      ::addMembersToMemberGroup(ml,&memberGroupSDict,this);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //printf("GroupDef::addMembersToMemberGroup() memberGroupList=%d\n",memberGroupList->count());
Packit 1c1d7e
  MemberGroupSDict::Iterator mgli(*memberGroupSDict);
Packit 1c1d7e
  MemberGroup *mg;
Packit 1c1d7e
  for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
  {
Packit 1c1d7e
    mg->setInGroup(TRUE);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::insertMember(MemberDef *md,bool docOnly)
Packit 1c1d7e
{
Packit 1c1d7e
  if (md->isHidden()) return FALSE;
Packit 1c1d7e
  updateLanguage(md);
Packit 1c1d7e
  //printf("GroupDef(%s)::insertMember(%s)\n", title.data(), md->name().data());
Packit 1c1d7e
  MemberNameInfo *mni=0;
Packit 1c1d7e
  if ((mni=(*allMemberNameInfoSDict)[md->name()]))
Packit 1c1d7e
  { // member with this name already found
Packit 1c1d7e
    MemberNameInfoIterator srcMnii(*mni); 
Packit 1c1d7e
    MemberInfo *srcMi;
Packit 1c1d7e
    for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberDef *srcMd = srcMi->memberDef;
Packit 1c1d7e
      if (srcMd==md) return FALSE; // already added before!
Packit 1c1d7e
Packit 1c1d7e
      bool sameScope = srcMd->getOuterScope()==md->getOuterScope() || // same class or namespace
Packit 1c1d7e
          // both inside a file => definition and declaration do not have to be in the same file
Packit 1c1d7e
           (srcMd->getOuterScope()->definitionType()==Definition::TypeFile &&
Packit 1c1d7e
               md->getOuterScope()->definitionType()==Definition::TypeFile); 
Packit 1c1d7e
Packit 1c1d7e
      ArgumentList *srcMdAl  = srcMd->argumentList();
Packit 1c1d7e
      ArgumentList *mdAl     = md->argumentList();
Packit 1c1d7e
      ArgumentList *tSrcMdAl = srcMd->templateArguments();
Packit 1c1d7e
      ArgumentList *tMdAl    = md->templateArguments();
Packit 1c1d7e
      
Packit 1c1d7e
      if (srcMd->isFunction() && md->isFunction() && // both are a function
Packit 1c1d7e
          ((tSrcMdAl==0 && tMdAl==0) || 
Packit 1c1d7e
           (tSrcMdAl!=0 && tMdAl!=0 && tSrcMdAl->count()==tMdAl->count())
Packit 1c1d7e
          ) &&       // same number of template arguments
Packit 1c1d7e
          matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMdAl,
Packit 1c1d7e
                          md->getOuterScope(),md->getFileDef(),mdAl,
Packit 1c1d7e
                          TRUE
Packit 1c1d7e
                         ) && // matching parameters
Packit 1c1d7e
          sameScope // both are found in the same scope
Packit 1c1d7e
         )
Packit 1c1d7e
      {
Packit 1c1d7e
        if (srcMd->getGroupAlias()==0) 
Packit 1c1d7e
        {
Packit 1c1d7e
          md->setGroupAlias(srcMd); 
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (md!=srcMd->getGroupAlias())
Packit 1c1d7e
        {
Packit 1c1d7e
          md->setGroupAlias(srcMd->getGroupAlias()); 
Packit 1c1d7e
        }
Packit 1c1d7e
        return FALSE; // member is the same as one that is already added
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    mni = new MemberNameInfo(md->name());
Packit 1c1d7e
    mni->append(new MemberInfo(md,md->protection(),md->virtualness(),FALSE));
Packit 1c1d7e
    allMemberNameInfoSDict->append(mni->memberName(),mni);
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("Added member!\n");
Packit 1c1d7e
  allMemberList->append(md); 
Packit 1c1d7e
  switch(md->memberType())
Packit 1c1d7e
  {
Packit 1c1d7e
    case MemberType_Variable:     
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decVarMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docVarMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Function: 
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decFuncMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docFuncMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Typedef:      
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decTypedefMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docTypedefMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Enumeration:  
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decEnumMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docEnumMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_EnumValue:    
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decEnumValMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docEnumValMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Define:       
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decDefineMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docDefineMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Signal:       
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decSignalMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docSignalMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Slot:       
Packit 1c1d7e
      if (md->protection()==Public)
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!docOnly)
Packit 1c1d7e
        {
Packit 1c1d7e
          addMemberToList(MemberListType_decPubSlotMembers,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        addMemberToList(MemberListType_docPubSlotMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (md->protection()==Protected)
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!docOnly)
Packit 1c1d7e
        {
Packit 1c1d7e
          addMemberToList(MemberListType_decProSlotMembers,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        addMemberToList(MemberListType_docProSlotMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!docOnly)
Packit 1c1d7e
        {
Packit 1c1d7e
          addMemberToList(MemberListType_decPriSlotMembers,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        addMemberToList(MemberListType_docPriSlotMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Event:       
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decEventMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docEventMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Property:       
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decPropMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docPropMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    case MemberType_Friend:       
Packit 1c1d7e
      if (!docOnly)
Packit 1c1d7e
      {
Packit 1c1d7e
        addMemberToList(MemberListType_decFriendMembers,md);
Packit 1c1d7e
      }
Packit 1c1d7e
      addMemberToList(MemberListType_docFriendMembers,md);
Packit 1c1d7e
      break;
Packit 1c1d7e
    default:
Packit 1c1d7e
      err("GroupDef::insertMembers(): "
Packit 1c1d7e
           "member `%s' (typeid=%d) with scope `%s' inserted in group scope `%s'!\n",
Packit 1c1d7e
           md->name().data(),md->memberType(),
Packit 1c1d7e
           md->getClassDef() ? md->getClassDef()->name().data() : "",
Packit 1c1d7e
           name().data());
Packit 1c1d7e
  }
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::removeMember(MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data());
Packit 1c1d7e
  MemberNameInfo *mni = allMemberNameInfoSDict->find(md->name());
Packit 1c1d7e
  if (mni)
Packit 1c1d7e
  {
Packit 1c1d7e
    MemberNameInfoIterator mnii(*mni);
Packit 1c1d7e
    while( mnii.current() )
Packit 1c1d7e
    {
Packit 1c1d7e
      if( mnii.current()->memberDef == md )
Packit 1c1d7e
      {
Packit 1c1d7e
	mni->remove(mnii.current());
Packit 1c1d7e
        break;
Packit 1c1d7e
      }
Packit 1c1d7e
      ++mnii;
Packit 1c1d7e
    }
Packit 1c1d7e
    if( mni->isEmpty() )
Packit 1c1d7e
    {
Packit 1c1d7e
      allMemberNameInfoSDict->remove(md->name());
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    removeMemberFromList(MemberListType_allMembersList,md);
Packit 1c1d7e
    switch(md->memberType())
Packit 1c1d7e
    {
Packit 1c1d7e
      case MemberType_Variable:
Packit 1c1d7e
	removeMemberFromList(MemberListType_decVarMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docVarMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Function: 
Packit 1c1d7e
        removeMemberFromList(MemberListType_decFuncMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docFuncMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Typedef:      
Packit 1c1d7e
        removeMemberFromList(MemberListType_decTypedefMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docTypedefMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Enumeration:  
Packit 1c1d7e
        removeMemberFromList(MemberListType_decEnumMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docEnumMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_EnumValue:    
Packit 1c1d7e
        removeMemberFromList(MemberListType_decEnumValMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docEnumValMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Define:       
Packit 1c1d7e
        removeMemberFromList(MemberListType_decDefineMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docDefineMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Signal:       
Packit 1c1d7e
        removeMemberFromList(MemberListType_decSignalMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docSignalMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Slot:       
Packit 1c1d7e
        if (md->protection()==Public)
Packit 1c1d7e
        {
Packit 1c1d7e
          removeMemberFromList(MemberListType_decPubSlotMembers,md);
Packit 1c1d7e
          removeMemberFromList(MemberListType_docPubSlotMembers,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        else if (md->protection()==Protected)
Packit 1c1d7e
        {
Packit 1c1d7e
          removeMemberFromList(MemberListType_decProSlotMembers,md);
Packit 1c1d7e
          removeMemberFromList(MemberListType_docProSlotMembers,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          removeMemberFromList(MemberListType_decPriSlotMembers,md);
Packit 1c1d7e
          removeMemberFromList(MemberListType_docPriSlotMembers,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Event:       
Packit 1c1d7e
        removeMemberFromList(MemberListType_decEventMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docEventMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Property:       
Packit 1c1d7e
        removeMemberFromList(MemberListType_decPropMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docPropMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case MemberType_Friend:       
Packit 1c1d7e
        removeMemberFromList(MemberListType_decFriendMembers,md);
Packit 1c1d7e
        removeMemberFromList(MemberListType_docFriendMembers,md);
Packit 1c1d7e
        break;
Packit 1c1d7e
      default:
Packit 1c1d7e
        err("GroupDef::removeMember(): unexpected member remove in file!\n");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::findGroup(const GroupDef *def) const
Packit 1c1d7e
{
Packit 1c1d7e
  if (this==def)
Packit 1c1d7e
  {
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (groupList)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupListIterator it(*groupList);
Packit 1c1d7e
    GroupDef *gd;
Packit 1c1d7e
    for (;(gd=it.current());++it)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (gd->findGroup(def))
Packit 1c1d7e
      {
Packit 1c1d7e
        return TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addGroup(const GroupDef *def)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("adding group `%s' to group `%s'\n",def->name().data(),name().data());
Packit 1c1d7e
  //if (Config_getBool(SORT_MEMBER_DOCS))
Packit 1c1d7e
  //  groupList->inSort(def);
Packit 1c1d7e
  //else
Packit 1c1d7e
  groupList->append(def);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::isASubGroup() const
Packit 1c1d7e
{
Packit 1c1d7e
  GroupList *groups = partOfGroups();
Packit 1c1d7e
  return groups!=0 && groups->count()!=0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
int GroupDef::countMembers() const
Packit 1c1d7e
{
Packit 1c1d7e
  return fileList->count()+
Packit 1c1d7e
         classSDict->count()+
Packit 1c1d7e
         namespaceSDict->count()+
Packit 1c1d7e
         groupList->count()+
Packit 1c1d7e
         allMemberList->count()+
Packit 1c1d7e
         pageDict->count()+
Packit 1c1d7e
         exampleDict->count();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*! Compute the HTML anchor names for all members in the group */ 
Packit 1c1d7e
void GroupDef::computeAnchors()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("GroupDef::computeAnchors()\n");
Packit 1c1d7e
  setAnchors(allMemberList);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeTagFile(FTextStream &tagFile)
Packit 1c1d7e
{
Packit 1c1d7e
  tagFile << "  <compound kind=\"group\">" << endl;
Packit 1c1d7e
  tagFile << "    <name>" << convertToXML(name()) << "</name>" << endl;
Packit 1c1d7e
  tagFile << "    <title>" << convertToXML(title) << "</title>" << endl;
Packit 1c1d7e
  tagFile << "    <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
Packit 1c1d7e
  QListIterator<LayoutDocEntry> eli(
Packit 1c1d7e
      LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
Packit 1c1d7e
  LayoutDocEntry *lde;
Packit 1c1d7e
  for (eli.toFirst();(lde=eli.current());++eli)
Packit 1c1d7e
  {
Packit 1c1d7e
    switch (lde->kind())
Packit 1c1d7e
    {
Packit 1c1d7e
      case LayoutDocEntry::GroupClasses:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (classSDict)
Packit 1c1d7e
          {
Packit 1c1d7e
            SDict<ClassDef>::Iterator ci(*classSDict);
Packit 1c1d7e
            ClassDef *cd;
Packit 1c1d7e
            for (ci.toFirst();(cd=ci.current());++ci)
Packit 1c1d7e
            {
Packit 1c1d7e
              if (cd->isLinkableInProject())
Packit 1c1d7e
              {
Packit 1c1d7e
                tagFile << "    <class kind=\"" << cd->compoundTypeString()
Packit 1c1d7e
                        << "\">" << convertToXML(cd->name()) << "</class>" << endl;
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupNamespaces:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (namespaceSDict)
Packit 1c1d7e
          {
Packit 1c1d7e
            SDict<NamespaceDef>::Iterator ni(*namespaceSDict);
Packit 1c1d7e
            NamespaceDef *nd;
Packit 1c1d7e
            for (ni.toFirst();(nd=ni.current());++ni)
Packit 1c1d7e
            {
Packit 1c1d7e
              if (nd->isLinkableInProject())
Packit 1c1d7e
              {
Packit 1c1d7e
                tagFile << "    <namespace>" << convertToXML(nd->name())
Packit 1c1d7e
                        << "</namespace>" << endl;
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupFiles:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (fileList)
Packit 1c1d7e
          {
Packit 1c1d7e
            QListIterator<FileDef> it(*fileList);
Packit 1c1d7e
            FileDef *fd;
Packit 1c1d7e
            for (;(fd=it.current());++it)
Packit 1c1d7e
            {
Packit 1c1d7e
              if (fd->isLinkableInProject())
Packit 1c1d7e
              {
Packit 1c1d7e
                tagFile << "    <file>" << convertToXML(fd->name()) << "</file>" << endl;
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupPageDocs:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (pageDict)
Packit 1c1d7e
          {
Packit 1c1d7e
            PageSDict::Iterator pdi(*pageDict);
Packit 1c1d7e
            PageDef *pd=0;
Packit 1c1d7e
            for (pdi.toFirst();(pd=pdi.current());++pdi)
Packit 1c1d7e
            {
Packit 1c1d7e
              QCString pageName = pd->getOutputFileBase();
Packit 1c1d7e
              if (pd->isLinkableInProject())
Packit 1c1d7e
              {
Packit 1c1d7e
                tagFile << "    <page>" << convertToXML(pageName) << "</page>" << endl;
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupDirs:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (dirList)
Packit 1c1d7e
          {
Packit 1c1d7e
            QListIterator<DirDef> it(*dirList);
Packit 1c1d7e
            DirDef *dd;
Packit 1c1d7e
            for (;(dd=it.current());++it)
Packit 1c1d7e
            {
Packit 1c1d7e
              if (dd->isLinkableInProject())
Packit 1c1d7e
              {
Packit 1c1d7e
                tagFile << "    <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupNestedGroups:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (groupList)
Packit 1c1d7e
          {
Packit 1c1d7e
            QListIterator<GroupDef> it(*groupList);
Packit 1c1d7e
            GroupDef *gd;
Packit 1c1d7e
            for (;(gd=it.current());++it)
Packit 1c1d7e
            {
Packit 1c1d7e
              if (gd->isVisible())
Packit 1c1d7e
              {
Packit 1c1d7e
                tagFile << "    <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
Packit 1c1d7e
              }
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::MemberDecl:
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
Packit 1c1d7e
          MemberList * ml = getMemberList(lmd->type);
Packit 1c1d7e
          if (ml)
Packit 1c1d7e
          {
Packit 1c1d7e
            ml->writeTagFile(tagFile);
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::MemberGroups:
Packit 1c1d7e
        {
Packit 1c1d7e
          if (memberGroupSDict)
Packit 1c1d7e
          {
Packit 1c1d7e
            MemberGroupSDict::Iterator mgli(*memberGroupSDict);
Packit 1c1d7e
            MemberGroup *mg;
Packit 1c1d7e
            for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
            {
Packit 1c1d7e
              mg->writeTagFile(tagFile);
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      default:
Packit 1c1d7e
        break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  writeDocAnchorsToTagFile(tagFile);
Packit 1c1d7e
  tagFile << "  </compound>" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeDetailedDescription(OutputList &ol,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  if ((!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF)) 
Packit 1c1d7e
      || !documentation().isEmpty() || !inbodyDocumentation().isEmpty()
Packit 1c1d7e
     )
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.pushGeneratorState();
Packit 1c1d7e
    if (pageDict->count()!=countMembers()) // not only pages -> classical layout
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
        ol.disable(OutputGenerator::Html);
Packit 1c1d7e
        ol.writeRuler();
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
        ol.disableAllBut(OutputGenerator::Html);
Packit 1c1d7e
        ol.writeAnchor(0,"details");
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.disableAllBut(OutputGenerator::Man); // always print title for man page
Packit 1c1d7e
    }
Packit 1c1d7e
    ol.startGroupHeader();
Packit 1c1d7e
    ol.parseText(title);
Packit 1c1d7e
    ol.endGroupHeader();
Packit 1c1d7e
    ol.popGeneratorState();
Packit 1c1d7e
Packit 1c1d7e
    // repeat brief description
Packit 1c1d7e
    if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF))
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.generateDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
    // write separator between brief and details
Packit 1c1d7e
    if (!briefDescription().isEmpty() && Config_getBool(REPEAT_BRIEF) &&
Packit 1c1d7e
        !documentation().isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
      ol.disable(OutputGenerator::Man);
Packit 1c1d7e
      ol.disable(OutputGenerator::RTF);
Packit 1c1d7e
      // ol.newParagraph(); // FIXME:PARA
Packit 1c1d7e
      ol.enableAll();
Packit 1c1d7e
      ol.disableAllBut(OutputGenerator::Man);
Packit 1c1d7e
      ol.enable(OutputGenerator::Latex);
Packit 1c1d7e
      ol.writeString("\n\n");
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    // write detailed documentation
Packit 1c1d7e
    if (!documentation().isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.generateDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    // write inbody documentation
Packit 1c1d7e
    if (!inbodyDocumentation().isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.generateDoc(inbodyFile(),inbodyLine(),this,0,inbodyDocumentation()+"\n",TRUE,FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeBriefDescription(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  if (hasBriefDescription())
Packit 1c1d7e
  {
Packit 1c1d7e
    DocRoot *rootNode = validatingParseDoc(briefFile(),briefLine(),this,0,
Packit 1c1d7e
                                briefDescription(),TRUE,FALSE,0,TRUE,FALSE);
Packit 1c1d7e
    if (rootNode && !rootNode->isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.startParagraph();
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
      ol.disableAllBut(OutputGenerator::Man);
Packit 1c1d7e
      ol.writeString(" - ");
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
      ol.writeDoc(rootNode,this,0);
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
      ol.disable(OutputGenerator::RTF);
Packit 1c1d7e
      ol.writeString(" \n");
Packit 1c1d7e
      ol.enable(OutputGenerator::RTF);
Packit 1c1d7e
Packit 1c1d7e
      if (Config_getBool(REPEAT_BRIEF) ||
Packit 1c1d7e
          !documentation().isEmpty()
Packit 1c1d7e
         )
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.disableAllBut(OutputGenerator::Html);
Packit 1c1d7e
        ol.startTextLink(0,"details");
Packit 1c1d7e
        ol.parseText(theTranslator->trMore());
Packit 1c1d7e
        ol.endTextLink();
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
      ol.endParagraph();
Packit 1c1d7e
    }
Packit 1c1d7e
    delete rootNode;
Packit 1c1d7e
  }
Packit 1c1d7e
  ol.writeSynopsis();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeGroupGraph(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  if (Config_getBool(HAVE_DOT) /*&& Config_getBool(GROUP_GRAPHS)*/ )
Packit 1c1d7e
  {
Packit 1c1d7e
    DotGroupCollaboration graph(this);
Packit 1c1d7e
    if (!graph.isTrivial())
Packit 1c1d7e
    {
Packit 1c1d7e
      msg("Generating dependency graph for group %s\n",qualifiedName().data());
Packit 1c1d7e
      ol.pushGeneratorState();
Packit 1c1d7e
      ol.disable(OutputGenerator::Man);
Packit 1c1d7e
      //ol.startParagraph();
Packit 1c1d7e
      ol.startGroupCollaboration();
Packit 1c1d7e
      ol.parseText(theTranslator->trCollaborationDiagram(title));
Packit 1c1d7e
      ol.endGroupCollaboration(graph);
Packit 1c1d7e
      //ol.endParagraph();
Packit 1c1d7e
      ol.popGeneratorState();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeFiles(OutputList &ol,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  // write list of files
Packit 1c1d7e
  if (fileList->count()>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.startMemberHeader("files");
Packit 1c1d7e
    ol.parseText(title);
Packit 1c1d7e
    ol.endMemberHeader();
Packit 1c1d7e
    ol.startMemberList();
Packit 1c1d7e
    QListIterator<FileDef> it(*fileList);
Packit 1c1d7e
    FileDef *fd;
Packit 1c1d7e
    for (;(fd=it.current());++it)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!fd->hasDocumentation()) continue;
Packit 1c1d7e
      ol.startMemberDeclaration();
Packit 1c1d7e
      ol.startMemberItem(fd->getOutputFileBase(),0);
Packit 1c1d7e
      ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
Packit 1c1d7e
      ol.insertMemberAlign();
Packit 1c1d7e
      ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
Packit 1c1d7e
      ol.endMemberItem();
Packit 1c1d7e
      if (!fd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.startMemberDescription(fd->getOutputFileBase());
Packit 1c1d7e
        ol.generateDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
Packit 1c1d7e
        ol.endMemberDescription();
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.endMemberDeclaration(0,0);
Packit 1c1d7e
    }
Packit 1c1d7e
    ol.endMemberList();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeNamespaces(OutputList &ol,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  // write list of namespaces
Packit 1c1d7e
  namespaceSDict->writeDeclaration(ol,title);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  // write list of groups
Packit 1c1d7e
  int count=0;
Packit 1c1d7e
  if (groupList->count()>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    QListIterator<GroupDef> it(*groupList);
Packit 1c1d7e
    GroupDef *gd;
Packit 1c1d7e
    for (;(gd=it.current());++it)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (gd->isVisible()) count++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (count>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.startMemberHeader("groups");
Packit 1c1d7e
    ol.parseText(title);
Packit 1c1d7e
    ol.endMemberHeader();
Packit 1c1d7e
    ol.startMemberList();
Packit 1c1d7e
    if (Config_getBool(SORT_GROUP_NAMES))
Packit 1c1d7e
    {
Packit 1c1d7e
      groupList->sort();
Packit 1c1d7e
    }
Packit 1c1d7e
    QListIterator<GroupDef> it(*groupList);
Packit 1c1d7e
    GroupDef *gd;
Packit 1c1d7e
    for (;(gd=it.current());++it)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (gd->isVisible())
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!gd->hasDocumentation()) continue;
Packit 1c1d7e
        ol.startMemberDeclaration();
Packit 1c1d7e
        ol.startMemberItem(gd->getOutputFileBase(),0);
Packit 1c1d7e
        //ol.docify(theTranslator->trGroup(FALSE,TRUE));
Packit 1c1d7e
        //ol.docify(" ");
Packit 1c1d7e
        ol.insertMemberAlign();
Packit 1c1d7e
        ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),0,gd->groupTitle());
Packit 1c1d7e
        ol.endMemberItem();
Packit 1c1d7e
        if (!gd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
Packit 1c1d7e
        {
Packit 1c1d7e
          ol.startMemberDescription(gd->getOutputFileBase());
Packit 1c1d7e
          ol.generateDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
Packit 1c1d7e
          ol.endMemberDescription();
Packit 1c1d7e
        }
Packit 1c1d7e
        ol.endMemberDeclaration(0,0);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    ol.endMemberList();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeDirs(OutputList &ol,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  // write list of directories
Packit 1c1d7e
  if (dirList->count()>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.startMemberHeader("dirs");
Packit 1c1d7e
    ol.parseText(title);
Packit 1c1d7e
    ol.endMemberHeader();
Packit 1c1d7e
    ol.startMemberList();
Packit 1c1d7e
    QListIterator<DirDef> it(*dirList);
Packit 1c1d7e
    DirDef *dd;
Packit 1c1d7e
    for (;(dd=it.current());++it)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!dd->hasDocumentation()) continue;
Packit 1c1d7e
      ol.startMemberDeclaration();
Packit 1c1d7e
      ol.startMemberItem(dd->getOutputFileBase(),0);
Packit 1c1d7e
      ol.parseText(theTranslator->trDir(FALSE,TRUE));
Packit 1c1d7e
      ol.insertMemberAlign();
Packit 1c1d7e
      ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
Packit 1c1d7e
      ol.endMemberItem();
Packit 1c1d7e
      if (!dd->briefDescription().isEmpty() && Config_getBool(BRIEF_MEMBER_DESC))
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.startMemberDescription(dd->getOutputFileBase());
Packit 1c1d7e
        ol.generateDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE);
Packit 1c1d7e
        ol.endMemberDescription();
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.endMemberDeclaration(0,0);
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    ol.endMemberList();
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeClasses(OutputList &ol,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  // write list of classes
Packit 1c1d7e
  classSDict->writeDeclaration(ol,0,title,FALSE);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeInlineClasses(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  classSDict->writeDocumentation(ol);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writePageDocumentation(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  PageDef *pd=0;
Packit 1c1d7e
  PageSDict::Iterator pdi(*pageDict);
Packit 1c1d7e
  for (pdi.toFirst();(pd=pdi.current());++pdi)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!pd->isReference())
Packit 1c1d7e
    {
Packit 1c1d7e
      SectionInfo *si=0;
Packit 1c1d7e
      if (!pd->title().isEmpty() && !pd->name().isEmpty() &&
Packit 1c1d7e
          (si=Doxygen::sectionDict->find(pd->name()))!=0)
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.startSection(si->label,si->title,SectionInfo::Subsection);
Packit 1c1d7e
        ol.docify(si->title);
Packit 1c1d7e
        ol.endSection(si->label,SectionInfo::Subsection);
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.startTextBlock();
Packit 1c1d7e
      ol.generateDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE);
Packit 1c1d7e
      ol.endTextBlock();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeMemberGroups(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  /* write user defined member groups */
Packit 1c1d7e
  if (memberGroupSDict)
Packit 1c1d7e
  {
Packit 1c1d7e
    memberGroupSDict->sort();
Packit 1c1d7e
    /* write user defined member groups */
Packit 1c1d7e
    MemberGroupSDict::Iterator mgli(*memberGroupSDict);
Packit 1c1d7e
    MemberGroup *mg;
Packit 1c1d7e
    for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
    {
Packit 1c1d7e
      mg->writeDeclarations(ol,0,0,0,this);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::startMemberDeclarations(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  ol.startMemberSections();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::endMemberDeclarations(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  ol.endMemberSections();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::startMemberDocumentation(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("** GroupDef::startMemberDocumentation()\n");
Packit 1c1d7e
  if (Config_getBool(SEPARATE_MEMBER_PAGES))
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.pushGeneratorState();
Packit 1c1d7e
    ol.disable(OutputGenerator::Html);
Packit 1c1d7e
    Doxygen::suppressDocWarnings = TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::endMemberDocumentation(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("** GroupDef::endMemberDocumentation()\n");
Packit 1c1d7e
  if (Config_getBool(SEPARATE_MEMBER_PAGES))
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.popGeneratorState();
Packit 1c1d7e
    Doxygen::suppressDocWarnings = FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeAuthorSection(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  // write Author section (Man only)
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  ol.disableAllBut(OutputGenerator::Man);
Packit 1c1d7e
  ol.startGroupHeader();
Packit 1c1d7e
  ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
Packit 1c1d7e
  ol.endGroupHeader();
Packit 1c1d7e
  ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString(PROJECT_NAME)));
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeSummaryLinks(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  ol.disableAllBut(OutputGenerator::Html);
Packit 1c1d7e
  QListIterator<LayoutDocEntry> eli(
Packit 1c1d7e
      LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
Packit 1c1d7e
  LayoutDocEntry *lde;
Packit 1c1d7e
  bool first=TRUE;
Packit 1c1d7e
  SrcLangExt lang = getLanguage();
Packit 1c1d7e
  for (eli.toFirst();(lde=eli.current());++eli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if ((lde->kind()==LayoutDocEntry::GroupClasses && classSDict->declVisible()) || 
Packit 1c1d7e
        (lde->kind()==LayoutDocEntry::GroupNamespaces && namespaceSDict->declVisible()) ||
Packit 1c1d7e
        (lde->kind()==LayoutDocEntry::GroupFiles && fileList->count()>0) ||
Packit 1c1d7e
        (lde->kind()==LayoutDocEntry::GroupNestedGroups && groupList->count()>0) ||
Packit 1c1d7e
        (lde->kind()==LayoutDocEntry::GroupDirs && dirList->count()>0)
Packit 1c1d7e
       )
Packit 1c1d7e
    {
Packit 1c1d7e
      LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
      QCString label = lde->kind()==LayoutDocEntry::GroupClasses      ? "nested-classes" : 
Packit 1c1d7e
                       lde->kind()==LayoutDocEntry::GroupNamespaces   ? "namespaces"     :
Packit 1c1d7e
                       lde->kind()==LayoutDocEntry::GroupFiles        ? "files"          :
Packit 1c1d7e
                       lde->kind()==LayoutDocEntry::GroupNestedGroups ? "groups"         :
Packit 1c1d7e
                       "dirs";
Packit 1c1d7e
      ol.writeSummaryLink(0,label,ls->title(lang),first);
Packit 1c1d7e
      first=FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (lde->kind()==LayoutDocEntry::MemberDecl)
Packit 1c1d7e
    {
Packit 1c1d7e
      LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
Packit 1c1d7e
      MemberList * ml = getMemberList(lmd->type);
Packit 1c1d7e
      if (ml && ml->declVisible())
Packit 1c1d7e
      {
Packit 1c1d7e
        ol.writeSummaryLink(0,MemberList::listTypeAsString(ml->listType()),lmd->title(lang),first);
Packit 1c1d7e
        first=FALSE;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!first)
Packit 1c1d7e
  {
Packit 1c1d7e
    ol.writeString("  \n");
Packit 1c1d7e
  }
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeDocumentation(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  //static bool generateTreeView = Config_getBool(GENERATE_TREEVIEW);
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  startFile(ol,getOutputFileBase(),name(),title,HLI_Modules);
Packit 1c1d7e
Packit 1c1d7e
  ol.startHeaderSection();
Packit 1c1d7e
  writeSummaryLinks(ol);
Packit 1c1d7e
  ol.startTitleHead(getOutputFileBase());
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  ol.disable(OutputGenerator::Man);
Packit 1c1d7e
  ol.parseText(title);
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
  addGroupListToTitle(ol,this);
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  ol.disable(OutputGenerator::Man);
Packit 1c1d7e
  ol.endTitleHead(getOutputFileBase(),title);
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  ol.disableAllBut(OutputGenerator::Man);
Packit 1c1d7e
  ol.endTitleHead(getOutputFileBase(),name());
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
  ol.endHeaderSection();
Packit 1c1d7e
  ol.startContents();
Packit 1c1d7e
Packit 1c1d7e
  if (Doxygen::searchIndex)
Packit 1c1d7e
  {
Packit 1c1d7e
    Doxygen::searchIndex->setCurrentDoc(this,anchor(),FALSE);
Packit 1c1d7e
    static QRegExp we("[a-zA-Z_][-a-zA-Z_0-9]*");
Packit 1c1d7e
    int i=0,p=0,l=0;
Packit 1c1d7e
    while ((i=we.match(title,p,&l))!=-1) // foreach word in the title
Packit 1c1d7e
    {
Packit 1c1d7e
      Doxygen::searchIndex->addWord(title.mid(i,l),TRUE);
Packit 1c1d7e
      p=i+l;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  Doxygen::indexList->addIndexItem(this,0,0,title);
Packit 1c1d7e
Packit 1c1d7e
  //---------------------------------------- start flexible part -------------------------------
Packit 1c1d7e
Packit 1c1d7e
  SrcLangExt lang=getLanguage();
Packit 1c1d7e
  QListIterator<LayoutDocEntry> eli(
Packit 1c1d7e
      LayoutDocManager::instance().docEntries(LayoutDocManager::Group));
Packit 1c1d7e
  LayoutDocEntry *lde;
Packit 1c1d7e
  for (eli.toFirst();(lde=eli.current());++eli)
Packit 1c1d7e
  {
Packit 1c1d7e
    switch (lde->kind())
Packit 1c1d7e
    {
Packit 1c1d7e
      case LayoutDocEntry::BriefDesc: 
Packit 1c1d7e
        writeBriefDescription(ol);
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::MemberDeclStart: 
Packit 1c1d7e
        startMemberDeclarations(ol);
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::GroupClasses: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
          writeClasses(ol,ls->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::GroupInlineClasses: 
Packit 1c1d7e
        {
Packit 1c1d7e
          writeInlineClasses(ol);
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupNamespaces: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
          writeNamespaces(ol,ls->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::MemberGroups: 
Packit 1c1d7e
        writeMemberGroups(ol);
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::MemberDecl: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;
Packit 1c1d7e
          writeMemberDeclarations(ol,lmd->type,lmd->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::MemberDeclEnd: 
Packit 1c1d7e
        endMemberDeclarations(ol);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::DetailedDesc: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
          writeDetailedDescription(ol,ls->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::MemberDefStart: 
Packit 1c1d7e
        startMemberDocumentation(ol);
Packit 1c1d7e
        break; 
Packit 1c1d7e
      case LayoutDocEntry::MemberDef: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;
Packit 1c1d7e
          writeMemberDocumentation(ol,lmd->type,lmd->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::MemberDefEnd: 
Packit 1c1d7e
        endMemberDocumentation(ol);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupNestedGroups: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
          writeNestedGroups(ol,ls->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupPageDocs: 
Packit 1c1d7e
        writePageDocumentation(ol);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupDirs: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
          writeDirs(ol,ls->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupFiles: 
Packit 1c1d7e
        {
Packit 1c1d7e
          LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;
Packit 1c1d7e
          writeFiles(ol,ls->title(lang));
Packit 1c1d7e
        }
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::GroupGraph: 
Packit 1c1d7e
        writeGroupGraph(ol);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::AuthorSection: 
Packit 1c1d7e
        writeAuthorSection(ol);
Packit 1c1d7e
        break;
Packit 1c1d7e
      case LayoutDocEntry::ClassIncludes:
Packit 1c1d7e
      case LayoutDocEntry::ClassInheritanceGraph:
Packit 1c1d7e
      case LayoutDocEntry::ClassNestedClasses:
Packit 1c1d7e
      case LayoutDocEntry::ClassCollaborationGraph:
Packit 1c1d7e
      case LayoutDocEntry::ClassAllMembersLink:
Packit 1c1d7e
      case LayoutDocEntry::ClassUsedFiles:
Packit 1c1d7e
      case LayoutDocEntry::ClassInlineClasses:
Packit 1c1d7e
      case LayoutDocEntry::NamespaceNestedNamespaces:
Packit 1c1d7e
      case LayoutDocEntry::NamespaceNestedConstantGroups:
Packit 1c1d7e
      case LayoutDocEntry::NamespaceClasses:
Packit 1c1d7e
      case LayoutDocEntry::NamespaceInlineClasses:
Packit 1c1d7e
      case LayoutDocEntry::FileClasses:
Packit 1c1d7e
      case LayoutDocEntry::FileNamespaces:
Packit 1c1d7e
      case LayoutDocEntry::FileConstantGroups:
Packit 1c1d7e
      case LayoutDocEntry::FileIncludes:
Packit 1c1d7e
      case LayoutDocEntry::FileIncludeGraph:
Packit 1c1d7e
      case LayoutDocEntry::FileIncludedByGraph: 
Packit 1c1d7e
      case LayoutDocEntry::FileSourceLink:
Packit 1c1d7e
      case LayoutDocEntry::FileInlineClasses:
Packit 1c1d7e
      case LayoutDocEntry::DirSubDirs:
Packit 1c1d7e
      case LayoutDocEntry::DirFiles:
Packit 1c1d7e
      case LayoutDocEntry::DirGraph:
Packit 1c1d7e
        err("Internal inconsistency: member %d should not be part of "
Packit 1c1d7e
            "LayoutDocManager::Group entry list\n",lde->kind());
Packit 1c1d7e
        break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //---------------------------------------- end flexible part -------------------------------
Packit 1c1d7e
Packit 1c1d7e
  endFile(ol); 
Packit 1c1d7e
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
Packit 1c1d7e
  if (Config_getBool(SEPARATE_MEMBER_PAGES))
Packit 1c1d7e
  {
Packit 1c1d7e
    allMemberList->sort();
Packit 1c1d7e
    writeMemberPages(ol);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeMemberPages(OutputList &ol)
Packit 1c1d7e
{
Packit 1c1d7e
  ol.pushGeneratorState();
Packit 1c1d7e
  ol.disableAllBut(OutputGenerator::Html);
Packit 1c1d7e
  
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->listType()&MemberListType_documentationLists)
Packit 1c1d7e
    {
Packit 1c1d7e
       ml->writeDocumentationPage(ol,name(),this);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  ol.popGeneratorState();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
Packit 1c1d7e
{
Packit 1c1d7e
  static bool createSubDirs=Config_getBool(CREATE_SUBDIRS);
Packit 1c1d7e
Packit 1c1d7e
  ol.writeString("      
\n");
Packit 1c1d7e
  ol.writeString("        \n");
Packit 1c1d7e
Packit 1c1d7e
  MemberListIterator mli(*allMemberList);
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  for (mli.toFirst();(md=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->getGroupDef()==this && md->isLinkable() && !md->isEnumValue())
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.writeString("          ");
Packit 1c1d7e
      if (md->isLinkableInProject())
Packit 1c1d7e
      {
Packit 1c1d7e
        if (md==currentMd) // selected item => highlight
Packit 1c1d7e
        {
Packit 1c1d7e
          ol.writeString("
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          ol.writeString("
Packit 1c1d7e
        }
Packit 1c1d7e
        ol.writeString("href=\"");
Packit 1c1d7e
        if (createSubDirs) ol.writeString("../../");
Packit 1c1d7e
        ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());
Packit 1c1d7e
        ol.writeString("\">");
Packit 1c1d7e
        ol.writeString(convertToHtml(md->localName()));
Packit 1c1d7e
        ol.writeString("");
Packit 1c1d7e
      }
Packit 1c1d7e
      ol.writeString("\n");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  ol.writeString("        \n");
Packit 1c1d7e
  ol.writeString("      \n");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//---- helper functions ------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
void addClassToGroups(Entry *root,ClassDef *cd)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<Grouping> gli(*root->groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *gd=0;
Packit 1c1d7e
    if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (gd->addClass(cd)) 
Packit 1c1d7e
      {
Packit 1c1d7e
        cd->makePartOfGroup(gd);
Packit 1c1d7e
      }
Packit 1c1d7e
      //printf("Compound %s: in group %s\n",cd->name().data(),gd->groupTitle());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void addNamespaceToGroups(Entry *root,NamespaceDef *nd)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("root->groups->count()=%d\n",root->groups->count());
Packit 1c1d7e
  QListIterator<Grouping> gli(*root->groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *gd=0;
Packit 1c1d7e
    //printf("group `%s'\n",s->data());
Packit 1c1d7e
    if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (gd->addNamespace(nd)) nd->makePartOfGroup(gd);
Packit 1c1d7e
      //printf("Namespace %s: in group %s\n",nd->name().data(),s->data());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void addDirToGroups(Entry *root,DirDef *dd)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("*** root->groups->count()=%d\n",root->groups->count());
Packit 1c1d7e
  QListIterator<Grouping> gli(*root->groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *gd=0;
Packit 1c1d7e
    //printf("group `%s'\n",g->groupname.data());
Packit 1c1d7e
    if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
Packit 1c1d7e
    {
Packit 1c1d7e
      gd->addDir(dd);
Packit 1c1d7e
      dd->makePartOfGroup(gd);
Packit 1c1d7e
      //printf("Dir %s: in group %s\n",dd->name().data(),g->groupname.data());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void addGroupToGroups(Entry *root,GroupDef *subGroup)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("addGroupToGroups for %s groups=%d\n",root->name.data(),
Packit 1c1d7e
  //    root->groups?root->groups->count():-1);
Packit 1c1d7e
  QListIterator<Grouping> gli(*root->groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *gd=0;
Packit 1c1d7e
    if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (gd==subGroup)
Packit 1c1d7e
      {
Packit 1c1d7e
        warn(root->fileName,root->startLine,"Refusing to add group %s to itself",
Packit 1c1d7e
            gd->name().data());
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (subGroup->findGroup(gd))
Packit 1c1d7e
      {
Packit 1c1d7e
        warn(root->fileName,root->startLine,"Refusing to add group %s to group %s, since the latter is already a "
Packit 1c1d7e
                                            "subgroup of the former\n", subGroup->name().data(),gd->name().data());
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (!gd->findGroup(subGroup))
Packit 1c1d7e
      {
Packit 1c1d7e
        gd->addGroup(subGroup);
Packit 1c1d7e
        subGroup->makePartOfGroup(gd);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*! Add a member to the group with the highest priority */
Packit 1c1d7e
void addMemberToGroups(Entry *root,MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("addMemberToGroups:  Root %p = %s, md %p=%s groups=%d\n", 
Packit 1c1d7e
  //    root, root->name.data(), md, md->name().data(), root->groups->count() );
Packit 1c1d7e
  QListIterator<Grouping> gli(*root->groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
Packit 1c1d7e
  // Search entry's group list for group with highest pri.
Packit 1c1d7e
  Grouping::GroupPri_t pri = Grouping::GROUPING_LOWEST;
Packit 1c1d7e
  GroupDef *fgd=0;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *gd=0;
Packit 1c1d7e
    if (!g->groupname.isEmpty() &&
Packit 1c1d7e
        (gd=Doxygen::groupSDict->find(g->groupname)) &&
Packit 1c1d7e
        g->pri >= pri)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (fgd && gd!=fgd && g->pri==pri) 
Packit 1c1d7e
      {
Packit 1c1d7e
        warn(root->fileName.data(), root->startLine,
Packit 1c1d7e
            "Member %s found in multiple %s groups! "
Packit 1c1d7e
            "The member will be put in group %s, and not in group %s",
Packit 1c1d7e
            md->name().data(), Grouping::getGroupPriName( pri ),
Packit 1c1d7e
            gd->name().data(), fgd->name().data()
Packit 1c1d7e
            );
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      fgd = gd;
Packit 1c1d7e
      pri = g->pri;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("fgd=%p\n",fgd);
Packit 1c1d7e
Packit 1c1d7e
  // put member into group defined by this entry?
Packit 1c1d7e
  if (fgd)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *mgd = md->getGroupDef();
Packit 1c1d7e
    //printf("mgd=%p\n",mgd);
Packit 1c1d7e
    bool insertit = FALSE;
Packit 1c1d7e
    if (mgd==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      insertit = TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (mgd!=fgd)
Packit 1c1d7e
    {
Packit 1c1d7e
      bool moveit = FALSE;
Packit 1c1d7e
Packit 1c1d7e
      // move member from one group to another if 
Packit 1c1d7e
      // - the new one has a higher priority
Packit 1c1d7e
      // - the new entry has the same priority, but with docs where the old one had no docs
Packit 1c1d7e
      if (md->getGroupPri()
Packit 1c1d7e
      {
Packit 1c1d7e
        moveit = TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        if (md->getGroupPri()==pri)
Packit 1c1d7e
        {
Packit 1c1d7e
          if (!root->doc.isEmpty() && !md->getGroupHasDocs())
Packit 1c1d7e
          {
Packit 1c1d7e
            moveit = TRUE;
Packit 1c1d7e
          }
Packit 1c1d7e
          else if (!root->doc.isEmpty() && md->getGroupHasDocs())
Packit 1c1d7e
          {
Packit 1c1d7e
            warn(md->getGroupFileName(),md->getGroupStartLine(),
Packit 1c1d7e
                "Member documentation for %s found several times in %s groups!\n"
Packit 1c1d7e
                "%s:%d: The member will remain in group %s, and won't be put into group %s",
Packit 1c1d7e
                md->name().data(), Grouping::getGroupPriName( pri ),
Packit 1c1d7e
                root->fileName.data(), root->startLine,
Packit 1c1d7e
                mgd->name().data(),
Packit 1c1d7e
                fgd->name().data()
Packit 1c1d7e
                );
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      if (moveit)
Packit 1c1d7e
      {
Packit 1c1d7e
        //printf("removeMember\n");
Packit 1c1d7e
        mgd->removeMember(md);
Packit 1c1d7e
        insertit = TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    if (insertit)
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("insertMember found at %s line %d: %s: related %s\n",
Packit 1c1d7e
      //    md->getDefFileName().data(),md->getDefLine(),
Packit 1c1d7e
      //    md->name().data(),root->relates.data());
Packit 1c1d7e
      bool success = fgd->insertMember(md);
Packit 1c1d7e
      if (success)
Packit 1c1d7e
      {
Packit 1c1d7e
        //printf("insertMember successful\n");
Packit 1c1d7e
        md->setGroupDef(fgd,pri,root->fileName,root->startLine,
Packit 1c1d7e
            !root->doc.isEmpty());
Packit 1c1d7e
        ClassDef *cd = md->getClassDefOfAnonymousType();
Packit 1c1d7e
        if (cd) 
Packit 1c1d7e
        {
Packit 1c1d7e
          cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void addExampleToGroups(Entry *root,PageDef *eg)
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<Grouping> gli(*root->groups);
Packit 1c1d7e
  Grouping *g;
Packit 1c1d7e
  for (;(g=gli.current());++gli)
Packit 1c1d7e
  {
Packit 1c1d7e
    GroupDef *gd=0;
Packit 1c1d7e
    if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict->find(g->groupname)))
Packit 1c1d7e
    {
Packit 1c1d7e
      gd->addExample(eg);
Packit 1c1d7e
      eg->makePartOfGroup(gd);
Packit 1c1d7e
      //printf("Example %s: in group %s\n",eg->name().data(),s->data());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QCString GroupDef::getOutputFileBase() const
Packit 1c1d7e
{
Packit 1c1d7e
  return fileName;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addListReferences()
Packit 1c1d7e
{
Packit 1c1d7e
  {
Packit 1c1d7e
    QList<ListItemInfo> *xrefItems = xrefListItems();
Packit 1c1d7e
    addRefItem(xrefItems,
Packit 1c1d7e
             getOutputFileBase(),
Packit 1c1d7e
             theTranslator->trGroup(TRUE,TRUE),
Packit 1c1d7e
             getOutputFileBase(),name(),
Packit 1c1d7e
             0,
Packit 1c1d7e
             0
Packit 1c1d7e
            );
Packit 1c1d7e
  }
Packit 1c1d7e
  MemberGroupSDict::Iterator mgli(*memberGroupSDict);
Packit 1c1d7e
  MemberGroup *mg;
Packit 1c1d7e
  for (;(mg=mgli.current());++mgli)
Packit 1c1d7e
  {
Packit 1c1d7e
    mg->addListReferences(this);
Packit 1c1d7e
  }
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->listType()&MemberListType_documentationLists)
Packit 1c1d7e
    {
Packit 1c1d7e
      ml->addListReferences(this);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberList *GroupDef::createMemberList(MemberListType lt)
Packit 1c1d7e
{
Packit 1c1d7e
  m_memberLists.setAutoDelete(TRUE);
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (mli.toFirst();(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->listType()==lt)
Packit 1c1d7e
    {
Packit 1c1d7e
      return ml;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  // not found, create a new member list
Packit 1c1d7e
  ml = new MemberList(lt);
Packit 1c1d7e
  m_memberLists.append(ml);
Packit 1c1d7e
  ml->setInGroup(TRUE);
Packit 1c1d7e
  return ml;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::addMemberToList(MemberListType lt,MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool sortBriefDocs = Config_getBool(SORT_BRIEF_DOCS);
Packit 1c1d7e
  static bool sortMemberDocs = Config_getBool(SORT_MEMBER_DOCS);
Packit 1c1d7e
  MemberList *ml = createMemberList(lt);
Packit 1c1d7e
  ml->setNeedsSorting(
Packit 1c1d7e
      ((ml->listType()&MemberListType_declarationLists) && sortBriefDocs) ||
Packit 1c1d7e
      ((ml->listType()&MemberListType_documentationLists) && sortMemberDocs));
Packit 1c1d7e
  ml->append(md);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::sortMemberLists()
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (;(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
MemberList *GroupDef::getMemberList(MemberListType lt) const
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<MemberList> mli(m_memberLists);
Packit 1c1d7e
  MemberList *ml;
Packit 1c1d7e
  for (;(ml=mli.current());++mli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ml->listType()==lt)
Packit 1c1d7e
    {
Packit 1c1d7e
      return ml;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeMemberDeclarations(OutputList &ol,MemberListType lt,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool optimizeVhdl = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
Packit 1c1d7e
Packit 1c1d7e
  MemberList * ml = getMemberList(lt);
Packit 1c1d7e
  if (optimizeVhdl && ml) 
Packit 1c1d7e
  {
Packit 1c1d7e
    VhdlDocGen::writeVhdlDeclarations(ml,ol,this,0,0,0);
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (ml) 
Packit 1c1d7e
  {
Packit 1c1d7e
    ml->writeDeclarations(ol,0,0,0,this,title,0);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::writeMemberDocumentation(OutputList &ol,MemberListType lt,const QCString &title)
Packit 1c1d7e
{
Packit 1c1d7e
  MemberList * ml = getMemberList(lt);
Packit 1c1d7e
  if (ml) ml->writeDocumentation(ol,name(),this,title);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::removeMemberFromList(MemberListType lt,MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
    MemberList *ml = getMemberList(lt);
Packit 1c1d7e
    if (ml) ml->remove(md); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void GroupDef::sortSubGroups() 
Packit 1c1d7e
{ 
Packit 1c1d7e
    groupList->sort(); 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::isLinkableInProject() const
Packit 1c1d7e
{
Packit 1c1d7e
  return !isReference() && isLinkable();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::isLinkable() const
Packit 1c1d7e
{
Packit 1c1d7e
  return hasUserDocumentation();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// let the "programming language" for a group depend on what is inserted into it.
Packit 1c1d7e
// First item that has an associated languages determines the language for the whole group.
Packit 1c1d7e
void GroupDef::updateLanguage(const Definition *d)
Packit 1c1d7e
{
Packit 1c1d7e
  if (getLanguage()==SrcLangExt_Unknown && d->getLanguage()!=SrcLangExt_Unknown)
Packit 1c1d7e
  {
Packit 1c1d7e
    setLanguage(d->getLanguage());
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool GroupDef::hasDetailedDescription() const
Packit 1c1d7e
{
Packit 1c1d7e
  static bool repeatBrief = Config_getBool(REPEAT_BRIEF);
Packit 1c1d7e
  return ((!briefDescription().isEmpty() && repeatBrief) ||
Packit 1c1d7e
          !documentation().isEmpty());
Packit 1c1d7e
}
Packit 1c1d7e