diff --git a/src/plugins/duieditor/duidocument.cpp b/src/plugins/duieditor/duidocument.cpp index 5cee3404c8535ab49164ee8fda8081cbfecd2ee6..40a546d15423f535ac2a0bc534028a3ccb95b54b 100644 --- a/src/plugins/duieditor/duidocument.cpp +++ b/src/plugins/duieditor/duidocument.cpp @@ -28,66 +28,66 @@ **************************************************************************/ #include "duidocument.h" -#include "parser/javascriptast_p.h" -#include "parser/javascriptlexer_p.h" -#include "parser/javascriptparser_p.h" -#include "parser/javascriptengine_p.h" -#include "parser/javascriptnodepool_p.h" +#include "javascriptast_p.h" +#include "javascriptlexer_p.h" +#include "javascriptparser_p.h" +#include "javascriptengine_p.h" +#include "javascriptnodepool_p.h" using namespace DuiEditor; using namespace DuiEditor::Internal; using namespace JavaScript; DuiDocument::DuiDocument(const QString &fileName) - : _engine(0), _pool(0), _program(0), _fileName(fileName) + : _engine(0), _pool(0), _program(0), _fileName(fileName) { } DuiDocument::~DuiDocument() { - delete _engine; - delete _pool; + delete _engine; + delete _pool; } DuiDocument::Ptr DuiDocument::create(const QString &fileName) { - DuiDocument::Ptr doc(new DuiDocument(fileName)); - return doc; + DuiDocument::Ptr doc(new DuiDocument(fileName)); + return doc; } AST::UiProgram *DuiDocument::program() const { - return _program; + return _program; } QList<DiagnosticMessage> DuiDocument::diagnosticMessages() const { - return _diagnosticMessages; + return _diagnosticMessages; } void DuiDocument::setSource(const QString &source) { - _source = source; + _source = source; } bool DuiDocument::parse() { - Q_ASSERT(! _engine); - Q_ASSERT(! _pool); - Q_ASSERT(! _program); + Q_ASSERT(! _engine); + Q_ASSERT(! _pool); + Q_ASSERT(! _program); - _engine = new Engine(); - _pool = new NodePool(_fileName, _engine); + _engine = new Engine(); + _pool = new NodePool(_fileName, _engine); - Lexer lexer(_engine); - Parser parser(_engine); + Lexer lexer(_engine); + Parser parser(_engine); - lexer.setCode(_source, /*line = */ 1); + lexer.setCode(_source, /*line = */ 1); - bool parsed = parser.parse(); - _program = parser.ast(); - _diagnosticMessages = parser.diagnosticMessages(); - return parsed; + bool parsed = parser.parse(); + _program = parser.ast(); + _diagnosticMessages = parser.diagnosticMessages(); + return parsed; } Snapshot::Snapshot() diff --git a/src/plugins/duieditor/duidocument.h b/src/plugins/duieditor/duidocument.h index fc95b4c64de89695e0890a7a3f20a9c3332def29..f02d33cbaaac2adc614dce2012fb7aa801c31fc2 100644 --- a/src/plugins/duieditor/duidocument.h +++ b/src/plugins/duieditor/duidocument.h @@ -33,8 +33,8 @@ #include <QtCore/QMap> #include <QtCore/QString> -#include "parser/javascriptengine_p.h" -#include "parser/javascriptastfwd_p.h" +#include "javascriptengine_p.h" +#include "javascriptastfwd_p.h" namespace DuiEditor { namespace Internal { @@ -42,36 +42,36 @@ namespace Internal { class DuiDocument { public: - typedef QSharedPointer<DuiDocument> Ptr; + typedef QSharedPointer<DuiDocument> Ptr; protected: - DuiDocument(const QString &fileName); + DuiDocument(const QString &fileName); public: - ~DuiDocument(); + ~DuiDocument(); - static DuiDocument::Ptr create(const QString &fileName); + static DuiDocument::Ptr create(const QString &fileName); - JavaScript::AST::UiProgram *program() const; - QList<JavaScript::DiagnosticMessage> diagnosticMessages() const; + JavaScript::AST::UiProgram *program() const; + QList<JavaScript::DiagnosticMessage> diagnosticMessages() const; - void setSource(const QString &source); - bool parse(); + void setSource(const QString &source); + bool parse(); private: - JavaScript::Engine *_engine; - JavaScript::NodePool *_pool; - JavaScript::AST::UiProgram *_program; - QList<JavaScript::DiagnosticMessage> _diagnosticMessages; - QString _fileName; - QString _source; + JavaScript::Engine *_engine; + JavaScript::NodePool *_pool; + JavaScript::AST::UiProgram *_program; + QList<JavaScript::DiagnosticMessage> _diagnosticMessages; + QString _fileName; + QString _source; }; class Snapshot: public QMap<QString, DuiDocument> { public: - Snapshot(); - ~Snapshot(); + Snapshot(); + ~Snapshot(); }; } // end of namespace Internal diff --git a/src/plugins/duieditor/duieditor.cpp b/src/plugins/duieditor/duieditor.cpp index d6ab9a135998c66f2df936281d0d11836a8469a4..80155b56df2ac749321417b0fd05fc7218d765b8 100644 --- a/src/plugins/duieditor/duieditor.cpp +++ b/src/plugins/duieditor/duieditor.cpp @@ -33,11 +33,11 @@ #include "duieditorplugin.h" #include "duidocument.h" -#include "rewriter/rewriter.h" +#include "rewriter_p.h" -#include "parser/javascriptastvisitor_p.h" -#include "parser/javascriptast_p.h" -#include "parser/javascriptengine_p.h" +#include "javascriptastvisitor_p.h" +#include "javascriptast_p.h" +#include "javascriptengine_p.h" #include <coreplugin/icore.h> #include <coreplugin/actionmanager/actionmanager.h> @@ -58,7 +58,7 @@ #include <QtGui/QMainWindow> enum { - UPDATE_DOCUMENT_DEFAULT_INTERVAL = 250 + UPDATE_DOCUMENT_DEFAULT_INTERVAL = 250 }; using namespace JavaScript; @@ -71,320 +71,320 @@ namespace Internal { class FindWords: protected Visitor { public: - QStringList operator()(AST::Node *node) - { - _words.clear(); - accept(node); - return QStringList(_words.toList()); - } + QStringList operator()(AST::Node *node) + { + _words.clear(); + accept(node); + return QStringList(_words.toList()); + } protected: - void accept(AST::Node *node) - { AST::Node::acceptChild(node, this); } - - using Visitor::visit; - using Visitor::endVisit; - - void addWords(AST::UiQualifiedId *id) - { - for (; id; id = id->next) { - if (id->name) - _words.insert(id->name->asString()); - } - } - - virtual bool visit(AST::UiPublicMember *node) - { - if (node->name) - _words.insert(node->name->asString()); - - return true; - } - - virtual bool visit(AST::UiQualifiedId *node) - { - if (node->name) - _words.insert(node->name->asString()); - - return true; - } - - virtual bool visit(AST::IdentifierExpression *node) - { - if (node->name) - _words.insert(node->name->asString()); - - return true; - } - - virtual bool visit(AST::FieldMemberExpression *node) - { - if (node->name) - _words.insert(node->name->asString()); - - return true; - } - - virtual bool visit(AST::FunctionExpression *node) - { - if (node->name) - _words.insert(node->name->asString()); - - for (AST::FormalParameterList *it = node->formals; it; it = it->next) { - if (it->name) - _words.insert(it->name->asString()); - } - - return true; - } - - virtual bool visit(AST::FunctionDeclaration *node) - { - if (node->name) - _words.insert(node->name->asString()); - - for (AST::FormalParameterList *it = node->formals; it; it = it->next) { - if (it->name) - _words.insert(it->name->asString()); - } - - return true; - } - - virtual bool visit(AST::VariableDeclaration *node) - { - if (node->name) - _words.insert(node->name->asString()); - - return true; - } + void accept(AST::Node *node) + { AST::Node::acceptChild(node, this); } + + using Visitor::visit; + using Visitor::endVisit; + + void addWords(AST::UiQualifiedId *id) + { + for (; id; id = id->next) { + if (id->name) + _words.insert(id->name->asString()); + } + } + + virtual bool visit(AST::UiPublicMember *node) + { + if (node->name) + _words.insert(node->name->asString()); + + return true; + } + + virtual bool visit(AST::UiQualifiedId *node) + { + if (node->name) + _words.insert(node->name->asString()); + + return true; + } + + virtual bool visit(AST::IdentifierExpression *node) + { + if (node->name) + _words.insert(node->name->asString()); + + return true; + } + + virtual bool visit(AST::FieldMemberExpression *node) + { + if (node->name) + _words.insert(node->name->asString()); + + return true; + } + + virtual bool visit(AST::FunctionExpression *node) + { + if (node->name) + _words.insert(node->name->asString()); + + for (AST::FormalParameterList *it = node->formals; it; it = it->next) { + if (it->name) + _words.insert(it->name->asString()); + } + + return true; + } + + virtual bool visit(AST::FunctionDeclaration *node) + { + if (node->name) + _words.insert(node->name->asString()); + + for (AST::FormalParameterList *it = node->formals; it; it = it->next) { + if (it->name) + _words.insert(it->name->asString()); + } + + return true; + } + + virtual bool visit(AST::VariableDeclaration *node) + { + if (node->name) + _words.insert(node->name->asString()); + + return true; + } private: - QSet<QString> _words; + QSet<QString> _words; }; class FindIdDeclarations: protected Visitor { public: - typedef QMap<QString, QList<AST::SourceLocation> > Result; + typedef QMap<QString, QList<AST::SourceLocation> > Result; - Result operator()(AST::Node *node) - { - _ids.clear(); - _maybeIds.clear(); - accept(node); - return _ids; - } + Result operator()(AST::Node *node) + { + _ids.clear(); + _maybeIds.clear(); + accept(node); + return _ids; + } protected: - QString asString(AST::UiQualifiedId *id) - { - QString text; - for (; id; id = id->next) { - if (id->name) - text += id->name->asString(); - else - text += QLatin1Char('?'); - - if (id->next) - text += QLatin1Char('.'); - } - - return text; - } - - void accept(AST::Node *node) - { AST::Node::acceptChild(node, this); } - - using Visitor::visit; - using Visitor::endVisit; - - virtual bool visit(AST::UiScriptBinding *node) - { - if (asString(node->qualifiedId) == QLatin1String("id")) { - if (AST::ExpressionStatement *stmt = AST::cast<AST::ExpressionStatement*>(node->statement)) { - if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(stmt->expression)) { - if (idExpr->name) { - const QString id = idExpr->name->asString(); - QList<AST::SourceLocation> *locs = &_ids[id]; - locs->append(idExpr->firstSourceLocation()); - locs->append(_maybeIds.value(id)); - _maybeIds.remove(id); - return false; - } - } - } - } - - accept(node->statement); - - return false; - } - - virtual bool visit(AST::IdentifierExpression *node) - { - if (node->name) { - const QString name = node->name->asString(); - - if (_ids.contains(name)) - _ids[name].append(node->identifierToken); - else - _maybeIds[name].append(node->identifierToken); - } - return false; - } + QString asString(AST::UiQualifiedId *id) + { + QString text; + for (; id; id = id->next) { + if (id->name) + text += id->name->asString(); + else + text += QLatin1Char('?'); + + if (id->next) + text += QLatin1Char('.'); + } + + return text; + } + + void accept(AST::Node *node) + { AST::Node::acceptChild(node, this); } + + using Visitor::visit; + using Visitor::endVisit; + + virtual bool visit(AST::UiScriptBinding *node) + { + if (asString(node->qualifiedId) == QLatin1String("id")) { + if (AST::ExpressionStatement *stmt = AST::cast<AST::ExpressionStatement*>(node->statement)) { + if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(stmt->expression)) { + if (idExpr->name) { + const QString id = idExpr->name->asString(); + QList<AST::SourceLocation> *locs = &_ids[id]; + locs->append(idExpr->firstSourceLocation()); + locs->append(_maybeIds.value(id)); + _maybeIds.remove(id); + return false; + } + } + } + } + + accept(node->statement); + + return false; + } + + virtual bool visit(AST::IdentifierExpression *node) + { + if (node->name) { + const QString name = node->name->asString(); + + if (_ids.contains(name)) + _ids[name].append(node->identifierToken); + else + _maybeIds[name].append(node->identifierToken); + } + return false; + } private: - Result _ids; - Result _maybeIds; + Result _ids; + Result _maybeIds; }; class FindDeclarations: protected Visitor { - QList<Declaration> _declarations; - int _depth; + QList<Declaration> _declarations; + int _depth; public: - QList<Declaration> operator()(AST::Node *node) - { - _depth = -1; - _declarations.clear(); - accept(node); - return _declarations; - } + QList<Declaration> operator()(AST::Node *node) + { + _depth = -1; + _declarations.clear(); + accept(node); + return _declarations; + } protected: - using Visitor::visit; - using Visitor::endVisit; + using Visitor::visit; + using Visitor::endVisit; - QString asString(AST::UiQualifiedId *id) - { - QString text; - for (; id; id = id->next) { - if (id->name) - text += id->name->asString(); - else - text += QLatin1Char('?'); + QString asString(AST::UiQualifiedId *id) + { + QString text; + for (; id; id = id->next) { + if (id->name) + text += id->name->asString(); + else + text += QLatin1Char('?'); - if (id->next) - text += QLatin1Char('.'); - } + if (id->next) + text += QLatin1Char('.'); + } - return text; - } + return text; + } - void accept(AST::Node *node) - { AST::Node::acceptChild(node, this); } + void accept(AST::Node *node) + { AST::Node::acceptChild(node, this); } - void init(Declaration *decl, AST::UiObjectMember *member) - { - const SourceLocation first = member->firstSourceLocation(); - const SourceLocation last = member->lastSourceLocation(); - decl->startLine = first.startLine; - decl->startColumn = first.startColumn; - decl->endLine = last.startLine; - decl->endColumn = last.startColumn + last.length; - } + void init(Declaration *decl, AST::UiObjectMember *member) + { + const SourceLocation first = member->firstSourceLocation(); + const SourceLocation last = member->lastSourceLocation(); + decl->startLine = first.startLine; + decl->startColumn = first.startColumn; + decl->endLine = last.startLine; + decl->endColumn = last.startColumn + last.length; + } - virtual bool visit(AST::UiObjectDefinition *node) - { - ++_depth; + virtual bool visit(AST::UiObjectDefinition *node) + { + ++_depth; - Declaration decl; - init(&decl, node); + Declaration decl; + init(&decl, node); - decl.text.fill(QLatin1Char(' '), _depth); - if (node->qualifiedTypeNameId) - decl.text.append(asString(node->qualifiedTypeNameId)); - else - decl.text.append(QLatin1Char('?')); + decl.text.fill(QLatin1Char(' '), _depth); + if (node->qualifiedTypeNameId) + decl.text.append(asString(node->qualifiedTypeNameId)); + else + decl.text.append(QLatin1Char('?')); - _declarations.append(decl); + _declarations.append(decl); - return true; // search for more bindings - } + return true; // search for more bindings + } - virtual void endVisit(AST::UiObjectDefinition *) - { - --_depth; - } + virtual void endVisit(AST::UiObjectDefinition *) + { + --_depth; + } - virtual bool visit(AST::UiObjectBinding *node) - { - ++_depth; + virtual bool visit(AST::UiObjectBinding *node) + { + ++_depth; - Declaration decl; - init(&decl, node); + Declaration decl; + init(&decl, node); - decl.text.fill(QLatin1Char(' '), _depth); + decl.text.fill(QLatin1Char(' '), _depth); - decl.text.append(asString(node->qualifiedId)); - decl.text.append(QLatin1String(": ")); + decl.text.append(asString(node->qualifiedId)); + decl.text.append(QLatin1String(": ")); - if (node->qualifiedTypeNameId) - decl.text.append(asString(node->qualifiedTypeNameId)); - else - decl.text.append(QLatin1Char('?')); + if (node->qualifiedTypeNameId) + decl.text.append(asString(node->qualifiedTypeNameId)); + else + decl.text.append(QLatin1Char('?')); - _declarations.append(decl); + _declarations.append(decl); - return true; // search for more bindings - } + return true; // search for more bindings + } - virtual void endVisit(AST::UiObjectBinding *) - { - --_depth; - } + virtual void endVisit(AST::UiObjectBinding *) + { + --_depth; + } #if 0 // ### ignore script bindings for now. - virtual bool visit(AST::UiScriptBinding *node) - { - ++_depth; + virtual bool visit(AST::UiScriptBinding *node) + { + ++_depth; - Declaration decl; - init(&decl, node); + Declaration decl; + init(&decl, node); - decl.text.fill(QLatin1Char(' '), _depth); - decl.text.append(asString(node->qualifiedId)); + decl.text.fill(QLatin1Char(' '), _depth); + decl.text.append(asString(node->qualifiedId)); - _declarations.append(decl); + _declarations.append(decl); - return false; // more more bindings in this subtree. - } + return false; // more more bindings in this subtree. + } - virtual void endVisit(AST::UiScriptBinding *) - { - --_depth; - } + virtual void endVisit(AST::UiScriptBinding *) + { + --_depth; + } #endif }; ScriptEditorEditable::ScriptEditorEditable(ScriptEditor *editor, const QList<int>& context) - : BaseTextEditorEditable(editor), m_context(context) + : BaseTextEditorEditable(editor), m_context(context) { } ScriptEditor::ScriptEditor(const Context &context, - QWidget *parent) : - TextEditor::BaseTextEditor(parent), - m_context(context), - m_methodCombo(0) + QWidget *parent) : + TextEditor::BaseTextEditor(parent), + m_context(context), + m_methodCombo(0) { - setParenthesesMatchingEnabled(true); - setMarksVisible(true); - setCodeFoldingSupported(true); - setCodeFoldingVisible(true); - setMimeType(DuiEditor::Constants::C_DUIEDITOR_MIMETYPE); + setParenthesesMatchingEnabled(true); + setMarksVisible(true); + setCodeFoldingSupported(true); + setCodeFoldingVisible(true); + setMimeType(DuiEditor::Constants::C_DUIEDITOR_MIMETYPE); - m_updateDocumentTimer = new QTimer(this); - m_updateDocumentTimer->setInterval(UPDATE_DOCUMENT_DEFAULT_INTERVAL); - m_updateDocumentTimer->setSingleShot(true); + m_updateDocumentTimer = new QTimer(this); + m_updateDocumentTimer->setInterval(UPDATE_DOCUMENT_DEFAULT_INTERVAL); + m_updateDocumentTimer->setSingleShot(true); - connect(m_updateDocumentTimer, SIGNAL(timeout()), this, SLOT(updateDocumentNow())); + connect(m_updateDocumentTimer, SIGNAL(timeout()), this, SLOT(updateDocumentNow())); - connect(this, SIGNAL(textChanged()), this, SLOT(updateDocument())); + connect(this, SIGNAL(textChanged()), this, SLOT(updateDocument())); - baseTextDocument()->setSyntaxHighlighter(new DuiHighlighter); + baseTextDocument()->setSyntaxHighlighter(new DuiHighlighter); } ScriptEditor::~ScriptEditor() @@ -399,138 +399,138 @@ QStringList ScriptEditor::words() const Core::IEditor *ScriptEditorEditable::duplicate(QWidget *parent) { - ScriptEditor *newEditor = new ScriptEditor(m_context, parent); - newEditor->duplicateFrom(editor()); - DuiEditorPlugin::instance()->initializeEditor(newEditor); - return newEditor->editableInterface(); + ScriptEditor *newEditor = new ScriptEditor(m_context, parent); + newEditor->duplicateFrom(editor()); + DuiEditorPlugin::instance()->initializeEditor(newEditor); + return newEditor->editableInterface(); } const char *ScriptEditorEditable::kind() const { - return DuiEditor::Constants::C_DUIEDITOR; + return DuiEditor::Constants::C_DUIEDITOR; } ScriptEditor::Context ScriptEditorEditable::context() const { - return m_context; + return m_context; } void ScriptEditor::updateDocument() { - m_updateDocumentTimer->start(UPDATE_DOCUMENT_DEFAULT_INTERVAL); + m_updateDocumentTimer->start(UPDATE_DOCUMENT_DEFAULT_INTERVAL); } void ScriptEditor::updateDocumentNow() { - // ### move in the parser thread. + // ### move in the parser thread. - m_updateDocumentTimer->stop(); + m_updateDocumentTimer->stop(); - const QString fileName = file()->fileName(); - const QString source = toPlainText(); + const QString fileName = file()->fileName(); + const QString source = toPlainText(); - DuiDocument::Ptr doc = DuiDocument::create(fileName); - doc->setSource(source); - bool parsed = doc->parse(); - m_document = doc; + DuiDocument::Ptr doc = DuiDocument::create(fileName); + doc->setSource(source); + bool parsed = doc->parse(); + m_document = doc; - FindIdDeclarations updateIds; - m_ids = updateIds(doc->program()); + FindIdDeclarations updateIds; + m_ids = updateIds(doc->program()); - if (parsed) { - FindDeclarations findDeclarations; - m_declarations = findDeclarations(doc->program()); + if (parsed) { + FindDeclarations findDeclarations; + m_declarations = findDeclarations(doc->program()); - FindWords findWords; - m_words = findWords(doc->program()); + FindWords findWords; + m_words = findWords(doc->program()); - QStringList items; - items.append(tr("<Select Symbol>")); + QStringList items; + items.append(tr("<Select Symbol>")); - foreach (Declaration decl, m_declarations) - items.append(decl.text); + foreach (Declaration decl, m_declarations) + items.append(decl.text); - m_methodCombo->clear(); - m_methodCombo->addItems(items); - updateMethodBoxIndex(); - } + m_methodCombo->clear(); + m_methodCombo->addItems(items); + updateMethodBoxIndex(); + } - QList<QTextEdit::ExtraSelection> selections; + QList<QTextEdit::ExtraSelection> selections; - QTextCharFormat errorFormat; - errorFormat.setUnderlineColor(Qt::red); - errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); + QTextCharFormat errorFormat; + errorFormat.setUnderlineColor(Qt::red); + errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); - QTextEdit::ExtraSelection sel; + QTextEdit::ExtraSelection sel; - m_diagnosticMessages = doc->diagnosticMessages(); + m_diagnosticMessages = doc->diagnosticMessages(); - foreach (const DiagnosticMessage &d, m_diagnosticMessages) { - int line = d.loc.startLine; - int column = d.loc.startColumn; + foreach (const DiagnosticMessage &d, m_diagnosticMessages) { + int line = d.loc.startLine; + int column = d.loc.startColumn; - if (column == 0) - column = 1; + if (column == 0) + column = 1; - QTextCursor c(document()->findBlockByNumber(line - 1)); - sel.cursor = c; + QTextCursor c(document()->findBlockByNumber(line - 1)); + sel.cursor = c; - sel.cursor.setPosition(c.position() + column - 1); - if (sel.cursor.atBlockEnd()) - sel.cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); - else - sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); + sel.cursor.setPosition(c.position() + column - 1); + if (sel.cursor.atBlockEnd()) + sel.cursor.movePosition(QTextCursor::StartOfWord, QTextCursor::KeepAnchor); + else + sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); - sel.format = errorFormat; + sel.format = errorFormat; - selections.append(sel); - } + selections.append(sel); + } - setExtraSelections(CodeWarningsSelection, selections); + setExtraSelections(CodeWarningsSelection, selections); } void ScriptEditor::jumpToMethod(int index) { - if (index) { - Declaration d = m_declarations.at(index - 1); - gotoLine(d.startLine, d.startColumn - 1); - setFocus(); - } + if (index) { + Declaration d = m_declarations.at(index - 1); + gotoLine(d.startLine, d.startColumn - 1); + setFocus(); + } } void ScriptEditor::updateMethodBoxIndex() { - int line = 0, column = 0; - convertPosition(position(), &line, &column); + int line = 0, column = 0; + convertPosition(position(), &line, &column); - int currentSymbolIndex = 0; + int currentSymbolIndex = 0; - int index = 0; - while (index < m_declarations.size()) { - const Declaration &d = m_declarations.at(index++); + int index = 0; + while (index < m_declarations.size()) { + const Declaration &d = m_declarations.at(index++); - if (line < d.startLine) - break; - else - currentSymbolIndex = index; - } + if (line < d.startLine) + break; + else + currentSymbolIndex = index; + } - m_methodCombo->setCurrentIndex(currentSymbolIndex); + m_methodCombo->setCurrentIndex(currentSymbolIndex); - QList<QTextEdit::ExtraSelection> selections; - foreach (const AST::SourceLocation &loc, m_ids.value(wordUnderCursor())) { - if (! loc.isValid()) - continue; + QList<QTextEdit::ExtraSelection> selections; + foreach (const AST::SourceLocation &loc, m_ids.value(wordUnderCursor())) { + if (! loc.isValid()) + continue; - QTextEdit::ExtraSelection sel; - sel.format.setBackground(Qt::yellow); - sel.cursor = textCursor(); - sel.cursor.setPosition(loc.begin()); - sel.cursor.setPosition(loc.end(), QTextCursor::KeepAnchor); - selections.append(sel); - } + QTextEdit::ExtraSelection sel; + sel.format.setBackground(Qt::yellow); + sel.cursor = textCursor(); + sel.cursor.setPosition(loc.begin()); + sel.cursor.setPosition(loc.end(), QTextCursor::KeepAnchor); + selections.append(sel); + } - setExtraSelections(CodeSemanticsSelection, selections); + setExtraSelections(CodeSemanticsSelection, selections); } void ScriptEditor::updateMethodBoxToolTip() @@ -543,168 +543,169 @@ void ScriptEditor::updateFileName() void ScriptEditor::renameIdUnderCursor() { - const QString id = wordUnderCursor(); - bool ok = false; - const QString newId = QInputDialog::getText(Core::ICore::instance()->mainWindow(), - tr("Rename..."), - tr("New id:"), - QLineEdit::Normal, - id, &ok); - if (ok) { - TextWriter writer; - - QString code = toPlainText(); - - foreach (const AST::SourceLocation &loc, m_ids.value(id)) { - writer.replace(loc.offset, loc.length, newId); - } - - QTextCursor tc = textCursor(); - writer.write(&tc); - } + const QString id = wordUnderCursor(); + bool ok = false; + const QString newId = QInputDialog::getText(Core::ICore::instance()->mainWindow(), + tr("Rename..."), + tr("New id:"), + QLineEdit::Normal, + id, &ok); + if (ok) { + TextWriter writer; + + QString code = toPlainText(); + + foreach (const AST::SourceLocation &loc, m_ids.value(id)) { + writer.replace(loc.offset, loc.length, newId); + } + + QTextCursor tc = textCursor(); + writer.write(&tc); + } } QStringList ScriptEditor::keywords() const { - QStringList words; + QStringList words; - if (DuiHighlighter *highlighter = qobject_cast<DuiHighlighter*>(baseTextDocument()->syntaxHighlighter())) { - words = highlighter->keywords().toList(); - } + if (DuiHighlighter *highlighter = qobject_cast<DuiHighlighter*>(baseTextDocument()->syntaxHighlighter())) { + words = highlighter->keywords().toList(); + } - return words; + return words; } void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs) { - TextEditor::BaseTextEditor::setFontSettings(fs); - DuiHighlighter *highlighter = qobject_cast<DuiHighlighter*>(baseTextDocument()->syntaxHighlighter()); - if (!highlighter) - return; - - static QVector<QString> categories; - if (categories.isEmpty()) { - categories << QLatin1String(TextEditor::Constants::C_NUMBER) - << QLatin1String(TextEditor::Constants::C_STRING) - << QLatin1String(TextEditor::Constants::C_TYPE) - << QLatin1String(TextEditor::Constants::C_KEYWORD) - << QLatin1String(TextEditor::Constants::C_PREPROCESSOR) - << QLatin1String(TextEditor::Constants::C_LABEL) - << QLatin1String(TextEditor::Constants::C_COMMENT); - } - - highlighter->setFormats(fs.toTextCharFormats(categories)); - highlighter->rehighlight(); + TextEditor::BaseTextEditor::setFontSettings(fs); + DuiHighlighter *highlighter = qobject_cast<DuiHighlighter*>(baseTextDocument()->syntaxHighlighter()); + if (!highlighter) + return; + + static QVector<QString> categories; + if (categories.isEmpty()) { + categories << QLatin1String(TextEditor::Constants::C_NUMBER) + << QLatin1String(TextEditor::Constants::C_STRING) + << QLatin1String(TextEditor::Constants::C_TYPE) + << QLatin1String(TextEditor::Constants::C_KEYWORD) + << QLatin1String(TextEditor::Constants::C_PREPROCESSOR) + << QLatin1String(TextEditor::Constants::C_LABEL) + << QLatin1String(TextEditor::Constants::C_COMMENT); + } + + highlighter->setFormats(fs.toTextCharFormats(categories)); + highlighter->rehighlight(); } QString ScriptEditor::wordUnderCursor() const { - QTextCursor tc = textCursor(); - tc.movePosition(QTextCursor::StartOfWord); - tc.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); - const QString word= tc.selectedText(); - return word; + QTextCursor tc = textCursor(); + tc.movePosition(QTextCursor::StartOfWord); + tc.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); + const QString word= tc.selectedText(); + return word; } bool ScriptEditor::isElectricCharacter(const QChar &ch) const { - if (ch == QLatin1Char('}')) - return true; - return false; + if (ch == QLatin1Char('}')) + return true; + return false; } void ScriptEditor::indentBlock(QTextDocument *, QTextBlock block, QChar typedChar) { - TextEditor::TabSettings ts = tabSettings(); - - if (typedChar == QLatin1Char('}')) { - QTextCursor tc = textCursor(); - if (TextEditor::TextBlockUserData::findPreviousBlockOpenParenthesis(&tc)) { - const QString text = tc.block().text(); - ts.indentLine(block, ts.lineIndentPosition(text)); - return; - } - } - - int indent = 0; - int extraIndent = 0; - - if (block.previous().isValid()) { - const int braceDepth = qMax(0, block.previous().userState() >> 8); - const int previousBraceDepth = qMax(0, block.previous().previous().userState() >> 8); - - if (braceDepth > previousBraceDepth) - extraIndent = ts.m_indentSize * (braceDepth - previousBraceDepth); - } - - QTextBlock it = block.previous(); - for (; it.isValid(); it = it.previous()) { - const QString text = it.text(); - - if (! text.isEmpty()) { - indent = ts.lineIndentPosition(text); - break; - } - } - - ts.indentLine(block, extraIndent + indent); + TextEditor::TabSettings ts = tabSettings(); + + if (typedChar == QLatin1Char('}')) { + QTextCursor tc = textCursor(); + if (TextEditor::TextBlockUserData::findPreviousBlockOpenParenthesis(&tc)) { + const QString text = tc.block().text(); + int indent = ts.columnAt(text, ts.firstNonSpace(text)); + ts.indentLine(block, indent); + return; + } + } + + int indent = 0; + int extraIndent = 0; + + if (block.previous().isValid()) { + const int braceDepth = qMax(0, block.previous().userState() >> 8); + const int previousBraceDepth = qMax(0, block.previous().previous().userState() >> 8); + + if (braceDepth > previousBraceDepth) + extraIndent = ts.m_indentSize * (braceDepth - previousBraceDepth); + } + + QTextBlock it = block.previous(); + for (; it.isValid(); it = it.previous()) { + const QString text = it.text(); + + if (! text.isEmpty()) { + indent = ts.columnAt(text, ts.firstNonSpace(text)); + break; + } + } + + ts.indentLine(block, extraIndent + indent); } TextEditor::BaseTextEditorEditable *ScriptEditor::createEditableInterface() { - ScriptEditorEditable *editable = new ScriptEditorEditable(this, m_context); - createToolBar(editable); - return editable; + ScriptEditorEditable *editable = new ScriptEditorEditable(this, m_context); + createToolBar(editable); + return editable; } void ScriptEditor::createToolBar(ScriptEditorEditable *editable) { - m_methodCombo = new QComboBox; - m_methodCombo->setMinimumContentsLength(22); - //m_methodCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); + m_methodCombo = new QComboBox; + m_methodCombo->setMinimumContentsLength(22); + //m_methodCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); - // Make the combo box prefer to expand - QSizePolicy policy = m_methodCombo->sizePolicy(); - policy.setHorizontalPolicy(QSizePolicy::Expanding); - m_methodCombo->setSizePolicy(policy); + // Make the combo box prefer to expand + QSizePolicy policy = m_methodCombo->sizePolicy(); + policy.setHorizontalPolicy(QSizePolicy::Expanding); + m_methodCombo->setSizePolicy(policy); - connect(m_methodCombo, SIGNAL(activated(int)), this, SLOT(jumpToMethod(int))); - connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateMethodBoxIndex())); - connect(m_methodCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMethodBoxToolTip())); + connect(m_methodCombo, SIGNAL(activated(int)), this, SLOT(jumpToMethod(int))); + connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateMethodBoxIndex())); + connect(m_methodCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMethodBoxToolTip())); - connect(file(), SIGNAL(changed()), this, SLOT(updateFileName())); + connect(file(), SIGNAL(changed()), this, SLOT(updateFileName())); - QToolBar *toolBar = editable->toolBar(); + QToolBar *toolBar = editable->toolBar(); - QList<QAction*> actions = toolBar->actions(); - toolBar->insertWidget(actions.first(), m_methodCombo); + QList<QAction*> actions = toolBar->actions(); + toolBar->insertWidget(actions.first(), m_methodCombo); } void ScriptEditor::contextMenuEvent(QContextMenuEvent *e) { - QMenu *menu = createStandardContextMenu(); - - if (Core::ActionContainer *mcontext = Core::ICore::instance()->actionManager()->actionContainer(DuiEditor::Constants::M_CONTEXT)) { - QMenu *contextMenu = mcontext->menu(); - foreach (QAction *action, contextMenu->actions()) - menu->addAction(action); - } - - const QString id = wordUnderCursor(); - const QList<AST::SourceLocation> &locations = m_ids.value(id); - if (! locations.isEmpty()) { - menu->addSeparator(); - QAction *a = menu->addAction(tr("Rename id '%1'...").arg(id)); - connect(a, SIGNAL(triggered()), this, SLOT(renameIdUnderCursor())); - } - - menu->exec(e->globalPos()); - menu->deleteLater(); + QMenu *menu = createStandardContextMenu(); + + if (Core::ActionContainer *mcontext = Core::ICore::instance()->actionManager()->actionContainer(DuiEditor::Constants::M_CONTEXT)) { + QMenu *contextMenu = mcontext->menu(); + foreach (QAction *action, contextMenu->actions()) + menu->addAction(action); + } + + const QString id = wordUnderCursor(); + const QList<AST::SourceLocation> &locations = m_ids.value(id); + if (! locations.isEmpty()) { + menu->addSeparator(); + QAction *a = menu->addAction(tr("Rename id '%1'...").arg(id)); + connect(a, SIGNAL(triggered()), this, SLOT(renameIdUnderCursor())); + } + + menu->exec(e->globalPos()); + menu->deleteLater(); } void ScriptEditor::unCommentSelection() { - Core::Utils::unCommentSelection(this); + Core::Utils::unCommentSelection(this); } } // namespace Internal diff --git a/src/plugins/duieditor/duieditor.h b/src/plugins/duieditor/duieditor.h index c331e212174e317f69069ea076d15676bc1b2478..325329dd84956601a29682160a9c2f572b6253f0 100644 --- a/src/plugins/duieditor/duieditor.h +++ b/src/plugins/duieditor/duieditor.h @@ -32,9 +32,8 @@ #include <texteditor/basetexteditor.h> -#include "parser/javascriptastfwd_p.h" -#include "parser/javascriptengine_p.h" - +#include "javascriptastfwd_p.h" +#include "javascriptengine_p.h" #include "duidocument.h" QT_BEGIN_NAMESPACE @@ -43,7 +42,7 @@ class QTimer; QT_END_NAMESPACE namespace Core { - class ICore; + class ICore; } namespace DuiEditor { @@ -55,92 +54,92 @@ class ScriptEditor; class ScriptEditorEditable : public TextEditor::BaseTextEditorEditable { - Q_OBJECT + Q_OBJECT public: - ScriptEditorEditable(ScriptEditor *, const QList<int> &); - QList<int> context() const; + ScriptEditorEditable(ScriptEditor *, const QList<int> &); + QList<int> context() const; - bool duplicateSupported() const { return true; } - Core::IEditor *duplicate(QWidget *parent); - const char *kind() const; - bool temporaryEditor() const { return false; } + bool duplicateSupported() const { return true; } + Core::IEditor *duplicate(QWidget *parent); + const char *kind() const; + bool temporaryEditor() const { return false; } private: - QList<int> m_context; + QList<int> m_context; }; struct Declaration { - QString text; - int startLine; - int startColumn; - int endLine; - int endColumn; - - Declaration() - : startLine(0), - startColumn(0), - endLine(0), - endColumn(0) - { } + QString text; + int startLine; + int startColumn; + int endLine; + int endColumn; + + Declaration() + : startLine(0), + startColumn(0), + endLine(0), + endColumn(0) + { } }; class ScriptEditor : public TextEditor::BaseTextEditor { - Q_OBJECT + Q_OBJECT public: - typedef QList<int> Context; + typedef QList<int> Context; - ScriptEditor(const Context &context, - QWidget *parent = 0); - ~ScriptEditor(); + ScriptEditor(const Context &context, + QWidget *parent = 0); + ~ScriptEditor(); - QList<Declaration> declarations() const; - QStringList words() const; - QStringList keywords() const; + QList<Declaration> declarations() const; + QStringList words() const; + QStringList keywords() const; - QList<JavaScript::DiagnosticMessage> diagnosticMessages() const - { return m_diagnosticMessages; } + QList<JavaScript::DiagnosticMessage> diagnosticMessages() const + { return m_diagnosticMessages; } - virtual void unCommentSelection(); + virtual void unCommentSelection(); public slots: - virtual void setFontSettings(const TextEditor::FontSettings &); + virtual void setFontSettings(const TextEditor::FontSettings &); private slots: - void updateDocument(); - void updateDocumentNow(); - void jumpToMethod(int index); - void updateMethodBoxIndex(); - void updateMethodBoxToolTip(); - void updateFileName(); + void updateDocument(); + void updateDocumentNow(); + void jumpToMethod(int index); + void updateMethodBoxIndex(); + void updateMethodBoxToolTip(); + void updateFileName(); - // refactoring ops - void renameIdUnderCursor(); + // refactoring ops + void renameIdUnderCursor(); protected: - void contextMenuEvent(QContextMenuEvent *e); - TextEditor::BaseTextEditorEditable *createEditableInterface(); - void createToolBar(ScriptEditorEditable *editable); + void contextMenuEvent(QContextMenuEvent *e); + TextEditor::BaseTextEditorEditable *createEditableInterface(); + void createToolBar(ScriptEditorEditable *editable); private: - virtual bool isElectricCharacter(const QChar &ch) const; - virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar); + virtual bool isElectricCharacter(const QChar &ch) const; + virtual void indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar); - QString wordUnderCursor() const; + QString wordUnderCursor() const; - const Context m_context; + const Context m_context; - QTimer *m_updateDocumentTimer; - QComboBox *m_methodCombo; - QList<Declaration> m_declarations; - QStringList m_words; - QMap<QString, QList<JavaScript::AST::SourceLocation> > m_ids; // ### use QMultiMap - QList<JavaScript::DiagnosticMessage> m_diagnosticMessages; - DuiDocument::Ptr m_document; + QTimer *m_updateDocumentTimer; + QComboBox *m_methodCombo; + QList<Declaration> m_declarations; + QStringList m_words; + QMap<QString, QList<JavaScript::AST::SourceLocation> > m_ids; // ### use QMultiMap + QList<JavaScript::DiagnosticMessage> m_diagnosticMessages; + DuiDocument::Ptr m_document; }; } // namespace Internal diff --git a/src/plugins/duieditor/duieditor.pro b/src/plugins/duieditor/duieditor.pro index bfbd34788c43676195c4e67f2fbc66357878c5ce..c68cb43664f202809cc6d894784c932bd47dca29 100644 --- a/src/plugins/duieditor/duieditor.pro +++ b/src/plugins/duieditor/duieditor.pro @@ -1,6 +1,5 @@ TEMPLATE = lib TARGET = DuiEditor -QT += script include(../../qtcreatorplugin.pri) include(../../plugins/coreplugin/coreplugin.pri) @@ -12,14 +11,12 @@ DUI=$$(QTDIR_DUI) isEmpty(DUI):DUI=$$fromfile($$(QTDIR)/.qmake.cache,QT_SOURCE_TREE) !isEmpty(DUI):exists($$DUI/src/declarative/qml/parser) { - include($$DUI/src/declarative/qml/parser/parser.pri) - INCLUDEPATH += $$DUI/src/declarative/qml + include($$DUI/src/declarative/qml/parser/parser.pri) + include($$DUI/src/declarative/qml/rewriter/rewriter.pri) } else { - error(run with export QTDIR_DUI=<path to kinetic/qt>) + error(run with export QTDIR_DUI=<path to kinetic/qt>) } -include(rewriter/rewriter.pri) - HEADERS += duieditor.h \ duieditorfactory.h \ duieditorplugin.h \ diff --git a/src/plugins/duieditor/rewriter/rewriter.cpp b/src/plugins/duieditor/rewriter/rewriter.cpp deleted file mode 100644 index 89406a45211194b8b91e94ece42325a451491fe2..0000000000000000000000000000000000000000 --- a/src/plugins/duieditor/rewriter/rewriter.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "rewriter.h" -#include "parser/javascriptast_p.h" - -using namespace JavaScript; -using namespace DuiEditor::Internal; - -void Rewriter::replace(const AST::SourceLocation &loc, const QString &text) -{ replace(loc.offset, loc.length, text); } - -void Rewriter::remove(const AST::SourceLocation &loc) -{ return replace(loc.offset, loc.length, QString()); } - -void Rewriter::remove(const AST::SourceLocation &firstLoc, const AST::SourceLocation &lastLoc) -{ return replace(firstLoc.offset, lastLoc.offset + lastLoc.length - firstLoc.offset, QString()); } - -void Rewriter::insertTextBefore(const AST::SourceLocation &loc, const QString &text) -{ replace(loc.offset, 0, text); } - -void Rewriter::insertTextAfter(const AST::SourceLocation &loc, const QString &text) -{ replace(loc.offset + loc.length, 0, text); } - -void Rewriter::replace(int offset, int length, const QString &text) -{ textWriter.replace(offset, length, text); } - -void Rewriter::insertText(int offset, const QString &text) -{ replace(offset, 0, text); } - -void Rewriter::removeText(int offset, int length) -{ replace(offset, length, QString()); } - -QString Rewriter::textAt(const AST::SourceLocation &loc) const -{ return _code.mid(loc.offset, loc.length); } - -QString Rewriter::textAt(const AST::SourceLocation &firstLoc, const AST::SourceLocation &lastLoc) const -{ return _code.mid(firstLoc.offset, lastLoc.offset + lastLoc.length - firstLoc.offset); } - -void Rewriter::accept(JavaScript::AST::Node *node) -{ JavaScript::AST::Node::acceptChild(node, this); } - -void Rewriter::moveTextBefore(const AST::SourceLocation &firstLoc, - const AST::SourceLocation &lastLoc, - const AST::SourceLocation &loc) -{ - textWriter.move(firstLoc.offset, lastLoc.offset + lastLoc.length - firstLoc.offset, loc.offset); -} - -void Rewriter::moveTextAfter(const AST::SourceLocation &firstLoc, - const AST::SourceLocation &lastLoc, - const AST::SourceLocation &loc) -{ - textWriter.move(firstLoc.offset, lastLoc.offset + lastLoc.length - firstLoc.offset, loc.offset + loc.length); -} - diff --git a/src/plugins/duieditor/rewriter/rewriter.h b/src/plugins/duieditor/rewriter/rewriter.h deleted file mode 100644 index 17ebe97c97cb199fe654dff2e952f058c00c9f2e..0000000000000000000000000000000000000000 --- a/src/plugins/duieditor/rewriter/rewriter.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef REWRITER_H -#define REWRITER_H - -#include <QList> -#include <QString> - -#include "textwriter.h" -#include "parser/javascriptastvisitor_p.h" - -namespace DuiEditor { -namespace Internal { - -//////////////////////////////////////////////////////////////////////////////// -// Replacement -//////////////////////////////////////////////////////////////////////////////// -class Replacement -{ - int _offset; - int _length; - QString _text; - -public: - Replacement(int offset = 0, int length = 0, const QString &text = QString()) - : _offset(offset), _length(length), _text(text) - { } - - bool isNull() const { return _offset == _length; } - operator bool() const { return ! isNull(); } - - int offset() const { return _offset; } - int length() const { return _length; } - QString text() const { return _text; } -}; - - - -//////////////////////////////////////////////////////////////////////////////// -// Rewriter -//////////////////////////////////////////////////////////////////////////////// -class Rewriter: public JavaScript::AST::Visitor -{ -protected: - TextWriter textWriter; -public: - // - // Token based API - // - - /// Returns the text of the token at the given \a location. - QString textAt(const JavaScript::AST::SourceLocation &location) const; - - QString textAt(const JavaScript::AST::SourceLocation &firstLoc, - const JavaScript::AST::SourceLocation &lastLoc) const; - - /// Replace the token at \a loc with the given \a text. - void replace(const JavaScript::AST::SourceLocation &loc, const QString &text); - - /// Remove the token at the given \a location. - void remove(const JavaScript::AST::SourceLocation &location); - - /// Remove all tokens in the range [\a firstLoc, \a lastLoc]. - void remove(const JavaScript::AST::SourceLocation &firstLoc, const JavaScript::AST::SourceLocation &lastLoc); - - /// Insert \a text before the token at the given \a location. - void insertTextBefore(const JavaScript::AST::SourceLocation &location, const QString &text); - - /// Insert \a text after the token at the given \a location. - void insertTextAfter(const JavaScript::AST::SourceLocation &loc, const QString &text); - - void moveTextBefore(const JavaScript::AST::SourceLocation &firstLoc, - const JavaScript::AST::SourceLocation &lastLoc, - const JavaScript::AST::SourceLocation &loc); - - void moveTextAfter(const JavaScript::AST::SourceLocation &firstLoc, - const JavaScript::AST::SourceLocation &lastLoc, - const JavaScript::AST::SourceLocation &loc); - - // - // low-level offset based API - // - void replace(int offset, int length, const QString &text); - void insertText(int offset, const QString &text); - void removeText(int offset, int length); - - /// Visit the given \a node. - void accept(JavaScript::AST::Node *node); - - /// Returns the original unchanged source code. - QString code() const { return _code; } - - /// Returns the list of replacements. - QList<Replacement> replacementList() const { return _replacementList; } - -protected: - /// \internal - void setCode(const QString &code) { _code = code; } - -private: - QString _code; - QList<Replacement> _replacementList; -}; - -} // end of namespace Internal -} // end of namespace DuiEditor - -#endif // REWRITER_H diff --git a/src/plugins/duieditor/rewriter/rewriter.pri b/src/plugins/duieditor/rewriter/rewriter.pri deleted file mode 100644 index 2cf55b64a28a7436015a03a37bc21eab73862e6d..0000000000000000000000000000000000000000 --- a/src/plugins/duieditor/rewriter/rewriter.pri +++ /dev/null @@ -1,2 +0,0 @@ -HEADERS += $$PWD/rewriter.h $$PWD/textwriter.h -SOURCES += $$PWD/rewriter.cpp $$PWD/textwriter.cpp diff --git a/src/plugins/duieditor/rewriter/textwriter.cpp b/src/plugins/duieditor/rewriter/textwriter.cpp deleted file mode 100644 index bb4f6c44b0c66b1113b7779aa523da15c76e6037..0000000000000000000000000000000000000000 --- a/src/plugins/duieditor/rewriter/textwriter.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include "textwriter.h" - -using namespace DuiEditor::Internal; - -TextWriter::TextWriter() - :string(0), cursor(0) -{ -} - -static bool overlaps(int posA, int lengthA, int posB, int lengthB) { - return (posA < posB + lengthB && posA + lengthA > posB + lengthB) - || (posA < posB && posA + lengthA > posB); -} - -bool TextWriter::hasOverlap(int pos, int length) -{ - { - QListIterator<Replace> i(replaceList); - while (i.hasNext()) { - const Replace &cmd = i.next(); - if (overlaps(pos, length, cmd.pos, cmd.length)) - return true; - } - } - { - QListIterator<Move> i(moveList); - while (i.hasNext()) { - const Move &cmd = i.next(); - if (overlaps(pos, length, cmd.pos, cmd.length)) - return true; - } - return false; - } -} - -bool TextWriter::hasMoveInto(int pos, int length) -{ - QListIterator<Move> i(moveList); - while (i.hasNext()) { - const Move &cmd = i.next(); - if (cmd.to >= pos && cmd.to < pos + length) - return true; - } - return false; -} - -void TextWriter::replace(int pos, int length, const QString &replacement) -{ - Q_ASSERT(!hasOverlap(pos, length)); - Q_ASSERT(!hasMoveInto(pos, length)); - - Replace cmd; - cmd.pos = pos; - cmd.length = length; - cmd.replacement = replacement; - replaceList += cmd; -} - -void TextWriter::move(int pos, int length, int to) -{ - Q_ASSERT(!hasOverlap(pos, length)); - - Move cmd; - cmd.pos = pos; - cmd.length = length; - cmd.to = to; - moveList += cmd; -} - -void TextWriter::doReplace(const Replace &replace) -{ - int diff = replace.replacement.size() - replace.length; - { - QMutableListIterator<Replace> i(replaceList); - while (i.hasNext()) { - Replace &c = i.next(); - if (replace.pos < c.pos) - c.pos += diff; - else if (replace.pos + replace.length < c.pos + c.length) - c.length += diff; - } - } - { - QMutableListIterator<Move> i(moveList); - while (i.hasNext()) { - Move &c = i.next(); - if (replace.pos < c.pos) - c.pos += diff; - else if (replace.pos + replace.length < c.pos + c.length) - c.length += diff; - - if (replace.pos < c.to) - c.to += diff; - } - } - - if (string) { - string->replace(replace.pos, replace.length, replace.replacement); - } else if (cursor) { - cursor->setPosition(replace.pos); - cursor->setPosition(replace.pos + replace.length, QTextCursor::KeepAnchor); - cursor->insertText(replace.replacement); - } -} - -void TextWriter::doMove(const Move &move) -{ - QString text; - if (string) { - text = string->mid(move.pos, move.length); - } else if (cursor) { - cursor->setPosition(move.pos); - cursor->setPosition(move.pos + move.length, QTextCursor::KeepAnchor); - text = cursor->selectedText(); - } - - Replace cut; - cut.pos = move.pos; - cut.length = move.length; - Replace paste; - paste.pos = move.to; - paste.length = 0; - paste.replacement = text; - - replaceList.append(cut); - replaceList.append(paste); - - Replace cmd; - while (!replaceList.isEmpty()) { - cmd = replaceList.first(); - replaceList.removeFirst(); - doReplace(cmd); - } -} - -void TextWriter::write(QString *s) -{ - string = s; - write_helper(); - string = 0; -} - -void TextWriter::write(QTextCursor *textCursor) -{ - cursor = textCursor; - write_helper(); - cursor = 0; -} - -void TextWriter::write_helper() -{ - if (cursor) - cursor->beginEditBlock(); - { - Replace cmd; - while (!replaceList.isEmpty()) { - cmd = replaceList.first(); - replaceList.removeFirst(); - doReplace(cmd); - } - } - { - Move cmd; - while (!moveList.isEmpty()) { - cmd = moveList.first(); - moveList.removeFirst(); - doMove(cmd); - } - } - if (cursor) - cursor->endEditBlock(); -} diff --git a/src/plugins/duieditor/rewriter/textwriter.h b/src/plugins/duieditor/rewriter/textwriter.h deleted file mode 100644 index 38104a6b89ac43b7a11532b64e45cfc93641a3c3..0000000000000000000000000000000000000000 --- a/src/plugins/duieditor/rewriter/textwriter.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef TEXTWRITER_H -#define TEXTWRITER_H - -#include <QString> -#include <QList> -#include <QTextCursor> - -namespace DuiEditor { -namespace Internal { - -class TextWriter -{ - QString *string; - QTextCursor *cursor; - - struct Replace { - int pos; - int length; - QString replacement; - }; - - QList<Replace> replaceList; - - struct Move { - int pos; - int length; - int to; - }; - - QList<Move> moveList; - - bool hasOverlap(int pos, int length); - bool hasMoveInto(int pos, int length); - - void doReplace(const Replace &replace); - void doMove(const Move &move); - - void write_helper(); - -public: - TextWriter(); - - void replace(int pos, int length, const QString &replacement); - void move(int pos, int length, int to); - - void write(QString *s); - void write(QTextCursor *textCursor); - -}; - -} // end of namespace Internal -} // end of namespace DuiEditor - -#endif // TEXTWRITER_H