/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the Qt Mobility Components.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "interfacestabwidget.h"
#include "interfacewidget.h"
#include "errorcollector.h"

#include <qserviceinterfacedescriptor.h>

#include <QVBoxLayout>
#include <QPushButton>
#include <QTabBar>
#include <QDebug>

InterfacesTabWidget::InterfacesTabWidget(QWidget *parent)
    : QTabWidget(parent)
{
    connect(tabBar(), SIGNAL(tabCloseRequested(int)), SLOT(tabCloseRequested(int)));
}

void InterfacesTabWidget::load(const QList<QTM_PREPEND_NAMESPACE(QServiceInterfaceDescriptor)> &descriptors)
{
    QWidget *widg;
    while (count() > 0) {
        widg = widget(count()-1);
        if (widg) {
            removeTab(count()-1);
            delete widg;
        }
    }

    InterfaceWidget *iface;
    for (int i=0; i<descriptors.count(); i++)
        iface = addInterface(descriptors[i]);

    if (count() == 0)
        addInterface(); // blank placeholder interface
    setCurrentIndex(0);
}

void InterfacesTabWidget::validate(ErrorCollector *errors)
{
    int firstInvalid = -1;
    QHash<QString, int> titleCount;
    for (int i=0; i<count(); i++) {
        InterfaceWidget *ifaceWidget = qobject_cast<InterfaceWidget*>(widget(i));
        int errCountBefore = errors->errorCount();
        ifaceWidget->validate(errors);
        if (errors->errorCount() > errCountBefore) {
            if (firstInvalid < 0)
                firstInvalid = i;
            tabBar()->setTabTextColor(i, Qt::red);
        } else {
            QString title = ifaceWidget->title();
            if (titleCount.contains(title)) {
                titleCount[title]++;
            } else {
                titleCount[title] = 1;
            }
        }
    }

    QHashIterator<QString, int> i(titleCount);
    while (i.hasNext()) {
        if (i.next().value() > 1) {
            errors->addError(tr("Found multiple implementations for interface \"%1\". A service cannot have multiple implementations of the same interface with the same version.", "interface name and version").arg(i.key()));
        }
    }

    if (firstInvalid >= 0)
        setCurrentIndex(firstInvalid);
}

void InterfacesTabWidget::writeXml(QXmlStreamWriter *writer) const
{
    for (int i=0; i<count(); i++) {
        InterfaceWidget *ifaceWidget = qobject_cast<InterfaceWidget*>(widget(i));
        if (ifaceWidget) {
            writer->writeStartElement(QLatin1String("interface"));
            ifaceWidget->writeXml(writer);
            writer->writeEndElement();
        }
    }
}

InterfaceWidget *InterfacesTabWidget::addInterface(const QTM_PREPEND_NAMESPACE(QServiceInterfaceDescriptor) &descriptor)
{
    InterfaceWidget *w = new InterfaceWidget;
    connect(w, SIGNAL(titleChanged(QString)), SLOT(interfaceTitleChanged(QString)));
    connect(w, SIGNAL(dataChanged()), SIGNAL(dataChanged()));
    if (descriptor.isValid())
        w->load(descriptor);
    addTab(w, w->title());
    setCurrentWidget(w);
    w->init();
    return w;
}

void InterfacesTabWidget::tabInserted(int)
{
    if (count() > 1)
        tabBar()->setTabsClosable(true);
    emit dataChanged();
}

void InterfacesTabWidget::tabRemoved(int)
{
    if (count() == 1)
        tabBar()->setTabsClosable(false);
    emit dataChanged();
}

void InterfacesTabWidget::tabCloseRequested(int index)
{
    QWidget *w = widget(index);
    if (w) {
        removeTab(index);
        delete w;
    }
}

void InterfacesTabWidget::interfaceTitleChanged(const QString &text)
{
    InterfaceWidget *tab = qobject_cast<InterfaceWidget*>(sender());
    if (tab) {
        int index = indexOf(tab);
        if (index >= 0) {
            setTabText(index, text);
            tabBar()->setTabTextColor(index, QPalette().text().color());
        }
    }
}
