diff options
author | Aurindam Jana <aurindam.jana@digia.com> | 2012-10-04 14:54:59 +0200 |
---|---|---|
committer | hjk <qthjk@ovi.com> | 2012-10-05 11:03:01 +0200 |
commit | 9ac25a293252a1196dad29b493add514459777a6 (patch) | |
tree | 12b2e4aa58a7f310d0596bd067f458356ad58dea /src/plugins/qmljstools/qmlconsoleedit.cpp | |
parent | 614bb33589aa1fade05cd1b6b32b3acc848f2fd8 (diff) | |
download | qt-creator-9ac25a293252a1196dad29b493add514459777a6.tar.gz |
ScriptConsole: Move from Debugger to QmlJSTools
The console is now a part of qmljstools plugin. The console
appears as an output pane. A dummy QScriptEngine evaluates
expressions when a declarative debug session is not in
progress. During a debug session, the expressions are
evaluated by the debug services.
Task-Number: QTCREATORBUG-7402
Change-Id: Ic2eeac44fb335c706be03b89f8672b0356efe984
Reviewed-by: Christiaan Janssen <christiaan.janssen@digia.com>
Reviewed-by: hjk <qthjk@ovi.com>
Diffstat (limited to 'src/plugins/qmljstools/qmlconsoleedit.cpp')
-rw-r--r-- | src/plugins/qmljstools/qmlconsoleedit.cpp | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/src/plugins/qmljstools/qmlconsoleedit.cpp b/src/plugins/qmljstools/qmlconsoleedit.cpp new file mode 100644 index 0000000000..2a64d935ca --- /dev/null +++ b/src/plugins/qmljstools/qmlconsoleedit.cpp @@ -0,0 +1,233 @@ +#include "qmlconsoleedit.h" +#include "qmlconsoleitemmodel.h" +#include "qmlconsolemanager.h" + +#include <utils/qtcassert.h> + +#include <QUrl> +#include <QMenu> +#include <QKeyEvent> + +namespace QmlJSTools { +namespace Internal { + +/////////////////////////////////////////////////////////////////////// +// +// QmlConsoleEdit +// +/////////////////////////////////////////////////////////////////////// + +QmlConsoleEdit::QmlConsoleEdit(const QModelIndex &index, QWidget *parent) : + QTextEdit(parent), + m_historyIndex(index), + m_prompt(QLatin1String(":/qmljstools/images/prompt.png")), + m_startOfEditableArea(0) +{ + setFrameStyle(QFrame::NoFrame); + setUndoRedoEnabled(false); + setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + document()->addResource(QTextDocument::ImageResource, QUrl(QLatin1String("prompt")), m_prompt); + QTextImageFormat format; + format.setName(QLatin1String("prompt")); + format.setHeight(9); + format.setWidth(9); + textCursor().insertText(QLatin1String(" ")); + textCursor().insertImage(format); + textCursor().insertText(QLatin1String(" ")); + m_startOfEditableArea = textCursor().position(); + + ensureCursorVisible(); + setTextInteractionFlags(Qt::TextEditorInteraction); +} + +void QmlConsoleEdit::keyPressEvent(QKeyEvent *e) +{ + bool keyConsumed = false; + + switch (e->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: { + m_interpreter.clearText(); + QString currentScript = getCurrentScript(); + m_interpreter.appendText(currentScript); + if (currentScript.isEmpty()) { + emit editingFinished(); + } else if (m_interpreter.canEvaluate()) { + QmlConsoleModel::evaluate(currentScript); + emit editingFinished(); + } + break; + } + + case Qt::Key_Backspace: + if (textCursor().selectionStart() <= m_startOfEditableArea) + keyConsumed = true; + break; + + case Qt::Key_Delete: + if (textCursor().selectionStart() < m_startOfEditableArea) + keyConsumed = true; + break; + + case Qt::Key_Home: { + QTextCursor c(textCursor()); + c.setPosition(m_startOfEditableArea); + setTextCursor(c); + keyConsumed = true; + break; + } + + case Qt::Key_Up: + handleUpKey(); + keyConsumed = true; + break; + + case Qt::Key_Down: + handleDownKey(); + keyConsumed = true; + break; + + // Ctrl+Left: Moves the cursor one word to the left. + // Left: Moves the cursor one character to the left. + case Qt::Key_Left: + if (textCursor().position() <= m_startOfEditableArea + || e->modifiers() & Qt::ControlModifier) { + QTextCursor c(textCursor()); + c.setPosition(m_startOfEditableArea); + setTextCursor(c); + keyConsumed = true; + } + break; + + // Ctrl+Right: Moves the cursor one word to the right. + // Right: Moves the cursor one character to the right. + case Qt::Key_Right: + if ( !(e->modifiers() & Qt::ControlModifier) + && textCursor().position() <= m_startOfEditableArea) { + QTextCursor c(textCursor()); + c.setPosition(m_startOfEditableArea); + setTextCursor(c); + keyConsumed = true; + } + break; + + // Ctrl+C, Ctrl+Insert: Allow to Copy the selected text to the clipboard. + case Qt::Key_C: + case Qt::Key_Insert: + if (textCursor().selectionStart() < m_startOfEditableArea && + !(e->modifiers() & Qt::ControlModifier)) + keyConsumed = true; + break; + + default: + // Disallow any other keys in the prompt area + if (textCursor().selectionStart() < m_startOfEditableArea) + keyConsumed = true; + break; + } + + if (!keyConsumed) + QTextEdit::keyPressEvent(e); +} + +void QmlConsoleEdit::contextMenuEvent(QContextMenuEvent *event) +{ + // TODO:: on right click the editor closes + return QTextEdit::contextMenuEvent(event); + + QTextCursor cursor = textCursor(); + bool editable = cursor.position() > m_startOfEditableArea; + QMenu *menu = new QMenu(); + QAction *a; + + a = menu->addAction(tr("Cu&t"), this, SLOT(cut())); + a->setEnabled(cursor.hasSelection() && editable); + + a = menu->addAction(tr("&Copy"), this, SLOT(copy())); + a->setEnabled(cursor.hasSelection()); + + a = menu->addAction(tr("&Paste"), this, SLOT(paste())); + a->setEnabled(canPaste() && editable); + + menu->addSeparator(); + a = menu->addAction(tr("Select &All"), this, SLOT(selectAll())); + a->setEnabled(!document()->isEmpty()); + + menu->addSeparator(); + menu->addAction(tr("C&lear"), this, SLOT(clear())); + + menu->exec(event->globalPos()); + + delete menu; +} + +void QmlConsoleEdit::focusOutEvent(QFocusEvent * /*e*/) +{ + emit editingFinished(); +} + +void QmlConsoleEdit::handleUpKey() +{ + QTC_ASSERT(m_historyIndex.isValid(), return); + int currentRow = m_historyIndex.row(); + const QAbstractItemModel *model = m_historyIndex.model(); + if (currentRow == model->rowCount() - 1) + m_cachedScript = getCurrentScript(); + + while (currentRow) { + currentRow--; + if (model->hasIndex(currentRow, 0)) { + QModelIndex index = model->index(currentRow, 0); + if (QmlConsoleItem::InputType == (QmlConsoleItem::ItemType)model->data( + index, QmlConsoleItemModel::TypeRole).toInt()) { + m_historyIndex = index; + replaceCurrentScript(model->data(index, Qt::DisplayRole).toString()); + break; + } + } + } +} + +void QmlConsoleEdit::handleDownKey() +{ + QTC_ASSERT(m_historyIndex.isValid(), return); + int currentRow = m_historyIndex.row(); + const QAbstractItemModel *model = m_historyIndex.model(); + while (currentRow < model->rowCount() - 1) { + currentRow++; + if (model->hasIndex(currentRow, 0)) { + QModelIndex index = model->index(currentRow, 0); + if (QmlConsoleItem::InputType == (QmlConsoleItem::ItemType)model->data( + index, QmlConsoleItemModel::TypeRole).toInt()) { + m_historyIndex = index; + if (currentRow == model->rowCount() - 1) + replaceCurrentScript(m_cachedScript); + else + replaceCurrentScript(model->data(index, Qt::DisplayRole).toString()); + break; + } + } + } +} + +QString QmlConsoleEdit::getCurrentScript() const +{ + QTextCursor cursor = textCursor(); + cursor.setPosition(m_startOfEditableArea); + cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); + QString script = cursor.selectedText(); + return script.trimmed(); +} + +void QmlConsoleEdit::replaceCurrentScript(const QString &script) +{ + QTextCursor cursor = textCursor(); + cursor.setPosition(m_startOfEditableArea); + cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); + cursor.removeSelectedText(); + cursor.insertText(script); + setTextCursor(cursor); +} + +} // Internal +} // QmlJSTools |