mainwindow.cpp 41.7 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2 3 4
**
** This file is part of Qt Creator
**
5
** Copyright (c) 2009 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 "actionmanager_p.h"
con's avatar
con committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46
#include "basemode.h"
#include "coreimpl.h"
#include "coreconstants.h"
#include "editormanager.h"
#include "fancytabwidget.h"
#include "filemanager.h"
#include "generalsettings.h"
#include "ifilefactory.h"
#include "messagemanager.h"
#include "modemanager.h"
#include "mimedatabase.h"
#include "newdialog.h"
#include "outputpane.h"
#include "plugindialog.h"
47
#include "progressmanager_p.h"
con's avatar
con committed
48 49 50
#include "progressview.h"
#include "shortcutsettings.h"
#include "vcsmanager.h"
hjk's avatar
hjk committed
51

52
#include "scriptmanager_p.h"
con's avatar
con committed
53 54 55
#include "settingsdialog.h"
#include "variablemanager.h"
#include "versiondialog.h"
con's avatar
con committed
56
#include "statusbarmanager.h"
con's avatar
con committed
57 58 59 60 61 62
#include "uniqueidmanager.h"
#include "manhattanstyle.h"
#include "dialogs/iwizard.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"
con's avatar
con committed
66 67

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

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

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

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

using namespace Core;
using namespace Core::Internal;

107
static const char *uriListMimeFormatC = "text/uri-list";
con's avatar
con committed
108

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 118 119 120 121
    m_settings(new QSettings(QSettings::IniFormat, QSettings::UserScope,
                             QLatin1String("Nokia"), QLatin1String("QtCreator"), this)),
    m_settingsDatabase(new SettingsDatabase(QFileInfo(m_settings->fileName()).path(),
                                            QLatin1String("QtCreator"),
                                            this)),
con's avatar
con committed
122
    m_printer(0),
123
    m_actionManager(new ActionManagerPrivate(this)),
con's avatar
con committed
124
    m_editorManager(0),
hjk's avatar
hjk committed
125
    m_fileManager(new FileManager(this)),
126
    m_progressManager(new ProgressManagerPrivate()),
127
    m_scriptManager(new ScriptManagerPrivate(this)),
con's avatar
con committed
128
    m_variableManager(new VariableManager(this)),
129
    m_vcsManager(new VCSManager),
con's avatar
con committed
130
    m_statusBarManager(0),
con's avatar
con committed
131 132 133 134
    m_modeManager(0),
    m_mimeDatabase(new MimeDatabase),
    m_navigationWidget(0),
    m_rightPaneWidget(0),
135
    m_versionDialog(0),
con's avatar
con committed
136 137 138 139 140 141 142 143 144 145 146
    m_activeContext(0),
    m_generalSettings(new GeneralSettings),
    m_shortcutSettings(new ShortcutSettings),
    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
147
    m_toggleFullScreenAction(0),
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
148
#ifdef Q_WS_MAC
con's avatar
con committed
149 150 151 152 153
    m_minimizeAction(0),
    m_zoomAction(0),
#endif
    m_toggleSideBarButton(new QToolButton)
{
154 155
    OutputPaneManager::create();

con's avatar
con committed
156
    setWindowTitle(tr("Qt Creator"));
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
157
#ifndef Q_WS_MAC
158
    qApp->setWindowIcon(QIcon(":/core/images/qtcreator_logo_128.png"));
159
#endif
160 161 162 163 164
    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
165
#ifdef Q_WS_X11
166
    if (baseName == QLatin1String("windows")) {
167 168 169 170
        // 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")
171
            baseName = QLatin1String("plastique");
172
        else
173
            baseName = QLatin1String("cleanlooks");
174 175 176 177
    }
#endif
    qApp->setStyle(new ManhattanStyle(baseName));

con's avatar
con committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191
    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
192
    m_statusBarManager = new StatusBarManager(this);
con's avatar
con committed
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
    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);
209
    setAcceptDrops(true);
con's avatar
con committed
210 211
}

212
void MainWindow::setSidebarVisible(bool visible)
con's avatar
con committed
213 214
{
    if (NavigationWidgetPlaceHolder::current()) {
215
        if (m_navigationWidget->isSuppressed() && visible) {
con's avatar
con committed
216 217 218
            m_navigationWidget->setShown(true);
            m_navigationWidget->setSuppressed(false);
        } else {
219
            m_navigationWidget->setShown(visible);
con's avatar
con committed
220 221 222 223 224 225
        }
    }
}

void MainWindow::setSuppressNavigationWidget(bool suppress)
{
hjk's avatar
hjk committed
226
    if (NavigationWidgetPlaceHolder::current())
con's avatar
con committed
227 228 229
        m_navigationWidget->setSuppressed(suppress);
}

230 231 232 233 234
void MainWindow::setOverrideColor(const QColor &color)
{
    m_overrideColor = color;
}

con's avatar
con committed
235 236 237
MainWindow::~MainWindow()
{
    hide();
238 239 240
    ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
    pm->removeObject(m_shortcutSettings);
    pm->removeObject(m_generalSettings);
con's avatar
con committed
241 242 243 244 245 246 247 248 249 250 251 252 253 254
    delete m_messageManager;
    m_messageManager = 0;
    delete m_shortcutSettings;
    m_shortcutSettings = 0;
    delete m_generalSettings;
    m_generalSettings = 0;
    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
255
    //we need to delete editormanager and statusbarmanager explicitly before the end of the destructor,
con's avatar
con committed
256 257 258
    //because they might trigger stuff that tries to access data from editorwindow, like removeContextWidget

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

261
    // Now that the OutputPaneManager is gone, is a good time to delete the view
262
    pm->removeObject(m_outputView);
con's avatar
con committed
263 264 265 266
    delete m_outputView;

    delete m_editorManager;
    m_editorManager = 0;
con's avatar
con committed
267 268
    delete m_statusBarManager;
    m_statusBarManager = 0;
con's avatar
con committed
269 270
    delete m_progressManager;
    m_progressManager = 0;
271
    pm->removeObject(m_coreImpl);
con's avatar
con committed
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
    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;
}

287
bool MainWindow::init(QString *errorMessage)
con's avatar
con committed
288
{
289
    Q_UNUSED(errorMessage)
290 291 292

    ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
    pm->addObject(m_coreImpl);
con's avatar
con committed
293
    m_statusBarManager->init();
con's avatar
con committed
294 295
    m_modeManager->init();
    m_progressManager->init();
con's avatar
con committed
296

297 298
    pm->addObject(m_generalSettings);
    pm->addObject(m_shortcutSettings);
con's avatar
con committed
299

300
    // Add widget to the bottom, we create the view here instead of inside the
con's avatar
con committed
301
    // OutputPaneManager, since the StatusBarManager needs to be initilized before
302
    m_outputView = new Core::StatusBarWidget;
303
    m_outputView->setWidget(OutputPaneManager::instance()->buttonsWidget());
304
    m_outputView->setPosition(Core::StatusBarWidget::Second);
305
    pm->addObject(m_outputView);
con's avatar
con committed
306 307 308 309 310 311 312
    return true;
}

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

con's avatar
con committed
313
    m_statusBarManager->extensionsInitalized();
con's avatar
con committed
314

315
    m_messageManager->init();
316
    OutputPaneManager::instance()->init();
con's avatar
con committed
317 318

    m_actionManager->initialize();
319
    m_vcsManager->extensionsInitialized();
con's avatar
con committed
320 321 322
    readSettings();
    updateContext();

323 324
    emit m_coreImpl->coreAboutToOpen();
    show();
con's avatar
con committed
325 326 327 328 329 330 331 332 333
    emit m_coreImpl->coreOpened();
}

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

    // Save opened files
    bool cancelled;
334 335
    QList<IFile*> notSaved = fileManager()->saveModifiedFiles(fileManager()->modifiedFiles(), &cancelled);
    if (cancelled || !notSaved.isEmpty()) {
con's avatar
con committed
336 337 338 339 340
        event->ignore();
        return;
    }

    const QList<ICoreListener *> listeners =
341
        ExtensionSystem::PluginManager::instance()->getObjects<ICoreListener>();
con's avatar
con committed
342 343 344 345 346 347 348 349 350 351 352 353
    foreach (ICoreListener *listener, listeners) {
        if (!listener->coreAboutToClose()) {
            event->ignore();
            return;
        }
    }

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

354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 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
// 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.
    if (!d->hasFormat(QLatin1String(uriListMimeFormatC)))
        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
403 404 405 406 407 408 409 410 411 412 413 414
IContext *MainWindow::currentContextObject() const
{
    return m_activeContext;
}

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

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

417
    ActionContainer *menubar = am->createMenuBar(Constants::MENU_BAR);
con's avatar
con committed
418 419 420 421 422 423 424 425 426 427 428

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

429
    // File Menu
430
    ActionContainer *filemenu = am->createMenu(Constants::M_FILE);
con's avatar
con committed
431 432 433 434 435 436 437 438 439 440 441 442
    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()));


443
    // Edit Menu
444
    ActionContainer *medit = am->createMenu(Constants::M_EDIT);
con's avatar
con committed
445 446 447 448 449
    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);
450
    medit->appendGroup(Constants::G_EDIT_ADVANCED);
451
    medit->appendGroup(Constants::G_EDIT_FIND);
con's avatar
con committed
452 453
    medit->appendGroup(Constants::G_EDIT_OTHER);

454
    // Tools Menu
455
    ActionContainer *ac = am->createMenu(Constants::M_TOOLS);
con's avatar
con committed
456 457 458
    menubar->addMenu(ac, Constants::G_TOOLS);
    ac->menu()->setTitle(tr("&Tools"));

459
    // Window Menu
460
    ActionContainer *mwindow = am->createMenu(Constants::M_WINDOW);
con's avatar
con committed
461 462 463 464 465 466 467 468
    menubar->addMenu(mwindow, Constants::G_WINDOW);
    mwindow->menu()->setTitle(tr("&Window"));
    mwindow->appendGroup(Constants::G_WINDOW_SIZE);
    mwindow->appendGroup(Constants::G_WINDOW_PANES);
    mwindow->appendGroup(Constants::G_WINDOW_SPLIT);
    mwindow->appendGroup(Constants::G_WINDOW_NAVIGATE);
    mwindow->appendGroup(Constants::G_WINDOW_OTHER);

469
    // Help Menu
con's avatar
con committed
470 471 472
    ac = am->createMenu(Constants::M_HELP);
    menubar->addMenu(ac, Constants::G_HELP);
    ac->menu()->setTitle(tr("&Help"));
473 474
    ac->appendGroup(Constants::G_HELP_HELP);
    ac->appendGroup(Constants::G_HELP_ABOUT);
con's avatar
con committed
475 476
}

477 478 479
static Command *createSeparator(ActionManager *am, QObject *parent,
                                const QString &name,
                                const QList<int> &context)
con's avatar
con committed
480 481 482
{
    QAction *tmpaction = new QAction(parent);
    tmpaction->setSeparator(true);
con's avatar
con committed
483
    Command *cmd = am->registerAction(tmpaction, name, context);
con's avatar
con committed
484 485 486 487 488
    return cmd;
}

void MainWindow::registerDefaultActions()
{
489
    ActionManagerPrivate *am = m_actionManager;
490 491 492 493 494
    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
495 496

    // File menu separators
con's avatar
con committed
497
    Command *cmd = createSeparator(am, this, QLatin1String("QtCreator.File.Sep.Save"), m_globalContext);
con's avatar
con committed
498 499 500 501 502 503 504 505 506 507 508 509
    mfile->addAction(cmd, Constants::G_FILE_SAVE);

    cmd =  createSeparator(am, this, QLatin1String("QtCreator.File.Sep.Print"), m_globalContext);
    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
510
    cmd = createSeparator(am, this, QLatin1String("QtCreator.Edit.Sep.CopyPaste"), m_globalContext);
con's avatar
con committed
511 512 513 514 515 516 517 518
    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);

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

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

526
    // Return to editor shortcut: Note this requires Qt to fix up
con's avatar
con committed
527 528 529 530 531 532
    // 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()));

533
    // New File Action
Norwegian Rock Cat's avatar
Norwegian Rock Cat committed
534
    m_newAction = new QAction(QIcon(Constants::ICON_NEWFILE), tr("&New File or Project..."), this);
con's avatar
con committed
535 536 537 538 539
    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()));

540
    // Open Action
Norwegian Rock Cat's avatar
Norwegian Rock Cat committed
541
    m_openAction = new QAction(QIcon(Constants::ICON_OPENFILE), tr("&Open File or Project..."), this);
con's avatar
con committed
542 543 544 545 546
    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()));

547
    // Open With Action
548
    m_openWithAction = new QAction(tr("Open File &With..."), this);
con's avatar
con committed
549 550 551 552
    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()));

553
    // File->Recent Files Menu
554
    ActionContainer *ac = am->createMenu(Constants::M_FILE_RECENTFILES);
con's avatar
con committed
555
    mfile->addMenu(ac, Constants::G_FILE_OPEN);
556
    ac->menu()->setTitle(tr("Recent &Files"));
con's avatar
con committed
557

558
    // Save Action
con's avatar
con committed
559
    QAction *tmpaction = new QAction(QIcon(Constants::ICON_SAVEFILE), tr("&Save"), this);
560
    cmd = am->registerAction(tmpaction, Constants::SAVE, m_globalContext);
con's avatar
con committed
561
    cmd->setDefaultKeySequence(QKeySequence::Save);
con's avatar
con committed
562
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
563 564 565
    cmd->setDefaultText(tr("&Save"));
    mfile->addAction(cmd, Constants::G_FILE_SAVE);

566
    // Save As Action
con's avatar
con committed
567
    tmpaction = new QAction(tr("Save &As..."), this);
568
    cmd = am->registerAction(tmpaction, Constants::SAVEAS, m_globalContext);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
569
#ifdef Q_WS_MAC
con's avatar
con committed
570 571
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+S")));
#endif
con's avatar
con committed
572
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
573 574 575
    cmd->setDefaultText(tr("Save &As..."));
    mfile->addAction(cmd, Constants::G_FILE_SAVE);

576
    // SaveAll Action
con's avatar
con committed
577 578
    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
579
#ifndef Q_WS_MAC
con's avatar
con committed
580 581 582 583 584
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+S")));
#endif
    mfile->addAction(cmd, Constants::G_FILE_SAVE);
    connect(m_saveAllAction, SIGNAL(triggered()), this, SLOT(saveAll()));

585
    // Print Action
con's avatar
con committed
586
    tmpaction = new QAction(tr("&Print..."), this);
587
    cmd = am->registerAction(tmpaction, Constants::PRINT, m_globalContext);
con's avatar
con committed
588 589
    mfile->addAction(cmd, Constants::G_FILE_PRINT);

590
    // Exit Action
con's avatar
con committed
591 592 593 594 595 596
    m_exitAction = new QAction(tr("E&xit"), this);
    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()));

597
    // Undo Action
con's avatar
con committed
598
    tmpaction = new QAction(QIcon(Constants::ICON_UNDO), tr("&Undo"), this);
599
    cmd = am->registerAction(tmpaction, Constants::UNDO, m_globalContext);
con's avatar
con committed
600
    cmd->setDefaultKeySequence(QKeySequence::Undo);
con's avatar
con committed
601
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
602 603
    cmd->setDefaultText(tr("&Undo"));
    medit->addAction(cmd, Constants::G_EDIT_UNDOREDO);
604
    tmpaction->setEnabled(false);
con's avatar
con committed
605

606
    // Redo Action
con's avatar
con committed
607
    tmpaction = new QAction(QIcon(Constants::ICON_REDO), tr("&Redo"), this);
608
    cmd = am->registerAction(tmpaction, Constants::REDO, m_globalContext);
con's avatar
con committed
609
    cmd->setDefaultKeySequence(QKeySequence::Redo);
con's avatar
con committed
610
    cmd->setAttribute(Command::CA_UpdateText);
con's avatar
con committed
611 612
    cmd->setDefaultText(tr("&Redo"));
    medit->addAction(cmd, Constants::G_EDIT_UNDOREDO);
613
    tmpaction->setEnabled(false);
con's avatar
con committed
614

615
    // Cut Action
con's avatar
con committed
616
    tmpaction = new QAction(QIcon(Constants::ICON_CUT), tr("Cu&t"), this);
617
    cmd = am->registerAction(tmpaction, Constants::CUT, m_globalContext);
con's avatar
con committed
618 619
    cmd->setDefaultKeySequence(QKeySequence::Cut);
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);
620
    tmpaction->setEnabled(false);
con's avatar
con committed
621

622
    // Copy Action
con's avatar
con committed
623
    tmpaction = new QAction(QIcon(Constants::ICON_COPY), tr("&Copy"), this);
624
    cmd = am->registerAction(tmpaction, Constants::COPY, m_globalContext);
con's avatar
con committed
625 626
    cmd->setDefaultKeySequence(QKeySequence::Copy);
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);
627
    tmpaction->setEnabled(false);
con's avatar
con committed
628

629
    // Paste Action
con's avatar
con committed
630
    tmpaction = new QAction(QIcon(Constants::ICON_PASTE), tr("&Paste"), this);
631
    cmd = am->registerAction(tmpaction, Constants::PASTE, m_globalContext);
con's avatar
con committed
632 633
    cmd->setDefaultKeySequence(QKeySequence::Paste);
    medit->addAction(cmd, Constants::G_EDIT_COPYPASTE);
634
    tmpaction->setEnabled(false);
con's avatar
con committed
635

636
    // Select All
con's avatar
con committed
637
    tmpaction = new QAction(tr("&Select All"), this);
638
    cmd = am->registerAction(tmpaction, Constants::SELECTALL, m_globalContext);
con's avatar
con committed
639 640
    cmd->setDefaultKeySequence(QKeySequence::SelectAll);
    medit->addAction(cmd, Constants::G_EDIT_SELECTALL);
641
    tmpaction->setEnabled(false);
con's avatar
con committed
642

643
    // Goto Action
con's avatar
con committed
644
    tmpaction = new QAction(tr("&Go To Line..."), this);
645
    cmd = am->registerAction(tmpaction, Constants::GOTO, m_globalContext);
con's avatar
con committed
646 647
    cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+L")));
    medit->addAction(cmd, Constants::G_EDIT_OTHER);
648
    tmpaction->setEnabled(false);
con's avatar
con committed
649

650
    // Options Action
con's avatar
con committed
651 652
    m_optionsAction = new QAction(tr("&Options..."), this);
    cmd = am->registerAction(m_optionsAction, Constants::OPTIONS, m_globalContext);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
653
#ifdef Q_WS_MAC
con's avatar
con committed
654
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+,"));
con's avatar
con committed
655
    cmd->action()->setMenuRole(QAction::PreferencesRole);
con's avatar
con committed
656 657 658 659
#endif
    mtools->addAction(cmd, Constants::G_DEFAULT_THREE);
    connect(m_optionsAction, SIGNAL(triggered()), this, SLOT(showOptionsDialog()));

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
660
#ifdef Q_WS_MAC
661
    // Minimize Action
con's avatar
con committed
662 663 664 665 666 667
    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()));

668
    // Zoom Action
con's avatar
con committed
669 670 671 672 673
    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()));

674
    // Window separator
con's avatar
con committed
675 676 677 678
    cmd = createSeparator(am, this, QLatin1String("QtCreator.Window.Sep.Size"), m_globalContext);
    mwindow->addAction(cmd, Constants::G_WINDOW_SIZE);
#endif

679
    // Show Sidebar Action
con's avatar
con committed
680
    m_toggleSideBarAction = new QAction(QIcon(Constants::ICON_TOGGLE_SIDEBAR),
681
                                        tr("Show Sidebar"), this);
682
    m_toggleSideBarAction->setCheckable(true);
con's avatar
con committed
683
    cmd = am->registerAction(m_toggleSideBarAction, Constants::TOGGLE_SIDEBAR, m_globalContext);
684
    cmd->setAttribute(Command::CA_UpdateText);
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
685
#ifdef Q_WS_MAC
con's avatar
con committed
686 687 688 689
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+0"));
#else
    cmd->setDefaultKeySequence(QKeySequence("Alt+0"));
#endif
690
    connect(m_toggleSideBarAction, SIGNAL(triggered(bool)), this, SLOT(setSidebarVisible(bool)));
con's avatar
con committed
691 692 693 694
    m_toggleSideBarButton->setDefaultAction(cmd->action());
    mwindow->addAction(cmd, Constants::G_WINDOW_PANES);
    m_toggleSideBarAction->setEnabled(false);

Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
695
#ifndef Q_WS_MAC
696 697
    // Full Screen Action
    m_toggleFullScreenAction = new QAction(tr("Full Screen"), this);
hjk's avatar
hjk committed
698
    m_toggleFullScreenAction->setCheckable(true);
699
    cmd = am->registerAction(m_toggleFullScreenAction, Constants::TOGGLE_FULLSCREEN, m_globalContext);
hjk's avatar
hjk committed
700
    cmd->setDefaultKeySequence(QKeySequence("Ctrl+Shift+F11"));
701
    mwindow->addAction(cmd, Constants::G_WINDOW_SIZE);
702
    connect(m_toggleFullScreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool)));
703
#endif
hjk's avatar
hjk committed
704

705
    // About IDE Action
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
706
#ifdef Q_WS_MAC
con's avatar
con committed
707 708 709 710
    tmpaction = new QAction(tr("About &Qt Creator"), this); // it's convention not to add dots to the about menu
#else
    tmpaction = new QAction(tr("About &Qt Creator..."), this);
#endif
711
    cmd = am->registerAction(tmpaction, Constants::ABOUT_QTCREATOR, m_globalContext);
con's avatar
con committed
712 713
    mhelp->addAction(cmd, Constants::G_HELP_ABOUT);
    tmpaction->setEnabled(true);
con's avatar
con committed
714 715 716
#ifdef Q_WS_MAC
    cmd->action()->setMenuRole(QAction::ApplicationSpecificRole);
#endif
con's avatar
con committed
717
    connect(tmpaction, SIGNAL(triggered()), this,  SLOT(aboutQtCreator()));
con's avatar
con committed
718

con's avatar
con committed
719 720 721 722 723
    //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
724
#ifdef Q_WS_MAC
con's avatar
con committed
725 726 727
    cmd->action()->setMenuRole(QAction::ApplicationSpecificRole);
#endif
    connect(tmpaction, SIGNAL(triggered()), this,  SLOT(aboutPlugins()));
728
    // About Qt Action
con's avatar
con committed
729 730 731 732 733 734
//    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
735
#ifndef Q_WS_MAC // doesn't have the "About" actions in the Help menu
con's avatar
con committed
736 737 738 739
    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
740
#endif
con's avatar
con committed
741 742 743 744
}

void MainWindow::newFile()
{
745
    showNewItemDialog(tr("New...", "Title of dialog"), IWizard::allWizards());
con's avatar
con committed
746 747 748 749 750 751 752 753 754
}

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

static QList<IFileFactory*> getNonEditorFileFactories()
{
755 756
    const QList<IFileFactory*> allFileFactories =
        ExtensionSystem::PluginManager::instance()->getObjects<IFileFactory>();
con's avatar
con committed
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802
    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)
{
    bool needToSwitchToEditor = false;
    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 {
            IEditor *editor = editorManager()->openEditor(absoluteFilePath);
            if (editor)
                needToSwitchToEditor = true;
        }
    }
    if (needToSwitchToEditor)
        editorManager()->ensureEditorManagerVisible();
}

void MainWindow::setFocusToEditor()
{
    QWidget *focusWidget = qApp->focusWidget();
803
    if (!EditorManager::instance()->isVisible())
con's avatar
con committed
804 805 806 807
    {
        m_coreImpl->modeManager()->activateMode(QLatin1String(Constants::MODE_EDIT));
    }

808 809 810
    if (IEditor *editor = m_editorManager->currentEditor())
            editor->widget()->setFocus();

811
    bool focusWasAlreadyInEditor = (focusWidget && focusWidget == qApp->focusWidget());
812 813 814 815 816
    if (!focusWasAlreadyInEditor) {
        if (OutputPanePlaceHolder::getCurrent() &&
            OutputPanePlaceHolder::getCurrent()->isVisible())
            OutputPanePlaceHolder::getCurrent()->unmaximize();
    } else {
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
        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);
        } else {
            m_coreImpl->modeManager()->activateMode(QLatin1String(Constants::MODE_EDIT));
        }
con's avatar
con committed
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
    }
}

QStringList MainWindow::showNewItemDialog(const QString &title,
                                          const QList<IWizard *> &wizards,
                                          const QString &defaultLocation)
{
    // 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();
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877

    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
878 879
}

880 881 882
bool MainWindow::showOptionsDialog(const QString &category,
                                   const QString &page,
                                   QWidget *parent)
con's avatar
con committed
883
{
con's avatar
con committed
884
    emit m_coreImpl->optionsDialogRequested();
885 886 887 888
    if (!parent)
        parent = this;
    SettingsDialog dlg(parent, category, page);
    return dlg.execDialog();
con's avatar
con committed
889 890 891 892
}

void MainWindow::saveAll()
{
con's avatar
con committed
893
    m_fileManager->saveModifiedFilesSilently(m_fileManager->modifiedFiles());
con's avatar
con committed
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910
    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) {
911 912
        bool isExternal;
        const QString editorKind = editorManager()->getOpenWithEditorKind(fileName, &isExternal);
con's avatar
con committed
913 914
        if (editorKind.isEmpty())
            continue;
915 916 917 918 919
        if (isExternal) {
            editorManager()->openExternalEditor(fileName, editorKind);
        } else {
            editorManager()->openEditor(fileName, editorKind);
        }
con's avatar
con committed
920 921 922
    }
}

923
ActionManager *MainWindow::actionManager() const
con's avatar
con committed
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
{
    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;
}

EditorManager *MainWindow::editorManager() const
{
    return m_editorManager;
}

953
ProgressManager *MainWindow::progressManager() const
con's avatar
con committed
954 955 956 957
{
    return m_progressManager;
}

958
ScriptManager *MainWindow::scriptManager() const
con's avatar
con committed
959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
{
     return m_scriptManager;
}

VariableManager *MainWindow::variableManager() const
{
     return m_variableManager;
}

ModeManager *MainWindow::modeManager() const
{
    return m_modeManager;
}

MimeDatabase *MainWindow::mimeDatabase() const
{
    return m_mimeDatabase;
}

IContext *MainWindow::contextObject(QWidget *widget)
{
    return m_contextWidgets.value(widget);
}

void MainWindow::addContextObject(IContext *context)
{
    if (!context)
        return;
    QWidget *widget = context->widget();
    if (m_contextWidgets.contains(widget))
        return;

    m_contextWidgets.insert(widget, context);
}

void MainWindow::removeContextObject(IContext *context)
{
    if (!context)
        return;

    QWidget *widget = context->widget();
    if (!m_contextWidgets.contains(widget))
        return;

    m_contextWidgets.remove(widget);
hjk's avatar
hjk committed
1004
    if (m_activeContext == context)
con's avatar
con committed
1005 1006 1007 1008 1009
        updateContextObject(0);
}

void MainWindow::changeEvent(QEvent *e)
{
1010
    QMainWindow::changeEvent(e);
con's avatar
con committed
1011 1012 1013 1014 1015 1016 1017
    if (e->type() == QEvent::ActivationChange) {
        if (isActiveWindow()) {
            if (debugMainWindow)
                qDebug() << "main window activated";
            emit windowActivated();
        }
    } else if (e->type() == QEvent::WindowStateChange) {
Oswald Buddenhagen's avatar
Oswald Buddenhagen committed
1018
#ifdef Q_WS_MAC
con's avatar
con committed
1019 1020 1021 1022 1023
        bool minimized = isMinimized();
        if (debugMainWindow)
            qDebug() << "main window state changed to minimized=" << minimized;
        m_minimizeAction->setEnabled(!minimized);
        m_zoomAction->setEnabled(!minimized);
1024
#else
1025 1026
        bool isFullScreen = (windowState() & Qt::WindowFullScreen) != 0;
        m_toggleFullScreenAction->setChecked(isFullScreen);
con's avatar
con committed
1027 1028 1029 1030 1031 1032 1033
#endif
    }
}

void MainWindow::updateFocusWidget(QWidget *old, QWidget *now)
{
    Q_UNUSED(old)
1034 1035 1036 1037 1038

    // Prevent changing the context object just because the menu is activated
    if (qobject_cast<QMenuBar*>(now))
        return;

1039
    IContext *newContext = 0;
1040
    if (focusWidget()) {
con's avatar
con committed
1041 1042 1043 1044 1045
        IContext *context = 0;
        QWidget *p = focusWidget();
        while (p) {
            context = m_contextWidgets.value(p);
            if (context) {
1046
                newContext = context;
con's avatar
con committed
1047 1048 1049 1050