/*
 * googlefetcherdialog.cpp
 *
 * Copyright (C) 2004 Nathan Toone <nathan@toonetown.com>
 *
 * 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.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include <tdeapplication.h>
#include <tdeio/netaccess.h>
#include <tdelocale.h>
#include <kdebug.h>
#include <tdemessagebox.h>
#include <kcombobox.h>

#include <tqhbox.h>
#include <tqimage.h>
#include <tqlabel.h>
#include <tqpushbutton.h>
#include <tqeventloop.h>

#include "googlefetcherdialog.h"

GoogleFetcherDialog::GoogleFetcherDialog(const TQString &name,
                                         const GoogleImageList &imageList,
                                         const TQString &artist,
                                         const TQString &album,
                                         TQWidget *parent) :
    KDialogBase(parent, name.latin1(), true, TQString(),
                Ok | Cancel | User1 , NoDefault, true),
    m_pixmap(TQPixmap()),
    m_imageList(imageList),
    m_takeIt(false),
    m_newSearch(false)
{
    m_artist = artist;
    m_album = album;
    disableResize();

    TQHBox *mainBox = new TQHBox(this);
    m_iconWidget = new TDEIconView(mainBox);
    m_iconWidget->setResizeMode(TQIconView::Adjust);
    m_iconWidget->setSelectionMode(TQIconView::Extended);
    m_iconWidget->setSpacing(10);
    m_iconWidget->setMode(TDEIconView::Execute);
    m_iconWidget->setFixedSize(500,550);
    m_iconWidget->arrangeItemsInGrid();
    m_iconWidget->setItemsMovable(false);

    TQHBox *imgSize = new TQHBox(actionButton(User1)->parentWidget());
    //TQLabel *label = new TQLabel(imgSize);
    //label->setText(i18n("Image size:"));

    KComboBox *combo = new KComboBox(imgSize);
    combo->insertItem(i18n("All Sizes"));
    combo->insertItem(i18n("Very Small"));
    combo->insertItem(i18n("Small"));
    combo->insertItem(i18n("Medium"));
    combo->insertItem(i18n("Large"));
    combo->insertItem(i18n("Very Large"));
    combo->setCurrentItem(0);
    connect(combo, TQ_SIGNAL(activated(int)), this, TQ_SLOT(imgSizeChanged(int)));
    connect(m_iconWidget, TQ_SIGNAL( executed(TQIconViewItem*) ), this, TQ_SLOT(slotOk()));

    imgSize->adjustSize();
    setMainWidget(mainBox);
    setButtonText(User1, i18n("New Search"));
}

GoogleFetcherDialog::~GoogleFetcherDialog()
{

}

void GoogleFetcherDialog::setLayout()
{
    setCaption(TQString("%1 - %2 (%3)")
              .arg(m_artist)
              .arg(m_album)
              .arg(m_imageList.size()));

    m_iconWidget->clear();
    for(uint i = 0; i < m_imageList.size(); i++)
        new CoverIconViewItem(m_iconWidget, m_imageList[i]);

    adjustSize();
}

void GoogleFetcherDialog::setImageList(const GoogleImageList &imageList)
{
    m_imageList=imageList;
}

////////////////////////////////////////////////////////////////////////////////
// public slots
////////////////////////////////////////////////////////////////////////////////

void GoogleFetcherDialog::refreshScreen(GoogleImageList &imageList)
{
    setImageList(imageList);
    setLayout();
}

int GoogleFetcherDialog::exec()
{
    setLayout();
    return KDialogBase::exec();
}

void GoogleFetcherDialog::slotOk()
{
    uint selectedIndex = m_iconWidget->index(m_iconWidget->currentItem());
    m_pixmap = pixmapFromURL(m_imageList[selectedIndex].imageURL());

    if(m_pixmap.isNull()) {
        KMessageBox::sorry(this,
                           i18n("The cover you have selected is unavailable. Please select another."),
                           i18n("Cover Unavailable"));
        TQPixmap blankPix;
        blankPix.resize(80, 80);
        blankPix.fill();
        m_iconWidget->currentItem()->setPixmap(blankPix, true, true);
        return;
    }

    m_takeIt = true;
    m_newSearch = false;
    hide();
}

void GoogleFetcherDialog::slotCancel()
{
    m_takeIt = true;
    m_newSearch = false;
    m_pixmap = TQPixmap();
    hide();
}

void GoogleFetcherDialog::slotUser1()
{
    m_takeIt = false;
    m_newSearch = true;
    m_pixmap = TQPixmap();
    hide();
}

void GoogleFetcherDialog::imgSizeChanged(int index)
{
    GoogleFetcher::ImageSize imageSize = GoogleFetcher::All;
    switch (index) {
        case 1:
            imageSize = GoogleFetcher::Icon;
            break;
        case 2:
            imageSize = GoogleFetcher::Small;
            break;
        case 3:
            imageSize = GoogleFetcher::Medium;
            break;
        case 4:
            imageSize=GoogleFetcher::Large;
            break;
        case 5:
            imageSize=GoogleFetcher::XLarge;
            break;
        default:
            break;
    }
    emit sizeChanged(imageSize);
}

TQPixmap GoogleFetcherDialog::fetchedImage(uint index) const
{
    return (index > m_imageList.count()) ? TQPixmap() : pixmapFromURL(m_imageList[index].imageURL());
}

TQPixmap GoogleFetcherDialog::pixmapFromURL(const KURL &url) const
{
    TQString file;

    if(TDEIO::NetAccess::download(url, file, 0)) {
        TQPixmap pixmap = TQPixmap(file);
        TDEIO::NetAccess::removeTempFile(file);
        return pixmap;
    }
    TDEIO::NetAccess::removeTempFile(file);
    return TQPixmap();
}

////////////////////////////////////////////////////////////////////////////////
// CoverIconViewItem
////////////////////////////////////////////////////////////////////////////////

CoverIconViewItem::CoverIconViewItem(TQIconView *parent, const GoogleImage &image) :
    TQObject(parent), TDEIconViewItem(parent, parent->lastItem(), image.size()), m_job(0)
{
    // Set up the iconViewItem

    TQPixmap mainMap;
    mainMap.resize(80, 80);
    mainMap.fill();
    setPixmap(mainMap, true, true);

    // Start downloading the image.

    m_job = TDEIO::get(image.thumbURL(), false, false);
    connect(m_job, TQ_SIGNAL(result(TDEIO::Job *)), this, TQ_SLOT(imageResult(TDEIO::Job *)));
    connect(m_job, TQ_SIGNAL(data(TDEIO::Job *, const TQByteArray &)),
            this, TQ_SLOT(imageData(TDEIO::Job *, const TQByteArray &)));
}

CoverIconViewItem::~CoverIconViewItem()
{
    if(m_job) {
        m_job->kill();

        // Drain results issued by TDEIO before being deleted,
        // and before deleting the job.
        kapp->eventLoop()->processEvents(TQEventLoop::ExcludeUserInput);

        delete m_job;
    }
}

void CoverIconViewItem::imageData(TDEIO::Job *, const TQByteArray &data)
{
    int currentSize = m_buffer.size();
    m_buffer.resize(currentSize + data.size(), TQGArray::SpeedOptim);
    memcpy(&(m_buffer.data()[currentSize]), data.data(), data.size());
}

void CoverIconViewItem::imageResult(TDEIO::Job *job)
{
    if(job->error())
        return;

    TQPixmap iconImage(m_buffer);
    iconImage = TQImage(iconImage.convertToImage()).smoothScale(80, 80);
    setPixmap(iconImage, true, true);
}

#include "googlefetcherdialog.moc"
