Logo Search packages:      
Sourcecode: kdenlive version File versions

clipdrag.cpp

/***************************************************************************
                          clipdrag.cpp  -  description
                             -------------------
    begin                : Mon Apr 15 2002
    copyright            : (C) 2002 by Jason Wood
    email                : jasonwood@blueyonder.co.uk
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
#include <kdebug.h>
#include <kmessagebox.h>
#include <klocale.h>

#include "clipdrag.h"
#include "docclipavfile.h"
#include "docclipreflist.h"
#include "kdenlivedoc.h"


#include <iostream>

ClipDrag::ClipDrag(DocClipBase * clip, QWidget * dragSource,
    const char *name):KURLDrag(ClipDrag::createURLList(clip), dragSource,
    name)
{
    m_xml = clip->toXML().toString();

//    kdWarning() << "XML is " << m_xml << endl;
}

ClipDrag::ClipDrag(DocClipRef * clip, QWidget * dragSource,
    const char *name):KURLDrag(ClipDrag::createURLList(clip), dragSource,
    name)
{
    m_xml = clip->toXML().toString();
//    kdWarning() << "XML is " << m_xml << endl;
}

00046 ClipDrag::ClipDrag(DocClipRefList & clips, QWidget * dragSource,
    const char *name):KURLDrag(ClipDrag::createURLList(&clips), dragSource,
    name)
{
    m_xml = clips.toXML("cliplist").toString();
    //kdWarning() << "XML is " << m_xml << endl;
}

ClipDrag::~ClipDrag()
{
}

00058 const char *ClipDrag::format(int i) const
{
    switch (i) {
    case 0:
      return "application/x-kdenlive-clip";
    default:
      return KURLDrag::format(i - 1);
    }
}

00068 QByteArray ClipDrag::encodedData(const char *mime) const
{
    QCString mimetype(mime);

    if (mimetype == "application/x-kdenlive-clip") {
      QByteArray encoded;
      encoded.resize(m_xml.length() + 1);
      memcpy(encoded.data(), m_xml.utf8().data(), m_xml.length() + 1);
      return encoded;
    } else {
      return KURLDrag::encodedData(mime);
    }
}

00082 bool ClipDrag::canDecode(const QMimeSource * mime, bool onlyExternal)
{
    if (mime->provides("application/x-kdenlive-clip")) {
      if (onlyExternal) return false;
      return true;
    }

    return KURLDrag::canDecode(mime);
}

00092 DocClipRefList ClipDrag::decode(KdenliveDoc *doc, const QMimeSource * e)
{
    DocClipRefList cliplist;

    if (e->provides("application/x-kdenlive-clip")) {
      QByteArray data = e->encodedData("application/x-kdenlive-clip");
      QString xml = data;
      QDomDocument qdomdoc;
      qdomdoc.setContent(data);

      QDomElement elem = qdomdoc.documentElement();
      QDomNode node;

      /*
      kdDebug() << "DRAG INSIDE-----------------------------------------"
          << endl;
      kdDebug() << qdomdoc.toString() << endl;
      kdDebug() << "DRAG INSIDE-----------------------------------------"
          << endl;
      */

      // are we handling a single clip, or a clip list? Not sure if both cases will
      // occur, but just in case, we check for it.
      if (elem.tagName() == "cliplist") {
          node = elem.firstChild();
      } else {
          node = elem;
      }
      while (!node.isNull()) {
          QDomElement element = node.toElement();

          if (!element.isNull()) {
            if (element.tagName() == "kdenliveclip") {
                DocClipRef *ref =
                  DocClipRef::createClip(doc, element);
                cliplist.append(ref);

                if (element.attribute("master", "false") == "true") {
                  cliplist.setMasterClip(ref);
                }
            }
          }
          node = node.nextSibling();
      }
    } else {

      KURL::List list;
      KURL::List::Iterator it;
      KURLDrag::decode(e, list);
      for (it = list.begin(); it != list.end(); ++it) {
          DocClipBase *file = doc->clipManager().findClip(*it);
          if (!file) {
            file = doc->clipManager().addTemporaryClip(*it);
              if (file) {
                DocClipRef *refFile = new DocClipRef(file);
                  cliplist.append(refFile);
            }
          }
          else KMessageBox::sorry(0, i18n("The clip %1 is already present in this project").arg((*it).filename()));
      }
    }
    return cliplist;
}

00156 KURL::List ClipDrag::createURLList(DocClipRefList * clipList)
{
    KURL::List list;

    QPtrListIterator < DocClipRef > itt(*clipList);

    while (itt.current() != 0) {
      list.append(itt.current()->fileURL());
      ++itt;
    }

    return list;
}

KURL::List ClipDrag::createURLList(DocClipRef * clip)
{
    KURL::List list;

    list.append(clip->fileURL());
    return list;
}

KURL::List ClipDrag::createURLList(DocClipBase * clip)
{
    KURL::List list;

    list.append(clip->fileURL());
    return list;
}

Generated by  Doxygen 1.6.0   Back to index