Fixed null-pointer deref in copy/paste.

This commit is contained in:
Erik Verbruggen
2010-02-10 14:49:40 +01:00
parent 2e7ddfb914
commit b0b893acbf
6 changed files with 26 additions and 11 deletions

View File

@@ -326,7 +326,7 @@ QList<RewriterView::Error> DesignDocumentController::loadMaster(QPlainTextEdit *
connect(edit, SIGNAL(modificationChanged(bool)), connect(edit, SIGNAL(modificationChanged(bool)),
this, SIGNAL(dirtyStateChanged(bool))); this, SIGNAL(dirtyStateChanged(bool)));
m_d->textModifier = new BaseTextEditModifier(m_d->textEdit.data()); m_d->textModifier = new BaseTextEditModifier(dynamic_cast<TextEditor::BaseTextEditor*>(m_d->textEdit.data()));
m_d->componentTextModifier = 0; m_d->componentTextModifier = 0;

View File

@@ -31,6 +31,7 @@
#include <rewriterview.h> #include <rewriterview.h>
#include <basetexteditmodifier.h> #include <basetexteditmodifier.h>
#include <metainfo.h> #include <metainfo.h>
#include <plaintexteditmodifier.h>
#include <QApplication> #include <QApplication>
#include <QPlainTextEdit> #include <QPlainTextEdit>
@@ -102,7 +103,7 @@ QString DesignDocumentControllerView::toText() const
outputModel->setMetaInfo(model()->metaInfo()); outputModel->setMetaInfo(model()->metaInfo());
QPlainTextEdit textEdit; QPlainTextEdit textEdit;
textEdit.setPlainText("import Qt 4.6; Item {}"); textEdit.setPlainText("import Qt 4.6; Item {}");
BaseTextEditModifier modifier(&textEdit); NotIndentingTextEditModifier modifier(&textEdit);
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0)); QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0));
rewriterView->setTextModifier(&modifier); rewriterView->setTextModifier(&modifier);
@@ -126,7 +127,7 @@ void DesignDocumentControllerView::fromText(QString text)
QPlainTextEdit textEdit; QPlainTextEdit textEdit;
QString imports("import Qt 4.6;\n"); QString imports("import Qt 4.6;\n");
textEdit.setPlainText(imports + text); textEdit.setPlainText(imports + text);
BaseTextEditModifier modifier(&textEdit); NotIndentingTextEditModifier modifier(&textEdit);
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0)); QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0));
rewriterView->setTextModifier(&modifier); rewriterView->setTextModifier(&modifier);

View File

@@ -34,12 +34,14 @@
#include "corelib_global.h" #include "corelib_global.h"
#include "plaintexteditmodifier.h" #include "plaintexteditmodifier.h"
#include <texteditor/basetexteditor.h>
namespace QmlDesigner { namespace QmlDesigner {
class CORESHARED_EXPORT BaseTextEditModifier: public PlainTextEditModifier class CORESHARED_EXPORT BaseTextEditModifier: public PlainTextEditModifier
{ {
public: public:
BaseTextEditModifier(QPlainTextEdit *textEdit); BaseTextEditModifier(TextEditor::BaseTextEditor *textEdit);
virtual void indent(int offset, int length); virtual void indent(int offset, int length);

View File

@@ -66,6 +66,8 @@ public:
virtual void move(const MoveInfo &moveInfo); virtual void move(const MoveInfo &moveInfo);
virtual void indent(int offset, int length) = 0; virtual void indent(int offset, int length) = 0;
virtual int indentDepth() const = 0;
virtual void startGroup(); virtual void startGroup();
virtual void flushGroup(); virtual void flushGroup();
virtual void commitGroup(); virtual void commitGroup();
@@ -91,6 +93,20 @@ private:
bool m_ongoingTextChange; bool m_ongoingTextChange;
}; };
class CORESHARED_EXPORT NotIndentingTextEditModifier: public PlainTextEditModifier
{
public:
NotIndentingTextEditModifier(QPlainTextEdit *textEdit)
: PlainTextEditModifier(textEdit)
{}
virtual void indent(int /*offset*/, int /*length*/)
{}
virtual int indentDepth() const
{ return 0; }
};
} }
#endif // PLAINTEXTEDITMODIFIER_H #endif // PLAINTEXTEDITMODIFIER_H

View File

@@ -29,12 +29,11 @@
#include "basetexteditmodifier.h" #include "basetexteditmodifier.h"
#include <texteditor/basetexteditor.h>
#include <texteditor/tabsettings.h> #include <texteditor/tabsettings.h>
using namespace QmlDesigner; using namespace QmlDesigner;
BaseTextEditModifier::BaseTextEditModifier(QPlainTextEdit *textEdit): BaseTextEditModifier::BaseTextEditModifier(TextEditor::BaseTextEditor *textEdit):
PlainTextEditModifier(textEdit) PlainTextEditModifier(textEdit)
{ {
} }
@@ -44,9 +43,7 @@ void BaseTextEditModifier::indent(int offset, int length)
if (length == 0 || offset < 0 || offset + length >= text().length()) if (length == 0 || offset < 0 || offset + length >= text().length())
return; return;
// qDebug() << "PlainTextEditModifier::indent(" << offset << "," << length << ")";
if (TextEditor::BaseTextEditor *bte = dynamic_cast<TextEditor::BaseTextEditor*>(plainTextEdit())) { if (TextEditor::BaseTextEditor *bte = dynamic_cast<TextEditor::BaseTextEditor*>(plainTextEdit())) {
// qDebug() << "**** Doing indentation";
// find the applicable block: // find the applicable block:
QTextDocument *doc = bte->document(); QTextDocument *doc = bte->document();
QTextCursor tc(doc); QTextCursor tc(doc);
@@ -55,8 +52,6 @@ void BaseTextEditModifier::indent(int offset, int length)
tc.setPosition(offset + length, QTextCursor::KeepAnchor); tc.setPosition(offset + length, QTextCursor::KeepAnchor);
bte->indentInsertedText(tc); bte->indentInsertedText(tc);
tc.endEditBlock(); tc.endEditBlock();
} else {
// qDebug() << "**** Skipping indentation";
} }
} }
@@ -65,7 +60,6 @@ int BaseTextEditModifier::indentDepth() const
if (TextEditor::BaseTextEditor *bte = dynamic_cast<TextEditor::BaseTextEditor*>(plainTextEdit())) { if (TextEditor::BaseTextEditor *bte = dynamic_cast<TextEditor::BaseTextEditor*>(plainTextEdit())) {
return bte->tabSettings().m_indentSize; return bte->tabSettings().m_indentSize;
} else { } else {
Q_ASSERT(false && "BaseTextEditModifier does not have a BaseTextEditor");
return 0; return 0;
} }
} }

View File

@@ -46,6 +46,8 @@ PlainTextEditModifier::PlainTextEditModifier(QPlainTextEdit *textEdit):
m_pendingChangeSignal(false), m_pendingChangeSignal(false),
m_ongoingTextChange(false) m_ongoingTextChange(false)
{ {
Q_ASSERT(textEdit);
connect(m_textEdit, SIGNAL(textChanged()), connect(m_textEdit, SIGNAL(textChanged()),
this, SLOT(textEditChanged())); this, SLOT(textEditChanged()));
} }