linkedtexthandler.cpp 3.71 KB
Newer Older
dimitri's avatar
dimitri committed
1 2 3 4 5
/******************************************************************************
 *
 * $Id$
 *
 *
dimitri's avatar
dimitri committed
6
 * Copyright (C) 1997-2006 by Dimitri van Heesch.
dimitri's avatar
dimitri committed
7 8 9 10 11 12 13 14 15
 *
 * 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.
 *
 */
#include "linkedtexthandler.h"
dimitri's avatar
dimitri committed
16
#include "debug.h"
dimitri's avatar
dimitri committed
17
#include <doxmlintf.h>
dimitri's avatar
dimitri committed
18
#include "stringimpl.h"
dimitri's avatar
dimitri committed
19

dimitri's avatar
dimitri committed
20
class LT_Text : public LinkedTextImpl, public ILT_Text
dimitri's avatar
dimitri committed
21 22 23 24 25 26
{
  public:
    LT_Text(const QString &text) : m_text(text) {}
    virtual ~LT_Text() {}

    // ILT_Text
dimitri's avatar
dimitri committed
27 28
    virtual const IString *text() const { return &m_text; }
    virtual Kind kind() const     { return LinkedTextImpl::Kind_Text; }
dimitri's avatar
dimitri committed
29
  private:
dimitri's avatar
dimitri committed
30
    StringImpl m_text;
dimitri's avatar
dimitri committed
31 32
};

dimitri's avatar
dimitri committed
33
class LT_Ref : public LinkedTextImpl, public ILT_Ref
dimitri's avatar
dimitri committed
34 35 36 37 38 39 40
{
  public:
    LT_Ref() {}
    virtual ~LT_Ref() {}
    void setRefId(const QString &refId) { m_refId=refId; }
    void setText(const QString &text) { m_text=text; }
    void setExtId(const QString &extId) { m_extId=extId; }
dimitri's avatar
dimitri committed
41
    void setTargetKind(TargetKind k) { m_targetKind=k; }
dimitri's avatar
dimitri committed
42 43

    // ILT_Ref
dimitri's avatar
dimitri committed
44 45
    virtual const IString *text() const { return &m_text; }
    virtual const IString * id() const { return &m_refId; }
dimitri's avatar
dimitri committed
46
    virtual TargetKind targetKind() const { return m_targetKind; }
dimitri's avatar
dimitri committed
47
    virtual const IString *external() const { return &m_extId; }
dimitri's avatar
dimitri committed
48
    virtual Kind kind() const { return LinkedTextImpl::Kind_Ref; }
dimitri's avatar
dimitri committed
49 50
    
  private:
dimitri's avatar
dimitri committed
51 52 53
    StringImpl    m_refId;
    StringImpl    m_extId;
    StringImpl    m_text;
dimitri's avatar
dimitri committed
54
    TargetKind m_targetKind;
dimitri's avatar
dimitri committed
55 56 57
};

LinkedTextHandler::LinkedTextHandler(IBaseHandler *parent,
dimitri's avatar
dimitri committed
58
                                     QList<LinkedTextImpl> &children
dimitri's avatar
dimitri committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
                                    ) 
 : m_parent(parent), m_children(children)
{
  addStartHandler("ref",this,&LinkedTextHandler::startRef);
  addEndHandler("ref",this,&LinkedTextHandler::endRef);
  m_children.setAutoDelete(TRUE);
  m_ref=0;
}

LinkedTextHandler::~LinkedTextHandler()
{
}

void LinkedTextHandler::start(const char *endTag)
{
  addEndHandler(endTag,this,&LinkedTextHandler::end);
  m_parent->setDelegate(this);
  m_curString="";
}

void LinkedTextHandler::end()
{
  if (!m_curString.isEmpty())
  {
    m_children.append(new LT_Text(m_curString));
dimitri's avatar
dimitri committed
84
    debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
dimitri's avatar
dimitri committed
85 86 87 88 89 90 91 92 93 94
    m_curString="";
  }
  m_parent->setDelegate(0);
}

void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
{
  if (!m_curString.isEmpty())
  {
    m_children.append(new LT_Text(m_curString));
dimitri's avatar
dimitri committed
95
    debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
dimitri's avatar
dimitri committed
96 97 98 99
    m_curString="";
  }
  ASSERT(m_ref==0);
  m_ref = new LT_Ref;
dimitri's avatar
dimitri committed
100
  m_ref->setRefId(attrib.value("refid"));
dimitri's avatar
dimitri committed
101
  m_ref->setExtId(attrib.value("external"));
dimitri's avatar
dimitri committed
102
  ASSERT(attrib.value("kindref")=="compound" || attrib.value("kindref")=="member");
dimitri's avatar
dimitri committed
103
  m_ref->setTargetKind(attrib.value("kindref")=="compound" ? ILT_Ref::Compound : ILT_Ref::Member);
dimitri's avatar
dimitri committed
104 105 106 107 108 109
}

void LinkedTextHandler::endRef()
{
  m_ref->setText(m_curString);
  m_children.append(m_ref);
dimitri's avatar
dimitri committed
110
  debug(2,"LinkedTextHandler: add ref `%s'\n",m_ref->text()->latin1());
dimitri's avatar
dimitri committed
111 112 113
  m_ref=0;
}

dimitri's avatar
dimitri committed
114
QString LinkedTextHandler::toString(const QList<LinkedTextImpl> &list) 
dimitri's avatar
dimitri committed
115
{
dimitri's avatar
dimitri committed
116
  QListIterator<LinkedTextImpl> li(list);
dimitri's avatar
dimitri committed
117
  QString result;
dimitri's avatar
dimitri committed
118
  LinkedTextImpl *lt;
dimitri's avatar
dimitri committed
119 120 121 122 123
  for (li.toFirst();(lt=li.current());++li)
  {
    switch(lt->kind())
    {
      case ILinkedText::Kind_Text:
dimitri's avatar
dimitri committed
124
        result+=dynamic_cast<ILT_Text*>(lt)->text()->latin1();
dimitri's avatar
dimitri committed
125 126
        break;
      case ILinkedText::Kind_Ref:
dimitri's avatar
dimitri committed
127
        result+=dynamic_cast<ILT_Ref *>(lt)->text()->latin1();
dimitri's avatar
dimitri committed
128 129 130 131 132
        break;
    }
  }
  return result;
}
dimitri's avatar
dimitri committed
133