aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/squish/squishplugin.cpp
blob: f2e486770c95a782bd4ff865c134ab270eb71686 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Copyright (C) 2022 The Qt Company Ltd
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0

#include "squishplugin.h"

#include "objectsmapeditor.h"
#include "squishfilehandler.h"
#include "squishnavigationwidget.h"
#include "squishoutputpane.h"
#include "squishresultmodel.h"
#include "squishsettings.h"
#include "squishtesttreemodel.h"
#include "squishtools.h"
#include "squishtr.h"
#include "squishwizardpages.h"

#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/icore.h>

#include <extensionsystem/pluginmanager.h>

#include <projectexplorer/jsonwizard/jsonwizardfactory.h>

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

#include <QMenu>
#include <QtPlugin>

using namespace Core;

namespace Squish {
namespace Internal {

class SquishPluginPrivate : public QObject
{
public:
    SquishPluginPrivate();
    ~SquishPluginPrivate();

    void initializeMenuEntries();
    bool initializeGlobalScripts();

    SquishSettings m_squishSettings;
    SquishSettingsPage m_settingsPage{&m_squishSettings};
    SquishTestTreeModel m_treeModel;
    SquishNavigationWidgetFactory m_navigationWidgetFactory;
    ObjectsMapEditorFactory m_objectsMapEditorFactory;
    SquishOutputPane *m_outputPane = nullptr;
    SquishTools * m_squishTools = nullptr;
};

static SquishPluginPrivate *dd = nullptr;

SquishPluginPrivate::SquishPluginPrivate()
{
    qRegisterMetaType<SquishResultItem*>("SquishResultItem*");

    m_squishSettings.readSettings(ICore::settings());
    m_outputPane = SquishOutputPane::instance();
    m_squishTools = new SquishTools;
    initializeMenuEntries();

    ProjectExplorer::JsonWizardFactory::registerPageFactory(new SquishToolkitsPageFactory);
    ProjectExplorer::JsonWizardFactory::registerPageFactory(new SquishScriptLanguagePageFactory);
    ProjectExplorer::JsonWizardFactory::registerPageFactory(new SquishAUTPageFactory);
    ProjectExplorer::JsonWizardFactory::registerGeneratorFactory(new SquishGeneratorFactory);
}

SquishPluginPrivate::~SquishPluginPrivate()
{
    delete m_outputPane;
    delete m_squishTools;
}

SquishPlugin::~SquishPlugin()
{
    delete dd;
    dd = nullptr;
}

SquishSettings *SquishPlugin::squishSettings()
{
    QTC_ASSERT(dd, return nullptr);
    return &dd->m_squishSettings;
}

void SquishPluginPrivate::initializeMenuEntries()
{
    ActionContainer *menu = ActionManager::createMenu("Squish.Menu");
    menu->menu()->setTitle(Tr::tr("&Squish"));
    menu->setOnAllDisabledBehavior(ActionContainer::Show);

    QAction *action = new QAction(Tr::tr("&Server Settings..."), this);
    Command *command = ActionManager::registerAction(action, "Squish.ServerSettings");
    menu->addAction(command);
    connect(action, &QAction::triggered, this, [] {
        SquishServerSettingsDialog dialog;
        dialog.exec();
    });

    ActionContainer *toolsMenu = ActionManager::actionContainer(Core::Constants::M_TOOLS);
    toolsMenu->addMenu(menu);
}

bool SquishPluginPrivate::initializeGlobalScripts()
{
    QTC_ASSERT(dd->m_squishTools, return false);
    SquishFileHandler::instance()->setSharedFolders({});

    const Utils::FilePath squishserver = dd->m_squishSettings.squishPath.filePath().pathAppended(
                Utils::HostOsInfo::withExecutableSuffix("bin/squishserver"));
    if (!squishserver.isExecutableFile())
        return false;

    dd->m_squishTools->queryGlobalScripts([](const QString &output, const QString &error) {
        if (output.isEmpty() || !error.isEmpty())
            return; // ignore (for now?)

        // FIXME? comma, special characters in paths
        const Utils::FilePaths globalDirs = Utils::transform(
                    output.trimmed().split(',', Qt::SkipEmptyParts), &Utils::FilePath::fromString);
        SquishFileHandler::instance()->setSharedFolders(globalDirs);
    });
    return true;
}

bool SquishPlugin::initialize(const QStringList &, QString *)
{
    dd = new SquishPluginPrivate;
    ProjectExplorer::JsonWizardFactory::addWizardPath(":/squish/wizard/");
    return true;
}

bool SquishPlugin::delayedInitialize()
{

    connect(&dd->m_squishSettings, &SquishSettings::squishPathChanged,
            dd, &SquishPluginPrivate::initializeGlobalScripts);

    return dd->initializeGlobalScripts();
}

ExtensionSystem::IPlugin::ShutdownFlag SquishPlugin::aboutToShutdown()
{
    if (dd->m_squishTools) {
        if (dd->m_squishTools->shutdown())
            return SynchronousShutdown;
        connect(dd->m_squishTools, &SquishTools::shutdownFinished,
                this, &ExtensionSystem::IPlugin::asynchronousShutdownFinished);
        return AsynchronousShutdown;
    }
    return SynchronousShutdown;
}

} // namespace Internal
} // namespace Squish