Blame addon/doxmlparser/src/linkedtexthandler.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * $Id$
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
 */
Packit 1c1d7e
#include "linkedtexthandler.h"
Packit 1c1d7e
#include "debug.h"
Packit 1c1d7e
#include <doxmlintf.h>
Packit 1c1d7e
#include "stringimpl.h"
Packit 1c1d7e
Packit 1c1d7e
class LT_Text : public LinkedTextImpl, public ILT_Text
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    LT_Text(const QString &text) : m_text(text) {}
Packit 1c1d7e
    virtual ~LT_Text() {}
Packit 1c1d7e
Packit 1c1d7e
    // ILT_Text
Packit 1c1d7e
    virtual const IString *text() const { return &m_text; }
Packit 1c1d7e
    virtual Kind kind() const     { return LinkedTextImpl::Kind_Text; }
Packit 1c1d7e
  private:
Packit 1c1d7e
    StringImpl m_text;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
class LT_Ref : public LinkedTextImpl, public ILT_Ref
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    LT_Ref() {}
Packit 1c1d7e
    virtual ~LT_Ref() {}
Packit 1c1d7e
    void setRefId(const QString &refId) { m_refId=refId; }
Packit 1c1d7e
    void setText(const QString &text) { m_text=text; }
Packit 1c1d7e
    void setExtId(const QString &extId) { m_extId=extId; }
Packit 1c1d7e
    void setTargetKind(TargetKind k) { m_targetKind=k; }
Packit 1c1d7e
Packit 1c1d7e
    // ILT_Ref
Packit 1c1d7e
    virtual const IString *text() const { return &m_text; }
Packit 1c1d7e
    virtual const IString * id() const { return &m_refId; }
Packit 1c1d7e
    virtual TargetKind targetKind() const { return m_targetKind; }
Packit 1c1d7e
    virtual const IString *external() const { return &m_extId; }
Packit 1c1d7e
    virtual Kind kind() const { return LinkedTextImpl::Kind_Ref; }
Packit 1c1d7e
    
Packit 1c1d7e
  private:
Packit 1c1d7e
    StringImpl    m_refId;
Packit 1c1d7e
    StringImpl    m_extId;
Packit 1c1d7e
    StringImpl    m_text;
Packit 1c1d7e
    TargetKind m_targetKind;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
LinkedTextHandler::LinkedTextHandler(IBaseHandler *parent,
Packit 1c1d7e
                                     QList<LinkedTextImpl> &children
Packit 1c1d7e
                                    ) 
Packit 1c1d7e
 : m_parent(parent), m_children(children)
Packit 1c1d7e
{
Packit 1c1d7e
  addStartHandler("ref",this,&LinkedTextHandler::startRef);
Packit 1c1d7e
  addEndHandler("ref",this,&LinkedTextHandler::endRef);
Packit 1c1d7e
  m_children.setAutoDelete(TRUE);
Packit 1c1d7e
  m_ref=0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
LinkedTextHandler::~LinkedTextHandler()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void LinkedTextHandler::start(const char *endTag)
Packit 1c1d7e
{
Packit 1c1d7e
  addEndHandler(endTag,this,&LinkedTextHandler::end);
Packit 1c1d7e
  m_parent->setDelegate(this);
Packit 1c1d7e
  m_curString="";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void LinkedTextHandler::end()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_curString.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_children.append(new LT_Text(m_curString));
Packit 1c1d7e
    debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
Packit 1c1d7e
    m_curString="";
Packit 1c1d7e
  }
Packit 1c1d7e
  m_parent->setDelegate(0);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!m_curString.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    m_children.append(new LT_Text(m_curString));
Packit 1c1d7e
    debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
Packit 1c1d7e
    m_curString="";
Packit 1c1d7e
  }
Packit 1c1d7e
  ASSERT(m_ref==0);
Packit 1c1d7e
  m_ref = new LT_Ref;
Packit 1c1d7e
  m_ref->setRefId(attrib.value("refid"));
Packit 1c1d7e
  m_ref->setExtId(attrib.value("external"));
Packit 1c1d7e
  ASSERT(attrib.value("kindref")=="compound" || attrib.value("kindref")=="member");
Packit 1c1d7e
  m_ref->setTargetKind(attrib.value("kindref")=="compound" ? ILT_Ref::Compound : ILT_Ref::Member);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void LinkedTextHandler::endRef()
Packit 1c1d7e
{
Packit 1c1d7e
  m_ref->setText(m_curString);
Packit 1c1d7e
  m_children.append(m_ref);
Packit 1c1d7e
  debug(2,"LinkedTextHandler: add ref `%s'\n",m_ref->text()->latin1());
Packit 1c1d7e
  m_ref=0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
QString LinkedTextHandler::toString(const QList<LinkedTextImpl> &list) 
Packit 1c1d7e
{
Packit 1c1d7e
  QListIterator<LinkedTextImpl> li(list);
Packit 1c1d7e
  QString result;
Packit 1c1d7e
  LinkedTextImpl *lt;
Packit 1c1d7e
  for (li.toFirst();(lt=li.current());++li)
Packit 1c1d7e
  {
Packit 1c1d7e
    switch(lt->kind())
Packit 1c1d7e
    {
Packit 1c1d7e
      case ILinkedText::Kind_Text:
Packit 1c1d7e
        result+=dynamic_cast<ILT_Text*>(lt)->text()->latin1();
Packit 1c1d7e
        break;
Packit 1c1d7e
      case ILinkedText::Kind_Ref:
Packit 1c1d7e
        result+=dynamic_cast<ILT_Ref *>(lt)->text()->latin1();
Packit 1c1d7e
        break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e