#include "topdesktopitemabs.h"
#include "topwin8desktopitem.h"
#include <QVariant>
#include <QMouseEvent>
#include <QLabel>
#include <QGridLayout>
#include <QDrag>
#include <tbaseutil/tresource.h>
#include <tbaseutil/ttheme.h>
#include <tbaseutil/tfileio.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <twidget/tuiloaderdialog.h>
#include <twidget/ttableviewdialog.h>
#include <twidget/tmessagebox.h>
#include <twidget/tcombobox.h>
#include <tdatabaseutil/tsqlconnectionpoolv2.h>
#include <tdatabaseutil/tsqlqueryv2.h>
#include <tdatabaseutil/tsqlselectorv2.h>
#include <topcore/topcore.h>

/***************Private*******************/
class TopDesktopItemAbsPrivate
{
    Q_DECLARE_PUBLIC(TopDesktopItemAbs)
public:
    TopDesktopItemAbsPrivate(TopDesktopItemAbs *qptr);
    QVariantMap configData;
    QString fixedStyleSheet;
    TopDesktopItemAbs::State state;
    TopDesktopItemAbs::ClickType clickType;
    bool pressed;
    bool hasOpenRight;
    bool startDragBol;
    int marginInt;
    QPoint pressPositon;
    QMenu *popupMenu;
    QActionGroup *mLayoutActionsGroup;

protected:
    TopDesktopItemAbs * const q_ptr;
};


TopDesktopItemAbsPrivate::TopDesktopItemAbsPrivate(TopDesktopItemAbs *qptr) :
    fixedStyleSheet(""),
    state(TopDesktopItemAbs::State_None),
    pressed(false),
    hasOpenRight(false),
    startDragBol(false),
    marginInt(0),
    popupMenu(NULL),
    q_ptr(qptr)
{
}

/*****************************************/

/*!
 * \class TopDesktopItemAbstractClass
 * \brief 桌面图标基类
 */
TopDesktopItemAbs::TopDesktopItemAbs(QWidget *parent) :
    QFrame(parent), d_ptr(new TopDesktopItemAbsPrivate(this))
{
    this->setProperty("SS",QVariant("DESKTOPITEM"));
    this->setStyleSheet(QString("QFrame[SS=\"DESKTOPITEM\"]{border-style:solid;border-width:1px;}"));
}

TopDesktopItemAbs::~TopDesktopItemAbs()
{
}

void TopDesktopItemAbs::enterEvent(QEvent *iEvent)
{
    Q_D(TopDesktopItemAbs);
    this->setStyleSheet(QString(
                            "QFrame[SS=\"DESKTOPITEM\"]"
                            "{border-style:solid;border-width:%1px;border-color:rgba(255,255,255,0.5);%2;}")
                        .arg(1).arg(d->fixedStyleSheet));
    QFrame::enterEvent(iEvent);
}

void TopDesktopItemAbs::leaveEvent(QEvent *iEvent)
{
    Q_D(TopDesktopItemAbs);
    this->setStyleSheet(QString("QFrame[SS=\"DESKTOPITEM\"]" \
                                "{border-style:solid;border-width:%1px;border-color:transparent;%2;}")
                        .arg(1).arg(d->fixedStyleSheet));
    QFrame::leaveEvent(iEvent);
}

void TopDesktopItemAbs::mousePressEvent(QMouseEvent *iEvent)
{
    Q_D(TopDesktopItemAbs);
    if (iEvent->button() == Qt::LeftButton)
    {
        if (state() == TopDesktopItemAbs::State_Editing)
        {
            d->startDragBol = true;
            d->pressPositon = iEvent->pos();
        }
        else
        {
            d->startDragBol = false;
            d->pressed = true;
        }
    }
}

void TopDesktopItemAbs::mouseMoveEvent(QMouseEvent *iEvent)
{
    Q_D(TopDesktopItemAbs);
    if (d->startDragBol && ((qAbs(iEvent->pos().x() - d->pressPositon.x()) >= 5)
                            || qAbs(iEvent->pos().y() - d->pressPositon.y()) >= 5))
    {
        QByteArray itemData;
        QDataStream dataStream(&itemData, QIODevice::WriteOnly);

        dataStream  << QPoint(iEvent->pos())
                    << this->size()
                    << this->hasOpenRight()
                    << TDataParse::variant2JsonStr(this->configData());
        QMimeData *mimeData = new QMimeData;
        mimeData->setData("application/desktop-itemdata", itemData);

        QPixmap pixmap(this->size());
        this->render(&pixmap);
        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);
        drag->setPixmap(pixmap);
        QPoint point(iEvent->pos());
        drag->setHotSpot(point);

        this->setAttribute(Qt::WA_DeleteOnClose);

        emit itemTryDeleted(this);
        this->setVisible(false);
        Qt::DropAction dropAction = drag->exec(Qt::MoveAction | Qt::CopyAction, Qt::CopyAction);
        if (dropAction == Qt::MoveAction)
        {
            emit itemDeleted(this);
        }
        else
        {
            this->setVisible(true);
        }
    }
}

void TopDesktopItemAbs::mouseReleaseEvent(QMouseEvent *iEvent)
{
    Q_D(TopDesktopItemAbs);

    if (iEvent->button() == Qt::RightButton && d->state == TopDesktopItemAbs::State_Editing)
    {
        if (d->popupMenu == NULL)
        {
            d->popupMenu = createContextMenu();
        }

        foreach (QAction *act, d->mLayoutActionsGroup->actions()) {
            if (act->data().toString().toUpper() == this->layoutStyle())
            {
                act->setChecked(true);
                break;
            }
        }
        d->popupMenu->popup(QCursor::pos());
    }
    else
    {
        if (iEvent->button() == Qt::LeftButton && d->pressed && this->rect().contains(iEvent->pos()) && clickType() == ClickType_Click)
        {
            emit clicked(urlAddress(), configData());
        }
    }
    d->startDragBol = false;
    d->pressed = false;
}

void TopDesktopItemAbs::dragEnterEvent(QDragEnterEvent *event)
{
    event->ignore();
}

void TopDesktopItemAbs::dragLeaveEvent(QDragLeaveEvent *event)
{
    event->ignore();
}

void TopDesktopItemAbs::mouseDoubleClickEvent(QMouseEvent *iEvent)
{
    if (iEvent->button() == Qt::LeftButton){
        if (state() == TopDesktopItemAbs::State_Editing)
        {
            showConfigDialog();
        }
        else if (clickType() == ClickType_DoubleClick)
        {
            emit doubleClicked(urlAddress(), configData());
        }
    }
    QFrame::mouseDoubleClickEvent(iEvent);
}

QMenu *TopDesktopItemAbs::createContextMenu()
{
    Q_D(TopDesktopItemAbs);
    if (!d->popupMenu)
    {
        QAction *smallAct = new QAction(tr("1X1"), this);
        smallAct->setData(QString("1x1"));
        smallAct->setCheckable(true);

        QAction *Act2x1 = new QAction(tr("2X1"), this);
        Act2x1->setData(QString("2x1"));
        Act2x1->setCheckable(true);

        QAction *midiumAct = new QAction(tr("2X2"), this);
        midiumAct->setData(QString("2x2"));
        midiumAct->setCheckable(true);

        QAction *wideAct = new QAction(tr("2X4"), this);
        wideAct->setData(QString("2x4"));
        wideAct->setCheckable(true);

        QAction *Act4X1 = new QAction(tr("4X1"), this);
        Act4X1->setData(QString("4x1"));
        Act4X1->setCheckable(true);

        QAction *highAct = new QAction(tr("4X2"), this);
        highAct->setData(QString("4x2"));
        highAct->setCheckable(true);

        QAction *bigAct = new QAction(tr("4x4"), this);
        bigAct->setData(QString("4x4"));
        bigAct->setCheckable(true);

        d->mLayoutActionsGroup = new QActionGroup(this);
        d->mLayoutActionsGroup->addAction(smallAct);
        d->mLayoutActionsGroup->addAction(Act2x1);
        d->mLayoutActionsGroup->addAction(midiumAct);
        d->mLayoutActionsGroup->addAction(wideAct);
        d->mLayoutActionsGroup->addAction(Act4X1);
        d->mLayoutActionsGroup->addAction(highAct);
        d->mLayoutActionsGroup->addAction(bigAct);

        connect(d->mLayoutActionsGroup, SIGNAL(triggered(QAction*)), this, SLOT(setItemLayoutStyle(QAction*)));

        QMenu *adjustMenu = new QMenu(tr("Adjust size"), this);
        adjustMenu->addActions(d->mLayoutActionsGroup->actions());

        d->popupMenu = new QMenu(this);
        d->popupMenu->addAction(TRES->icon(""), tr("Setting Module"), this, SLOT(showConfigDialog()));
        d->popupMenu->addAction(TRES->icon(""), tr("Delete Module"), this, SLOT(deleteItem()));
        d->popupMenu->addMenu(adjustMenu);
    }
    return d->popupMenu;
}

QVariantMap TopDesktopItemAbs::configData() const
{
    Q_D(const TopDesktopItemAbs);
    return d->configData;
}

void TopDesktopItemAbs::setConfigData(const QVariantMap &iCfgDataVar)
{
    Q_D(TopDesktopItemAbs);
    d->configData = iCfgDataVar;
    emit configChanged();
}

QString TopDesktopItemAbs::urlAddress() const
{
    return config("urlAddress").toString();
}

void TopDesktopItemAbs::setUrlAddress(const QString &iAdrStr)
{
    setConfig("urlAddress", iAdrStr);
}

TopDesktopItemAbs::State TopDesktopItemAbs::state() const
{
    Q_D(const TopDesktopItemAbs);
    return d->state;
}

void TopDesktopItemAbs::setState(TopDesktopItemAbs::State iState)
{
    Q_D(TopDesktopItemAbs);
    d->state = iState;
}

TopDesktopItemAbs::ClickType TopDesktopItemAbs::clickType() const
{
    Q_D(const TopDesktopItemAbs);
    return d->clickType;
}

void TopDesktopItemAbs::setClickType(TopDesktopItemAbs::ClickType iClickType)
{
    Q_D(TopDesktopItemAbs);
    d->clickType = iClickType;
}

QVariant TopDesktopItemAbs::config(const QString &iKeyVar) const
{
    Q_D(const TopDesktopItemAbs);
    return d->configData.value(iKeyVar);
}

void TopDesktopItemAbs::setConfig(const QString &iKeyVar, const QVariant &iValueVar)
{
    Q_D(TopDesktopItemAbs);
    d->configData.insert(iKeyVar, iValueVar);
    emit configChanged();
}

int TopDesktopItemAbs::rowSpan() const
{
    QString vStyleStr = layoutStyle().toUpper();
    QStringList vStyleStrLst = vStyleStr.split('X');
    int rowInt = vStyleStrLst.value(1).toInt();
    if (rowInt < 1) rowInt = 2;
    return rowInt;
}

int TopDesktopItemAbs::colSpan() const
{
    QString vStyleStr = layoutStyle().toUpper();
    QStringList vStyleStrLst = vStyleStr.split('X');
    int colInt = vStyleStrLst.value(0).toInt();
    if (colInt < 1) colInt = 2;
    return colInt;
}

bool TopDesktopItemAbs::hasOpenRight() const
{
    Q_D(const TopDesktopItemAbs);
    return d->hasOpenRight;
}

void TopDesktopItemAbs::setHasOpenRight(bool iHasOpenRightBol)
{
    Q_D(TopDesktopItemAbs);
    d->hasOpenRight = iHasOpenRightBol;
}

QString TopDesktopItemAbs::layoutStyle() const
{
    return config("layoutStyle").toString().toUpper();
}

void TopDesktopItemAbs::setLayoutStyle(const QString &iLayoutStyleStr)
{
    setConfig("layoutStyle", iLayoutStyleStr);
}

QString TopDesktopItemAbs::fixedStyleSheet() const
{
    Q_D(const TopDesktopItemAbs);
    return d->fixedStyleSheet;
}

void TopDesktopItemAbs::setFixedStyleSheet(const QString &iStyleSheetStr)
{
    Q_D(TopDesktopItemAbs);
    d->fixedStyleSheet = iStyleSheetStr;
}

void TopDesktopItemAbs::setStartRow(int iStartRowInt)
{
    setConfig("startRow", iStartRowInt);
}

int TopDesktopItemAbs::startRow() const
{
    return config("startRow").toInt();
}

void TopDesktopItemAbs::setStartCol(int iStartColInt)
{
    setConfig("startCol", iStartColInt);
}

int TopDesktopItemAbs::startCol() const
{
    return config("startCol").toInt();
}

void TopDesktopItemAbs::setMargin(int iMarginInt)
{
    Q_D(TopDesktopItemAbs);
    d->marginInt = iMarginInt;
}

int TopDesktopItemAbs::margin() const
{
    Q_D(const TopDesktopItemAbs);
    return d->marginInt;
}

bool TopDesktopItemAbs::showConfigDialog()
{
    return false;
}

void TopDesktopItemAbs::deleteItem()
{
    emit itemDeleted(this);
}

void TopDesktopItemAbs::setItemLayoutStyle(QAction *iAction)
{
    Q_D(TopDesktopItemAbs);
    if (!d->mLayoutActionsGroup->actions().contains(iAction)) return;

    QString layoutDataStr = iAction->data().toString();

    setLayoutStyle(layoutDataStr);
    doLayout();
    emit layoutDone();
}

void TopDesktopItemAbs::setColorList(TComboBox *iBackgroundCombox)
{
    QString colorsStr =  "["
                         "\"transparent\","
                         "\"rgba(0, 0, 0, 0.9)\","
                         "\"rgba(255, 255, 255, 0.9)\","
                         "\"rgba(42, 105, 238, 0.9)\","
                         "\"rgba(239, 59, 5, 0.9)\","
                         "\"rgba(255, 153, 0, 0.9)\","
                         "\"rgba(27, 117, 27, 0.9)\","
                         "\"rgba(110, 9, 189, 0.9)\","
                         "\"rgba(0, 204, 204, 0.9)\","
                         "\"rgba(51, 153, 51, 0.9)\","
                         "\"rgba(250, 123, 56, 0.9)\","
                         "\"rgba(86, 97, 153, 0.9)\","
                         "\"rgba(173, 86, 94, 0.9)\","
                         "\"rgba(128,128,255,0.9)\","
                         "\"rgba(164,99,255,0.9)\","
                         "\"rgba(0,128,128,0.9)\","
                         "\"rgba(204,51,51,0.9)\","
                         "\"rgba(255, 191, 24, 0.9)\","
                         "\"rgba(39, 183, 255, 0.9)\","
                         "\"rgba(255, 118, 100, 0.9)\","
                         "\"rgba(249, 176, 13, 0.9)\","
                         "\"rgba(46,207,199,0.9)\","
                         "\"rgba(104,193,27,0.9)\","
                         "\"rgba(155,123,255,0.9)\","
                         "\"rgba(170, 80, 75, 0.9)\","
                         "\"rgba(0, 95, 178, 0.9)\","
                         "\"rgba(30, 117, 48, 0.9)\""
                         "]";
    QVariantList btnBkgColorVarLst = TDataParse::jsonStr2Variant(colorsStr).toList();
    //1. 下拉框添加颜色字符
    QVariantList colorVarLst;
    foreach(QVariant itemVar, btnBkgColorVarLst)
    {
        QString colorStr = itemVar.toString();

        QVariantMap comboVarMap;
        comboVarMap.insert("name", colorStr);
        comboVarMap.insert("text", colorStr);

        colorVarLst << comboVarMap;
    }
    iBackgroundCombox->setItemList(colorVarLst);

    //2. 设置颜色图标
    for(int n = 0; n < colorVarLst.count(); n++)
    {
        QVariantMap itemVarMap = colorVarLst.at(n).toMap();
        QString colorStr = itemVarMap.value("text").toString();

        int rInt = 0, gInt = 0, bInt = 0;
        QRegExp rx("(\\d+)\\s*\\,\\s*(\\d+)\\s*\\,\\s*(\\d+)");
        if (rx.indexIn(colorStr) != -1)
        {
            rInt = rx.cap(1).toInt();
            gInt = rx.cap(2).toInt();
            bInt = rx.cap(3).toInt();
        }

        //创建pixmap
        const int widthInt = 80;
        const int heightInt = 20;
        QPixmap pixColor(widthInt, heightInt);
        pixColor.fill(QColor(rInt, gInt, bInt, 210));

        iBackgroundCombox->setItemIcon(n, QIcon(pixColor));
        iBackgroundCombox->setIconSize(QSize(widthInt, heightInt));
    }
}

void TopDesktopItemAbs::doLayout()
{
    QVariantMap vConfigData = configData();

    QString title = vConfigData.value("title_" + APP->language()).toString();
    if (title.isEmpty()) title = vConfigData.value("title").toString();
    QString remark = vConfigData.value("remark_" + APP->language()).toString();
    if (remark.isEmpty()) remark = vConfigData.value("remark").toString();
    QString background = vConfigData.value("background").toString();


    setFixedStyleSheet(QString("background:%1;margin:%2px;").arg(background).arg(margin()));
    setToolTip(remark.isEmpty() ? title : remark);

    QStringList layoutStyleList = layoutStyle().toUpper().split("X");
    if (layoutStyleList.count() == 2)
    {
        setLayoutStyle(QString("%1X%2").arg(layoutStyleList[0].toInt()).arg(layoutStyleList[1].toInt()));
    }
    else
    {
        setLayoutStyle(QString("%1X%2").arg(2).arg(2));
    }
}

void TopDesktopItemAbs::doTimeout()
{
}


/***************Private*******************/
class TopWin8DesktopItemPrivate
{
    Q_DECLARE_PUBLIC(TopWin8DesktopItem)
public:
    TopWin8DesktopItemPrivate(TopWin8DesktopItem *qptr) :
        titleLabel(NULL),
        iconLabel(NULL),
        gridLayout(NULL),
        q_ptr(qptr){}
    QLabel *titleLabel;
    QLabel *iconLabel;
    QGridLayout *gridLayout;
    static QMap<QString, QString> i18NMap;

protected:
    TopWin8DesktopItem * const q_ptr;
};

QMap<QString, QString> TopWin8DesktopItemPrivate::i18NMap = {
    {"Title", QObject::tr("Title")},
    {"Title(English)", QObject::tr("Title(English)")},
    {"Title(Chinese Simplified)", QObject::tr("Title(Chinese Simplified)")},
    {"Title(Chinese Tranditional)", QObject::tr("Title(Chinese Tranditional)")},
    {"Icon Name", QObject::tr("Icon Name")},
    {"Search Code", QObject::tr("Search Code")},
    {"Layout Size", QObject::tr("Layout Size")},
    {"Background Color", QObject::tr("Background Color")},
    {"Url Address", QObject::tr("Url Address")}
};

TopWin8DesktopItem::TopWin8DesktopItem(QWidget *parent) :
    TopDesktopItemAbs(parent), d_ptr(new TopWin8DesktopItemPrivate(this))
{
    Q_D(TopWin8DesktopItem);
    d->iconLabel = new QLabel(this);
    d->titleLabel = new QLabel(this);

    d->gridLayout = new QGridLayout(this);

    this->setLayout(d->gridLayout);
}

TopWin8DesktopItem::~TopWin8DesktopItem()
{
}

static QColor getForegroundColor(const QColor &iBackgroundColor) {
    QString name = iBackgroundColor.name();
    name = name.replace("#", "");
    bool ok = false;
    int value = name.toInt(&ok, 16);
    if (!ok) {
        return Qt::black;
    }
    int r = value >> 16;
    int g = (value & 65280) >> 8;
    int b = value & 255;
    double brightness = r * 0.299 + g * 0.587 + b * 0.114;
    return (brightness > 160) ? Qt::black : Qt::white;
}

/*!
 * \brief convert "rgba(0, 0, 0, 0.9)" to QColor
 */
static QColor fromRgbaStr(const QString &iStr) {
    QRegularExpression re("rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*(.*)\\s*\\)");
    QRegularExpressionMatch match = re.match(iStr);
    QColor color;
    if (match.hasMatch()) {
        color.setRgb(match.captured(1).toInt(), match.captured(2).toInt(), match.captured(3).toInt());
        color.setAlphaF(match.captured(4).toDouble());
    }
    return color;
}

void TopWin8DesktopItem::doLayout()
{
    Q_D(TopWin8DesktopItem);
    while (d->gridLayout->count() > 0){
        d->gridLayout->removeItem(d->gridLayout->itemAt(0));
    }

    QString vStyle = layoutStyle().toUpper();
    QVariantMap vConfigData = configData();

    d->gridLayout->setMargin(2);
    d->gridLayout->setSpacing(0);
    int iconwidth =  64;
    int iconheight = 64;
    QString icon = vConfigData.value("icon").toString();
    QString title = vConfigData.value("title_" + APP->language()).toString();
    if (title.isEmpty()) title = vConfigData.value("title").toString();
    QString background = vConfigData.value("background").toString();
    QString searchCodeStr = vConfigData.value("searchCode").toString();
    QString fgColor = getForegroundColor(fromRgbaStr(background)).name();
    d->titleLabel->setStyleSheet(QString("color:%1;font:14px;padding:0 0 0 5px;").arg(fgColor));
    d->titleLabel->setText(title);

    if (vStyle == "1X1"){
        iconwidth =  28;
        iconheight = 28;
        d->titleLabel->setVisible(false);
        d->gridLayout->addWidget(d->iconLabel, 0, 0, 1, 1, Qt::AlignCenter);
        d->gridLayout->setRowStretch(0, 1);
    } else if (vStyle == "2X1"){
        iconwidth =  28;
        iconheight = 28;
        d->titleLabel->setVisible(true);
        d->titleLabel->setWordWrap(true);
        d->gridLayout->addWidget(d->iconLabel,0,0,1,1,Qt::AlignCenter);
        d->gridLayout->addWidget(d->titleLabel,0,1,1,1,Qt::AlignCenter|Qt::AlignLeft);
        d->gridLayout->setMargin(10);
        d->gridLayout->setRowStretch(0,1);
        d->gridLayout->setColumnStretch(1, 1);
    } else if (vStyle == "4X1"){
        iconwidth =  28;
        iconheight = 28;
        d->titleLabel->setVisible(true);
        d->titleLabel->setWordWrap(true);
        d->gridLayout->setMargin(10);
        d->gridLayout->addWidget(d->iconLabel,0,0,3,1,Qt::AlignCenter);
        d->gridLayout->addWidget(d->titleLabel,0,1,3,3,Qt::AlignCenter |Qt::AlignLeft);
        d->gridLayout->setRowStretch(0,1);
        d->gridLayout->setColumnStretch(1, 1);
    } else if (vStyle == "4X2"){
        iconwidth =  48;
        iconheight = 48;
        d->titleLabel->setVisible(true);
        d->titleLabel->setWordWrap(true);
        d->gridLayout->addWidget(d->iconLabel,0,0,1,1,Qt::AlignCenter);
        d->gridLayout->addWidget(d->titleLabel, 1, 0, 1, 1, Qt::AlignCenter);
        d->gridLayout->setContentsMargins(2,2,2,7);
        d->gridLayout->setRowStretch(0,1);
    } else if (vStyle == "2X4"){
        iconwidth =  48;
        iconheight = 48;
        d->titleLabel->setVisible(true);
        d->titleLabel->setWordWrap(true);
        d->gridLayout->addWidget(d->iconLabel,0,0,1,1,Qt::AlignCenter);
        d->gridLayout->addWidget(d->titleLabel,1,0,1,1,Qt::AlignCenter);
        d->gridLayout->setContentsMargins(2,2,2,7);
        d->gridLayout->setRowStretch(0,1);
    } else if (vStyle == "4X4"){
        iconwidth = 64;
        iconheight = 64;
        d->titleLabel->setVisible(true);
        d->titleLabel->setWordWrap(true);
        d->gridLayout->addWidget(d->iconLabel, 0, 0, 1, 1, Qt::AlignCenter);
        d->gridLayout->addWidget(d->titleLabel, 1, 0, 1, 1, Qt::AlignCenter);
        d->gridLayout->setContentsMargins(2,2,2,7);
        d->gridLayout->setRowStretch(0, 1);
    } else{
        iconwidth = 64;
        iconheight = 64;
        d->titleLabel->setVisible(true);
        d->titleLabel->setWordWrap(true);
        d->gridLayout->addWidget(d->iconLabel, 0, 0, 2, 2, Qt::AlignCenter);
        d->gridLayout->addWidget(d->titleLabel, 2, 0, 1, 2, Qt::AlignCenter);
        d->gridLayout->setContentsMargins(2,2,2,7);
        d->gridLayout->setRowStretch(0, 1);
    }

    d->iconLabel->setMinimumSize(iconwidth, iconheight);
    d->iconLabel->setPixmap(TResource::instance()->icon(icon).pixmap(iconwidth, iconheight));

    setFixedStyleSheet(QString("background:%1;margin:%2px;").arg(background).arg(margin()));
    setStyleSheet(QString("QFrame[SS=\"DESKTOPITEM\"]{border-style:solid;border-width:1px;border-color:transparent;%1;}").arg(fixedStyleSheet()));
    QString tipStr = d->titleLabel->text();
    if (!searchCodeStr.isEmpty()) tipStr += QString("\n<%1>").arg(searchCodeStr);
    setToolTip(tipStr);
    blockSignals(false);
}

bool TopWin8DesktopItem::showConfigDialog()
{
    TUiloaderDialog dialog;
    QString uiStr = TFileIo::readFileString(":/topclass/topdesktop/ItemInfo.ui.js");
    QString itemTextStr = config("title_" + APP->language()).toString();
    if (itemTextStr.isEmpty())
    {
        itemTextStr = config("title").toString();
    }

    if (!itemTextStr.isEmpty())
    {
        dialog.setTitle(tr("Edit - %1").arg(itemTextStr));
        dialog.setIcon("setting2.white");
    }
    else
    {
        dialog.setTitle(tr("New Module"));
        dialog.setIcon("add.white");
    }

    dialog.setSelf(this);
    dialog.setScriptEngine(APP->scriptEngine());
    dialog.resize(450, 500);
    dialog.setUiStr(uiStr);
    dialog.loadValues(configData());
    QVariantMap retVarMap = dialog.run(true);
    dialog.close();

    if (retVarMap.isEmpty()) return false;

    setConfigData(retVarMap);
    doLayout();

    return true;
}

QString TopWin8DesktopItem::ttr(const QString &iStr)
{
    return TopWin8DesktopItemPrivate::i18NMap.value(iStr, iStr);
}