/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "changeproperties.h"

#include <QtWidgets/QMessageBox>
#include <QtWidgets/QFileDialog>
#include <QtCore/qt_windows.h>
#include <QtCore/QMetaObject>
#include <QtCore/QMetaProperty>
#include <QtCore/QRegularExpression>
#include <ActiveQt/QAxWidget>

QT_BEGIN_NAMESPACE

ChangeProperties::ChangeProperties(QWidget *parent)
: QDialog(parent), activex(nullptr)
{
    setupUi(this);

    listProperties->setColumnCount(3);
    listProperties->headerItem()->setText(0, QLatin1String("Name"));
    listProperties->headerItem()->setText(1, QLatin1String("Type"));
    listProperties->headerItem()->setText(2, QLatin1String("Value"));

    listEditRequests->setColumnCount(1);
    listEditRequests->headerItem()->setText(0, QLatin1String("Name"));
}

void ChangeProperties::setControl(QAxWidget *ax)
{
    activex = ax;
    updateProperties();
}

void ChangeProperties::on_listProperties_currentItemChanged(QTreeWidgetItem *current)
{
    editValue->setEnabled(current != nullptr);
    buttonSet->setEnabled(current != nullptr);
    valueLabel->setEnabled(current != nullptr);

    if (!current)
        return;

    editValue->setText(current->text(2));
    QString prop = current->text(0);
    valueLabel->setText(prop + QLatin1String(" ="));

    const QMetaObject *mo = activex->metaObject();
    const QMetaProperty property = mo->property(mo->indexOfProperty(prop.toLatin1()));

    valueLabel->setEnabled(property.isWritable());
    editValue->setEnabled(property.isWritable());
    buttonSet->setEnabled(property.isWritable());
}

void ChangeProperties::on_buttonSet_clicked()
{
    QTreeWidgetItem *item = listProperties->currentItem();
    if (!item)
        return;

    QString prop = item->text(0);
    QVariant value = activex->property(prop.toLatin1());
    QVariant::Type type = value.type();
    if (!value.isValid()) {
        const QMetaObject *mo = activex->metaObject();
        const QMetaProperty property = mo->property(mo->indexOfProperty(prop.toLatin1()));
        type = QVariant::nameToType(property.typeName());
    }
    switch (type) {
    case QVariant::Color:
        {
            QColor col;
            col.setNamedColor(editValue->text());
            if (col.isValid()) {
                value = QVariant::fromValue(col);
            } else {
                QMessageBox::warning(this, tr("Can't parse input"),
                                           tr("Failed to create a color from %1\n"
                                              "The string has to be a valid color name (e.g. 'red')\n"
                                              "or a RGB triple of format '#rrggbb'."
                                              ).arg(editValue->text()));
            }
        }
        break;
    case QVariant::Font:
        {
            QFont fnt;
            if (fnt.fromString(editValue->text())) {
                value = QVariant::fromValue(fnt);
            } else {
                QMessageBox::warning(this, tr("Can't parse input"),
                                           tr("Failed to create a font from %1\n"
                                              "The string has to have a format family,<point size> or\n"
                                              "family,pointsize,stylehint,weight,italic,underline,strikeout,fixedpitch,rawmode."
                                              ).arg(editValue->text()));
            }
        }
        break;
    case QVariant::Pixmap:
        {
            QString fileName = editValue->text();
            if (fileName.isEmpty())
                fileName = QFileDialog::getOpenFileName(this);
            QPixmap pm(fileName);
            if (pm.isNull())
                return;

            value = QVariant::fromValue(pm);
        }
        break;
    case QVariant::Bool:
        {
            const QString txt = editValue->text();
            value = QVariant(txt != QLatin1String("0") && txt.compare(QLatin1String("false"), Qt::CaseInsensitive));
        }
        break;
    case QVariant::List:
        {
            QStringList txtList = editValue->text().split(QRegularExpression(QLatin1String("[,;]")));
            QList<QVariant> varList;
            for (int i = 0; i < txtList.count(); ++i) {
                QVariant svar(txtList.at(i));
                QString str = svar.toString();
                str = str.trimmed();
                bool ok;
                int n = str.toInt(&ok);
                if (ok) {
                    varList << n;
                    continue;
                }
                double d = str.toDouble(&ok);
                if (ok) {
                    varList << d;
                    continue;
                }
                varList << str;
            }
            value = varList;
        }
        break;

    default:
        value = editValue->text();
        break;
    }

    Q_ASSERT(activex->setProperty(prop.toLatin1(), value));
    updateProperties();
    listProperties->setCurrentItem(listProperties->findItems(prop, Qt::MatchExactly).at(0));
}

void ChangeProperties::on_listEditRequests_itemChanged(QTreeWidgetItem *item)
{
    if (!item)
        return;

    QString property = item->text(0);
    activex->setPropertyWritable(property.toLatin1(), item->checkState(0) == Qt::Checked);
}


void ChangeProperties::updateProperties()
{
    bool hasControl = activex && !activex->isNull();
    tabWidget->setEnabled(hasControl);

    listProperties->clear();
    listEditRequests->clear();
    if (hasControl) {
        const QMetaObject *mo = activex->metaObject();
        const int numprops = mo->propertyCount();
        for (int i = mo->propertyOffset(); i < numprops; ++i) {
            const QMetaProperty property = mo->property(i);
            QTreeWidgetItem *item = new QTreeWidgetItem(listProperties);
            item->setText(0, QString::fromLatin1(property.name()));
            item->setText(1, QString::fromLatin1(property.typeName()));
            if (!property.isDesignable()) {
                item->setForeground(0, Qt::gray);
                item->setForeground(1, Qt::gray);
                item->setForeground(2, Qt::gray);
            }
            QVariant var = activex->property(property.name());

            switch (var.type()) {
            case QVariant::Color:
                {
                    QColor col = qvariant_cast<QColor>(var);
                    item->setText(2, col.name());
                }
                break;
            case QVariant::Font:
                {
                    QFont fnt = qvariant_cast<QFont>(var);
                    item->setText(2, fnt.toString());
                }
                break;
            case QVariant::Bool:
                {
                    item->setText(2, var.toBool() ? QLatin1String("true") : QLatin1String("false"));
                }
                break;
            case QVariant::Pixmap:
                {
                    QPixmap pm = qvariant_cast<QPixmap>(var);
                    item->setIcon(2, pm);
                }
                break;
            case QVariant::List:
                {
                    const QList<QVariant> varList = var.toList();
                    QStringList strList;
                    for (const auto &var : varList)
                        strList << var.toString();
                    item->setText(2, strList.join(QLatin1String(", ")));
                }
                break;
            case QVariant::Int:
                if (property.isEnumType()) {
                    const QMetaEnum enumerator = mo->enumerator(mo->indexOfEnumerator(property.typeName()));
                    item->setText(2, QString::fromLatin1(enumerator.valueToKey(var.toInt())));
                    break;
                }
                //FALLTHROUGH
            default:
                item->setText(2, var.toString());
                break;
            }

            bool requesting = false;
#if 0
            {
                void *argv[] = { &requesting };
                activex->qt_metacall(QMetaObject::Call(0x10000000) /*RequestingEdit*/, i, argv);
            }
#endif
            if (requesting) {
                QTreeWidgetItem *check = new QTreeWidgetItem(listEditRequests);
                check->setText(0, QString::fromLatin1(property.name()));
                check->setCheckState(0, activex->propertyWritable(property.name()) ? Qt::Checked : Qt::Unchecked);
            }
        }
        listProperties->setCurrentItem(listProperties->topLevelItem(0));
    } else {
        editValue->clear();
    }
}

QT_END_NAMESPACE
