/* ============================================================
*
* This file is a part of the rekonq project
*
* Copyright (C) 2007-2008 Trolltech ASA. All rights reserved
* Copyright (C) 2008 by Andrea Diamantini <adjam7 at gmail dot 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, 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.
*
* ============================================================ */



// Self Includes
#include "bookmarks.h"
#include "bookmarks.moc"

// Local Includes
#include "mainwindow.h"
#include "webview.h"

// KDE Includes
#include <KMimeType>
#include <KMenu>
#include <KStandardDirs>
#include <KDebug>

// Qt Includes
#include <QFile>


OwnBookMarks::OwnBookMarks(KMainWindow *parent)
        : QObject(parent)
        , KBookmarkOwner()
{
    m_parent = qobject_cast<MainWindow*>(parent);
    connect(this, SIGNAL(openUrl(const KUrl &)) , parent , SLOT(loadUrl(const KUrl &)));
}


void OwnBookMarks::openBookmark(const KBookmark & b, Qt::MouseButtons mb, Qt::KeyboardModifiers km)
{
    Q_UNUSED(mb);
    Q_UNUSED(km);
    emit openUrl(b.url());
}


QString OwnBookMarks::currentUrl() const
{
    QUrl url = m_parent->currentTab()->url();
    return url.path();
}


QString OwnBookMarks::currentTitle() const
{
    QString title = m_parent->windowTitle();
    return title.remove(" - rekonq");
}


// ------------------------------------------------------------------------------------------------------


BookmarksMenu::BookmarksMenu(KBookmarkManager* manager, KBookmarkOwner* owner, KMenu* menu, KActionCollection* ac)
        : KBookmarkMenu(manager, owner, menu, ac)
{
}


KMenu* BookmarksMenu::viewContextMenu(QAction* action)
{
    return contextMenu(action);
}


// ------------------------------------------------------------------------------------------------------


BookmarksProvider::BookmarksProvider(KMainWindow* parent)
        : m_parent(parent)
        , m_owner(new OwnBookMarks(parent))
        , m_bmMenu(0)
        , m_bmToolbar(0)
{
    KUrl bookfile = KUrl("~/.kde/share/apps/konqueror/bookmarks.xml");      // share konqueror bookmarks

    if (!QFile::exists(bookfile.path()))
    {
        bookfile = KUrl("~/.kde4/share/apps/konqueror/bookmarks.xml");
        if (!QFile::exists(bookfile.path()))
        {
            QString bookmarksDefaultPath = KStandardDirs::locate("appdata" , "defaultbookmarks.xbel");
            kWarning() << bookmarksDefaultPath;
            QFile bkms(bookmarksDefaultPath);
            QString bookmarksPath = KStandardDirs::locateLocal("appdata", "bookmarks.xml", true);
            bookmarksPath.replace("rekonq", "konqueror");
            bkms.copy(bookmarksPath);

            bookfile = KUrl(bookmarksPath);
        }
    }
    m_manager = KBookmarkManager::managerForExternalFile(bookfile.path());
    m_ac = new KActionCollection(this);

    connect(m_manager, SIGNAL(changed(const QString &, const QString &)), this, SLOT(slotBookmarksChanged(const QString &)));
}


void BookmarksProvider::slotBookmarksChanged(const QString & group)
{
    KBookmarkGroup toolbarGroup = m_manager->toolbar();
    kWarning() << "KBookmarkBar::slotBookmarksChanged( " << group << " )";

    if (toolbarGroup.isNull())
        return;

    m_bmToolbar->clear();
    provideBmToolbar(m_bmToolbar);
}


void BookmarksProvider::provideBmToolbar(KToolBar* toolbar)
{
    m_bmToolbar = toolbar;
    toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);

    toolbar->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(toolbar, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(contextMenu(const QPoint &)));

    KBookmarkGroup toolbarGroup = m_manager->toolbar();
    KBookmark bm = toolbarGroup.first();
    while (!bm.isNull())
    {
        if (bm.isGroup())
        {
            // do nothing!
        }
        else
        {
            if (bm.isSeparator())
            {
                toolbar->addSeparator();
            }
            else
            {
                KAction *a = new KBookmarkAction(bm, m_owner, m_ac);
                toolbar->addAction(a);
            }
        }
        // go ahead!
        bm = toolbarGroup.next(bm);
    }
}


KMenu *BookmarksProvider::bookmarksMenu()
{
    KMenu *menu = new KMenu(m_parent);
    m_bmMenu = new BookmarksMenu(m_manager, m_owner, menu, m_ac);
    return menu;
}


void BookmarksProvider::contextMenu(const QPoint & point)
{
    KAction* action = dynamic_cast<KAction*>(m_bmToolbar->actionAt(point));
    if (!action)
        return;
    KMenu *menu = m_bmMenu->viewContextMenu(action);
    menu->setAttribute(Qt::WA_DeleteOnClose);
    menu->popup(m_bmToolbar->mapToGlobal(point));
}