more stuff

This commit is contained in:
mae
2009-02-03 22:51:37 +01:00
parent 14e36bcd5a
commit 1f47895b01
5 changed files with 332 additions and 128 deletions

View File

@@ -139,6 +139,7 @@ struct EditorManagerPrivate {
Internal::EditorView *m_view; Internal::EditorView *m_view;
Internal::SplitterOrView *m_splitter; Internal::SplitterOrView *m_splitter;
QPointer<IEditor> m_currentEditor; QPointer<IEditor> m_currentEditor;
QPointer<SplitterOrView> m_currentView;
QStackedLayout *m_stackedLayout; QStackedLayout *m_stackedLayout;
ICore *m_core; ICore *m_core;
@@ -382,8 +383,10 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) :
// other setup // other setup
m_d->m_view = new EditorView(m_d->m_editorModel, this); m_d->m_splitter = new SplitterOrView(m_d->m_editorModel);
m_d->m_splitter = new SplitterOrView(m_d->m_view); m_d->m_splitter->setRoot(true);
m_d->m_view = m_d->m_splitter->view();
m_d->m_stackedLayout = new QStackedLayout(this); m_d->m_stackedLayout = new QStackedLayout(this);
m_d->m_stackedLayout->addWidget(m_d->m_splitter); m_d->m_stackedLayout->addWidget(m_d->m_splitter);
@@ -474,6 +477,7 @@ void EditorManager::handleContextChange(IContext *context)
void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory) void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory)
{ {
setCurrentView(0);
if (m_d->m_currentEditor == editor) if (m_d->m_currentEditor == editor)
return; return;
@@ -491,6 +495,26 @@ void EditorManager::setCurrentEditor(IEditor *editor, bool ignoreNavigationHisto
emit currentEditorChanged(editor); emit currentEditorChanged(editor);
} }
void EditorManager::setCurrentView(Core::Internal::SplitterOrView *view)
{
if (view == m_d->m_currentView)
return;
SplitterOrView *old = m_d->m_currentView;
m_d->m_currentView = view;
if (old)
old->update();
if (view)
view->update();
}
Core::Internal::SplitterOrView *EditorManager::currentView() const
{
return m_d->m_currentView;
}
QList<IEditor *> EditorManager::editorsForFileName(const QString &filename) const QList<IEditor *> EditorManager::editorsForFileName(const QString &filename) const
{ {
QList<IEditor *> found; QList<IEditor *> found;
@@ -516,6 +540,29 @@ void EditorManager::closeEditor()
closeEditor(m_d->m_currentEditor); closeEditor(m_d->m_currentEditor);
} }
void EditorManager::emptyView(Core::Internal::EditorView *view)
{
if (!view)
return;
QList<IEditor *> editors = view->editors();
foreach (IEditor *editor, editors) {
if (!m_d->m_editorModel->isDuplicate(editor)) {
editors.removeAll(editor);
view->removeEditor(editor);
continue;
}
emit editorAboutToClose(editor);
removeEditor(editor);
view->removeEditor(editor);
}
emit editorsClosed(editors);
foreach (IEditor *editor, editors) {
delete editor;
}
}
void EditorManager::closeView(Core::Internal::EditorView *view) void EditorManager::closeView(Core::Internal::EditorView *view)
{ {
if (!view) if (!view)
@@ -523,17 +570,25 @@ void EditorManager::closeView(Core::Internal::EditorView *view)
if (view == m_d->m_view) { if (view == m_d->m_view) {
closeEditors(QList<IEditor *>() << view->currentEditor()); closeEditors(QList<IEditor *>() << view->currentEditor());
} else { return;
QList<IEditor *> editors = view->editors(); }
foreach (IEditor *editor, editors) {
emit editorAboutToClose(editor); emptyView(view);
removeEditor(editor);
view->removeEditor(editor); SplitterOrView *splitterOrView = m_d->m_splitter->findView(view);
} Q_ASSERT(splitterOrView->view() == view);
emit editorsClosed(editors); SplitterOrView *splitter = m_d->m_splitter->findSplitter(splitterOrView);
foreach (IEditor *editor, editors) { Q_ASSERT(splitterOrView->hasEditors() == false);
delete editor; delete splitterOrView;
}
splitter->unsplit();
SplitterOrView *newCurrent = splitter->findFirstView();
if (newCurrent) {
if (newCurrent->editor())
activateEditor(newCurrent->view(), newCurrent->editor());
else
setCurrentView(newCurrent);
} }
} }
@@ -574,7 +629,6 @@ QList<IFile *> EditorManager::filesForEditors(QList<IEditor *> editors) const
bool EditorManager::closeAllEditors(bool askAboutModifiedEditors) bool EditorManager::closeAllEditors(bool askAboutModifiedEditors)
{ {
unsplitAll();
return closeEditors(openedEditors(), askAboutModifiedEditors); return closeEditors(openedEditors(), askAboutModifiedEditors);
} }
@@ -623,16 +677,11 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA
foreach(IEditor *editor, acceptedEditors) foreach(IEditor *editor, acceptedEditors)
acceptedEditors += m_d->m_editorModel->duplicatesFor(editor); acceptedEditors += m_d->m_editorModel->duplicatesFor(editor);
bool currentEditorRemoved = false; QList<EditorView*> currentViews;
IEditor *current = currentEditor(); EditorView *currentView = 0;
if (current) if (currentEditor())
addCurrentPositionToNavigationHistory(true); addCurrentPositionToNavigationHistory(true);
// remove current editor last, for optimization
if (acceptedEditors.contains(current)) {
currentEditorRemoved = true;
acceptedEditors.removeAll(current);
acceptedEditors.append(current);
}
// remove the editors // remove the editors
foreach (IEditor *editor, acceptedEditors) { foreach (IEditor *editor, acceptedEditors) {
emit editorAboutToClose(editor); emit editorAboutToClose(editor);
@@ -643,80 +692,128 @@ bool EditorManager::closeEditors(const QList<IEditor*> editorsToClose, bool askA
} }
removeEditor(editor); removeEditor(editor);
if (SplitterOrView *view = m_d->m_splitter->findView(editor)) if (SplitterOrView *view = m_d->m_splitter->findView(editor)) {
if (editor == view->view()->currentEditor()) {
currentViews += view->view();
if (editor == m_d->m_currentEditor)
currentView = view->view();
}
view->view()->removeEditor(editor); view->view()->removeEditor(editor);
}
} }
foreach (EditorView *view, currentViews) {
IEditor *newCurrent = view->currentEditor();
if (!newCurrent)
newCurrent = pickUnusedEditor();
if (!newCurrent) {
// pick the first one that can be duplicated
foreach (IEditor *e, m_d->m_editorHistory) {
if (e->duplicateSupported()) {
newCurrent = e;
break;
}
}
}
if (newCurrent)
activateEditor(view, newCurrent, NoActivate);
}
emit editorsClosed(acceptedEditors); emit editorsClosed(acceptedEditors);
foreach (IEditor *editor, acceptedEditors) { foreach (IEditor *editor, acceptedEditors) {
delete editor; delete editor;
} }
if (currentEditorRemoved) {
setCurrentEditor(0, true); if (currentView)
} activateEditor(currentView, currentView->currentEditor());
return !closingFailed; return !closingFailed;
} }
IEditor *EditorManager::pickUnusedEditor() const
{
foreach (IEditor *editor, m_d->m_editorHistory) {
SplitterOrView *view = m_d->m_splitter->findView(editor);
if (!view || view->editor() != editor)
return editor;
}
return 0;
}
void EditorManager::activateEditor(IEditor *editor, OpenEditorFlags flags) void EditorManager::activateEditor(IEditor *editor, OpenEditorFlags flags)
{ {
SplitterOrView *splitterOrView = m_d->m_currentEditor ?
m_d->m_splitter->findView(m_d->m_currentEditor) SplitterOrView *splitterOrView = m_d->m_currentView;
: m_d->m_splitter->findFirstView(); setCurrentView(0);
qDebug() << "currentView" << splitterOrView;
if (!splitterOrView)
splitterOrView = m_d->m_splitter->findEmptyView();
qDebug() << "empty" << splitterOrView;
if (!splitterOrView && m_d->m_currentEditor)
splitterOrView = m_d->m_splitter->findView(m_d->m_currentEditor);
qDebug() << "current editor" << splitterOrView;
if (!splitterOrView)
splitterOrView = m_d->m_splitter->findFirstView();
qDebug() << "first" << splitterOrView;
if (!splitterOrView) {
splitterOrView = m_d->m_splitter;
}
qDebug() << "origin" << splitterOrView;
activateEditor(splitterOrView->view(), editor, flags); activateEditor(splitterOrView->view(), editor, flags);
} }
Core::IEditor *EditorManager::placeEditor(Core::Internal::EditorView *view, Core::IEditor *editor)
void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, OpenEditorFlags flags)
{ {
if (flags & NoActivate) Q_ASSERT(view && editor) ;
return;
Q_ASSERT(view && editor);
qDebug() << "activateEditor" << editor->file()->fileName() << view;
if (!view->hasEditor(editor)) { if (!view->hasEditor(editor)) {
qDebug() << "not in requested view";
bool duplicateSupported = editor->duplicateSupported(); bool duplicateSupported = editor->duplicateSupported();
qDebug() << "duplicateSupported" << duplicateSupported;
if (SplitterOrView *sourceView = m_d->m_splitter->findView(editor)) { if (SplitterOrView *sourceView = m_d->m_splitter->findView(editor)) {
qDebug() << "found editor in another view";
if (editor != sourceView->editor() || !duplicateSupported) { if (editor != sourceView->editor() || !duplicateSupported) {
qDebug() << "steal editor";
sourceView->view()->removeEditor(editor); sourceView->view()->removeEditor(editor);
view->addEditor(editor);
view->setCurrentEditor(editor);
if (!sourceView->editor()) {
if (IEditor *replacement = pickUnusedEditor()) {
sourceView->view()->addEditor(replacement);
}
}
return editor;
} else if (duplicateSupported) { } else if (duplicateSupported) {
qDebug() << "do duplicate";
editor = duplicateEditor(editor); editor = duplicateEditor(editor);
Q_ASSERT(editor); Q_ASSERT(editor);
} }
} }
view->addEditor(editor); view->addEditor(editor);
}
return editor;
}
void EditorManager::activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, OpenEditorFlags flags)
{
Q_ASSERT(view) ;
if (!editor && !m_d->m_currentEditor) {
setCurrentEditor(0, (flags & IgnoreNavigationHistory));
return;
}
bool hasCurrent = (view->currentEditor() != 0);
editor = placeEditor(view, editor);
if (!(flags & NoActivate) || !hasCurrent)
view->setCurrentEditor(editor); view->setCurrentEditor(editor);
}
setCurrentEditor(editor, (flags & IgnoreNavigationHistory)); if (!(flags & NoActivate)) {
ensureEditorManagerVisible(); setCurrentEditor(editor, (flags & IgnoreNavigationHistory));
editor->widget()->setFocus(); ensureEditorManagerVisible();
editor->widget()->setFocus();
#if 0
if (!editor->duplicateSupported()) {
unsplitAll();
view = m_d->m_view;
} }
if (view == m_d->m_view || view->hasEditor(editor)) {
view->setCurrentEditor(editor);
return editor;
}
QList<IEditor*> editors = view->editors();
IEditor *duplicate = duplicateEditor(editor);
view->addEditor(duplicate);
view->setCurrentEditor(duplicate, ignoreNavigationHistory);
foreach(IEditor *e, editors) {
view->removeEditor(e);
closeDuplicate(e, true);
}
return duplicate;
#endif
} }
/* Find editors for a mimetype, best matching at the front /* Find editors for a mimetype, best matching at the front
@@ -1573,11 +1670,14 @@ Core::IEditor *EditorManager::duplicateEditor(Core::IEditor *editor)
void EditorManager::split(Qt::Orientation orientation) void EditorManager::split(Qt::Orientation orientation)
{ {
SplitterOrView *view = m_d->m_currentEditor ? m_d->m_splitter->findView(m_d->m_currentEditor) SplitterOrView *view = m_d->m_currentView;
if (!view)
view = m_d->m_currentEditor ? m_d->m_splitter->findView(m_d->m_currentEditor)
: m_d->m_splitter->findFirstView(); : m_d->m_splitter->findFirstView();
if (view) if (view)
view->split(orientation); view->split(orientation);
} }
void EditorManager::split() void EditorManager::split()
{ {
split(Qt::Vertical); split(Qt::Vertical);
@@ -1590,32 +1690,33 @@ void EditorManager::splitSideBySide()
void EditorManager::unsplit() void EditorManager::unsplit()
{ {
qDebug() << "unsplit" << (m_d->m_currentEditor ? m_d->m_currentEditor->file()->fileName() : QString("no current editor")); SplitterOrView *viewToClose = m_d->m_currentView;
SplitterOrView *splitter = m_d->m_currentEditor ? m_d->m_splitter->findSplitter(m_d->m_currentEditor) : m_d->m_splitter; if (!viewToClose && m_d->m_currentEditor)
qDebug() << "splitter" << splitter; viewToClose = m_d->m_splitter->findView(m_d->m_currentEditor);
if (splitter)
splitter->unsplit(m_d->m_currentEditor);
}
void EditorManager::unsplitAll() if (!viewToClose || viewToClose->isSplitter() || viewToClose == m_d->m_splitter)
{ return;
m_d->m_splitter->unsplit(0);
if (IEditor *e = m_d->m_splitter->editor()) closeView(viewToClose->view());
activateEditor(e);
} }
void EditorManager::gotoOtherWindow() void EditorManager::gotoOtherWindow()
{ {
if (!m_d->m_currentEditor)
return;
if (m_d->m_splitter->isSplitter()) { if (m_d->m_splitter->isSplitter()) {
SplitterOrView *view = m_d->m_splitter->findNextView(m_d->m_currentEditor); SplitterOrView *currentView = m_d->m_currentView;
if (!currentView && m_d->m_currentEditor)
currentView = m_d->m_splitter->findView(m_d->m_currentEditor);
if (!currentView)
currentView = m_d->m_splitter->findFirstView();
SplitterOrView *view = m_d->m_splitter->findNextView(currentView);
if (!view) if (!view)
view = m_d->m_splitter->findFirstView(); view = m_d->m_splitter->findFirstView();
if (view) { if (view) {
if (IEditor *editor = view->editor()) { if (IEditor *editor = view->editor()) {
setCurrentEditor(editor); setCurrentEditor(editor);
editor->widget()->setFocus(); editor->widget()->setFocus();
} else {
setCurrentView(view);
} }
} }
} }

View File

@@ -209,7 +209,6 @@ private slots:
void split(); void split();
void splitSideBySide(); void splitSideBySide();
void unsplit(); void unsplit();
void unsplitAll();
void gotoOtherWindow(); void gotoOtherWindow();
private: private:
@@ -221,11 +220,16 @@ private:
void restoreEditorState(IEditor *editor); void restoreEditorState(IEditor *editor);
IEditor *placeEditor(Core::Internal::EditorView *view, Core::IEditor *editor);
Core::IEditor *duplicateEditor(IEditor *editor); Core::IEditor *duplicateEditor(IEditor *editor);
void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false); void setCurrentEditor(IEditor *editor, bool ignoreNavigationHistory = false);
void setCurrentView(Core::Internal::SplitterOrView *view);
Core::Internal::SplitterOrView *currentView() const;
void activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, OpenEditorFlags flags = 0); void activateEditor(Core::Internal::EditorView *view, Core::IEditor *editor, OpenEditorFlags flags = 0);
void closeEditor(Core::IEditor *editor); void closeEditor(Core::IEditor *editor);
void closeView(Core::Internal::EditorView *view); void closeView(Core::Internal::EditorView *view);
void emptyView(Core::Internal::EditorView *view);
IEditor *pickUnusedEditor() const;
static EditorManager *m_instance; static EditorManager *m_instance;
EditorManagerPrivate *m_d; EditorManagerPrivate *m_d;

View File

@@ -265,7 +265,7 @@ EditorView::EditorView(EditorModel *model, QWidget *parent) :
connect(m_editorList, SIGNAL(activated(int)), this, SLOT(listSelectionActivated(int))); connect(m_editorList, SIGNAL(activated(int)), this, SLOT(listSelectionActivated(int)));
connect(m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable())); connect(m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable()));
connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeView())); connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeView()), Qt::QueuedConnection);
} }
{ {
m_infoWidget->setFrameStyle(QFrame::Panel | QFrame::Raised); m_infoWidget->setFrameStyle(QFrame::Panel | QFrame::Raised);
@@ -343,11 +343,8 @@ void EditorView::addEditor(IEditor *editor)
} }
connect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus())); connect(editor, SIGNAL(changed()), this, SLOT(checkEditorStatus()));
if (m_container->count() == 1) { if (editor == currentEditor())
m_editorList->setCurrentIndex(qobject_cast<EditorModel*>(m_editorList->model())->indexOf(editor->file()->fileName()).row()); setCurrentEditor(editor);
updateEditorStatus(editor);
updateToolBar(editor);
}
} }
bool EditorView::hasEditor(IEditor *editor) const bool EditorView::hasEditor(IEditor *editor) const
@@ -367,6 +364,7 @@ void EditorView::removeEditor(IEditor *editor)
{ {
QTC_ASSERT(editor, return); QTC_ASSERT(editor, return);
const int index = m_container->indexOf(editor->widget()); const int index = m_container->indexOf(editor->widget());
bool wasCurrent = (index == m_container->currentIndex());
if (index != -1) { if (index != -1) {
m_container->removeWidget(editor->widget()); m_container->removeWidget(editor->widget());
m_widgetEditorMap.remove(editor->widget()); m_widgetEditorMap.remove(editor->widget());
@@ -383,6 +381,8 @@ void EditorView::removeEditor(IEditor *editor)
toolBar->setParent(0); toolBar->setParent(0);
} }
} }
if (wasCurrent)
setCurrentEditor(currentEditor());
} }
IEditor *EditorView::currentEditor() const IEditor *EditorView::currentEditor() const
@@ -480,18 +480,18 @@ void EditorView::listSelectionActivated(int index)
} }
SplitterOrView::SplitterOrView(EditorView *view, QWidget *parent)
: QWidget(parent) SplitterOrView::SplitterOrView(Internal::EditorModel *model)
{ {
m_isRoot = true; m_isRoot = false;
m_layout = new QStackedLayout(this); m_layout = new QStackedLayout(this);
m_view = view; m_view = new EditorView(model ? model : CoreImpl::instance()->editorManager()->openedEditorsModel());
m_splitter = 0; m_splitter = 0;
m_layout->addWidget(m_view); m_layout->addWidget(m_view);
setFocusPolicy(Qt::ClickFocus);
} }
SplitterOrView::SplitterOrView(Core::IEditor *editor, QWidget *parent) SplitterOrView::SplitterOrView(Core::IEditor *editor)
: QWidget(parent)
{ {
m_isRoot = false; m_isRoot = false;
m_layout = new QStackedLayout(this); m_layout = new QStackedLayout(this);
@@ -499,8 +499,53 @@ SplitterOrView::SplitterOrView(Core::IEditor *editor, QWidget *parent)
m_view->addEditor(editor); m_view->addEditor(editor);
m_splitter = 0; m_splitter = 0;
m_layout->addWidget(m_view); m_layout->addWidget(m_view);
setFocusPolicy(Qt::ClickFocus);
} }
void SplitterOrView::focusInEvent(QFocusEvent *)
{
CoreImpl::instance()->editorManager()->setCurrentView(this);
}
void SplitterOrView::paintEvent(QPaintEvent *)
{
if (CoreImpl::instance()->editorManager()->currentView() != this)
return;
QPainter painter(this);
// Discreet indication where an editor would be
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(Qt::NoPen);
QColor shadeBrush(Qt::black);
shadeBrush.setAlpha(10);
painter.setBrush(shadeBrush);
const int r = 3;
painter.drawRoundedRect(rect().adjusted(r, r, -r, -r), r * 2, r * 2);
if (hasFocus()) {
#ifdef Q_WS_MAC
// With QMacStyle, we have to draw our own focus rect, since I didn't find
// a way to draw the nice mac focus rect _inside_ this widget
if (qobject_cast<QMacStyle *>(style())) {
painter.setPen(Qt::DotLine);
painter.setBrush(Qt::NoBrush);
painter.setOpacity(0.75);
painter.drawRect(rect());
} else {
#endif
QStyleOptionFocusRect option;
option.initFrom(this);
option.backgroundColor = palette().color(QPalette::Background);
// Some styles require a certain state flag in order to draw the focus rect
option.state |= QStyle::State_KeyboardFocusChange;
style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter);
#ifdef Q_WS_MAC
}
#endif
}
}
SplitterOrView *SplitterOrView::findFirstView() SplitterOrView *SplitterOrView::findFirstView()
{ {
@@ -515,6 +560,21 @@ SplitterOrView *SplitterOrView::findFirstView()
return this; return this;
} }
SplitterOrView *SplitterOrView::findEmptyView()
{
if (m_splitter) {
for (int i = 0; i < m_splitter->count(); ++i) {
if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i)))
if (SplitterOrView *result = splitterOrView->findEmptyView())
return result;
}
return 0;
}
if (!hasEditors())
return this;
return 0;
}
SplitterOrView *SplitterOrView::findView(Core::IEditor *editor) SplitterOrView *SplitterOrView::findView(Core::IEditor *editor)
{ {
if (!editor || hasEditor(editor)) if (!editor || hasEditor(editor))
@@ -529,6 +589,20 @@ SplitterOrView *SplitterOrView::findView(Core::IEditor *editor)
return 0; return 0;
} }
SplitterOrView *SplitterOrView::findView(EditorView *view)
{
if (view == m_view)
return this;
if (m_splitter) {
for (int i = 0; i < m_splitter->count(); ++i) {
if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i)))
if (SplitterOrView *result = splitterOrView->findView(view))
return result;
}
}
return 0;
}
SplitterOrView *SplitterOrView::findSplitter(Core::IEditor *editor) SplitterOrView *SplitterOrView::findSplitter(Core::IEditor *editor)
{ {
if (m_splitter) { if (m_splitter) {
@@ -559,19 +633,19 @@ SplitterOrView *SplitterOrView::findSplitter(SplitterOrView *child)
return 0; return 0;
} }
SplitterOrView *SplitterOrView::findNextView(Core::IEditor *editor) SplitterOrView *SplitterOrView::findNextView(SplitterOrView *view)
{ {
bool found = false; bool found = false;
return findNextView_helper(editor, &found); return findNextView_helper(view, &found);
} }
SplitterOrView *SplitterOrView::findNextView_helper(Core::IEditor *editor, bool *found) SplitterOrView *SplitterOrView::findNextView_helper(SplitterOrView *view, bool *found)
{ {
if (*found && m_view) { if (*found && m_view) {
return this; return this;
} }
if (hasEditor(editor)) { if (this == view) {
*found = true; *found = true;
return 0; return 0;
} }
@@ -579,7 +653,7 @@ SplitterOrView *SplitterOrView::findNextView_helper(Core::IEditor *editor, bool
if (m_splitter) { if (m_splitter) {
for (int i = 0; i < m_splitter->count(); ++i) { for (int i = 0; i < m_splitter->count(); ++i) {
if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) { if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) {
if (SplitterOrView *result = splitterOrView->findNextView_helper(editor, found)) if (SplitterOrView *result = splitterOrView->findNextView_helper(view, found))
return result; return result;
} }
} }
@@ -592,32 +666,46 @@ void SplitterOrView::split(Qt::Orientation orientation)
Q_ASSERT(m_view && m_splitter == 0); Q_ASSERT(m_view && m_splitter == 0);
m_splitter = new QSplitter(this); m_splitter = new QSplitter(this);
m_splitter->setOrientation(orientation); m_splitter->setOrientation(orientation);
m_layout->addWidget(m_splitter);
EditorManager *em = CoreImpl::instance()->editorManager();
Core::IEditor *e = m_view->currentEditor(); Core::IEditor *e = m_view->currentEditor();
SplitterOrView *focusView = 0; if (e) {
m_view->removeEditor(e); m_view->removeEditor(e);
m_splitter->addWidget((focusView = new SplitterOrView(e))); m_splitter->addWidget(new SplitterOrView(e));
Core::IEditor *duplicate = CoreImpl::instance()->editorManager()->duplicateEditor(e);
m_splitter->addWidget(new SplitterOrView(duplicate));
m_layout->addWidget(m_splitter);
if (!m_isRoot) {
delete m_view;
m_view = 0; m_view = 0;
if (e->duplicateSupported()) {
Core::IEditor *duplicate = em->duplicateEditor(e);
m_splitter->addWidget(new SplitterOrView(duplicate));
} else {
m_splitter->addWidget(new SplitterOrView());
}
} else { } else {
m_layout->setCurrentWidget(m_splitter); m_splitter->addWidget(new SplitterOrView());
m_splitter->addWidget(new SplitterOrView());
} }
CoreImpl::instance()->editorManager()->activateEditor(e); m_layout->setCurrentWidget(m_splitter);
if (m_view && !m_isRoot) {
em->emptyView(m_view);
delete m_view;
m_view = 0;
}
if (e)
em->activateEditor(e);
else
em->setCurrentView(findFirstView());
} }
void SplitterOrView::close() void SplitterOrView::close()
{ {
Q_ASSERT(!m_isRoot); Q_ASSERT(!m_isRoot);
if (m_view) { if (m_view) {
m_view->closeView(); CoreImpl::instance()->editorManager()->emptyView(m_view);
delete m_view; delete m_view;
m_view = 0; m_view = 0;
} }
@@ -635,7 +723,7 @@ void SplitterOrView::closeSplitterEditors()
} }
} }
void SplitterOrView::unsplit(Core::IEditor *editor) void SplitterOrView::unsplit()
{ {
if (!m_splitter) if (!m_splitter)
return; return;

View File

@@ -151,33 +151,43 @@ class SplitterOrView : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
SplitterOrView(EditorView *view, QWidget *parent = 0); // creates a root splitter or view SplitterOrView(Internal::EditorModel *model = 0); // creates a splitter with an empty view
SplitterOrView(Core::IEditor *editor, QWidget *parent = 0); SplitterOrView(Core::IEditor *editor);
void split(Qt::Orientation orientation); void split(Qt::Orientation orientation);
void unsplit(Core::IEditor *editor); void unsplit();
bool isView() const { return m_view != 0; } inline bool isView() const { return m_view != 0; }
bool isRoot() const { return m_isRoot; } inline void setRoot(bool b) { m_isRoot = b; }
inline bool isRoot() const { return m_isRoot; }
bool isSplitter() const { return m_splitter != 0; } inline bool isSplitter() const { return m_splitter != 0; }
Core::IEditor *editor() const { return m_view ? m_view->currentEditor() : 0; } inline Core::IEditor *editor() const { return m_view ? m_view->currentEditor() : 0; }
QList<Core::IEditor *> editors() const { return m_view ? m_view->editors() : QList<Core::IEditor*>(); } inline QList<Core::IEditor *> editors() const { return m_view ? m_view->editors() : QList<Core::IEditor*>(); }
bool hasEditor(Core::IEditor *editor) const { return m_view && m_view->hasEditor(editor); } inline bool hasEditor(Core::IEditor *editor) const { return m_view && m_view->hasEditor(editor); }
EditorView *view() const { return m_view; } inline bool hasEditors() const { return m_view && m_view->editorCount() != 0; }
QSplitter *splitter() const { return m_splitter; } inline EditorView *view() const { return m_view; }
inline QSplitter *splitter() const { return m_splitter; }
SplitterOrView *findView(Core::IEditor *editor); SplitterOrView *findView(Core::IEditor *editor);
SplitterOrView *findView(EditorView *view);
SplitterOrView *findFirstView(); SplitterOrView *findFirstView();
SplitterOrView *findEmptyView();
SplitterOrView *findSplitter(Core::IEditor *editor); SplitterOrView *findSplitter(Core::IEditor *editor);
SplitterOrView *findSplitter(SplitterOrView *child); SplitterOrView *findSplitter(SplitterOrView *child);
SplitterOrView *findNextView(Core::IEditor *editor); SplitterOrView *findNextView(SplitterOrView *view);
protected:
void focusInEvent(QFocusEvent *);
void paintEvent(QPaintEvent *);
private: private:
void close(); void close();
void closeSplitterEditors(); void closeSplitterEditors();
SplitterOrView *findNextView_helper(Core::IEditor *editor, bool *found); SplitterOrView *findNextView_helper(SplitterOrView *view, bool *found);
bool m_isRoot; bool m_isRoot;
QStackedLayout *m_layout; QStackedLayout *m_layout;
EditorView *m_view; EditorView *m_view;

View File

@@ -235,7 +235,8 @@ void OpenEditorsWindow::selectEditor(QTreeWidgetItem *item)
IEditor *editor = 0; IEditor *editor = 0;
if (item) if (item)
editor = item->data(0, Qt::UserRole).value<IEditor*>(); editor = item->data(0, Qt::UserRole).value<IEditor*>();
EditorManager::instance()->activateEditor(editor); if (editor)
EditorManager::instance()->activateEditor(editor);
} }
void OpenEditorsWindow::editorClicked(QTreeWidgetItem *item) void OpenEditorsWindow::editorClicked(QTreeWidgetItem *item)