diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 4be02ac067a86954a8d3ffcf2b99e662347b9320..8b3b62a99d8bac17df242087ea1a0166bffd5c87 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -654,6 +654,48 @@ void CPPEditor::createToolBar(CPPEditorEditable *editable) static_cast<QHBoxLayout*>(w->layout())->insertWidget(0, m_methodCombo, 1); } +void CPPEditor::inAllRenameSelections(EditOperation operation, + const QTextEdit::ExtraSelection ¤tRenameSelection, + QTextCursor cursor, + const QString &text) +{ + m_inRename = true; + cursor.beginEditBlock(); + + const int offset = cursor.position() - currentRenameSelection.cursor.anchor(); + + for (int i = 0; i < m_renameSelections.size(); ++i) { + QTextEdit::ExtraSelection &s = m_renameSelections[i]; + int pos = s.cursor.anchor(); + int endPos = s.cursor.position(); + s.cursor.setPosition(s.cursor.anchor() + offset); + + switch (operation) { + case DeletePreviousChar: + s.cursor.deletePreviousChar(); + --endPos; + break; + case DeleteChar: + s.cursor.deleteChar(); + --endPos; + break; + case InsertText: + s.cursor.insertText(text); + endPos += text.length(); + break; + } + + s.cursor.setPosition(pos); + s.cursor.setPosition(endPos, QTextCursor::KeepAnchor); + } + + cursor.endEditBlock(); + m_inRename = false; + + setExtraSelections(CodeSemanticsSelection, m_renameSelections); + setTextCursor(cursor); +} + void CPPEditor::abortRename() { m_currentRenameSelection = -1; @@ -816,6 +858,9 @@ void CPPEditor::renameInPlace() void CPPEditor::onContentsChanged(int position, int charsRemoved, int charsAdded) { + Q_UNUSED(position) + Q_UNUSED(charsAdded) + if (!m_inRename) abortRename(); @@ -1372,10 +1417,6 @@ void CPPEditor::contextMenuEvent(QContextMenuEvent *e) foreach (QAction *action, contextMenu->actions()) menu->addAction(action); - QAction *simplifyDeclarations = new QAction(tr("Simplify Declarations"), menu); - connect(simplifyDeclarations, SIGNAL(triggered()), this, SLOT(simplifyDeclarations())); - menu->addAction(simplifyDeclarations); - const QList<QTextEdit::ExtraSelection> selections = extraSelections(BaseTextEditor::CodeSemanticsSelection); @@ -1458,9 +1499,10 @@ void CPPEditor::keyPressEvent(QKeyEvent *e) return; } - QTextEdit::ExtraSelection currentRenameSelection = m_renameSelections.at(m_currentRenameSelection); - - QTextCursor::MoveMode moveMode = (e->modifiers() & Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor; + const QTextEdit::ExtraSelection ¤tRenameSelection = m_renameSelections.at(m_currentRenameSelection); + QTextCursor cursor = textCursor(); + const QTextCursor::MoveMode moveMode = + (e->modifiers() & Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor; switch (e->key()) { case Qt::Key_Enter: @@ -1470,94 +1512,50 @@ void CPPEditor::keyPressEvent(QKeyEvent *e) e->accept(); return; case Qt::Key_Home: { - QTextCursor c = textCursor(); - if (c.position() > currentRenameSelection.cursor.anchor() - && c.position() <= currentRenameSelection.cursor.position()) { - c.setPosition(currentRenameSelection.cursor.anchor(), moveMode); - setTextCursor(c); + // Send home to start of name when within the name and not at the start + if (cursor.position() > currentRenameSelection.cursor.anchor() + && cursor.position() <= currentRenameSelection.cursor.position()) { + cursor.setPosition(currentRenameSelection.cursor.anchor(), moveMode); + setTextCursor(cursor); e->accept(); return; } break; } case Qt::Key_End: { - QTextCursor c = textCursor(); - if (c.position() >= currentRenameSelection.cursor.anchor() - && c.position() < currentRenameSelection.cursor.position()) { - c.setPosition(currentRenameSelection.cursor.position(), moveMode); - setTextCursor(c); + // Send end to end of name when within the name and not at the end + if (cursor.position() >= currentRenameSelection.cursor.anchor() + && cursor.position() < currentRenameSelection.cursor.position()) { + cursor.setPosition(currentRenameSelection.cursor.position(), moveMode); + setTextCursor(cursor); e->accept(); return; } break; } case Qt::Key_Backspace: { - QTextCursor c = textCursor(); - - if (c.position() == currentRenameSelection.cursor.anchor()) { - // Eat + if (cursor.position() == currentRenameSelection.cursor.anchor()) { + // Eat backspace at start of name e->accept(); return; - } else if (c.position() > currentRenameSelection.cursor.anchor() - && c.position() <= currentRenameSelection.cursor.position()) { - - int offset = c.position() - currentRenameSelection.cursor.anchor(); - - m_inRename = true; - - c.beginEditBlock(); - for (int i = 0; i < m_renameSelections.size(); ++i) { - QTextEdit::ExtraSelection &s = m_renameSelections[i]; - int pos = s.cursor.anchor(); - int endPos = s.cursor.position(); - s.cursor.setPosition(s.cursor.anchor() + offset); - s.cursor.deletePreviousChar(); - s.cursor.setPosition(pos); - s.cursor.setPosition(endPos - 1, QTextCursor::KeepAnchor); - } - c.endEditBlock(); - - m_inRename = false; - - setTextCursor(c); - setExtraSelections(CodeSemanticsSelection, m_renameSelections); + } else if (cursor.position() > currentRenameSelection.cursor.anchor() + && cursor.position() <= currentRenameSelection.cursor.position()) { + inAllRenameSelections(DeletePreviousChar, currentRenameSelection, cursor); e->accept(); return; } break; } case Qt::Key_Delete: { - QTextCursor c = textCursor(); - - if (c.position() == currentRenameSelection.cursor.position()) { - // Eat + if (cursor.position() == currentRenameSelection.cursor.position()) { + // Eat delete at end of name e->accept(); return; - } else if (c.position() >= currentRenameSelection.cursor.anchor() - && c.position() < currentRenameSelection.cursor.position()) { - - int offset = c.position() - currentRenameSelection.cursor.anchor(); - - m_inRename = true; - - c.beginEditBlock(); - for (int i = 0; i < m_renameSelections.size(); ++i) { - QTextEdit::ExtraSelection &s = m_renameSelections[i]; - int pos = s.cursor.anchor(); - int endPos = s.cursor.position(); - s.cursor.setPosition(s.cursor.anchor() + offset); - s.cursor.deleteChar(); - s.cursor.setPosition(pos); - s.cursor.setPosition(endPos - 1, QTextCursor::KeepAnchor); - } - c.endEditBlock(); - - m_inRename = false; - - setTextCursor(c); - setExtraSelections(CodeSemanticsSelection, m_renameSelections); + } else if (cursor.position() >= currentRenameSelection.cursor.anchor() + && cursor.position() < currentRenameSelection.cursor.position()) { + inAllRenameSelections(DeleteChar, currentRenameSelection, cursor); e->accept(); return; } @@ -1565,34 +1563,11 @@ void CPPEditor::keyPressEvent(QKeyEvent *e) } default: { QString text = e->text(); - if (! text.isEmpty() && text.at(0).isPrint()) { - QTextCursor c = textCursor(); - - if (c.position() >= currentRenameSelection.cursor.anchor() - && c.position() <= currentRenameSelection.cursor.position()) { - - int offset = c.position() - currentRenameSelection.cursor.anchor(); - - m_inRename = true; - - c.beginEditBlock(); - for (int i = 0; i < m_renameSelections.size(); ++i) { - QTextEdit::ExtraSelection &s = m_renameSelections[i]; - int pos = s.cursor.anchor(); - int endPos = s.cursor.position(); - s.cursor.setPosition(s.cursor.anchor() + offset); - s.cursor.insertText(text); - s.cursor.setPosition(pos); - s.cursor.setPosition(endPos + text.length(), QTextCursor::KeepAnchor); - } - c.endEditBlock(); - - m_inRename = false; - - setTextCursor(c); - setExtraSelections(CodeSemanticsSelection, m_renameSelections); + if (cursor.position() >= currentRenameSelection.cursor.anchor() + && cursor.position() <= currentRenameSelection.cursor.position()) { + inAllRenameSelections(InsertText, currentRenameSelection, cursor, text); e->accept(); return; } diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 35d7b1a5ead13fef4bf37ede73a2a33734a0e25b..a02747f99adac868733e38630f51b7ae17d86f08 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -143,6 +143,15 @@ private: void createToolBar(CPPEditorEditable *editable); + enum EditOperation { + DeleteChar, + DeletePreviousChar, + InsertText + }; + void inAllRenameSelections(EditOperation operation, + const QTextEdit::ExtraSelection ¤tRenameSelection, + QTextCursor cursor, + const QString &text = QString()); void abortRename(); struct Link