compoundhandler.h 9.77 KB
Newer Older
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1 2 3 4 5
/******************************************************************************
 *
 * $Id$
 *
 *
6
 * Copyright (C) 1997-2012 by Dimitri van Heesch.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
7 8 9 10 11 12 13 14
 *
 * 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.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
15 16 17 18 19 20
#ifndef _COMPOUNDHANDLER_H
#define _COMPOUNDHANDLER_H

#include <qstring.h>
#include <qlist.h>
#include <qxml.h>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
21
#include <doxmlintf.h>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
22

23
#include "stringimpl.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
24
#include "basehandler.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
25
#include "baseiterator.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
26

Dimitri van Heesch's avatar
Dimitri van Heesch committed
27
class MainHandler;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
28
class DocHandler;
29
class ProgramListingHandler;
30 31
class GraphHandler;
class MemberHandler;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
32 33
class CompoundHandler;
class SectionHandler;
34
class ParamHandler;
35 36
class TemplateParamListHandler;
class TitleHandler;
37
class ListOfAllMembersHandler;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
38

39
class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
{
  public:
    IncludeHandler(IBaseHandler *parent,const char *endtag);
    virtual ~IncludeHandler();

    void startInclude(const QXmlAttributes &attrib);
    void endInclude();

    // IInclude
    virtual const IString * name() const 
    { return &m_name; }
    virtual const IString * refId() const
    { return &m_refId; }
    virtual bool isLocal() const
    { return &m_isLocal; }

  private:
    IBaseHandler *m_parent;
58 59 60
    StringImpl m_name;             // element's content
    StringImpl m_refId;            // refid
    bool m_isLocal;                // local
61 62 63 64 65 66 67 68 69 70
};

class IncludeIterator : public BaseIterator<IIncludeIterator,IInclude,IncludeHandler>
{
  public:
    IncludeIterator(const QList<IncludeHandler> &list) : 
      BaseIterator<IIncludeIterator,IInclude,IncludeHandler>(list) {}
};


Dimitri van Heesch's avatar
Dimitri van Heesch committed
71 72 73 74 75 76 77 78 79 80
class RelatedCompound : public IRelatedCompound
{
  public:
    RelatedCompound(CompoundHandler *parent,
                    const QString &id,
                    Protection prot,
                    Kind kind
                   ) :
      m_parent(parent), m_id(id), m_protection(prot), m_kind(kind) {}
    virtual ~RelatedCompound() {}
81
    void setName(const QString &str) { m_name = str; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
82 83 84 85

    virtual ICompound *compound() const;
    virtual Protection protection() const { return m_protection; }
    virtual Kind kind() const { return m_kind; }
86
    virtual const IString *name() const { return &m_name; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
87 88 89
    
  private:  
    CompoundHandler *m_parent;
90 91 92 93
    QString m_id;                  // refid
    Protection m_protection;       // prot
    Kind m_kind;                   // virt
    StringImpl m_name;             // element's content
Dimitri van Heesch's avatar
Dimitri van Heesch committed
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
};

class RelatedCompoundIterator : public BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>
{
  public:
    RelatedCompoundIterator(const QList<RelatedCompound> &list) : 
      BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>(list) {}
};


class CompoundHandler : public IClass,
                        public IStruct,
                        public IUnion,
                        public IException,
                        public IInterface,
                        public INamespace,
                        public IFile,
                        public IGroup,
                        public IPage,
                        public BaseHandler<CompoundHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
114
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
115
    friend class RelatedCompound;
116

Dimitri van Heesch's avatar
Dimitri van Heesch committed
117 118 119
  public:
    virtual void startSection(const QXmlAttributes& attrib);
    virtual void startCompound(const QXmlAttributes& attrib);
120 121 122 123
    virtual void startSuperClass(const QXmlAttributes& attrib);
    virtual void endSuperClass();
    virtual void startSubClass(const QXmlAttributes& attrib);
    virtual void endSubClass();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
124 125 126 127
    virtual void endCompound();
    virtual void endCompoundName();
    virtual void startBriefDesc(const QXmlAttributes& attrib);
    virtual void startDetailedDesc(const QXmlAttributes& attrib);
128
    virtual void startLocation(const QXmlAttributes& attrib);
129
    virtual void startProgramListing(const QXmlAttributes& attrib);
130 131
    virtual void startInheritanceGraph(const QXmlAttributes& attrib);
    virtual void startCollaborationGraph(const QXmlAttributes& attrib);
132 133
    virtual void startIncludeDependencyGraph(const QXmlAttributes& attrib);
    virtual void startIncludedByDependencyGraph(const QXmlAttributes& attrib);
134 135 136
    virtual void startIncludes(const QXmlAttributes& attrib);
    virtual void startIncludedBy(const QXmlAttributes& attrib);
    virtual void startInnerDir(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
137
    virtual void startInnerClass(const QXmlAttributes& attrib);
138 139 140
    virtual void startInnerNamespace(const QXmlAttributes& attrib);
    virtual void startInnerFile(const QXmlAttributes& attrib);
    virtual void startInnerGroup(const QXmlAttributes& attrib);
141
    virtual void startInnerPage(const QXmlAttributes& attrib);
142 143
    virtual void startTitle(const QXmlAttributes& attrib);
    virtual void startTemplateParamList(const QXmlAttributes& attrib);
144
    virtual void startListOfAllMembers(const QXmlAttributes& attrib);
145
    virtual void addref() { m_refCount++; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
146

147
    CompoundHandler(const QString &dirName);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
148
    virtual ~CompoundHandler();
149
    bool parseXML(const char *compId);
150 151
    void initialize(MainHandler *mh);
    void insertMember(MemberHandler *mh);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
152
    ICompound *toICompound() const;
153

Dimitri van Heesch's avatar
Dimitri van Heesch committed
154
    // ICompound implementation
155 156
    const IString *name() const { return &m_name; }
    const IString *id()   const { return &m_id;   }
157
    CompoundKind kind() const { return m_kind; }
158
    const IString *kindString() const { return &m_kindString; }
159 160 161
    ISectionIterator *sections() const;
    IDocRoot *briefDescription() const;
    IDocRoot *detailedDescription() const;
162 163
    IMember *memberById(const char *id) const;
    IMemberIterator *memberByName(const char *name) const;
164
    IParamIterator *templateParameters() const;
165
    void release();
166

Dimitri van Heesch's avatar
Dimitri van Heesch committed
167 168 169
    // IClass implementation
    IGraph *inheritanceGraph() const;
    IGraph *collaborationGraph() const;
170 171 172 173
    IRelatedCompoundIterator *baseCompounds() const;
    IRelatedCompoundIterator *derivedCompounds() const;
    ICompoundIterator *nestedCompounds() const;
    ICompoundIterator *nestedGroup() const;
174 175
    const IString *locationFile() const { return &m_defFile; }
    int locationLine() const { return m_defLine; }
176
    const IString *locationBodyFile() const { return &m_defBodyFile; }
177 178
    int locationBodyStartLine() const { return m_defBodyStart; }
    int locationBodyEndLine() const { return m_defBodyEnd; }
179
    IMemberReferenceIterator *members() const;
180 181 182 183

    // IFile implementation
    IGraph *includeDependencyGraph() const; 
    IGraph *includedByDependencyGraph() const;
184
    IDocProgramListing *source() const;
185 186
    IIncludeIterator *includes() const;
    IIncludeIterator *includedBy() const;
187 188 189

    // IPage implementation
    const IDocTitle *title() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
190
    
Dimitri van Heesch's avatar
Dimitri van Heesch committed
191
  private:
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
                                                                // XML elements:
                                                                // -------------
    StringImpl                     m_name;                      // compoundname
    TitleHandler*                  m_titleHandler;              // title
    QList<RelatedCompound>         m_subClasses;                // basecompoundref
    QList<RelatedCompound>         m_superClasses;              // derivedcompoundref
    QList<IncludeHandler>          m_includes;                  // includes
    QList<IncludeHandler>          m_includedBy;                // includedBy
    GraphHandler*                  m_includeDependencyGraph;    // incdepgraph
    GraphHandler*                  m_includedByDependencyGraph; // invincdepgraph
    QList<QString>                 m_innerCompounds;            // innerdir/innerfile/innerclass/innernamespace/innergroup
    TemplateParamListHandler*      m_templateParamList;         // templateparamlist
    QList<SectionHandler>          m_sections;                  // sectiondef
    DocHandler*                    m_brief;                     // briefdescription
    DocHandler*                    m_detailed;                  // detaileddescription
    GraphHandler*                  m_inheritanceGraph;          // inheritancegraph
    GraphHandler*                  m_collaborationGraph;        // collaborationgraph
    ProgramListingHandler*         m_programListing;            // programlisting
                                                                // location
    StringImpl                     m_defFile;                   // - file
    int                            m_defLine;                   // - line
    StringImpl                     m_defBodyFile;               // - bodyfile
    int                            m_defBodyStart;              // - bodystart 
    int                            m_defBodyEnd;                // - bodyend
    ListOfAllMembersHandler*       m_members;                   // listofallmember

                                                                // XML attributes:
                                                                // ---------------
    StringImpl                     m_id;                        // id
    CompoundKind                   m_kind;                      // kind
    StringImpl                     m_kindString;                // kind as a string
    StringImpl                     m_protection;                // prot

    // local variables
    QString                        m_xmlDir;                    // directory where the info is found
    int                            m_refCount;                  // object reference counter
    QDict<MemberHandler>           m_memberDict;                // id->member lookup
    QDict<QList<MemberHandler> >   m_memberNameDict;            // name->memberlist lookup
    MainHandler*                   m_mainHandler;               // parent object
Dimitri van Heesch's avatar
Dimitri van Heesch committed
231 232
};

233 234 235
void compoundhandler_init();
void compoundhandler_exit();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
236
#endif