forked from qt-creator/qt-creator
Fixed null-pointer deref in copy/paste.
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user