diff --git a/src/plugins/coreplugin/editmode.cpp b/src/plugins/coreplugin/editmode.cpp index e99bc20469910e80c30236cd3d5240f2f482f124..03c1663c8b8da9ba0111ae097ac1453eb65e90ff 100644 --- a/src/plugins/coreplugin/editmode.cpp +++ b/src/plugins/coreplugin/editmode.cpp @@ -56,7 +56,6 @@ EditMode::EditMode(EditorManager *editorManager) : QWidget *rightSplitWidget = new QWidget; rightSplitWidget->setLayout(m_rightSplitWidgetLayout); m_rightSplitWidgetLayout->insertWidget(0, new Core::EditorManagerPlaceHolder(this)); - m_rightSplitWidgetLayout->addWidget(new Core::FindToolBarPlaceHolder(this)); MiniSplitter *rightPaneSplitter = new MiniSplitter; rightPaneSplitter->insertWidget(0, rightSplitWidget); diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index c5a211c6ef58f83b7b24d2cd637dce29d49ca47d..bc823fc68fa3b3eed2cb32fa64ff4a4833d69f11 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -35,6 +35,7 @@ #include <coreplugin/coreconstants.h> #include <coreplugin/actionmanager/actionmanager.h> +#include <coreplugin/findplaceholder.h> #include <utils/qtcassert.h> #include <utils/styledbar.h> @@ -144,6 +145,9 @@ EditorView::EditorView(OpenEditorsModel *model, QWidget *parent) : connect(m_lockButton, SIGNAL(clicked()), this, SLOT(makeEditorWritable())); connect(m_closeButton, SIGNAL(clicked()), this, SLOT(closeView()), Qt::QueuedConnection); } + { + tl->addWidget(new FindToolBarPlaceHolder(this)); + } { m_infoWidget->setFrameStyle(QFrame::Panel | QFrame::Raised); m_infoWidget->setLineWidth(1); diff --git a/src/plugins/coreplugin/findplaceholder.cpp b/src/plugins/coreplugin/findplaceholder.cpp index 3036c94167ce72486a1f0a8f56837479c665de8f..001b882bfe565e1f199bbd837c8db10ef922a454 100644 --- a/src/plugins/coreplugin/findplaceholder.cpp +++ b/src/plugins/coreplugin/findplaceholder.cpp @@ -30,6 +30,8 @@ #include "findplaceholder.h" #include "modemanager.h" +#include <extensionsystem/pluginmanager.h> + #include <QtGui/QVBoxLayout> @@ -37,29 +39,31 @@ using namespace Core; FindToolBarPlaceHolder *FindToolBarPlaceHolder::m_current = 0; -FindToolBarPlaceHolder::FindToolBarPlaceHolder(Core::IMode *mode, QWidget *parent) - : QWidget(parent), m_mode(mode) +FindToolBarPlaceHolder::FindToolBarPlaceHolder(QWidget *owner, QWidget *parent) + : QWidget(parent), m_widget(owner) { setLayout(new QVBoxLayout); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); layout()->setMargin(0); - connect(Core::ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode *)), - this, SLOT(currentModeChanged(Core::IMode *))); + ExtensionSystem::PluginManager::instance()->addObject(this); } FindToolBarPlaceHolder::~FindToolBarPlaceHolder() { + ExtensionSystem::PluginManager::instance()->removeObject(this); } -void FindToolBarPlaceHolder::currentModeChanged(Core::IMode *mode) +QWidget *FindToolBarPlaceHolder::widget() const { - if (m_current == this) - m_current = 0; - if (m_mode == mode) - m_current = this; + return m_widget; } FindToolBarPlaceHolder *FindToolBarPlaceHolder::getCurrent() { return m_current; } + +void FindToolBarPlaceHolder::setCurrent(FindToolBarPlaceHolder *placeHolder) +{ + m_current = placeHolder; +} diff --git a/src/plugins/coreplugin/findplaceholder.h b/src/plugins/coreplugin/findplaceholder.h index 1c46d3d33a99e2ce9974f2914822f5dccdec0ac6..59cf42d131b47f8301bdda37efef0ad0a160963b 100644 --- a/src/plugins/coreplugin/findplaceholder.h +++ b/src/plugins/coreplugin/findplaceholder.h @@ -41,14 +41,15 @@ class CORE_EXPORT FindToolBarPlaceHolder : public QWidget { Q_OBJECT public: - FindToolBarPlaceHolder(Core::IMode *mode, QWidget *parent = 0); + FindToolBarPlaceHolder(QWidget *owner, QWidget *parent = 0); ~FindToolBarPlaceHolder(); + QWidget *widget() const; static FindToolBarPlaceHolder *getCurrent(); -private slots: - void currentModeChanged(Core::IMode *); + static void setCurrent(FindToolBarPlaceHolder *placeHolder); + private: - Core::IMode *m_mode; + QWidget *m_widget; static FindToolBarPlaceHolder *m_current; }; diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index be678e721c5b792d3271c7e7cc2ea6e10c15e3e4..eafe8063af5b917df6b24deb5d002aff29050147 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -303,7 +303,7 @@ bool MainWindow::init(QString *errorMessage) oph->setCloseable(false); outputModeWidget->layout()->addWidget(oph); oph->setVisible(true); // since the output pane placeholder is invisible at startup by default (which makes sense in most cases) - outputModeWidget->layout()->addWidget(new Core::FindToolBarPlaceHolder(m_outputMode)); + outputModeWidget->layout()->addWidget(new Core::FindToolBarPlaceHolder(outputModeWidget)); outputModeWidget->setFocusProxy(oph); connect(m_modeManager, SIGNAL(currentModeChanged(Core::IMode*)), diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 33c204355b15ea15d1952a2b8bd8d3b9474397ec..6319f1f648e25307436e66be7b3bfd0b0c68bf10 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -798,11 +798,11 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess QBoxLayout *editorHolderLayout = new QVBoxLayout; editorHolderLayout->setMargin(0); editorHolderLayout->setSpacing(0); - editorHolderLayout->addWidget(new EditorManagerPlaceHolder(m_debugMode)); - editorHolderLayout->addWidget(new FindToolBarPlaceHolder(m_debugMode)); QWidget *editorAndFindWidget = new QWidget; editorAndFindWidget->setLayout(editorHolderLayout); + editorHolderLayout->addWidget(new EditorManagerPlaceHolder(m_debugMode)); + editorHolderLayout->addWidget(new FindToolBarPlaceHolder(editorAndFindWidget)); MiniSplitter *rightPaneSplitter = new MiniSplitter; rightPaneSplitter->addWidget(editorAndFindWidget); diff --git a/src/plugins/find/currentdocumentfind.cpp b/src/plugins/find/currentdocumentfind.cpp index 1fc029a1d96da371fc908f7a553da565b534bf05..f2eb129452d52519030fa2e714d0a3f41f85f36f 100644 --- a/src/plugins/find/currentdocumentfind.cpp +++ b/src/plugins/find/currentdocumentfind.cpp @@ -45,7 +45,7 @@ CurrentDocumentFind::CurrentDocumentFind() : m_currentFind(0) { connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), - this, SLOT(updateCurrentFindFilter(QWidget*,QWidget*))); + this, SLOT(updateCandidateFindFilter(QWidget*,QWidget*))); } void CurrentDocumentFind::removeConnections() @@ -71,6 +71,11 @@ bool CurrentDocumentFind::isEnabled() const return m_currentFind && (!m_currentWidget || m_currentWidget->isVisible()); } +bool CurrentDocumentFind::candidateIsEnabled() const +{ + return (m_candidateFind != 0); +} + bool CurrentDocumentFind::supportsReplace() const { QTC_ASSERT(m_currentFind, return false); @@ -139,7 +144,7 @@ void CurrentDocumentFind::clearFindScope() m_currentFind->clearFindScope(); } -void CurrentDocumentFind::updateCurrentFindFilter(QWidget *old, QWidget *now) +void CurrentDocumentFind::updateCandidateFindFilter(QWidget *old, QWidget *now) { Q_UNUSED(old) QWidget *candidate = now; @@ -149,13 +154,20 @@ void CurrentDocumentFind::updateCurrentFindFilter(QWidget *old, QWidget *now) if (!impl) candidate = candidate->parentWidget(); } - if (!impl || impl == m_currentFind) + m_candidateWidget = candidate; + m_candidateFind = impl; + emit candidateChanged(); +} + +void CurrentDocumentFind::acceptCandidate() +{ + if (!m_candidateFind || m_candidateFind == m_currentFind) return; removeFindSupportConnections(); if (m_currentFind) m_currentFind->highlightAll(QString(), 0); - m_currentWidget = candidate; - m_currentFind = impl; + m_currentWidget = m_candidateWidget; + m_currentFind = m_candidateFind; if (m_currentFind) { connect(m_currentFind, SIGNAL(changed()), this, SIGNAL(changed())); connect(m_currentFind, SIGNAL(destroyed(QObject*)), SLOT(findSupportDestroyed())); diff --git a/src/plugins/find/currentdocumentfind.h b/src/plugins/find/currentdocumentfind.h index eb8bdf38e0c2782817b0b17f018186427392eea8..82f6da9b0c82f1c46e4627a5e0a6432f7a876a1d 100644 --- a/src/plugins/find/currentdocumentfind.h +++ b/src/plugins/find/currentdocumentfind.h @@ -53,6 +53,7 @@ public: QString completedFindString() const; bool isEnabled() const; + bool candidateIsEnabled() const; void highlightAll(const QString &txt, IFindSupport::FindFlags findFlags); bool findIncremental(const QString &txt, IFindSupport::FindFlags findFlags); bool findStep(const QString &txt, IFindSupport::FindFlags findFlags); @@ -62,6 +63,7 @@ public: IFindSupport::FindFlags findFlags); void defineFindScope(); void clearFindScope(); + void acceptCandidate(); void removeConnections(); bool setFocusToCurrentFindSupport(); @@ -70,9 +72,10 @@ public: signals: void changed(); + void candidateChanged(); private slots: - void updateCurrentFindFilter(QWidget *old, QWidget *now); + void updateCandidateFindFilter(QWidget *old, QWidget *now); void findSupportDestroyed(); private: @@ -80,6 +83,8 @@ private: QPointer<IFindSupport> m_currentFind; QPointer<QWidget> m_currentWidget; + QPointer<IFindSupport> m_candidateFind; + QPointer<QWidget> m_candidateWidget; }; } // namespace Internal diff --git a/src/plugins/find/findtoolbar.cpp b/src/plugins/find/findtoolbar.cpp index 2e8df6b263cfc99721314423b8927465ed9b5c95..482f3fc84062929248e7ebfdc79c10d252d51d76 100644 --- a/src/plugins/find/findtoolbar.cpp +++ b/src/plugins/find/findtoolbar.cpp @@ -32,7 +32,6 @@ #include "textfindconstants.h" #include <coreplugin/coreconstants.h> -#include <coreplugin/findplaceholder.h> #include <coreplugin/icore.h> #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actioncontainer.h> @@ -75,7 +74,7 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen //setup ui m_ui.setupUi(this); setFocusProxy(m_ui.findEdit); - setProperty("topBorder", true); +// setProperty("topBorder", true); setSingleRow(false); m_ui.findEdit->setAttribute(Qt::WA_MacShowFocusRect, false); m_ui.replaceEdit->setAttribute(Qt::WA_MacShowFocusRect, false); @@ -213,8 +212,9 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen connect(m_regularExpressionAction, SIGNAL(triggered(bool)), this, SLOT(setRegularExpressions(bool))); lineEditMenu->addAction(m_regularExpressionAction); - connect(m_currentDocumentFind, SIGNAL(changed()), this, SLOT(updateActions())); - updateActions(); + connect(m_currentDocumentFind, SIGNAL(candidateChanged()), this, SLOT(adaptToCandidate())); + connect(m_currentDocumentFind, SIGNAL(changed()), this, SLOT(updateToolBar())); + updateToolBar(); } FindToolBar::~FindToolBar() @@ -264,11 +264,31 @@ bool FindToolBar::eventFilter(QObject *obj, QEvent *event) return Core::Utils::StyledBar::eventFilter(obj, event); } -void FindToolBar::updateActions() + +void FindToolBar::removeFromParent() +{ + setVisible(false); + setParent(0); + Core::FindToolBarPlaceHolder::setCurrent(0); +} + +void FindToolBar::adaptToCandidate() +{ + updateFindAction(); + if (findToolBarPlaceHolder() == Core::FindToolBarPlaceHolder::getCurrent()) { + m_currentDocumentFind->acceptCandidate(); + } +} + +void FindToolBar::updateFindAction() +{ + m_findInDocumentAction->setEnabled(m_currentDocumentFind->candidateIsEnabled()); +} + +void FindToolBar::updateToolBar() { bool enabled = m_currentDocumentFind->isEnabled(); bool replaceEnabled = enabled && m_currentDocumentFind->supportsReplace(); - m_findInDocumentAction->setEnabled(enabled); m_findNextAction->setEnabled(enabled); m_findPreviousAction->setEnabled(enabled); @@ -507,19 +527,38 @@ void FindToolBar::hideAndResetFocus() hide(); } +Core::FindToolBarPlaceHolder *FindToolBar::findToolBarPlaceHolder() const +{ + QList<Core::FindToolBarPlaceHolder*> placeholders = ExtensionSystem::PluginManager::instance() + ->getObjects<Core::FindToolBarPlaceHolder>(); + QWidget *candidate = QApplication::focusWidget(); + while (candidate) { + foreach (Core::FindToolBarPlaceHolder *ph, placeholders) { + if (ph->widget() == candidate) + return ph; + } + candidate = candidate->parentWidget(); + } + return 0; +} + void FindToolBar::openFind() { - if (!m_currentDocumentFind->isEnabled()) + if (!m_currentDocumentFind->candidateIsEnabled()) return; - Core::FindToolBarPlaceHolder *holder = Core::FindToolBarPlaceHolder::getCurrent(); - QLayout *findContainerLayout = holder ? holder->layout() : 0; - - if (findContainerLayout) { - findContainerLayout->addWidget(this); - holder->setVisible(true); - setVisible(true); - setFocus(); - } + Core::FindToolBarPlaceHolder *holder = findToolBarPlaceHolder(); + if (!holder) + return; + Core::FindToolBarPlaceHolder *previousHolder = Core::FindToolBarPlaceHolder::getCurrent(); + if (previousHolder) + disconnect(previousHolder, SIGNAL(destroyed(QObject*)), this, SLOT(removeFromParent())); + Core::FindToolBarPlaceHolder::setCurrent(holder); + connect(holder, SIGNAL(destroyed(QObject*)), this, SLOT(removeFromParent())); + m_currentDocumentFind->acceptCandidate(); + holder->layout()->addWidget(this); + holder->setVisible(true); + setVisible(true); + setFocus(); QString text = m_currentDocumentFind->currentFindString(); if (!text.isEmpty()) setFindText(text); @@ -528,7 +567,6 @@ void FindToolBar::openFind() selectFindText(); } - bool FindToolBar::focusNextPrevChild(bool next) { // close tab order change diff --git a/src/plugins/find/findtoolbar.h b/src/plugins/find/findtoolbar.h index 8985b3419c3efce9399a42e2e4805052f20a776a..3008eeed6f148df9d5f9f26174307bc0098ebabd 100644 --- a/src/plugins/find/findtoolbar.h +++ b/src/plugins/find/findtoolbar.h @@ -34,6 +34,7 @@ #include "ifindfilter.h" #include "currentdocumentfind.h" +#include <coreplugin/findplaceholder.h> #include <utils/styledbar.h> #include <QtGui/QStringListModel> @@ -74,13 +75,16 @@ private slots: void hideAndResetFocus(); void openFind(); - void updateActions(); + void updateFindAction(); + void updateToolBar(); void findFlagsChanged(); void setCaseSensitive(bool sensitive); void setWholeWord(bool wholeOnly); void setRegularExpressions(bool regexp); + void adaptToCandidate(); + void removeFromParent(); protected: bool focusNextPrevChild(bool next); @@ -90,6 +94,7 @@ private: void setFindFlag(IFindSupport::FindFlag flag, bool enabled); bool hasFindFlag(IFindSupport::FindFlag flag); IFindSupport::FindFlags effectiveFindFlags(); + Core::FindToolBarPlaceHolder *FindToolBar::findToolBarPlaceHolder() const; bool eventFilter(QObject *obj, QEvent *event); void setFindText(const QString &text); diff --git a/src/plugins/find/findwidget.ui b/src/plugins/find/findwidget.ui index 8fb5973c130605c1667a483d00bb68270fd29dd5..51b0fd45b9749fb9743eb151afdd5dd03e143cd0 100644 --- a/src/plugins/find/findwidget.ui +++ b/src/plugins/find/findwidget.ui @@ -24,7 +24,7 @@ <number>0</number> </property> <property name="bottomMargin"> - <number>1</number> + <number>2</number> </property> <property name="horizontalSpacing"> <number>5</number> diff --git a/src/plugins/help/helpmode.cpp b/src/plugins/help/helpmode.cpp index d7a806cc620a1a60585fc8427f439ea5361f79f7..f6fcfc3c56ba7ee3baafa9372564cc372bfaf5b3 100644 --- a/src/plugins/help/helpmode.cpp +++ b/src/plugins/help/helpmode.cpp @@ -46,7 +46,7 @@ HelpMode::HelpMode(QWidget *widget, QWidget *centralWidget, QObject *parent) setPriority(Constants::P_MODE_HELP); setWidget(widget); m_centralWidget->layout()->setSpacing(0); - m_centralWidget->layout()->addWidget(new Core::FindToolBarPlaceHolder(this)); + m_centralWidget->layout()->addWidget(new Core::FindToolBarPlaceHolder(m_centralWidget)); } diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index c48c7fe02c28a699f55d1ee820c6c90f31f4d881..ee516a3df06b05a45bb48966bd9ef0c409d8c167 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -43,17 +43,18 @@ #include "searchwidget.h" #include <extensionsystem/pluginmanager.h> -#include <coreplugin/icore.h> -#include <coreplugin/coreconstants.h> -#include <coreplugin/modemanager.h> -#include <coreplugin/uniqueidmanager.h> + #include <coreplugin/actionmanager/actionmanager.h> +#include <coreplugin/coreconstants.h> +#include <coreplugin/editormanager/editormanager.h> +#include <coreplugin/findplaceholder.h> +#include <coreplugin/icore.h> #include <coreplugin/minisplitter.h> #include <coreplugin/modemanager.h> #include <coreplugin/rightpane.h> #include <coreplugin/sidebar.h> +#include <coreplugin/uniqueidmanager.h> #include <coreplugin/welcomemode.h> -#include <coreplugin/editormanager/editormanager.h> #include <texteditor/texteditorconstants.h> @@ -463,11 +464,16 @@ void HelpPlugin::createRightPaneSideBar() w->setLayout(hboxLayout); connect(closeButton, SIGNAL(clicked()), this, SLOT(slotHideRightPane())); + m_rightPaneSideBar = new QWidget; QVBoxLayout *rightPaneLayout = new QVBoxLayout; rightPaneLayout->setMargin(0); rightPaneLayout->setSpacing(0); - rightPaneLayout->addWidget(w); + m_rightPaneSideBar->setLayout(rightPaneLayout); + m_rightPaneSideBar->setFocusProxy(m_helpViewerForSideBar); + addAutoReleasedObject(new Core::BaseRightPaneWidget(m_rightPaneSideBar)); + rightPaneLayout->addWidget(w); + rightPaneLayout->addWidget(new Core::FindToolBarPlaceHolder(m_rightPaneSideBar)); m_helpViewerForSideBar = new HelpViewer(m_helpEngine, 0); Aggregation::Aggregate *agg = new Aggregation::Aggregate(); agg->add(m_helpViewerForSideBar); @@ -494,11 +500,6 @@ void HelpPlugin::createRightPaneSideBar() connect(copyActionSideBar, SIGNAL(triggered()), this, SLOT(copyFromSideBar())); copyActionSideBar->setText(cmd->action()->text()); copyActionSideBar->setIcon(cmd->action()->icon()); - - m_rightPaneSideBar = new QWidget; - m_rightPaneSideBar->setLayout(rightPaneLayout); - m_rightPaneSideBar->setFocusProxy(m_helpViewerForSideBar); - addAutoReleasedObject(new Core::BaseRightPaneWidget(m_rightPaneSideBar)); } void HelpPlugin::copyFromSideBar() diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index ea065c539434484fcac9c447eec5a061d74a5ebb..b71afb3835a3f501e68805aefe5253443d570f62 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -189,7 +189,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er mode->setWidget(m_proWindow); mode->setContext(QList<int>() << pecontext); addAutoReleasedObject(mode); - m_proWindow->layout()->addWidget(new Core::FindToolBarPlaceHolder(mode)); + m_proWindow->layout()->addWidget(new Core::FindToolBarPlaceHolder(m_proWindow)); m_buildManager = new BuildManager(this); connect(m_buildManager, SIGNAL(buildStateChanged(ProjectExplorer::Project *)),