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

    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;
193
    RunConfiguration *m_delayedRunConfiguration; // TODO this is not right
194
195
    QString m_runMode;
    QString m_projectFilterString;
196
    Internal::MiniProjectTargetSelector * m_targetSelector;
197
    Internal::ProjectExplorerSettings m_projectExplorerSettings;
198
    Internal::ProjectWelcomePage *m_welcomePage;
199
200

    Core::BaseMode * m_projectsMode;
201
202
203
204
205
206
};

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

}  // namespace ProjectExplorer

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


ProjectExplorerPlugin *ProjectExplorerPlugin::m_instance = 0;

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

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

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

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

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

    addAutoReleasedObject(new TaskHub);
251

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

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

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

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

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

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

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

281
282
283
284
285
286
    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);
287
    d->m_projectsMode->setContext(pecontext);
288
    d->m_projectsMode->setEnabled(session()->startupProject());
Daniel Molkentin's avatar
Daniel Molkentin committed
289
    d->m_projectsMode->setContextHelpId(QLatin1String("Managing Projects"));
290
    addAutoReleasedObject(d->m_projectsMode);
291
    d->m_proWindow->layout()->addWidget(new Core::FindToolBarPlaceHolder(d->m_proWindow));
con's avatar
con committed
292

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

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

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

305
306
307
308
    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
309

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

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

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

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

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

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

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

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

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

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

352
353
354
355
356
    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
357

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

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

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

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

378
379
380
381
    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
382
383
384
385
386
387
388
389
390

    //
    // 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
391
    mbuild->appendGroup(Constants::G_BUILD_RUN);
con's avatar
con committed
392
393
394
395
396
397

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

398
    mproject->appendGroup(Constants::G_PROJECT_FIRST);
con's avatar
con committed
399
400
401
402
403
404
    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);

405
    msubProject->appendGroup(Constants::G_PROJECT_FIRST);
406
    msubProject->appendGroup(Constants::G_PROJECT_BUILD);
con's avatar
con committed
407
408
409
410
411
412
413
414
415
416
417
418
419
    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
420
    Core::ActionContainer * const openWith =
con's avatar
con committed
421
            am->createMenu(ProjectExplorer::Constants::M_OPENFILEWITHCONTEXT);
422
    openWith->setEmptyAction(Core::ActionContainer::EA_None);
423
424
    d->m_openWithMenu = openWith->menu();
    d->m_openWithMenu->setTitle(tr("Open With"));
con's avatar
con committed
425

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

    //
    // Separators
    //

con's avatar
con committed
433
    Core::Command *cmd;
con's avatar
con committed
434
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
    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
484
485
    d->m_sessionManagerAction = new QAction(tr("Session Manager..."), this);
    cmd = am->registerAction(d->m_sessionManagerAction, Constants::NEWSESSION, globalcontext);
con's avatar
con committed
486
487
488
    cmd->setDefaultKeySequence(QKeySequence());

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

#if 0
    // 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
502
503
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+O")));
    mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_FILES);
#endif

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

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

515
    d->m_openTerminalHere = new QAction(FolderNavigationWidget::msgTerminalAction(), this);
516
517
518
519
520
    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
521
522
523
    // Open With menu
    mfilec->addMenu(openWith, ProjectExplorer::Constants::G_FILE_OPEN);

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

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

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

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

    // build session action
    QIcon buildIcon(Constants::ICON_BUILD);
    buildIcon.addFile(Constants::ICON_BUILD_SMALL);
558
559
    d->m_buildSessionAction = new QAction(buildIcon, tr("Build All"), this);
    cmd = am->registerAction(d->m_buildSessionAction, Constants::BUILDSESSION, globalcontext);
con's avatar
con committed
560
561
562
563
    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
564
    modeManager->addAction(cmd, Constants::P_ACTION_BUILDSESSION);
con's avatar
con committed
565
566
567
568

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

Tobias Hunger's avatar
Tobias Hunger committed
574
575
576
577
578
579
    // 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
580
581
582
    // clean session
    QIcon cleanIcon(Constants::ICON_CLEAN);
    cleanIcon.addFile(Constants::ICON_CLEAN_SMALL);
583
584
    d->m_cleanSessionAction = new QAction(cleanIcon, tr("Clean All"), this);
    cmd = am->registerAction(d->m_cleanSessionAction, Constants::CLEANSESSION, globalcontext);
con's avatar
con committed
585
586
587
588
    mbuild->addAction(cmd, Constants::G_BUILD_SESSION);
    msessionContextMenu->addAction(cmd, Constants::G_SESSION_BUILD);

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

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

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

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

645
646
647
648
649
650
    // 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
651
652
    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);

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

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

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

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

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

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

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

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

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

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

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

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

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

724
725
726
727
728
729
    // 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
730
    // delete file action
731
732
733
734
735
    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
736
    // renamefile action
737
738
    d->m_renameFileAction = new QAction(tr("Rename"), this);
    cmd = am->registerAction(d->m_renameFileAction, ProjectExplorer::Constants::RENAMEFILE,
con's avatar
con committed
739
740
                       globalcontext);
    mfilec->addAction(cmd, Constants::G_FILE_OTHER);
dt's avatar
dt committed
741
742
743
744
    // 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
745

746
747
748
749
750
751
    // 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);

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

    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
766
767
                       globalcontext);
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+T")));
768
    mbuild->addAction(cmd, Constants::G_BUILD_RUN);
769
770
771
772
773
774
775
776
777
778

    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*)));

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

hjk's avatar
hjk committed
782
783
    addAutoReleasedObject(new ProjectTreeWidgetFactory);
    addAutoReleasedObject(new FolderNavigationWidgetFactory);
con's avatar
con committed
784

785
786
787
788
789
    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) {
790
                if (QFileInfo(fileNames.at(i)).isFile())
791
                    d->m_recentProjects.append(qMakePair(fileNames.at(i), displayNames.at(i)));
792
793
794
795
            }
        }
    }

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

808
809
    connect(d->m_sessionManagerAction, SIGNAL(triggered()), this, SLOT(showSessionManager()));
    connect(d->m_newAction, SIGNAL(triggered()), this, SLOT(newProject()));
con's avatar
con committed
810
#if 0
811
    connect(d->m_loadAction, SIGNAL(triggered()), this, SLOT(loadAction()));
con's avatar
con committed
812
#endif
813
814
    connect(d->m_buildProjectOnlyAction, SIGNAL(triggered()), this, SLOT(buildProjectOnly()));
    connect(d->m_buildAction, SIGNAL(triggered()), this, SLOT(buildProject()));
815
    connect(d->m_buildActionContextMenu, SIGNAL(triggered()), this, SLOT(buildProjectContextMenu()));
816
817
818
    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()));
819
    connect(d->m_rebuildActionContextMenu, SIGNAL(triggered()), this, SLOT(rebuildProjectContextMenu()));
820
    connect(d->m_rebuildSessionAction, SIGNAL(triggered()), this, SLOT(rebuildSession()));
Tobias Hunger's avatar
Tobias Hunger committed
821
822
823
824
    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()));
825
826
    connect(d->m_cleanProjectOnlyAction, SIGNAL(triggered()), this, SLOT(cleanProjectOnly()));
    connect(d->m_cleanAction, SIGNAL(triggered()), this, SLOT(cleanProject()));
827
    connect(d->m_cleanActionContextMenu, SIGNAL(triggered()), this, SLOT(cleanProjectContextMenu()));
828
829
830
831
832
833
834
835
836
    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()));
837
    connect(d->m_removeProjectAction, SIGNAL(triggered()), this, SLOT(removeProject()));
838
839
    connect(d->m_openFileAction, SIGNAL(triggered()), this, SLOT(openFile()));
    connect(d->m_showInGraphicalShell, SIGNAL(triggered()), this, SLOT(showInGraphicalShell()));
840
    connect(d->m_openTerminalHere, SIGNAL(triggered()), this, SLOT(openTerminalHere()));
841
    connect(d->m_removeFileAction, SIGNAL(triggered()), this, SLOT(removeFile()));
842
    connect(d->m_deleteFileAction, SIGNAL(triggered()), this, SLOT(deleteFile()));
843
    connect(d->m_renameFileAction, SIGNAL(triggered()), this, SLOT(renameFile()));
844
    connect(d->m_setStartupProjectAction, SIGNAL(triggered()), this, SLOT(setStartupProject()));
con's avatar
con committed
845
846
847

    updateActions();

848
849
    connect(Core::ICore::instance(), SIGNAL(coreAboutToOpen()),
            this, SLOT(determineSessionToRestoreAtStartup()));
850
    connect(Core::ICore::instance(), SIGNAL(coreOpened()), this, SLOT(restoreSession()));
con's avatar
con committed
851

852
853
    updateWelcomePage();

con's avatar
con committed
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
    return true;
}

// Find a factory by file mime type in a sequence of factories
template <class Factory, class Iterator>
    Factory *findFactory(const QString &mimeType, Iterator i1, Iterator i2)
{
    for ( ; i1 != i2; ++i2) {
        Factory *f = *i1;
        if (f->mimeTypes().contains(mimeType))
            return f;
    }
    return 0;
}

ProjectFileFactory * ProjectExplorerPlugin::findProjectFileFactory(const QString &filename) const
{
    // Find factory
872
    if (const Core::MimeType mt = Core::ICore::instance()->mimeDatabase()->findByFile(QFileInfo(filename)))
873
        if (ProjectFileFactory *pf = findFactory<ProjectFileFactory>(mt.type(), d->m_fileFactories.constBegin(), d->m_fileFactories.constEnd()))
con's avatar
con committed
874
875
876
877
878
879
880
881
882
883
884
            return pf;
    qWarning("Unable to find project file factory for '%s'", filename.toUtf8().constData());
    return 0;
}

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


885
    QString dir = d->m_lastOpenDirectory;
con's avatar
con committed
886
887
888
889
890
891

    // 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();
892
            const bool isProject = d->m_profileMimeTypes.contains(file->mimeType());
con's avatar
con committed
893
894
895
896
897
898
            dir = isProject ? fn : QFileInfo(fn).absolutePath();
        }
    }

    QString filename = QFileDialog::getOpenFileName(0, tr("Load Project"),
                                                    dir,
899
                                                    d->m_projectFilterString);
con's avatar
con committed
900
901
902
903
904
905
906
    if (filename.isEmpty())
        return;
    if (ProjectFileFactory *pf = findProjectFileFactory(filename))
        pf->open(filename);
    updateActions();
}

907
void ProjectExplorerPlugin::unloadProject()
con's avatar
con committed
908
909
{
    if (debug)
910
        qDebug() << "ProjectExplorerPlugin::unloadProject";
con's avatar
con committed
911

912
    Core::IFile *fi = d->m_currentProject->file();
con's avatar
con committed
913
914

    if (!fi || fi->fileName().isEmpty()) //nothing to save?
915
        return;
con's avatar
con committed
916
917
918
919
920
921
922
923
924
925
926
927
928

    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)
929
        success = Core::ICore::instance()->fileManager()->saveModifiedFiles(filesToSave).isEmpty();
con's avatar
con committed
930
    else
931
        success = Core::ICore::instance()->fileManager()->saveModifiedFilesSilently(filesToSave).isEmpty();
con's avatar
con committed
932

933
    if (!success)
con's avatar
con committed
934
935
        return;

936
    addToRecentProjects(fi->fileName(), d->m_currentProject->displayName());
937
    d->m_session->removeProject(d->m_currentProject);
con's avatar
con committed
938
939
940
941
942
943
944
945
    updateActions();
}

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

946
    if (!d->m_session->clear())
con's avatar
con committed
947
948
949
950
951
952
        return; // Action has been cancelled
    updateActions();
}

void ProjectExplorerPlugin::extensionsInitialized()
{
953
954
955
    d->m_fileFactories = ProjectFileFactory::createFactories(&d->m_projectFilterString);
    foreach (ProjectFileFactory *pf, d->m_fileFactories) {
        d->m_profileMimeTypes += pf->mimeTypes();
con's avatar
con committed
956
957
        addAutoReleasedObject(pf);
    }