Orb/Doxygen/src/membergroup.cpp
changeset 0 42188c7ea2d9
child 4 468f4c8d3d5b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Orb/Doxygen/src/membergroup.cpp	Thu Jan 21 17:29:01 2010 +0000
@@ -0,0 +1,359 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include "qtbc.h"
+#include "membergroup.h"
+#include "memberlist.h"
+#include "outputlist.h"
+#include "util.h"
+#include "classdef.h"
+#include "namespacedef.h"
+#include "filedef.h"
+#include "language.h"
+#include "groupdef.h"
+#include "doxygen.h"
+#include "docparser.h"
+#include "marshal.h"
+#include "entry.h"
+#include "md5.h"
+
+//static QCString idToName(int id)
+//{
+//  QCString result;
+//  result.sprintf("mgroup_%d",id);
+//  return result;
+//}
+
+MemberGroup::MemberGroup()
+{
+}
+
+MemberGroup::MemberGroup(Definition *parent,
+      int id,const char *hdr,const char *d,const char *docFile) 
+{
+  //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
+  memberList      = new MemberList(MemberList::memberGroup);
+  grpId           = id;
+  grpHeader       = hdr;
+  doc             = d;
+  scope           = 0;
+  inSameSection   = TRUE;
+  inDeclSection   = 0;
+  m_numDecMembers = -1;
+  m_numDocMembers = -1;
+  m_parent        = parent;
+  m_docFile       = docFile;
+  m_xrefListItems = 0;
+  doc.prepend("<a name=\""+anchor()+"\"></a>");
+  //printf("Member group docs=`%s'\n",doc.data());
+}
+
+MemberGroup::~MemberGroup()
+{
+  delete memberList;
+}
+
+void MemberGroup::insertMember(MemberDef *md)
+{
+  //printf("MemberGroup::insertMember m_parent=%s memberList=%p count=%d"
+  //       " member section list: %p\n",
+  //       m_parent ? m_parent->name().data() : "<null>",
+  //       memberList->first() ? memberList->first()->getSectionList(m_parent) : 0,
+  //       memberList->count(),
+  //       md->getSectionList(m_parent));
+  MemberDef *firstMd = memberList->first();
+  if (inSameSection && memberList->count()>0 && 
+      firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
+  {
+    inSameSection=FALSE;
+  }
+  else if (inDeclSection==0)
+  {
+    inDeclSection = md->getSectionList(m_parent);
+    //printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType());
+  }
+  memberList->append(md);
+
+  // copy the group of the first member in the memberGroup
+  GroupDef *gd;
+  if (firstMd && (gd=firstMd->getGroupDef()))
+  {
+    md->setGroupDef(gd, firstMd->getGroupPri(), 
+                    firstMd->getGroupFileName(), firstMd->getGroupStartLine(), 
+                    firstMd->getGroupHasDocs());
+    gd->insertMember(md);
+  }
+}
+
+
+void MemberGroup::setAnchors(ClassDef *context)
+{
+  ::setAnchors(context,'z',memberList,grpId);
+}
+
+void MemberGroup::writeDeclarations(OutputList &ol,
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
+{
+  //printf("MemberGroup::writeDeclarations() memberList->count()=%d\n",memberList->count());
+  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc/*,TRUE,TRUE*/);
+}
+
+void MemberGroup::writePlainDeclarations(OutputList &ol,
+               ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
+              )
+{
+  //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
+  memberList->writePlainDeclarations(ol,cd,nd,fd,gd);
+}
+
+void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
+               Definition *container)
+{
+  memberList->writeDocumentation(ol,scopeName,container,0);
+}
+
+void MemberGroup::writeDocumentationPage(OutputList &ol,const char *scopeName,
+               Definition *container)
+{
+  memberList->writeDocumentationPage(ol,scopeName,container);
+}
+
+/*! Add this group as a subsection of the declaration section, instead
+ *  of rendering it in its own section
+ */
+void MemberGroup::addToDeclarationSection()
+{
+  if (inDeclSection)
+  {
+    //printf("Adding group %p to list %p (type=%d)\n",this,
+    //                              inDeclSection,inDeclSection->listType());
+    inDeclSection->addMemberGroup(this);
+  }
+}
+
+int MemberGroup::countDecMembers(/*bool sectionPerType*/)
+{
+  if (m_numDecMembers==-1) /* number of member not cached */
+  {
+    memberList->countDecMembers(/*TRUE,TRUE,sectionPerType*/);
+    m_numDecMembers = memberList->numDecMembers();
+  }
+  return m_numDecMembers;
+}
+
+int MemberGroup::countDocMembers()
+{
+  if (m_numDocMembers==-1)
+  {
+    memberList->countDocMembers();
+    m_numDocMembers = memberList->numDocMembers();
+  }
+  return m_numDocMembers;
+}
+
+void MemberGroup::distributeMemberGroupDocumentation()
+{
+  //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
+  MemberDef *md=memberList->first();
+  while (md)
+  {
+    //printf("checking md=%s\n",md->name().data());
+    // find the first member of the group with documentation
+    if (!md->documentation().isEmpty()       ||
+        !md->briefDescription().isEmpty()    ||
+        !md->inbodyDocumentation().isEmpty()
+       )
+    {
+      //printf("found it!\n");
+      break;
+    }
+    md=memberList->next();
+  }
+  if (md) // distribute docs of md to other members of the list
+  {
+    //printf("Member %s has documentation!\n",md->name().data());
+    MemberDef *omd=memberList->first();
+    while (omd)
+    {
+      if (md!=omd && omd->documentation().isEmpty() && 
+                     omd->briefDescription().isEmpty() && 
+                     omd->inbodyDocumentation().isEmpty()
+         )
+      {
+        //printf("Copying documentation to member %s\n",omd->name().data());
+        omd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
+        omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
+        omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
+      }
+      omd=memberList->next();
+    }
+  }
+}
+
+int MemberGroup::varCount() const
+{
+  return memberList->varCount();
+}
+
+int MemberGroup::funcCount() const      
+{ 
+  return memberList->funcCount(); 
+}
+
+int MemberGroup::enumCount() const      
+{ 
+  return memberList->enumCount(); 
+}
+
+int MemberGroup::enumValueCount() const 
+{ 
+  return memberList->enumValueCount(); 
+}
+
+int MemberGroup::typedefCount() const   
+{ 
+  return memberList->typedefCount(); 
+}
+
+int MemberGroup::protoCount() const     
+{ 
+  return memberList->protoCount(); 
+}
+
+int MemberGroup::defineCount() const    
+{ 
+  return memberList->defineCount(); 
+}
+
+int MemberGroup::friendCount() const    
+{ 
+  return memberList->friendCount(); 
+}
+
+int MemberGroup::numDecMembers() const  
+{ 
+  return memberList->numDecMembers(); 
+}
+
+int MemberGroup::numDocMembers() const  
+{ 
+  return memberList->numDocMembers(); 
+}
+
+void MemberGroup::setInGroup(bool b)
+{
+  memberList->setInGroup(b);
+}
+
+QCString MemberGroup::anchor() const
+{
+  uchar md5_sig[16];
+  QCString sigStr(33);
+  MD5Buffer((const unsigned char *)grpHeader.data(),grpHeader.length(),md5_sig);
+  MD5SigToString(md5_sig,sigStr.data(),33);
+  return "amgrp"+sigStr;
+}
+
+void MemberGroup::addListReferences(Definition *def)
+{
+  memberList->addListReferences(def);
+  if (m_xrefListItems && def)
+  {
+    QCString name = def->getOutputFileBase()+"#"+anchor();
+    addRefItem(m_xrefListItems,
+        name,
+        theTranslator->trGroup(TRUE,TRUE),
+        name,
+        grpHeader,0);
+  }
+}
+
+void MemberGroup::findSectionsInDocumentation()
+{
+  docFindSections(doc,0,this,m_docFile);
+  memberList->findSectionsInDocumentation();
+}
+
+void MemberGroup::marshal(StorageIntf *s)
+{
+  marshalMemberList(s,memberList);
+  marshalObjPointer(s,inDeclSection); // reference only
+  marshalInt(s,grpId);
+  marshalQCString(s,grpHeader);
+  marshalQCString(s,fileName);
+  marshalObjPointer(s,scope);
+  marshalQCString(s,doc);
+  marshalBool(s,inSameSection);
+  marshalInt(s,m_numDecMembers);
+  marshalInt(s,m_numDocMembers);
+  marshalObjPointer(s,m_parent);
+  marshalQCString(s,m_docFile);
+  marshalItemInfoList (Doxygen::symbolStorage,m_xrefListItems);
+}
+
+void MemberGroup::unmarshal(StorageIntf *s)
+{
+  memberList      = unmarshalMemberList(s);
+  inDeclSection   = (MemberList *)unmarshalObjPointer(s); 
+  grpId           = unmarshalInt(s);
+  grpHeader       = unmarshalQCString(s);
+  fileName        = unmarshalQCString(s);
+  scope           = (Definition *)unmarshalObjPointer(s);
+  doc             = unmarshalQCString(s);
+  inSameSection   = unmarshalBool(s);
+  m_numDecMembers = unmarshalInt(s);
+  m_numDocMembers = unmarshalInt(s);
+  m_parent        = (Definition *)unmarshalObjPointer(s);
+  m_docFile       = unmarshalQCString(s);
+  m_xrefListItems = unmarshalItemInfoList (Doxygen::symbolStorage);
+}
+
+void MemberGroup::setRefItems(const QList<ListItemInfo> *sli)
+{
+  if (sli)
+  {
+    // deep copy the list
+    if (m_xrefListItems==0) 
+    {
+      m_xrefListItems=new QList<ListItemInfo>;
+      m_xrefListItems->setAutoDelete(TRUE);
+    }
+    QListIterator<ListItemInfo> slii(*sli);
+    ListItemInfo *lii;
+    for (slii.toFirst();(lii=slii.current());++slii)
+    {
+      m_xrefListItems->append(new ListItemInfo(*lii));
+    } 
+  }
+}
+//--------------------------------------------------------------------------
+
+void MemberGroupInfo::setRefItems(const QList<ListItemInfo> *sli)
+{
+  if (!sli) return;
+  if (m_sli==0)
+  {
+    m_sli = new QList<ListItemInfo>;
+    m_sli->setAutoDelete(TRUE);
+  }
+  QListIterator<ListItemInfo> slii(*sli);
+  ListItemInfo *ili;
+  for (slii.toFirst();(ili=slii.current());++slii)
+  {
+    m_sli->append(new ListItemInfo(*ili));
+  }
+}