/***************************************************************************
    copyright            : (C) 2004 by Allan Sandfeld Jensen
    email                : kde@carewolf.org
 ***************************************************************************/

/***************************************************************************
 *   This library is free software; you can redistribute it and/or modify  *
 *   it  under the terms of the GNU Lesser General Public License version  *
 *   2.1 as published by the Free Software Foundation.                     *
 *                                                                         *
 *   This library is distributed in the hope that it will be useful, but   *
 *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
 *   Lesser General Public License for more details.                       *
 *                                                                         *
 *   You should have received a copy of the GNU Lesser General Public      *
 *   License along with this library; if not, write to the Free Software   *
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,            *
 *   MA  02110-1301  USA                                                   *
 ***************************************************************************/

#ifndef DO_NOT_DOCUMENT // Tell Doxygen not to document this header

#ifndef TAGLIB_COMBINEDTAG_H
#define TAGLIB_COMBINEDTAG_H

////////////////////////////////////////////////////////////////////////////////
// Note that this header is not installed.
////////////////////////////////////////////////////////////////////////////////

#include <tag.h>

namespace TagLib {

  /*!
   * A union of two TagLib::Tags.
   */
  class CombinedTag : public TagLib::Tag
  {
  public:
    explicit CombinedTag(Tag *tag1 = 0, Tag *tag2 = 0)
               : TagLib::Tag(),
                 tag1(tag1), tag2(tag2) {}

    virtual String title() const {
      if(tag1 && !tag1->title().isEmpty())
          return tag1->title();

      if(tag2)
          return tag2->title();

      return String::null;
    }

    virtual String artist() const {
      if(tag1 && !tag1->artist().isEmpty())
          return tag1->artist();

      if(tag2)
          return tag2->artist();

      return String::null;
    }

    virtual String album() const {
      if(tag1 && !tag1->album().isEmpty())
          return tag1->album();

      if(tag2)
          return tag2->album();

      return String::null;
    }

    virtual String comment() const {
      if(tag1 && !tag1->comment().isEmpty())
          return tag1->comment();

      if(tag2)
          return tag2->comment();

      return String::null;
    }

    virtual String genre() const {
      if(tag1 && !tag1->genre().isEmpty())
          return tag1->genre();

      if(tag2)
          return tag2->genre();

      return String::null;
    }

    virtual TagLib::uint year() const {
      if(tag1 && tag1->year() > 0)
          return tag1->year();

      if(tag2)
          return tag2->year();

      return 0;
    }

    virtual TagLib::uint track() const {
      if(tag1 && tag1->track() > 0)
          return tag1->track();

      if(tag2)
          return tag2->track();

      return 0;
    }

    virtual void setTitle(const String &s) {
      if(tag1)
          tag1->setTitle(s);
      if(tag2)
          tag2->setTitle(s);
    }

    virtual void setArtist(const String &s) {
      if(tag1)
          tag1->setArtist(s);
      if(tag2)
          tag2->setArtist(s);
    }

    virtual void setAlbum(const String &s) {
      if(tag1)
          tag1->setAlbum(s);
      if(tag2)
          tag2->setAlbum(s);
    }

    virtual void setComment(const String &s) {
      if(tag1)
          tag1->setComment(s);
      if(tag2)
          tag2->setComment(s);
    }

    virtual void setGenre(const String &s) {
      if(tag1)
          tag1->setGenre(s);
      if(tag2)
          tag2->setGenre(s);
    }

    virtual void setYear(uint i) {
      if(tag1)
          tag1->setYear(i);
      if(tag2)
          tag2->setYear(i);
    }

    virtual void setTrack(uint i) {
      if(tag1)
          tag1->setTrack(i);
      if(tag2)
          tag2->setTrack(i);
    }

  private:
      Tag *tag1;
      Tag *tag2;
  };
}

#endif
#endif
