projectexplorer.cpp 92 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2
3
4
**
** This file is part of Qt Creator
**
hjk's avatar
hjk committed
5
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
6
**
7
** Contact: Nokia Corporation (qt-info@nokia.com)
con's avatar
con committed
8
**
9
** Commercial Usage
10
**
11
12
13
14
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
15
**
16
** GNU Lesser General Public License Usage
17
**
18
19
20
21
22
23
** 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.
24
**
25
** If you are unsure which license is appropriate for your use, please
hjk's avatar
hjk committed
26
** contact the sales department at http://qt.nokia.com/contact.
con's avatar
con committed
27
**
28
**************************************************************************/
hjk's avatar
hjk committed
29

30
#include "projectexplorer.h"
Tobias Hunger's avatar
Tobias Hunger committed
31

Tobias Hunger's avatar
Tobias Hunger committed
32
33
#include "buildsteplist.h"
#include "deployconfiguration.h"
34
#include "project.h"
35
#include "projectexplorersettings.h"
Tobias Hunger's avatar
Tobias Hunger committed
36
37
#include "target.h"
#include "targetsettingspanel.h"
38
#include "copytaskhandler.h"
39
#include "showineditortaskhandler.h"
40
#include "vcsannotatetaskhandler.h"
con's avatar
con committed
41
42
43
44
45
#include "applicationrunconfiguration.h"
#include "allprojectsfilter.h"
#include "allprojectsfind.h"
#include "buildmanager.h"
#include "buildsettingspropertiespage.h"
46
#include "currentprojectfind.h"
con's avatar
con committed
47
48
#include "currentprojectfilter.h"
#include "customexecutablerunconfiguration.h"
49
50
#include "editorsettingspropertiespage.h"
#include "dependenciespanel.h"
con's avatar
con committed
51
52
53
54
55
56
57
58
59
#include "foldernavigationwidget.h"
#include "iprojectmanager.h"
#include "metatypedeclarations.h"
#include "nodesvisitor.h"
#include "outputwindow.h"
#include "persistentsettings.h"
#include "pluginfilefactory.h"
#include "processstep.h"
#include "projectexplorerconstants.h"
60
#include "customwizard.h"
con's avatar
con committed
61
62
63
64
65
66
67
68
#include "projectfilewizardextension.h"
#include "projecttreewidget.h"
#include "projectwindow.h"
#include "removefiledialog.h"
#include "runsettingspropertiespage.h"
#include "scriptwrappers.h"
#include "session.h"
#include "sessiondialog.h"
Tobias Hunger's avatar
Tobias Hunger committed
69
#include "target.h"
70
#include "projectexplorersettingspage.h"
71
72
#include "projectwelcomepage.h"
#include "projectwelcomepagewidget.h"
73
#include "corelistenercheckingforrunningbuild.h"
74
#include "buildconfiguration.h"
75
#include "buildconfigdialog.h"
76
#include "miniprojecttargetselector.h"
dt's avatar
dt committed
77
#include "taskhub.h"
con's avatar
con committed
78
79
80

#include <coreplugin/basemode.h>
#include <coreplugin/coreconstants.h>
81
82
#include <coreplugin/filemanager.h>
#include <coreplugin/icore.h>
con's avatar
con committed
83
84
85
#include <coreplugin/mainwindow.h>
#include <coreplugin/mimedatabase.h>
#include <coreplugin/modemanager.h>
86
#include <coreplugin/actionmanager/actionmanager.h>
87
88
#include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/command.h>
con's avatar
con committed
89
90
91
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/editormanager/ieditorfactory.h>
92
#include <coreplugin/editormanager/iexternaleditor.h>
con's avatar
con committed
93
94
95
96
#include <coreplugin/findplaceholder.h>
#include <coreplugin/basefilewizard.h>
#include <coreplugin/vcsmanager.h>
#include <coreplugin/iversioncontrol.h>
97
#include <welcome/welcomemode.h>
98
#include <extensionsystem/pluginmanager.h>
99
#include <utils/consoleprocess.h>
hjk's avatar
hjk committed
100
#include <utils/qtcassert.h>
101
#include <utils/parameteraction.h>
102
#include <utils/stringutils.h>
con's avatar
con committed
103

104
#include <QtCore/QtPlugin>
hjk's avatar
hjk committed
105
#include <QtCore/QDateTime>
con's avatar
con committed
106
107
#include <QtCore/QDebug>
#include <QtCore/QSettings>
hjk's avatar
hjk committed
108

con's avatar
con committed
109
110
#include <QtGui/QAction>
#include <QtGui/QApplication>
hjk's avatar
hjk committed
111
112
113
#include <QtGui/QFileDialog>
#include <QtGui/QMenu>
#include <QtGui/QMessageBox>
con's avatar
con committed
114

115
116
Q_DECLARE_METATYPE(Core::IEditorFactory*);
Q_DECLARE_METATYPE(Core::IExternalEditor*);
con's avatar
con committed
117
118
119
120
121

namespace {
bool debug = false;
}

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
namespace ProjectExplorer {

struct ProjectExplorerPluginPrivate {
    ProjectExplorerPluginPrivate();

    QMenu *m_sessionContextMenu;
    QMenu *m_sessionMenu;
    QMenu *m_projectMenu;
    QMenu *m_subProjectMenu;
    QMenu *m_folderMenu;
    QMenu *m_fileMenu;
    QMenu *m_openWithMenu;

    QMultiMap<int, QObject*> m_actionMap;
    QAction *m_sessionManagerAction;
    QAction *m_newAction;
    QAction *m_loadAction;
139
    Utils::ParameterAction *m_unloadAction;
140
141
    QAction *m_clearSession;
    QAction *m_buildProjectOnlyAction;
142
    Utils::ParameterAction *m_buildAction;
143
    Utils::ParameterAction *m_buildActionContextMenu;
144
145
    QAction *m_buildSessionAction;
    QAction *m_rebuildProjectOnlyAction;
146
    Utils::ParameterAction *m_rebuildAction;
147
    Utils::ParameterAction *m_rebuildActionContextMenu;
148
149
    QAction *m_rebuildSessionAction;
    QAction *m_cleanProjectOnlyAction;
Tobias Hunger's avatar
Tobias Hunger committed
150
151
152
153
    QAction *m_deployProjectOnlyAction;
    Utils::ParameterAction *m_deployAction;
    Utils::ParameterAction *m_deployActionContextMenu;
    QAction *m_deploySessionAction;
154
    Utils::ParameterAction *m_cleanAction;
155
    Utils::ParameterAction *m_cleanActionContextMenu;
156
157
158
159
160
161
162
163
    QAction *m_cleanSessionAction;
    QAction *m_runAction;
    QAction *m_runActionContextMenu;
    QAction *m_cancelBuildAction;
    QAction *m_debugAction;
    QAction *m_addNewFileAction;
    QAction *m_addExistingFilesAction;
    QAction *m_removeFileAction;
164
    QAction *m_removeProjectAction;
165
    QAction *m_deleteFileAction;
166
    QAction *m_renameFileAction;
dt's avatar
dt committed
167
168
169
    QAction *m_openFileAction;
    QAction *m_showInGraphicalShell;
    QAction *m_openTerminalHere;
170
    QAction *m_setStartupProjectAction;
171
    QAction *m_projectSelectorAction;
172
    QAction *m_projectSelectorActionMenu;
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190

    Internal::ProjectWindow *m_proWindow;
    SessionManager *m_session;
    QString m_sessionToRestoreAtStartup;

    Project *m_currentProject;
    Node *m_currentNode;

    BuildManager *m_buildManager;

    QList<Internal::ProjectFileFactory*> m_fileFactories;
    QStringList m_profileMimeTypes;
    Internal::OutputPane *m_outputPane;

    QList<QPair<QString, QString> > m_recentProjects; // pair of filename, displayname
    static const int m_maxRecentProjects = 7;

    QString m_lastOpenDirectory;
191
    RunConfiguration *m_delayedRunConfiguration; // TODO this is not right
192
193
    QString m_runMode;
    QString m_projectFilterString;
194
    Internal::MiniProjectTargetSelector * m_targetSelector;
195
    Internal::ProjectExplorerSettings m_projectExplorerSettings;
196
    Internal::ProjectWelcomePage *m_welcomePage;
197
198

    Core::BaseMode * m_projectsMode;
199
200
201
202
203
204
};

ProjectExplorerPluginPrivate::ProjectExplorerPluginPrivate() :
    m_currentProject(0),
    m_currentNode(0),
    m_delayedRunConfiguration(0),
205
    m_projectsMode(0)
206
207
208
209
210
{
}

}  // namespace ProjectExplorer

con's avatar
con committed
211
212
213
214
215
216
217
using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal;


ProjectExplorerPlugin *ProjectExplorerPlugin::m_instance = 0;

ProjectExplorerPlugin::ProjectExplorerPlugin()
218
    : d(new ProjectExplorerPluginPrivate)
con's avatar
con committed
219
220
221
222
223
224
{
    m_instance = this;
}

ProjectExplorerPlugin::~ProjectExplorerPlugin()
{
225
226
    removeObject(d->m_welcomePage);
    delete d->m_welcomePage;
con's avatar
con committed
227
    removeObject(this);
228
    delete d;
con's avatar
con committed
229
230
231
232
233
234
235
}

ProjectExplorerPlugin *ProjectExplorerPlugin::instance()
{
    return m_instance;
}

236
237
238
239
240
241
bool ProjectExplorerPlugin::parseArguments(const QStringList &arguments, QString * /* error */)
{
    CustomWizard::setVerbose(arguments.count(QLatin1String("-customwizard-verbose")));
    return true;
}

242
bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *error)
con's avatar
con committed
243
{
244
245
    if (!parseArguments(arguments, error))
        return false;
dt's avatar
dt committed
246
247
248
    addObject(this);

    addAutoReleasedObject(new TaskHub);
249

250
251
    Core::ICore *core = Core::ICore::instance();
    Core::ActionManager *am = core->actionManager();
252
    connect(core, SIGNAL(newItemsDialogRequested()), this, SLOT(loadCustomWizards()));
con's avatar
con committed
253

254
    d->m_welcomePage = new ProjectWelcomePage;
255
    connect(d->m_welcomePage, SIGNAL(manageSessions()), this, SLOT(showSessionManager()));
256
    addObject(d->m_welcomePage);
con's avatar
con committed
257

hjk's avatar
hjk committed
258
259
    connect(core->fileManager(), SIGNAL(currentFileChanged(QString)),
            this, SLOT(setCurrentFile(QString)));
con's avatar
con committed
260

261
    d->m_session = new SessionManager(this);
con's avatar
con committed
262

263
264
265
    if (arguments.contains("-lastsession"))
        d->m_sessionToRestoreAtStartup = d->m_session->lastSession();

266
    connect(d->m_session, SIGNAL(projectAdded(ProjectExplorer::Project *)),
con's avatar
con committed
267
            this, SIGNAL(fileListChanged()));
268
    connect(d->m_session, SIGNAL(aboutToRemoveProject(ProjectExplorer::Project *)),
con's avatar
con committed
269
            this, SLOT(invalidateProject(ProjectExplorer::Project *)));
270
    connect(d->m_session, SIGNAL(projectRemoved(ProjectExplorer::Project *)),
con's avatar
con committed
271
            this, SIGNAL(fileListChanged()));
272
    connect(d->m_session, SIGNAL(startupProjectChanged(ProjectExplorer::Project *)),
con's avatar
con committed
273
            this, SLOT(startupProjectChanged()));
274
275
    connect(d->m_session, SIGNAL(dependencyChanged(ProjectExplorer::Project*,ProjectExplorer::Project*)),
            this, SLOT(updateActions()));
con's avatar
con committed
276

277
    d->m_proWindow = new ProjectWindow;
con's avatar
con committed
278

279
    Core::Context globalcontext(Core::Constants::C_GLOBAL);
280
    Core::Context pecontext(Constants::C_PROJECTEXPLORER);
con's avatar
con committed
281

282
283
284
285
286
287
    d->m_projectsMode = new Core::BaseMode;
    d->m_projectsMode->setDisplayName(tr("Projects"));
    d->m_projectsMode->setId(QLatin1String(Constants::MODE_SESSION));
    d->m_projectsMode->setIcon(QIcon(QLatin1String(":/fancyactionbar/images/mode_Project.png")));
    d->m_projectsMode->setPriority(Constants::P_MODE_SESSION);
    d->m_projectsMode->setWidget(d->m_proWindow);
288
    d->m_projectsMode->setContext(pecontext);
289
    d->m_projectsMode->setEnabled(session()->startupProject());
Daniel Molkentin's avatar
Daniel Molkentin committed
290
    d->m_projectsMode->setContextHelpId(QLatin1String("Managing Projects"));
291
    addAutoReleasedObject(d->m_projectsMode);
292
    d->m_proWindow->layout()->addWidget(new Core::FindToolBarPlaceHolder(d->m_proWindow));
con's avatar
con committed
293

294
    addAutoReleasedObject(new CopyTaskHandler);
295
    addAutoReleasedObject(new ShowInEditorTaskHandler);
296
    addAutoReleasedObject(new VcsAnnotateTaskHandler);
297

298
299
    d->m_buildManager = new BuildManager(this);
    connect(d->m_buildManager, SIGNAL(buildStateChanged(ProjectExplorer::Project *)),
con's avatar
con committed
300
            this, SLOT(buildStateChanged(ProjectExplorer::Project *)));
301
    connect(d->m_buildManager, SIGNAL(buildQueueFinished(bool)),
con's avatar
con committed
302
303
            this, SLOT(buildQueueFinished(bool)));

304
    addAutoReleasedObject(new CoreListener);
con's avatar
con committed
305

306
307
308
309
    d->m_outputPane = new OutputPane;
    addAutoReleasedObject(d->m_outputPane);
    connect(d->m_session, SIGNAL(projectRemoved(ProjectExplorer::Project *)),
            d->m_outputPane, SLOT(projectRemoved()));
con's avatar
con committed
310

311
    AllProjectsFilter *allProjectsFilter = new AllProjectsFilter(this);
con's avatar
con committed
312
313
    addAutoReleasedObject(allProjectsFilter);

314
    CurrentProjectFilter *currentProjectFilter = new CurrentProjectFilter(this);
con's avatar
con committed
315
316
317
318
319
    addAutoReleasedObject(currentProjectFilter);

    addAutoReleasedObject(new BuildSettingsPanelFactory);
    addAutoReleasedObject(new RunSettingsPanelFactory);
    addAutoReleasedObject(new EditorSettingsPanelFactory);
320
    addAutoReleasedObject(new DependenciesPanelFactory(d->m_session));
con's avatar
con committed
321
322
323
324

    ProcessStepFactory *processStepFactory = new ProcessStepFactory;
    addAutoReleasedObject(processStepFactory);

325
    AllProjectsFind *allProjectsFind = new AllProjectsFind(this,
326
        Find::SearchResultWindow::instance());
con's avatar
con committed
327
328
    addAutoReleasedObject(allProjectsFind);

329
    CurrentProjectFind *currentProjectFind = new CurrentProjectFind(this,
330
        Find::SearchResultWindow::instance());
con's avatar
con committed
331
332
    addAutoReleasedObject(currentProjectFind);

333
    addAutoReleasedObject(new LocalApplicationRunControlFactory);
con's avatar
con committed
334
335
    addAutoReleasedObject(new CustomExecutableRunConfigurationFactory);

336
    addAutoReleasedObject(new ProjectFileWizardExtension);
con's avatar
con committed
337

338
339
340
    // Settings page
    addAutoReleasedObject(new ProjectExplorerSettingsPage);

con's avatar
con committed
341
    // context menus
342
    Core::ActionContainer *msessionContextMenu =
con's avatar
con committed
343
        am->createMenu(Constants::M_SESSIONCONTEXT);
344
    Core::ActionContainer *mproject =
con's avatar
con committed
345
        am->createMenu(Constants::M_PROJECTCONTEXT);
346
    Core::ActionContainer *msubProject =
con's avatar
con committed
347
        am->createMenu(Constants::M_SUBPROJECTCONTEXT);
348
    Core::ActionContainer *mfolder =
con's avatar
con committed
349
        am->createMenu(Constants::M_FOLDERCONTEXT);
350
    Core::ActionContainer *mfilec =
con's avatar
con committed
351
352
        am->createMenu(Constants::M_FILECONTEXT);

353
354
355
356
357
    d->m_sessionContextMenu = msessionContextMenu->menu();
    d->m_projectMenu = mproject->menu();
    d->m_subProjectMenu = msubProject->menu();
    d->m_folderMenu = mfolder->menu();
    d->m_fileMenu = mfilec->menu();
con's avatar
con committed
358

359
    Core::ActionContainer *mfile =
con's avatar
con committed
360
        am->actionContainer(Core::Constants::M_FILE);
361
    Core::ActionContainer *menubar =
con's avatar
con committed
362
363
364
        am->actionContainer(Core::Constants::MENU_BAR);

    // mode manager (for fancy actions)
365
    Core::ModeManager *modeManager = core->modeManager();
con's avatar
con committed
366
367

    // build menu
368
    Core::ActionContainer *mbuild =
con's avatar
con committed
369
        am->createMenu(Constants::M_BUILDPROJECT);
370
    mbuild->menu()->setTitle(tr("&Build"));
con's avatar
con committed
371
372
373
    menubar->addMenu(mbuild, Core::Constants::G_VIEW);

    // debug menu
374
    Core::ActionContainer *mdebug =
con's avatar
con committed
375
        am->createMenu(Constants::M_DEBUG);
376
    mdebug->menu()->setTitle(tr("&Debug"));
con's avatar
con committed
377
378
    menubar->addMenu(mdebug, Core::Constants::G_VIEW);

379
380
381
382
    Core::ActionContainer *mstartdebugging =
        am->createMenu(Constants::M_DEBUG_STARTDEBUGGING);
    mstartdebugging->menu()->setTitle(tr("&Start Debugging"));
    mdebug->addMenu(mstartdebugging, Core::Constants::G_DEFAULT_ONE);
con's avatar
con committed
383
384
385
386
387
388
389
390
391

    //
    // Groups
    //

    mbuild->appendGroup(Constants::G_BUILD_SESSION);
    mbuild->appendGroup(Constants::G_BUILD_PROJECT);
    mbuild->appendGroup(Constants::G_BUILD_OTHER);
    mbuild->appendGroup(Constants::G_BUILD_CANCEL);
dt's avatar
dt committed
392
    mbuild->appendGroup(Constants::G_BUILD_RUN);
con's avatar
con committed
393
394
395
396
397
398

    msessionContextMenu->appendGroup(Constants::G_SESSION_BUILD);
    msessionContextMenu->appendGroup(Constants::G_SESSION_FILES);
    msessionContextMenu->appendGroup(Constants::G_SESSION_OTHER);
    msessionContextMenu->appendGroup(Constants::G_SESSION_CONFIG);

399
    mproject->appendGroup(Constants::G_PROJECT_FIRST);
con's avatar
con committed
400
401
402
403
404
405
    mproject->appendGroup(Constants::G_PROJECT_BUILD);
    mproject->appendGroup(Constants::G_PROJECT_RUN);
    mproject->appendGroup(Constants::G_PROJECT_FILES);
    mproject->appendGroup(Constants::G_PROJECT_OTHER);
    mproject->appendGroup(Constants::G_PROJECT_CONFIG);

406
    msubProject->appendGroup(Constants::G_PROJECT_FIRST);
407
    msubProject->appendGroup(Constants::G_PROJECT_BUILD);
con's avatar
con committed
408
409
410
411
412
413
414
415
416
417
418
419
420
    msubProject->appendGroup(Constants::G_PROJECT_FILES);
    msubProject->appendGroup(Constants::G_PROJECT_OTHER);
    msubProject->appendGroup(Constants::G_PROJECT_CONFIG);

    mfolder->appendGroup(Constants::G_FOLDER_FILES);
    mfolder->appendGroup(Constants::G_FOLDER_OTHER);
    mfolder->appendGroup(Constants::G_FOLDER_CONFIG);

    mfilec->appendGroup(Constants::G_FILE_OPEN);
    mfilec->appendGroup(Constants::G_FILE_OTHER);
    mfilec->appendGroup(Constants::G_FILE_CONFIG);

    // "open with" submenu
421
    Core::ActionContainer * const openWith =
con's avatar
con committed
422
            am->createMenu(ProjectExplorer::Constants::M_OPENFILEWITHCONTEXT);
423
    openWith->setEmptyAction(Core::ActionContainer::EA_None);
424
425
    d->m_openWithMenu = openWith->menu();
    d->m_openWithMenu->setTitle(tr("Open With"));
con's avatar
con committed
426

427
    connect(d->m_openWithMenu, SIGNAL(triggered(QAction *)),
con's avatar
con committed
428
429
430
431
432
433
            this, SLOT(openWithMenuTriggered(QAction *)));

    //
    // Separators
    //

con's avatar
con committed
434
    Core::Command *cmd;
con's avatar
con committed
435
436
437
438
    QAction *sep;

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
439
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.Build.Sep"), globalcontext);
con's avatar
con committed
440
441
442
443
    mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
444
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.Files.Sep"), globalcontext);
con's avatar
con committed
445
446
447
448
449
450
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_FILES);
    mproject->addAction(cmd, Constants::G_PROJECT_FILES);
    msubProject->addAction(cmd, Constants::G_PROJECT_FILES);

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
451
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.Config.Sep"), globalcontext);
con's avatar
con committed
452
453
454
455
456
457
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_CONFIG);
    mproject->addAction(cmd, Constants::G_PROJECT_CONFIG);
    msubProject->addAction(cmd, Constants::G_PROJECT_CONFIG);

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
458
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.Projects.Sep"), globalcontext);
con's avatar
con committed
459
460
461
462
    mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
463
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.Other.Sep"), globalcontext);
con's avatar
con committed
464
465
466
467
468
469
470
    mbuild->addAction(cmd, Constants::G_BUILD_OTHER);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_OTHER);
    mproject->addAction(cmd, Constants::G_PROJECT_OTHER);
    msubProject->addAction(cmd, Constants::G_PROJECT_OTHER);

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
471
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.Run.Sep"), globalcontext);
con's avatar
con committed
472
473
474
475
476
    mbuild->addAction(cmd, Constants::G_BUILD_RUN);
    mproject->addAction(cmd, Constants::G_PROJECT_RUN);

    sep = new QAction(this);
    sep->setSeparator(true);
hjk's avatar
hjk committed
477
    cmd = am->registerAction(sep, Core::Id("ProjectExplorer.CancelBuild.Sep"), globalcontext);
con's avatar
con committed
478
479
480
481
482
483
484
    mbuild->addAction(cmd, Constants::G_BUILD_CANCEL);

    //
    // Actions
    //

    // new session action
485
486
    d->m_sessionManagerAction = new QAction(tr("Session Manager..."), this);
    cmd = am->registerAction(d->m_sessionManagerAction, Constants::NEWSESSION, globalcontext);
con's avatar
con committed
487
488
489
    cmd->setDefaultKeySequence(QKeySequence());

    // new action
490
491
    d->m_newAction = new QAction(tr("New Project..."), this);
    cmd = am->registerAction(d->m_newAction, Constants::NEWPROJECT, globalcontext);
con's avatar
con committed
492
493
494
495
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+N")));
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_FILES);

    // open action
496
497
    d->m_loadAction = new QAction(tr("Load Project..."), this);
    cmd = am->registerAction(d->m_loadAction, Constants::LOAD, globalcontext);
con's avatar
con committed
498
499
500
501
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+O")));
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_FILES);

    // Default open action
502
503
    d->m_openFileAction = new QAction(tr("Open File"), this);
    cmd = am->registerAction(d->m_openFileAction, ProjectExplorer::Constants::OPENFILE,
con's avatar
con committed
504
505
506
                       globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OPEN);

507
    d->m_showInGraphicalShell = new QAction(FolderNavigationWidget::msgGraphicalShellAction(), this);
508
    cmd = am->registerAction(d->m_showInGraphicalShell, ProjectExplorer::Constants::SHOWINGRAPHICALSHELL,
con's avatar
con committed
509
510
                       globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OPEN);
511
    mfolder->addAction(cmd, Constants::G_FOLDER_FILES);
con's avatar
con committed
512

513
    d->m_openTerminalHere = new QAction(FolderNavigationWidget::msgTerminalAction(), this);
514
515
516
517
518
    cmd = am->registerAction(d->m_openTerminalHere, ProjectExplorer::Constants::OPENTERMIANLHERE,
                       globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OPEN);
    mfolder->addAction(cmd, Constants::G_FOLDER_FILES);

con's avatar
con committed
519
520
521
    // Open With menu
    mfilec->addMenu(openWith, ProjectExplorer::Constants::G_FILE_OPEN);

mae's avatar
mae committed
522
    // recent projects menu
523
    Core::ActionContainer *mrecent =
mae's avatar
mae committed
524
        am->createMenu(Constants::M_RECENTPROJECTS);
525
    mrecent->menu()->setTitle(tr("Recent P&rojects"));
mae's avatar
mae committed
526
527
528
529
    mfile->addMenu(mrecent, Core::Constants::G_FILE_OPEN);
    connect(mfile->menu(), SIGNAL(aboutToShow()),
        this, SLOT(updateRecentProjectMenu()));

con's avatar
con committed
530
    // unload action
531
532
    d->m_unloadAction = new Utils::ParameterAction(tr("Close Project"), tr("Close Project \"%1\""),
                                                      Utils::ParameterAction::EnabledWithParameter, this);
533
    cmd = am->registerAction(d->m_unloadAction, Constants::UNLOAD, globalcontext);
con's avatar
con committed
534
    cmd->setAttribute(Core::Command::CA_UpdateText);
535
    cmd->setDefaultText(d->m_unloadAction->text());
con's avatar
con committed
536
537
538
539
    mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);
    mproject->addAction(cmd, Constants::G_PROJECT_FILES);

    // unload session action
540
541
    d->m_clearSession = new QAction(tr("Close All Projects"), this);
    cmd = am->registerAction(d->m_clearSession, Constants::CLEARSESSION, globalcontext);
con's avatar
con committed
542
543
544
545
    mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_FILES);

    // session menu
546
    Core::ActionContainer *msession = am->createMenu(Constants::M_SESSION);
547
    msession->menu()->setTitle(tr("Session"));
con's avatar
con committed
548
    mfile->addMenu(msession, Core::Constants::G_FILE_PROJECT);
549
    d->m_sessionMenu = msession->menu();
con's avatar
con committed
550
551
552
553
554
555
    connect(mfile->menu(), SIGNAL(aboutToShow()),
            this, SLOT(updateSessionMenu()));

    // build session action
    QIcon buildIcon(Constants::ICON_BUILD);
    buildIcon.addFile(Constants::ICON_BUILD_SMALL);
556
557
    d->m_buildSessionAction = new QAction(buildIcon, tr("Build All"), this);
    cmd = am->registerAction(d->m_buildSessionAction, Constants::BUILDSESSION, globalcontext);
con's avatar
con committed
558
559
560
561
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+B")));
    mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);
    // Add to mode bar
562
    modeManager->addAction(cmd, Constants::P_ACTION_BUILDSESSION);
con's avatar
con committed
563
564
565
566

    // rebuild session action
    QIcon rebuildIcon(Constants::ICON_REBUILD);
    rebuildIcon.addFile(Constants::ICON_REBUILD_SMALL);
567
568
    d->m_rebuildSessionAction = new QAction(rebuildIcon, tr("Rebuild All"), this);
    cmd = am->registerAction(d->m_rebuildSessionAction, Constants::REBUILDSESSION, globalcontext);
con's avatar
con committed
569
570
571
    mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);

Tobias Hunger's avatar
Tobias Hunger committed
572
573
574
575
576
577
    // deploy session
    d->m_deploySessionAction = new QAction(tr("Deploy All"), this);
    cmd = am->registerAction(d->m_deploySessionAction, Constants::DEPLOYSESSION, globalcontext);
    mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);

con's avatar
con committed
578
579
580
    // clean session
    QIcon cleanIcon(Constants::ICON_CLEAN);
    cleanIcon.addFile(Constants::ICON_CLEAN_SMALL);
581
582
    d->m_cleanSessionAction = new QAction(cleanIcon, tr("Clean All"), this);
    cmd = am->registerAction(d->m_cleanSessionAction, Constants::CLEANSESSION, globalcontext);
con's avatar
con committed
583
584
585
586
    mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);

    // build action
587
    d->m_buildAction = new Utils::ParameterAction(tr("Build Project"), tr("Build Project \"%1\""),
588
                                                     Utils::ParameterAction::AlwaysEnabled, this);
589
    cmd = am->registerAction(d->m_buildAction, Constants::BUILD, globalcontext);
590
    cmd->setAttribute(Core::Command::CA_UpdateText);
591
    cmd->setDefaultText(d->m_buildAction->text());
con's avatar
con committed
592
593
594
595
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+B")));
    mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);

    // rebuild action
596
    d->m_rebuildAction = new Utils::ParameterAction(tr("Rebuild Project"), tr("Rebuild Project \"%1\""),
597
                                                       Utils::ParameterAction::AlwaysEnabled, this);
598
    cmd = am->registerAction(d->m_rebuildAction, Constants::REBUILD, globalcontext);
599
    cmd->setAttribute(Core::Command::CA_UpdateText);
600
    cmd->setDefaultText(d->m_rebuildAction->text());
con's avatar
con committed
601
602
    mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);

Tobias Hunger's avatar
Tobias Hunger committed
603
604
605
606
607
608
609
610
    // deploy action
    d->m_deployAction = new Utils::ParameterAction(tr("Deploy Project"), tr("Deploy Project \"%1\""),
                                                     Utils::ParameterAction::AlwaysEnabled, this);
    cmd = am->registerAction(d->m_deployAction, Constants::DEPLOY, globalcontext);
    cmd->setAttribute(Core::Command::CA_UpdateText);
    cmd->setDefaultText(d->m_deployAction->text());
    mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);

con's avatar
con committed
611
    // clean action
612
    d->m_cleanAction = new Utils::ParameterAction(tr("Clean Project"), tr("Clean Project \"%1\""),
613
                                                     Utils::ParameterAction::AlwaysEnabled, this);
614
    cmd = am->registerAction(d->m_cleanAction, Constants::CLEAN, globalcontext);
615
    cmd->setAttribute(Core::Command::CA_UpdateText);
616
    cmd->setDefaultText(d->m_cleanAction->text());
con's avatar
con committed
617
    mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634

    // build action (context menu)
    d->m_buildActionContextMenu = new Utils::ParameterAction(tr("Build Project"), tr("Build Project \"%1\""),
                                                             Utils::ParameterAction::AlwaysEnabled, this);
    cmd = am->registerAction(d->m_buildActionContextMenu, Constants::BUILDCM, globalcontext);
    cmd->setAttribute(Core::Command::CA_UpdateText);
    cmd->setDefaultText(d->m_buildActionContextMenu->text());
    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);

    // rebuild action (context menu)
    d->m_rebuildActionContextMenu = new Utils::ParameterAction(tr("Rebuild Project"), tr("Rebuild Project \"%1\""),
                                                               Utils::ParameterAction::AlwaysEnabled, this);
    cmd = am->registerAction(d->m_rebuildActionContextMenu, Constants::REBUILDCM, globalcontext);
    cmd->setAttribute(Core::Command::CA_UpdateText);
    cmd->setDefaultText(d->m_rebuildActionContextMenu->text());
    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);

Tobias Hunger's avatar
Tobias Hunger committed
635
636
637
    // deploy action (context menu)
    d->m_deployActionContextMenu = new Utils::ParameterAction(tr("Deploy Project"), tr("Deploy Project \"%1\""),
                                                              Utils::ParameterAction::AlwaysEnabled, this);
638
    cmd = am->registerAction(d->m_deployActionContextMenu, Constants::DEPLOYCM, globalcontext);
Tobias Hunger's avatar
Tobias Hunger committed
639
640
641
642
    cmd->setAttribute(Core::Command::CA_UpdateText);
    cmd->setDefaultText(d->m_deployActionContextMenu->text());
    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);

643
644
645
646
647
648
    // clean action (context menu)
    d->m_cleanActionContextMenu = new Utils::ParameterAction(tr("Clean Project"), tr("Clean Project \"%1\""),
                                                             Utils::ParameterAction::AlwaysEnabled, this);
    cmd = am->registerAction(d->m_cleanActionContextMenu, Constants::CLEANCM, globalcontext);
    cmd->setAttribute(Core::Command::CA_UpdateText);
    cmd->setDefaultText(d->m_cleanActionContextMenu->text());
con's avatar
con committed
649
650
    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);

651
    // build without dependencies action
652
653
    d->m_buildProjectOnlyAction = new QAction(tr("Build Without Dependencies"), this);
    cmd = am->registerAction(d->m_buildProjectOnlyAction, Constants::BUILDPROJECTONLY, globalcontext);
654

655
    // rebuild without dependencies action
656
657
    d->m_rebuildProjectOnlyAction = new QAction(tr("Rebuild Without Dependencies"), this);
    cmd = am->registerAction(d->m_rebuildProjectOnlyAction, Constants::REBUILDPROJECTONLY, globalcontext);
658

Tobias Hunger's avatar
Tobias Hunger committed
659
660
661
662
    // deploy without dependencies action
    d->m_deployProjectOnlyAction = new QAction(tr("Deploy Without Dependencies"), this);
    cmd = am->registerAction(d->m_deployProjectOnlyAction, Constants::DEPLOYPROJECTONLY, globalcontext);

663
    // clean without dependencies action
664
665
    d->m_cleanProjectOnlyAction = new QAction(tr("Clean Without Dependencies"), this);
    cmd = am->registerAction(d->m_cleanProjectOnlyAction, Constants::CLEANPROJECTONLY, globalcontext);
666

con's avatar
con committed
667
668
669
    // run action
    QIcon runIcon(Constants::ICON_RUN);
    runIcon.addFile(Constants::ICON_RUN_SMALL);
670
671
    d->m_runAction = new QAction(runIcon, tr("Run"), this);
    cmd = am->registerAction(d->m_runAction, Constants::RUN, globalcontext);
672
673
    cmd->setAttribute(Core::Command::CA_UpdateText);

con's avatar
con committed
674
675
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+R")));
    mbuild->addAction(cmd, Constants::G_BUILD_RUN);
676

677
    modeManager->addAction(cmd, Constants::P_ACTION_RUN);
con's avatar
con committed
678

679
680
    d->m_runActionContextMenu = new QAction(runIcon, tr("Run"), this);
    cmd = am->registerAction(d->m_runActionContextMenu, Constants::RUNCONTEXTMENU, globalcontext);
681
682
    mproject->addAction(cmd, Constants::G_PROJECT_RUN);

con's avatar
con committed
683
    // cancel build action
684
685
    d->m_cancelBuildAction = new QAction(tr("Cancel Build"), this);
    cmd = am->registerAction(d->m_cancelBuildAction, Constants::CANCELBUILD, globalcontext);
con's avatar
con committed
686
687
688
689
    mbuild->addAction(cmd, Constants::G_BUILD_CANCEL);

    // debug action
    QIcon debuggerIcon(":/projectexplorer/images/debugger_start_small.png");
690
    debuggerIcon.addFile(":/projectexplorer/images/debugger_start.png");
691
692
    d->m_debugAction = new QAction(debuggerIcon, tr("Start Debugging"), this);
    cmd = am->registerAction(d->m_debugAction, Constants::DEBUG, globalcontext);
con's avatar
con committed
693
694
    cmd->setAttribute(Core::Command::CA_UpdateText);
    cmd->setAttribute(Core::Command::CA_UpdateIcon);
con's avatar
con committed
695
696
    cmd->setDefaultText(tr("Start Debugging"));
    cmd->setDefaultKeySequence(QKeySequence(tr("F5")));
697
    mstartdebugging->addAction(cmd, Core::Constants::G_DEFAULT_ONE);
698
    modeManager->addAction(cmd, Constants::P_ACTION_DEBUG);
con's avatar
con committed
699
700

    // add new file action
701
702
    d->m_addNewFileAction = new QAction(tr("Add New..."), this);
    cmd = am->registerAction(d->m_addNewFileAction, ProjectExplorer::Constants::ADDNEWFILE,
con's avatar
con committed
703
704
705
                       globalcontext);
    mproject->addAction(cmd, Constants::G_PROJECT_FILES);
    msubProject->addAction(cmd, Constants::G_PROJECT_FILES);
706
    mfolder->addAction(cmd, Constants::G_FOLDER_FILES);
con's avatar
con committed
707
708

    // add existing file action
709
710
    d->m_addExistingFilesAction = new QAction(tr("Add Existing Files..."), this);
    cmd = am->registerAction(d->m_addExistingFilesAction, ProjectExplorer::Constants::ADDEXISTINGFILES,
con's avatar
con committed
711
712
713
                       globalcontext);
    mproject->addAction(cmd, Constants::G_PROJECT_FILES);
    msubProject->addAction(cmd, Constants::G_PROJECT_FILES);
714
    mfolder->addAction(cmd, Constants::G_FOLDER_FILES);
con's avatar
con committed
715
716

    // remove file action
717
718
    d->m_removeFileAction = new QAction(tr("Remove File..."), this);
    cmd = am->registerAction(d->m_removeFileAction, ProjectExplorer::Constants::REMOVEFILE,
con's avatar
con committed
719
720
721
                       globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OTHER);

722
723
724
725
726
727
    // remove project action
    d->m_removeProjectAction = new QAction(tr("Remove Project"), this);
    cmd = am->registerAction(d->m_removeProjectAction, ProjectExplorer::Constants::REMOVEPROJECT,
                       globalcontext);
    msubProject->addAction(cmd, Constants::G_PROJECT_FILES);

dt's avatar
dt committed
728
    // delete file action
729
730
731
732
733
    d->m_deleteFileAction = new QAction(tr("Delete File..."), this);
    cmd = am->registerAction(d->m_deleteFileAction, ProjectExplorer::Constants::DELETEFILE,
                             globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OTHER);

dt's avatar
dt committed
734
    // renamefile action
735
736
    d->m_renameFileAction = new QAction(tr("Rename"), this);
    cmd = am->registerAction(d->m_renameFileAction, ProjectExplorer::Constants::RENAMEFILE,
con's avatar
con committed
737
738
                       globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OTHER);
dt's avatar
dt committed
739
740
741
742
    // Not yet used by anyone, so hide for now
//    mfolder->addAction(cmd, Constants::G_FOLDER_FILES);
//    msubProject->addAction(cmd, Constants::G_FOLDER_FILES);
//    mproject->addAction(cmd, Constants::G_FOLDER_FILES);
con's avatar
con committed
743

744
745
746
747
748
749
    // set startup project action
    d->m_setStartupProjectAction = new QAction(tr("Set as Startup Project"), this);
    cmd = am->registerAction(d->m_setStartupProjectAction, ProjectExplorer::Constants::SETSTARTUP,
                             globalcontext);
    mproject->addAction(cmd, Constants::G_PROJECT_FIRST);

750
751
    // target selector
    d->m_projectSelectorAction = new QAction(this);
752
    d->m_projectSelectorAction->setCheckable(true);
753
754
755
    d->m_projectSelectorAction->setEnabled(false);
    QWidget *mainWindow = Core::ICore::instance()->mainWindow();
    d->m_targetSelector = new Internal::MiniProjectTargetSelector(d->m_projectSelectorAction, mainWindow);
756
    connect(d->m_projectSelectorAction, SIGNAL(triggered()), d->m_targetSelector, SLOT(show()));
757
    modeManager->addProjectSelector(d->m_projectSelectorAction);
758
759
760
761
762
763

    d->m_projectSelectorActionMenu = new QAction(this);
    d->m_projectSelectorActionMenu->setEnabled(false);
    d->m_projectSelectorActionMenu->setText(tr("Open Build/Run Target Selector..."));
    connect(d->m_projectSelectorActionMenu, SIGNAL(triggered()), d->m_targetSelector, SLOT(show()));
    cmd = am->registerAction(d->m_projectSelectorActionMenu, ProjectExplorer::Constants::SELECTTARGET,
Tobias Hunger's avatar
Tobias Hunger committed
764
765
                       globalcontext);
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+T")));
766
    mbuild->addAction(cmd, Constants::G_BUILD_RUN);
767
768
769
770
771
772
773
774
775
776

    connect(d->m_session, SIGNAL(projectAdded(ProjectExplorer::Project*)),
            d->m_targetSelector, SLOT(addProject(ProjectExplorer::Project*)));
    connect(d->m_session, SIGNAL(projectRemoved(ProjectExplorer::Project*)),
            d->m_targetSelector, SLOT(removeProject(ProjectExplorer::Project*)));
    connect(d->m_targetSelector, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
            this, SLOT(setStartupProject(ProjectExplorer::Project*)));
    connect(d->m_session, SIGNAL(startupProjectChanged(ProjectExplorer::Project*)),
            d->m_targetSelector, SLOT(changeStartupProject(ProjectExplorer::Project*)));

777
    connect(core, SIGNAL(saveSettingsRequested()),
con's avatar
con committed
778
779
        this, SLOT(savePersistentSettings()));

hjk's avatar
hjk committed
780
781
    addAutoReleasedObject(new ProjectTreeWidgetFactory);
    addAutoReleasedObject(new FolderNavigationWidgetFactory);
con's avatar
con committed
782

783
784
785
786
787
    if (QSettings *s = core->settings()) {
        const QStringList fileNames = s->value("ProjectExplorer/RecentProjects/FileNames").toStringList();
        const QStringList displayNames = s->value("ProjectExplorer/RecentProjects/DisplayNames").toStringList();
        if (fileNames.size() == displayNames.size()) {
            for (int i = 0; i < fileNames.size(); ++i) {
788
                if (QFileInfo(fileNames.at(i)).isFile())
789
                    d->m_recentProjects.append(qMakePair(fileNames.at(i), displayNames.at(i)));
790
791
792
793
            }
        }
    }

794
    if (QSettings *s = core->settings()) {
Tobias Hunger's avatar
Tobias Hunger committed
795
796
        d->m_projectExplorerSettings.buildBeforeDeploy = s->value("ProjectExplorer/Settings/BuildBeforeDeploy", true).toBool();
        d->m_projectExplorerSettings.deployBeforeRun = s->value("ProjectExplorer/Settings/DeployBeforeRun", true).toBool();
797
798
        d->m_projectExplorerSettings.saveBeforeBuild = s->value("ProjectExplorer/Settings/SaveBeforeBuild", false).toBool();
        d->m_projectExplorerSettings.showCompilerOutput = s->value("ProjectExplorer/Settings/ShowCompilerOutput", false).toBool();
799
        d->m_projectExplorerSettings.cleanOldAppOutput = s->value("ProjectExplorer/Settings/CleanOldAppOutput", false).toBool();
800
        d->m_projectExplorerSettings.wrapAppOutput = s->value("ProjectExplorer/Settings/WrapAppOutput", true).toBool();
801
        d->m_projectExplorerSettings.useJom = s->value("ProjectExplorer/Settings/UseJom", true).toBool();
802
803
804
        d->m_projectExplorerSettings.environmentId = QUuid(s->value("ProjectExplorer/Settings/EnvironmentId").toString());
        if (d->m_projectExplorerSettings.environmentId.isNull())
            d->m_projectExplorerSettings.environmentId = QUuid::createUuid();
805
    }
806

807
808
809
810
811
    connect(d->m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(showSessionManager()));
    connect(d->m_newAction, SIGNAL(triggered()), this, SLOT(newProject()));
    connect(d->m_loadAction, SIGNAL(triggered()), this, SLOT(loadAction()));
    connect(d->m_buildProjectOnlyAction, SIGNAL(triggered()), this, SLOT(buildProjectOnly()));
    connect(d->m_buildAction, SIGNAL(triggered()), this, SLOT(buildProject()));
812
    connect(d->m_buildActionContextMenu, SIGNAL(triggered()), this, SLOT(buildProjectContextMenu()));
813
814
815
    connect(d->m_buildSessionAction, SIGNAL(triggered()), this, SLOT(buildSession()));
    connect(d->m_rebuildProjectOnlyAction, SIGNAL(triggered()), this, SLOT(rebuildProjectOnly()));
    connect(d->m_rebuildAction, SIGNAL(triggered()), this, SLOT(rebuildProject()));
816
    connect(d->m_rebuildActionContextMenu, SIGNAL(triggered()), this, SLOT(rebuildProjectContextMenu()));
817
    connect(d->m_rebuildSessionAction, SIGNAL(triggered()), this, SLOT(rebuildSession()));
Tobias Hunger's avatar
Tobias Hunger committed
818
819
820
821
    connect(d->m_deployProjectOnlyAction, SIGNAL(triggered()), this, SLOT(deployProjectOnly()));
    connect(d->m_deployAction, SIGNAL(triggered()), this, SLOT(deployProject()));
    connect(d->m_deployActionContextMenu, SIGNAL(triggered()), this, SLOT(deployProjectContextMenu()));
    connect(d->m_deploySessionAction, SIGNAL(triggered()), this, SLOT(deploySession()));
822
823
    connect(d->m_cleanProjectOnlyAction, SIGNAL(triggered()), this, SLOT(cleanProjectOnly()));
    connect(d->m_cleanAction, SIGNAL(triggered()), this, SLOT(cleanProject()));
824
    connect(d->m_cleanActionContextMenu, SIGNAL(triggered()), this, SLOT(cleanProjectContextMenu()));
825
826
827
828
829
830
831
832
833
    connect(d->m_cleanSessionAction, SIGNAL(triggered()), this, SLOT(cleanSession()));
    connect(d->m_runAction, SIGNAL(triggered()), this, SLOT(runProject()));
    connect(d->m_runActionContextMenu, SIGNAL(triggered()), this, SLOT(runProjectContextMenu()));
    connect(d->m_cancelBuildAction, SIGNAL(triggered()), this, SLOT(cancelBuild()));
    connect(d->m_debugAction, SIGNAL(triggered()), this, SLOT(debugProject()));
    connect(d->m_unloadAction, SIGNAL(triggered()), this, SLOT(unloadProject()));
    connect(d->m_clearSession, SIGNAL(triggered()), this, SLOT(clearSession()));
    connect(d->m_addNewFileAction, SIGNAL(triggered()), this, SLOT(addNewFile()));
    connect(d->m_addExistingFilesAction, SIGNAL(triggered()), this, SLOT(addExistingFiles()));
834
    connect(d->m_removeProjectAction, SIGNAL(triggered()), this, SLOT(removeProject()));
835
836
    connect(d->m_openFileAction, SIGNAL(triggered()), this, SLOT(openFile()));
    connect(d->m_showInGraphicalShell, SIGNAL(triggered()), this, SLOT(showInGraphicalShell()));
837
    connect(d->m_openTerminalHere, SIGNAL(triggered()), this, SLOT(openTerminalHere()));
838
    connect(d->m_removeFileAction, SIGNAL(triggered()), this, SLOT(removeFile()));
839
    connect(d->m_deleteFileAction, SIGNAL(triggered()), this, SLOT(deleteFile()));
840
    connect(d->m_renameFileAction, SIGNAL(triggered()), this, SLOT(renameFile()));
841
    connect(d->m_setStartupProjectAction, SIGNAL(triggered()), this, SLOT(setStartupProject()));
con's avatar
con committed
842
843
844

    updateActions();

845
846
    connect(Core::ICore::instance(), SIGNAL(coreAboutToOpen()),
            this, SLOT(determineSessionToRestoreAtStartup()));
847
    connect(Core::ICore::instance(), SIGNAL(coreOpened()), this, SLOT(restoreSession()));
con's avatar
con committed
848

849
850
    updateWelcomePage();

con's avatar
con committed
851
852
853
    return true;
}

hjk's avatar
hjk committed
854
ProjectFileFactory *ProjectExplorerPlugin::findProjectFileFactory(const QString &filename) const
con's avatar
con committed
855
856
{
    // Find factory
hjk's avatar
hjk committed
857
858
859
860
861
862
    if (const Core::MimeType mt = Core::ICore::instance()->mimeDatabase()->findByFile(QFileInfo(filename))) {
        const QString mimeType = mt.type();
        foreach (ProjectFileFactory *f, d->m_fileFactories)
            if (f->mimeTypes().contains(mimeType))
                return f;
    }
con's avatar
con committed
863
864
865
866
867
868
869
870
871
872
    qWarning("Unable to find project file factory for '%s'", filename.toUtf8().constData());
    return 0;
}

void ProjectExplorerPlugin::loadAction()
{
    if (debug)
        qDebug() << "ProjectExplorerPlugin::loadAction";


873
    QString dir = d->m_lastOpenDirectory;
con's avatar
con committed
874
875
876
877
878
879

    // for your special convenience, we preselect a pro file if it is
    // the current file
    if (Core::IEditor *editor = Core::EditorManager::instance()->currentEditor()) {
        if (const Core::IFile *file = editor->file()) {
            const QString fn = file->fileName();
880
            const bool isProject = d->m_profileMimeTypes.contains(file->mimeType());
con's avatar
con committed
881
882
883
884
885
886
            dir = isProject ? fn : QFileInfo(fn).absolutePath();
        }
    }

    QString filename = QFileDialog::getOpenFileName(0, tr("Load Project"),
                                                    dir,
887
                                                    d->m_projectFilterString);
con's avatar
con committed
888
889
890
891
892
893
894
    if (filename.isEmpty())
        return;
    if (ProjectFileFactory *pf = findProjectFileFactory(filename))
        pf->open(filename);
    updateActions();
}

895
void ProjectExplorerPlugin::unloadProject()
con's avatar
con committed
896
897
{
    if (debug)
898
        qDebug() << "ProjectExplorerPlugin::unloadProject";
con's avatar
con committed
899

900
    Core::IFile *fi = d->m_currentProject->file();
con's avatar
con committed
901
902

    if (!fi || fi->fileName().isEmpty()) //nothing to save?
903
        return;
con's avatar
con committed
904
905
906
907
908
909
910
911
912
913
914
915
916

    QList<Core::IFile*> filesToSave;
    filesToSave << fi;

    // check the number of modified files
    int readonlycount = 0;
    foreach (const Core::IFile *file, filesToSave) {
        if (file->isReadOnly())
            ++readonlycount;
    }

    bool success = false;
    if (readonlycount > 0)
917
        success = Core::ICore::instance()->fileManager()->saveModifiedFiles(filesToSave).isEmpty();
con's avatar
con committed
918
    else
919
        success = Core::ICore::instance()->fileManager()->saveModifiedFilesSilently(filesToSave).isEmpty();
con's avatar
con committed
920

921
    if (!success)
con's avatar
con committed
922
923
        return;

924
    addToRecentProjects(fi->fileName(), d->m_currentProject->displayName(