jsonwizard.cpp 6.61 KB
Newer Older
Tobias Hunger's avatar
Tobias Hunger committed
1
2
3
4
5
6
7
8
9
10
11
12
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** 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 Digia.  For licensing terms and
Eike Ziller's avatar
Eike Ziller committed
13
14
** conditions see http://www.qt.io/licensing.  For further information
** use the contact form at http://www.qt.io/contact-us.
Tobias Hunger's avatar
Tobias Hunger committed
15
16
17
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
Eike Ziller's avatar
Eike Ziller committed
18
19
20
21
22
23
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file.  Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
Tobias Hunger's avatar
Tobias Hunger committed
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
**
** In addition, as a special exception, Digia gives you certain additional
** rights.  These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/

#include "jsonwizard.h"

#include "jsonwizardgeneratorfactory.h"

#include <utils/algorithm.h>
#include <utils/qtcassert.h>

#include <QFileInfo>
#include <QMessageBox>
#include <QVariant>

namespace ProjectExplorer {

JsonWizard::JsonWizard(QWidget *parent) :
45
46
    Utils::Wizard(parent)
{
47
    setMinimumSize(800, 500);
48
49
    m_expander.registerExtraResolver([this](const QString &name, QString *ret) -> bool {
        QVariant v = value(name);
50
51
52
53
54
55
        if (v.isValid()) {
            if (v.type() == QVariant::Bool)
                *ret = v.toBool() ? QLatin1String("true") : QString();
            else
                *ret = v.toString();
        }
56
57
        return v.isValid();
    });
58
59
60
61
62
63
64
    m_expander.registerPrefix("Exists", tr("Check whether a variable exists. Returns \"true\" if it does and an empty string if not."),
                   [this](const QString &value) -> QString
    {
        const QString key = QString::fromLatin1("%{") + value + QLatin1Char('}');
        return m_expander.expand(key) == key ? QString() : QLatin1String("true");
    });

65
}
Tobias Hunger's avatar
Tobias Hunger committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79

JsonWizard::~JsonWizard()
{
    qDeleteAll(m_generators);
}

void JsonWizard::addGenerator(JsonWizardGenerator *gen)
{
    QTC_ASSERT(gen, return);
    QTC_ASSERT(!m_generators.contains(gen), return);

    m_generators.append(gen);
}

80
Utils::MacroExpander *JsonWizard::expander()
Tobias Hunger's avatar
Tobias Hunger committed
81
{
82
    return &m_expander;
Tobias Hunger's avatar
Tobias Hunger committed
83
84
}

85
86
87
88
89
void JsonWizard::resetFileList()
{
    m_files.clear();
}

Tobias Hunger's avatar
Tobias Hunger committed
90
91
92
93
94
95
96
JsonWizard::GeneratorFiles JsonWizard::fileList()
{
    QString errorMessage;
    GeneratorFiles list;

    QString targetPath = value(QLatin1String("TargetPath")).toString();
    if (targetPath.isEmpty()) {
97
        errorMessage = tr("Could not determine target path. \"TargetPath\" was not set on any page.");
Tobias Hunger's avatar
Tobias Hunger committed
98
99
100
101
102
103
        return list;
    }

    if (m_files.isEmpty()) {
        emit preGenerateFiles();
        foreach (JsonWizardGenerator *gen, m_generators) {
104
            Core::GeneratedFiles tmp = gen->fileList(&m_expander, value(QStringLiteral("WizardDir")).toString(),
Tobias Hunger's avatar
Tobias Hunger committed
105
106
107
108
                                                     targetPath, &errorMessage);
            if (!errorMessage.isEmpty())
                break;
            list.append(Utils::transform(tmp, [&gen](const Core::GeneratedFile &f)
109
                                              { return JsonWizard::GeneratorFile(f, gen); }));
Tobias Hunger's avatar
Tobias Hunger committed
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
        }

        if (errorMessage.isEmpty())
            m_files = list;
        emit postGenerateFiles(m_files);
    }

    if (!errorMessage.isEmpty()) {
        QMessageBox::critical(this, tr("File Generation Failed"),
                              tr("The wizard failed to generate files.<br>"
                                 "The error message was: \"%1\".").arg(errorMessage));
        reject();
        return GeneratorFiles();
    }

    return m_files;
}

QVariant JsonWizard::value(const QString &n) const
{
    QVariant v = property(n.toUtf8());
    if (v.isValid()) {
        if (v.type() == QVariant::String)
133
            return m_expander.expand(v.toString());
Tobias Hunger's avatar
Tobias Hunger committed
134
135
136
137
138
139
140
141
142
143
144
145
146
        else
            return v;
    }
    if (hasField(n))
        return field(n); // Can not contain macros!
    return QVariant();
}

void JsonWizard::setValue(const QString &key, const QVariant &value)
{
    setProperty(key.toUtf8(), value);
}

147
bool JsonWizard::boolFromVariant(const QVariant &v, Utils::MacroExpander *expander)
Tobias Hunger's avatar
Tobias Hunger committed
148
149
{
    if (v.type() == QVariant::String)
150
        return !expander->expand(v.toString()).isEmpty();
Tobias Hunger's avatar
Tobias Hunger committed
151
152
153
    return v.toBool();
}

154
155
156
157
158
159
void JsonWizard::removeAttributeFromAllFiles(Core::GeneratedFile::Attribute a)
{
    for (int i = 0; i < m_files.count(); ++i)
        m_files[i].file.setAttributes(m_files.at(i).file.attributes() ^ a);
}

Tobias Hunger's avatar
Tobias Hunger committed
160
161
162
163
164
void JsonWizard::accept()
{
    Utils::Wizard::accept();

    QString errorMessage;
165
    if (fileList().isEmpty())
Tobias Hunger's avatar
Tobias Hunger committed
166
167
168
169
        return;

    emit prePromptForOverwrite(m_files);
    JsonWizardGenerator::OverwriteResult overwrite =
170
            JsonWizardGenerator::promptForOverwrite(&m_files, &errorMessage);
Tobias Hunger's avatar
Tobias Hunger committed
171
172
173
174
175
176
177
    if (overwrite == JsonWizardGenerator::OverwriteError) {
        if (!errorMessage.isEmpty())
            QMessageBox::warning(this, tr("Failed to Overwrite Files"), errorMessage);
        return;
    }

    emit preFormatFiles(m_files);
178
    if (!JsonWizardGenerator::formatFiles(this, &m_files, &errorMessage)) {
Tobias Hunger's avatar
Tobias Hunger committed
179
180
181
182
183
184
        if (!errorMessage.isEmpty())
            QMessageBox::warning(this, tr("Failed to Format Files"), errorMessage);
        return;
    }

    emit preWriteFiles(m_files);
185
    if (!JsonWizardGenerator::writeFiles(this, &m_files, &errorMessage)) {
Tobias Hunger's avatar
Tobias Hunger committed
186
187
188
189
190
191
        if (!errorMessage.isEmpty())
            QMessageBox::warning(this, tr("Failed to Write Files"), errorMessage);
        return;
    }

    emit postProcessFiles(m_files);
192
    if (!JsonWizardGenerator::postWrite(this, &m_files, &errorMessage)) {
Tobias Hunger's avatar
Tobias Hunger committed
193
194
195
196
197
        if (!errorMessage.isEmpty())
            QMessageBox::warning(this, tr("Failed to Post-Process Files"), errorMessage);
        return;
    }
    emit filesReady(m_files);
198
    if (!JsonWizardGenerator::allDone(this, &m_files, &errorMessage)) {
199
200
201
202
203
204
        if (!errorMessage.isEmpty())
            QMessageBox::warning(this, tr("Failed to Open Files"), errorMessage);
        return;
    }

    emit allDone(m_files);
Tobias Hunger's avatar
Tobias Hunger committed
205
206
207
}

} // namespace ProjectExplorer