void ScCodeEditor::keyPressEvent( QKeyEvent *e ) { QTextCursor cursor( textCursor() ); bool cursorMoved = true; if (e == QKeySequence::MoveToNextWord) moveToNextToken( cursor, QTextCursor::MoveAnchor ); else if (e == QKeySequence::MoveToPreviousWord) moveToPreviousToken( cursor, QTextCursor::MoveAnchor ); else if (e == QKeySequence::SelectNextWord) moveToNextToken( cursor, QTextCursor::KeepAnchor ); else if (e == QKeySequence::SelectPreviousWord) moveToPreviousToken( cursor, QTextCursor::KeepAnchor ); else cursorMoved = false; if (cursorMoved) { setTextCursor( cursor ); return; } switch (e->key()) { case Qt::Key_Home: { Qt::KeyboardModifiers mods(e->modifiers()); if (mods && mods != Qt::ShiftModifier) { GenericCodeEditor::keyPressEvent(e); return; } hideMouseCursor(); QTextCursor::MoveMode mode = mods & Qt::ShiftModifier ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor; QTextCursor c(textCursor()); QTextBlock b(c.block()); int pos = indentedStartOfLine(b); pos += b.position(); if (c.position() == pos) c.movePosition(QTextCursor::StartOfLine, mode); else c.setPosition(pos, mode); setTextCursor(c); return; } case Qt::Key_Backtab: { hideMouseCursor(); QTextCursor cursor = textCursor(); insertSpaceToNextTabStop( cursor ); ensureCursorVisible(); return; } case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_BraceRight: case Qt::Key_BracketRight: case Qt::Key_ParenRight: { hideMouseCursor(); // Wrap superclass' implementation into an edit block, // so it can be joined with indentation later: QTextCursor cursor = textCursor(); cursor.beginEditBlock(); GenericCodeEditor::keyPressEvent(e); cursor.endEditBlock(); cursor.joinPreviousEditBlock(); indent(); cursor.endEditBlock(); cursor.setVerticalMovementX(-1); setTextCursor(cursor); break; } default: GenericCodeEditor::keyPressEvent(e); } mAutoCompleter->keyPress(e); }
bool CppLocalRenaming::handleKeyPressEvent(QKeyEvent *e) { if (!isActive()) return false; QTextCursor cursor = m_editorWidget->textCursor(); const int cursorPosition = cursor.position(); const QTextCursor::MoveMode moveMode = (e->modifiers() & Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor; switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: stop(); e->accept(); return true; case Qt::Key_Home: { // Send home to start of name when within the name and not at the start if (renameSelectionBegin() < cursorPosition && cursorPosition <= renameSelectionEnd()) { cursor.setPosition(renameSelectionBegin(), moveMode); m_editorWidget->setTextCursor(cursor); e->accept(); return true; } break; } case Qt::Key_End: { // Send end to end of name when within the name and not at the end if (renameSelectionBegin() <= cursorPosition && cursorPosition < renameSelectionEnd()) { cursor.setPosition(renameSelectionEnd(), moveMode); m_editorWidget->setTextCursor(cursor); e->accept(); return true; } break; } case Qt::Key_Backspace: { if (cursorPosition == renameSelectionBegin() && !cursor.hasSelection()) { // Eat backspace at start of name when there is no selection e->accept(); return true; } break; } case Qt::Key_Delete: { if (cursorPosition == renameSelectionEnd() && !cursor.hasSelection()) { // Eat delete at end of name when there is no selection e->accept(); return true; } break; } default: { break; } } // switch startRenameChange(); const bool wantEditBlock = isWithinRenameSelection(cursorPosition); if (wantEditBlock) { if (m_firstRenameChangeExpected) // Change inside rename selection cursor.beginEditBlock(); else cursor.joinPreviousEditBlock(); m_firstRenameChangeExpected = false; } emit processKeyPressNormally(e); if (wantEditBlock) cursor.endEditBlock(); finishRenameChange(); return true; }