mainwindow.cpp 44.6 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
**************************************************************************/
con's avatar
con committed
29 30

#include "mainwindow.h"
31
#include "actioncontainer.h"
32
#include "command.h"
33
#include "actionmanager_p.h"
con's avatar
con committed
34 35 36 37 38 39
#include "coreimpl.h"
#include "coreconstants.h"
#include "editormanager.h"
#include "fancytabwidget.h"
#include "filemanager.h"
#include "generalsettings.h"
kh1's avatar
kh1 committed
40
#include "helpmanager.h"
con's avatar
con committed
41 42 43 44 45 46 47
#include "ifilefactory.h"
#include "messagemanager.h"
#include "modemanager.h"
#include "mimedatabase.h"
#include "newdialog.h"
#include "outputpane.h"
#include "plugindialog.h"
48
#include "progressmanager_p.h"
con's avatar
con committed
49 50 51
#include "progressview.h"
#include "shortcutsettings.h"
#include "vcsmanager.h"
hjk's avatar
hjk committed
52

53
#include "scriptmanager_p.h"
con's avatar
con committed
54 55 56
#include "settingsdialog.h"
#include "variablemanager.h"
#include "versiondialog.h"
con's avatar
con committed
57
#include "statusbarmanager.h"
con's avatar
con committed
58 59 60 61 62
#include "uniqueidmanager.h"
#include "manhattanstyle.h"
#include "navigationwidget.h"
#include "rightpane.h"
#include "editormanager/ieditorfactory.h"
63
#include "statusbarwidget.h"
con's avatar
con committed
64
#include "basefilewizard.h"
65
#include "ioutputpane.h"
66
#include "editormanager/systemeditor.h"
con's avatar
con committed
67 68

#include <coreplugin/findplaceholder.h>
69
#include <coreplugin/icorelistener.h>
70
#include <coreplugin/settingsdatabase.h>
71
#include <utils/pathchooser.h>
72
#include <utils/stylehelper.h>
73
#include <extensionsystem/pluginmanager.h>
con's avatar
con committed
74 75

#include <QtCore/QDebug>
76
#include <QtCore/QFileInfo>
con's avatar
con committed
77 78
#include <QtCore/QSettings>
#include <QtCore/QTimer>
79
#include <QtCore/QtPlugin>
80
#include <QtCore/QUrl>
con's avatar
con committed
81 82 83

#include <QtGui/QApplication>
#include <QtGui/QCloseEvent>
84 85
#include <QtGui/QMenu>
#include <QtGui/QPixmap>
con's avatar
con committed
86
#include <QtGui/QPrinter>
87
#include <QtGui/QShortcut>
con's avatar
con committed
88
#include <QtGui/QStatusBar>
89
#include <QtGui/QWizard>
90
#include <QtGui/QToolButton>
91
#include <QtGui/QMessageBox>
92
#include <QtGui/QMenuBar>
con's avatar
con committed
93 94 95 96 97 98

/*
#ifdef Q_OS_UNIX
#include <signal.h>
extern "C" void handleSigInt(int sig)
{
99
    Q_UNUSED(sig)
100
    Core::ICore::instance()->exit();
con's avatar
con committed
101 102 103 104 105 106 107 108
    qDebug() << "SIGINT caught. Shutting down.";
}
#endif
*/

using namespace Core;
using namespace Core::Internal;

109
enum { debugMainWindow = 0 };
con's avatar
con committed
110 111

MainWindow::MainWindow() :
112
    EventFilteringMainWindow(),
con's avatar
con committed
113 114 115 116
    m_coreImpl(new CoreImpl(this)),
    m_uniqueIDManager(new UniqueIDManager()),
    m_globalContext(QList<int>() << Constants::C_GLOBAL_ID),
    m_additionalContexts(m_globalContext),
117
    // keep this in sync with main() in app/main.cpp
118 119
    m_settings(new QSettings(QSettings::IniFormat, QSettings::UserScope,
                             QLatin1String("Nokia"), QLatin1String("QtCreator"), this)),
120 121
    m_globalSettings(new QSettings(QSettings::IniFormat, QSettings::SystemScope,
                             QLatin1String("Nokia"), QLatin1String("QtCreator"), this)),
122 123 124
    m_settingsDatabase(new SettingsDatabase(QFileInfo(m_settings->fileName()).path(),
                                            QLatin1String("QtCreator"),
                                            this)),
con's avatar
con committed
125
    m_printer(0),
126
    m_actionManager(new ActionManagerPrivate(this)),
con's avatar
con committed
127
    m_editorManager(0),
hjk's avatar
hjk committed
128
    m_fileManager(new FileManager(this)),
129
    m_progressManager(new ProgressManagerPrivate()),
130
    m_scriptManager(new ScriptManagerPrivate(this)),
con's avatar
con committed
131
    m_variableManager(new VariableManager(this)),
132
    m_vcsManager(new VCSManager),
con's avatar
con committed
133
    m_statusBarManager(0),
con's avatar
con committed
134 135
    m_modeManager(0),
    m_mimeDatabase(new MimeDatabase),
kh1's avatar
kh1 committed
136
    m_helpManager(new HelpManager),
con's avatar
con committed
137 138
    m_navigationWidget(0),
    m_rightPaneWidget(0),
139
    m_versionDialog(0),
con's avatar
con committed
140 141 142
    m_activeContext(0),
    m_generalSettings(new GeneralSettings),
    m_shortcutSettings(new ShortcutSettings),
143
    m_systemEditor(new SystemEditor),
con's avatar
con committed
144 145 146 147 148 149 150 151
    m_focusToEditor(0),
    m_newAction(0),
    m_openAction(0),
    m_openWithAction(0),
    m_saveAllAction(0),
    m_exitAction(0),
    m_optionsAction(0),
    m_toggleSideBarAction(0),
hjk's avatar
hjk committed
152
    m_toggleFullScreenAction(0),
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
153
#ifdef Q_WS_MAC
con's avatar
con committed
154 155 156 157 158
    m_minimizeAction(0),
    m_zoomAction(0),
#endif
    m_toggleSideBarButton(new QToolButton)
{
159 160
    OutputPaneManager::create();

con's avatar
con committed
161
    setWindowTitle(tr("Qt Creator"));
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
162
#ifndef Q_WS_MAC
163
    qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
164
#endif
165 166 167 168 169
    QCoreApplication::setApplicationName(QLatin1String("QtCreator"));
    QCoreApplication::setApplicationVersion(QLatin1String(Core::Constants::IDE_VERSION_LONG));
    QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
    QSettings::setDefaultFormat(QSettings::IniFormat);
    QString baseName = qApp->style()->objectName();
con's avatar
con committed
170
#ifdef Q_WS_X11
171
    if (baseName == QLatin1String("windows")) {
172 173 174 175
        // Sometimes we get the standard windows 95 style as a fallback
        // e.g. if we are running on a KDE4 desktop
        QByteArray desktopEnvironment = qgetenv("DESKTOP_SESSION");
        if (desktopEnvironment == "kde")
176
            baseName = QLatin1String("plastique");
177
        else
178
            baseName = QLatin1String("cleanlooks");
179 180 181 182
    }
#endif
    qApp->setStyle(new ManhattanStyle(baseName));

con's avatar
con committed
183 184 185 186 187 188 189 190 191 192 193 194 195 196
    setDockNestingEnabled(true);

    setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
    setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);

    registerDefaultContainers();
    registerDefaultActions();

    m_navigationWidget = new NavigationWidget(m_toggleSideBarAction);
    m_rightPaneWidget = new RightPaneWidget();

    m_modeStack = new FancyTabWidget(this);
    m_modeManager = new ModeManager(this, m_modeStack);
    m_modeManager->addWidget(m_progressManager->progressView());
con's avatar
con committed
197
    m_statusBarManager = new StatusBarManager(this);
con's avatar
con committed
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
    m_messageManager = new MessageManager;
    m_editorManager = new EditorManager(m_coreImpl, this);
    m_editorManager->hide();
    setCentralWidget(m_modeStack);

    connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*,QWidget*)),
            this, SLOT(updateFocusWidget(QWidget*,QWidget*)));
    // Add a small Toolbutton for toggling the navigation widget
    statusBar()->insertPermanentWidget(0, m_toggleSideBarButton);

//    setUnifiedTitleAndToolBarOnMac(true);
#ifdef Q_OS_UNIX
     //signal(SIGINT, handleSigInt);
#endif

    statusBar()->setProperty("p_styled", true);
214
    setAcceptDrops(true);
con's avatar
con committed
215 216
}

217
void MainWindow::setSidebarVisible(bool visible)
con's avatar
con committed
218 219
{
    if (NavigationWidgetPlaceHolder::current()) {
220
        if (m_navigationWidget->isSuppressed() && visible) {
con's avatar
con committed
221 222 223
            m_navigationWidget->setShown(true);
            m_navigationWidget->setSuppressed(false);
        } else {
224
            m_navigationWidget->setShown(visible);
con's avatar
con committed
225 226 227 228 229 230
        }
    }
}

void MainWindow::setSuppressNavigationWidget(bool suppress)
{
hjk's avatar
hjk committed
231
    if (NavigationWidgetPlaceHolder::current())
con's avatar
con committed
232 233 234
        m_navigationWidget->setSuppressed(suppress);
}

235 236 237 238 239
void MainWindow::setOverrideColor(const QColor &color)
{
    m_overrideColor = color;
}

con's avatar
con committed
240 241 242
MainWindow::~MainWindow()
{
    hide();
243 244 245
    ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
    pm->removeObject(m_shortcutSettings);
    pm->removeObject(m_generalSettings);
246
    pm->removeObject(m_systemEditor);
con's avatar
con committed
247 248 249 250 251 252
    delete m_messageManager;
    m_messageManager = 0;
    delete m_shortcutSettings;
    m_shortcutSettings = 0;
    delete m_generalSettings;
    m_generalSettings = 0;
253 254
    delete m_systemEditor;
    m_systemEditor = 0;
con's avatar
con committed
255 256 257 258 259 260 261 262
    delete m_settings;
    m_settings = 0;
    delete m_printer;
    m_printer = 0;
    delete m_uniqueIDManager;
    m_uniqueIDManager = 0;
    delete m_vcsManager;
    m_vcsManager = 0;
con's avatar
con committed
263
    //we need to delete editormanager and statusbarmanager explicitly before the end of the destructor,
con's avatar
con committed
264 265 266
    //because they might trigger stuff that tries to access data from editorwindow, like removeContextWidget

    // All modes are now gone
267
    OutputPaneManager::destroy();
con's avatar
con committed
268

269
    // Now that the OutputPaneManager is gone, is a good time to delete the view
270
    pm->removeObject(m_outputView);
con's avatar
con committed
271 272 273 274
    delete m_outputView;

    delete m_editorManager;
    m_editorManager = 0;
con's avatar
con committed
275 276
    delete m_statusBarManager;
    m_statusBarManager = 0;
con's avatar
con committed
277 278
    delete m_progressManager;
    m_progressManager = 0;
279
    pm->removeObject(m_coreImpl);
con's avatar
con committed
280 281 282 283 284 285 286 287 288 289 290 291 292
    delete m_coreImpl;
    m_coreImpl = 0;

    delete m_rightPaneWidget;
    m_rightPaneWidget = 0;

    delete m_navigationWidget;
    m_navigationWidget = 0;

    delete m_modeManager;
    m_modeManager = 0;
    delete m_mimeDatabase;
    m_mimeDatabase = 0;
kh1's avatar
kh1 committed
293 294 295

    delete m_helpManager;
    m_helpManager = 0;
con's avatar
con committed
296 297
}

298
bool MainWindow::init(QString *errorMessage)
con's avatar
con committed
299
{
300
    Q_UNUSED(errorMessage)
301

302 303 304
    if (!mimeDatabase()->addMimeTypes(QLatin1String(":/core/editormanager/BinFiles.mimetypes.xml"), errorMessage))
        return false;

305 306
    ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
    pm->addObject(m_coreImpl);
con's avatar
con committed
307
    m_statusBarManager->init();
con's avatar
con committed
308 309
    m_modeManager->init();
    m_progressManager->init();
con's avatar
con committed
310

311 312
    pm->addObject(m_generalSettings);
    pm->addObject(m_shortcutSettings);
313 314
    pm->addObject(m_systemEditor);

con's avatar
con committed
315

316
    // Add widget to the bottom, we create the view here instead of inside the
Tobias Hunger's avatar
Tobias Hunger committed
317
    // OutputPaneManager, since the StatusBarManager needs to be initialized before
318
    m_outputView = new Core::StatusBarWidget;
319
    m_outputView->setWidget(OutputPaneManager::instance()->buttonsWidget());
320
    m_outputView->setPosition(Core::StatusBarWidget::Second);
321
    pm->addObject(m_outputView);
322
    m_messageManager->init();
con's avatar
con committed
323 324 325 326 327 328 329
    return true;
}

void MainWindow::extensionsInitialized()
{
    m_editorManager->init();

con's avatar
con committed
330
    m_statusBarManager->extensionsInitalized();
con's avatar
con committed
331

332
    OutputPaneManager::instance()->init();
con's avatar
con committed
333 334

    m_actionManager->initialize();
335
    m_vcsManager->extensionsInitialized();
con's avatar
con committed
336 337 338
    readSettings();
    updateContext();

339 340
    emit m_coreImpl->coreAboutToOpen();
    show();
con's avatar
con committed
341 342 343 344 345 346 347 348 349
    emit m_coreImpl->coreOpened();
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    emit m_coreImpl->saveSettingsRequested();

    // Save opened files
    bool cancelled;
350 351
    QList<IFile*> notSaved = fileManager()->saveModifiedFiles(fileManager()->modifiedFiles(), &cancelled);
    if (cancelled || !notSaved.isEmpty()) {
con's avatar
con committed
352 353 354 355 356
        event->ignore();
        return;
    }

    const QList<ICoreListener *> listeners =
357
        ExtensionSystem::PluginManager::instance()->getObjects<ICoreListener>();
con's avatar
con committed
358 359 360 361 362 363 364 365 366 367 368 369
    foreach (ICoreListener *listener, listeners) {
        if (!listener->coreAboutToClose()) {
            event->ignore();
            return;
        }
    }

    emit m_coreImpl->coreAboutToClose();
    writeSettings();
    event->accept();
}

370 371 372 373 374 375 376
// Check for desktop file manager file drop events

static bool isDesktopFileManagerDrop(const QMimeData *d, QStringList *files = 0)
{
    if (files)
        files->clear();
    // Extract dropped files from Mime data.
377
    if (!d->hasUrls())
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
        return false;
    const QList<QUrl> urls = d->urls();
    if (urls.empty())
        return false;
    // Try to find local files
    bool hasFiles = false;
    const QList<QUrl>::const_iterator cend = urls.constEnd();
    for (QList<QUrl>::const_iterator it = urls.constBegin(); it != cend; ++it) {
        const QString fileName = it->toLocalFile();
        if (!fileName.isEmpty()) {
            hasFiles = true;
            if (files) {
                files->push_back(fileName);
            } else {
                break; // No result list, sufficient for checking
            }
        }
    }
    return hasFiles;
}

void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if (isDesktopFileManagerDrop(event->mimeData())) {
        event->accept();
    } else {
        event->ignore();
    }
}

void MainWindow::dropEvent(QDropEvent *event)
{
    QStringList files;
    if (isDesktopFileManagerDrop(event->mimeData(), &files)) {
        event->accept();
        openFiles(files);
    } else {
        event->ignore();
    }
}

con's avatar
con committed
419 420 421 422 423 424 425 426 427 428 429 430
IContext *MainWindow::currentContextObject() const
{
    return m_activeContext;
}

QStatusBar *MainWindow::statusBar() const
{
    return m_modeStack->statusBar();
}

void MainWindow::registerDefaultContainers()
{
431
    ActionManagerPrivate *am = m_actionManager;
con's avatar
con committed
432

433
    ActionContainer *menubar = am->createMenuBar(Constants::MENU_BAR);
con's avatar
con committed
434 435 436 437 438 439 440 441 442 443 444

#ifndef Q_WS_MAC // System menu bar on Mac
    setMenuBar(menubar->menuBar());
#endif
    menubar->appendGroup(Constants::G_FILE);
    menubar->appendGroup(Constants::G_EDIT);
    menubar->appendGroup(Constants::G_VIEW);
    menubar->appendGroup(Constants::G_TOOLS);
    menubar->appendGroup(Constants::G_WINDOW);
    menubar->appendGroup(Constants::G_HELP);

445
    // File Menu
446
    ActionContainer *filemenu = am->createMenu(Constants::M_FILE);
con's avatar
con committed
447 448 449 450 451 452 453 454 455 456 457 458
    menubar->addMenu(filemenu, Constants::G_FILE);
    filemenu->menu()->setTitle(tr("&File"));
    filemenu->appendGroup(Constants::G_FILE_NEW);
    filemenu->appendGroup(Constants::G_FILE_OPEN);
    filemenu->appendGroup(Constants::G_FILE_PROJECT);
    filemenu->appendGroup(Constants::G_FILE_SAVE);
    filemenu->appendGroup(Constants::G_FILE_CLOSE);
    filemenu->appendGroup(Constants::G_FILE_PRINT);
    filemenu->appendGroup(Constants::G_FILE_OTHER);
    connect(filemenu->menu(), SIGNAL(aboutToShow()), this, SLOT(aboutToShowRecentFiles()));


459
    // Edit Menu
460
    ActionContainer *medit = am->createMenu(Constants::M_EDIT);
con's avatar
con committed
461 462 463 464 465
    menubar->addMenu(medit, Constants::G_EDIT);
    medit->menu()->setTitle(tr("&Edit"));
    medit->appendGroup(Constants::G_EDIT_UNDOREDO);
    medit->appendGroup(Constants::G_EDIT_COPYPASTE);
    medit->appendGroup(Constants::G_EDIT_SELECTALL);
466
    medit->appendGroup(Constants::G_EDIT_ADVANCED);
467
    medit->appendGroup(Constants::G_EDIT_FIND);
con's avatar
con committed
468 469
    medit->appendGroup(Constants::G_EDIT_OTHER);

470
    // Tools Menu
471
    ActionContainer *ac = am->createMenu(Constants::M_TOOLS);
con's avatar
con committed
472 473 474
    menubar->addMenu(ac, Constants::G_TOOLS);
    ac->menu()->setTitle(tr("&Tools"));

475
    // Window Menu
476
    ActionContainer *mwindow = am->createMenu(Constants::M_WINDOW);
con's avatar
con committed
477 478 479
    menubar->addMenu(mwindow, Constants::G_WINDOW);
    mwindow->menu()->setTitle(tr("&Window"));
    mwindow->appendGroup(Constants::G_WINDOW_SIZE);
480
    mwindow->appendGroup(Constants::G_WINDOW_VIEWS);
con's avatar
con committed
481 482 483 484 485
    mwindow->appendGroup(Constants::G_WINDOW_PANES);
    mwindow->appendGroup(Constants::G_WINDOW_SPLIT);
    mwindow->appendGroup(Constants::G_WINDOW_NAVIGATE);
    mwindow->appendGroup(Constants::G_WINDOW_OTHER);

486
    // Help Menu
con's avatar
con committed
487 488 489
    ac = am->createMenu(Constants::M_HELP);
    menubar->addMenu(ac, Constants::G_HELP);
    ac->menu()->setTitle(tr("&Help"));
490 491
    ac->appendGroup(Constants::G_HELP_HELP);
    ac->appendGroup(Constants::G_HELP_ABOUT);
con's avatar
con committed
492 493
}

494 495 496
static Command *createSeparator(ActionManager *am, QObject *parent,
                                const QString &name,
                                const QList<int> &context)
con's avatar
con committed
497 498 499
{
    QAction *tmpaction = new QAction(parent);
    tmpaction->setSeparator(true);
con's avatar
con committed
500
    Command *cmd = am->registerAction(tmpaction, name, context);
con's avatar
con committed
501 502 503 504 505
    return cmd;
}

void MainWindow::registerDefaultActions()
{
506
    ActionManagerPrivate *am = m_actionManager;
507 508 509 510 511
    ActionContainer *mfile = am->actionContainer(Constants::M_FILE);
    ActionContainer *medit = am->actionContainer(Constants::M_EDIT);
    ActionContainer *mtools = am->actionContainer(Constants::M_TOOLS);
    ActionContainer *mwindow = am->actionContainer(Constants::M_WINDOW);
    ActionContainer *mhelp = am->actionContainer(Constants::M_HELP);
con's avatar
con committed
512 513

    // File menu separators
con's avatar
con committed
514
    Command *cmd = createSeparator(am, this, QLatin1String("QtCreator.File.Sep.Save"), m_globalContext);
con's avatar
con committed
515 516 517
    mfile->addAction(cmd, Constants::G_FILE_SAVE);

    cmd =  createSeparator(am, this, QLatin1String("QtCreator.File.Sep.Print"), m_globalContext);
518
    QIcon icon = QIcon::fromTheme(QLatin1String("edit-cut"), QIcon(Constants::ICON_CUT));
con's avatar
con committed
519 520 521 522 523 524 525 526 527
    mfile->addAction(cmd, Constants::G_FILE_PRINT);

    cmd =  createSeparator(am, this, QLatin1String("QtCreator.File.Sep.Close"), m_globalContext);
    mfile->addAction(cmd, Constants::G_FILE_CLOSE);

    cmd = createSeparator(am, this, QLatin1String("QtCreator.File.Sep.Other"), m_globalContext);
    mfile->addAction(cmd, Constants::G_FILE_OTHER);

    // Edit menu separators
528
    cmd = createSeparator(am, this, QLatin1String("QtCreator.Edit.Sep.CopyPaste"), m_globalContext);
con's avatar
con committed
529 530 531 532 533 534 535 536
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);

    cmd = createSeparator(am, this, QLatin1String("QtCreator.Edit.Sep.SelectAll"), m_globalContext);
    medit->addAction(cmd, Constants::G_EDIT_SELECTALL);

    cmd = createSeparator(am, this, QLatin1String("QtCreator.Edit.Sep.Find"), m_globalContext);
    medit->addAction(cmd, Constants::G_EDIT_FIND);

537 538
    cmd = createSeparator(am, this, QLatin1String("QtCreator.Edit.Sep.Advanced"), m_globalContext);
    medit->addAction(cmd, Constants::G_EDIT_ADVANCED);
con's avatar
con committed
539

540
    // Tools menu separators
con's avatar
con committed
541 542 543
    cmd = createSeparator(am, this, QLatin1String("QtCreator.Tools.Sep.Options"), m_globalContext);
    mtools->addAction(cmd, Constants::G_DEFAULT_THREE);

544
    // Return to editor shortcut: Note this requires Qt to fix up
con's avatar
con committed
545 546 547 548 549 550
    // handling of shortcut overrides in menus, item views, combos....
    m_focusToEditor = new QShortcut(this);
    cmd = am->registerShortcut(m_focusToEditor, Constants::S_RETURNTOEDITOR, m_globalContext);
    cmd->setDefaultKeySequence(QKeySequence(Qt::Key_Escape));
    connect(m_focusToEditor, SIGNAL(activated()), this, SLOT(setFocusToEditor()));

551
    // New File Action
552 553
    icon = QIcon::fromTheme(QLatin1String("document-new"), QIcon(Constants::ICON_NEWFILE));
    m_newAction = new QAction(icon, tr("&New File or Project..."), this);
con's avatar
con committed
554 555 556 557 558
    cmd = am->registerAction(m_newAction, Constants::NEW, m_globalContext);
    cmd->setDefaultKeySequence(QKeySequence::New);
    mfile->addAction(cmd, Constants::G_FILE_NEW);
    connect(m_newAction, SIGNAL(triggered()), this, SLOT(newFile()));

559
    // Open Action
560 561
    icon = QIcon::fromTheme(QLatin1String("document-open"), QIcon(Constants::ICON_OPENFILE));
    m_openAction = new QAction(icon, tr("&Open File or Project..."), this);
con's avatar
con committed
562 563 564 565 566
    cmd = am->registerAction(m_openAction, Constants::OPEN, m_globalContext);
    cmd->setDefaultKeySequence(QKeySequence::Open);
    mfile->addAction(cmd, Constants::G_FILE_OPEN);
    connect(m_openAction, SIGNAL(triggered()), this, SLOT(openFile()));

567
    // Open With Action
568
    m_openWithAction = new QAction(tr("Open File &With..."), this);
con's avatar
con committed
569 570 571 572
    cmd = am->registerAction(m_openWithAction, Constants::OPEN_WITH, m_globalContext);
    mfile->addAction(cmd, Constants::G_FILE_OPEN);
    connect(m_openWithAction, SIGNAL(triggered()), this, SLOT(openFileWith()));

573
    // File->Recent Files Menu
574
    ActionContainer *ac = am->createMenu(Constants::M_FILE_RECENTFILES);
con's avatar
con committed
575
    mfile->addMenu(ac, Constants::G_FILE_OPEN);
576
    ac->menu()->setTitle(tr("Recent &Files"));
con's avatar
con committed
577

578
    // Save Action
579 580
    icon = QIcon::fromTheme(QLatin1String("document-save"), QIcon(Constants::ICON_SAVEFILE));
    QAction *tmpaction = new QAction(icon, tr("&Save"), this);
581
    cmd = am->registerAction(tmpaction, Constants::SAVE, m_globalContext);
con's avatar
con committed
582
    cmd->setDefaultKeySequence(QKeySequence::Save);
con's avatar
con committed
583
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
584 585 586
    cmd->setDefaultText(tr("&Save"));
    mfile->addAction(cmd, Constants::G_FILE_SAVE);

587
    // Save As Action
588 589
    icon = QIcon::fromTheme(QLatin1String("document-save-as"));
    tmpaction = new QAction(icon, tr("Save &As..."), this);
590
    cmd = am->registerAction(tmpaction, Constants::SAVEAS, m_globalContext);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
591
#ifdef Q_WS_MAC
con's avatar
con committed
592 593
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+S")));
#endif
con's avatar
con committed
594
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
595 596 597
    cmd->setDefaultText(tr("Save &As..."));
    mfile->addAction(cmd, Constants::G_FILE_SAVE);

598
    // SaveAll Action
con's avatar
con committed
599 600
    m_saveAllAction = new QAction(tr("Save A&ll"), this);
    cmd = am->registerAction(m_saveAllAction, Constants::SAVEALL, m_globalContext);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
601
#ifndef Q_WS_MAC
con's avatar
con committed
602 603 604 605 606
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+S")));
#endif
    mfile->addAction(cmd, Constants::G_FILE_SAVE);
    connect(m_saveAllAction, SIGNAL(triggered()), this, SLOT(saveAll()));

607
    // Print Action
608 609
    icon = QIcon::fromTheme(QLatin1String("document-print"));
    tmpaction = new QAction(icon, tr("&Print..."), this);
610
    cmd = am->registerAction(tmpaction, Constants::PRINT, m_globalContext);
611
    cmd->setDefaultKeySequence(QKeySequence::Print);
con's avatar
con committed
612 613
    mfile->addAction(cmd, Constants::G_FILE_PRINT);

614
    // Exit Action
615 616
    icon = QIcon::fromTheme(QLatin1String("application-exit"));
    m_exitAction = new QAction(icon, tr("E&xit"), this);
con's avatar
con committed
617 618 619 620 621
    cmd = am->registerAction(m_exitAction, Constants::EXIT, m_globalContext);
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Q")));
    mfile->addAction(cmd, Constants::G_FILE_OTHER);
    connect(m_exitAction, SIGNAL(triggered()), this, SLOT(exit()));

622
    // Undo Action
623 624
    icon = QIcon::fromTheme(QLatin1String("edit-undo"), QIcon(Constants::ICON_UNDO));
    tmpaction = new QAction(icon, tr("&Undo"), this);
625
    cmd = am->registerAction(tmpaction, Constants::UNDO, m_globalContext);
con's avatar
con committed
626
    cmd->setDefaultKeySequence(QKeySequence::Undo);
con's avatar
con committed
627
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
628 629
    cmd->setDefaultText(tr("&Undo"));
    medit->addAction(cmd, Constants::G_EDIT_UNDOREDO);
630
    tmpaction->setEnabled(false);
con's avatar
con committed
631

632
    // Redo Action
633 634
    icon = QIcon::fromTheme(QLatin1String("edit-redo"), QIcon(Constants::ICON_REDO));
    tmpaction = new QAction(icon, tr("&Redo"), this);
635
    cmd = am->registerAction(tmpaction, Constants::REDO, m_globalContext);
con's avatar
con committed
636
    cmd->setDefaultKeySequence(QKeySequence::Redo);
con's avatar
con committed
637
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
638 639
    cmd->setDefaultText(tr("&Redo"));
    medit->addAction(cmd, Constants::G_EDIT_UNDOREDO);
640
    tmpaction->setEnabled(false);
con's avatar
con committed
641

642
    // Cut Action
643 644
    icon = QIcon::fromTheme(QLatin1String("edit-cut"), QIcon(Constants::ICON_CUT));
    tmpaction = new QAction(icon, tr("Cu&t"), this);
645
    cmd = am->registerAction(tmpaction, Constants::CUT, m_globalContext);
con's avatar
con committed
646 647
    cmd->setDefaultKeySequence(QKeySequence::Cut);
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);
648
    tmpaction->setEnabled(false);
con's avatar
con committed
649

650
    // Copy Action
651 652
    icon = QIcon::fromTheme(QLatin1String("edit-copy"), QIcon(Constants::ICON_COPY));
    tmpaction = new QAction(icon, tr("&Copy"), this);
653
    cmd = am->registerAction(tmpaction, Constants::COPY, m_globalContext);
con's avatar
con committed
654 655
    cmd->setDefaultKeySequence(QKeySequence::Copy);
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);
656
    tmpaction->setEnabled(false);
con's avatar
con committed
657

658
    // Paste Action
659 660
    icon = QIcon::fromTheme(QLatin1String("edit-paste"), QIcon(Constants::ICON_PASTE));
    tmpaction = new QAction(icon, tr("&Paste"), this);
661
    cmd = am->registerAction(tmpaction, Constants::PASTE, m_globalContext);
con's avatar
con committed
662 663
    cmd->setDefaultKeySequence(QKeySequence::Paste);
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);
664
    tmpaction->setEnabled(false);
con's avatar
con committed
665

666
    // Select All
667 668
    icon = QIcon::fromTheme(QLatin1String("edit-select-all"));
    tmpaction = new QAction(icon, tr("&Select All"), this);
669
    cmd = am->registerAction(tmpaction, Constants::SELECTALL, m_globalContext);
con's avatar
con committed
670 671
    cmd->setDefaultKeySequence(QKeySequence::SelectAll);
    medit->addAction(cmd, Constants::G_EDIT_SELECTALL);
672
    tmpaction->setEnabled(false);
con's avatar
con committed
673

674
    // Goto Action
675 676
    icon = QIcon::fromTheme(QLatin1String("go-jump"));
    tmpaction = new QAction(icon, tr("&Go To Line..."), this);
677
    cmd = am->registerAction(tmpaction, Constants::GOTO, m_globalContext);
con's avatar
con committed
678 679
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+L")));
    medit->addAction(cmd, Constants::G_EDIT_OTHER);
680
    tmpaction->setEnabled(false);
con's avatar
con committed
681

682
    // Options Action
con's avatar
con committed
683 684
    m_optionsAction = new QAction(tr("&Options..."), this);
    cmd = am->registerAction(m_optionsAction, Constants::OPTIONS, m_globalContext);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
685
#ifdef Q_WS_MAC
con's avatar
con committed
686
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+,"));
con's avatar
con committed
687
    cmd->action()->setMenuRole(QAction::PreferencesRole);
con's avatar
con committed
688 689 690 691
#endif
    mtools->addAction(cmd, Constants::G_DEFAULT_THREE);
    connect(m_optionsAction, SIGNAL(triggered()), this, SLOT(showOptionsDialog()));

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
692
#ifdef Q_WS_MAC
693
    // Minimize Action
con's avatar
con committed
694 695 696 697 698 699
    m_minimizeAction = new QAction(tr("Minimize"), this);
    cmd = am->registerAction(m_minimizeAction, Constants::MINIMIZE_WINDOW, m_globalContext);
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+M"));
    mwindow->addAction(cmd, Constants::G_WINDOW_SIZE);
    connect(m_minimizeAction, SIGNAL(triggered()), this, SLOT(showMinimized()));

700
    // Zoom Action
con's avatar
con committed
701 702 703 704 705
    m_zoomAction = new QAction(tr("Zoom"), this);
    cmd = am->registerAction(m_zoomAction, Constants::ZOOM_WINDOW, m_globalContext);
    mwindow->addAction(cmd, Constants::G_WINDOW_SIZE);
    connect(m_zoomAction, SIGNAL(triggered()), this, SLOT(showMaximized()));

706
    // Window separator
con's avatar
con committed
707 708 709 710
    cmd = createSeparator(am, this, QLatin1String("QtCreator.Window.Sep.Size"), m_globalContext);
    mwindow->addAction(cmd, Constants::G_WINDOW_SIZE);
#endif

711
    // Show Sidebar Action
con's avatar
con committed
712
    m_toggleSideBarAction = new QAction(QIcon(Constants::ICON_TOGGLE_SIDEBAR),
713
                                        tr("Show Sidebar"), this);
714
    m_toggleSideBarAction->setCheckable(true);
con's avatar
con committed
715
    cmd = am->registerAction(m_toggleSideBarAction, Constants::TOGGLE_SIDEBAR, m_globalContext);
716
    cmd->setAttribute(Command::CA_UpdateText);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
717
#ifdef Q_WS_MAC
con's avatar
con committed
718 719 720 721
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+0"));
#else
    cmd->setDefaultKeySequence(QKeySequence("Alt+0"));
#endif
722
    connect(m_toggleSideBarAction, SIGNAL(triggered(bool)), this, SLOT(setSidebarVisible(bool)));
con's avatar
con committed
723
    m_toggleSideBarButton->setDefaultAction(cmd->action());
724
    mwindow->addAction(cmd, Constants::G_WINDOW_VIEWS);
con's avatar
con committed
725 726
    m_toggleSideBarAction->setEnabled(false);

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
727
#ifndef Q_WS_MAC
728 729
    // Full Screen Action
    m_toggleFullScreenAction = new QAction(tr("Full Screen"), this);
hjk's avatar
hjk committed
730
    m_toggleFullScreenAction->setCheckable(true);
731
    cmd = am->registerAction(m_toggleFullScreenAction, Constants::TOGGLE_FULLSCREEN, m_globalContext);
hjk's avatar
hjk committed
732
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+Shift+F11"));
733
    mwindow->addAction(cmd, Constants::G_WINDOW_SIZE);
734
    connect(m_toggleFullScreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool)));
735
#endif
hjk's avatar
hjk committed
736

737 738 739 740 741
    // Window->Views
    ActionContainer *mviews = am->createMenu(Constants::M_WINDOW_VIEWS);
    mwindow->addMenu(mviews, Constants::G_WINDOW_VIEWS);
    mviews->menu()->setTitle(tr("&Views"));

742
    // About IDE Action
743
    icon = QIcon::fromTheme(QLatin1String("help-about"));
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
744
#ifdef Q_WS_MAC
745
    tmpaction = new QAction(icon, tr("About &Qt Creator"), this); // it's convention not to add dots to the about menu
con's avatar
con committed
746
#else
747
    tmpaction = new QAction(icon, tr("About &Qt Creator..."), this);
con's avatar
con committed
748
#endif
749
    cmd = am->registerAction(tmpaction, Constants::ABOUT_QTCREATOR, m_globalContext);
con's avatar
con committed
750 751
    mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
    tmpaction->setEnabled(true);
con's avatar
con committed
752 753 754
#ifdef Q_WS_MAC
    cmd->action()->setMenuRole(QAction::ApplicationSpecificRole);
#endif
con's avatar
con committed
755
    connect(tmpaction, SIGNAL(triggered()), this,  SLOT(aboutQtCreator()));
con's avatar
con committed
756

con's avatar
con committed
757 758 759 760 761
    //About Plugins Action
    tmpaction = new QAction(tr("About &Plugins..."), this);
    cmd = am->registerAction(tmpaction, Constants::ABOUT_PLUGINS, m_globalContext);
    mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
    tmpaction->setEnabled(true);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
762
#ifdef Q_WS_MAC
con's avatar
con committed
763 764 765
    cmd->action()->setMenuRole(QAction::ApplicationSpecificRole);
#endif
    connect(tmpaction, SIGNAL(triggered()), this,  SLOT(aboutPlugins()));
766
    // About Qt Action
con's avatar
con committed
767 768 769 770 771 772
//    tmpaction = new QAction(tr("About &Qt..."), this);
//    cmd = am->registerAction(tmpaction, Constants:: ABOUT_QT, m_globalContext);
//    mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
//    tmpaction->setEnabled(true);
//    connect(tmpaction, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
    // About sep
con's avatar
con committed
773
#ifndef Q_WS_MAC // doesn't have the "About" actions in the Help menu
con's avatar
con committed
774 775 776 777
    tmpaction = new QAction(this);
    tmpaction->setSeparator(true);
    cmd = am->registerAction(tmpaction, QLatin1String("QtCreator.Help.Sep.About"), m_globalContext);
    mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
con's avatar
con committed
778
#endif
con's avatar
con committed
779 780 781 782
}

void MainWindow::newFile()
{
783
    showNewItemDialog(tr("New", "Title of dialog"), IWizard::allWizards(), QString());
con's avatar
con committed
784 785 786 787 788 789 790 791 792
}

void MainWindow::openFile()
{
    openFiles(editorManager()->getOpenFileNames());
}

static QList<IFileFactory*> getNonEditorFileFactories()
{
793 794
    const QList<IFileFactory*> allFileFactories =
        ExtensionSystem::PluginManager::instance()->getObjects<IFileFactory>();
con's avatar
con committed
795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
    QList<IFileFactory*> nonEditorFileFactories;
    foreach (IFileFactory *factory, allFileFactories) {
        if (!qobject_cast<IEditorFactory *>(factory))
            nonEditorFileFactories.append(factory);
    }
    return nonEditorFileFactories;
}

static IFileFactory *findFileFactory(const QList<IFileFactory*> &fileFactories,
                                     const MimeDatabase *db,
                                     const QFileInfo &fi)
{
    if (const MimeType mt = db->findByFile(fi)) {
        const QString type = mt.type();
        foreach (IFileFactory *factory, fileFactories) {
            if (factory->mimeTypes().contains(type))
                return factory;
        }
    }
    return 0;
}

// opens either an editor or loads a project
void MainWindow::openFiles(const QStringList &fileNames)
{
    QList<IFileFactory*> nonEditorFileFactories = getNonEditorFileFactories();

    foreach (const QString &fileName, fileNames) {
        const QFileInfo fi(fileName);
        const QString absoluteFilePath = fi.absoluteFilePath();
        if (IFileFactory *fileFactory = findFileFactory(nonEditorFileFactories, mimeDatabase(), fi)) {
            fileFactory->open(absoluteFilePath);
        } else {
Lasse Holmstedt's avatar
Lasse Holmstedt committed
828
            editorManager()->openEditor(absoluteFilePath);
con's avatar
con committed
829 830 831 832 833 834
        }
    }
}

void MainWindow::setFocusToEditor()
{
mae's avatar
mae committed
835
    bool focusWasMovedToEditor = false;
con's avatar
con committed
836

mae's avatar
mae committed
837 838 839
    // give focus to the editor if we have one
    if (IEditor *editor = m_editorManager->currentEditor()) {
        if (qApp->focusWidget() != editor->widget()) {
840
            editor->widget()->setFocus();
mae's avatar
mae committed
841
            focusWasMovedToEditor = editor->widget()->hasFocus();
842
        }
con's avatar
con committed
843
    }
mae's avatar
mae committed
844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875

    // check for some maximized pane which we want to unmaximize
    if (OutputPanePlaceHolder::getCurrent()
        && OutputPanePlaceHolder::getCurrent()->isVisible()
        && OutputPanePlaceHolder::getCurrent()->isMaximized()) {
        OutputPanePlaceHolder::getCurrent()->unmaximize();
        return;
    }

    if (focusWasMovedToEditor)
        return;


    // check for some visible bar which we want to hide
    bool stuffVisible =
            (FindToolBarPlaceHolder::getCurrent() &&
             FindToolBarPlaceHolder::getCurrent()->isVisible())
            || (OutputPanePlaceHolder::getCurrent() &&
                OutputPanePlaceHolder::getCurrent()->isVisible())
            || (RightPanePlaceHolder::current() &&
                RightPanePlaceHolder::current()->isVisible());
    if (stuffVisible) {
        if (FindToolBarPlaceHolder::getCurrent())
            FindToolBarPlaceHolder::getCurrent()->hide();
        OutputPaneManager::instance()->slotHide();
        RightPaneWidget::instance()->setShown(false);
        return;
    }

    // switch to edit mode if necessary
    m_coreImpl->modeManager()->activateMode(QLatin1String(Constants::MODE_EDIT));

con's avatar
con committed
876 877 878 879
}

QStringList MainWindow::showNewItemDialog(const QString &title,
                                          const QList<IWizard *> &wizards,
880
                                          const QString &defaultLocation)
con's avatar
con committed
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
{
    // Scan for wizards matching the filter and pick one. Don't show
    // dialog if there is only one.
    IWizard *wizard = 0;
    switch (wizards.size()) {
    case 0:
        break;
    case 1:
        wizard = wizards.front();
        break;
    default: {
        NewDialog dlg(this);
        dlg.setWizards(wizards);
        dlg.setWindowTitle(title);
        wizard = dlg.showDialog();
    }
        break;
    }

    if (!wizard)
        return QStringList();
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920

    QString path = defaultLocation;
    if (path.isEmpty()) {
        const FileManager *fm = m_coreImpl->fileManager();
        switch (wizard->kind()) {
        case IWizard::ProjectWizard:
            // Project wizards: Check for projects directory or
            // use last visited directory of file dialog. Never start
            // at current.
            path = fm->useProjectsDirectory() ?
                       fm->projectsDirectory() :
                       fm->fileDialogLastVisitedDirectory();
            break;
        default:
            path = fm->fileDialogInitialDirectory();
            break;
        }
    }
    return wizard->runWizard(path, this);
con's avatar
con committed
921 922
}

923 924 925
bool MainWindow::showOptionsDialog(const QString &category,
                                   const QString &page,
                                   QWidget *parent)
con's avatar
con committed
926
{
con's avatar
con committed
927
    emit m_coreImpl->optionsDialogRequested();
928 929 930 931
    if (!parent)
        parent = this;
    SettingsDialog dlg(parent, category, page);
    return dlg.execDialog();
con's avatar
con committed
932 933 934 935
}

void MainWindow::saveAll()
{
con's avatar
con committed
936
    m_fileManager->saveModifiedFilesSilently(m_fileManager->modifiedFiles());
con's avatar
con committed
937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
    emit m_coreImpl->saveSettingsRequested();
}

void MainWindow::exit()
{
    // this function is most likely called from a user action
    // that is from an event handler of an object
    // since on close we are going to delete everything
    // so to prevent the deleting of that object we
    // just append it
    QTimer::singleShot(0, this,  SLOT(close()));
}

void MainWindow::openFileWith()
{
    QStringList fileNames = editorManager()->getOpenFileNames();
    foreach (const QString &fileName, fileNames) {
954
        bool isExternal;
955 956
        const QString editorId = editorManager()->getOpenWithEditorId(fileName, &isExternal);
        if (editorId.isEmpty())
con's avatar
con committed
957
            continue;
958
        if (isExternal) {
959
            editorManager()->openExternalEditor(fileName, editorId);
960
        } else {
961
            editorManager()->openEditor(fileName, editorId);
962
        }
con's avatar
con committed
963 964 965
    }
}

966
ActionManager *MainWindow::actionManager() const
con's avatar
con committed
967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990
{
    return m_actionManager;
}

FileManager *MainWindow::fileManager() const
{
    return m_fileManager;
}

UniqueIDManager *MainWindow::uniqueIDManager() const
{
    return m_uniqueIDManager;
}

MessageManager *MainWindow::messageManager() const
{
    return m_messageManager;
}

VCSManager *MainWindow::vcsManager() const
{
    return m_vcsManager;
}

991 992 993 994 995 996 997 998
QSettings *MainWindow::settings(QSettings::Scope scope) const
{
    if (scope == QSettings::UserScope)
        return m_settings;
    else
        return m_globalSettings;
}

con's avatar
con committed
999 1000 1001 1002 1003
EditorManager *MainWindow::editorManager() const
{
    return m_editorManager;
}

1004
ProgressManager *MainWindow::progressManager() const
con's avatar
con committed
1005 1006 1007 1008
{
    return m_progressManager;
}

1009
ScriptManager *MainWindow::scriptManager() const
con's avatar
con committed
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 102