diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index 6637ec89159..7904aba32ad 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -112,7 +112,8 @@ const char SPLIT_SIDE_BY_SIDE[] = "QtCreator.SplitSideBySide"; const char SPLIT_NEW_WINDOW[] = "QtCreator.SplitNewWindow"; const char REMOVE_CURRENT_SPLIT[] = "QtCreator.RemoveCurrentSplit"; const char REMOVE_ALL_SPLITS[] = "QtCreator.RemoveAllSplits"; -const char GOTO_NEXT_SPLIT[] = "QtCreator.GotoOtherSplit"; +const char GOTO_PREV_SPLIT[] = "QtCreator.GoToPreviousSplit"; +const char GOTO_NEXT_SPLIT[] = "QtCreator.GoToNextSplit"; const char CLOSE[] = "QtCreator.Close"; const char CLOSE_ALTERNATIVE[] = "QtCreator.Close_Alternative"; // temporary, see QTCREATORBUG-72 const char CLOSEALL[] = "QtCreator.CloseAll"; diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 7eb52922ce5..0e71d9aaa36 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -412,6 +412,12 @@ void EditorManagerPrivate::init() mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT); connect(m_removeAllSplitsAction, SIGNAL(triggered()), this, SLOT(removeAllSplits())); + m_gotoPreviousSplitAction = new QAction(tr("Go to Previous Split or Window"), this); + cmd = ActionManager::registerAction(m_gotoPreviousSplitAction, Constants::GOTO_PREV_SPLIT, editManagerContext); + cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+E,i") : tr("Ctrl+E,i"))); + mwindow->addAction(cmd, Constants::G_WINDOW_SPLIT); + connect(m_gotoPreviousSplitAction, SIGNAL(triggered()), this, SLOT(gotoPreviousSplit())); + m_gotoNextSplitAction = new QAction(tr("Go to Next Split or Window"), this); cmd = ActionManager::registerAction(m_gotoNextSplitAction, Constants::GOTO_NEXT_SPLIT, editManagerContext); cmd->setDefaultKeySequence(QKeySequence(UseMacShortcuts ? tr("Meta+E,o") : tr("Ctrl+E,o"))); @@ -1658,6 +1664,30 @@ void EditorManagerPrivate::gotoNextSplit() activateView(nextView); } +void EditorManagerPrivate::gotoPreviousSplit() +{ + EditorView *view = currentEditorView(); + if (!view) + return; + EditorView *prevView = view->findPreviousView(); + if (!prevView) { + // we are in the "first" view in this editor area + int index = -1; + EditorArea *area = findEditorArea(view, &index); + QTC_ASSERT(area, return); + QTC_ASSERT(index >= 0 && index < d->m_editorAreas.size(), return); + // find previous editor area. this might be the same editor area if there's only one. + int nextIndex = index - 1; + if (nextIndex < 0) + nextIndex = d->m_editorAreas.count() - 1; + prevView = d->m_editorAreas.at(nextIndex)->findLastView(); + QTC_CHECK(prevView); + } + + if (prevView) + activateView(prevView); +} + void EditorManagerPrivate::makeCurrentEditorWritable() { if (IDocument* doc = EditorManager::currentDocument()) diff --git a/src/plugins/coreplugin/editormanager/editormanager_p.h b/src/plugins/coreplugin/editormanager/editormanager_p.h index d12c59851ab..0d1e3fa1b45 100644 --- a/src/plugins/coreplugin/editormanager/editormanager_p.h +++ b/src/plugins/coreplugin/editormanager/editormanager_p.h @@ -137,6 +137,7 @@ public slots: static void split(Qt::Orientation orientation); static void removeAllSplits(); + static void gotoPreviousSplit(); static void gotoNextSplit(); void handleDocumentStateChange(); @@ -224,6 +225,7 @@ private: QAction *m_splitNewWindowAction; QAction *m_removeCurrentSplitAction; QAction *m_removeAllSplitsAction; + QAction *m_gotoPreviousSplitAction; QAction *m_gotoNextSplitAction; QAction *m_copyFilePathContextAction; diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index de386e304c6..bed8dd990f7 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -184,6 +184,29 @@ EditorView *EditorView::findNextView() return 0; } +EditorView *EditorView::findPreviousView() +{ + SplitterOrView *current = parentSplitterOrView(); + QTC_ASSERT(current, return 0); + SplitterOrView *parent = current->findParentSplitter(); + while (parent) { + QSplitter *splitter = parent->splitter(); + QTC_ASSERT(splitter, return 0); + QTC_ASSERT(splitter->count() == 2, return 0); + // is current the last child? then the previous view is the first child in current's sibling + if (splitter->widget(1) == current) { + SplitterOrView *first = qobject_cast(splitter->widget(0)); + QTC_ASSERT(first, return 0); + return first->findFirstView(); + } + // otherwise go up the hierarchy + current = parent; + parent = current->findParentSplitter(); + } + // current has no parent, so we are at the top and there is no "previous" view + return 0; +} + void EditorView::closeCurrentEditor() { IEditor *editor = currentEditor(); @@ -637,6 +660,19 @@ EditorView *SplitterOrView::findFirstView() return m_view; } +EditorView *SplitterOrView::findLastView() +{ + if (m_splitter) { + for (int i = m_splitter->count() - 1; 0 < i; --i) { + if (SplitterOrView *splitterOrView = qobject_cast(m_splitter->widget(i))) + if (EditorView *result = splitterOrView->findLastView()) + return result; + } + return 0; + } + return m_view; +} + SplitterOrView *SplitterOrView::findParentSplitter() const { QWidget *w = parentWidget(); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index 5b7d56f66a5..6d176d5bf0a 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -85,6 +85,7 @@ public: SplitterOrView *parentSplitterOrView() const; EditorView *findNextView(); + EditorView *findPreviousView(); int editorCount() const; void addEditor(IEditor *editor); @@ -197,6 +198,7 @@ public: void restoreState(const QByteArray &); EditorView *findFirstView(); + EditorView *findLastView(); SplitterOrView *findParentSplitter() const; QSize sizeHint() const { return minimumSizeHint(); }