forked from qt-creator/qt-creator
Add new Outline sidebar pane
Adds a generic Outline pane to the sidebar. The CppEditor & QmlJSEditor plugins will implement the IOutlineWidget/IOutlineWidgetFactory interface to provide views specific to C++/Qml/JS documents. Reviewed-by: con
This commit is contained in:
31
src/plugins/texteditor/ioutlinewidget.h
Normal file
31
src/plugins/texteditor/ioutlinewidget.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef IOUTLINEWIDGET_H
|
||||||
|
#define IOUTLINEWIDGET_H
|
||||||
|
|
||||||
|
#include <texteditor/texteditor_global.h>
|
||||||
|
#include <QtGui/QWidget>
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class IEditor;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace TextEditor {
|
||||||
|
|
||||||
|
class TEXTEDITOR_EXPORT IOutlineWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
IOutlineWidget(QWidget *parent = 0) : QWidget(parent) {}
|
||||||
|
|
||||||
|
virtual void setCursorSynchronization(bool syncWithCursor) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TEXTEDITOR_EXPORT IOutlineWidgetFactory : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
virtual bool supportsEditor(Core::IEditor *editor) const = 0;
|
||||||
|
virtual IOutlineWidget *createWidget(Core::IEditor *editor) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace TextEditor
|
||||||
|
|
||||||
|
#endif // IOUTLINEWIDGET_H
|
||||||
123
src/plugins/texteditor/outlinefactory.cpp
Normal file
123
src/plugins/texteditor/outlinefactory.cpp
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
#include "outlinefactory.h"
|
||||||
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
|
#include <coreplugin/editormanager/ieditor.h>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QToolButton>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QStackedWidget>
|
||||||
|
|
||||||
|
namespace TextEditor {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
OutlineWidgetStack::OutlineWidgetStack(OutlineFactory *factory) :
|
||||||
|
QStackedWidget(),
|
||||||
|
m_factory(factory),
|
||||||
|
m_syncWithEditor(true)
|
||||||
|
{
|
||||||
|
QLabel *label = new QLabel(tr("No outline available"), this);
|
||||||
|
label->setAlignment(Qt::AlignCenter);
|
||||||
|
addWidget(label);
|
||||||
|
|
||||||
|
m_toggleSync = new QToolButton;
|
||||||
|
m_toggleSync->setIcon(QIcon(":/core/images/linkicon.png"));
|
||||||
|
m_toggleSync->setCheckable(true);
|
||||||
|
m_toggleSync->setChecked(true);
|
||||||
|
m_toggleSync->setToolTip(tr("Synchronize with Editor"));
|
||||||
|
connect(m_toggleSync, SIGNAL(clicked(bool)), this, SLOT(toggleCursorSynchronization()));
|
||||||
|
|
||||||
|
Core::EditorManager *editorManager = Core::EditorManager::instance();
|
||||||
|
connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor*)),
|
||||||
|
this, SLOT(updateCurrentEditor(Core::IEditor*)));
|
||||||
|
updateCurrentEditor(editorManager->currentEditor());
|
||||||
|
}
|
||||||
|
|
||||||
|
OutlineWidgetStack::~OutlineWidgetStack()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QToolButton *OutlineWidgetStack::toggleSyncButton()
|
||||||
|
{
|
||||||
|
return m_toggleSync;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutlineWidgetStack::isCursorSynchronized() const
|
||||||
|
{
|
||||||
|
return m_syncWithEditor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutlineWidgetStack::toggleCursorSynchronization()
|
||||||
|
{
|
||||||
|
m_syncWithEditor = !m_syncWithEditor;
|
||||||
|
if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget()))
|
||||||
|
outlineWidget->setCursorSynchronization(m_syncWithEditor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutlineWidgetStack::updateCurrentEditor(Core::IEditor *editor)
|
||||||
|
{
|
||||||
|
IOutlineWidget *newWidget = 0;
|
||||||
|
|
||||||
|
if (editor) {
|
||||||
|
foreach (IOutlineWidgetFactory *widgetFactory, m_factory->widgetFactories()) {
|
||||||
|
if (widgetFactory->supportsEditor(editor)) {
|
||||||
|
newWidget = widgetFactory->createWidget(editor);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newWidget != currentWidget()) {
|
||||||
|
// delete old widget
|
||||||
|
if (IOutlineWidget *outlineWidget = qobject_cast<IOutlineWidget*>(currentWidget())) {
|
||||||
|
removeWidget(outlineWidget);
|
||||||
|
delete outlineWidget;
|
||||||
|
}
|
||||||
|
if (newWidget) {
|
||||||
|
newWidget->setCursorSynchronization(m_syncWithEditor);
|
||||||
|
addWidget(newWidget);
|
||||||
|
setCurrentWidget(newWidget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OutlineFactory::OutlineFactory() :
|
||||||
|
Core::INavigationWidgetFactory()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<IOutlineWidgetFactory*> OutlineFactory::widgetFactories() const
|
||||||
|
{
|
||||||
|
return m_factories;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutlineFactory::setWidgetFactories(QList<IOutlineWidgetFactory*> factories)
|
||||||
|
{
|
||||||
|
m_factories = factories;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString OutlineFactory::displayName() const
|
||||||
|
{
|
||||||
|
return tr("Outline");
|
||||||
|
}
|
||||||
|
|
||||||
|
QString OutlineFactory::id() const
|
||||||
|
{
|
||||||
|
return QLatin1String("Outline");
|
||||||
|
}
|
||||||
|
|
||||||
|
QKeySequence OutlineFactory::activationSequence() const
|
||||||
|
{
|
||||||
|
return QKeySequence();
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::NavigationView OutlineFactory::createWidget()
|
||||||
|
{
|
||||||
|
Core::NavigationView n;
|
||||||
|
OutlineWidgetStack *placeHolder = new OutlineWidgetStack(this);
|
||||||
|
n.widget = placeHolder;
|
||||||
|
n.dockToolBarWidgets.append(placeHolder->toggleSyncButton());
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace TextEditor
|
||||||
63
src/plugins/texteditor/outlinefactory.h
Normal file
63
src/plugins/texteditor/outlinefactory.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#ifndef OUTLINE_H
|
||||||
|
#define OUTLINE_H
|
||||||
|
|
||||||
|
#include <texteditor/ioutlinewidget.h>
|
||||||
|
#include <coreplugin/inavigationwidgetfactory.h>
|
||||||
|
#include <QtGui/QStackedWidget>
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class IEditor;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace TextEditor {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class OutlineFactory;
|
||||||
|
|
||||||
|
class OutlineWidgetStack : public QStackedWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
OutlineWidgetStack(OutlineFactory *factory);
|
||||||
|
~OutlineWidgetStack();
|
||||||
|
|
||||||
|
QToolButton *toggleSyncButton();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isCursorSynchronized() const;
|
||||||
|
QWidget *dummyWidget() const;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void toggleCursorSynchronization();
|
||||||
|
void updateCurrentEditor(Core::IEditor *editor);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QStackedWidget *m_widgetStack;
|
||||||
|
OutlineFactory *m_factory;
|
||||||
|
QToolButton *m_toggleSync;
|
||||||
|
bool m_syncWithEditor;
|
||||||
|
};
|
||||||
|
|
||||||
|
class OutlineFactory : public Core::INavigationWidgetFactory
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
OutlineFactory();
|
||||||
|
|
||||||
|
QList<IOutlineWidgetFactory*> widgetFactories() const;
|
||||||
|
void setWidgetFactories(QList<IOutlineWidgetFactory*> factories);
|
||||||
|
|
||||||
|
// from INavigationWidgetFactory
|
||||||
|
virtual QString displayName() const;
|
||||||
|
virtual QString id() const;
|
||||||
|
virtual QKeySequence activationSequence() const;
|
||||||
|
virtual Core::NavigationView createWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<IOutlineWidgetFactory*> m_factories;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace TextEditor
|
||||||
|
|
||||||
|
#endif // OUTLINE_H
|
||||||
@@ -60,7 +60,8 @@ SOURCES += texteditorplugin.cpp \
|
|||||||
generichighlighter/highlightdefinitionmetadata.cpp \
|
generichighlighter/highlightdefinitionmetadata.cpp \
|
||||||
generichighlighter/definitiondownloader.cpp \
|
generichighlighter/definitiondownloader.cpp \
|
||||||
refactoringchanges.cpp \
|
refactoringchanges.cpp \
|
||||||
refactoroverlay.cpp
|
refactoroverlay.cpp \
|
||||||
|
outlinefactory.cpp
|
||||||
|
|
||||||
HEADERS += texteditorplugin.h \
|
HEADERS += texteditorplugin.h \
|
||||||
textfilewizard.h \
|
textfilewizard.h \
|
||||||
@@ -123,7 +124,9 @@ HEADERS += texteditorplugin.h \
|
|||||||
generichighlighter/highlightdefinitionmetadata.h \
|
generichighlighter/highlightdefinitionmetadata.h \
|
||||||
generichighlighter/definitiondownloader.h \
|
generichighlighter/definitiondownloader.h \
|
||||||
refactoringchanges.h \
|
refactoringchanges.h \
|
||||||
refactoroverlay.h
|
refactoroverlay.h \
|
||||||
|
outlinefactory.h \
|
||||||
|
ioutlinewidget.h
|
||||||
|
|
||||||
FORMS += behaviorsettingspage.ui \
|
FORMS += behaviorsettingspage.ui \
|
||||||
displaysettingspage.ui \
|
displaysettingspage.ui \
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
#include "plaintexteditor.h"
|
#include "plaintexteditor.h"
|
||||||
#include "storagesettings.h"
|
#include "storagesettings.h"
|
||||||
#include "manager.h"
|
#include "manager.h"
|
||||||
|
#include "outlinefactory.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <coreplugin/coreconstants.h>
|
#include <coreplugin/coreconstants.h>
|
||||||
@@ -144,6 +145,9 @@ bool TextEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
|
|||||||
connect(Core::ICore::instance(), SIGNAL(coreOpened()),
|
connect(Core::ICore::instance(), SIGNAL(coreOpened()),
|
||||||
Manager::instance(), SLOT(registerMimeTypes()));
|
Manager::instance(), SLOT(registerMimeTypes()));
|
||||||
|
|
||||||
|
m_outlineFactory = new OutlineFactory;
|
||||||
|
addAutoReleasedObject(m_outlineFactory);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +155,11 @@ void TextEditorPlugin::extensionsInitialized()
|
|||||||
{
|
{
|
||||||
m_editorFactory->actionHandler()->initializeActions();
|
m_editorFactory->actionHandler()->initializeActions();
|
||||||
|
|
||||||
m_searchResultWindow = ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>();
|
ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
|
||||||
|
|
||||||
|
m_searchResultWindow = pluginManager->getObject<Find::SearchResultWindow>();
|
||||||
|
|
||||||
|
m_outlineFactory->setWidgetFactories(pluginManager->getObjects<TextEditor::IOutlineWidgetFactory>());
|
||||||
|
|
||||||
connect(m_settings, SIGNAL(fontSettingsChanged(TextEditor::FontSettings)),
|
connect(m_settings, SIGNAL(fontSettingsChanged(TextEditor::FontSettings)),
|
||||||
this, SLOT(updateSearchResultsFont(TextEditor::FontSettings)));
|
this, SLOT(updateSearchResultsFont(TextEditor::FontSettings)));
|
||||||
@@ -162,6 +170,7 @@ void TextEditorPlugin::extensionsInitialized()
|
|||||||
ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>()));
|
ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>()));
|
||||||
addAutoReleasedObject(new FindInCurrentFile(
|
addAutoReleasedObject(new FindInCurrentFile(
|
||||||
ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>()));
|
ExtensionSystem::PluginManager::instance()->getObject<Find::SearchResultWindow>()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextEditorPlugin::initializeEditor(PlainTextEditor *editor)
|
void TextEditorPlugin::initializeEditor(PlainTextEditor *editor)
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ namespace Internal {
|
|||||||
|
|
||||||
class LineNumberFilter;
|
class LineNumberFilter;
|
||||||
class PlainTextEditorFactory;
|
class PlainTextEditorFactory;
|
||||||
|
class OutlineFactory;
|
||||||
|
|
||||||
class TextEditorPlugin : public ExtensionSystem::IPlugin
|
class TextEditorPlugin : public ExtensionSystem::IPlugin
|
||||||
{
|
{
|
||||||
@@ -79,6 +80,7 @@ private:
|
|||||||
PlainTextEditorFactory *m_editorFactory;
|
PlainTextEditorFactory *m_editorFactory;
|
||||||
LineNumberFilter *m_lineNumberFilter;
|
LineNumberFilter *m_lineNumberFilter;
|
||||||
Find::SearchResultWindow *m_searchResultWindow;
|
Find::SearchResultWindow *m_searchResultWindow;
|
||||||
|
OutlineFactory *m_outlineFactory;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
Reference in New Issue
Block a user