summaryrefslogtreecommitdiff
path: root/src/plugins/texteditor
diff options
context:
space:
mode:
authorLeandro Melo <leandro.melo@nokia.com>2010-11-05 14:27:16 +0100
committerLeandro Melo <leandro.melo@nokia.com>2010-11-05 14:28:38 +0100
commit3a684586fabf103b8e09cef31a18ffae1fd9f0c7 (patch)
treeffa3f74bd66d01f3ed1aca89c5e0ed0e65b936b0 /src/plugins/texteditor
parent1afea78c7d0f6c37f5ff6c06bfc19f0445a34875 (diff)
downloadqt-creator-3a684586fabf103b8e09cef31a18ffae1fd9f0c7.tar.gz
Editors: Refactor indenters out of the editors for better reusability.
Reviewed-by: ckamm
Diffstat (limited to 'src/plugins/texteditor')
-rw-r--r--src/plugins/texteditor/basetexteditor.cpp63
-rw-r--r--src/plugins/texteditor/basetexteditor.h12
-rw-r--r--src/plugins/texteditor/basetexteditor_p.h3
-rw-r--r--src/plugins/texteditor/indenter.cpp78
-rw-r--r--src/plugins/texteditor/indenter.h26
-rw-r--r--src/plugins/texteditor/normalindenter.cpp8
-rw-r--r--src/plugins/texteditor/normalindenter.h6
-rw-r--r--src/plugins/texteditor/plaintexteditor.cpp9
-rw-r--r--src/plugins/texteditor/plaintexteditor.h2
9 files changed, 137 insertions, 70 deletions
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 9e356311bc..7457634afd 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -42,6 +42,7 @@
#include "syntaxhighlighter.h"
#include "tooltip.h"
#include "tipcontents.h"
+#include "indenter.h"
#include <aggregation/aggregate.h>
#include <coreplugin/actionmanager/actionmanager.h>
@@ -1877,6 +1878,17 @@ int BaseTextEditor::visibleWrapColumn() const
return d->m_visibleWrapColumn;
}
+void BaseTextEditor::setIndenter(Indenter *indenter)
+{
+ // clear out existing code formatter data
+ for (QTextBlock it = document()->begin(); it.isValid(); it = it.next()) {
+ TextEditor::TextBlockUserData *userData = BaseTextDocumentLayout::testUserData(it);
+ if (userData)
+ userData->setCodeFormatterData(0);
+ }
+ d->m_indenter.reset(indenter);
+}
+
//--------- BaseTextEditorPrivate -----------
BaseTextEditorPrivate::BaseTextEditorPrivate()
@@ -3995,8 +4007,10 @@ void BaseTextEditor::zoomReset()
emit requestZoomReset();
}
-bool BaseTextEditor::isElectricCharacter(QChar) const
+bool BaseTextEditor::isElectricCharacter(QChar ch) const
{
+ if (!d->m_indenter.isNull())
+ return d->m_indenter->isElectricCharacter(ch);
return false;
}
@@ -4256,59 +4270,26 @@ int BaseTextEditor::paragraphSeparatorAboutToBeInserted(QTextCursor &cursor)
return 1;
}
-void BaseTextEditor::indentBlock(QTextDocument *, QTextBlock, QChar)
+void BaseTextEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar ch)
{
+ if (!d->m_indenter.isNull())
+ d->m_indenter->indentBlock(doc, block, ch, this);
}
void BaseTextEditor::indent(QTextDocument *doc, const QTextCursor &cursor, QChar typedChar)
{
maybeClearSomeExtraSelections(cursor);
- if (cursor.hasSelection()) {
- QTextBlock block = doc->findBlock(cursor.selectionStart());
- const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next();
- do {
- indentBlock(doc, block, typedChar);
- block = block.next();
- } while (block.isValid() && block != end);
- } else {
- indentBlock(doc, cursor.block(), typedChar);
- }
+ if (!d->m_indenter.isNull())
+ d->m_indenter->indent(doc, cursor, typedChar, this);
}
void BaseTextEditor::reindent(QTextDocument *doc, const QTextCursor &cursor)
{
maybeClearSomeExtraSelections(cursor);
- if (cursor.hasSelection()) {
- QTextBlock block = doc->findBlock(cursor.selectionStart());
- const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next();
-
- const TabSettings &ts = d->m_document->tabSettings();
-
- // skip empty blocks
- while (block.isValid() && block != end) {
- QString bt = block.text();
- if (ts.firstNonSpace(bt) < bt.size())
- break;
- indentBlock(doc, block, QChar::Null);
- block = block.next();
- }
-
- int previousIndentation = ts.indentationColumn(block.text());
- indentBlock(doc, block, QChar::Null);
- int currentIndentation = ts.indentationColumn(block.text());
- int delta = currentIndentation - previousIndentation;
-
- block = block.next();
- while (block.isValid() && block != end) {
- ts.reindentLine(block, delta);
- block = block.next();
- }
- } else {
- indentBlock(doc, cursor.block(), QChar::Null);
- }
+ if (!d->m_indenter.isNull())
+ d->m_indenter->reindent(doc, cursor, this);
}
-
BaseTextEditor::Link BaseTextEditor::findLinkAt(const QTextCursor &, bool)
{
return Link();
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index ec51a3f86b..77caa0ff1c 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -68,6 +68,7 @@ class BehaviorSettings;
class CompletionSettings;
class DisplaySettings;
class StorageSettings;
+class Indenter;
class TEXTEDITOR_EXPORT BaseTextEditorAnimator : public QObject
{
@@ -222,6 +223,8 @@ public:
QRegion translatedLineRegion(int lineStart, int lineEnd) const;
+ void setIndenter(Indenter *indenter);
+
public slots:
void setDisplayName(const QString &title);
@@ -409,17 +412,16 @@ protected:
void dragEnterEvent(QDragEnterEvent *e);
public:
- // Returns true if key triggers an indent.
- virtual bool isElectricCharacter(QChar ch) const;
-
- void indentInsertedText(const QTextCursor &tc);
-
// Returns the text to complete at the cursor position, or an empty string
virtual QString autoComplete(QTextCursor &cursor, const QString &text) const;
// Handles backspace. When returning true, backspace processing is stopped
virtual bool autoBackspace(QTextCursor &cursor);
// Hook to insert special characters on enter. Returns the number of extra blocks inserted.
virtual int paragraphSeparatorAboutToBeInserted(QTextCursor &cursor);
+
+ void indentInsertedText(const QTextCursor &tc);
+ // Returns true if key triggers an indent.
+ virtual bool isElectricCharacter(QChar ch) const;
// Indent a text block based on previous line. Default does nothing
virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
// Indent at cursor. Calls indentBlock for selection or current line.
diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h
index ccdae6c4d0..bc6a3365ea 100644
--- a/src/plugins/texteditor/basetexteditor_p.h
+++ b/src/plugins/texteditor/basetexteditor_p.h
@@ -42,6 +42,7 @@
#include <QtCore/QBasicTimer>
#include <QtCore/QSharedData>
#include <QtCore/QPointer>
+#include <QtCore/QScopedPointer>
#include <QtGui/QPixmap>
#include <QtGui/QTextEdit>
@@ -292,6 +293,8 @@ public:
QPointer<BaseTextEditorAnimator> m_animator;
int m_cursorBlockNumber;
+
+ QScopedPointer<Indenter> m_indenter;
};
} // namespace Internal
diff --git a/src/plugins/texteditor/indenter.cpp b/src/plugins/texteditor/indenter.cpp
index ee2edc642a..8007b4209e 100644
--- a/src/plugins/texteditor/indenter.cpp
+++ b/src/plugins/texteditor/indenter.cpp
@@ -28,6 +28,7 @@
**************************************************************************/
#include "indenter.h"
+#include "basetexteditor.h"
#include "tabsettings.h"
using namespace TextEditor;
@@ -38,10 +39,79 @@ Indenter::Indenter()
Indenter::~Indenter()
{}
+bool Indenter::isElectricCharacter(const QChar &ch) const
+{
+ return doIsElectricalCharacter(ch);
+}
+
void Indenter::indentBlock(QTextDocument *doc,
- QTextBlock block,
- QChar typedChar,
- const TabSettings &ts)
+ const QTextBlock &block,
+ const QChar &typedChar,
+ BaseTextEditor *editor)
+{
+ doIndentBlock(doc, block, typedChar, editor);
+}
+
+void Indenter::indent(QTextDocument *doc,
+ const QTextCursor &cursor,
+ const QChar &typedChar,
+ BaseTextEditor *editor)
+{
+ doIndent(doc, cursor, typedChar, editor);
+}
+
+void Indenter::reindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor)
+{
+ doReindent(doc, cursor, editor);
+}
+
+bool Indenter::doIsElectricalCharacter(const QChar &) const
+{
+ return false;
+}
+
+void Indenter::doIndent(QTextDocument *doc, const QTextCursor &cursor, const QChar &typedChar, BaseTextEditor *editor)
{
- doIndentBlock(doc, block, typedChar, ts);
+ if (cursor.hasSelection()) {
+ QTextBlock block = doc->findBlock(cursor.selectionStart());
+ const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next();
+ do {
+ indentBlock(doc, block, typedChar, editor);
+ block = block.next();
+ } while (block.isValid() && block != end);
+ } else {
+ indentBlock(doc, cursor.block(), typedChar, editor);
+ }
+}
+
+void Indenter::doReindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor)
+{
+ if (cursor.hasSelection()) {
+ QTextBlock block = doc->findBlock(cursor.selectionStart());
+ const QTextBlock end = doc->findBlock(cursor.selectionEnd()).next();
+
+ const TabSettings &ts = editor->tabSettings();
+
+ // skip empty blocks
+ while (block.isValid() && block != end) {
+ QString bt = block.text();
+ if (ts.firstNonSpace(bt) < bt.size())
+ break;
+ indentBlock(doc, block, QChar::Null, editor);
+ block = block.next();
+ }
+
+ int previousIndentation = ts.indentationColumn(block.text());
+ indentBlock(doc, block, QChar::Null, editor);
+ int currentIndentation = ts.indentationColumn(block.text());
+ int delta = currentIndentation - previousIndentation;
+
+ block = block.next();
+ while (block.isValid() && block != end) {
+ ts.reindentLine(block, delta);
+ block = block.next();
+ }
+ } else {
+ indentBlock(doc, cursor.block(), QChar::Null, editor);
+ }
}
diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h
index 51b2131b28..3a58f56912 100644
--- a/src/plugins/texteditor/indenter.h
+++ b/src/plugins/texteditor/indenter.h
@@ -37,11 +37,12 @@
QT_BEGIN_NAMESPACE
class QTextDocument;
+class QTextCursor;
QT_END_NAMESPACE
namespace TextEditor {
-class TabSettings;
+class BaseTextEditor;
class TEXTEDITOR_EXPORT Indenter
{
@@ -49,13 +50,28 @@ public:
Indenter();
virtual ~Indenter();
- void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar, const TabSettings &ts);
+ bool isElectricCharacter(const QChar &ch) const;
+ void indentBlock(QTextDocument *doc,
+ const QTextBlock &block,
+ const QChar &typedChar,
+ BaseTextEditor *editor);
+ void indent(QTextDocument *doc,
+ const QTextCursor &cursor,
+ const QChar &typedChar,
+ BaseTextEditor *editor);
+ void reindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor);
private:
+ virtual bool doIsElectricalCharacter(const QChar &ch) const;
virtual void doIndentBlock(QTextDocument *doc,
- QTextBlock block,
- QChar typedChar,
- const TabSettings &ts) = 0;
+ const QTextBlock &block,
+ const QChar &typedChar,
+ BaseTextEditor *editor) = 0;
+ virtual void doIndent(QTextDocument *doc,
+ const QTextCursor &cursor,
+ const QChar &typedChar,
+ BaseTextEditor *editor);
+ virtual void doReindent(QTextDocument *doc, const QTextCursor &cursor, BaseTextEditor *editor);
};
} // namespace TextEditor
diff --git a/src/plugins/texteditor/normalindenter.cpp b/src/plugins/texteditor/normalindenter.cpp
index 7a6eb1398c..d0c84b210f 100644
--- a/src/plugins/texteditor/normalindenter.cpp
+++ b/src/plugins/texteditor/normalindenter.cpp
@@ -29,6 +29,7 @@
#include "normalindenter.h"
#include "tabsettings.h"
+#include "basetexteditor.h"
#include <QtGui/QTextDocument>
@@ -60,9 +61,9 @@ NormalIndenter::~NormalIndenter()
// to do in 2 steps (indenting/wrapping)}
//
void NormalIndenter::doIndentBlock(QTextDocument *doc,
- QTextBlock block,
- QChar typedChar,
- const TextEditor::TabSettings &ts)
+ const QTextBlock &block,
+ const QChar &typedChar,
+ BaseTextEditor *editor)
{
Q_UNUSED(typedChar)
@@ -78,6 +79,7 @@ void NormalIndenter::doIndentBlock(QTextDocument *doc,
// Just use previous line.
// Skip blank characters when determining the indentation
+ const TabSettings &ts = editor->tabSettings();
int i = 0;
while (i < previousText.size()) {
if (!previousText.at(i).isSpace()) {
diff --git a/src/plugins/texteditor/normalindenter.h b/src/plugins/texteditor/normalindenter.h
index 7014f9ce3a..f66bbaef0a 100644
--- a/src/plugins/texteditor/normalindenter.h
+++ b/src/plugins/texteditor/normalindenter.h
@@ -42,9 +42,9 @@ public:
private:
virtual void doIndentBlock(QTextDocument *doc,
- QTextBlock block,
- QChar typedChar,
- const TabSettings &ts);
+ const QTextBlock &block,
+ const QChar &typedChar,
+ BaseTextEditor *editor);
};
} // namespace TextEditor
diff --git a/src/plugins/texteditor/plaintexteditor.cpp b/src/plugins/texteditor/plaintexteditor.cpp
index ea1a0b0a2c..2a738b9cfa 100644
--- a/src/plugins/texteditor/plaintexteditor.cpp
+++ b/src/plugins/texteditor/plaintexteditor.cpp
@@ -63,13 +63,13 @@ PlainTextEditorEditable::PlainTextEditorEditable(PlainTextEditor *editor)
PlainTextEditor::PlainTextEditor(QWidget *parent)
: BaseTextEditor(parent),
m_isMissingSyntaxDefinition(false),
- m_ignoreMissingSyntaxDefinition(false),
- m_indenter(new NormalIndenter) // Currently only "normal" indentation is supported.
+ m_ignoreMissingSyntaxDefinition(false)
{
setRevisionsVisible(true);
setMarksVisible(true);
setRequestMarkEnabled(false);
setLineSeparatorsAllowed(true);
+ setIndenter(new NormalIndenter); // Currently only "normal" indentation is supported.
setMimeType(QLatin1String(TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT));
setDisplayName(tr(Core::Constants::K_DEFAULT_TEXT_EDITOR_DISPLAY_NAME));
@@ -230,11 +230,6 @@ QString PlainTextEditor::findDefinitionId(const Core::MimeType &mimeType,
return definitionId;
}
-void PlainTextEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar)
-{
- m_indenter->indentBlock(doc, block, typedChar, tabSettings());
-}
-
void PlainTextEditor::acceptMissingSyntaxDefinitionInfo()
{
Core::ICore::instance()->showOptionsDialog(Constants::TEXT_EDITOR_SETTINGS_CATEGORY,
diff --git a/src/plugins/texteditor/plaintexteditor.h b/src/plugins/texteditor/plaintexteditor.h
index 45ae953271..193bba6efd 100644
--- a/src/plugins/texteditor/plaintexteditor.h
+++ b/src/plugins/texteditor/plaintexteditor.h
@@ -89,14 +89,12 @@ signals:
protected:
virtual BaseTextEditorEditable *createEditableInterface() { return new PlainTextEditorEditable(this); }
- virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar);
private:
QString findDefinitionId(const Core::MimeType &mimeType, bool considerParents) const;
bool m_isMissingSyntaxDefinition;
bool m_ignoreMissingSyntaxDefinition;
- QScopedPointer<Indenter> m_indenter;
Utils::CommentDefinition m_commentDefinition;
};