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
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
    QAction *sep;

    sep = new QAction(this);
    sep->setSeparator(true);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.Build.Sep"), globalcontext);
    mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);

    sep = new QAction(this);
    sep->setSeparator(true);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.Files.Sep"), globalcontext);
    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);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.Config.Sep"), globalcontext);
    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);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.Projects.Sep"), globalcontext);
    mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);

    sep = new QAction(this);
    sep->setSeparator(true);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.Other.Sep"), globalcontext);
    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);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.Run.Sep"), globalcontext);
    mbuild->addAction(cmd, Constants::G_BUILD_RUN);
    mproject->addAction(cmd, Constants::G_PROJECT_RUN);

    sep = new QAction(this);
    sep->setSeparator(true);
    cmd = am->registerAction(sep, QLatin1String("ProjectExplorer.CancelBuild.Sep"), globalcontext);
    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());
925
    d->m_session->removeProject(d->m_currentProject);
con's avatar
con committed
926
927
928
929
930
931
932
933
    updateActions();
}

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

934
    if (!d->m_session->clear())
con's avatar
con committed
935
936
937
938
939
940
        return; // Action has been cancelled
    updateActions();
}

void ProjectExplorerPlugin::extensionsInitialized()
{
941
942
943
    d->m_fileFactories = ProjectFileFactory::createFactories(&d->m_projectFilterString);
    foreach (ProjectFileFactory *pf, d->m_fileFactories) {
        d->m_profileMimeTypes += pf->mimeTypes();
con's avatar
con committed
944
945
        addAutoReleasedObject(pf);
    }
946
947
948
949
950
    d->m_buildManager->extensionsInitialized();
}

void ProjectExplorerPlugin::loadCustomWizards()
{
Friedemann Kleint's avatar